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 62

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

Line No. Rev Author Line
1 2 jamey.hick
//**********************************************************************
2 27 jamey.hick
// Entropy Decoder implementation
3 2 jamey.hick
//----------------------------------------------------------------------
4
//
5
//
6
 
7
package mkEntropyDec;
8
 
9
import H264Types::*;
10
import ExpGolomb::*;
11
import CAVLC::*;
12
import ICalc_nC::*;
13
import mkCalc_nC::*;
14
import IEntropyDec::*;
15
import FIFO::*;
16
 
17
import Connectable::*;
18
import GetPut::*;
19
import ClientServer::*;
20
 
21
 
22
//-----------------------------------------------------------
23
// Local Datatypes
24
//-----------------------------------------------------------
25
 
26
typedef union tagged
27
{
28
 void     Start;            //special state that initializes the process.
29
 void     NewUnit;          //special state that checks the NAL unit type.
30
 
31
 Bit#(5)  CodedSlice;       //decodes a type of NAL unit
32
 void     SEI;              //decodes a type of NAL unit
33
 Bit#(5)  SPS;              //decodes a type of NAL unit
34
 Bit#(5)  PPS;              //decodes a type of NAL unit
35
 void     AUD;              //decodes a type of NAL unit
36
 void     EndSequence;      //decodes a type of NAL unit
37
 void     EndStream;        //decodes a type of NAL unit
38
 void     Filler;           //decodes a type of NAL unit
39
 
40
 Bit#(5)  SliceData;        //decodes slice data (part of a CodedSlice NAL unit)
41
 Bit#(5)  MacroblockLayer;  //decodes macroblock layer (part of a CodedSlice NAL unit)
42
 Bit#(5)  MbPrediction;     //decodes macroblock prediction (part of a CodedSlice NAL unit)
43
 Bit#(5)  SubMbPrediction;  //decodes sub-macroblock prediction (part of a CodedSlice NAL unit)
44
 Bit#(5)  ResidualBlock;    //decodes residual block (part of a CodedSlice NAL unit)
45
}
46
State deriving(Eq,Bits);
47
 
48
 
49
 
