00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #include "contributors.h"
00018
00019 #include <math.h>
00020
00021 #include "global.h"
00022 #include "enc_statistics.h"
00023 #include "vlc.h"
00024
00025 #if TRACE
00026 #define SYMTRACESTRING(s) strncpy(sym.tracestring,s,TRACESTRING_SIZE)
00027 #else
00028 #define SYMTRACESTRING(s) // do nothing
00029 #endif
00030
00031
00032 static const byte NCBP[2][48][2]=
00033 {
00034 {
00035 { 1, 0},{10, 1},{11, 2},{ 6, 5},{12, 3},{ 7, 6},{14,14},{ 2,10},{13, 4},{15,15},{ 8, 7},{ 3,11},
00036 { 9, 8},{ 4,12},{ 5,13},{ 0, 9},{ 0, 0},{ 0, 0},{ 0, 0},{ 0, 0},{ 0, 0},{ 0, 0},{ 0, 0},{ 0, 0},
00037 { 0, 0},{ 0, 0},{ 0, 0},{ 0, 0},{ 0, 0},{ 0, 0},{ 0, 0},{ 0, 0},{ 0, 0},{ 0, 0},{ 0, 0},{ 0, 0},
00038 { 0, 0},{ 0, 0},{ 0, 0},{ 0, 0},{ 0, 0},{ 0, 0},{ 0, 0},{ 0, 0},{ 0, 0},{ 0, 0},{ 0, 0},{ 0, 0}
00039 },
00040 {
00041 { 3, 0},{29, 2},{30, 3},{17, 7},{31, 4},{18, 8},{37,17},{ 8,13},{32, 5},{38,18},{19, 9},{ 9,14},
00042 {20,10},{10,15},{11,16},{ 2,11},{16, 1},{33,32},{34,33},{21,36},{35,34},{22,37},{39,44},{ 4,40},
00043 {36,35},{40,45},{23,38},{ 5,41},{24,39},{ 6,42},{ 7,43},{ 1,19},{41, 6},{42,24},{43,25},{25,20},
00044 {44,26},{26,21},{46,46},{12,28},{45,27},{47,47},{27,22},{13,29},{28,23},{14,30},{15,31},{ 0,12}
00045 }
00046 };
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072 int ue_v (char *tracestring, int value, Bitstream *bitstream)
00073 {
00074 SyntaxElement symbol, *sym=&symbol;
00075 sym->value1 = value;
00076 sym->value2 = 0;
00077
00078
00079
00080 ue_linfo(sym->value1,sym->value2,&(sym->len),&(sym->inf));
00081 symbol2uvlc(sym);
00082
00083 writeUVLC2buffer (sym, bitstream);
00084
00085 #if TRACE
00086 strncpy(sym->tracestring,tracestring,TRACESTRING_SIZE);
00087 trace2out (sym);
00088 #endif
00089
00090 return (sym->len);
00091 }
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117 int se_v (char *tracestring, int value, Bitstream *bitstream)
00118 {
00119 SyntaxElement symbol, *sym=&symbol;
00120 sym->value1 = value;
00121 sym->value2 = 0;
00122
00123
00124
00125 se_linfo(sym->value1,sym->value2,&(sym->len),&(sym->inf));
00126 symbol2uvlc(sym);
00127
00128 writeUVLC2buffer (sym, bitstream);
00129
00130 #if TRACE
00131 strncpy(sym->tracestring,tracestring,TRACESTRING_SIZE);
00132 trace2out (sym);
00133 #endif
00134
00135 return (sym->len);
00136 }
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163 Boolean u_1 (char *tracestring, int value, Bitstream *bitstream)
00164 {
00165 SyntaxElement symbol, *sym=&symbol;
00166
00167 sym->bitpattern = value;
00168 sym->value1 = value;
00169 sym->len = 1;
00170
00171
00172
00173 writeUVLC2buffer(sym, bitstream);
00174
00175 #if TRACE
00176 strncpy(sym->tracestring,tracestring,TRACESTRING_SIZE);
00177 trace2out (sym);
00178 #endif
00179
00180 return ((Boolean) sym->len);
00181 }
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210 int u_v (int n, char *tracestring, int value, Bitstream *bitstream)
00211 {
00212 SyntaxElement symbol, *sym=&symbol;
00213
00214 sym->bitpattern = value;
00215 sym->value1 = value;
00216 sym->len = n;
00217
00218
00219
00220 writeUVLC2buffer(sym, bitstream);
00221
00222 #if TRACE
00223 strncpy(sym->tracestring,tracestring,TRACESTRING_SIZE);
00224 trace2out (sym);
00225 #endif
00226
00227 return (sym->len);
00228 }
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245 void ue_linfo(int ue, int dummy, int *len,int *info)
00246 {
00247 int i, nn =(ue+1)>>1;
00248
00249 for (i=0; i < 33 && nn != 0; i++)
00250 {
00251 nn >>= 1;
00252 }
00253 *len = (i << 1) + 1;
00254 *info = ue + 1 - (1 << i);
00255 }
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272 void se_linfo(int se, int dummy, int *len,int *info)
00273 {
00274 int sign = (se <= 0) ? 1 : 0;
00275 int n = iabs(se) << 1;
00276 int nn = (n >> 1);
00277 int i;
00278 for (i = 0; i < 33 && nn != 0; i++)
00279 {
00280 nn >>= 1;
00281 }
00282 *len = (i << 1) + 1;
00283 *info = n - (1 << i) + sign;
00284 }
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295 void cbp_linfo_intra(int cbp, int dummy, int *len,int *info)
00296 {
00297 ue_linfo(NCBP[((img->yuv_format!=0)&&(img->yuv_format!=3))][cbp][0], dummy, len, info);
00298 }
00299
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309 void cbp_linfo_inter(int cbp, int dummy, int *len,int *info)
00310 {
00311 ue_linfo(NCBP[((img->yuv_format!=0)&&(img->yuv_format!=3))][cbp][1], dummy, len, info);
00312 }
00313
00314
00315
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327 void levrun_linfo_c2x2(int level,int run,int *len,int *info)
00328 {
00329 static const byte NTAB[2][2]=
00330 {
00331 {1,5},
00332 {3,0}
00333 };
00334 static const byte LEVRUN[4]=
00335 {
00336 2,1,0,0
00337 };
00338
00339 int levabs,i,n,sign = 0,nn;
00340
00341 if (level == 0)
00342 {
00343 *len=1;
00344 return;
00345 }
00346
00347 if (level <= 0)
00348 {
00349 sign=1;
00350 }
00351
00352 levabs = iabs(level);
00353
00354 if (levabs <= LEVRUN[run])
00355 {
00356 n = NTAB[levabs - 1][run] + 1;
00357 }
00358 else
00359 {
00360 n = (levabs - LEVRUN[run]) * 8 + run * 2;
00361 }
00362
00363 nn = n >> 1;
00364
00365 for (i=0; i < 16 && nn != 0; i++)
00366 {
00367 nn >>= 1;
00368 }
00369 *len = (i << 1) + 1;
00370 *info = n - (1 << i) + sign;
00371 }
00372
00373
00374
00375
00376
00377
00378
00379
00380
00381
00382
00383
00384
00385
00386 void levrun_linfo_inter(int level,int run,int *len,int *info)
00387 {
00388 static const byte LEVRUN[16]=
00389 {
00390 4,2,2,1,1,1,1,1,1,1,0,0,0,0,0,0
00391 };
00392 static const byte NTAB[4][10]=
00393 {
00394 { 1, 3, 5, 9,11,13,21,23,25,27},
00395 { 7,17,19, 0, 0, 0, 0, 0, 0, 0},
00396 {15, 0, 0, 0, 0, 0, 0, 0, 0, 0},
00397 {29, 0, 0, 0, 0, 0, 0, 0, 0, 0},
00398 };
00399
00400 static int levabs,i,n,sign,nn;
00401
00402 if (level == 0)
00403 {
00404 *len=1;
00405 return;
00406 }
00407
00408 sign = (level <= 0) ? 1 : 0;
00409 levabs = iabs(level);
00410
00411 n = (levabs <= LEVRUN[run]) ? NTAB[levabs - 1][run] + 1 : (levabs - LEVRUN[run]) * 32 + run * 2;
00412
00413 nn = n >> 1;
00414
00415 for (i=0; i < 16 && nn != 0; i++)
00416 {
00417 nn >>= 1;
00418 }
00419 *len = (i << 1) + 1;
00420 *info = n - (1 << i) + sign;
00421
00422 }
00423
00424
00425
00426
00427
00428
00429
00430
00431
00432
00433
00434
00435
00436
00437 int symbol2uvlc(SyntaxElement *sym)
00438 {
00439 int suffix_len = sym->len >> 1;
00440
00441 suffix_len = (1 << suffix_len);
00442 sym->bitpattern = suffix_len | (sym->inf & (suffix_len - 1));
00443 return 0;
00444 }
00445
00446
00447
00448
00449
00450
00451
00452 void writeSE_UVLC(SyntaxElement *se, DataPartition *dp)
00453 {
00454 ue_linfo (se->value1,se->value2,&(se->len),&(se->inf));
00455 symbol2uvlc(se);
00456
00457 writeUVLC2buffer(se, dp->bitstream);
00458
00459 if(se->type != SE_HEADER)
00460 dp->bitstream->write_flag = 1;
00461
00462 #if TRACE
00463 if(dp->bitstream->trace_enabled)
00464 trace2out (se);
00465 #endif
00466 }
00467
00468
00469
00470
00471
00472
00473
00474 void writeSE_SVLC(SyntaxElement *se, DataPartition *dp)
00475 {
00476 se_linfo (se->value1,se->value2,&(se->len),&(se->inf));
00477 symbol2uvlc(se);
00478
00479 writeUVLC2buffer(se, dp->bitstream);
00480
00481 if(se->type != SE_HEADER)
00482 dp->bitstream->write_flag = 1;
00483
00484 #if TRACE
00485 if(dp->bitstream->trace_enabled)
00486 trace2out (se);
00487 #endif
00488 }
00489
00490
00491
00492
00493
00494
00495
00496 void writeCBP_VLC (Macroblock* currMB, SyntaxElement *se, DataPartition *dp)
00497 {
00498 if (currMB->mb_type == I4MB || currMB->mb_type == SI4MB || currMB->mb_type == I8MB)
00499 {
00500 cbp_linfo_intra (se->value1,se->value2,&(se->len),&(se->inf));
00501 }
00502 else
00503 {
00504 cbp_linfo_inter (se->value1,se->value2,&(se->len),&(se->inf));
00505 }
00506 symbol2uvlc(se);
00507
00508 writeUVLC2buffer(se, dp->bitstream);
00509
00510 if(se->type != SE_HEADER)
00511 dp->bitstream->write_flag = 1;
00512
00513 #if TRACE
00514 if(dp->bitstream->trace_enabled)
00515 trace2out (se);
00516 #endif
00517 }
00518
00519
00520
00521
00522
00523
00524
00525
00526 void writeIntraPredMode_CAVLC(SyntaxElement *se, DataPartition *dp)
00527 {
00528
00529 if (se->value1 == -1)
00530 {
00531 se->len = 1;
00532 se->inf = 1;
00533 }
00534 else
00535 {
00536 se->len = 4;
00537 se->inf = se->value1;
00538 }
00539
00540 se->bitpattern = se->inf;
00541 writeUVLC2buffer(se, dp->bitstream);
00542
00543 if(se->type != SE_HEADER)
00544 dp->bitstream->write_flag = 1;
00545
00546 #if TRACE
00547 if(dp->bitstream->trace_enabled)
00548 trace2out (se);
00549 #endif
00550
00551 return;
00552 }
00553
00554
00555
00556
00557
00558
00559
00560
00561
00562
00563 int writeSyntaxElement2Buf_UVLC(SyntaxElement *se, Bitstream* this_streamBuffer )
00564 {
00565
00566 se->mapping(se->value1,se->value2,&(se->len),&(se->inf));
00567
00568 symbol2uvlc(se);
00569
00570 writeUVLC2buffer(se, this_streamBuffer );
00571
00572 #if TRACE
00573 if(se->type <= 1)
00574 trace2out (se);
00575 #endif
00576
00577 return (se->len);
00578 }
00579
00580
00581
00582
00583
00584
00585
00586
00587 void writeUVLC2buffer(SyntaxElement *se, Bitstream *currStream)
00588 {
00589 unsigned int mask = 1 << (se->len - 1);
00590 byte *byte_buf = &currStream->byte_buf;
00591 int *bits_to_go = &currStream->bits_to_go;
00592 int i;
00593
00594
00595
00596 if ( se->len < 33 )
00597 {
00598 for (i = 0; i < se->len; i++)
00599 {
00600 *byte_buf <<= 1;
00601
00602 if (se->bitpattern & mask)
00603 *byte_buf |= 1;
00604
00605 mask >>= 1;
00606
00607 if ((--(*bits_to_go)) == 0)
00608 {
00609 *bits_to_go = 8;
00610 currStream->streamBuffer[currStream->byte_pos++] = *byte_buf;
00611 *byte_buf = 0;
00612 }
00613 }
00614 }
00615 else
00616 {
00617
00618 for (i = 0; i < (se->len - 32); i++)
00619 {
00620 *byte_buf <<= 1;
00621
00622 if ((--(*bits_to_go)) == 0)
00623 {
00624 *bits_to_go = 8;
00625 currStream->streamBuffer[currStream->byte_pos++] = *byte_buf;
00626 *byte_buf = 0;
00627 }
00628 }
00629
00630 mask = 1 << 31;
00631 for (i = 0; i < 32; i++)
00632 {
00633 *byte_buf <<= 1;
00634
00635 if (se->bitpattern & mask)
00636 *byte_buf |= 1;
00637
00638 mask >>= 1;
00639
00640 if ((--(*bits_to_go)) == 0)
00641 {
00642 *bits_to_go = 8;
00643 currStream->streamBuffer[currStream->byte_pos++] = *byte_buf;
00644 *byte_buf = 0;
00645 }
00646 }
00647 }
00648 }
00649
00650
00651
00652
00653
00654
00655
00656
00657
00658
00659 int writeSyntaxElement2Buf_Fixed(SyntaxElement *se, Bitstream* this_streamBuffer )
00660 {
00661 writeUVLC2buffer(se, this_streamBuffer );
00662
00663 #if TRACE
00664 if(se->type <= 1)
00665 trace2out (se);
00666 #endif
00667 return (se->len);
00668 }
00669
00670
00671
00672
00673
00674
00675
00676
00677
00678 void writeSE_Flag(SyntaxElement *se, DataPartition *dp )
00679 {
00680 se->len = 1;
00681 se->bitpattern = (se->value1 & 1);
00682
00683 writeUVLC2buffer(se, dp->bitstream );
00684
00685 #if TRACE
00686 if(dp->bitstream->trace_enabled)
00687 trace2out (se);
00688 #endif
00689 }
00690
00691
00692
00693
00694
00695
00696
00697
00698
00699 void writeSE_invFlag(SyntaxElement *se, DataPartition *dp )
00700 {
00701 se->len = 1;
00702 se->bitpattern = 1 - (se->value1 & 1);
00703
00704 writeUVLC2buffer(se, dp->bitstream );
00705
00706 #if TRACE
00707 if(dp->bitstream->trace_enabled)
00708 trace2out (se);
00709 #endif
00710 }
00711
00712
00713
00714
00715
00716
00717
00718
00719
00720 void writeSE_Dummy(SyntaxElement *se, DataPartition *dp )
00721 {
00722 se->len = 0;
00723 }
00724
00725
00726
00727
00728
00729
00730
00731
00732
00733
00734 void writeSE_Fix(SyntaxElement *se, Bitstream *bitstream )
00735 {
00736 writeUVLC2buffer(se, bitstream);
00737
00738 #if TRACE
00739 if(bitstream->trace_enabled)
00740 trace2out (se);
00741 #endif
00742 }
00743
00744
00745
00746
00747
00748
00749
00750
00751
00752
00753
00754
00755
00756 int symbol2vlc(SyntaxElement *sym)
00757 {
00758 int info_len = sym->len;
00759
00760
00761 sym->bitpattern = 0;
00762
00763
00764 while(--info_len >= 0)
00765 {
00766 sym->bitpattern <<= 1;
00767 sym->bitpattern |= (0x01 & (sym->inf >> info_len));
00768 }
00769 return 0;
00770 }
00771
00772
00773
00774
00775
00776
00777
00778
00779 int writeSyntaxElement_VLC(SyntaxElement *se, DataPartition *dp)
00780 {
00781 se->inf = se->value1;
00782 se->len = se->value2;
00783 symbol2vlc(se);
00784
00785 writeUVLC2buffer(se, dp->bitstream);
00786
00787 if(se->type != SE_HEADER)
00788 dp->bitstream->write_flag = 1;
00789
00790 #if TRACE
00791 if(dp->bitstream->trace_enabled)
00792 trace2out (se);
00793 #endif
00794
00795 return (se->len);
00796 }
00797
00798
00799
00800
00801
00802
00803
00804
00805
00806 int writeSyntaxElement_NumCoeffTrailingOnes(SyntaxElement *se, DataPartition *dp)
00807 {
00808 static const byte lentab[3][4][17] =
00809 {
00810 {
00811 { 1, 6, 8, 9,10,11,13,13,13,14,14,15,15,16,16,16,16},
00812 { 0, 2, 6, 8, 9,10,11,13,13,14,14,15,15,15,16,16,16},
00813 { 0, 0, 3, 7, 8, 9,10,11,13,13,14,14,15,15,16,16,16},
00814 { 0, 0, 0, 5, 6, 7, 8, 9,10,11,13,14,14,15,15,16,16},
00815 },
00816 {
00817 { 2, 6, 6, 7, 8, 8, 9,11,11,12,12,12,13,13,13,14,14},
00818 { 0, 2, 5, 6, 6, 7, 8, 9,11,11,12,12,13,13,14,14,14},
00819 { 0, 0, 3, 6, 6, 7, 8, 9,11,11,12,12,13,13,13,14,14},
00820 { 0, 0, 0, 4, 4, 5, 6, 6, 7, 9,11,11,12,13,13,13,14},
00821 },
00822 {
00823 { 4, 6, 6, 6, 7, 7, 7, 7, 8, 8, 9, 9, 9,10,10,10,10},
00824 { 0, 4, 5, 5, 5, 5, 6, 6, 7, 8, 8, 9, 9, 9,10,10,10},
00825 { 0, 0, 4, 5, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9,10,10,10},
00826 { 0, 0, 0, 4, 4, 4, 4, 4, 5, 6, 7, 8, 8, 9,10,10,10},
00827 },
00828
00829 };
00830
00831 static const byte codtab[3][4][17] =
00832 {
00833 {
00834 { 1, 5, 7, 7, 7, 7,15,11, 8,15,11,15,11,15,11, 7,4},
00835 { 0, 1, 4, 6, 6, 6, 6,14,10,14,10,14,10, 1,14,10,6},
00836 { 0, 0, 1, 5, 5, 5, 5, 5,13, 9,13, 9,13, 9,13, 9,5},
00837 { 0, 0, 0, 3, 3, 4, 4, 4, 4, 4,12,12, 8,12, 8,12,8},
00838 },
00839 {
00840 { 3,11, 7, 7, 7, 4, 7,15,11,15,11, 8,15,11, 7, 9,7},
00841 { 0, 2, 7,10, 6, 6, 6, 6,14,10,14,10,14,10,11, 8,6},
00842 { 0, 0, 3, 9, 5, 5, 5, 5,13, 9,13, 9,13, 9, 6,10,5},
00843 { 0, 0, 0, 5, 4, 6, 8, 4, 4, 4,12, 8,12,12, 8, 1,4},
00844 },
00845 {
00846 {15,15,11, 8,15,11, 9, 8,15,11,15,11, 8,13, 9, 5,1},
00847 { 0,14,15,12,10, 8,14,10,14,14,10,14,10, 7,12, 8,4},
00848 { 0, 0,13,14,11, 9,13, 9,13,10,13, 9,13, 9,11, 7,3},
00849 { 0, 0, 0,12,11,10, 9, 8,13,12,12,12, 8,12,10, 6,2},
00850 },
00851 };
00852 int vlcnum = se->len;
00853
00854
00855
00856
00857 if (vlcnum == 3)
00858 {
00859 se->len = 6;
00860 if (se->value1 > 0)
00861 {
00862 se->inf = ((se->value1-1) << 2) | se->value2;
00863 }
00864 else
00865 {
00866 se->inf = 3;
00867 }
00868 }
00869 else
00870 {
00871 se->len = lentab[vlcnum][se->value2][se->value1];
00872 se->inf = codtab[vlcnum][se->value2][se->value1];
00873 }
00874
00875 if (se->len == 0)
00876 {
00877 printf("ERROR: (numcoeff,trailingones) not valid: vlc=%d (%d, %d)\n",
00878 vlcnum, se->value1, se->value2);
00879 exit(-1);
00880 }
00881
00882 symbol2vlc(se);
00883
00884 writeUVLC2buffer(se, dp->bitstream);
00885
00886 if(se->type != SE_HEADER)
00887 dp->bitstream->write_flag = 1;
00888
00889 #if TRACE
00890 if(dp->bitstream->trace_enabled)
00891 trace2out (se);
00892 #endif
00893
00894 return (se->len);
00895 }
00896
00897
00898
00899
00900
00901
00902
00903
00904 int writeSyntaxElement_NumCoeffTrailingOnesChromaDC(SyntaxElement *se, DataPartition *dp)
00905 {
00906 static const byte lentab[3][4][17] =
00907 {
00908
00909 {{ 2, 6, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
00910 { 0, 1, 6, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
00911 { 0, 0, 3, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
00912 { 0, 0, 0, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
00913
00914 {{ 1, 7, 7, 9, 9,10,11,12,13, 0, 0, 0, 0, 0, 0, 0, 0},
00915 { 0, 2, 7, 7, 9,10,11,12,12, 0, 0, 0, 0, 0, 0, 0, 0},
00916 { 0, 0, 3, 7, 7, 9,10,11,12, 0, 0, 0, 0, 0, 0, 0, 0},
00917 { 0, 0, 0, 5, 6, 7, 7,10,11, 0, 0, 0, 0, 0, 0, 0, 0}},
00918
00919 {{ 1, 6, 8, 9,10,11,13,13,13,14,14,15,15,16,16,16,16},
00920 { 0, 2, 6, 8, 9,10,11,13,13,14,14,15,15,15,16,16,16},
00921 { 0, 0, 3, 7, 8, 9,10,11,13,13,14,14,15,15,16,16,16},
00922 { 0, 0, 0, 5, 6, 7, 8, 9,10,11,13,14,14,15,15,16,16}}
00923 };
00924
00925 static const byte codtab[3][4][17] =
00926 {
00927
00928 {{ 1, 7, 4, 3, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
00929 { 0, 1, 6, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
00930 { 0, 0, 1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
00931 { 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
00932
00933 {{ 1,15,14, 7, 6, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0},
00934 { 0, 1,13,12, 5, 6, 6, 6, 5, 0, 0, 0, 0, 0, 0, 0, 0},
00935 { 0, 0, 1,11,10, 4, 5, 5, 4, 0, 0, 0, 0, 0, 0, 0, 0},
00936 { 0, 0, 0, 1, 1, 9, 8, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0}},
00937
00938 {{ 1, 5, 7, 7, 7, 7,15,11, 8,15,11,15,11,15,11, 7, 4},
00939 { 0, 1, 4, 6, 6, 6, 6,14,10,14,10,14,10, 1,14,10, 6},
00940 { 0, 0, 1, 5, 5, 5, 5, 5,13, 9,13, 9,13, 9,13, 9, 5},
00941 { 0, 0, 0, 3, 3, 4, 4, 4, 4, 4,12,12, 8,12, 8,12, 8}}
00942
00943 };
00944 int yuv = img->yuv_format - 1;
00945
00946
00947
00948 se->len = lentab[yuv][se->value2][se->value1];
00949 se->inf = codtab[yuv][se->value2][se->value1];
00950
00951 if (se->len == 0)
00952 {
00953 printf("ERROR: (numcoeff,trailingones) not valid: (%d, %d)\n",
00954 se->value1, se->value2);
00955 exit(-1);
00956 }
00957
00958 symbol2vlc(se);
00959
00960 writeUVLC2buffer(se, dp->bitstream);
00961
00962 if(se->type != SE_HEADER)
00963 dp->bitstream->write_flag = 1;
00964
00965 #if TRACE
00966 if(dp->bitstream->trace_enabled)
00967 trace2out (se);
00968 #endif
00969
00970 return (se->len);
00971 }
00972
00973
00974
00975
00976
00977
00978
00979
00980 int writeSyntaxElement_TotalZeros(SyntaxElement *se, DataPartition *dp)
00981 {
00982 static const byte lentab[TOTRUN_NUM][16] =
00983 {
00984 { 1,3,3,4,4,5,5,6,6,7,7,8,8,9,9,9},
00985 { 3,3,3,3,3,4,4,4,4,5,5,6,6,6,6},
00986 { 4,3,3,3,4,4,3,3,4,5,5,6,5,6},
00987 { 5,3,4,4,3,3,3,4,3,4,5,5,5},
00988 { 4,4,4,3,3,3,3,3,4,5,4,5},
00989 { 6,5,3,3,3,3,3,3,4,3,6},
00990 { 6,5,3,3,3,2,3,4,3,6},
00991 { 6,4,5,3,2,2,3,3,6},
00992 { 6,6,4,2,2,3,2,5},
00993 { 5,5,3,2,2,2,4},
00994 { 4,4,3,3,1,3},
00995 { 4,4,2,1,3},
00996 { 3,3,1,2},
00997 { 2,2,1},
00998 { 1,1},
00999 };
01000
01001 static const byte codtab[TOTRUN_NUM][16] =
01002 {
01003 {1,3,2,3,2,3,2,3,2,3,2,3,2,3,2,1},
01004 {7,6,5,4,3,5,4,3,2,3,2,3,2,1,0},
01005 {5,7,6,5,4,3,4,3,2,3,2,1,1,0},
01006 {3,7,5,4,6,5,4,3,3,2,2,1,0},
01007 {5,4,3,7,6,5,4,3,2,1,1,0},
01008 {1,1,7,6,5,4,3,2,1,1,0},
01009 {1,1,5,4,3,3,2,1,1,0},
01010 {1,1,1,3,3,2,2,1,0},
01011 {1,0,1,3,2,1,1,1,},
01012 {1,0,1,3,2,1,1,},
01013 {0,1,1,2,1,3},
01014 {0,1,1,1,1},
01015 {0,1,1,1},
01016 {0,1,1},
01017 {0,1},
01018 };
01019 int vlcnum = se->len;
01020
01021
01022 se->len = lentab[vlcnum][se->value1];
01023 se->inf = codtab[vlcnum][se->value1];
01024
01025 if (se->len == 0)
01026 {
01027 printf("ERROR: (TotalZeros) not valid: (%d)\n",se->value1);
01028 exit(-1);
01029 }
01030
01031 symbol2vlc(se);
01032
01033 writeUVLC2buffer(se, dp->bitstream);
01034
01035 if(se->type != SE_HEADER)
01036 dp->bitstream->write_flag = 1;
01037
01038 #if TRACE
01039 if(dp->bitstream->trace_enabled)
01040 trace2out (se);
01041 #endif
01042
01043 return (se->len);
01044 }
01045
01046
01047
01048
01049
01050
01051
01052
01053 int writeSyntaxElement_TotalZerosChromaDC(SyntaxElement *se, DataPartition *dp)
01054 {
01055 static const byte lentab[3][TOTRUN_NUM][16] =
01056 {
01057
01058 {{ 1,2,3,3},
01059 { 1,2,2},
01060 { 1,1}},
01061
01062 {{ 1,3,3,4,4,4,5,5},
01063 { 3,2,3,3,3,3,3},
01064 { 3,3,2,2,3,3},
01065 { 3,2,2,2,3},
01066 { 2,2,2,2},
01067 { 2,2,1},
01068 { 1,1}},
01069
01070 {{ 1,3,3,4,4,5,5,6,6,7,7,8,8,9,9,9},
01071 { 3,3,3,3,3,4,4,4,4,5,5,6,6,6,6},
01072 { 4,3,3,3,4,4,3,3,4,5,5,6,5,6},
01073 { 5,3,4,4,3,3,3,4,3,4,5,5,5},
01074 { 4,4,4,3,3,3,3,3,4,5,4,5},
01075 { 6,5,3,3,3,3,3,3,4,3,6},
01076 { 6,5,3,3,3,2,3,4,3,6},
01077 { 6,4,5,3,2,2,3,3,6},
01078 { 6,6,4,2,2,3,2,5},
01079 { 5,5,3,2,2,2,4},
01080 { 4,4,3,3,1,3},
01081 { 4,4,2,1,3},
01082 { 3,3,1,2},
01083 { 2,2,1},
01084 { 1,1}}
01085 };
01086
01087 static const byte codtab[3][TOTRUN_NUM][16] =
01088 {
01089
01090 {{ 1,1,1,0},
01091 { 1,1,0},
01092 { 1,0}},
01093
01094 {{ 1,2,3,2,3,1,1,0},
01095 { 0,1,1,4,5,6,7},
01096 { 0,1,1,2,6,7},
01097 { 6,0,1,2,7},
01098 { 0,1,2,3},
01099 { 0,1,1},
01100 { 0,1}},
01101
01102 {{1,3,2,3,2,3,2,3,2,3,2,3,2,3,2,1},
01103 {7,6,5,4,3,5,4,3,2,3,2,3,2,1,0},
01104 {5,7,6,5,4,3,4,3,2,3,2,1,1,0},
01105 {3,7,5,4,6,5,4,3,3,2,2,1,0},
01106 {5,4,3,7,6,5,4,3,2,1,1,0},
01107 {1,1,7,6,5,4,3,2,1,1,0},
01108 {1,1,5,4,3,3,2,1,1,0},
01109 {1,1,1,3,3,2,2,1,0},
01110 {1,0,1,3,2,1,1,1,},
01111 {1,0,1,3,2,1,1,},
01112 {0,1,1,2,1,3},
01113 {0,1,1,1,1},
01114 {0,1,1,1},
01115 {0,1,1},
01116 {0,1}}
01117 };
01118 int vlcnum = se->len;
01119 int yuv = img->yuv_format - 1;
01120
01121
01122 se->len = lentab[yuv][vlcnum][se->value1];
01123 se->inf = codtab[yuv][vlcnum][se->value1];
01124
01125 if (se->len == 0)
01126 {
01127 printf("ERROR: (TotalZeros) not valid: (%d)\n",se->value1);
01128 exit(-1);
01129 }
01130
01131 symbol2vlc(se);
01132
01133 writeUVLC2buffer(se, dp->bitstream);
01134
01135 if(se->type != SE_HEADER)
01136 dp->bitstream->write_flag = 1;
01137
01138 #if TRACE
01139 if(dp->bitstream->trace_enabled)
01140 trace2out (se);
01141 #endif
01142
01143 return (se->len);
01144 }
01145
01146
01147
01148
01149
01150
01151
01152
01153 int writeSyntaxElement_Run(SyntaxElement *se, DataPartition *dp)
01154 {
01155 static const byte lentab[TOTRUN_NUM][16] =
01156 {
01157 {1,1},
01158 {1,2,2},
01159 {2,2,2,2},
01160 {2,2,2,3,3},
01161 {2,2,3,3,3,3},
01162 {2,3,3,3,3,3,3},
01163 {3,3,3,3,3,3,3,4,5,6,7,8,9,10,11},
01164 };
01165
01166 static const byte codtab[TOTRUN_NUM][16] =
01167 {
01168 {1,0},
01169 {1,1,0},
01170 {3,2,1,0},
01171 {3,2,1,1,0},
01172 {3,2,3,2,1,0},
01173 {3,0,1,3,2,5,4},
01174 {7,6,5,4,3,2,1,1,1,1,1,1,1,1,1},
01175 };
01176 int vlcnum = se->len;
01177
01178
01179 se->len = lentab[vlcnum][se->value1];
01180 se->inf = codtab[vlcnum][se->value1];
01181
01182 if (se->len == 0)
01183 {
01184 printf("ERROR: (run) not valid: (%d)\n",se->value1);
01185 exit(-1);
01186 }
01187
01188 symbol2vlc(se);
01189
01190 writeUVLC2buffer(se, dp->bitstream);
01191
01192 if(se->type != SE_HEADER)
01193 dp->bitstream->write_flag = 1;
01194
01195 #if TRACE
01196 if(dp->bitstream->trace_enabled)
01197 trace2out (se);
01198 #endif
01199
01200 return (se->len);
01201 }
01202
01203
01204
01205
01206
01207
01208
01209
01210 int writeSyntaxElement_Level_VLC1(SyntaxElement *se, DataPartition *dp, int profile_idc)
01211 {
01212 int level = se->value1;
01213 int sign = (level < 0 ? 1 : 0);
01214 int levabs = iabs(level);
01215
01216 if (levabs < 8)
01217 {
01218 se->len = levabs * 2 + sign - 1;
01219 se->inf = 1;
01220 }
01221 else if (levabs < 16)
01222 {
01223
01224 se->len = 19;
01225 se->inf = 16 | ((levabs << 1) - 16) | sign;
01226 }
01227 else
01228 {
01229 int iMask = 4096, numPrefix = 0;
01230 int levabsm16 = levabs + 2032;
01231
01232
01233 if ((levabsm16) >= 4096)
01234 {
01235 numPrefix++;
01236 while ((levabsm16) >= (4096 << numPrefix))
01237 {
01238 numPrefix++;
01239 }
01240 }
01241
01242 iMask <<= numPrefix;
01243 se->inf = iMask | ((levabsm16 << 1) - iMask) | sign;
01244
01245
01246
01247 if (numPrefix > 0 && !IS_FREXT_PROFILE( profile_idc ))
01248 {
01249
01250 se->len = 0x0000FFFF;
01251 return (se->len);
01252 }
01253
01254 se->len = 28 + (numPrefix << 1);
01255 }
01256
01257 symbol2vlc(se);
01258
01259 writeUVLC2buffer(se, dp->bitstream);
01260
01261 if(se->type != SE_HEADER)
01262 dp->bitstream->write_flag = 1;
01263
01264 #if TRACE
01265 if(dp->bitstream->trace_enabled)
01266 trace2out (se);
01267 #endif
01268
01269 return (se->len);
01270 }
01271
01272
01273
01274
01275
01276
01277
01278
01279 int writeSyntaxElement_Level_VLCN(SyntaxElement *se, int vlc, DataPartition *dp, int profile_idc)
01280 {
01281 int level = se->value1;
01282 int sign = (level < 0 ? 1 : 0);
01283 int levabs = iabs(level) - 1;
01284
01285 int shift = vlc - 1;
01286 int escape = (15 << shift);
01287
01288 if (levabs < escape)
01289 {
01290 int sufmask = ~((0xffffffff) << shift);
01291 int suffix = (levabs) & sufmask;
01292
01293 se->len = ((levabs) >> shift) + 1 + vlc;
01294 se->inf = (2 << shift) | (suffix << 1) | sign;
01295 }
01296 else
01297 {
01298 int iMask = 4096;
01299 int levabsesc = levabs - escape + 2048;
01300 int numPrefix = 0;
01301
01302 if ((levabsesc) >= 4096)
01303 {
01304 numPrefix++;
01305 while ((levabsesc) >= (4096 << numPrefix))
01306 {
01307 numPrefix++;
01308 }
01309 }
01310
01311 iMask <<= numPrefix;
01312 se->inf = iMask | ((levabsesc << 1) - iMask) | sign;
01313
01314
01315
01316 if (numPrefix > 0 && !IS_FREXT_PROFILE( profile_idc ))
01317 {
01318
01319 se->len = 0x0000FFFF;
01320 return (se->len);
01321 }
01322 se->len = 28 + (numPrefix << 1);
01323 }
01324
01325 symbol2vlc(se);
01326
01327 writeUVLC2buffer(se, dp->bitstream);
01328
01329 if(se->type != SE_HEADER)
01330 dp->bitstream->write_flag = 1;
01331
01332 #if TRACE
01333 if(dp->bitstream->trace_enabled)
01334 trace2out (se);
01335 #endif
01336
01337 return (se->len);
01338 }
01339
01340
01341 #if TRACE
01342 int bitcounter = 0;
01343
01344
01345
01346
01347
01348
01349
01350 void trace2out(SyntaxElement *sym)
01351 {
01352 static
01353 int i, chars;
01354
01355 if (p_trace != NULL)
01356 {
01357 putc('@', p_trace);
01358 chars = fprintf(p_trace, "%i", bitcounter);
01359 while(chars++ < 6)
01360 putc(' ',p_trace);
01361
01362 chars += fprintf(p_trace, "%s", sym->tracestring);
01363 while(chars++ < 55)
01364 putc(' ',p_trace);
01365
01366
01367 if(sym->len<15)
01368 {
01369 for(i=0 ; i<15-sym->len ; i++)
01370 fputc(' ', p_trace);
01371 }
01372
01373
01374 bitcounter += sym->len;
01375 for(i=1 ; i<=sym->len ; i++)
01376 {
01377 if((sym->bitpattern >> (sym->len-i)) & 0x1)
01378 fputc('1', p_trace);
01379 else
01380 fputc('0', p_trace);
01381 }
01382 fprintf(p_trace, " (%3d) \n",sym->value1);
01383 }
01384 fflush (p_trace);
01385 }
01386
01387 void trace2out_cabac(SyntaxElement *sym)
01388 {
01389 int chars;
01390
01391 if (p_trace != NULL)
01392 {
01393 putc('@', p_trace);
01394 chars = fprintf(p_trace, "%i", bitcounter);
01395 while(chars++ < 6)
01396 putc(' ',p_trace);
01397
01398 chars += fprintf(p_trace, "%s", sym->tracestring);
01399 while(chars++ < 70)
01400 putc(' ',p_trace);
01401
01402 fprintf(p_trace, " (%3d) \n",sym->value1);
01403 }
01404 fflush (p_trace);
01405 bitcounter += sym->len;
01406 }
01407 #endif
01408
01409
01410
01411
01412
01413
01414
01415
01416
01417
01418
01419
01420
01421
01422
01423 void writeVlcByteAlign(Bitstream* currStream, StatParameters *cur_stats)
01424 {
01425 if (currStream->bits_to_go < 8)
01426 {
01427 currStream->byte_buf = (currStream->byte_buf << currStream->bits_to_go) | (0xff >> (8 - currStream->bits_to_go));
01428 currStream->streamBuffer[currStream->byte_pos++] = currStream->byte_buf;
01429 cur_stats->bit_use_stuffingBits[img->type] += currStream->bits_to_go;
01430 currStream->bits_to_go = 8;
01431 }
01432 }
01433
01434
01435
01436
01437
01438
01439 void reset_mb_nz_coeff(int mb_number)
01440 {
01441 memset(&img->nz_coeff [mb_number][0][0], 0, BLOCK_SIZE * (BLOCK_SIZE + img->num_blk8x8_uv) * sizeof(int));
01442 }
01443