mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
fixing mpeg4 mpeg quantizers
Originally committed as revision 836 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
fc2bb4f44d
commit
d930ef19ea
@ -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++;
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user