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

Subversion Repositories bluespec-h264

[/] [bluespec-h264/] [trunk/] [src/] [mkEntropyDec.bsv] - Blame information for rev 15

Go to most recent revision | Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

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