50
//-----------------------------------------------------------
51
// Helper functions
52
function MbType mbtype_convert( Bit#(5) in_mb_type, Bit#(4) in_slice_type );//converts mb_type syntax element to MbType type
53
   Bit#(5) tempmb = in_mb_type;
54
   if(in_slice_type == 2 || in_slice_type == 7)//I slice
55
      tempmb = in_mb_type+5;
56
   case ( tempmb )
57
      0: return P_L0_16x16;
58
      1: return P_L0_L0_16x8;
59
      2: return P_L0_L0_8x16;
60
      3: return P_8x8;
61
      4: return P_8x8ref0;
62
      5: return I_NxN;
63
      30: return I_PCM;
64
      default:
65
      begin
66
         Bit#(5) tempmb16x16 = tempmb-6;
67
         Bit#(2) tempv1 = tempmb16x16[1:0];
68
         Bit#(2) tempv2;
69
         Bit#(1) tempv3;
70
         if(tempmb16x16 < 12)
71
            begin
72
               tempv3 = 0;
73
               tempv2 = tempmb16x16[3:2];
74
            end
75
         else
76
            begin
77
               tempv3 = 1;
78
               tempv2 = tempmb16x16[3:2]+1;
79
            end
80
         return I_16x16{intra16x16PredMode:tempv1, codedBlockPatternChroma:tempv2, codedBlockPatternLuma:tempv3};
81
      end
82
   endcase
83
endfunction
84
 
85
 
86
 
87
//-----------------------------------------------------------
88
// Entropy Decoder Module
89
//-----------------------------------------------------------
90
 
91
 
92
(* synthesize *)
93
module mkEntropyDec( IEntropyDec );
94
 
95
   FIFO#(NalUnwrapOT)       infifo      <- mkSizedFIFO(entropyDec_infifo_size);
96
   FIFO#(EntropyDecOT)      outfifo     <- mkFIFO;
97
   FIFO#(EntropyDecOT_InverseTrans) outfifo_ITB <- mkFIFO;
98
   Reg#(State)              state       <- mkReg(Start);
99
   Reg#(Bit#(2))            nalrefidc   <- mkReg(0);
100
   Reg#(Bit#(5))            nalunittype <- mkReg(0);
101
   Reg#(Buffer)             buffer      <- mkReg(0);
102
   Reg#(Bufcount)           bufcount    <- mkReg(0);
103
 
104
   //saved syntax elements
105
   Reg#(Bit#(5))              spsseq_parameter_set_id                    <- mkReg(0);
106
   Reg#(Bit#(5))              spslog2_max_frame_num                      <- mkReg(0);
107
   Reg#(Bit#(5))              spslog2_max_pic_order_cnt_lsb              <- mkReg(0);
108
   Reg#(Bit#(2))              spspic_order_cnt_type                      <- mkReg(0);
109
   Reg#(Bit#(1))              spsdelta_pic_order_always_zero_flag        <- mkReg(0);
110
   Reg#(Bit#(8))              spsnum_ref_frames_in_pic_order_cnt_cycle   <- mkReg(0);
111
   Reg#(Bit#(8))              ppspic_parameter_set_id                    <- mkReg(0);
112
   Reg#(Bit#(1))              ppspic_order_present_flag                  <- mkReg(0);
113
   Reg#(Bit#(1))              ppsdeblocking_filter_control_present_flag  <- mkReg(0);
114
   Reg#(Bit#(4))              shslice_type                               <- mkReg(0);
115
   Reg#(Bit#(3))              shdmemory_management_control_operation     <- mkReg(0);
116
   Reg#(MbType)               sdmmbtype                                  <- mkReg(I_NxN);
117
   Reg#(Bit#(4))              sdmcodedBlockPatternLuma                   <- mkReg(0);
118
   Reg#(Bit#(2))              sdmcodedBlockPatternChroma                 <- mkReg(0);
119
   Reg#(Bit#(5))              sdmrTotalCoeff                             <- mkReg(0);
120
   Reg#(Bit#(2))              sdmrTrailingOnes                           <- mkReg(0);
121
 
122
   //derived decoding variables for slice data
123
   Reg#(Bit#(16))             tempreg                                    <- mkReg(0);
124
   Reg#(Bit#(5))              num_ref_idx_l0_active_minus1               <- mkReg(0);
125
   Reg#(Bit#(PicAreaSz))      currMbAddr                                 <- mkReg(0);
126
   Reg#(Bit#(3))              temp3bit0                                  <- mkReg(0);
127
   Reg#(Bit#(3))              temp3bit1                                  <- mkReg(0);
128
   Reg#(Bit#(3))              temp3bit2                                  <- mkReg(0);
129
   Reg#(Bit#(3))              temp3bit3                                  <- mkReg(0);
130
   Reg#(Bit#(5))              temp5bit                                   <- mkReg(0);
131
   Reg#(Bit#(5))              temp5bit2                                  <- mkReg(0);
132
   Reg#(Bit#(5))              maxNumCoeff                                <- mkReg(0);
133
   FIFO#(Bit#(13))            cavlcFIFO                                  <- mkSizedFIFO(16);
134
   Calc_nC                    calcnc                                     <- mkCalc_nC();
135
   Reg#(Bit#(1))              residualChroma                             <- mkReg(0);
136
   Reg#(Bit#(5))              totalCoeff                                 <- mkReg(0);
137
   Reg#(Bit#(4))              zerosLeft                                  <- mkReg(0);
138
 
139
   //exp-golomb 32-bit version states
140
   Reg#(Bufcount)             egnumbits                                  <- mkReg(0);
141
 
142
   //extra-buffering states
143
   Reg#(Bit#(32))             extrabuffer                                <- mkReg(0);
144
   Reg#(Bit#(3))              extrabufcount                              <- mkReg(0);
145
   Reg#(Bit#(1))              extraendnalflag                            <- mkReg(0);
146
   Reg#(Bit#(1))              endnalflag                                 <- mkReg(0);
147
 
148
 
149
   //-----------------------------------------------------------
150
   // Rules
151
 
152
   rule startup (state matches Start);
153
      case (infifo.first()) matches
154
         tagged NewUnit :
155
            begin
156
               infifo.deq();
157
               state <= NewUnit;
158
               buffer <= 0;
159
               bufcount <= 0;
160
               extrabuffer <= 0;
161
               extrabufcount <= 0;
162
               extraendnalflag <= 0;
163
               endnalflag <= 0;
164
            end
165
         tagged RbspByte .rdata :
166
            begin
167
               infifo.deq();
168
            end
169
         tagged EndOfFile :
170
            begin
171
               infifo.deq();
172
               outfifo.enq(EndOfFile);
173
               $display( "INFO EntropyDec: EndOfFile reached" );
174
            end
175
      endcase
176
   endrule
177
 
178
 
179
   rule newunit (state matches NewUnit);
180
      case (infifo.first()) matches
181
         tagged NewUnit : state <= Start;
182
         tagged RbspByte .rdata :
183
            begin
184
               infifo.deq();
185
               nalrefidc <= rdata[6:5];
186
               nalunittype <= rdata[4:0];
187
               case (rdata[4:0])
188 62 jamey.hick
                  1 : state <= tagged CodedSlice 0;
189
                  5 : state <= tagged CodedSlice 0;
190
                  6 : state <= tagged SEI;
191
                  7 : state <= tagged SPS 0;
192
                  8 : state <= tagged PPS 0;
193
                  9 : state <= tagged AUD;
194
                  10: state <= tagged EndSequence;
195
                  11: state <= tagged EndStream;
196
                  12: state <= tagged Filler;
197 2 jamey.hick
                  default:
198
                  begin
199
                     $display( "ERROR EntropyDec: NAL Unit Type = %d", rdata[4:0] );
200
                     state <= Start;
201
                  end
202
               endcase
203
               $display("ccl2newunit");
204
               $display("ccl2rbspbyte %h", rdata);
205 62 jamey.hick
               outfifo.enq(tagged NewUnit rdata);
206
               outfifo_ITB.enq(tagged NewUnit rdata);
207 2 jamey.hick
            end
208
         tagged EndOfFile : state <= Start;
209
      endcase
210
   endrule
211
 
212
 
213
   rule fillextrabuffer (state != Start
214
                         && state != NewUnit
215
                         && extrabufcount < 4
216
                         && extraendnalflag == 0);
217
      if(infifo.first() matches tagged RbspByte .dbyte)
218
         begin
219
            case ( extrabufcount )
220
               0: extrabuffer <= {dbyte, extrabuffer[23:0]};
221
               1: extrabuffer <= {extrabuffer[31:24],dbyte,extrabuffer[15:0]};
222
               2: extrabuffer <= {extrabuffer[31:16],dbyte,extrabuffer[7:0]};
223
               3: extrabuffer <= {extrabuffer[31:8],dbyte};
224
               default: $display( "ERROR EntropyDec: fillextrabuffer default case_" );
225
            endcase
226
            extrabufcount <= extrabufcount + 1;
227
            infifo.deq();
228
            //$display( "TRACE EntropyDec: fillextrabuffer RbspByte %h %h %h", dbyte, extrabufcount, extrabuffer);
229
         end
230
      else
231
         begin
232
            if(extrabufcount != 0)
233
               extraendnalflag <= 1;
234
            //$display( "TRACE EntropyDec: fillextrabuffer else %h", extrabufcount);
235
         end
236
   endrule
237
 
238
 
239
   rule fillbuffer (state != Start
240
                    && state != NewUnit
241
                    && bufcount<=truncate(buffersize-32)
242
                    && (extrabufcount == 4 || extraendnalflag == 1)
243
                    && endnalflag == 0);//predicate not sure
244
      Buffer temp = zeroExtend(extrabuffer);
245
      Bufcount temp2 = truncate(buffersize)-bufcount-32;
246
      buffer <= (buffer | (temp << zeroExtend(temp2)));
247
      case ( extrabufcount )
248
         4: bufcount <= bufcount+32;
249
         3: bufcount <= bufcount+24;
250
         2: bufcount <= bufcount+16;
251
         1: bufcount <= bufcount+8;
252
         default: $display( "ERROR EntropyDec: fillbuffer default case" );
253
      endcase
254
      extrabuffer <= 0;
255
      extrabufcount <= 0;
256
      if(infifo.first()==NewUnit || infifo.first()==EndOfFile)
257
         endnalflag <= 1;
258
      //$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))));
259
   endrule
260
 
261
 
262
   rule parser (state != Start
263
                &&& state != NewUnit
264
                &&& (bufcount > truncate(buffersize-32) || endnalflag == 1));//predicate not sure
265
      //$display( "TRACE EntropyDec: fillbuffer RbspByte %h %h", bufcount, buffer );
266
 
267
      Bufcount numbitsused = 0;
268
      State nextstate = Start;
269
      Int#(16) tempint = 0;
270
      Int#(32) tempint32 = 0;
271
 
272
      case ( state ) matches
273
         tagged CodedSlice .step :
274
            begin
275
               case ( step )
276
                  0:
277
                  begin
278
                     $display( "ccl2SHfirst_mb_in_slice %0d", expgolomb_unsigned(buffer) );
279 62 jamey.hick
                     outfifo.enq(tagged SHfirst_mb_in_slice truncate(expgolomb_unsigned(buffer)));
280 2 jamey.hick
                     currMbAddr <= truncate(expgolomb_unsigned(buffer));
281
                     calcnc.initialize(truncate(expgolomb_unsigned(buffer)));
282
                     numbitsused = expgolomb_numbits(buffer);
283 62 jamey.hick
                     nextstate = tagged CodedSlice 1;
284 2 jamey.hick
                  end
285
                  1:
286
                  begin
287
                     $display( "ccl2SHslice_type %0d", expgolomb_unsigned(buffer) );
288 62 jamey.hick
                     outfifo.enq(tagged SHslice_type truncate(expgolomb_unsigned(buffer)));
289 2 jamey.hick
                     shslice_type <= truncate(expgolomb_unsigned(buffer));
290
                     numbitsused = expgolomb_numbits(buffer);
291 62 jamey.hick
                     nextstate = tagged CodedSlice 2;
292 2 jamey.hick
                  end
293
                  2:
294
                  begin
295
                     $display( "ccl2SHpic_parameter_set_id %0d", expgolomb_unsigned(buffer) );
296 62 jamey.hick
                     outfifo.enq(tagged SHpic_parameter_set_id truncate(expgolomb_unsigned(buffer)));
297 2 jamey.hick
                     numbitsused = expgolomb_numbits(buffer);
298 62 jamey.hick
                     nextstate = tagged CodedSlice 3;
299 2 jamey.hick
                     if(ppspic_parameter_set_id != truncate(expgolomb_unsigned(buffer))) $display( "ERROR EntropyDec: pic_parameter_set_id don't match" );
300
                  end
301
                  3:
302
                  begin
303
                     Bit#(16) tttt = buffer[buffersize-1:buffersize-16];
304
                     tttt = tttt >> 16 - zeroExtend(spslog2_max_frame_num);
305
                     $display( "ccl2SHframe_num %0d", tttt );
306 62 jamey.hick
                     outfifo.enq(tagged SHframe_num tttt);
307 2 jamey.hick
                     numbitsused = zeroExtend(spslog2_max_frame_num);
308 62 jamey.hick
                     nextstate = tagged CodedSlice 4;
309 2 jamey.hick
                  end
310
                  4:
311
                  begin
312
                     if(nalunittype == 5)
313
                        begin
314
                           $display( "ccl2SHidr_pic_id %0d", expgolomb_unsigned(buffer) );
315 62 jamey.hick
                           outfifo.enq(tagged SHidr_pic_id truncate(expgolomb_unsigned(buffer)));
316 2 jamey.hick
                           numbitsused = expgolomb_numbits(buffer);
317
                        end
318 62 jamey.hick
                     nextstate = tagged CodedSlice 5;
319 2 jamey.hick
                  end
320
                  5:
321
                  begin
322
                     if(spspic_order_cnt_type == 0)
323
                        begin
324
                           Bit#(16) tttt = buffer[buffersize-1:buffersize-16];
325
                           tttt = tttt >> 16 - zeroExtend(spslog2_max_pic_order_cnt_lsb);
326
                           $display( "ccl2SHpic_order_cnt_lsb %0d", tttt );
327 62 jamey.hick
                           outfifo.enq(tagged SHpic_order_cnt_lsb tttt);
328 2 jamey.hick
                           numbitsused = zeroExtend(spslog2_max_pic_order_cnt_lsb);
329 62 jamey.hick
                           nextstate = tagged CodedSlice 6;
330 2 jamey.hick
                        end
331
                     else
332 62 jamey.hick
                        nextstate = tagged CodedSlice 7;
333 2 jamey.hick
                  end
334
                  6:
335
                  begin
336
                     if(ppspic_order_present_flag == 1)
337
                        begin
338
                           if(egnumbits == 0)
339
                              begin
340
                                 Bufcount tempbufcount = expgolomb_numbits32(buffer);
341
                                 egnumbits <= tempbufcount;
342
                                 numbitsused = tempbufcount-1;
343 62 jamey.hick
                                 nextstate = tagged CodedSlice 6;
344 2 jamey.hick
                              end
345
                           else
346
                              begin
347
                                 tempint32 = unpack(expgolomb_signed32(buffer,egnumbits));
348
                                 $display( "ccl2SHdelta_pic_order_cnt_bottom %0d", tempint32 );
349 62 jamey.hick
                                 outfifo.enq(tagged SHdelta_pic_order_cnt_bottom truncate(expgolomb_signed32(buffer,egnumbits)));
350 2 jamey.hick
                                 egnumbits <= 0;
351
                                 numbitsused = egnumbits;
352 62 jamey.hick
                                 nextstate = tagged CodedSlice 7;
353 2 jamey.hick
                              end
354
                        end
355
                     else
356 62 jamey.hick
                        nextstate = tagged CodedSlice 7;
357 2 jamey.hick
                  end
358
                  7:
359
                  begin
360
                     if(spspic_order_cnt_type == 1 && spsdelta_pic_order_always_zero_flag == 0)
361
                        begin
362
                           if(egnumbits == 0)
363
                              begin
364
                                 Bufcount tempbufcount = expgolomb_numbits32(buffer);
365
                                 egnumbits <= tempbufcount;
366
                                 numbitsused = tempbufcount-1;
367 62 jamey.hick
                                 nextstate = tagged CodedSlice 7;
368 2 jamey.hick
                              end
369
                           else
370
                              begin
371
                                 tempint32 = unpack(expgolomb_signed32(buffer,egnumbits));
372
                                 $display( "ccl2SHdelta_pic_order_cnt0 %0d", tempint32 );
373 62 jamey.hick
                                 outfifo.enq(tagged SHdelta_pic_order_cnt0 truncate(expgolomb_signed32(buffer,egnumbits)));
374 2 jamey.hick
                                 egnumbits <= 0;
375
                                 numbitsused = egnumbits;
376 62 jamey.hick
                                 nextstate = tagged CodedSlice 8;
377 2 jamey.hick
                              end
378
                        end
379
                     else
380 62 jamey.hick
                        nextstate = tagged CodedSlice 9;
381 2 jamey.hick
                  end
382
                  8:
383
                  begin
384
                     if(ppspic_order_present_flag == 1)
385
                        begin
386
                           if(egnumbits == 0)
387
                              begin
388
                                 Bufcount tempbufcount = expgolomb_numbits32(buffer);
389
                                 egnumbits <= tempbufcount;
390
                                 numbitsused = tempbufcount-1;
391 62 jamey.hick
                                 nextstate = tagged CodedSlice 8;
392 2 jamey.hick
                              end
393
                           else
394
                              begin
395
                                 tempint32 = unpack(expgolomb_signed32(buffer,egnumbits));
396
                                 $display( "ccl2SHdelta_pic_order_cnt1 %0d", tempint32 );
397 62 jamey.hick
                                 outfifo.enq(tagged SHdelta_pic_order_cnt1 truncate(expgolomb_signed32(buffer,egnumbits)));
398 2 jamey.hick
                                 egnumbits <= 0;
399
                                 numbitsused = egnumbits;
400 62 jamey.hick
                                 nextstate = tagged CodedSlice 9;
401 2 jamey.hick
                              end
402
                        end
403
                     else
404 62 jamey.hick
                        nextstate = tagged CodedSlice 9;
405 2 jamey.hick
                  end
406
                  9:
407
                  begin
408
                     if(shslice_type == 0 || shslice_type == 5)
409
                        begin
410
                           $display( "ccl2SHnum_ref_idx_active_override_flag %0d", buffer[buffersize-1] );
411 62 jamey.hick
                           outfifo.enq(tagged SHnum_ref_idx_active_override_flag buffer[buffersize-1]);
412 2 jamey.hick
                           numbitsused = 1;
413
                           if(buffer[buffersize-1] == 1)
414 62 jamey.hick
                              nextstate = tagged CodedSlice 10;
415 2 jamey.hick
                           else
416 62 jamey.hick
                              nextstate = tagged CodedSlice 11;
417 2 jamey.hick
                        end
418
                     else
419 62 jamey.hick
                        nextstate = tagged CodedSlice 11;
420 2 jamey.hick
                  end
421
                  10:
422
                  begin
423
                     $display( "ccl2SHnum_ref_idx_l0_active %0d", expgolomb_unsigned(buffer)+1 );
424 62 jamey.hick
                     outfifo.enq(tagged SHnum_ref_idx_l0_active truncate(expgolomb_unsigned(buffer)+1));
425 2 jamey.hick
                     num_ref_idx_l0_active_minus1 <= truncate(expgolomb_unsigned(buffer));
426
                     numbitsused = expgolomb_numbits(buffer);
427 62 jamey.hick
                     nextstate = tagged CodedSlice 11;
428 2 jamey.hick
                  end
429
                  11:
430
                  begin
431
                     if(shslice_type != 2 && shslice_type != 7)
432
                        begin
433
                           $display( "ccl2SHRref_pic_list_reordering_flag_l0 %0d", buffer[buffersize-1] );
434 62 jamey.hick
                           outfifo.enq(tagged SHRref_pic_list_reordering_flag_l0 buffer[buffersize-1]);
435 2 jamey.hick
                           numbitsused = 1;
436
                           if(buffer[buffersize-1] == 1)
437 62 jamey.hick
                              nextstate = tagged CodedSlice 12;
438 2 jamey.hick
                           else
439 62 jamey.hick
                              nextstate = tagged CodedSlice 15;
440 2 jamey.hick
                        end
441
                     else
442 62 jamey.hick
                        nextstate = tagged CodedSlice 15;
443 2 jamey.hick
                  end
444
                  12:
445
                  begin
446
                     $display( "ccl2SHRreordering_of_pic_nums_idc %0d", expgolomb_unsigned(buffer) );
447 62 jamey.hick
                     outfifo.enq(tagged SHRreordering_of_pic_nums_idc truncate(expgolomb_unsigned(buffer)));
448 2 jamey.hick
                     numbitsused = expgolomb_numbits(buffer);
449
                     if(expgolomb_unsigned(buffer)==0 || expgolomb_unsigned(buffer)==1)
450 62 jamey.hick
                        nextstate = tagged CodedSlice 13;
451 2 jamey.hick
                     else if(expgolomb_unsigned(buffer)==2)
452 62 jamey.hick
                        nextstate = tagged CodedSlice 14;
453 2 jamey.hick
                     else
454 62 jamey.hick
                        nextstate = tagged CodedSlice 15;
455 2 jamey.hick
                  end
456
                  13:
457
                  begin
458
                     Bit#(17) temp17 = zeroExtend(expgolomb_unsigned(buffer)) + 1;
459
                     $display( "ccl2SHRabs_diff_pic_num %0d", temp17 );
460 62 jamey.hick
                     outfifo.enq(tagged SHRabs_diff_pic_num temp17);
461 2 jamey.hick
                     numbitsused = expgolomb_numbits(buffer);
462 62 jamey.hick
                     nextstate = tagged CodedSlice 12;
463 2 jamey.hick
                  end
464
                  14:
465
                  begin
466
                     $display( "ccl2SHRlong_term_pic_num %0d", expgolomb_unsigned(buffer) );
467 62 jamey.hick
                     outfifo.enq(tagged SHRlong_term_pic_num truncate(expgolomb_unsigned(buffer)));
468 2 jamey.hick
                     numbitsused = expgolomb_numbits(buffer);
469 62 jamey.hick
                     nextstate = tagged CodedSlice 12;
470 2 jamey.hick
                  end
471
                  15:
472
                  begin
473
                     if(nalrefidc == 0)
474 62 jamey.hick
                        nextstate = tagged CodedSlice 23;
475 2 jamey.hick
                     else
476
                        begin
477
                           if(nalunittype == 5)
478
                              begin
479
                                 $display( "ccl2SHDno_output_of_prior_pics_flag %0d", buffer[buffersize-1] );
480 62 jamey.hick
                                 outfifo.enq(tagged SHDno_output_of_prior_pics_flag buffer[buffersize-1]);
481 2 jamey.hick
                                 numbitsused = 1;
482 62 jamey.hick
                                 nextstate = tagged CodedSlice 16;
483 2 jamey.hick
                              end
484
                           else
485 62 jamey.hick
                              nextstate = tagged CodedSlice 17;
486 2 jamey.hick
                        end
487
                  end
488
                  16:
489
                  begin
490
                     $display( "ccl2SHDlong_term_reference_flag %0d", buffer[buffersize-1] );
491 62 jamey.hick
                     outfifo.enq(tagged SHDlong_term_reference_flag buffer[buffersize-1]);
492 2 jamey.hick
                     numbitsused = 1;
493 62 jamey.hick
                     nextstate = tagged CodedSlice 23;
494 2 jamey.hick
                  end
495
                  17:
496
                  begin
497
                     $display( "ccl2SHDadaptive_ref_pic_marking_mode_flag %0d", buffer[buffersize-1] );
498 62 jamey.hick
                     outfifo.enq(tagged SHDadaptive_ref_pic_marking_mode_flag buffer[buffersize-1]);
499 2 jamey.hick
                     numbitsused = 1;
500
                     if(buffer[buffersize-1] == 1)
501 62 jamey.hick
                        nextstate = tagged CodedSlice 18;
502 2 jamey.hick
                     else
503 62 jamey.hick
                        nextstate = tagged CodedSlice 23;
504 2 jamey.hick
                  end
505
                  18:
506
                  begin
507
                     $display( "ccl2SHDmemory_management_control_operation %0d", expgolomb_unsigned(buffer) );
508 62 jamey.hick
                     outfifo.enq(tagged SHDmemory_management_control_operation truncate(expgolomb_unsigned(buffer)));
509 2 jamey.hick
                     shdmemory_management_control_operation <= truncate(expgolomb_unsigned(buffer));
510
                     numbitsused = expgolomb_numbits(buffer);
511
                     if(expgolomb_unsigned(buffer)!=0)
512 62 jamey.hick
                        nextstate = tagged CodedSlice 19;
513 2 jamey.hick
                     else
514 62 jamey.hick
                        nextstate = tagged CodedSlice 23;
515 2 jamey.hick
                  end
516
                  19:
517
                  begin
518
                     if(shdmemory_management_control_operation==1 || shdmemory_management_control_operation==3)
519
                        begin
520
                           Bit#(17) temp17 = zeroExtend(expgolomb_unsigned(buffer)) + 1;
521
                           $display( "ccl2SHDdifference_of_pic_nums %0d", temp17 );
522 62 jamey.hick
                           outfifo.enq(tagged SHDdifference_of_pic_nums temp17);
523 2 jamey.hick
                           numbitsused = expgolomb_numbits(buffer);
524 62 jamey.hick
                           nextstate = tagged CodedSlice 20;
525 2 jamey.hick
                        end
526
                     else
527 62 jamey.hick
                        nextstate = tagged CodedSlice 20;
528 2 jamey.hick
                  end
529
                  20:
530
                  begin
531
                     if(shdmemory_management_control_operation==2)
532
                        begin
533
                           $display( "ccl2SHDlong_term_pic_num %0d", expgolomb_unsigned(buffer) );
534 62 jamey.hick
                           outfifo.enq(tagged SHDlong_term_pic_num truncate(expgolomb_unsigned(buffer)));
535 2 jamey.hick
                           numbitsused = expgolomb_numbits(buffer);
536 62 jamey.hick
                           nextstate = tagged CodedSlice 21;
537 2 jamey.hick
                        end
538
                     else
539 62 jamey.hick
                        nextstate = tagged CodedSlice 21;
540 2 jamey.hick
                  end
541
                  21:
542
                  begin
543
                     if(shdmemory_management_control_operation==3 || shdmemory_management_control_operation==6)
544
                        begin
545
                           $display( "ccl2SHDlong_term_frame_idx %0d", expgolomb_unsigned(buffer) );
546 62 jamey.hick
                           outfifo.enq(tagged SHDlong_term_frame_idx truncate(expgolomb_unsigned(buffer)));
547 2 jamey.hick
                           numbitsused = expgolomb_numbits(buffer);
548 62 jamey.hick
                           nextstate = tagged CodedSlice 22;
549 2 jamey.hick
                        end
550
                     else
551 62 jamey.hick
                        nextstate = tagged CodedSlice 22;
552 2 jamey.hick
                  end
553
                  22:
554
                  begin
555
                     if(shdmemory_management_control_operation==4)
556
                        begin
557
                           $display( "ccl2SHDmax_long_term_frame_idx_plus1 %0d", expgolomb_unsigned(buffer) );
558 62 jamey.hick
                           outfifo.enq(tagged SHDmax_long_term_frame_idx_plus1 truncate(expgolomb_unsigned(buffer)));
559 2 jamey.hick
                           numbitsused = expgolomb_numbits(buffer);
560 62 jamey.hick
                           nextstate = tagged CodedSlice 18;
561 2 jamey.hick
                        end
562
                     else
563 62 jamey.hick
                        nextstate = tagged CodedSlice 18;
564 2 jamey.hick
                  end
565
                  23:
566
                  begin
567
                     tempint = unpack(expgolomb_signed(buffer));
568
                     $display( "ccl2SHslice_qp_delta %0d", tempint );
569 62 jamey.hick
                     outfifo_ITB.enq(tagged SHslice_qp_delta truncate(expgolomb_signed(buffer)));
570 2 jamey.hick
                     numbitsused = expgolomb_numbits(buffer);
571 62 jamey.hick
                     nextstate = tagged CodedSlice 24;
572 2 jamey.hick
                  end
573
                  24:
574
                  begin
575
                     if(ppsdeblocking_filter_control_present_flag==1)
576
                        begin
577
                           $display( "ccl2SHdisable_deblocking_filter_idc %0d", expgolomb_unsigned(buffer) );
578 62 jamey.hick
                           outfifo.enq(tagged SHdisable_deblocking_filter_idc truncate(expgolomb_unsigned(buffer)));
579 2 jamey.hick
                           numbitsused = expgolomb_numbits(buffer);
580
                           if(expgolomb_unsigned(buffer)!=1)
581 62 jamey.hick
                              nextstate = tagged CodedSlice 25;
582 2 jamey.hick
                           else
583 62 jamey.hick
                              nextstate = tagged CodedSlice 27;
584 2 jamey.hick
                        end
585
                     else
586 62 jamey.hick
                        nextstate = tagged CodedSlice 27;
587 2 jamey.hick
                  end
588
                  25:
589
                  begin
590
                     tempint = unpack(expgolomb_signed(buffer) << 1);
591
                     $display( "ccl2SHslice_alpha_c0_offset %0d", tempint );
592 62 jamey.hick
                     outfifo.enq(tagged SHslice_alpha_c0_offset truncate(expgolomb_signed(buffer) << 1));
593 2 jamey.hick
                     numbitsused = expgolomb_numbits(buffer);
594 62 jamey.hick
                     nextstate = tagged CodedSlice 26;
595 2 jamey.hick
                  end
596
                  26:
597
                  begin
598
                     tempint = unpack(expgolomb_signed(buffer) << 1);
599
                     $display( "ccl2SHslice_beta_offset %0d", tempint );
600 62 jamey.hick
                     outfifo.enq(tagged SHslice_beta_offset truncate(expgolomb_signed(buffer) << 1));
601 2 jamey.hick
                     numbitsused = expgolomb_numbits(buffer);
602 62 jamey.hick
                     nextstate = tagged CodedSlice 27;
603 2 jamey.hick
                  end
604
                  27:
605
                  begin
606 62 jamey.hick
                     nextstate = tagged SliceData 0;
607 2 jamey.hick
                  end
608 62 jamey.hick
                  default: $display( "ERROR EntropyDec: tagged CodedSlice default step" );
609 2 jamey.hick
               endcase
610
            end
611
         tagged SEI .step :
612
            begin
613
               nextstate = Start;
614
               $display( "INFO EntropyDec: SEI data thrown away" );
615
            end
616
         tagged SPS .step :
617
            begin
618
               case ( step )
619
                  0:
620
                  begin
621
                     Bit#(8) outputdata = buffer[buffersize-1:buffersize-8];
622
                     $display( "INFO EntropyDec: profile_idc = %d", outputdata );
623
                     outputdata = buffer[buffersize-9:buffersize-16];
624
                     $display( "INFO EntropyDec: constraint_set = %b", outputdata );
625
                     outputdata = buffer[buffersize-17:buffersize-24];
626
                     $display( "INFO EntropyDec: level_idc = %d", outputdata );
627
                     numbitsused = 24;
628 62 jamey.hick
                     nextstate = tagged SPS 1;
629 2 jamey.hick
                  end
630
                  1:
631
                  begin
632
                     $display( "ccl2SPSseq_parameter_set_id %0d", expgolomb_unsigned(buffer) );
633 62 jamey.hick
                     outfifo.enq(tagged SPSseq_parameter_set_id truncate(expgolomb_unsigned(buffer)));
634 2 jamey.hick
                     spsseq_parameter_set_id <= truncate(expgolomb_unsigned(buffer));
635
                     numbitsused = expgolomb_numbits(buffer);
636 62 jamey.hick
                     nextstate = tagged SPS 2;
637 2 jamey.hick
                  end
638
                  2:
639
                  begin
640
                     $display( "ccl2SPSlog2_max_frame_num %0d", expgolomb_unsigned(buffer)+4 );
641 62 jamey.hick
                     outfifo.enq(tagged SPSlog2_max_frame_num truncate(expgolomb_unsigned(buffer)+4));
642 2 jamey.hick
                     spslog2_max_frame_num <= truncate(expgolomb_unsigned(buffer)+4);
643
                     numbitsused = expgolomb_numbits(buffer);
644 62 jamey.hick
                     nextstate = tagged SPS 3;
645 2 jamey.hick
                  end
646
                  3:
647
                  begin
648
                     let tttt = expgolomb_unsigned(buffer);
649
                     $display( "ccl2SPSpic_order_cnt_type %0d", tttt );
650 62 jamey.hick
                     outfifo.enq(tagged SPSpic_order_cnt_type truncate(tttt));
651 2 jamey.hick
                     spspic_order_cnt_type <= truncate(tttt);
652
                     numbitsused = expgolomb_numbits(buffer);
653
                     if(tttt == 0)
654 62 jamey.hick
                        nextstate = tagged SPS 4;
655 2 jamey.hick
                     else if(tttt == 1)
656 62 jamey.hick
                        nextstate = tagged SPS 5;
657 2 jamey.hick
                     else
658 62 jamey.hick
                        nextstate = tagged SPS 10;
659 2 jamey.hick
                  end
660
                  4:
661
                  begin
662
                     $display( "ccl2SPSlog2_max_pic_order_cnt_lsb %0d", expgolomb_unsigned(buffer)+4 );
663 62 jamey.hick
                     outfifo.enq(tagged SPSlog2_max_pic_order_cnt_lsb truncate(expgolomb_unsigned(buffer)+4));
664 2 jamey.hick
                     spslog2_max_pic_order_cnt_lsb <= truncate(expgolomb_unsigned(buffer)+4);
665
                     numbitsused = expgolomb_numbits(buffer);
666 62 jamey.hick
                     nextstate = tagged SPS 10;
667 2 jamey.hick
                  end
668
                  5:
669
                  begin
670
                     $display( "ccl2SPSdelta_pic_order_always_zero_flag %0d", buffer[buffersize-1] );
671 62 jamey.hick
                     outfifo.enq(tagged SPSdelta_pic_order_always_zero_flag buffer[buffersize-1]);
672 2 jamey.hick
                     spsdelta_pic_order_always_zero_flag <= buffer[buffersize-1];
673
                     numbitsused = 1;
674 62 jamey.hick
                     nextstate = tagged SPS 6;
675 2 jamey.hick
                  end
676
                  6:
677
                  begin
678
                     if(egnumbits == 0)
679
                        begin
680
                           Bufcount tempbufcount = expgolomb_numbits32(buffer);
681
                           egnumbits <= tempbufcount;
682
                           numbitsused = tempbufcount-1;
683 62 jamey.hick
                           nextstate = tagged SPS 6;
684 2 jamey.hick
                        end
685
                     else
686
                        begin
687
                           tempint32 = unpack(expgolomb_signed32(buffer,egnumbits));
688
                           $display( "ccl2SPSoffset_for_non_ref_pic %0d", tempint32 );
689 62 jamey.hick
                           outfifo.enq(tagged SPSoffset_for_non_ref_pic truncate(expgolomb_signed32(buffer,egnumbits)));
690 2 jamey.hick
                           egnumbits <= 0;
691
                           numbitsused = egnumbits;
692 62 jamey.hick
                           nextstate = tagged SPS 7;
693 2 jamey.hick
                        end
694
                  end
695
                  7:
696
                  begin
697
                     if(egnumbits == 0)
698
                        begin
699
                           Bufcount tempbufcount = expgolomb_numbits32(buffer);
700
                           egnumbits <= tempbufcount;
701
                           numbitsused = tempbufcount-1;
702 62 jamey.hick
                           nextstate = tagged SPS 7;
703 2 jamey.hick
                        end
704
                     else
705
                        begin
706
                           tempint32 = unpack(expgolomb_signed32(buffer,egnumbits));
707
                           $display( "ccl2SPSoffset_for_top_to_bottom_field %0d", tempint32 );
708 62 jamey.hick
                           outfifo.enq(tagged SPSoffset_for_top_to_bottom_field truncate(expgolomb_signed32(buffer,egnumbits)));
709 2 jamey.hick
                           egnumbits <= 0;
710
                           numbitsused = egnumbits;
711 62 jamey.hick
                           nextstate = tagged SPS 8;
712 2 jamey.hick
                        end
713
                  end
714
                  8:
715
                  begin
716
                     $display( "ccl2SPSnum_ref_frames_in_pic_order_cnt_cycle %0d", expgolomb_unsigned(buffer) );
717 62 jamey.hick
                     outfifo.enq(tagged SPSnum_ref_frames_in_pic_order_cnt_cycle truncate(expgolomb_unsigned(buffer)));
718 2 jamey.hick
                     spsnum_ref_frames_in_pic_order_cnt_cycle <= truncate(expgolomb_unsigned(buffer));
719
                     numbitsused = expgolomb_numbits(buffer);
720 62 jamey.hick
                     nextstate = tagged SPS 9;
721 2 jamey.hick
                  end
722
                  9:
723
                  begin
724
                     if(spsnum_ref_frames_in_pic_order_cnt_cycle == 0)
725 62 jamey.hick
                        nextstate = tagged SPS 10;
726 2 jamey.hick
                     else
727
                        begin
728
                           if(egnumbits == 0)
729
                              begin
730
                                 Bufcount tempbufcount = expgolomb_numbits32(buffer);
731
                                 egnumbits <= tempbufcount;
732
                                 numbitsused = tempbufcount-1;
733 62 jamey.hick
                                 nextstate = tagged SPS 9;
734 2 jamey.hick
                              end
735
                           else
736
                              begin
737
                                 tempint32 = unpack(expgolomb_signed32(buffer,egnumbits));
738
                                 $display( "ccl2SPSoffset_for_ref_frame %0d", tempint32 );
739 62 jamey.hick
                                 outfifo.enq(tagged SPSoffset_for_ref_frame truncate(expgolomb_signed32(buffer,egnumbits)));
740 2 jamey.hick
                                 egnumbits <= 0;
741
                                 spsnum_ref_frames_in_pic_order_cnt_cycle <= spsnum_ref_frames_in_pic_order_cnt_cycle - 1;
742
                                 numbitsused = egnumbits;
743 62 jamey.hick
                                 nextstate = tagged SPS 9;
744 2 jamey.hick
                              end
745
                        end
746
                  end
747
                  10:
748
                  begin
749
                     $display( "ccl2SPSnum_ref_frames %0d", expgolomb_unsigned(buffer) );
750 62 jamey.hick
                     outfifo.enq(tagged SPSnum_ref_frames truncate(expgolomb_unsigned(buffer)));
751 2 jamey.hick
                     numbitsused = expgolomb_numbits(buffer);
752 62 jamey.hick
                     nextstate = tagged SPS 11;
753 2 jamey.hick
                  end
754
                  11:
755
                  begin
756
                     $display( "ccl2SPSgaps_in_frame_num_allowed_flag %0d", buffer[buffersize-1] );
757 62 jamey.hick
                     outfifo.enq(tagged SPSgaps_in_frame_num_allowed_flag buffer[buffersize-1]);
758 2 jamey.hick
                     numbitsused = 1;
759 62 jamey.hick
                     nextstate = tagged SPS 12;
760 2 jamey.hick
                  end
761
                  12:
762
                  begin
763
                     $display( "ccl2SPSpic_width_in_mbs %0d", expgolomb_unsigned(buffer)+1 );
764 62 jamey.hick
                     outfifo.enq(tagged SPSpic_width_in_mbs truncate(expgolomb_unsigned(buffer)+1));
765 2 jamey.hick
                     calcnc.initialize_picWidth(truncate(expgolomb_unsigned(buffer)+1));
766
                     numbitsused = expgolomb_numbits(buffer);
767 62 jamey.hick
                     nextstate = tagged SPS 13;
768 2 jamey.hick
                  end
769
                  13:
770
                  begin
771
                     $display( "ccl2SPSpic_height_in_map_units %0d", expgolomb_unsigned(buffer)+1 );
772 62 jamey.hick
                     outfifo.enq(tagged SPSpic_height_in_map_units truncate(expgolomb_unsigned(buffer)+1));
773 2 jamey.hick
                     numbitsused = expgolomb_numbits(buffer);
774 62 jamey.hick
                     nextstate = tagged SPS 14;
775 2 jamey.hick
                  end
776
                  14:
777
                  begin
778
                     //SPSframe_mbs_only_flag = 1 for baseline
779
                     numbitsused = 1;
780 62 jamey.hick
                     nextstate = tagged SPS 15;
781 2 jamey.hick
                  end
782
                  15:
783
                  begin
784
                     $display( "ccl2SPSdirect_8x8_inference_flag %0d", buffer[buffersize-1] );
785 62 jamey.hick
                     outfifo.enq(tagged SPSdirect_8x8_inference_flag buffer[buffersize-1]);
786 2 jamey.hick
                     numbitsused = 1;
787 62 jamey.hick
                     nextstate = tagged SPS 16;
788 2 jamey.hick
                  end
789
                  16:
790
                  begin
791
                     $display( "ccl2SPSframe_cropping_flag %0d", buffer[buffersize-1] );
792 62 jamey.hick
                     outfifo.enq(tagged SPSframe_cropping_flag buffer[buffersize-1]);
793 2 jamey.hick
                     numbitsused = 1;
794
                     if(buffer[buffersize-1] == 1)
795 62 jamey.hick
                        nextstate = tagged SPS 17;
796 2 jamey.hick
                     else
797 62 jamey.hick
                        nextstate = tagged SPS 21;
798 2 jamey.hick
                  end
799
                  17:
800
                  begin
801
                     $display( "ccl2SPSframe_crop_left_offset %0d", expgolomb_unsigned(buffer) );
802 62 jamey.hick
                     outfifo.enq(tagged SPSframe_crop_left_offset truncate(expgolomb_unsigned(buffer)));
803 2 jamey.hick
                     numbitsused = expgolomb_numbits(buffer);
804 62 jamey.hick
                     nextstate = tagged SPS 18;
805 2 jamey.hick
                  end
806
                  18:
807
                  begin
808
                     $display( "ccl2SPSframe_crop_right_offset %0d", expgolomb_unsigned(buffer) );
809 62 jamey.hick
                     outfifo.enq(tagged SPSframe_crop_right_offset truncate(expgolomb_unsigned(buffer)));
810 2 jamey.hick
                     numbitsused = expgolomb_numbits(buffer);
811 62 jamey.hick
                     nextstate = tagged SPS 19;
812 2 jamey.hick
                  end
813
                  19:
814
                  begin
815
                     $display( "ccl2SPSframe_crop_top_offset %0d", expgolomb_unsigned(buffer) );
816 62 jamey.hick
                     outfifo.enq(tagged SPSframe_crop_top_offset truncate(expgolomb_unsigned(buffer)));
817 2 jamey.hick
                     numbitsused = expgolomb_numbits(buffer);
818 62 jamey.hick
                     nextstate = tagged SPS 20;
819 2 jamey.hick
                  end
820
                  20:
821
                  begin
822
                     $display( "ccl2SPSframe_crop_bottom_offset %0d", expgolomb_unsigned(buffer) );
823 62 jamey.hick
                     outfifo.enq(tagged SPSframe_crop_bottom_offset truncate(expgolomb_unsigned(buffer)));
824 2 jamey.hick
                     numbitsused = expgolomb_numbits(buffer);
825 62 jamey.hick
                     nextstate = tagged SPS 21;
826 2 jamey.hick
                  end
827
                  21:
828
                  begin
829
                     nextstate = Start;
830
                     $display( "INFO EntropyDec:VUI data thrown away" );
831
                  end
832 62 jamey.hick
                  default: $display( "ERROR EntropyDec: tagged SPS default step" );
833 2 jamey.hick
               endcase
834
            end
835
         tagged PPS .step :
836
            begin
837
               case ( step )
838
                  0:
839
                  begin
840
                     ppspic_parameter_set_id <= truncate(expgolomb_unsigned(buffer));
841
                     $display( "ccl2PPSpic_parameter_set_id %0d", expgolomb_unsigned(buffer) );
842 62 jamey.hick
                     outfifo.enq(tagged PPSpic_parameter_set_id truncate(expgolomb_unsigned(buffer)));
843
                     outfifo_ITB.enq(tagged PPSpic_parameter_set_id truncate(expgolomb_unsigned(buffer)));
844 2 jamey.hick
                     numbitsused = expgolomb_numbits(buffer);
845 62 jamey.hick
                     nextstate = tagged PPS 1;
846 2 jamey.hick
                  end
847
                  1:
848
                  begin
849
                     $display( "ccl2PPSseq_parameter_set_id %0d", expgolomb_unsigned(buffer) );
850 62 jamey.hick
                     outfifo.enq(tagged PPSseq_parameter_set_id truncate(expgolomb_unsigned(buffer)));
851 2 jamey.hick
                     numbitsused = expgolomb_numbits(buffer);
852 62 jamey.hick
                     nextstate = tagged PPS 2;
853 2 jamey.hick
                     if(spsseq_parameter_set_id != truncate(expgolomb_unsigned(buffer)))
854
                        $display( "ERROR EntropyDec: seq_parameter_set_id don't match" );
855
                  end
856
                  2:
857
                  begin
858
                     //PPSentropy_coding_mode_flag = 0 for baseline
859
                     numbitsused = 1;
860 62 jamey.hick
                     nextstate = tagged PPS 3;
861 2 jamey.hick
                  end
862
                  3:
863
                  begin
864
                     ppspic_order_present_flag <= buffer[buffersize-1];
865
                     $display( "ccl2PPSpic_order_present_flag %0d", buffer[buffersize-1] );
866 62 jamey.hick
                     outfifo.enq(tagged PPSpic_order_present_flag buffer[buffersize-1]);
867 2 jamey.hick
                     numbitsused = 1;
868 62 jamey.hick
                     nextstate = tagged PPS 4;
869 2 jamey.hick
                  end
870
                  4:
871
                  begin
872
                     numbitsused = expgolomb_numbits(buffer);
873 62 jamey.hick
                     nextstate = tagged PPS 5;
874 2 jamey.hick
                     if(expgolomb_unsigned(buffer)+1 != 1)
875
                        $display( "ERROR EntropyDec: PPSnum_slice_groups not equal to 1" );//=1 for main
876
                  end
877
                  5:
878
                  begin
879
                     $display( "ccl2PPSnum_ref_idx_l0_active %0d", expgolomb_unsigned(buffer)+1 );
880 62 jamey.hick
                     outfifo.enq(tagged PPSnum_ref_idx_l0_active truncate(expgolomb_unsigned(buffer)+1));
881 2 jamey.hick
                     num_ref_idx_l0_active_minus1 <= truncate(expgolomb_unsigned(buffer));
882
                     numbitsused = expgolomb_numbits(buffer);
883 62 jamey.hick
                     nextstate = tagged PPS 6;
884 2 jamey.hick
                  end
885
                  6:
886
                  begin
887
                     $display( "ccl2PPSnum_ref_idx_l1_active %0d", expgolomb_unsigned(buffer)+1 );
888 62 jamey.hick
                     outfifo.enq( tagged PPSnum_ref_idx_l1_active truncate(expgolomb_unsigned(buffer)+1));
889 2 jamey.hick
                     numbitsused = expgolomb_numbits(buffer);
890 62 jamey.hick
                     nextstate = tagged PPS 7;
891 2 jamey.hick
                  end
892
                  7:
893
                  begin
894
                     //PPSweighted_pred_flag = 0 for baseline; PPSweighted_bipred_idc = 0 for baseline
895
                     numbitsused = 3;
896 62 jamey.hick
                     nextstate = tagged PPS 8;
897 2 jamey.hick
                  end
898
                  8:
899
                  begin
900
                     $display( "ccl2PPSpic_init_qp %0d", expgolomb_signed(buffer)+26 );
901 62 jamey.hick
                     outfifo_ITB.enq(tagged PPSpic_init_qp truncate(expgolomb_signed(buffer)+26));
902 2 jamey.hick
                     numbitsused = expgolomb_numbits(buffer);
903 62 jamey.hick
 
904
                     nextstate = tagged PPS 9;
905 2 jamey.hick
                  end
906
                  9:
907
                  begin
908
                     $display( "ccl2PPSpic_init_qs %0d", expgolomb_signed(buffer)+26 );
909 62 jamey.hick
                     outfifo_ITB.enq(tagged PPSpic_init_qs truncate(expgolomb_signed(buffer)+26));
910 2 jamey.hick
                     numbitsused = expgolomb_numbits(buffer);
911 62 jamey.hick
                     nextstate = tagged 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 62 jamey.hick
                     outfifo_ITB.enq(tagged PPSchroma_qp_index_offset truncate(expgolomb_signed(buffer)));
918 2 jamey.hick
                     numbitsused = expgolomb_numbits(buffer);
919 62 jamey.hick
                     nextstate = tagged 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 62 jamey.hick
                     outfifo.enq( tagged PPSdeblocking_filter_control_present_flag buffer[buffersize-1]);
926 2 jamey.hick
                     numbitsused = 1;
927 62 jamey.hick
                     nextstate = tagged PPS 12;
928 2 jamey.hick
                  end
929
                  12:
930
                  begin
931
                     $display( "ccl2PPSconstrained_intra_pred_flag %0d", buffer[buffersize-1] );
932 62 jamey.hick
                     outfifo.enq( tagged PPSconstrained_intra_pred_flag buffer[buffersize-1]);
933 2 jamey.hick
                     numbitsused = 1;
934 62 jamey.hick
                     nextstate = tagged PPS 13;
935 2 jamey.hick
                  end
936
                  13:
937
                  begin
938
                     //PPSredundant_pic_cnt_present_flag = 0 for main
939
                     numbitsused = 1;
940 62 jamey.hick
                     nextstate = tagged 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 62 jamey.hick
                  default: $display( "ERROR EntropyDec: tagged PPS default step" );
949 2 jamey.hick
               endcase
950
            end
951
         tagged AUD .step :
952
            begin
953 62 jamey.hick
               outfifo.enq( tagged AUDPrimaryPicType buffer[buffersize-1:buffersize-3]);
954 2 jamey.hick
               numbitsused = 3;
955
               nextstate = Start;
956
            end
957
         tagged EndSequence :
958
            begin
959 62 jamey.hick
               outfifo.enq( tagged EndOfSequence);
960 2 jamey.hick
               nextstate = Start;
961
            end
962
         tagged EndStream :
963
            begin
964 62 jamey.hick
               outfifo.enq( tagged EndOfStream);
965 2 jamey.hick
               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 62 jamey.hick
                           outfifo.enq( tagged 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 62 jamey.hick
                           nextstate = tagged SliceData 1;
984 2 jamey.hick
                        end
985
                     else
986 62 jamey.hick
                        nextstate = tagged 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 62 jamey.hick
                           nextstate = tagged SliceData 1;
995 2 jamey.hick
                        end
996
                     else
997
                        begin
998
                           ////$display( "ccl2SDcurrMbAddr %0d", currMbAddr );
999 62 jamey.hick
                           ////outfifo.enq( tagged SDcurrMbAddr currMbAddr);
1000
                           nextstate = tagged 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 62 jamey.hick
                           nextstate = tagged MacroblockLayer 0;
1009 2 jamey.hick
                        end
1010
                     else
1011 62 jamey.hick
                        nextstate = tagged 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 62 jamey.hick
                        nextstate = tagged SliceData 0;
1018 2 jamey.hick
                     else
1019
                        nextstate = Start;
1020
                  end
1021 62 jamey.hick
                  default: $display( "ERROR EntropyDec: tagged SliceData default step" );
1022 2 jamey.hick
               endcase
1023
            end
1024 62 jamey.hick
         tagged MacroblockLayer .step : //return to tagged SliceData 3
1025 2 jamey.hick
            begin
1026
               case ( step )
1027
                  0:
1028
                  begin
1029
                     $display( "ccl2SDMmb_type %0d", expgolomb_unsigned(buffer) );
1030 62 jamey.hick
                     outfifo.enq( tagged SDMmbtype mbtype_convert(truncate(expgolomb_unsigned(buffer)), shslice_type) );
1031
                     outfifo_ITB.enq(tagged 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 62 jamey.hick
                           nextstate = tagged MacroblockLayer 1;
1038 2 jamey.hick
                        end
1039
                     else
1040 62 jamey.hick
                        nextstate = tagged MacroblockLayer 4;
1041 2 jamey.hick
                  end
1042
                  1:
1043
                  begin
1044
                     tempreg <= 256;
1045
                     numbitsused = zeroExtend(bufcount[2:0]);
1046 62 jamey.hick
                     nextstate = tagged 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 62 jamey.hick
                           outfifo.enq( tagged SDMpcm_sample_luma outputdata);
1055 2 jamey.hick
                           tempreg <= tempreg-1;
1056
                           numbitsused = 8;
1057 62 jamey.hick
                           nextstate = tagged MacroblockLayer 2;
1058 2 jamey.hick
                        end
1059
                     else
1060
                        begin
1061
                           tempreg <= 128;
1062 62 jamey.hick
                           nextstate = tagged 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 62 jamey.hick
                           outfifo.enq( tagged SDMpcm_sample_chroma outputdata);
1072 2 jamey.hick
                           tempreg <= tempreg-1;
1073
                           numbitsused = 8;
1074 62 jamey.hick
                           nextstate = tagged MacroblockLayer 3;
1075 2 jamey.hick
                        end
1076
                     else
1077 62 jamey.hick
                           nextstate = tagged 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 62 jamey.hick
                        nextstate = tagged SubMbPrediction 0;
1085 2 jamey.hick
                     else
1086 62 jamey.hick
                        nextstate = tagged 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 62 jamey.hick
                           ////outfifo.enq( tagged SDMcoded_block_pattern expgolomb_coded_block_pattern(buffer,sdmmbtype));
1094 2 jamey.hick
                           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 62 jamey.hick
                              $display( "ERROR EntropyDec: tagged MacroblockLayer 5 sdmmbtype not I_16x16" );
1107 2 jamey.hick
                        end
1108 62 jamey.hick
                     nextstate = tagged 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 62 jamey.hick
                           outfifo_ITB.enq(tagged 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 62 jamey.hick
                     nextstate = tagged ResidualBlock 0;
1125 2 jamey.hick
                  end
1126 62 jamey.hick
                  default: $display( "ERROR EntropyDec: tagged MacroblockLayer default step" );
1127 2 jamey.hick
               endcase
1128
            end
1129 62 jamey.hick
         tagged MbPrediction .step : //return to tagged MacroblockLayer 5
1130 2 jamey.hick
            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 62 jamey.hick
                           outfifo.enq( tagged SDMMintra_chroma_pred_mode truncate(expgolomb_unsigned(buffer)));
1138 2 jamey.hick
                           numbitsused = expgolomb_numbits(buffer);
1139 62 jamey.hick
                           nextstate = tagged MacroblockLayer 5;
1140 2 jamey.hick
                        end
1141
                     else if(mbPartPredMode(sdmmbtype,0) == Intra_4x4)
1142
                        begin
1143
                           temp5bit <= 16;
1144 62 jamey.hick
                           nextstate = tagged MbPrediction 1;
1145 2 jamey.hick
                        end
1146
                     else if(num_ref_idx_l0_active_minus1 > 0)
1147
                        begin
1148
                           temp3bit0 <= numMbPart(sdmmbtype);
1149 62 jamey.hick
                           nextstate = tagged MbPrediction 2;
1150 2 jamey.hick
                        end
1151
                     else
1152
                        begin
1153
                           temp3bit0 <= numMbPart(sdmmbtype);
1154 62 jamey.hick
                           nextstate = tagged 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 62 jamey.hick
                           outfifo.enq( tagged SDMMintra_chroma_pred_mode truncate(expgolomb_unsigned(buffer)));
1163 2 jamey.hick
                           numbitsused = expgolomb_numbits(buffer);
1164 62 jamey.hick
                           nextstate = tagged 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 62 jamey.hick
                                 outfifo.enq( tagged SDMMrem_intra4x4_pred_mode tttt);
1174 2 jamey.hick
                                 numbitsused = 4;
1175
                              end
1176
                           else
1177
                              begin
1178 62 jamey.hick
                                 outfifo.enq( tagged SDMMrem_intra4x4_pred_mode 4'b1000);
1179 2 jamey.hick
                                 numbitsused = 1;
1180
                              end
1181
                           temp5bit <= temp5bit-1;
1182 62 jamey.hick
                           nextstate = tagged 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 62 jamey.hick
                           outfifo.enq( tagged 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 62 jamey.hick
                           outfifo.enq( tagged 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 62 jamey.hick
                           nextstate = tagged MbPrediction 3;
1203 2 jamey.hick
                        end
1204
                     else
1205
                        begin
1206
                           temp3bit0 <= temp3bit0-1;
1207 62 jamey.hick
                           nextstate = tagged 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 62 jamey.hick
                     outfifo.enq( tagged SDMMmvd_l0 truncate(expgolomb_signed(buffer)));
1215 2 jamey.hick
                     numbitsused = expgolomb_numbits(buffer);
1216 62 jamey.hick
                     nextstate = tagged MbPrediction 4;
1217 2 jamey.hick
                  end
1218
                  4:
1219
                  begin
1220
                     tempint = unpack(expgolomb_signed(buffer));
1221
                     $display( "ccl2SDMMmvd_l0 %0d", tempint );
1222 62 jamey.hick
                     outfifo.enq( tagged SDMMmvd_l0 truncate(expgolomb_signed(buffer)));
1223 2 jamey.hick
                     numbitsused = expgolomb_numbits(buffer);
1224
                     temp3bit0 <= temp3bit0-1;
1225
                     if(temp3bit0 == 1)
1226 62 jamey.hick
                        nextstate = tagged MacroblockLayer 5;
1227 2 jamey.hick
                     else
1228 62 jamey.hick
                        nextstate = tagged MbPrediction 3;
1229 2 jamey.hick
                  end
1230
                  default: $display( "ERROR EntropyDec: MbPrediction default step" );
1231
               endcase
1232
            end
1233 62 jamey.hick
         tagged SubMbPrediction .step : //return to tagged MacroblockLayer 5
1234 2 jamey.hick
            begin
1235
               case ( step )
1236
                  0:
1237
                  begin
1238
                     $display( "ccl2SDMSsub_mb_type %0d", expgolomb_unsigned(buffer) );
1239 62 jamey.hick
                     outfifo.enq( tagged SDMSsub_mb_type truncate(expgolomb_unsigned(buffer)));
1240 2 jamey.hick
                     temp3bit0 <= numSubMbPart(truncate(expgolomb_unsigned(buffer)));
1241
                     numbitsused = expgolomb_numbits(buffer);
1242 62 jamey.hick
                     nextstate = tagged SubMbPrediction 1;
1243 2 jamey.hick
                  end
1244
                  1:
1245
                  begin
1246
                     $display( "ccl2SDMSsub_mb_type %0d", expgolomb_unsigned(buffer) );
1247 62 jamey.hick
                     outfifo.enq( tagged SDMSsub_mb_type truncate(expgolomb_unsigned(buffer)));
1248 2 jamey.hick
                     temp3bit1 <= numSubMbPart(truncate(expgolomb_unsigned(buffer)));
1249
                     numbitsused = expgolomb_numbits(buffer);
1250 62 jamey.hick
                     nextstate = tagged SubMbPrediction 2;
1251 2 jamey.hick
                  end
1252
                  2:
1253
                  begin
1254
                     $display( "ccl2SDMSsub_mb_type %0d", expgolomb_unsigned(buffer) );
1255 62 jamey.hick
                     outfifo.enq( tagged SDMSsub_mb_type truncate(expgolomb_unsigned(buffer)));
1256 2 jamey.hick
                     temp3bit2 <= numSubMbPart(truncate(expgolomb_unsigned(buffer)));
1257
                     numbitsused = expgolomb_numbits(buffer);
1258 62 jamey.hick
                     nextstate = tagged SubMbPrediction 3;
1259 2 jamey.hick
                  end
1260
                  3:
1261
                  begin
1262
                     $display( "ccl2SDMSsub_mb_type %0d", expgolomb_unsigned(buffer) );
1263 62 jamey.hick
                     outfifo.enq( tagged 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 62 jamey.hick
                        nextstate = tagged SubMbPrediction 4;
1269 2 jamey.hick
                     else
1270 62 jamey.hick
                        nextstate = tagged 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 62 jamey.hick
                           outfifo.enq( tagged 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 62 jamey.hick
                           outfifo.enq( tagged SDMSref_idx_l0 truncate(expgolomb_unsigned(buffer)));
1284 2 jamey.hick
                           numbitsused = expgolomb_numbits(buffer);
1285
                        end
1286 62 jamey.hick
                     nextstate = tagged 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 62 jamey.hick
                           outfifo.enq( tagged 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 62 jamey.hick
                           outfifo.enq( tagged SDMSref_idx_l0 truncate(expgolomb_unsigned(buffer)));
1300 2 jamey.hick
                           numbitsused = expgolomb_numbits(buffer);
1301
                        end
1302 62 jamey.hick
                     nextstate = tagged 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 62 jamey.hick
                           outfifo.enq( tagged 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 62 jamey.hick
                           outfifo.enq( tagged SDMSref_idx_l0 truncate(expgolomb_unsigned(buffer)));
1316 2 jamey.hick
                           numbitsused = expgolomb_numbits(buffer);
1317
                        end
1318 62 jamey.hick
                     nextstate = tagged 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 62 jamey.hick
                           outfifo.enq( tagged 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 62 jamey.hick
                           outfifo.enq( tagged SDMSref_idx_l0 truncate(expgolomb_unsigned(buffer)));
1332 2 jamey.hick
                           numbitsused = expgolomb_numbits(buffer);
1333
                        end
1334 62 jamey.hick
                     nextstate = tagged SubMbPrediction 8;
1335 2 jamey.hick
                  end
1336
                  8:
1337
                  begin
1338
                     tempint = unpack(expgolomb_signed(buffer));
1339
                     $display( "ccl2SDMSmvd_l0 %0d", tempint );
1340 62 jamey.hick
                     outfifo.enq( tagged SDMSmvd_l0 truncate(expgolomb_signed(buffer)));
1341 2 jamey.hick
                     numbitsused = expgolomb_numbits(buffer);
1342 62 jamey.hick
                     nextstate = tagged SubMbPrediction 9;
1343 2 jamey.hick
                  end
1344
                  9:
1345
                  begin
1346
                     tempint = unpack(expgolomb_signed(buffer));
1347
                     $display( "ccl2SDMSmvd_l0 %0d", tempint );
1348 62 jamey.hick
                     outfifo.enq( tagged SDMSmvd_l0 truncate(expgolomb_signed(buffer)));
1349 2 jamey.hick
                     numbitsused = expgolomb_numbits(buffer);
1350
                     temp3bit0 <= temp3bit0-1;
1351
                     if(temp3bit0 == 1)
1352 62 jamey.hick
                        nextstate = tagged SubMbPrediction 10;
1353 2 jamey.hick
                     else
1354 62 jamey.hick
                        nextstate = tagged SubMbPrediction 8;
1355 2 jamey.hick
                  end
1356
                  10:
1357
                  begin
1358
                     tempint = unpack(expgolomb_signed(buffer));
1359
                     $display( "ccl2SDMSmvd_l0 %0d", tempint );
1360 62 jamey.hick
                     outfifo.enq( tagged SDMSmvd_l0 truncate(expgolomb_signed(buffer)));
1361 2 jamey.hick
                     numbitsused = expgolomb_numbits(buffer);
1362 62 jamey.hick
                     nextstate = tagged SubMbPrediction 11;
1363 2 jamey.hick
                  end
1364
                  11:
1365
                  begin
1366
                     tempint = unpack(expgolomb_signed(buffer));
1367
                     $display( "ccl2SDMSmvd_l0 %0d", tempint );
1368 62 jamey.hick
                     outfifo.enq( tagged SDMSmvd_l0 truncate(expgolomb_signed(buffer)));
1369 2 jamey.hick
                     numbitsused = expgolomb_numbits(buffer);
1370
                     temp3bit1 <= temp3bit1-1;
1371
                     if(temp3bit1 == 1)
1372 62 jamey.hick
                        nextstate = tagged SubMbPrediction 12;
1373 2 jamey.hick
                     else
1374 62 jamey.hick
                        nextstate = tagged SubMbPrediction 10;
1375 2 jamey.hick
                  end
1376
                  12:
1377
                  begin
1378
                     tempint = unpack(expgolomb_signed(buffer));
1379
                     $display( "ccl2SDMSmvd_l0 %0d", tempint );
1380 62 jamey.hick
                     outfifo.enq( tagged SDMSmvd_l0 truncate(expgolomb_signed(buffer)));
1381 2 jamey.hick
                     numbitsused = expgolomb_numbits(buffer);
1382 62 jamey.hick
                     nextstate = tagged SubMbPrediction 13;
1383 2 jamey.hick
                  end
1384
                  13:
1385
                  begin
1386
                     tempint = unpack(expgolomb_signed(buffer));
1387
                     $display( "ccl2SDMSmvd_l0 %0d", tempint );
1388 62 jamey.hick
                     outfifo.enq( tagged SDMSmvd_l0 truncate(expgolomb_signed(buffer)));
1389 2 jamey.hick
                     numbitsused = expgolomb_numbits(buffer);
1390
                     temp3bit2 <= temp3bit2-1;
1391
                     if(temp3bit2 == 1)
1392 62 jamey.hick
                        nextstate = tagged SubMbPrediction 14;
1393 2 jamey.hick
                     else
1394 62 jamey.hick
                        nextstate = tagged SubMbPrediction 12;
1395 2 jamey.hick
                  end
1396
                  14:
1397
                  begin
1398
                     tempint = unpack(expgolomb_signed(buffer));
1399
                     $display( "ccl2SDMSmvd_l0 %0d", tempint );
1400 62 jamey.hick
                     outfifo.enq( tagged SDMSmvd_l0 truncate(expgolomb_signed(buffer)));
1401 2 jamey.hick
                     numbitsused = expgolomb_numbits(buffer);
1402 62 jamey.hick
                     nextstate = tagged SubMbPrediction 15;
1403 2 jamey.hick
                  end
1404
                  15:
1405
                  begin
1406
                     tempint = unpack(expgolomb_signed(buffer));
1407
                     $display( "ccl2SDMSmvd_l0 %0d", tempint );
1408 62 jamey.hick
                     outfifo.enq( tagged SDMSmvd_l0 truncate(expgolomb_signed(buffer)));
1409 2 jamey.hick
                     numbitsused = expgolomb_numbits(buffer);
1410
                     temp3bit3 <= temp3bit3-1;
1411
                     if(temp3bit3 == 1)
1412 62 jamey.hick
                        nextstate = tagged MacroblockLayer 5;
1413 2 jamey.hick
                     else
1414 62 jamey.hick
                        nextstate = tagged 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 62 jamey.hick
                        nextstate = tagged 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 62 jamey.hick
                           outfifo_ITB.enq(tagged SDMRcoeffLevelZeros maxNumCoeff);
1440
                           nextstate = tagged ResidualBlock 5;
1441 2 jamey.hick
                        end
1442
                     else if(residualChroma==1 && maxNumCoeff==4 && (sdmcodedBlockPatternChroma & 3)==0)
1443
                        begin
1444 62 jamey.hick
                           outfifo_ITB.enq(tagged SDMRcoeffLevelZeros 4);
1445
                           nextstate = tagged 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 62 jamey.hick
                           outfifo_ITB.enq(tagged SDMRcoeffLevelZeros 15);
1451
                           nextstate = tagged ResidualBlock 5;
1452 2 jamey.hick
                        end
1453
                     else
1454 62 jamey.hick
                        nextstate = tagged 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 62 jamey.hick
                     nextstate = tagged 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 62 jamey.hick
                              nextstate = tagged ResidualBlock 3;
1538 2 jamey.hick
                           else
1539 62 jamey.hick
                              nextstate = tagged ResidualBlock 5;
1540 2 jamey.hick
                        end
1541
                     else
1542
                        begin
1543
                           temp5bit2 <= temp5bit2 + 1;
1544 62 jamey.hick
                           nextstate = tagged 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 62 jamey.hick
                           outfifo_ITB.enq(tagged SDMRcoeffLevelZeros (maxNumCoeff - totalCoeff - zeroExtend(tempZerosLeft)));
1562 2 jamey.hick
                        end
1563 62 jamey.hick
                     nextstate = tagged 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 62 jamey.hick
                                 outfifo_ITB.enq(tagged SDMRcoeffLevelPlusZeros {level:cavlcFIFO.first(),zeros:zeroExtend(run_before)});
1580 2 jamey.hick
                                 if( run_before > 0 )
1581
                                    $display( "ccl2SDMRcoeffLevelZeros %0d", run_before );
1582
                              end
1583
                           else
1584 62 jamey.hick
                              outfifo_ITB.enq(tagged SDMRcoeffLevelPlusZeros {level:cavlcFIFO.first(),zeros:0});
1585 2 jamey.hick
                           cavlcFIFO.deq();
1586
                           totalCoeff <= totalCoeff-1;
1587
                        end
1588
                     if( totalCoeff <= 1 )
1589
                        begin
1590
                           if(residualChroma==0)
1591
                              begin
1592 62 jamey.hick
                                 nextstate = tagged 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 62 jamey.hick
                                 nextstate = tagged 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 62 jamey.hick
                                       nextstate = tagged SliceData 3;
1621 2 jamey.hick
                                    end
1622
                                 else
1623
                                    begin
1624 62 jamey.hick
                                       nextstate = tagged ResidualBlock 0;
1625 2 jamey.hick
                                       temp5bit <= temp5bit+1;
1626
                                    end
1627
                              end
1628
                        end
1629
                     else
1630 62 jamey.hick
                        nextstate = tagged 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 62 jamey.hick
            nextstate = tagged Start;
1641 2 jamey.hick
         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.