OpenCores
URL https://opencores.org/ocsvn/bluespec-h264/bluespec-h264/trunk

Subversion Repositories bluespec-h264

[/] [bluespec-h264/] [trunk/] [src/] [mkEntropyDec_orig.bsv] - Blame information for rev 100

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 83 jamey.hick
 
2
// The MIT License
3
 
4
// Copyright (c) 2006-2007 Massachusetts Institute of Technology
5
 
6
// Permission is hereby granted, free of charge, to any person obtaining a copy
7
// of this software and associated documentation files (the "Software"), to deal
8
// in the Software without restriction, including without limitation the rights
9
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
// copies of the Software, and to permit persons to whom the Software is
11
// furnished to do so, subject to the following conditions:
12
 
13
// The above copyright notice and this permission notice shall be included in
14
// all copies or substantial portions of the Software.
15
 
16
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22
// THE SOFTWARE.
23
 
24 2 jamey.hick
//**********************************************************************
25 27 jamey.hick
// Entropy Decoder implementation
26 2 jamey.hick
//----------------------------------------------------------------------
27
//
28
//
29
 
30
package mkEntropyDec;
31
 
32
import H264Types::*;
33
import ExpGolomb::*;
34
import CAVLC::*;
35
import ICalc_nC::*;
36
import mkCalc_nC::*;
37
import IEntropyDec::*;
38
import FIFO::*;
39
 
40
import Connectable::*;
41
import GetPut::*;
42
import ClientServer::*;
43
 
44
 
45
//-----------------------------------------------------------
46
// Local Datatypes
47
//-----------------------------------------------------------
48
 
49
typedef union tagged
50
{
51
 void     Start;            //special state that initializes the process.
52
 void     NewUnit;          //special state that checks the NAL unit type.
53
 
54
 Bit#(5)  CodedSlice;       //decodes a type of NAL unit
55
 void     SEI;              //decodes a type of NAL unit
56
 Bit#(5)  SPS;              //decodes a type of NAL unit
57
 Bit#(5)  PPS;              //decodes a type of NAL unit
58
 void     AUD;              //decodes a type of NAL unit
59
 void     EndSequence;      //decodes a type of NAL unit
60
 void     EndStream;        //decodes a type of NAL unit
61
 void     Filler;           //decodes a type of NAL unit
62
 
63
 Bit#(5)  SliceData;        //decodes slice data (part of a CodedSlice NAL unit)
64
 Bit#(5)  MacroblockLayer;  //decodes macroblock layer (part of a CodedSlice NAL unit)
65
 Bit#(5)  MbPrediction;     //decodes macroblock prediction (part of a CodedSlice NAL unit)
66
 Bit#(5)  SubMbPrediction;  //decodes sub-macroblock prediction (part of a CodedSlice NAL unit)
67
 Bit#(5)  Residual;         //decodes residual (part of a CodedSlice NAL unit)
68
 Bit#(5)  ResidualBlock;    //decodes residual block (part of a CodedSlice NAL unit)
69
}
70
State deriving(Eq,Bits);
71
 
72
 
73
 
