diff options
Diffstat (limited to 'src/libffmpeg/libavcodec/h263.c')
-rw-r--r-- | src/libffmpeg/libavcodec/h263.c | 133 |
1 files changed, 70 insertions, 63 deletions
diff --git a/src/libffmpeg/libavcodec/h263.c b/src/libffmpeg/libavcodec/h263.c index bc21e0cd8..63bf19059 100644 --- a/src/libffmpeg/libavcodec/h263.c +++ b/src/libffmpeg/libavcodec/h263.c @@ -22,6 +22,12 @@ * qpel decoding, gmc decoding, interlaced decoding, * by Michael Niedermayer <michaelni@gmx.at> */ + +/** + * @file h263.c + * @brief h263/mpeg4 codec + * + */ //#define DEBUG #include "common.h" @@ -67,15 +73,17 @@ static inline int mpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr); static inline int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block, int n, int coded, int intra); static int h263_pred_dc(MpegEncContext * s, int n, UINT16 **dc_val_ptr); -static void mpeg4_inv_pred_ac(MpegEncContext * s, INT16 *block, int n, +static void mpeg4_inv_pred_ac(MpegEncContext * s, DCTELEM *block, int n, int dir); static void mpeg4_decode_sprite_trajectory(MpegEncContext * s); static inline int ff_mpeg4_pred_dc(MpegEncContext * s, int n, UINT16 **dc_val_ptr, int *dir_ptr); extern UINT32 inverse[256]; -static UINT16 uni_DCtab_lum [512][2]; -static UINT16 uni_DCtab_chrom[512][2]; +static UINT8 uni_DCtab_lum_len[512]; +static UINT8 uni_DCtab_chrom_len[512]; +static UINT16 uni_DCtab_lum_bits[512]; +static UINT16 uni_DCtab_chrom_bits[512]; #ifdef CONFIG_ENCODERS static UINT16 (*mv_penalty)[MAX_MV*2+1]= NULL; @@ -999,7 +1007,7 @@ static int h263_pred_dc(MpegEncContext * s, int n, UINT16 **dc_val_ptr) } -void h263_pred_acdc(MpegEncContext * s, INT16 *block, int n) +void h263_pred_acdc(MpegEncContext * s, DCTELEM *block, int n) { int x, y, wrap, a, c, pred_dc, scale, i; INT16 *dc_val, *ac_val, *ac_val1; @@ -1309,8 +1317,8 @@ static void init_uni_dc_tab(void) uni_len++; } } - uni_DCtab_lum[level+256][0]= uni_code; - uni_DCtab_lum[level+256][1]= uni_len; + uni_DCtab_lum_bits[level+256]= uni_code; + uni_DCtab_lum_len [level+256]= uni_len; /* chrominance */ uni_code= DCtab_chrom[size][0]; @@ -1324,8 +1332,8 @@ static void init_uni_dc_tab(void) uni_len++; } } - uni_DCtab_chrom[level+256][0]= uni_code; - uni_DCtab_chrom[level+256][1]= uni_len; + uni_DCtab_chrom_bits[level+256]= uni_code; + uni_DCtab_chrom_len [level+256]= uni_len; } } @@ -1446,6 +1454,8 @@ void h263_encode_init(MpegEncContext *s) s->intra_ac_vlc_last_length= uni_mpeg4_intra_rl_len + 128*64; s->inter_ac_vlc_length = uni_mpeg4_inter_rl_len; s->inter_ac_vlc_last_length= uni_mpeg4_inter_rl_len + 128*64; + s->luma_dc_vlc_length= uni_DCtab_lum_len; + s->chroma_dc_vlc_length= uni_DCtab_chrom_len; s->ac_esc_length= 7+2+1+6+1+12+1; break; case CODEC_ID_H263P: @@ -1470,6 +1480,11 @@ void h263_encode_init(MpegEncContext *s) } } +/** + * encodes a 8x8 block. + * @param block the 8x8 block + * @param n block index (0-3 are luma, 4-5 are chroma) + */ static void h263_encode_block(MpegEncContext * s, DCTELEM * block, int n) { int level, run, last, i, j, last_index, last_non_zero, sign, slevel, code; @@ -1795,6 +1810,13 @@ static void change_qscale(MpegEncContext * s, int dquant) s->c_dc_scale= s->c_dc_scale_table[ s->qscale ]; } +/** + * predicts the dc. + * @param n block index (0-3 are luma, 4-5 are chroma) + * @param dc_val_ptr a pointer to the dc_val entry for the current MB will be stored here + * @param dir_ptr pointer to an integer where the prediction direction will be stored + * @return the quantized predicted dc + */ static inline int ff_mpeg4_pred_dc(MpegEncContext * s, int n, UINT16 **dc_val_ptr, int *dir_ptr) { int a, b, c, wrap, pred, scale; @@ -1852,7 +1874,12 @@ static inline int ff_mpeg4_pred_dc(MpegEncContext * s, int n, UINT16 **dc_val_pt return pred; } -void mpeg4_pred_ac(MpegEncContext * s, INT16 *block, int n, +/** + * predicts the ac. + * @param n block index (0-3 are luma, 4-5 are chroma) + * @param dir the ac prediction direction + */ +void mpeg4_pred_ac(MpegEncContext * s, DCTELEM *block, int n, int dir) { int i; @@ -1907,7 +1934,7 @@ void mpeg4_pred_ac(MpegEncContext * s, INT16 *block, int n, } -static void mpeg4_inv_pred_ac(MpegEncContext * s, INT16 *block, int n, +static void mpeg4_inv_pred_ac(MpegEncContext * s, DCTELEM *block, int n, int dir) { int i; @@ -1950,6 +1977,10 @@ static void mpeg4_inv_pred_ac(MpegEncContext * s, INT16 *block, int n, } } +/** + * encodes the dc value. + * @param n block index (0-3 are luma, 4-5 are chroma) + */ static inline void mpeg4_encode_dc(PutBitContext * s, int level, int n) { #if 1 @@ -1957,10 +1988,10 @@ static inline void mpeg4_encode_dc(PutBitContext * s, int level, int n) level+=256; if (n < 4) { /* luminance */ - put_bits(s, uni_DCtab_lum[level][1], uni_DCtab_lum[level][0]); + put_bits(s, uni_DCtab_lum_len[level], uni_DCtab_lum_bits[level]); } else { /* chrominance */ - put_bits(s, uni_DCtab_chrom[level][1], uni_DCtab_chrom[level][0]); + put_bits(s, uni_DCtab_chrom_len[level], uni_DCtab_chrom_bits[level]); } #else int size, v; @@ -1991,6 +2022,10 @@ static inline void mpeg4_encode_dc(PutBitContext * s, int level, int n) #endif } #ifdef CONFIG_ENCODERS +/** + * encodes a 8x8 block + * @param n block index (0-3 are luma, 4-5 are chroma) + */ static inline void mpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n, int intra_dc, UINT8 *scan_table, PutBitContext *dc_pb, PutBitContext *ac_pb) { @@ -2175,44 +2210,6 @@ static VLC dc_lum, dc_chrom; static VLC sprite_trajectory; static VLC mb_type_b_vlc; -void init_rl(RLTable *rl) -{ - INT8 max_level[MAX_RUN+1], max_run[MAX_LEVEL+1]; - UINT8 index_run[MAX_RUN+1]; - int last, run, level, start, end, i; - - /* compute max_level[], max_run[] and index_run[] */ - for(last=0;last<2;last++) { - if (last == 0) { - start = 0; - end = rl->last; - } else { - start = rl->last; - end = rl->n; - } - - memset(max_level, 0, MAX_RUN + 1); - memset(max_run, 0, MAX_LEVEL + 1); - memset(index_run, rl->n, MAX_RUN + 1); - for(i=start;i<end;i++) { - run = rl->table_run[i]; - level = rl->table_level[i]; - if (index_run[run] == rl->n) - index_run[run] = i; - if (level > max_level[run]) - max_level[run] = level; - if (run > max_run[level]) - max_run[level] = run; - } - rl->max_level[last] = av_malloc(MAX_RUN + 1); - memcpy(rl->max_level[last], max_level, MAX_RUN + 1); - rl->max_run[last] = av_malloc(MAX_LEVEL + 1); - memcpy(rl->max_run[last], max_run, MAX_LEVEL + 1); - rl->index_run[last] = av_malloc(MAX_RUN + 1); - memcpy(rl->index_run[last], index_run, MAX_RUN + 1); - } -} - void init_vlc_rl(RLTable *rl) { int i, q; @@ -2331,7 +2328,7 @@ static int h263_decode_gob_header(MpegEncContext *s) /* We have a GBSC probably with GSTUFF */ skip_bits(&s->gb, 16); /* Drop the zeros */ - left= s->gb.size*8 - get_bits_count(&s->gb); + left= s->gb.size_in_bits - get_bits_count(&s->gb); //MN: we must check the bits left or we might end in a infinite loop (or segfault) for(;left>13; left--){ if(get_bits1(&s->gb)) break; /* Seek the '1' bit */ @@ -2431,7 +2428,7 @@ static inline int mpeg4_is_resync(MpegEncContext *s){ return 0; } - if(bits_count + 8 >= s->gb.size*8){ + if(bits_count + 8 >= s->gb.size_in_bits){ int v= show_bits(&s->gb, 8); v|= 0x7F >> (7-(bits_count&7)); @@ -2468,7 +2465,7 @@ static int mpeg4_decode_video_packet_header(MpegEncContext *s) int header_extension=0, mb_num, len; /* is there enough space left for a video packet + header */ - if( get_bits_count(&s->gb) > s->gb.size*8-20) return -1; + if( get_bits_count(&s->gb) > s->gb.size_in_bits-20) return -1; for(len=0; len<32; len++){ if(get_bits1(&s->gb)) break; @@ -2600,7 +2597,7 @@ int ff_h263_resync(MpegEncContext *s){ //ok, its not where its supposed to be ... s->gb= s->last_resync_gb; align_get_bits(&s->gb); - left= s->gb.size*8 - get_bits_count(&s->gb); + left= s->gb.size_in_bits - get_bits_count(&s->gb); for(;left>16+1+5+5; left-=8){ if(show_bits(&s->gb, 16)==0){ @@ -2622,6 +2619,7 @@ int ff_h263_resync(MpegEncContext *s){ } /** + * gets the average motion vector for a GMC MB. * @param n either 0 for the x component or 1 for y * @returns the average MV for a GMC MB */ @@ -2654,8 +2652,7 @@ static inline int get_amv(MpegEncContext *s, int n){ v+= dx; } } - sum /= 256; - sum= RSHIFT(sum<<s->quarter_sample, a); + sum= RSHIFT(sum, a+8-s->quarter_sample); } if (sum < -len) sum= -len; @@ -3055,7 +3052,7 @@ static int mpeg4_decode_partitioned_mb(MpegEncContext *s, DCTELEM block[6][64]) /* per-MB end of slice check */ if(--s->mb_num_left <= 0){ -//printf("%06X %d\n", show_bits(&s->gb, 24), s->gb.size*8 - get_bits_count(&s->gb)); +//printf("%06X %d\n", show_bits(&s->gb, 24), s->gb.size_in_bits - get_bits_count(&s->gb)); if(mpeg4_is_resync(s)) return SLICE_END; else @@ -3419,8 +3416,8 @@ end: }else{ int v= show_bits(&s->gb, 16); - if(get_bits_count(&s->gb) + 16 > s->gb.size*8){ - v>>= get_bits_count(&s->gb) + 16 - s->gb.size*8; + if(get_bits_count(&s->gb) + 16 > s->gb.size_in_bits){ + v>>= get_bits_count(&s->gb) + 16 - s->gb.size_in_bits; } if(v==0) @@ -3588,6 +3585,12 @@ not_coded: return 0; } +/** + * decodes the dc value. + * @param n block index (0-3 are luma, 4-5 are chroma) + * @param dir_ptr the prediction direction will be stored here + * @return the quantized dc + */ static inline int mpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr) { int level, pred, code; @@ -4473,6 +4476,10 @@ static int decode_vol_header(MpegEncContext *s, GetBitContext *gb){ return 0; } +/** + * decodes the user data stuff in the header. + * allso inits divx/xvid/lavc_version/build + */ static int decode_user_data(MpegEncContext *s, GetBitContext *gb){ char buf[256]; int i; @@ -4685,7 +4692,7 @@ static int decode_vop_header(MpegEncContext *s, GetBitContext *gb){ printf("qp:%d fc:%d,%d %s size:%d pro:%d alt:%d top:%d %spel part:%d resync:%d w:%d a:%d\n", s->qscale, s->f_code, s->b_code, s->pict_type == I_TYPE ? "I" : (s->pict_type == P_TYPE ? "P" : (s->pict_type == B_TYPE ? "B" : "S")), - gb->size,s->progressive_sequence, s->alternate_scan, s->top_field_first, + gb->size_in_bits,s->progressive_sequence, s->alternate_scan, s->top_field_first, s->quarter_sample ? "q" : "h", s->data_partitioning, s->resync_marker, s->num_sprite_warping_points, s->sprite_warping_accuracy); } @@ -4740,9 +4747,9 @@ int ff_mpeg4_decode_picture_header(MpegEncContext * s, GetBitContext *gb) v = get_bits(gb, 8); startcode = ((startcode << 8) | v) & 0xffffffff; - if(get_bits_count(gb) >= gb->size*8){ - if(gb->size==1 && s->divx_version){ - printf("frame skip %d\n", gb->size); + if(get_bits_count(gb) >= gb->size_in_bits){ + if(gb->size_in_bits==8 && s->divx_version){ + printf("frame skip %d\n", gb->size_in_bits); return FRAME_SKIPED; //divx bug }else return -1; //end of stream |