From 3a3d3a42c29424b2ec5a8b3c2b0a2017fbddb9ad Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Wed, 2 Oct 2002 22:56:58 +0000 Subject: [PATCH] fixing custom quantizer matrix decoding minor optimizations Originally committed as revision 993 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavcodec/h263.c | 64 +++++++++++++++++++++++++++++++------------- libavcodec/h263dec.c | 10 ++++++- libavcodec/mpeg12.c | 8 +++--- 3 files changed, 58 insertions(+), 24 deletions(-) diff --git a/libavcodec/h263.c b/libavcodec/h263.c index 6844638b51..906a67084f 100644 --- a/libavcodec/h263.c +++ b/libavcodec/h263.c @@ -1122,6 +1122,7 @@ static void h263_encode_motion(MpegEncContext * s, int val, int f_code) put_bits(&s->pb, bit_size, bits); } } + } /* Encode MV differences on H.263+ with Unrestricted MV mode */ @@ -2688,7 +2689,7 @@ static int mpeg4_decode_partitioned_mb(MpegEncContext *s, /* decode each block */ for (i = 0; i < 6; i++) { - int ret= mpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1, 1); + int ret= mpeg4_decode_block(s, block[i], i, cbp&32, 1); if(ret==DECODING_AC_LOST){ fprintf(stderr, "texture corrupted at %d %d (trying to continue with mc/dc only)\n", s->mb_x, s->mb_y); s->decoding_error=DECODING_AC_LOST; @@ -2698,6 +2699,7 @@ static int mpeg4_decode_partitioned_mb(MpegEncContext *s, s->decoding_error=DECODING_ACDC_LOST; break; } + cbp+=cbp; } }else if(!s->mb_intra){ // s->mcsel= 0; //FIXME do we need to init that @@ -2711,12 +2713,13 @@ static int mpeg4_decode_partitioned_mb(MpegEncContext *s, if(s->decoding_error==0 && cbp){ /* decode each block */ for (i = 0; i < 6; i++) { - int ret= mpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1, 0); + int ret= mpeg4_decode_block(s, block[i], i, cbp&32, 0); if(ret==DECODING_AC_LOST){ fprintf(stderr, "texture corrupted at %d %d (trying to continue with mc/dc only)\n", s->mb_x, s->mb_y); s->decoding_error=DECODING_AC_LOST; break; } + cbp+=cbp; } } } @@ -2727,7 +2730,7 @@ static int mpeg4_decode_partitioned_mb(MpegEncContext *s, /* decode each block */ for (i = 0; i < 6; i++) { - int ret= mpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1, 1); + int ret= mpeg4_decode_block(s, block[i], i, cbp&32, 1); if(ret==DECODING_AC_LOST){ fprintf(stderr, "texture corrupted at %d %d (trying to continue with dc only)\n", s->mb_x, s->mb_y); s->decoding_error=DECODING_AC_LOST; @@ -2736,6 +2739,7 @@ static int mpeg4_decode_partitioned_mb(MpegEncContext *s, fprintf(stderr, "dc corrupted at %d %d\n", s->mb_x, s->mb_y); return -1; } + cbp+=cbp; } } @@ -3162,13 +3166,15 @@ intra: /* decode each block */ if (s->h263_pred) { for (i = 0; i < 6; i++) { - if (mpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1, 1) < 0) + if (mpeg4_decode_block(s, block[i], i, cbp&32, 1) < 0) return -1; + cbp+=cbp; } } else { for (i = 0; i < 6; i++) { - if (h263_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1) < 0) + if (h263_decode_block(s, block[i], i, cbp&32) < 0) return -1; + cbp+=cbp; } } return 0; @@ -3177,13 +3183,15 @@ intra: /* decode each block */ if (s->h263_pred) { for (i = 0; i < 6; i++) { - if (mpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1, 0) < 0) + if (mpeg4_decode_block(s, block[i], i, cbp&32, 0) < 0) return -1; + cbp+=cbp; } } else { for (i = 0; i < 6; i++) { - if (h263_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1) < 0) + if (h263_decode_block(s, block[i], i, cbp&32) < 0) return -1; + cbp+=cbp; } } return 0; @@ -3416,9 +3424,7 @@ static inline int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block, goto not_coded; rl = &rl_intra; rl_vlc = rl_intra.rl_vlc[0]; - if(s->alternate_scan) - scan_table = s->intra_v_scantable.permutated; /* left */ - else if (s->ac_pred) { + if (s->ac_pred) { if (dc_pred_dir == 0) scan_table = s->intra_v_scantable.permutated; /* left */ else @@ -3436,10 +3442,7 @@ static inline int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block, } rl = &rl_inter; - if(s->alternate_scan) - scan_table = s->intra_v_scantable.permutated; /* left */ - else - scan_table = s->intra_scantable.permutated; + scan_table = s->intra_scantable.permutated; if(s->mpeg_quant){ qmul=1; @@ -4093,11 +4096,20 @@ int mpeg4_decode_picture_header(MpegEncContext * s) /* load custom intra matrix */ if(get_bits1(&s->gb)){ + int last=0; for(i=0; i<64; i++){ v= get_bits(&s->gb, 8); if(v==0) break; + + last= v; + j= s->idct_permutation[ ff_zigzag_direct[i] ]; + s->intra_matrix[j]= v; + s->chroma_intra_matrix[j]= v; + } - j= s->intra_scantable.permutated[i]; + /* replicate last value */ + for(; i<64; i++){ + j= s->idct_permutation[ ff_zigzag_direct[i] ]; s->intra_matrix[j]= v; s->chroma_intra_matrix[j]= v; } @@ -4105,20 +4117,22 @@ int mpeg4_decode_picture_header(MpegEncContext * s) /* load custom non intra matrix */ if(get_bits1(&s->gb)){ + int last=0; for(i=0; i<64; i++){ v= get_bits(&s->gb, 8); if(v==0) break; - j= s->intra_scantable.permutated[i]; + last= v; + j= s->idct_permutation[ ff_zigzag_direct[i] ]; s->inter_matrix[j]= v; s->chroma_inter_matrix[j]= v; } /* replicate last value */ for(; i<64; i++){ - j= s->intra_scantable.permutated[i]; - s->inter_matrix[j]= v; - s->chroma_inter_matrix[j]= v; + j= s->idct_permutation[ ff_zigzag_direct[i] ]; + s->inter_matrix[j]= last; + s->chroma_inter_matrix[j]= last; } } @@ -4321,6 +4335,18 @@ int mpeg4_decode_picture_header(MpegEncContext * s) s->alternate_scan= 0; } + if(s->alternate_scan){ + ff_init_scantable(s, &s->inter_scantable , ff_alternate_vertical_scan); + ff_init_scantable(s, &s->intra_scantable , ff_alternate_vertical_scan); + ff_init_scantable(s, &s->intra_h_scantable, ff_alternate_vertical_scan); + ff_init_scantable(s, &s->intra_v_scantable, ff_alternate_vertical_scan); + } else{ + ff_init_scantable(s, &s->inter_scantable , ff_zigzag_direct); + ff_init_scantable(s, &s->intra_scantable , ff_zigzag_direct); + ff_init_scantable(s, &s->intra_h_scantable, ff_alternate_horizontal_scan); + ff_init_scantable(s, &s->intra_v_scantable, ff_alternate_vertical_scan); + } + if(s->pict_type == S_TYPE && (s->vol_sprite_usage==STATIC_SPRITE || s->vol_sprite_usage==GMC_SPRITE)){ if(s->num_sprite_warping_points){ mpeg4_decode_sprite_trajectory(s); diff --git a/libavcodec/h263dec.c b/libavcodec/h263dec.c index fc3dca3d00..16efffeb36 100644 --- a/libavcodec/h263dec.c +++ b/libavcodec/h263dec.c @@ -164,6 +164,11 @@ uint64_t time= rdtsc(); init_get_bits(&s->gb, buf, buf_size); s->bitstream_buffer_size=0; + if (!s->context_initialized) { + if (MPV_common_init(s) < 0) //we need the idct permutaton for reading a custom matrix + return -1; + } + /* let's go :-) */ if (s->h263_msmpeg4) { ret = msmpeg4_decode_picture_header(s); @@ -188,7 +193,10 @@ uint64_t time= rdtsc(); /* and other parameters. So then we could init the picture */ /* FIXME: By the way H263 decoder is evolving it should have */ /* an H263EncContext */ - if (s->width != avctx->width || s->height != avctx->height) { + if ( s->width != avctx->width || s->height != avctx->height + || avctx->aspect_ratio_info != s->aspect_ratio_info + || avctx->aspected_width != s->aspected_width + || avctx->aspected_height != s->aspected_height) { /* H.263 could change picture size any time */ MPV_common_end(s); s->context_initialized=0; diff --git a/libavcodec/mpeg12.c b/libavcodec/mpeg12.c index 18afa7630f..6ae8d7ce08 100644 --- a/libavcodec/mpeg12.c +++ b/libavcodec/mpeg12.c @@ -1435,7 +1435,7 @@ static void mpeg_decode_quant_matrix_extension(MpegEncContext *s) if (get_bits1(&s->gb)) { for(i=0;i<64;i++) { v = get_bits(&s->gb, 8); - j = s->intra_scantable.permutated[i]; + j= s->idct_permutation[ ff_zigzag_direct[i] ]; s->intra_matrix[j] = v; s->chroma_intra_matrix[j] = v; } @@ -1443,7 +1443,7 @@ static void mpeg_decode_quant_matrix_extension(MpegEncContext *s) if (get_bits1(&s->gb)) { for(i=0;i<64;i++) { v = get_bits(&s->gb, 8); - j = s->intra_scantable.permutated[i]; + j= s->idct_permutation[ ff_zigzag_direct[i] ]; s->inter_matrix[j] = v; s->chroma_inter_matrix[j] = v; } @@ -1451,14 +1451,14 @@ static void mpeg_decode_quant_matrix_extension(MpegEncContext *s) if (get_bits1(&s->gb)) { for(i=0;i<64;i++) { v = get_bits(&s->gb, 8); - j = s->intra_scantable.permutated[i]; + j= s->idct_permutation[ ff_zigzag_direct[i] ]; s->chroma_intra_matrix[j] = v; } } if (get_bits1(&s->gb)) { for(i=0;i<64;i++) { v = get_bits(&s->gb, 8); - j = s->intra_scantable.permutated[i]; + j= s->idct_permutation[ ff_zigzag_direct[i] ]; s->chroma_inter_matrix[j] = v; } } -- GitLab