getblk.c
资源名称:mpeg2编解码.zip [点击查看]
上传用户:hkgotone
上传日期:2013-02-17
资源大小:293k
文件大小:12k
源码类别:
Windows Mobile
开发平台:
C/C++
- /* getblk.c, DCT block decoding */
- /* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
- /*
- * Disclaimer of Warranty
- *
- * These software programs are available to the user without any license fee or
- * royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
- * any and all warranties, whether express, implied, or statuary, including any
- * implied warranties or merchantability or of fitness for a particular
- * purpose. In no event shall the copyright-holder be liable for any
- * incidental, punitive, or consequential damages of any kind whatsoever
- * arising from the use of these programs.
- *
- * This disclaimer of warranty extends to the user of these programs and user's
- * customers, employees, agents, transferees, successors, and assigns.
- *
- * The MPEG Software Simulation Group does not represent or warrant that the
- * programs furnished hereunder are free of infringement of any third-party
- * patents.
- *
- * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
- * are subject to royalty fees to patent holders. Many of these patents are
- * general enough such that they are unavoidable regardless of implementation
- * design.
- *
- */
- #include <stdio.h>
- #include "config.h"
- #include "global.h"
- /* defined in getvlc.h */
- typedef struct {
- char run, level, len;
- } DCTtab;
- extern DCTtab DCTtabfirst[],DCTtabnext[],DCTtab0[],DCTtab1[];
- extern DCTtab DCTtab2[],DCTtab3[],DCTtab4[],DCTtab5[],DCTtab6[];
- extern DCTtab DCTtab0a[],DCTtab1a[];
- /* decode one intra coded MPEG-1 block */
- void Decode_MPEG1_Intra_Block(comp,dc_dct_pred)
- int comp;
- int dc_dct_pred[];
- {
- int val, i, j, sign;
- unsigned int code;
- DCTtab *tab;
- short *bp;
- bp = ld->block[comp];
- /* ISO/IEC 11172-2 section 2.4.3.7: Block layer. */
- /* decode DC coefficients */
- if (comp<4)
- bp[0] = (dc_dct_pred[0]+=Get_Luma_DC_dct_diff()) << 3;
- else if (comp==4)
- bp[0] = (dc_dct_pred[1]+=Get_Chroma_DC_dct_diff()) << 3;
- else
- bp[0] = (dc_dct_pred[2]+=Get_Chroma_DC_dct_diff()) << 3;
- if (Fault_Flag) return;
- /* D-pictures do not contain AC coefficients */
- if(picture_coding_type == D_TYPE)
- return;
- /* decode AC coefficients */
- for (i=1; ; i++)
- {
- code = Show_Bits(16);
- if (code>=16384)
- tab = &DCTtabnext[(code>>12)-4];
- else if (code>=1024)
- tab = &DCTtab0[(code>>8)-4];
- else if (code>=512)
- tab = &DCTtab1[(code>>6)-8];
- else if (code>=256)
- tab = &DCTtab2[(code>>4)-16];
- else if (code>=128)
- tab = &DCTtab3[(code>>3)-16];
- else if (code>=64)
- tab = &DCTtab4[(code>>2)-16];
- else if (code>=32)
- tab = &DCTtab5[(code>>1)-16];
- else if (code>=16)
- tab = &DCTtab6[code-16];
- else
- {
- if (!Quiet_Flag)
- printf("invalid Huffman code in Decode_MPEG1_Intra_Block()n");
- Fault_Flag = 1;
- return;
- }
- Flush_Buffer(tab->len);
- if (tab->run==64) /* end_of_block */
- return;
- if (tab->run==65) /* escape */
- {
- i+= Get_Bits(6);
- val = Get_Bits(8);
- if (val==0)
- val = Get_Bits(8);
- else if (val==128)
- val = Get_Bits(8) - 256;
- else if (val>128)
- val -= 256;
- if((sign = (val<0)))
- val = -val;
- }
- else
- {
- i+= tab->run;
- val = tab->level;
- sign = Get_Bits(1);
- }
- if (i>=64)
- {
- if (!Quiet_Flag)
- fprintf(stderr,"DCT coeff index (i) out of bounds (intra)n");
- Fault_Flag = 1;
- return;
- }
- j = scan[ZIG_ZAG][i];
- val = (val*ld->quantizer_scale*ld->intra_quantizer_matrix[j]) >> 3;
- /* mismatch control ('oddification') */
- if (val!=0) /* should always be true, but it's not guaranteed */
- val = (val-1) | 1; /* equivalent to: if ((val&1)==0) val = val - 1; */
- /* saturation */
- if (!sign)
- bp[j] = (val>2047) ? 2047 : val; /* positive */
- else
- bp[j] = (val>2048) ? -2048 : -val; /* negative */
- }
- }
- /* decode one non-intra coded MPEG-1 block */
- void Decode_MPEG1_Non_Intra_Block(comp)
- int comp;
- {
- int val, i, j, sign;
- unsigned int code;
- DCTtab *tab;
- short *bp;
- bp = ld->block[comp];
- /* decode AC coefficients */
- for (i=0; ; i++)
- {
- code = Show_Bits(16);
- if (code>=16384)
- {
- if (i==0)
- tab = &DCTtabfirst[(code>>12)-4];
- else
- tab = &DCTtabnext[(code>>12)-4];
- }
- else if (code>=1024)
- tab = &DCTtab0[(code>>8)-4];
- else if (code>=512)
- tab = &DCTtab1[(code>>6)-8];
- else if (code>=256)
- tab = &DCTtab2[(code>>4)-16];
- else if (code>=128)
- tab = &DCTtab3[(code>>3)-16];
- else if (code>=64)
- tab = &DCTtab4[(code>>2)-16];
- else if (code>=32)
- tab = &DCTtab5[(code>>1)-16];
- else if (code>=16)
- tab = &DCTtab6[code-16];
- else
- {
- if (!Quiet_Flag)
- printf("invalid Huffman code in Decode_MPEG1_Non_Intra_Block()n");
- Fault_Flag = 1;
- return;
- }
- Flush_Buffer(tab->len);
- if (tab->run==64) /* end_of_block */
- return;
- if (tab->run==65) /* escape */
- {
- i+= Get_Bits(6);
- val = Get_Bits(8);
- if (val==0)
- val = Get_Bits(8);
- else if (val==128)
- val = Get_Bits(8) - 256;
- else if (val>128)
- val -= 256;
- if((sign = (val<0)))
- val = -val;
- }
- else
- {
- i+= tab->run;
- val = tab->level;
- sign = Get_Bits(1);
- }
- if (i>=64)
- {
- if (!Quiet_Flag)
- fprintf(stderr,"DCT coeff index (i) out of bounds (inter)n");
- Fault_Flag = 1;
- return;
- }
- j = scan[ZIG_ZAG][i];
- val = (((val<<1)+1)*ld->quantizer_scale*ld->non_intra_quantizer_matrix[j]) >> 4;
- /* mismatch control ('oddification') */
- if (val!=0) /* should always be true, but it's not guaranteed */
- val = (val-1) | 1; /* equivalent to: if ((val&1)==0) val = val - 1; */
- /* saturation */
- if (!sign)
- bp[j] = (val>2047) ? 2047 : val; /* positive */
- else
- bp[j] = (val>2048) ? -2048 : -val; /* negative */
- }
- }
- /* decode one intra coded MPEG-2 block */
- void Decode_MPEG2_Intra_Block(comp,dc_dct_pred)
- int comp;
- int dc_dct_pred[];
- {
- int val, i, j, sign, nc, cc, run;
- unsigned int code;
- DCTtab *tab;
- short *bp;
- int *qmat;
- struct layer_data *ld1;
- /* with data partitioning, data always goes to base layer */
- ld1 = (ld->scalable_mode==SC_DP) ? &base : ld;
- bp = ld1->block[comp];
- if (base.scalable_mode==SC_DP)
- if (base.priority_breakpoint<64)
- ld = &enhan;
- else
- ld = &base;
- cc = (comp<4) ? 0 : (comp&1)+1;
- qmat = (comp<4 || chroma_format==CHROMA420)
- ? ld1->intra_quantizer_matrix
- : ld1->chroma_intra_quantizer_matrix;
- /* ISO/IEC 13818-2 section 7.2.1: decode DC coefficients */
- if (cc==0)
- val = (dc_dct_pred[0]+= Get_Luma_DC_dct_diff());
- else if (cc==1)
- val = (dc_dct_pred[1]+= Get_Chroma_DC_dct_diff());
- else
- val = (dc_dct_pred[2]+= Get_Chroma_DC_dct_diff());
- if (Fault_Flag) return;
- bp[0] = val << (3-intra_dc_precision);
- nc=0;
- #ifdef TRACE
- if (Trace_Flag)
- printf("DCT(%d)i:",comp);
- #endif /* TRACE */
- /* decode AC coefficients */
- for (i=1; ; i++)
- {
- code = Show_Bits(16);
- if (code>=16384 && !intra_vlc_format)
- tab = &DCTtabnext[(code>>12)-4];
- else if (code>=1024)
- {
- if (intra_vlc_format)
- tab = &DCTtab0a[(code>>8)-4];
- else
- tab = &DCTtab0[(code>>8)-4];
- }
- else if (code>=512)
- {
- if (intra_vlc_format)
- tab = &DCTtab1a[(code>>6)-8];
- else
- tab = &DCTtab1[(code>>6)-8];
- }
- else if (code>=256)
- tab = &DCTtab2[(code>>4)-16];
- else if (code>=128)
- tab = &DCTtab3[(code>>3)-16];
- else if (code>=64)
- tab = &DCTtab4[(code>>2)-16];
- else if (code>=32)
- tab = &DCTtab5[(code>>1)-16];
- else if (code>=16)
- tab = &DCTtab6[code-16];
- else
- {
- if (!Quiet_Flag)
- printf("invalid Huffman code in Decode_MPEG2_Intra_Block()n");
- Fault_Flag = 1;
- return;
- }
- Flush_Buffer(tab->len);
- #ifdef TRACE
- if (Trace_Flag)
- {
- printf(" (");
- Print_Bits(code,16,tab->len);
- }
- #endif /* TRACE */
- if (tab->run==64) /* end_of_block */
- {
- #ifdef TRACE
- if (Trace_Flag)
- printf("): EOBn");
- #endif /* TRACE */
- return;
- }
- if (tab->run==65) /* escape */
- {
- #ifdef TRACE
- if (Trace_Flag)
- {
- putchar(' ');
- Print_Bits(Show_Bits(6),6,6);
- }
- #endif /* TRACE */
- i+= run = Get_Bits(6);
- #ifdef TRACE
- if (Trace_Flag)
- {
- putchar(' ');
- Print_Bits(Show_Bits(12),12,12);
- }
- #endif /* TRACE */
- val = Get_Bits(12);
- if ((val&2047)==0)
- {
- if (!Quiet_Flag)
- printf("invalid escape in Decode_MPEG2_Intra_Block()n");
- Fault_Flag = 1;
- return;
- }
- if((sign = (val>=2048)))
- val = 4096 - val;
- }
- else
- {
- i+= run = tab->run;
- val = tab->level;
- sign = Get_Bits(1);
- #ifdef TRACE
- if (Trace_Flag)
- printf("%d",sign);
- #endif /* TRACE */
- }
- if (i>=64)
- {
- if (!Quiet_Flag)
- fprintf(stderr,"DCT coeff index (i) out of bounds (intra2)n");
- Fault_Flag = 1;
- return;
- }
- #ifdef TRACE
- if (Trace_Flag)
- printf("): %d/%d",run,sign ? -val : val);
- #endif /* TRACE */
- j = scan[ld1->alternate_scan][i];
- val = (val * ld1->quantizer_scale * qmat[j]) >> 4;
- bp[j] = sign ? -val : val;
- nc++;
- if (base.scalable_mode==SC_DP && nc==base.priority_breakpoint-63)
- ld = &enhan;
- }
- }
- /* decode one non-intra coded MPEG-2 block */
- void Decode_MPEG2_Non_Intra_Block(comp)
- int comp;
- {
- int val, i, j, sign, nc, run;
- unsigned int code;
- DCTtab *tab;
- short *bp;
- int *qmat;
- struct layer_data *ld1;
- /* with data partitioning, data always goes to base layer */
- ld1 = (ld->scalable_mode==SC_DP) ? &base : ld;
- bp = ld1->block[comp];
- if (base.scalable_mode==SC_DP)
- if (base.priority_breakpoint<64)
- ld = &enhan;
- else
- ld = &base;
- qmat = (comp<4 || chroma_format==CHROMA420)
- ? ld1->non_intra_quantizer_matrix
- : ld1->chroma_non_intra_quantizer_matrix;
- nc = 0;
- #ifdef TRACE
- if (Trace_Flag)
- printf("DCT(%d)n:",comp);
- #endif /* TRACE */
- /* decode AC coefficients */
- for (i=0; ; i++)
- {
- code = Show_Bits(16);
- if (code>=16384)
- {
- if (i==0)
- tab = &DCTtabfirst[(code>>12)-4];
- else
- tab = &DCTtabnext[(code>>12)-4];
- }
- else if (code>=1024)
- tab = &DCTtab0[(code>>8)-4];
- else if (code>=512)
- tab = &DCTtab1[(code>>6)-8];
- else if (code>=256)
- tab = &DCTtab2[(code>>4)-16];
- else if (code>=128)
- tab = &DCTtab3[(code>>3)-16];
- else if (code>=64)
- tab = &DCTtab4[(code>>2)-16];
- else if (code>=32)
- tab = &DCTtab5[(code>>1)-16];
- else if (code>=16)
- tab = &DCTtab6[code-16];
- else
- {
- if (!Quiet_Flag)
- printf("invalid Huffman code in Decode_MPEG2_Non_Intra_Block()n");
- Fault_Flag = 1;
- return;
- }
- Flush_Buffer(tab->len);
- #ifdef TRACE
- if (Trace_Flag)
- {
- printf(" (");
- Print_Bits(code,16,tab->len);
- }
- #endif /* TRACE */
- if (tab->run==64) /* end_of_block */
- {
- #ifdef TRACE
- if (Trace_Flag)
- printf("): EOBn");
- #endif /* TRACE */
- return;
- }
- if (tab->run==65) /* escape */
- {
- #ifdef TRACE
- if (Trace_Flag)
- {
- putchar(' ');
- Print_Bits(Show_Bits(6),6,6);
- }
- #endif /* TRACE */
- i+= run = Get_Bits(6);
- #ifdef TRACE
- if (Trace_Flag)
- {
- putchar(' ');
- Print_Bits(Show_Bits(12),12,12);
- }
- #endif /* TRACE */
- val = Get_Bits(12);
- if ((val&2047)==0)
- {
- if (!Quiet_Flag)
- printf("invalid escape in Decode_MPEG2_Intra_Block()n");
- Fault_Flag = 1;
- return;
- }
- if((sign = (val>=2048)))
- val = 4096 - val;
- }
- else
- {
- i+= run = tab->run;
- val = tab->level;
- sign = Get_Bits(1);
- #ifdef TRACE
- if (Trace_Flag)
- printf("%d",sign);
- #endif /* TRACE */
- }
- if (i>=64)
- {
- if (!Quiet_Flag)
- fprintf(stderr,"DCT coeff index (i) out of bounds (inter2)n");
- Fault_Flag = 1;
- return;
- }
- #ifdef TRACE
- if (Trace_Flag)
- printf("): %d/%d",run,sign?-val:val);
- #endif /* TRACE */
- j = scan[ld1->alternate_scan][i];
- val = (((val<<1)+1) * ld1->quantizer_scale * qmat[j]) >> 5;
- bp[j] = sign ? -val : val;
- nc++;
- if (base.scalable_mode==SC_DP && nc==base.priority_breakpoint-63)
- ld = &enhan;
- }
- }