1 /* getblk.c, DCT block decoding */
3 /* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
6 * Disclaimer of Warranty
8 * These software programs are available to the user without any license fee or
9 * royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
10 * any and all warranties, whether express, implied, or statuary, including any
11 * implied warranties or merchantability or of fitness for a particular
12 * purpose. In no event shall the copyright-holder be liable for any
13 * incidental, punitive, or consequential damages of any kind whatsoever
14 * arising from the use of these programs.
16 * This disclaimer of warranty extends to the user of these programs and user's
17 * customers, employees, agents, transferees, successors, and assigns.
19 * The MPEG Software Simulation Group does not represent or warrant that the
20 * programs furnished hereunder are free of infringement of any third-party
23 * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
24 * are subject to royalty fees to patent holders. Many of these patents are
25 * general enough such that they are unavoidable regardless of implementation
36 /* defined in getvlc.h */
41 extern DCTtab DCTtabfirst[],DCTtabnext[],DCTtab0[],DCTtab1[];
42 extern DCTtab DCTtab2[],DCTtab3[],DCTtab4[],DCTtab5[],DCTtab6[];
43 extern DCTtab DCTtab0a[],DCTtab1a[];
46 /* decode one intra coded MPEG-1 block */
48 void Decode_MPEG1_Intra_Block(comp,dc_dct_pred)
59 /* ISO/IEC 11172-2 section 2.4.3.7: Block layer. */
60 /* decode DC coefficients */
62 bp[0] = (dc_dct_pred[0]+=Get_Luma_DC_dct_diff()) << 3;
64 bp[0] = (dc_dct_pred[1]+=Get_Chroma_DC_dct_diff()) << 3;
66 bp[0] = (dc_dct_pred[2]+=Get_Chroma_DC_dct_diff()) << 3;
68 if (Fault_Flag) return;
70 /* D-pictures do not contain AC coefficients */
71 if(picture_coding_type == D_TYPE)
74 /* decode AC coefficients */
79 tab = &DCTtabnext[(code>>12)-4];
81 tab = &DCTtab0[(code>>8)-4];
83 tab = &DCTtab1[(code>>6)-8];
85 tab = &DCTtab2[(code>>4)-16];
87 tab = &DCTtab3[(code>>3)-16];
89 tab = &DCTtab4[(code>>2)-16];
91 tab = &DCTtab5[(code>>1)-16];
93 tab = &DCTtab6[code-16];
97 printf("invalid Huffman code in Decode_MPEG1_Intra_Block()\n");
102 Flush_Buffer(tab->len);
104 if (tab->run==64) /* end_of_block */
107 if (tab->run==65) /* escape */
115 val = Get_Bits(8) - 256;
132 fprintf(stderr,"DCT coeff index (i) out of bounds (intra)\n");
137 j = scan[ZIG_ZAG][i];
138 val = (val*ld->quantizer_scale*ld->intra_quantizer_matrix[j]) >> 3;
140 /* mismatch control ('oddification') */
141 if (val!=0) /* should always be true, but it's not guaranteed */
142 val = (val-1) | 1; /* equivalent to: if ((val&1)==0) val = val - 1; */
146 bp[j] = (val>2047) ? 2047 : val; /* positive */
148 bp[j] = (val>2048) ? -2048 : -val; /* negative */
153 /* decode one non-intra coded MPEG-1 block */
155 void Decode_MPEG1_Non_Intra_Block(comp)
163 bp = ld->block[comp];
165 /* decode AC coefficients */
168 code = Show_Bits(16);
172 tab = &DCTtabfirst[(code>>12)-4];
174 tab = &DCTtabnext[(code>>12)-4];
177 tab = &DCTtab0[(code>>8)-4];
179 tab = &DCTtab1[(code>>6)-8];
181 tab = &DCTtab2[(code>>4)-16];
183 tab = &DCTtab3[(code>>3)-16];
185 tab = &DCTtab4[(code>>2)-16];
187 tab = &DCTtab5[(code>>1)-16];
189 tab = &DCTtab6[code-16];
193 printf("invalid Huffman code in Decode_MPEG1_Non_Intra_Block()\n");
198 Flush_Buffer(tab->len);
200 if (tab->run==64) /* end_of_block */
203 if (tab->run==65) /* escape */
211 val = Get_Bits(8) - 256;
228 fprintf(stderr,"DCT coeff index (i) out of bounds (inter)\n");
233 j = scan[ZIG_ZAG][i];
234 val = (((val<<1)+1)*ld->quantizer_scale*ld->non_intra_quantizer_matrix[j]) >> 4;
236 /* mismatch control ('oddification') */
237 if (val!=0) /* should always be true, but it's not guaranteed */
238 val = (val-1) | 1; /* equivalent to: if ((val&1)==0) val = val - 1; */
242 bp[j] = (val>2047) ? 2047 : val; /* positive */
244 bp[j] = (val>2048) ? -2048 : -val; /* negative */
249 /* decode one intra coded MPEG-2 block */
251 void Decode_MPEG2_Intra_Block(comp,dc_dct_pred)
255 int val, i, j, sign, nc, cc, run;
260 struct layer_data *ld1;
262 /* with data partitioning, data always goes to base layer */
263 ld1 = (ld->scalable_mode==SC_DP) ? &base : ld;
264 bp = ld1->block[comp];
266 if (base.scalable_mode==SC_DP)
268 if (base.priority_breakpoint<64)
274 cc = (comp<4) ? 0 : (comp&1)+1;
276 qmat = (comp<4 || chroma_format==CHROMA420)
277 ? ld1->intra_quantizer_matrix
278 : ld1->chroma_intra_quantizer_matrix;
280 /* ISO/IEC 13818-2 section 7.2.1: decode DC coefficients */
282 val = (dc_dct_pred[0]+= Get_Luma_DC_dct_diff());
284 val = (dc_dct_pred[1]+= Get_Chroma_DC_dct_diff());
286 val = (dc_dct_pred[2]+= Get_Chroma_DC_dct_diff());
288 if (Fault_Flag) return;
290 bp[0] = val << (3-intra_dc_precision);
296 printf("DCT(%d)i:",comp);
299 /* decode AC coefficients */
302 code = Show_Bits(16);
303 if (code>=16384 && !intra_vlc_format)
304 tab = &DCTtabnext[(code>>12)-4];
307 if (intra_vlc_format)
308 tab = &DCTtab0a[(code>>8)-4];
310 tab = &DCTtab0[(code>>8)-4];
314 if (intra_vlc_format)
315 tab = &DCTtab1a[(code>>6)-8];
317 tab = &DCTtab1[(code>>6)-8];
320 tab = &DCTtab2[(code>>4)-16];
322 tab = &DCTtab3[(code>>3)-16];
324 tab = &DCTtab4[(code>>2)-16];
326 tab = &DCTtab5[(code>>1)-16];
328 tab = &DCTtab6[code-16];
332 printf("invalid Huffman code in Decode_MPEG2_Intra_Block()\n");
337 Flush_Buffer(tab->len);
343 Print_Bits(code,16,tab->len);
347 if (tab->run==64) /* end_of_block */
356 if (tab->run==65) /* escape */
362 Print_Bits(Show_Bits(6),6,6);
366 i+= run = Get_Bits(6);
372 Print_Bits(Show_Bits(12),12,12);
380 printf("invalid escape in Decode_MPEG2_Intra_Block()\n");
384 if((sign = (val>=2048)))
402 fprintf(stderr,"DCT coeff index (i) out of bounds (intra2)\n");
409 printf("): %d/%d",run,sign ? -val : val);
414 j = scan[ld1->alternate_scan][i];
415 val = (val * ld1->quantizer_scale * qmat[j]) >> 4;
416 bp[j] = sign ? -val : val;
419 if (base.scalable_mode==SC_DP && nc==base.priority_breakpoint-63)
425 /* decode one non-intra coded MPEG-2 block */
427 void Decode_MPEG2_Non_Intra_Block(comp)
430 int val, i, j, sign, nc, run;
435 struct layer_data *ld1;
437 /* with data partitioning, data always goes to base layer */
438 ld1 = (ld->scalable_mode==SC_DP) ? &base : ld;
439 bp = ld1->block[comp];
441 if (base.scalable_mode==SC_DP)
443 if (base.priority_breakpoint<64)
449 qmat = (comp<4 || chroma_format==CHROMA420)
450 ? ld1->non_intra_quantizer_matrix
451 : ld1->chroma_non_intra_quantizer_matrix;
457 printf("DCT(%d)n:",comp);
460 /* decode AC coefficients */
463 code = Show_Bits(16);
467 tab = &DCTtabfirst[(code>>12)-4];
469 tab = &DCTtabnext[(code>>12)-4];
472 tab = &DCTtab0[(code>>8)-4];
474 tab = &DCTtab1[(code>>6)-8];
476 tab = &DCTtab2[(code>>4)-16];
478 tab = &DCTtab3[(code>>3)-16];
480 tab = &DCTtab4[(code>>2)-16];
482 tab = &DCTtab5[(code>>1)-16];
484 tab = &DCTtab6[code-16];
488 printf("invalid Huffman code in Decode_MPEG2_Non_Intra_Block()\n");
493 Flush_Buffer(tab->len);
499 Print_Bits(code,16,tab->len);
503 if (tab->run==64) /* end_of_block */
512 if (tab->run==65) /* escape */
518 Print_Bits(Show_Bits(6),6,6);
522 i+= run = Get_Bits(6);
528 Print_Bits(Show_Bits(12),12,12);
536 printf("invalid escape in Decode_MPEG2_Intra_Block()\n");
540 if((sign = (val>=2048)))
558 fprintf(stderr,"DCT coeff index (i) out of bounds (inter2)\n");
565 printf("): %d/%d",run,sign?-val:val);
570 j = scan[ld1->alternate_scan][i];
571 val = (((val<<1)+1) * ld1->quantizer_scale * qmat[j]) >> 5;
572 bp[j] = sign ? -val : val;
575 if (base.scalable_mode==SC_DP && nc==base.priority_breakpoint-63)