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

Subversion Repositories bluespec-h264

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

Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

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