aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2002-08-02 20:27:46 +0000
committerMichael Niedermayer <michaelni@gmx.at>2002-08-02 20:27:46 +0000
commitd930ef19ea14c7fd43c7ad0a4184a9b55c8fdd76 (patch)
tree9800f022cdf5a8b97c6a8b1686a620e450480b29
parentfc2bb4f44dac9c4fa4b8d9dc3509818c9dcfd8ac (diff)
downloadffmpeg-d930ef19ea14c7fd43c7ad0a4184a9b55c8fdd76.tar.gz
fixing mpeg4 mpeg quantizers
Originally committed as revision 836 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r--libavcodec/h263.c29
-rw-r--r--libavcodec/mpegvideo.c19
-rw-r--r--libavcodec/mpegvideo.h1
3 files changed, 31 insertions, 18 deletions
diff --git a/libavcodec/h263.c b/libavcodec/h263.c
index 3b183830b9..666105e9fe 100644
--- a/libavcodec/h263.c
+++ b/libavcodec/h263.c
@@ -1452,9 +1452,11 @@ void mpeg4_pred_ac(MpegEncContext * s, INT16 *block, int n,
/* left copy */
for(i=1;i<8;i++)
ac_val1[i] = block[block_permute_op(i * 8)];
+
/* top copy */
for(i=1;i<8;i++)
ac_val1[8 + i] = block[block_permute_op(i)];
+
}
static void mpeg4_inv_pred_ac(MpegEncContext * s, INT16 *block, int n,
@@ -2641,6 +2643,7 @@ int h263_decode_mb(MpegEncContext *s,
case 0: /* direct */
mx = h263_decode_motion(s, 0, 1);
my = h263_decode_motion(s, 0, 1);
+ PRINT_MB_TYPE("S");
case 4: /* direct with mx=my=0 */
s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
xy= s->block_index[0];
@@ -2659,7 +2662,7 @@ int h263_decode_mb(MpegEncContext *s,
s->mv[0][0][1] =
s->mv[1][0][0] =
s->mv[1][0][1] = 1000;*/
- PRINT_MB_TYPE("D");
+ if(mb_type==4) PRINT_MB_TYPE("D");
break;
case 1:
s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
@@ -2701,13 +2704,14 @@ int h263_decode_mb(MpegEncContext *s,
dquant = cbpc & 4;
s->mb_intra = 1;
intra:
- PRINT_MB_TYPE("I");
s->ac_pred = 0;
if (s->h263_pred || s->h263_aic) {
s->ac_pred = get_bits1(&s->gb);
if (s->ac_pred && s->h263_aic)
s->h263_aic_dir = get_bits1(&s->gb);
}
+ PRINT_MB_TYPE(s->ac_pred ? "A" : "I");
+
cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
if(cbpy<0) return -1;
cbp = (cbpc & 3) | (cbpy << 2);
@@ -2995,10 +2999,16 @@ static inline int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
return 0;
}
rl = &rl_inter;
- rl_vlc = rl_inter.rl_vlc[s->qscale];
scan_table = zigzag_direct;
- qmul = s->qscale << 1;
- qadd = (s->qscale - 1) | 1;
+ if(s->mpeg_quant){
+ qmul=1;
+ qadd=0;
+ rl_vlc = rl_inter.rl_vlc[0];
+ }else{
+ qmul = s->qscale << 1;
+ qadd = (s->qscale - 1) | 1;
+ rl_vlc = rl_inter.rl_vlc[s->qscale];
+ }
}
{
OPEN_READER(re, &s->gb);
@@ -3615,8 +3625,9 @@ int mpeg4_decode_picture_header(MpegEncContext * s)
// FIXME a bunch of grayscale shape things
- if(get_bits1(&s->gb)){ /* vol_quant_type */
+ if((s->mpeg_quant=get_bits1(&s->gb))){ /* vol_quant_type */
int i, j, v;
+
/* load default matrixes */
for(i=0; i<64; i++){
v= ff_mpeg4_default_intra_matrix[i];
@@ -3659,11 +3670,8 @@ int mpeg4_decode_picture_header(MpegEncContext * s)
}
}
- s->dct_unquantize= s->dct_unquantize_mpeg2;
-
// FIXME a bunch of grayscale shape things
- }else
- s->dct_unquantize= s->dct_unquantize_h263;
+ }
if(vo_ver_id != 1)
s->quarter_sample= get_bits1(&s->gb);
@@ -3758,7 +3766,6 @@ int mpeg4_decode_picture_header(MpegEncContext * s)
s->low_delay=0;
}
// printf("pic: %d, qpel:%d\n", s->pict_type, s->quarter_sample);
-//printf("%d", s->pict_type);
time_incr=0;
while (get_bits1(&s->gb) != 0)
time_incr++;
diff --git a/libavcodec/mpegvideo.c b/libavcodec/mpegvideo.c
index c7a9afae59..051c8d9348 100644
--- a/libavcodec/mpegvideo.c
+++ b/libavcodec/mpegvideo.c
@@ -137,12 +137,7 @@ int MPV_common_init(MpegEncContext *s)
#ifdef ARCH_ALPHA
MPV_common_init_axp(s);
#endif
- //setup default unquantizers (mpeg4 might change it later)
- if(s->out_format == FMT_H263)
- s->dct_unquantize = s->dct_unquantize_h263;
- else
- s->dct_unquantize = s->dct_unquantize_mpeg1;
-
+
s->mb_width = (s->width + 15) / 16;
s->mb_height = (s->height + 15) / 16;
@@ -671,6 +666,16 @@ void MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx)
avctx->dr_opaque_frame= s->next_dr_opaque;
}
}
+
+ /* set dequantizer, we cant do it during init as it might change for mpeg4
+ and we cant do it in the header decode as init isnt called for mpeg4 there yet */
+ if(s->out_format == FMT_H263){
+ if(s->mpeg_quant)
+ s->dct_unquantize = s->dct_unquantize_mpeg2;
+ else
+ s->dct_unquantize = s->dct_unquantize_h263;
+ }else
+ s->dct_unquantize = s->dct_unquantize_mpeg1;
}
/* generic function for encode/decode called after a frame has been coded/decoded */
@@ -1513,7 +1518,7 @@ void MPV_decode_mb(MpegEncContext *s, DCTELEM block[6][64])
if(s->hurry_up>1) goto the_end;
/* add dct residue */
- if(s->encoding || !(s->mpeg2 || s->h263_msmpeg4 || s->codec_id==CODEC_ID_MPEG4)){
+ if(s->encoding || !(s->mpeg2 || s->h263_msmpeg4 || (s->codec_id==CODEC_ID_MPEG4 && !s->mpeg_quant))){
add_dequant_dct(s, block[0], 0, dest_y, dct_linesize);
add_dequant_dct(s, block[1], 1, dest_y + 8, dct_linesize);
add_dequant_dct(s, block[2], 2, dest_y + dct_offset, dct_linesize);
diff --git a/libavcodec/mpegvideo.h b/libavcodec/mpegvideo.h
index 820f1100ec..08daa94dd9 100644
--- a/libavcodec/mpegvideo.h
+++ b/libavcodec/mpegvideo.h
@@ -361,6 +361,7 @@ typedef struct MpegEncContext {
#define PB_BUFFER_SIZE 1024*256
uint8_t *tex_pb_buffer;
uint8_t *pb2_buffer;
+ int mpeg_quant;
/* divx specific, used to workaround (many) bugs in divx5 */
int divx_version;