mirror of
https://git.videolan.org/git/ffmpeg.git
synced 2024-08-18 15:25:05 +02:00
fixing custom quantizer matrix decoding
minor optimizations Originally committed as revision 993 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
3994623df2
commit
3a3d3a42c2
@ -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,9 +3442,6 @@ 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;
|
||||
|
||||
if(s->mpeg_quant){
|
||||
@ -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;
|
||||
|
||||
j= s->intra_scantable.permutated[i];
|
||||
last= v;
|
||||
j= s->idct_permutation[ ff_zigzag_direct[i] ];
|
||||
s->intra_matrix[j]= v;
|
||||
s->chroma_intra_matrix[j]= v;
|
||||
}
|
||||
|
||||
/* 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);
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user