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 100

Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

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