74
//-----------------------------------------------------------
75
// Helper functions
76
function MbType mbtype_convert( Bit#(5) in_mb_type, Bit#(4) in_slice_type );//converts mb_type syntax element to MbType type
77
   Bit#(5) tempmb = in_mb_type;
78
   if(in_slice_type == 2 || in_slice_type == 7)//I slice
79
      tempmb = in_mb_type+5;
80
   case ( tempmb )
81
      0: return P_L0_16x16;
82
      1: return P_L0_L0_16x8;
83
      2: return P_L0_L0_8x16;
84
      3: return P_8x8;
85
      4: return P_8x8ref0;
86
      5: return I_NxN;
87
      30: return I_PCM;
88
      default:
89
      begin
90
         Bit#(5) tempmb16x16 = tempmb-6;
91
         Bit#(2) tempv1 = tempmb16x16[1:0];
92
         Bit#(2) tempv2;
93
         Bit#(1) tempv3;
94
         if(tempmb16x16 < 12)
95
            begin
96
               tempv3 = 0;
97
               tempv2 = tempmb16x16[3:2];
98
            end
99
         else
100
            begin
101
               tempv3 = 1;
102
               tempv2 = tempmb16x16[3:2]+1;
103
            end
104
         return I_16x16{intra16x16PredMode:tempv1, codedBlockPatternChroma:tempv2, codedBlockPatternLuma:tempv3};
105
      end
106
   endcase
107
endfunction
108
 
109
 
110
 
111
//-----------------------------------------------------------
112
// Entropy Decoder Module
113
//-----------------------------------------------------------
114
 
115
 
116
(* synthesize *)
117
module mkEntropyDec( IEntropyDec );
118
 
119
   FIFO#(NalUnwrapOT)       infifo      <- mkSizedFIFO(entropyDec_infifo_size);
120
   FIFO#(EntropyDecOT)      outfifo     <- mkFIFO;
121
   FIFO#(EntropyDecOT_InverseTrans) outfifo_ITB <- mkFIFO;
122
   Reg#(State)              state       <- mkReg(Start);
123
   Reg#(Bit#(2))            nalrefidc   <- mkReg(0);
124
   Reg#(Bit#(5))            nalunittype <- mkReg(0);
125
   Reg#(Buffer)             buffer      <- mkReg(0);
126
   Reg#(Bufcount)           bufcount    <- mkReg(0);
127
 
128
   //saved syntax elements
129
   Reg#(Bit#(5))              spsseq_parameter_set_id                    <- mkReg(0);
130
   Reg#(Bit#(5))              spslog2_max_frame_num                      <- mkReg(0);
131
   Reg#(Bit#(5))              spslog2_max_pic_order_cnt_lsb              <- mkReg(0);
132
   Reg#(Bit#(2))              spspic_order_cnt_type                      <- mkReg(0);
133
   Reg#(Bit#(1))              spsdelta_pic_order_always_zero_flag        <- mkReg(0);
134
   Reg#(Bit#(8))              spsnum_ref_frames_in_pic_order_cnt_cycle   <- mkReg(0);
135
   Reg#(Bit#(8))              ppspic_parameter_set_id                    <- mkReg(0);
136
   Reg#(Bit#(1))              ppspic_order_present_flag                  <- mkReg(0);
137
   Reg#(Bit#(1))              ppsdeblocking_filter_control_present_flag  <- mkReg(0);
138
   Reg#(Bit#(4))              shslice_type                               <- mkReg(0);
139
   Reg#(Bit#(3))              shdmemory_management_control_operation     <- mkReg(0);
140
   Reg#(MbType)               sdmmbtype                                  <- mkReg(I_NxN);
141
   Reg#(Bit#(4))              sdmcodedBlockPatternLuma                   <- mkReg(0);
142
   Reg#(Bit#(2))              sdmcodedBlockPatternChroma                 <- mkReg(0);
143
   Reg#(Bit#(5))              sdmrTotalCoeff                             <- mkReg(0);
144
   Reg#(Bit#(2))              sdmrTrailingOnes                           <- mkReg(0);
145
 
146
   //derived decoding variables for slice data
147
   Reg#(Bit#(16))             tempreg                                    <- mkReg(0);
148
   Reg#(Bit#(5))              num_ref_idx_l0_active_minus1               <- mkReg(0);
149
   Reg#(Bit#(PicAreaSz))      currMbAddr                                 <- mkReg(0);
150
   Reg#(Bit#(3))              temp3bit0                                  <- mkReg(0);
151
   Reg#(Bit#(3))              temp3bit1                                  <- mkReg(0);
152
   Reg#(Bit#(3))              temp3bit2                                  <- mkReg(0);
153
   Reg#(Bit#(3))              temp3bit3                                  <- mkReg(0);
154
   Reg#(Bit#(5))              temp5bit                                   <- mkReg(0);
155
   Reg#(Bit#(5))              temp5bit2                                  <- mkReg(0);
156
   Reg#(Bit#(5))              maxNumCoeff                                <- mkReg(0);
157
   FIFO#(Bit#(13))            cavlcFIFO                                  <- mkSizedFIFO(16);
158
   Calc_nC                    calcnc                                     <- mkCalc_nC();
159
   Reg#(Bit#(1))              residualChroma                             <- mkReg(0);
160
   Reg#(Bit#(5))              totalCoeff                                 <- mkReg(0);
161
   Reg#(Bit#(4))              zerosLeft                                  <- mkReg(0);
162
 
163
   //exp-golomb 32-bit version states
164
   Reg#(Bufcount)             egnumbits                                  <- mkReg(0);
165
 
166
   //extra-buffering states
167
   Reg#(Bit#(32))             extrabuffer                                <- mkReg(0);
168
   Reg#(Bit#(3))              extrabufcount                              <- mkReg(0);
169
   Reg#(Bit#(1))              extraendnalflag                            <- mkReg(0);
170
   Reg#(Bit#(1))              endnalflag                                 <- mkReg(0);
171
 
172
 
173
   //-----------------------------------------------------------
174
   // Rules
175
 
176
   rule startup (state matches Start);
177
      case (infifo.first()) matches
178
         tagged NewUnit :
179
            begin
180
               infifo.deq();
181
               state <= NewUnit;
182
               buffer <= 0;
183
               bufcount <= 0;
184
               extrabuffer <= 0;
185
               extrabufcount <= 0;
186
               extraendnalflag <= 0;
187
               endnalflag <= 0;
188
            end
189
         tagged RbspByte .rdata :
190
            begin
191
               infifo.deq();
192
            end
193
         tagged EndOfFile :
194
            begin
195
               infifo.deq();
196
               outfifo.enq(EndOfFile);
197
               $display( "INFO EntropyDec: EndOfFile reached" );
198
            end
199
      endcase
200
   endrule
201
 
202
 
203
   rule newunit (state matches NewUnit);
204
      case (infifo.first()) matches
205
         tagged NewUnit : state <= Start;
206
         tagged RbspByte .rdata :
207
            begin
208
               infifo.deq();
209
               nalrefidc <= rdata[6:5];
210
               nalunittype <= rdata[4:0];
211
               case (rdata[4:0])
212
                  1 : state <= CodedSlice 0;
213
                  5 : state <= CodedSlice 0;
214
                  6 : state <= SEI;
215
                  7 : state <= SPS 0;
216
                  8 : state <= PPS 0;
217
                  9 : state <= AUD;
218
                  10: state <= EndSequence;
219
                  11: state <= EndStream;
220
                  12: state <= Filler;
221
                  default:
222
                  begin
223
                     $display( "ERROR EntropyDec: NAL Unit Type = %d", rdata[4:0] );
224
                     state <= Start;
225
                  end
226
               endcase
227
               $display("ccl2newunit");
228
               $display("ccl2rbspbyte %h", rdata);
229
               outfifo.enq(NewUnit rdata);
230
               outfifo_ITB.enq(NewUnit rdata);
231
            end
232
         tagged EndOfFile : state <= Start;
233
      endcase
234
   endrule
235
 
236
 
237
   rule fillextrabuffer (state != Start
238
                         && state != NewUnit
239
                         && extrabufcount < 4
240
                         && extraendnalflag == 0);
241
      if(infifo.first() matches tagged RbspByte .dbyte)
242
         begin
243
            case ( extrabufcount )
244
               0: extrabuffer <= {dbyte, extrabuffer[23:0]};
245
               1: extrabuffer <= {extrabuffer[31:24],dbyte,extrabuffer[15:0]};
246
               2: extrabuffer <= {extrabuffer[31:16],dbyte,extrabuffer[7:0]};
247
               3: extrabuffer <= {extrabuffer[31:8],dbyte};
248
               default: $display( "ERROR EntropyDec: fillextrabuffer default case_" );
249
            endcase
250
            extrabufcount <= extrabufcount + 1;
251
            infifo.deq();
252
            //$display( "TRACE EntropyDec: fillextrabuffer RbspByte %h %h %h", dbyte, extrabufcount, extrabuffer);
253
         end
254
      else
255
         begin
256
            if(extrabufcount != 0)
257
               extraendnalflag <= 1;
258
            //$display( "TRACE EntropyDec: fillextrabuffer else %h", extrabufcount);
259
         end
260
   endrule
261
 
262
 
263
   rule fillbuffer (state != Start
264
                    && state != NewUnit
265
                    && bufcount<=truncate(buffersize-32)
266
                    && (extrabufcount == 4 || extraendnalflag == 1)
267
                    && endnalflag == 0);//predicate not sure
268
      Buffer temp = zeroExtend(extrabuffer);
269
      Bufcount temp2 = truncate(buffersize)-bufcount-32;
270
      buffer <= (buffer | (temp << zeroExtend(temp2)));
271
      case ( extrabufcount )
272
         4: bufcount <= bufcount+32;
273
         3: bufcount <= bufcount+24;
274
         2: bufcount <= bufcount+16;
275
         1: bufcount <= bufcount+8;
276
         default: $display( "ERROR EntropyDec: fillbuffer default case" );
277
      endcase
278
      extrabuffer <= 0;
279
      extrabufcount <= 0;
280
      if(infifo.first()==NewUnit || infifo.first()==EndOfFile)
281
         endnalflag <= 1;
282
      //$display( "TRACE EntropyDec: fillbuffer RbspByte %h %h %h %h %h %h %h %h", extrabufcount, bufcount, extrabuffer, temp, temp2, (temp << zeroExtend(temp2)), buffer, (buffer | (temp << zeroExtend(temp2))));
283
   endrule
284
 
285
 
286
   rule parser (state != Start
287
                &&& state != NewUnit
288
                &&& (bufcount > truncate(buffersize-32) || endnalflag == 1));//predicate not sure
289
      //$display( "TRACE EntropyDec: fillbuffer RbspByte %h %h", bufcount, buffer );
290
 
291
      Bufcount numbitsused = 0;
292
      State nextstate = Start;
293
      Int#(16) tempint = 0;
294
      Int#(32) tempint32 = 0;
295
 
296
      case ( state ) matches
297
         tagged CodedSlice .step :
298
            begin
299
               case ( step )
300
                  0:
301
                  begin
302
                     $display( "ccl2SHfirst_mb_in_slice %0d", expgolomb_unsigned(buffer) );
303
                     outfifo.enq(SHfirst_mb_in_slice truncate(expgolomb_unsigned(buffer)));
304
                     currMbAddr <= truncate(expgolomb_unsigned(buffer));
305
                     calcnc.initialize(truncate(expgolomb_unsigned(buffer)));
306
                     numbitsused = expgolomb_numbits(buffer);
307
                     nextstate = CodedSlice 1;
308
                  end
309
                  1:
310
                  begin
311
                     $display( "ccl2SHslice_type %0d", expgolomb_unsigned(buffer) );
312
                     outfifo.enq(SHslice_type truncate(expgolomb_unsigned(buffer)));
313
                     shslice_type <= truncate(expgolomb_unsigned(buffer));
314
                     numbitsused = expgolomb_numbits(buffer);
315
                     nextstate = CodedSlice 2;
316
                  end
317
                  2:
318
                  begin
319
                     $display( "ccl2SHpic_parameter_set_id %0d", expgolomb_unsigned(buffer) );
320
                     outfifo.enq(SHpic_parameter_set_id truncate(expgolomb_unsigned(buffer)));
321
                     numbitsused = expgolomb_numbits(buffer);
322
                     nextstate = CodedSlice 3;
323
                     if(ppspic_parameter_set_id != truncate(expgolomb_unsigned(buffer))) $display( "ERROR EntropyDec: pic_parameter_set_id don't match" );
324
                  end
325
                  3:
326
                  begin
327
                     Bit#(16) tttt = buffer[buffersize-1:buffersize-16];
328
                     tttt = tttt >> 16 - zeroExtend(spslog2_max_frame_num);
329
                     $display( "ccl2SHframe_num %0d", tttt );
330
                     outfifo.enq(SHframe_num tttt);
331
                     numbitsused = zeroExtend(spslog2_max_frame_num);
332
                     nextstate = CodedSlice 4;
333
                  end
334
                  4:
335
                  begin
336
                     if(nalunittype == 5)
337
                        begin
338
                           $display( "ccl2SHidr_pic_id %0d", expgolomb_unsigned(buffer) );
339
                           outfifo.enq(SHidr_pic_id truncate(expgolomb_unsigned(buffer)));
340
                           numbitsused = expgolomb_numbits(buffer);
341
                        end
342
                     nextstate = CodedSlice 5;
343
                  end
344
                  5:
345
                  begin
346
                     if(spspic_order_cnt_type == 0)
347
                        begin
348
                           Bit#(16) tttt = buffer[buffersize-1:buffersize-16];
349
                           tttt = tttt >> 16 - zeroExtend(spslog2_max_pic_order_cnt_lsb);
350
                           $display( "ccl2SHpic_order_cnt_lsb %0d", tttt );
351
                           outfifo.enq(SHpic_order_cnt_lsb tttt);
352
                           numbitsused = zeroExtend(spslog2_max_pic_order_cnt_lsb);
353
                           nextstate = CodedSlice 6;
354
                        end
355
                     else
356
                        nextstate = CodedSlice 7;
357
                  end
358
                  6:
359
                  begin
360
                     if(ppspic_order_present_flag == 1)
361
                        begin
362
                           if(egnumbits == 0)
363
                              begin
364
                                 Bufcount tempbufcount = expgolomb_numbits32(buffer);
365
                                 egnumbits <= tempbufcount;
366
                                 numbitsused = tempbufcount-1;
367
                                 nextstate = CodedSlice 6;
368
                              end
369
                           else
370
                              begin
371
                                 tempint32 = unpack(expgolomb_signed32(buffer,egnumbits));
372
                                 $display( "ccl2SHdelta_pic_order_cnt_bottom %0d", tempint32 );
373
                                 outfifo.enq(SHdelta_pic_order_cnt_bottom truncate(expgolomb_signed32(buffer,egnumbits)));
374
                                 egnumbits <= 0;
375
                                 numbitsused = egnumbits;
376
                                 nextstate = CodedSlice 7;
377
                              end
378
                        end
379
                     else
380
                        nextstate = CodedSlice 7;
381
                  end
382
                  7:
383
                  begin
384
                     if(spspic_order_cnt_type == 1 && spsdelta_pic_order_always_zero_flag == 0)
385
                        begin
386
                           if(egnumbits == 0)
387
                              begin
388
                                 Bufcount tempbufcount = expgolomb_numbits32(buffer);
389
                                 egnumbits <= tempbufcount;
390
                                 numbitsused = tempbufcount-1;
391
                                 nextstate = CodedSlice 7;
392
                              end
393
                           else
394
                              begin
395
                                 tempint32 = unpack(expgolomb_signed32(buffer,egnumbits));
396
                                 $display( "ccl2SHdelta_pic_order_cnt0 %0d", tempint32 );
397
                                 outfifo.enq(SHdelta_pic_order_cnt0 truncate(expgolomb_signed32(buffer,egnumbits)));
398
                                 egnumbits <= 0;
399
                                 numbitsused = egnumbits;
400
                                 nextstate = CodedSlice 8;
401
                              end
402
                        end
403
                     else
404
                        nextstate = CodedSlice 9;
405
                  end
406
                  8:
407
                  begin
408
                     if(ppspic_order_present_flag == 1)
409
                        begin
410
                           if(egnumbits == 0)
411
                              begin
412
                                 Bufcount tempbufcount = expgolomb_numbits32(buffer);
413
                                 egnumbits <= tempbufcount;
414
                                 numbitsused = tempbufcount-1;
415
                                 nextstate = CodedSlice 8;
416
                              end
417
                           else
418
                              begin
419
                                 tempint32 = unpack(expgolomb_signed32(buffer,egnumbits));
420
                                 $display( "ccl2SHdelta_pic_order_cnt1 %0d", tempint32 );
421
                                 outfifo.enq(SHdelta_pic_order_cnt1 truncate(expgolomb_signed32(buffer,egnumbits)));
422
                                 egnumbits <= 0;
423
                                 numbitsused = egnumbits;
424
                                 nextstate = CodedSlice 9;
425
                              end
426
                        end
427
                     else
428
                        nextstate = CodedSlice 9;
429
                  end
430
                  9:
431
                  begin
432
                     if(shslice_type == 0 || shslice_type == 5)
433
                        begin
434
                           $display( "ccl2SHnum_ref_idx_active_override_flag %0d", buffer[buffersize-1] );
435
                           outfifo.enq(SHnum_ref_idx_active_override_flag buffer[buffersize-1]);
436
                           numbitsused = 1;
437
                           if(buffer[buffersize-1] == 1)
438
                              nextstate = CodedSlice 10;
439
                           else
440
                              nextstate = CodedSlice 11;
441
                        end
442
                     else
443
                        nextstate = CodedSlice 11;
444
                  end
445
                  10:
446
                  begin
447
                     $display( "ccl2SHnum_ref_idx_l0_active %0d", expgolomb_unsigned(buffer)+1 );
448
                     outfifo.enq(SHnum_ref_idx_l0_active truncate(expgolomb_unsigned(buffer)+1));
449
                     num_ref_idx_l0_active_minus1 <= truncate(expgolomb_unsigned(buffer));
450
                     numbitsused = expgolomb_numbits(buffer);
451
                     nextstate = CodedSlice 11;
452
                  end
453
                  11:
454
                  begin
455
                     if(shslice_type != 2 && shslice_type != 7)
456
                        begin
457
                           $display( "ccl2SHRref_pic_list_reordering_flag_l0 %0d", buffer[buffersize-1] );
458
                           outfifo.enq(SHRref_pic_list_reordering_flag_l0 buffer[buffersize-1]);
459
                           numbitsused = 1;
460
                           if(buffer[buffersize-1] == 1)
461
                              nextstate = CodedSlice 12;
462
                           else
463
                              nextstate = CodedSlice 15;
464
                        end
465
                     else
466
                        nextstate = CodedSlice 15;
467
                  end
468
                  12:
469
                  begin
470
                     $display( "ccl2SHRreordering_of_pic_nums_idc %0d", expgolomb_unsigned(buffer) );
471
                     outfifo.enq(SHRreordering_of_pic_nums_idc truncate(expgolomb_unsigned(buffer)));
472
                     numbitsused = expgolomb_numbits(buffer);
473
                     if(expgolomb_unsigned(buffer)==0 || expgolomb_unsigned(buffer)==1)
474
                        nextstate = CodedSlice 13;
475
                     else if(expgolomb_unsigned(buffer)==2)
476
                        nextstate = CodedSlice 14;
477
                     else
478
                        nextstate = CodedSlice 15;
479
                  end
480
                  13:
481
                  begin
482
                     Bit#(17) temp17 = zeroExtend(expgolomb_unsigned(buffer)) + 1;
483
                     $display( "ccl2SHRabs_diff_pic_num %0d", temp17 );
484
                     outfifo.enq(SHRabs_diff_pic_num temp17);
485
                     numbitsused = expgolomb_numbits(buffer);
486
                     nextstate = CodedSlice 12;
487
                  end
488
                  14:
489
                  begin
490
                     $display( "ccl2SHRlong_term_pic_num %0d", expgolomb_unsigned(buffer) );
491
                     outfifo.enq(SHRlong_term_pic_num truncate(expgolomb_unsigned(buffer)));
492
                     numbitsused = expgolomb_numbits(buffer);
493
                     nextstate = CodedSlice 12;
494
                  end
495
                  15:
496
                  begin
497
                     if(nalrefidc == 0)
498
                        nextstate = CodedSlice 23;
499
                     else
500
                        begin
501
                           if(nalunittype == 5)
502
                              begin
503
                                 $display( "ccl2SHDno_output_of_prior_pics_flag %0d", buffer[buffersize-1] );
504
                                 outfifo.enq(SHDno_output_of_prior_pics_flag buffer[buffersize-1]);
505
                                 numbitsused = 1;
506
                                 nextstate = CodedSlice 16;
507
                              end
508
                           else
509
                              nextstate = CodedSlice 17;
510
                        end
511
                  end
512
                  16:
513
                  begin
514
                     $display( "ccl2SHDlong_term_reference_flag %0d", buffer[buffersize-1] );
515
                     outfifo.enq(SHDlong_term_reference_flag buffer[buffersize-1]);
516
                     numbitsused = 1;
517
                     nextstate = CodedSlice 23;
518
                  end
519
                  17:
520
                  begin
521
                     $display( "ccl2SHDadaptive_ref_pic_marking_mode_flag %0d", buffer[buffersize-1] );
522
                     outfifo.enq(SHDadaptive_ref_pic_marking_mode_flag buffer[buffersize-1]);
523
                     numbitsused = 1;
524
                     if(buffer[buffersize-1] == 1)
525
                        nextstate = CodedSlice 18;
526
                     else
527
                        nextstate = CodedSlice 23;
528
                  end
529
                  18:
530
                  begin
531
                     $display( "ccl2SHDmemory_management_control_operation %0d", expgolomb_unsigned(buffer) );
532
                     outfifo.enq(SHDmemory_management_control_operation truncate(expgolomb_unsigned(buffer)));
533
                     shdmemory_management_control_operation <= truncate(expgolomb_unsigned(buffer));
534
                     numbitsused = expgolomb_numbits(buffer);
535
                     if(expgolomb_unsigned(buffer)!=0)
536
                        nextstate = CodedSlice 19;
537
                     else
538
                        nextstate = CodedSlice 23;
539
                  end
540
                  19:
541
                  begin
542
                     if(shdmemory_management_control_operation==1 || shdmemory_management_control_operation==3)
543
                        begin
544
                           Bit#(17) temp17 = zeroExtend(expgolomb_unsigned(buffer)) + 1;
545
                           $display( "ccl2SHDdifference_of_pic_nums %0d", temp17 );
546
                           outfifo.enq(SHDdifference_of_pic_nums temp17);
547
                           numbitsused = expgolomb_numbits(buffer);
548
                           nextstate = CodedSlice 20;
549
                        end
550
                     else
551
                        nextstate = CodedSlice 20;
552
                  end
553
                  20:
554
                  begin
555
                     if(shdmemory_management_control_operation==2)
556
                        begin
557
                           $display( "ccl2SHDlong_term_pic_num %0d", expgolomb_unsigned(buffer) );
558
                           outfifo.enq(SHDlong_term_pic_num truncate(expgolomb_unsigned(buffer)));
559
                           numbitsused = expgolomb_numbits(buffer);
560
                           nextstate = CodedSlice 21;
561
                        end
562
                     else
563
                        nextstate = CodedSlice 21;
564
                  end
565
                  21:
566
                  begin
567
                     if(shdmemory_management_control_operation==3 || shdmemory_management_control_operation==6)
568
                        begin
569
                           $display( "ccl2SHDlong_term_frame_idx %0d", expgolomb_unsigned(buffer) );
570
                           outfifo.enq(SHDlong_term_frame_idx truncate(expgolomb_unsigned(buffer)));
571
                           numbitsused = expgolomb_numbits(buffer);
572
                           nextstate = CodedSlice 22;
573
                        end
574
                     else
575
                        nextstate = CodedSlice 22;
576
                  end
577
                  22:
578
                  begin
579
                     if(shdmemory_management_control_operation==4)
580
                        begin
581
                           $display( "ccl2SHDmax_long_term_frame_idx_plus1 %0d", expgolomb_unsigned(buffer) );
582
                           outfifo.enq(SHDmax_long_term_frame_idx_plus1 truncate(expgolomb_unsigned(buffer)));
583
                           numbitsused = expgolomb_numbits(buffer);
584
                           nextstate = CodedSlice 18;
585
                        end
586
                     else
587
                        nextstate = CodedSlice 18;
588
                  end
589
                  23:
590
                  begin
591
                     tempint = unpack(expgolomb_signed(buffer));
592
                     $display( "ccl2SHslice_qp_delta %0d", tempint );
593
                     outfifo_ITB.enq(SHslice_qp_delta truncate(expgolomb_signed(buffer)));
594
                     numbitsused = expgolomb_numbits(buffer);
595
                     nextstate = CodedSlice 24;
596
                  end
597
                  24:
598
                  begin
599
                     if(ppsdeblocking_filter_control_present_flag==1)
600
                        begin
601
                           $display( "ccl2SHdisable_deblocking_filter_idc %0d", expgolomb_unsigned(buffer) );
602
                           outfifo.enq(SHdisable_deblocking_filter_idc truncate(expgolomb_unsigned(buffer)));
603
                           numbitsused = expgolomb_numbits(buffer);
604
                           if(expgolomb_unsigned(buffer)!=1)
605
                              nextstate = CodedSlice 25;
606
                           else
607
                              nextstate = CodedSlice 27;
608
                        end
609
                     else
610
                        nextstate = CodedSlice 27;
611
                  end
612
                  25:
613
                  begin
614
                     tempint = unpack(expgolomb_signed(buffer) << 1);
615
                     $display( "ccl2SHslice_alpha_c0_offset %0d", tempint );
616
                     outfifo.enq(SHslice_alpha_c0_offset truncate(expgolomb_signed(buffer) << 1));
617
                     numbitsused = expgolomb_numbits(buffer);
618
                     nextstate = CodedSlice 26;
619
                  end
620
                  26:
621
                  begin
622
                     tempint = unpack(expgolomb_signed(buffer) << 1);
623
                     $display( "ccl2SHslice_beta_offset %0d", tempint );
624
                     outfifo.enq(SHslice_beta_offset truncate(expgolomb_signed(buffer) << 1));
625
                     numbitsused = expgolomb_numbits(buffer);
626
                     nextstate = CodedSlice 27;
627
                  end
628
                  27:
629
                  begin
630
                     nextstate = SliceData 0;
631
                  end
632
                  default: $display( "ERROR EntropyDec: CodedSlice default step" );
633
               endcase
634
            end
635
         tagged SEI .step :
636
            begin
637
               nextstate = Start;
638
               $display( "INFO EntropyDec: SEI data thrown away" );
639
            end
640
         tagged SPS .step :
641
            begin
642
               case ( step )
643
                  0:
644
                  begin
645
                     Bit#(8) outputdata = buffer[buffersize-1:buffersize-8];
646
                     $display( "INFO EntropyDec: profile_idc = %d", outputdata );
647
                     outputdata = buffer[buffersize-9:buffersize-16];
648
                     $display( "INFO EntropyDec: constraint_set = %b", outputdata );
649
                     outputdata = buffer[buffersize-17:buffersize-24];
650
                     $display( "INFO EntropyDec: level_idc = %d", outputdata );
651
                     numbitsused = 24;
652
                     nextstate = SPS 1;
653
                  end
654
                  1:
655
                  begin
656
                     $display( "ccl2SPSseq_parameter_set_id %0d", expgolomb_unsigned(buffer) );
657
                     outfifo.enq(SPSseq_parameter_set_id truncate(expgolomb_unsigned(buffer)));
658
                     spsseq_parameter_set_id <= truncate(expgolomb_unsigned(buffer));
659
                     numbitsused = expgolomb_numbits(buffer);
660
                     nextstate = SPS 2;
661
                  end
662
                  2:
663
                  begin
664
                     $display( "ccl2SPSlog2_max_frame_num %0d", expgolomb_unsigned(buffer)+4 );
665
                     outfifo.enq(SPSlog2_max_frame_num truncate(expgolomb_unsigned(buffer)+4));
666
                     spslog2_max_frame_num <= truncate(expgolomb_unsigned(buffer)+4);
667
                     numbitsused = expgolomb_numbits(buffer);
668
                     nextstate = SPS 3;
669
                  end
670
                  3:
671
                  begin
672
                     let tttt = expgolomb_unsigned(buffer);
673
                     $display( "ccl2SPSpic_order_cnt_type %0d", tttt );
674
                     outfifo.enq(SPSpic_order_cnt_type truncate(tttt));
675
                     spspic_order_cnt_type <= truncate(tttt);
676
                     numbitsused = expgolomb_numbits(buffer);
677
                     if(tttt == 0)
678
                        nextstate = SPS 4;
679
                     else if(tttt == 1)
680
                        nextstate = SPS 5;
681
                     else
682
                        nextstate = SPS 10;
683
                  end
684
                  4:
685
                  begin
686
                     $display( "ccl2SPSlog2_max_pic_order_cnt_lsb %0d", expgolomb_unsigned(buffer)+4 );
687
                     outfifo.enq(SPSlog2_max_pic_order_cnt_lsb truncate(expgolomb_unsigned(buffer)+4));
688
                     spslog2_max_pic_order_cnt_lsb <= truncate(expgolomb_unsigned(buffer)+4);
689
                     numbitsused = expgolomb_numbits(buffer);
690
                     nextstate = SPS 10;
691
                  end
692
                  5:
693
                  begin
694
                     $display( "ccl2SPSdelta_pic_order_always_zero_flag %0d", buffer[buffersize-1] );
695
                     outfifo.enq(SPSdelta_pic_order_always_zero_flag buffer[buffersize-1]);
696
                     spsdelta_pic_order_always_zero_flag <= buffer[buffersize-1];
697
                     numbitsused = 1;
698
                     nextstate = SPS 6;
699
                  end
700
                  6:
701
                  begin
702
                     if(egnumbits == 0)
703
                        begin
704
                           Bufcount tempbufcount = expgolomb_numbits32(buffer);
705
                           egnumbits <= tempbufcount;
706
                           numbitsused = tempbufcount-1;
707
                           nextstate = SPS 6;
708
                        end
709
                     else
710
                        begin
711
                           tempint32 = unpack(expgolomb_signed32(buffer,egnumbits));
712
                           $display( "ccl2SPSoffset_for_non_ref_pic %0d", tempint32 );
713
                           outfifo.enq(SPSoffset_for_non_ref_pic truncate(expgolomb_signed32(buffer,egnumbits)));
714
                           egnumbits <= 0;
715
                           numbitsused = egnumbits;
716
                           nextstate = SPS 7;
717
                        end
718
                  end
719
                  7:
720
                  begin
721
                     if(egnumbits == 0)
722
                        begin
723
                           Bufcount tempbufcount = expgolomb_numbits32(buffer);
724
                           egnumbits <= tempbufcount;
725
                           numbitsused = tempbufcount-1;
726
                           nextstate = SPS 7;
727
                        end
728
                     else
729
                        begin
730
                           tempint32 = unpack(expgolomb_signed32(buffer,egnumbits));
731
                           $display( "ccl2SPSoffset_for_top_to_bottom_field %0d", tempint32 );
732
                           outfifo.enq(SPSoffset_for_top_to_bottom_field truncate(expgolomb_signed32(buffer,egnumbits)));
733
                           egnumbits <= 0;
734
                           numbitsused = egnumbits;
735
                           nextstate = SPS 8;
736
                        end
737
                  end
738
                  8:
739
                  begin
740
                     $display( "ccl2SPSnum_ref_frames_in_pic_order_cnt_cycle %0d", expgolomb_unsigned(buffer) );
741
                     outfifo.enq(SPSnum_ref_frames_in_pic_order_cnt_cycle truncate(expgolomb_unsigned(buffer)));
742
                     spsnum_ref_frames_in_pic_order_cnt_cycle <= truncate(expgolomb_unsigned(buffer));
743
                     numbitsused = expgolomb_numbits(buffer);
744
                     nextstate = SPS 9;
745
                  end
746
                  9:
747
                  begin
748
                     if(spsnum_ref_frames_in_pic_order_cnt_cycle == 0)
749
                        nextstate = SPS 10;
750
                     else
751
                        begin
752
                           if(egnumbits == 0)
753
                              begin
754
                                 Bufcount tempbufcount = expgolomb_numbits32(buffer);
755
                                 egnumbits <= tempbufcount;
756
                                 numbitsused = tempbufcount-1;
757
                                 nextstate = SPS 9;
758
                              end
759
                           else
760
                              begin
761
                                 tempint32 = unpack(expgolomb_signed32(buffer,egnumbits));
762
                                 $display( "ccl2SPSoffset_for_ref_frame %0d", tempint32 );
763
                                 outfifo.enq(SPSoffset_for_ref_frame truncate(expgolomb_signed32(buffer,egnumbits)));
764
                                 egnumbits <= 0;
765
                                 spsnum_ref_frames_in_pic_order_cnt_cycle <= spsnum_ref_frames_in_pic_order_cnt_cycle - 1;
766
                                 numbitsused = egnumbits;
767
                                 nextstate = SPS 9;
768
                              end
769
                        end
770
                  end
771
                  10:
772
                  begin
773
                     $display( "ccl2SPSnum_ref_frames %0d", expgolomb_unsigned(buffer) );
774
                     outfifo.enq(SPSnum_ref_frames truncate(expgolomb_unsigned(buffer)));
775
                     numbitsused = expgolomb_numbits(buffer);
776
                     nextstate = SPS 11;
777
                  end
778
                  11:
779
                  begin
780
                     $display( "ccl2SPSgaps_in_frame_num_allowed_flag %0d", buffer[buffersize-1] );
781
                     outfifo.enq(SPSgaps_in_frame_num_allowed_flag buffer[buffersize-1]);
782
                     numbitsused = 1;
783
                     nextstate = SPS 12;
784
                  end
785
                  12:
786
                  begin
787
                     $display( "ccl2SPSpic_width_in_mbs %0d", expgolomb_unsigned(buffer)+1 );
788
                     outfifo.enq(SPSpic_width_in_mbs truncate(expgolomb_unsigned(buffer)+1));
789
                     calcnc.initialize_picWidth(truncate(expgolomb_unsigned(buffer)+1));
790
                     numbitsused = expgolomb_numbits(buffer);
791
                     nextstate = SPS 13;
792
                  end
793
                  13:
794
                  begin
795
                     $display( "ccl2SPSpic_height_in_map_units %0d", expgolomb_unsigned(buffer)+1 );
796
                     outfifo.enq(SPSpic_height_in_map_units truncate(expgolomb_unsigned(buffer)+1));
797
                     numbitsused = expgolomb_numbits(buffer);
798
                     nextstate = SPS 14;
799
                  end
800
                  14:
801
                  begin
802
                     //SPSframe_mbs_only_flag = 1 for baseline
803
                     numbitsused = 1;
804
                     nextstate = SPS 15;
805
                  end
806
                  15:
807
                  begin
808
                     $display( "ccl2SPSdirect_8x8_inference_flag %0d", buffer[buffersize-1] );
809
                     outfifo.enq(SPSdirect_8x8_inference_flag buffer[buffersize-1]);
810
                     numbitsused = 1;
811
                     nextstate = SPS 16;
812
                  end
813
                  16:
814
                  begin
815
                     $display( "ccl2SPSframe_cropping_flag %0d", buffer[buffersize-1] );
816
                     outfifo.enq(SPSframe_cropping_flag buffer[buffersize-1]);
817
                     numbitsused = 1;
818
                     if(buffer[buffersize-1] == 1)
819
                        nextstate = SPS 17;
820
                     else
821
                        nextstate = SPS 21;
822
                  end
823
                  17:
824
                  begin
825
                     $display( "ccl2SPSframe_crop_left_offset %0d", expgolomb_unsigned(buffer) );
826
                     outfifo.enq(SPSframe_crop_left_offset truncate(expgolomb_unsigned(buffer)));
827
                     numbitsused = expgolomb_numbits(buffer);
828
                     nextstate = SPS 18;
829
                  end
830
                  18:
831
                  begin
832
                     $display( "ccl2SPSframe_crop_right_offset %0d", expgolomb_unsigned(buffer) );
833
                     outfifo.enq(SPSframe_crop_right_offset truncate(expgolomb_unsigned(buffer)));
834
                     numbitsused = expgolomb_numbits(buffer);
835
                     nextstate = SPS 19;
836
                  end
837
                  19:
838
                  begin
839
                     $display( "ccl2SPSframe_crop_top_offset %0d", expgolomb_unsigned(buffer) );
840
                     outfifo.enq(SPSframe_crop_top_offset truncate(expgolomb_unsigned(buffer)));
841
                     numbitsused = expgolomb_numbits(buffer);
842
                     nextstate = SPS 20;
843
                  end
844
                  20:
845
                  begin
846
                     $display( "ccl2SPSframe_crop_bottom_offset %0d", expgolomb_unsigned(buffer) );
847
                     outfifo.enq(SPSframe_crop_bottom_offset truncate(expgolomb_unsigned(buffer)));
848
                     numbitsused = expgolomb_numbits(buffer);
849
                     nextstate = SPS 21;
850
                  end
851
                  21:
852
                  begin
853
                     nextstate = Start;
854
                     $display( "INFO EntropyDec:VUI data thrown away" );
855
                  end
856
                  default: $display( "ERROR EntropyDec: SPS default step" );
857
               endcase
858
            end
859
         tagged PPS .step :
860
            begin
861
               case ( step )
862
                  0:
863
                  begin
864
                     ppspic_parameter_set_id <= truncate(expgolomb_unsigned(buffer));
865
                     $display( "ccl2PPSpic_parameter_set_id %0d", expgolomb_unsigned(buffer) );
866
                     outfifo.enq(PPSpic_parameter_set_id truncate(expgolomb_unsigned(buffer)));
867
                     outfifo_ITB.enq(PPSpic_parameter_set_id truncate(expgolomb_unsigned(buffer)));
868
                     numbitsused = expgolomb_numbits(buffer);
869
                     nextstate = PPS 1;
870
                  end
871
                  1:
872
                  begin
873
                     $display( "ccl2PPSseq_parameter_set_id %0d", expgolomb_unsigned(buffer) );
874
                     outfifo.enq(PPSseq_parameter_set_id truncate(expgolomb_unsigned(buffer)));
875
                     numbitsused = expgolomb_numbits(buffer);
876
                     nextstate = PPS 2;
877
                     if(spsseq_parameter_set_id != truncate(expgolomb_unsigned(buffer)))
878
                        $display( "ERROR EntropyDec: seq_parameter_set_id don't match" );
879
                  end
880
                  2:
881
                  begin
882
                     //PPSentropy_coding_mode_flag = 0 for baseline
883
                     numbitsused = 1;
884
                     nextstate = PPS 3;
885
                  end
886
                  3:
887
                  begin
888
                     ppspic_order_present_flag <= buffer[buffersize-1];
889
                     $display( "ccl2PPSpic_order_present_flag %0d", buffer[buffersize-1] );
890
                     outfifo.enq(PPSpic_order_present_flag buffer[buffersize-1]);
891
                     numbitsused = 1;
892
                     nextstate = PPS 4;
893
                  end
894
                  4:
895
                  begin
896
                     numbitsused = expgolomb_numbits(buffer);
897
                     nextstate = PPS 5;
898
                     if(expgolomb_unsigned(buffer)+1 != 1)
899
                        $display( "ERROR EntropyDec: PPSnum_slice_groups not equal to 1" );//=1 for main
900
                  end
901
                  5:
902
                  begin
903
                     $display( "ccl2PPSnum_ref_idx_l0_active %0d", expgolomb_unsigned(buffer)+1 );
904
                     outfifo.enq(PPSnum_ref_idx_l0_active truncate(expgolomb_unsigned(buffer)+1));
905
                     num_ref_idx_l0_active_minus1 <= truncate(expgolomb_unsigned(buffer));
906
                     numbitsused = expgolomb_numbits(buffer);
907
                     nextstate = PPS 6;
908
                  end
909
                  6:
910
                  begin
911
                     $display( "ccl2PPSnum_ref_idx_l1_active %0d", expgolomb_unsigned(buffer)+1 );
912
                     outfifo.enq(PPSnum_ref_idx_l1_active truncate(expgolomb_unsigned(buffer)+1));
913
                     numbitsused = expgolomb_numbits(buffer);
914
                     nextstate = PPS 7;
915
                  end
916
                  7:
917
                  begin
918
                     //PPSweighted_pred_flag = 0 for baseline; PPSweighted_bipred_idc = 0 for baseline
919
                     numbitsused = 3;
920
                     nextstate = PPS 8;
921
                  end
922
                  8:
923
                  begin
924
                     $display( "ccl2PPSpic_init_qp %0d", expgolomb_signed(buffer)+26 );
925
                     outfifo_ITB.enq(PPSpic_init_qp truncate(expgolomb_signed(buffer)+26));
926
                     numbitsused = expgolomb_numbits(buffer);
927
                     nextstate = PPS 9;
928
                  end
929
                  9:
930
                  begin
931
                     $display( "ccl2PPSpic_init_qs %0d", expgolomb_signed(buffer)+26 );
932
                     outfifo_ITB.enq(PPSpic_init_qs truncate(expgolomb_signed(buffer)+26));
933
                     numbitsused = expgolomb_numbits(buffer);
934
                     nextstate = PPS 10;
935
                  end
936
                  10:
937
                  begin
938
                     tempint = unpack(expgolomb_signed(buffer));
939
                     $display( "ccl2PPSchroma_qp_index_offset %0d", tempint );
940
                     outfifo_ITB.enq(PPSchroma_qp_index_offset truncate(expgolomb_signed(buffer)));
941
                     numbitsused = expgolomb_numbits(buffer);
942
                     nextstate = PPS 11;
943
                  end
944
                  11:
945
                  begin
946
                     ppsdeblocking_filter_control_present_flag <= buffer[buffersize-1];
947
                     $display( "ccl2PPSdeblocking_filter_control_present_flag %0d", buffer[buffersize-1] );
948
                     outfifo.enq(PPSdeblocking_filter_control_present_flag buffer[buffersize-1]);
949
                     numbitsused = 1;
950
                     nextstate = PPS 12;
951
                  end
952
                  12:
953
                  begin
954
                     $display( "ccl2PPSconstrained_intra_pred_flag %0d", buffer[buffersize-1] );
955
                     outfifo.enq(PPSconstrained_intra_pred_flag buffer[buffersize-1]);
956
                     numbitsused = 1;
957
                     nextstate = PPS 13;
958
                  end
959
                  13:
960
                  begin
961
                     //PPSredundant_pic_cnt_present_flag = 0 for main
962
                     numbitsused = 1;
963
                     nextstate = PPS 14;
964
                     if(buffer[buffersize-1] != 0)
965
                        $display( "ERROR EntropyDec: PPSredundant_pic_cnt_present_flag not equal to 0" );//=0 for main
966
                  end
967
                  14:
968
                  begin
969
                     nextstate = Start;
970
                  end
971
                  default: $display( "ERROR EntropyDec: PPS default step" );
972
               endcase
973
            end
974
         tagged AUD .step :
975
            begin
976
               outfifo.enq(AUDPrimaryPicType buffer[buffersize-1:buffersize-3]);
977
               numbitsused = 3;
978
               nextstate = Start;
979
            end
980
         tagged EndSequence :
981
            begin
982
               outfifo.enq(EndOfSequence);
983
               nextstate = Start;
984
            end
985
         tagged EndStream :
986
            begin
987
               outfifo.enq(EndOfStream);
988
               nextstate = Start;
989
            end
990
         tagged Filler :
991
            begin
992
               nextstate = Start;
993
            end
994
         tagged SliceData .step :
995
            begin
996
               case ( step )
997
                  0:
998
                  begin
999
                     if( shslice_type!=2 && shslice_type!=7 )
1000
                        begin
1001
                           $display( "ccl2SDmb_skip_run %0d", expgolomb_unsigned(buffer) );
1002
                           outfifo.enq(SDmb_skip_run truncate(expgolomb_unsigned(buffer)));
1003
                           tempreg <= truncate(expgolomb_unsigned(buffer));
1004
                           calcnc.nNupdate_pskip( truncate(expgolomb_unsigned(buffer)) );
1005
                           numbitsused = expgolomb_numbits(buffer);
1006
                           nextstate = SliceData 1;
1007
                        end
1008
                     else
1009
                        nextstate = SliceData 2;
1010
                  end
1011
                  1:
1012
                  begin
1013
                     if( tempreg>0 )
1014
                        begin
1015
                           currMbAddr <= currMbAddr+1;//only because input assumed to comform to both baseline and main
1016
                           tempreg <= tempreg-1;
1017
                           nextstate = SliceData 1;
1018
                        end
1019
                     else
1020
                        begin
1021
                           ////$display( "ccl2SDcurrMbAddr %0d", currMbAddr );
1022
                           ////outfifo.enq(SDcurrMbAddr currMbAddr);
1023
                           nextstate = SliceData 2;
1024
                        end
1025
                  end
1026
                  2:
1027
                  begin
1028
                     if( bufcount>8 || buffer[buffersize-1]!=1 || (buffer<<1)!=0 )
1029
                        begin
1030
                           calcnc.loadMb(currMbAddr);
1031
                           nextstate = MacroblockLayer 0;
1032
                        end
1033
                     else
1034
                        nextstate = SliceData 3;
1035
                  end
1036
                  3:
1037
                  begin
1038
                     currMbAddr <= currMbAddr+1;//only because input assumed to comform to both baseline and main
1039
                     if( bufcount>8 || buffer[buffersize-1]!=1 || (buffer<<1)!=0 )
1040
                        nextstate = SliceData 0;
1041
                     else
1042
                        nextstate = Start;
1043
                  end
1044
                  default: $display( "ERROR EntropyDec: SliceData default step" );
1045
               endcase
1046
            end
1047
         tagged MacroblockLayer .step : //return to SliceData 3
1048
            begin
1049
               case ( step )
1050
                  0:
1051
                  begin
1052
                     $display( "ccl2SDMmb_type %0d", expgolomb_unsigned(buffer) );
1053
                     outfifo.enq(SDMmbtype mbtype_convert(truncate(expgolomb_unsigned(buffer)), shslice_type) );
1054
                     outfifo_ITB.enq(SDMmbtype mbtype_convert(truncate(expgolomb_unsigned(buffer)), shslice_type) );
1055
                     sdmmbtype <= mbtype_convert(truncate(expgolomb_unsigned(buffer)), shslice_type);
1056
                     numbitsused = expgolomb_numbits(buffer);
1057
                     if(mbtype_convert(truncate(expgolomb_unsigned(buffer)), shslice_type) == I_PCM)
1058
                        begin
1059
                           calcnc.nNupdate_ipcm();
1060
                           nextstate = MacroblockLayer 1;
1061
                        end
1062
                     else
1063
                        nextstate = MacroblockLayer 4;
1064
                  end
1065
                  1:
1066
                  begin
1067
                     tempreg <= 256;
1068
                     numbitsused = zeroExtend(bufcount[2:0]);
1069
                     nextstate = MacroblockLayer 2;
1070
                  end
1071
                  2:
1072
                  begin
1073
                     if( tempreg>0 )
1074
                        begin
1075
                           Bit#(8) outputdata = buffer[buffersize-1:buffersize-8];
1076
                           $display( "ccl2SDMpcm_sample_luma %0d", outputdata );
1077
                           outfifo.enq(SDMpcm_sample_luma outputdata);
1078
                           tempreg <= tempreg-1;
1079
                           numbitsused = 8;
1080
                           nextstate = MacroblockLayer 2;
1081
                        end
1082
                     else
1083
                        begin
1084
                           tempreg <= 128;
1085
                           nextstate = MacroblockLayer 3;
1086
                        end
1087
                  end
1088
                  3:
1089
                  begin
1090
                     if( tempreg>0 )
1091
                        begin
1092
                           Bit#(8) outputdata = buffer[buffersize-1:buffersize-8];
1093
                           $display( "ccl2SDMpcm_sample_chroma %0d", outputdata );
1094
                           outfifo.enq(SDMpcm_sample_chroma outputdata);
1095
                           tempreg <= tempreg-1;
1096
                           numbitsused = 8;
1097
                           nextstate = MacroblockLayer 3;
1098
                        end
1099
                     else
1100
                           nextstate = SliceData 3;
1101
                  end
1102
                  4:
1103
                  begin
1104
                     if(sdmmbtype != I_NxN
1105
                        &&& mbPartPredMode(sdmmbtype,0) != Intra_16x16
1106
                        &&& numMbPart(sdmmbtype) == 4)
1107
                        nextstate = SubMbPrediction 0;
1108
                     else
1109
                        nextstate = MbPrediction 0;
1110
                  end
1111
                  5:
1112
                  begin
1113
                     if(mbPartPredMode(sdmmbtype,0) != Intra_16x16)
1114
                        begin
1115
                           $display( "ccl2SDMcoded_block_pattern %0d", expgolomb_coded_block_pattern(buffer,sdmmbtype) );
1116
                           ////outfifo.enq(SDMcoded_block_pattern expgolomb_coded_block_pattern(buffer,sdmmbtype));
1117
                           sdmcodedBlockPatternLuma <= expgolomb_coded_block_pattern(buffer,sdmmbtype)[3:0];
1118
                           sdmcodedBlockPatternChroma <= expgolomb_coded_block_pattern(buffer,sdmmbtype)[5:4];
1119
                           numbitsused = expgolomb_numbits(buffer);
1120
                        end
1121
                     else
1122
                        begin
1123
                           if(sdmmbtype matches tagged I_16x16 {intra16x16PredMode:.tempv1, codedBlockPatternChroma:.tempv2, codedBlockPatternLuma:.tempv3})
1124
                              begin
1125
                                 sdmcodedBlockPatternLuma <= {tempv3,tempv3,tempv3,tempv3};
1126
                                 sdmcodedBlockPatternChroma <= tempv2;
1127
                              end
1128
                           else
1129
                              $display( "ERROR EntropyDec: MacroblockLayer 5 sdmmbtype not I_16x16" );
1130
                        end
1131
                     nextstate = MacroblockLayer 6;
1132
                  end
1133
                  6:
1134
                  begin
1135
                     if(sdmcodedBlockPatternLuma > 0
1136
                        || sdmcodedBlockPatternChroma > 0
1137
                        || mbPartPredMode(sdmmbtype,0) == Intra_16x16)
1138
                        begin
1139
                           tempint = unpack(expgolomb_signed(buffer));
1140
                           $display( "ccl2SDMmb_qp_delta %0d", tempint );
1141
                           outfifo_ITB.enq(SDMmb_qp_delta truncate(expgolomb_signed(buffer)));
1142
                           numbitsused = expgolomb_numbits(buffer);
1143
                           nextstate = Residual 0;
1144
                        end
1145
                     else
1146
                        nextstate = Residual 0;
1147
                  end
1148
                  default: $display( "ERROR EntropyDec: MacroblockLayer default step" );
1149
               endcase
1150
            end
1151
         tagged MbPrediction .step : //return to MacroblockLayer 5
1152
            begin
1153
               case ( step )
1154
                  0:
1155
                  begin
1156
                     if(mbPartPredMode(sdmmbtype,0) == Intra_16x16)
1157
                        begin
1158
                           $display( "ccl2SDMMintra_chroma_pred_mode %0d", expgolomb_unsigned(buffer) );
1159
                           outfifo.enq(SDMMintra_chroma_pred_mode truncate(expgolomb_unsigned(buffer)));
1160
                           numbitsused = expgolomb_numbits(buffer);
1161
                           nextstate = MacroblockLayer 5;
1162
                        end
1163
                     else if(mbPartPredMode(sdmmbtype,0) == Intra_4x4)
1164
                        begin
1165
                           temp5bit <= 16;
1166
                           nextstate = MbPrediction 1;
1167
                        end
1168
                     else if(num_ref_idx_l0_active_minus1 > 0)
1169
                        begin
1170
                           temp3bit0 <= numMbPart(sdmmbtype);
1171
                           nextstate = MbPrediction 2;
1172
                        end
1173
                     else
1174
                        begin
1175
                           temp3bit0 <= numMbPart(sdmmbtype);
1176
                           nextstate = MbPrediction 3;
1177
                        end
1178
                  end
1179
                  1:
1180
                  begin
1181
                     if(temp5bit == 0)
1182
                        begin
1183
                           $display( "ccl2SDMMintra_chroma_pred_mode %0d", expgolomb_unsigned(buffer) );
1184
                           outfifo.enq(SDMMintra_chroma_pred_mode truncate(expgolomb_unsigned(buffer)));
1185
                           numbitsused = expgolomb_numbits(buffer);
1186
                           nextstate = MacroblockLayer 5;
1187
                        end
1188
                     else
1189
                        begin
1190
                           ////$display( "ccl2SDMMprev_intra4x4_pred_mode_flag %0d", buffer[buffersize-1] );
1191
                           if(buffer[buffersize-1] == 0)
1192
                              begin
1193
                                 Bit#(4) tttt = buffer[buffersize-1:buffersize-4];
1194
                                 $display( "ccl2SDMMrem_intra4x4_pred_mode %0d", tttt );
1195
                                 outfifo.enq(SDMMrem_intra4x4_pred_mode tttt);
1196
                                 numbitsused = 4;
1197
                              end
1198
                           else
1199
                              begin
1200
                                 outfifo.enq(SDMMrem_intra4x4_pred_mode 4'b1000);
1201
                                 numbitsused = 1;
1202
                              end
1203
                           temp5bit <= temp5bit-1;
1204
                           nextstate = MbPrediction 1;
1205
                        end
1206
                  end
1207
                  2:
1208
                  begin
1209
                     if(num_ref_idx_l0_active_minus1 == 1)
1210
                        begin
1211
                           $display( "ccl2SDMMref_idx_l0 %0d", 1-buffer[buffersize-1] );
1212
                           outfifo.enq(SDMMref_idx_l0 zeroExtend(1-buffer[buffersize-1]));
1213
                           numbitsused = 1;
1214
                        end
1215
                     else
1216
                        begin
1217
                           $display( "ccl2SDMMref_idx_l0 %0d", expgolomb_unsigned(buffer) );
1218
                           outfifo.enq(SDMMref_idx_l0 truncate(expgolomb_unsigned(buffer)));
1219
                           numbitsused = expgolomb_numbits(buffer);
1220
                        end
1221
                     if(temp3bit0 == 1)
1222
                        begin
1223
                           temp3bit0 <= numMbPart(sdmmbtype);
1224
                           nextstate = MbPrediction 3;
1225
                        end
1226
                     else
1227
                        begin
1228
                           temp3bit0 <= temp3bit0-1;
1229
                           nextstate = MbPrediction 2;
1230
                        end
1231
                  end
1232
                  3:
1233
                  begin
1234
                     tempint = unpack(expgolomb_signed(buffer));
1235
                     $display( "ccl2SDMMmvd_l0 %0d", tempint );
1236
                     outfifo.enq(SDMMmvd_l0 truncate(expgolomb_signed(buffer)));
1237
                     numbitsused = expgolomb_numbits(buffer);
1238
                     nextstate = MbPrediction 4;
1239
                  end
1240
                  4:
1241
                  begin
1242
                     tempint = unpack(expgolomb_signed(buffer));
1243
                     $display( "ccl2SDMMmvd_l0 %0d", tempint );
1244
                     outfifo.enq(SDMMmvd_l0 truncate(expgolomb_signed(buffer)));
1245
                     numbitsused = expgolomb_numbits(buffer);
1246
                     temp3bit0 <= temp3bit0-1;
1247
                     if(temp3bit0 == 1)
1248
                        nextstate = MacroblockLayer 5;
1249
                     else
1250
                        nextstate = MbPrediction 3;
1251
                  end
1252
                  default: $display( "ERROR EntropyDec: MbPrediction default step" );
1253
               endcase
1254
            end
1255
         tagged SubMbPrediction .step : //return to MacroblockLayer 5
1256
            begin
1257
               case ( step )
1258
                  0:
1259
                  begin
1260
                     $display( "ccl2SDMSsub_mb_type %0d", expgolomb_unsigned(buffer) );
1261
                     outfifo.enq(SDMSsub_mb_type truncate(expgolomb_unsigned(buffer)));
1262
                     temp3bit0 <= numSubMbPart(truncate(expgolomb_unsigned(buffer)));
1263
                     numbitsused = expgolomb_numbits(buffer);
1264
                     nextstate = SubMbPrediction 1;
1265
                  end
1266
                  1:
1267
                  begin
1268
                     $display( "ccl2SDMSsub_mb_type %0d", expgolomb_unsigned(buffer) );
1269
                     outfifo.enq(SDMSsub_mb_type truncate(expgolomb_unsigned(buffer)));
1270
                     temp3bit1 <= numSubMbPart(truncate(expgolomb_unsigned(buffer)));
1271
                     numbitsused = expgolomb_numbits(buffer);
1272
                     nextstate = SubMbPrediction 2;
1273
                  end
1274
                  2:
1275
                  begin
1276
                     $display( "ccl2SDMSsub_mb_type %0d", expgolomb_unsigned(buffer) );
1277
                     outfifo.enq(SDMSsub_mb_type truncate(expgolomb_unsigned(buffer)));
1278
                     temp3bit2 <= numSubMbPart(truncate(expgolomb_unsigned(buffer)));
1279
                     numbitsused = expgolomb_numbits(buffer);
1280
                     nextstate = SubMbPrediction 3;
1281
                  end
1282
                  3:
1283
                  begin
1284
                     $display( "ccl2SDMSsub_mb_type %0d", expgolomb_unsigned(buffer) );
1285
                     outfifo.enq(SDMSsub_mb_type truncate(expgolomb_unsigned(buffer)));
1286
                     temp3bit3 <= numSubMbPart(truncate(expgolomb_unsigned(buffer)));
1287
                     numbitsused = expgolomb_numbits(buffer);
1288
                     if(num_ref_idx_l0_active_minus1 > 0
1289
                              && sdmmbtype != P_8x8ref0)
1290
                        nextstate = SubMbPrediction 4;
1291
                     else
1292
                        nextstate = SubMbPrediction 8;
1293
                  end
1294
                  4:
1295
                  begin
1296
                     if(num_ref_idx_l0_active_minus1 == 1)
1297
                        begin
1298
                           $display( "ccl2SDMSref_idx_l0 %0d", 1-buffer[buffersize-1] );
1299
                           outfifo.enq(SDMSref_idx_l0 zeroExtend(1-buffer[buffersize-1]));
1300
                           numbitsused = 1;
1301
                        end
1302
                     else
1303
                        begin
1304
                           $display( "ccl2SDMSref_idx_l0 %0d", expgolomb_unsigned(buffer) );
1305
                           outfifo.enq(SDMSref_idx_l0 truncate(expgolomb_unsigned(buffer)));
1306
                           numbitsused = expgolomb_numbits(buffer);
1307
                        end
1308
                     nextstate = SubMbPrediction 5;
1309
                  end
1310
                  5:
1311
                  begin
1312
                     if(num_ref_idx_l0_active_minus1 == 1)
1313
                        begin
1314
                           $display( "ccl2SDMSref_idx_l0 %0d", 1-buffer[buffersize-1] );
1315
                           outfifo.enq(SDMSref_idx_l0 zeroExtend(1-buffer[buffersize-1]));
1316
                           numbitsused = 1;
1317
                        end
1318
                     else
1319
                        begin
1320
                           $display( "ccl2SDMSref_idx_l0 %0d", expgolomb_unsigned(buffer) );
1321
                           outfifo.enq(SDMSref_idx_l0 truncate(expgolomb_unsigned(buffer)));
1322
                           numbitsused = expgolomb_numbits(buffer);
1323
                        end
1324
                     nextstate = SubMbPrediction 6;
1325
                  end
1326
                  6:
1327
                  begin
1328
                     if(num_ref_idx_l0_active_minus1 == 1)
1329
                        begin
1330
                           $display( "ccl2SDMSref_idx_l0 %0d", 1-buffer[buffersize-1] );
1331
                           outfifo.enq(SDMSref_idx_l0 zeroExtend(1-buffer[buffersize-1]));
1332
                           numbitsused = 1;
1333
                        end
1334
                     else
1335
                        begin
1336
                           $display( "ccl2SDMSref_idx_l0 %0d", expgolomb_unsigned(buffer) );
1337
                           outfifo.enq(SDMSref_idx_l0 truncate(expgolomb_unsigned(buffer)));
1338
                           numbitsused = expgolomb_numbits(buffer);
1339
                        end
1340
                     nextstate = SubMbPrediction 7;
1341
                  end
1342
                  7:
1343
                  begin
1344
                     if(num_ref_idx_l0_active_minus1 == 1)
1345
                        begin
1346
                           $display( "ccl2SDMSref_idx_l0 %0d", 1-buffer[buffersize-1] );
1347
                           outfifo.enq(SDMSref_idx_l0 zeroExtend(1-buffer[buffersize-1]));
1348
                           numbitsused = 1;
1349
                        end
1350
                     else
1351
                        begin
1352
                           $display( "ccl2SDMSref_idx_l0 %0d", expgolomb_unsigned(buffer) );
1353
                           outfifo.enq(SDMSref_idx_l0 truncate(expgolomb_unsigned(buffer)));
1354
                           numbitsused = expgolomb_numbits(buffer);
1355
                        end
1356
                     nextstate = SubMbPrediction 8;
1357
                  end
1358
                  8:
1359
                  begin
1360
                     tempint = unpack(expgolomb_signed(buffer));
1361
                     $display( "ccl2SDMSmvd_l0 %0d", tempint );
1362
                     outfifo.enq(SDMSmvd_l0 truncate(expgolomb_signed(buffer)));
1363
                     numbitsused = expgolomb_numbits(buffer);
1364
                     nextstate = SubMbPrediction 9;
1365
                  end
1366
                  9:
1367
                  begin
1368
                     tempint = unpack(expgolomb_signed(buffer));
1369
                     $display( "ccl2SDMSmvd_l0 %0d", tempint );
1370
                     outfifo.enq(SDMSmvd_l0 truncate(expgolomb_signed(buffer)));
1371
                     numbitsused = expgolomb_numbits(buffer);
1372
                     temp3bit0 <= temp3bit0-1;
1373
                     if(temp3bit0 == 1)
1374
                        nextstate = SubMbPrediction 10;
1375
                     else
1376
                        nextstate = SubMbPrediction 8;
1377
                  end
1378
                  10:
1379
                  begin
1380
                     tempint = unpack(expgolomb_signed(buffer));
1381
                     $display( "ccl2SDMSmvd_l0 %0d", tempint );
1382
                     outfifo.enq(SDMSmvd_l0 truncate(expgolomb_signed(buffer)));
1383
                     numbitsused = expgolomb_numbits(buffer);
1384
                     nextstate = SubMbPrediction 11;
1385
                  end
1386
                  11:
1387
                  begin
1388
                     tempint = unpack(expgolomb_signed(buffer));
1389
                     $display( "ccl2SDMSmvd_l0 %0d", tempint );
1390
                     outfifo.enq(SDMSmvd_l0 truncate(expgolomb_signed(buffer)));
1391
                     numbitsused = expgolomb_numbits(buffer);
1392
                     temp3bit1 <= temp3bit1-1;
1393
                     if(temp3bit1 == 1)
1394
                        nextstate = SubMbPrediction 12;
1395
                     else
1396
                        nextstate = SubMbPrediction 10;
1397
                  end
1398
                  12:
1399
                  begin
1400
                     tempint = unpack(expgolomb_signed(buffer));
1401
                     $display( "ccl2SDMSmvd_l0 %0d", tempint );
1402
                     outfifo.enq(SDMSmvd_l0 truncate(expgolomb_signed(buffer)));
1403
                     numbitsused = expgolomb_numbits(buffer);
1404
                     nextstate = SubMbPrediction 13;
1405
                  end
1406
                  13:
1407
                  begin
1408
                     tempint = unpack(expgolomb_signed(buffer));
1409
                     $display( "ccl2SDMSmvd_l0 %0d", tempint );
1410
                     outfifo.enq(SDMSmvd_l0 truncate(expgolomb_signed(buffer)));
1411
                     numbitsused = expgolomb_numbits(buffer);
1412
                     temp3bit2 <= temp3bit2-1;
1413
                     if(temp3bit2 == 1)
1414
                        nextstate = SubMbPrediction 14;
1415
                     else
1416
                        nextstate = SubMbPrediction 12;
1417
                  end
1418
                  14:
1419
                  begin
1420
                     tempint = unpack(expgolomb_signed(buffer));
1421
                     $display( "ccl2SDMSmvd_l0 %0d", tempint );
1422
                     outfifo.enq(SDMSmvd_l0 truncate(expgolomb_signed(buffer)));
1423
                     numbitsused = expgolomb_numbits(buffer);
1424
                     nextstate = SubMbPrediction 15;
1425
                  end
1426
                  15:
1427
                  begin
1428
                     tempint = unpack(expgolomb_signed(buffer));
1429
                     $display( "ccl2SDMSmvd_l0 %0d", tempint );
1430
                     outfifo.enq(SDMSmvd_l0 truncate(expgolomb_signed(buffer)));
1431
                     numbitsused = expgolomb_numbits(buffer);
1432
                     temp3bit3 <= temp3bit3-1;
1433
                     if(temp3bit3 == 1)
1434
                        nextstate = MacroblockLayer 5;
1435
                     else
1436
                        nextstate = SubMbPrediction 14;
1437
                  end
1438
                  default: $display( "ERROR EntropyDec: SubMbPrediction default step" );
1439
               endcase
1440
            end
1441
         tagged Residual .step : //return to SliceData 3
1442
            begin
1443
               case ( step )
1444
                  0:
1445
                  begin
1446
                     residualChroma <= 0;
1447
                     temp5bit <= 0;
1448
                     if(mbPartPredMode(sdmmbtype,0) == Intra_16x16)
1449
                        begin
1450
                           maxNumCoeff <= 16;
1451
                           nextstate = ResidualBlock 0;
1452
                        end
1453
                     else
1454
                        nextstate = Residual 1;
1455
                     //$display( "TRACE EntropyDec: Residual 0" );
1456
                  end
1457
                  1:
1458
                  begin
1459
                     if(temp5bit == 16)
1460
                        begin
1461
                           residualChroma <= 1;
1462
                           temp5bit <= 0;
1463
                           nextstate = Residual 3;
1464
                        end
1465
                     else
1466
                        begin
1467
                           Bit#(5) tempMaxNumCoeff = 0;
1468
                           if(mbPartPredMode(sdmmbtype,0) == Intra_16x16)
1469
                              tempMaxNumCoeff = 15;
1470
                           else
1471
                              tempMaxNumCoeff = 16;
1472
                           maxNumCoeff <= tempMaxNumCoeff;
1473
                           if((sdmcodedBlockPatternLuma & (1 << zeroExtend(temp5bit[3:2]))) == 0)
1474
                              begin
1475
                                 calcnc.nNupdate_luma(truncate(temp5bit),0);
1476
                                 ////$display( "ccl2SDMRcoeffLevelZeros %0d", tempMaxNumCoeff );
1477
                                 outfifo_ITB.enq(SDMRcoeffLevelZeros tempMaxNumCoeff);
1478
                                 temp5bit <= temp5bit+1;
1479
                                 nextstate = Residual 1;
1480
                              end
1481
                           else
1482
                              nextstate = ResidualBlock 0;
1483
                        end
1484
                     //$display( "TRACE EntropyDec: Residual 1" );
1485
                  end
1486
                  3:
1487
                  begin
1488
                     if(temp5bit == 2)
1489
                        begin
1490
                           temp5bit <= 0;
1491
                           nextstate = Residual 5;
1492
                        end
1493
                     else
1494
                        begin
1495
                           maxNumCoeff <= 4;
1496
                           if((sdmcodedBlockPatternChroma & 3) == 0)
1497
                              begin
1498
                                 ////$display( "ccl2SDMRcoeffLevelZeros %0d", 4 );
1499
                                 outfifo_ITB.enq(SDMRcoeffLevelZeros 4);
1500
                                 temp5bit <= temp5bit+1;
1501
                                 nextstate = Residual 3;
1502
                              end
1503
                           else
1504
                              nextstate = ResidualBlock 0;
1505
                        end
1506
                     //$display( "TRACE EntropyDec: Residual 3" );
1507
                  end
1508
                  5:
1509
                  begin
1510
                     if(temp5bit == 8)
1511
                        begin
1512
                           temp5bit <= 0;
1513
                           nextstate = SliceData 3;
1514
                        end
1515
                     else
1516
                        begin
1517
                           maxNumCoeff <= 15;
1518
                           if((sdmcodedBlockPatternChroma & 2) == 0)
1519
                              begin
1520
                                 calcnc.nNupdate_chroma(truncate(temp5bit),0);
1521
                                 ////$display( "ccl2SDMRcoeffLevelZeros %0d", 15 );
1522
                                 outfifo_ITB.enq(SDMRcoeffLevelZeros 15);
1523
                                 temp5bit <= temp5bit+1;
1524
                                 nextstate = Residual 5;
1525
                              end
1526
                           else
1527
                              nextstate = ResidualBlock 0;
1528
                        end
1529
                     //$display( "TRACE EntropyDec: Residual 5" );
1530
                  end
1531
                  default: $display( "ERROR EntropyDec: Residual default step" );
1532
               endcase
1533
            end
1534
         tagged ResidualBlock .step : //if(residualChroma==0) return to Residual 1;   else if(maxNumCoeff==4) return to Residual 3;   else return to Residual 5
1535
            begin//don't modify maxNumCoeff, residualChroma, and increment temp5bit on return
1536
               case ( step )
1537
                  0:
1538
                  begin
1539
                     cavlcFIFO.clear();
1540
                     if(maxNumCoeff != 4)
1541
                        begin
1542
                           if(residualChroma == 0)
1543
                              tempreg <= zeroExtend(calcnc.nCcalc_luma(truncate(temp5bit)));
1544
                           else
1545
                              tempreg <= zeroExtend(calcnc.nCcalc_chroma(truncate(temp5bit)));
1546
                        end
1547
                     else
1548
                        tempreg <= zeroExtend(6'b111111);
1549
                     nextstate = ResidualBlock 1;
1550
                     //$display( "TRACE EntropyDec: ResidualBlock 0 temp5bit = %0d", temp5bit);
1551
                  end
1552
                  1:
1553
                  begin
1554
                     Bit#(2) trailingOnesTemp = 0;
1555
                     Bit#(5) totalCoeffTemp = 0;
1556
                     {trailingOnesTemp,totalCoeffTemp,numbitsused} = cavlc_coeff_token( buffer, truncate(tempreg) );
1557
                     temp3bit0 <= zeroExtend(trailingOnesTemp);//trailingOnes
1558
                     totalCoeff <= totalCoeffTemp;
1559
                     if(residualChroma == 0 && !(mbPartPredMode(sdmmbtype,0)==Intra_16x16 && maxNumCoeff==16))
1560
                        calcnc.nNupdate_luma(truncate(temp5bit),totalCoeffTemp);
1561
                     else if(residualChroma == 1 && maxNumCoeff != 4)
1562
                        calcnc.nNupdate_chroma(truncate(temp5bit),totalCoeffTemp);
1563
                     temp5bit2 <= 0;//i
1564
                     tempreg <= 0;//levelCode temp
1565
                     if(totalCoeffTemp > 10 && trailingOnesTemp < 3)
1566
                        temp3bit1 <= 1;//suffixLength
1567
                     else
1568
                        temp3bit1 <= 0;//suffixLength
1569
                     nextstate = ResidualBlock 2;
1570
                     //$display( "TRACE EntropyDec: ResidualBlock 1 nC = %0d", tempreg);
1571
                     $display( "ccl2SDMRtotal_coeff %0d", totalCoeffTemp );
1572
                     $display( "ccl2SDMRtrailing_ones %0d", trailingOnesTemp );
1573
                  end
1574
                  2:
1575
                  begin
1576
                     if( totalCoeff != 0 )
1577
                        begin
1578
                           if(temp5bit2 < zeroExtend(temp3bit0))
1579
                              begin
1580
                                 if(buffer[buffersize-1] == 1)
1581
                                    cavlcFIFO.enq(-1);
1582
                                 else
1583
                                    cavlcFIFO.enq(1);
1584
                                 numbitsused = 1;
1585
                              end
1586
                           else
1587
                              begin
1588
                                 Bit#(32) buffertempshow = buffer[buffersize-1:buffersize-32];
1589
                                 Bit#(3) suffixLength = temp3bit1;
1590
                                 Bit#(4) levelSuffixSize = zeroExtend(suffixLength);
1591
                                 Bit#(4) level_prefix = cavlc_level_prefix( buffer );
1592
                                 Bit#(5) temp_level_prefix = zeroExtend(level_prefix);
1593
                                 Bit#(28) tempbuffer = buffer[buffersize-1:buffersize-28] << zeroExtend(temp_level_prefix+1);
1594
                                 Bit#(14) levelCode = zeroExtend(level_prefix) << zeroExtend(suffixLength);
1595
                                 if(level_prefix == 14 && suffixLength == 0)
1596
                                    levelSuffixSize = 4;
1597
                                 else if(level_prefix == 15)
1598
                                    levelSuffixSize = 12;
1599
                                 levelCode = levelCode + zeroExtend(tempbuffer[27:16] >> (12-zeroExtend(levelSuffixSize)));//level_suffix
1600
                                 if(level_prefix == 15 && suffixLength == 0)
1601
                                    levelCode = levelCode + 15;
1602
                                 if(temp5bit2 == zeroExtend(temp3bit0) && temp3bit0 < 3)
1603
                                    levelCode = levelCode + 2;
1604
                                 if(suffixLength == 0)
1605
                                    suffixLength = 1;
1606
                                 if( suffixLength < 6 && ((levelCode+2) >> 1) > (3 << zeroExtend(suffixLength-1)) )
1607
                                    suffixLength = suffixLength+1;
1608
                                 if(levelCode[0] == 0)
1609
                                    cavlcFIFO.enq(truncate((levelCode+2) >> 1));
1610
                                 else
1611
                                    cavlcFIFO.enq(truncate((~levelCode) >> 1));
1612
                                 if(levelCode[0] == 0)//////////////////////////////////////////////////
1613
                                    begin
1614
                                       tempint = signExtend(unpack((levelCode+2) >> 1));
1615
                                       //$display( "TRACE EntropyDec: temp level %0d", tempint );
1616
                                    end
1617
                                 else
1618
                                    begin
1619
                                       Bit#(13) tempinttemp = truncate((~levelCode) >> 1);
1620
                                       tempint = signExtend(unpack(tempinttemp));
1621
                                       //$display( "TRACE EntropyDec: temp level %0d", tempint );
1622
                                    end///////////////////////////////////////////////////////////////////////
1623
                                 temp3bit1 <= suffixLength;
1624
                                 numbitsused = zeroExtend(level_prefix)+1+zeroExtend(levelSuffixSize);
1625
                              end
1626
                        end
1627
                     if( totalCoeff==0 || temp5bit2+1==totalCoeff )
1628
                        begin
1629
                           temp5bit2 <= 0;
1630
                           zerosLeft <= 0;
1631
                           if(totalCoeff < maxNumCoeff)
1632
                              nextstate = ResidualBlock 3;
1633
                           else
1634
                              nextstate = ResidualBlock 5;
1635
                        end
1636
                     else
1637
                        begin
1638
                           temp5bit2 <= temp5bit2 + 1;
1639
                           nextstate = ResidualBlock 2;
1640
                        end
1641
                  end
1642
                  3:
1643
                  begin
1644
                     Bit#(4) tempZerosLeft;
1645
                     if(totalCoeff > 0)
1646
                        begin
1647
                           {tempZerosLeft,numbitsused} = cavlc_total_zeros( buffer, truncate(totalCoeff), maxNumCoeff);
1648
                           $display( "ccl2SDMRtotal_zeros %0d", tempZerosLeft );//////////////////////////////////////
1649
                        end
1650
                     else
1651
                        tempZerosLeft = 0;
1652
                     zerosLeft <= tempZerosLeft;
1653
                     if(maxNumCoeff - totalCoeff - zeroExtend(tempZerosLeft) > 0)
1654
                        begin
1655
                           $display( "ccl2SDMRcoeffLevelZeros %0d", maxNumCoeff - totalCoeff - zeroExtend(tempZerosLeft) );
1656
                           outfifo_ITB.enq(SDMRcoeffLevelZeros (maxNumCoeff - totalCoeff - zeroExtend(tempZerosLeft)));
1657
                        end
1658
                     nextstate = ResidualBlock 5;
1659
                  end
1660
                  5:
1661
                  begin
1662
                     if( totalCoeff > 0 )
1663
                        begin
1664
                           tempint = signExtend(unpack(cavlcFIFO.first()));
1665
                           $display( "ccl2SDMRcoeffLevel %0d", tempint );
1666
                           if( zerosLeft > 0 )
1667
                              begin
1668
                                 Bit#(4) run_before = 0;
1669
                                 if( totalCoeff > 1 )
1670
                                    {run_before,numbitsused} = cavlc_run_before( buffer, zerosLeft);
1671
                                 else
1672
                                    run_before = zerosLeft;
1673
                                 zerosLeft <= zerosLeft - run_before;
1674
                                 outfifo_ITB.enq(SDMRcoeffLevelPlusZeros {level:cavlcFIFO.first(),zeros:zeroExtend(run_before)});
1675
                                 if( run_before > 0 )
1676
                                    $display( "ccl2SDMRcoeffLevelZeros %0d", run_before );
1677
                              end
1678
                           else
1679
                              outfifo_ITB.enq(SDMRcoeffLevelPlusZeros {level:cavlcFIFO.first(),zeros:0});
1680
                           cavlcFIFO.deq();
1681
                           totalCoeff <= totalCoeff-1;
1682
                        end
1683
                     if( totalCoeff <= 1 )
1684
                        begin
1685
                           if(!(mbPartPredMode(sdmmbtype,0)==Intra_16x16 && maxNumCoeff==16))
1686
                              temp5bit <= temp5bit+1;
1687
                           if(residualChroma==0)
1688
                              nextstate = Residual 1;
1689
                           else if(maxNumCoeff==4)
1690
                              nextstate = Residual 3;
1691
                           else
1692
                              nextstate = Residual 5;
1693
                        end
1694
                     else
1695
                        nextstate = ResidualBlock 5;
1696
                  end
1697
                  default: $display( "ERROR EntropyDec: ResidualBlock default step" );
1698
               endcase
1699
            end
1700
      endcase
1701
 
1702
      if(numbitsused+1 > bufcount)
1703
         begin
1704
            $display( "ERROR EntropyDec: not enough bits in buffer" );
1705
            nextstate = Start;
1706
         end
1707
      buffer <= buffer << zeroExtend(numbitsused);
1708
      bufcount <= bufcount-numbitsused;
1709
      state <= nextstate;
1710
 
1711
   endrule
1712
 
1713
 
1714
   interface Put ioin  = fifoToPut(infifo);
1715
   interface Get ioout = fifoToGet(outfifo);
1716
   interface Get ioout_InverseTrans = fifoToGet(outfifo_ITB);
1717
 
1718
   interface mem_client = calcnc.mem_client;
1719
 
1720
endmodule
1721
 
1722
endpackage

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.