1 /*
2 * This file is part of FFmpeg.
3 *
4 * FFmpeg is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
8 *
9 * FFmpeg is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with FFmpeg; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17 */
18
19 /**
20 * @file
21 * @brief IntraX8 (J-Frame) subdecoder, used by WMV2 and VC-1
22 */
23
34
35 #define MAX_TABLE_DEPTH(table_bits, max_bits) ((max_bits+table_bits-1)/table_bits)
36
40
41 #define DC_VLC_MTD MAX_TABLE_DEPTH(DC_VLC_BITS, MAX_DC_VLC_BITS)
42 #define AC_VLC_MTD MAX_TABLE_DEPTH(AC_VLC_BITS, MAX_AC_VLC_BITS)
43 #define OR_VLC_MTD MAX_TABLE_DEPTH(OR_VLC_BITS, MAX_OR_VLC_BITS)
44
45 static VLC j_ac_vlc[2][2][8];
//[quant<13],[intra/inter],[select]
48
50 int i;
52 int sizeidx = 0;
53 static const uint16_t
sizes[8*4 + 8*2 + 2 + 4] = {
54 576, 548, 582, 618, 546, 616, 560, 642,
55 584, 582, 704, 664, 512, 544, 656, 640,
56 512, 648, 582, 566, 532, 614, 596, 648,
57 586, 552, 584, 590, 544, 578, 584, 624,
58
59 528, 528, 526, 528, 536, 528, 526, 544,
60 544, 512, 512, 528, 528, 544, 512, 544,
61
62 128, 128, 128, 128, 128, 128};
63
65
66 #define init_ac_vlc(dst,src) \
67 dst.table = &table[offset]; \
68 dst.table_allocated = sizes[sizeidx]; \
69 offset += sizes[sizeidx++]; \
70 init_vlc(&dst, \
71 AC_VLC_BITS,77, \
72 &src[1],4,2, \
73 &src[0],4,2, \
74 INIT_VLC_USE_NEW_STATIC)
75 //set ac tables
76 for(i=0;i<8;i++){
81 }
82 #undef init_ac_vlc
83
84 //set dc tables
85 #define init_dc_vlc(dst,src) \
86 dst.table = &table[offset]; \
87 dst.table_allocated = sizes[sizeidx]; \
88 offset += sizes[sizeidx++]; \
89 init_vlc(&dst, \
90 DC_VLC_BITS,34, \
91 &src[1],4,2, \
92 &src[0],4,2, \
93 INIT_VLC_USE_NEW_STATIC);
94 for(i=0;i<8;i++){
97 }
98 #undef init_dc_vlc
99
100 //set orient tables
101 #define init_or_vlc(dst,src) \
102 dst.table = &table[offset]; \
103 dst.table_allocated = sizes[sizeidx]; \
104 offset += sizes[sizeidx++]; \
105 init_vlc(&dst, \
106 OR_VLC_BITS,12, \
107 &src[1],4,2, \
108 &src[0],4,2, \
109 INIT_VLC_USE_NEW_STATIC);
110 for(i=0;i<2;i++){
112 }
113 for(i=0;i<4;i++){
115 }
116 if (offset !=
sizeof(table)/
sizeof(
VLC_TYPE)/2)
118 }
119 #undef init_or_vlc
120
125 }
126
129 int table_index;
130
132
134
136 w->
j_ac_vlc[
mode] = &j_ac_vlc[w->
quant<13][mode>>1][table_index];
//2 modes use same tables
138 }
139
142 int table_index;
143
147 }
148
150 }
151
152 #define extra_bits(eb) (eb)
153 #define extra_run (0xFF<<8)
154 #define extra_level (0x00<<8)
155 #define run_offset(r) ((r)<<16)
156 #define level_offset(l) ((l)<<24)
162
165
171
174
181
185
189
192 };
193 //extra_bits = 3bits; extra_run/level = 1 bit; run_offset = 6bits; level_offset = 5 bits;
194 #undef extra_bits
195 #undef extra_run
196 #undef extra_level
197 #undef run_offset
198 #undef level_offset
199
201 int *
const run,
int *
const level,
int *
const final){
203 int i,e;
204
205 // x8_select_ac_table(w,mode);
207
208 if(i<46){ //[0-45]
209 int t,l;
210 if(i<0){
211 (*level)=(*final)=//prevent 'may be used unilitialized'
212 (*run)=64;//this would cause error exit in the ac loop
213 return;
214 }
215
216 (*final) = t = (i>22);
217 i-=23*t;
218 /*
219 i== 0-15 r=0-15 l=0 ;r=i& %01111
220 i==16-19 r=0-3 l=1 ;r=i& %00011
221 i==20-21 r=0-1 l=2 ;r=i& %00001
222 i==22 r=0 l=3 ;r=i& %00000
223 l=lut_l[i/2]={0,0,0,0,0,0,0,0,1,1,2,3}[i>>1];// 11 10'01 01'00 00'00 00'00 00'00 00 => 0xE50000
224 t=lut_mask[l]={0x0f,0x03,0x01,0x00}[l]; as i<256 the higher bits do not matter */
225 l=(0xE50000>>(i&(0x1E)))&3;/*0x1E or (~1) or ((i>>1)<<1)*/
226 t=(0x01030F>>(l<<3));
227
228 (*run) = i&t;
229 (*level) = l;
230 }else if(i<73){//[46-72]
231 uint32_t sm;
233
234 i-=46;
236
238 mask=sm&0xff;sm>>=8; //1bit
239
240 (*run) =(sm&0xff) + (e&( mask));//6bits
241 (*level)=(sm>>8) + (e&(~mask));//5bits
242 (*final)=i>(58-46);
243 }else if(i<75){//[73-74]
244 static const uint8_t crazy_mix_runlevel[32]={
245 0x22,0x32,0x33,0x53,0x23,0x42,0x43,0x63,
246 0x24,0x52,0x34,0x73,0x25,0x62,0x44,0x83,
247 0x26,0x72,0x35,0x54,0x27,0x82,0x45,0x64,
248 0x28,0x92,0x36,0x74,0x29,0xa2,0x46,0x84};
249
250 (*final)=!(i&1);
252 (*run) =crazy_mix_runlevel[e]>>4;
253 (*level)=crazy_mix_runlevel[e]&0x0F;
254 }else{
258 }
259 return;
260 }
261
262 //static const uint8_t dc_extra_sbits[] ={0, 1,1, 1,1, 2,2, 3,3, 4,4, 5,5, 6,6, 7,7 };
263 static const uint8_t dc_index_offset[] ={ 0, 1,2, 3,4, 5,7, 9,13, 17,25, 33,49, 65,97, 129,193};
264
268
271 int table_index;
273 //4 modes, same table
275 }
276
278
279 /*(i>=17) {i-=17;final=1;}*/
280 c= i>16;
283
284 if(i<=0){
285 (*level)=0;
286 return -i;
287 }
288 c=(i+1)>>1;//hackish way to calculate dc_extra_sbits[]
289 c-=c>1;
290
293
294 e= -(e & 1);//0,0xffffff
295 (*level)= (i ^ e) - e;// (i^0)-0 , (i^0xff)-(-1)
296 return 0;
297 }
298 //end of huffman
299
302 int range;
303 int sum;
305
308 &range, &sum, w->
edges);
309 if(chroma){
312 }else{
314 }
315
317 if(range < quant || range < 3){
319 if(range < 3){//yep you read right, a +-1 idct error may break decoding!
321 sum+=9;
322 w->
predicted_dc = (sum*6899)>>17;
//((1<<17)+9)/(8+8+1+2)=6899
323 }
324 }
325 if(chroma)
326 return 0;
327
329 if(range < 2*w->quant){
330 if( (w->
edges&3) == 0){
333 }else{
335 }
337 }else{
338 static const uint8_t prediction_table[3][12]={
339 {0,8,4, 10,11, 2,6,9,1,3,5,7},
340 {4,0,8, 11,10, 3,5,2,6,9,1,7},
341 {8,0,4, 10,11, 1,7,2,6,9,3,5}
342 };
348 }
349 return 0;
350 }
351
354
356 /*
357 y=2n+0 ->//0 2 4
358 y=2n+1 ->//1 3 5
359 */
360 }
363
366 w->
edges|= 4*( s->
mb_x >= (2*s->
mb_width-1) );
//mb_x for chroma would always be odd
367
369 if(w->
edges&3){
//lut_co[8]={inv,4,8,8, inv,4,8,8}<- =>{1,1,0,0;1,1,0,0} => 0xCC
371 return;
372 }
374 }
375
379
383
385 case 0:
386 break;
387 case 1:
388 //take the one from the above block[0][y-1]
391 return;
392 case 2:
393 //take the one from the previous block[x-1][0]
396 return;
397 case 3:
400 return;
401 }
402 //no edge cases
406
408 /* This condition has nothing to do with w->edges, even if it looks
409 similar it would trigger if e.g. x=3;y=2;
410 I guess somebody wrote something wrong and it became standard. */
413
414 a&=3;
415 b&=3;
416 c&=3;
417
418 i=( 0xFFEAF4C4>>(2*b+8*
a) )&3;
420 else w->
orient=( 0xFFEAD8>>(2*c+8*(w->
quant>12)) )&3;
421 /*
422 lut1[b][a]={
423 ->{0, 1, 0, pad},
424 {0, 1, X, pad},
425 {2, 2, 2, pad}}
426 pad 2 2 2; pad X 1 0; pad 0 1 0 <-
427 -> 11 10 '10 10 '11 11'01 00 '11 00'01 00=>0xEAF4C4
428
429 lut2[q>12][c]={
430 ->{0,2,1,pad},
431 {2,2,2,pad}}
432 pad 2 2 2; pad 1 2 0 <-
433 -> 11 10'10 10 '11 01'10 00=>0xEAD8
434 */
435 }
436
437
440 int t;
441 #define B(x,y) s->block[0][w->idct_permutation[(x)+(y)*8]]
442 #define T(x) ((x) * dc_level + 0x8000) >> 16;
443 switch(direction){
444 case 0:
448
452
456
464
468
474
481
484
486 break;
487 case 1:
492
494 break;
495 case 2:
500
502 break;
503 }
504 #undef B
505 #undef T
506 }
507
509 int k;
510 for(k=0;k<8;k++){
511 memset(dst,pix,8);
512 dst+=linesize;
513 }
514 }
515
517 256, 256, 256, 256, 256, 256, 259, 262,
518 265, 269, 272, 275, 278, 282, 285, 288,
519 292, 295, 299, 303, 306, 310, 314, 317,
520 321, 325, 329, 333, 337, 341, 345, 349,
521 353, 358, 362, 366, 371, 375, 379, 384,
522 389, 393, 398, 403, 408, 413, 417, 422,
523 428, 433, 438, 443, 448, 454, 459, 465,
524 470, 476, 482, 488, 493, 499, 505, 511
525 };
526
529
532 int ac_mode,dc_mode,est_run,dc_level;
534 int zeros_only;
535 int use_quant_matrix;
536 int sign;
537
540
541 if(chroma){
542 dc_mode=2;
543 }else{
545 }
546
548 n=0;
549 zeros_only=0;
550 if(!final){//decode ac
552 if(chroma){
553 ac_mode = 1;
554 est_run = 64;//not used
555 }else{
557 use_quant_matrix = 0;
558 }
560 ac_mode = 0;
561 est_run = 64;
562 }else{
564 ac_mode = 2;
566 }else{
567 ac_mode = 3;
568 est_run = 64;
569 }
570 }
571 }
573 /*scantable_selector[12]={0,2,0,1,1,1,0,2,2,0,1,2};<-
574 -> 10'01' 00'10' 10'00' 01'01' 01'00' 10'00 =>0x928548 */
576 pos=0;
577 do {
578 n++;
579 if( n >= est_run ){
580 ac_mode=3;
582 }
583
585
586 pos+=run+1;
587 if(pos>63){
588 //this also handles vlc error in x8_get_ac_rlf
589 return -1;
590 }
591 level= (level+1) * w->
dquant;
593
595 level = (level ^ sign) - sign;
596
597 if(use_quant_matrix){
599 }
601 }while(!final);
602
604 }else{//DC only
606 if(w->
flat_dc && ((
unsigned)(dc_level+1)) < 3){
//[-1;1]
611
612 //original intent dc_level+=predicted_dc/quant; but it got lost somewhere in the rounding
613 dc_level+= (w->
predicted_dc*divide_quant + (1<<12) )>>13;
614
617
618 goto block_placed;
619 }
620 zeros_only = (dc_level == 0);
621 }
622 if(!chroma){
624 }else{
626 }
627
628 //there is !zero_only check in the original, but dc_level check is enough
629 if( (
unsigned int)(dc_level+1) >= 3 && (w->
edges&3) != 3 ){
630 int direction;
631 /*ac_comp_direction[orient] = { 0, 3, 3, 1, 1, 0, 0, 0, 2, 2, 2, 1 };<-
632 -> 01'10' 10'10' 00'00' 00'01' 01'11' 11'00 =>0x6A017C */
633 direction= (0x6A017C>>(w->
orient*2))&3;
634 if (direction != 3){
636 }
637 }
638
641 }else{
645 }
646 if(!zeros_only)
650
651 block_placed:
652
653 if(!chroma){
655 }
656
660
661 if(!( (w->
edges&2) || ( zeros_only && (w->
orient|4)==4 ) )){
663 }
664 if(!( (w->
edges&1) || ( zeros_only && (w->
orient|8)==8 ) )){
666 }
667 }
668 return 0;
669 }
670
672 //not s->linesize as this would be wrong for field pics
673 //not that IntraX8 has interlacing support ;)
676
680
681 s->
dest[0] += s->
mb_y * linesize << 3;
682 s->
dest[1] += ( s->
mb_y&(~1) ) * uvlinesize << 2;
//chroma blocks are on add rows
683 s->
dest[2] += ( s->
mb_y&(~1) ) * uvlinesize << 2;
684 }
685
686 /**
687 * Initialize IntraX8 frame decoder.
688 * Requires valid MpegEncContext with valid s->mb_width before calling.
689 * @param w pointer to IntraX8Context
690 * @param s pointer to MpegEncContext of the parent codec
691 */
693
698
702
706
708 }
709
710 /**
711 * Destroy IntraX8 frame structure.
712 * @param w pointer to IntraX8Context
713 */
715 {
717 }
718
719 /**
720 * Decode single IntraX8 frame.
721 * The parent codec must fill s->loopfilter and s->gb (bitstream).
722 * The parent codec must call ff_mpv_frame_start(), ff_er_frame_start() before calling this function.
723 * The parent codec must call ff_er_frame_end(), ff_mpv_frame_end() after calling this function.
724 * This function does not use ff_mpv_decode_mb().
725 * lowres decoding is theoretically impossible.
726 * @param w pointer to IntraX8Context
727 * @param dquant doubled quantizer, it would be odd in case of VC-1 halfpq==1.
728 * @param quant_offset offset away from zero
729 */
732 int mb_xy;
734
736 w->
quant = dquant >> 1;
737 w->
qsum = quant_offset;
738
743 }else{
746 }
748
751
755
760
763
764 /*when setting up chroma, no vlc is read,
765 so no error condition can be reached*/
768
771
774
775 /*emulate MB info in the relevant tables*/
779 mb_xy++;
780 }
782 }
785 }
786 }
787
788 error:
792 return 0;
793 }