mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
fixed mpeg2 non intra dequant - fixed MPEG1 and 2 matrix parsing
Originally committed as revision 76 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
d753173a55
commit
25ed7f9235
@ -554,6 +554,7 @@ static int mpeg_decode_mb(MpegEncContext *s,
|
|||||||
s->mv_dir = MV_DIR_FORWARD;
|
s->mv_dir = MV_DIR_FORWARD;
|
||||||
s->mv[0][0][0] = s->mv[0][0][1] = 0;
|
s->mv[0][0][0] = s->mv[0][0][1] = 0;
|
||||||
s->last_mv[0][0][0] = s->last_mv[0][0][1] = 0;
|
s->last_mv[0][0][0] = s->last_mv[0][0][1] = 0;
|
||||||
|
s->last_mv[0][1][0] = s->last_mv[0][1][1] = 0;
|
||||||
} else {
|
} else {
|
||||||
/* if B type, reuse previous vectors and directions */
|
/* if B type, reuse previous vectors and directions */
|
||||||
s->mv[0][0][0] = s->last_mv[0][0][0];
|
s->mv[0][0][0] = s->last_mv[0][0][0];
|
||||||
@ -981,7 +982,13 @@ static int mpeg2_decode_block_non_intra(MpegEncContext *s,
|
|||||||
add_coef:
|
add_coef:
|
||||||
j = scan_table[i];
|
j = scan_table[i];
|
||||||
dprintf("%d: run=%d level=%d\n", n, run, level);
|
dprintf("%d: run=%d level=%d\n", n, run, level);
|
||||||
level = ((level * 2 + 1) * s->qscale * matrix[j]) / 32;
|
/* XXX: optimize */
|
||||||
|
if (level > 0) {
|
||||||
|
level = ((level * 2 + 1) * s->qscale * matrix[j]) >> 5;
|
||||||
|
} else {
|
||||||
|
level = ((-level * 2 + 1) * s->qscale * matrix[j]) >> 5;
|
||||||
|
level = -level;
|
||||||
|
}
|
||||||
/* XXX: is it really necessary to saturate since the encoder
|
/* XXX: is it really necessary to saturate since the encoder
|
||||||
knows whats going on ? */
|
knows whats going on ? */
|
||||||
mismatch ^= level;
|
mismatch ^= level;
|
||||||
@ -1183,10 +1190,12 @@ static void mpeg_decode_quant_matrix_extension(MpegEncContext *s)
|
|||||||
{
|
{
|
||||||
int i, v, j;
|
int i, v, j;
|
||||||
|
|
||||||
|
dprintf("matrix extension\n");
|
||||||
|
|
||||||
if (get_bits1(&s->gb)) {
|
if (get_bits1(&s->gb)) {
|
||||||
for(i=0;i<64;i++) {
|
for(i=0;i<64;i++) {
|
||||||
v = get_bits(&s->gb, 8);
|
v = get_bits(&s->gb, 8);
|
||||||
j = block_permute_op(i);
|
j = zigzag_direct[i];
|
||||||
s->intra_matrix[j] = v;
|
s->intra_matrix[j] = v;
|
||||||
s->chroma_intra_matrix[j] = v;
|
s->chroma_intra_matrix[j] = v;
|
||||||
}
|
}
|
||||||
@ -1194,7 +1203,7 @@ static void mpeg_decode_quant_matrix_extension(MpegEncContext *s)
|
|||||||
if (get_bits1(&s->gb)) {
|
if (get_bits1(&s->gb)) {
|
||||||
for(i=0;i<64;i++) {
|
for(i=0;i<64;i++) {
|
||||||
v = get_bits(&s->gb, 8);
|
v = get_bits(&s->gb, 8);
|
||||||
j = block_permute_op(i);
|
j = zigzag_direct[i];
|
||||||
s->non_intra_matrix[j] = v;
|
s->non_intra_matrix[j] = v;
|
||||||
s->chroma_non_intra_matrix[j] = v;
|
s->chroma_non_intra_matrix[j] = v;
|
||||||
}
|
}
|
||||||
@ -1202,14 +1211,14 @@ static void mpeg_decode_quant_matrix_extension(MpegEncContext *s)
|
|||||||
if (get_bits1(&s->gb)) {
|
if (get_bits1(&s->gb)) {
|
||||||
for(i=0;i<64;i++) {
|
for(i=0;i<64;i++) {
|
||||||
v = get_bits(&s->gb, 8);
|
v = get_bits(&s->gb, 8);
|
||||||
j = block_permute_op(i);
|
j = zigzag_direct[i];
|
||||||
s->chroma_intra_matrix[j] = v;
|
s->chroma_intra_matrix[j] = v;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (get_bits1(&s->gb)) {
|
if (get_bits1(&s->gb)) {
|
||||||
for(i=0;i<64;i++) {
|
for(i=0;i<64;i++) {
|
||||||
v = get_bits(&s->gb, 8);
|
v = get_bits(&s->gb, 8);
|
||||||
j = block_permute_op(i);
|
j = zigzag_direct[i];
|
||||||
s->chroma_non_intra_matrix[j] = v;
|
s->chroma_non_intra_matrix[j] = v;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1234,10 +1243,11 @@ static void mpeg_decode_picture_coding_extension(MpegEncContext *s)
|
|||||||
s->chroma_420_type = get_bits1(&s->gb);
|
s->chroma_420_type = get_bits1(&s->gb);
|
||||||
s->progressive_frame = get_bits1(&s->gb);
|
s->progressive_frame = get_bits1(&s->gb);
|
||||||
/* composite display not parsed */
|
/* composite display not parsed */
|
||||||
dprintf("dc_preci=%d\n", s->intra_dc_precision);
|
dprintf("intra_dc_precion=%d\n", s->intra_dc_precision);
|
||||||
dprintf("pict_structure=%d\n", s->picture_structure);
|
dprintf("picture_structure=%d\n", s->picture_structure);
|
||||||
dprintf("conceal=%d\n", s->concealment_motion_vectors);
|
dprintf("conceal=%d\n", s->concealment_motion_vectors);
|
||||||
dprintf("intrafmt=%d\n", s->intra_vlc_format);
|
dprintf("intra_vlc_format=%d\n", s->intra_vlc_format);
|
||||||
|
dprintf("alternate_scan=%d\n", s->alternate_scan);
|
||||||
dprintf("frame_pred_frame_dct=%d\n", s->frame_pred_frame_dct);
|
dprintf("frame_pred_frame_dct=%d\n", s->frame_pred_frame_dct);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1402,10 +1412,16 @@ static int mpeg1_decode_sequence(AVCodecContext *avctx,
|
|||||||
if (get_bits1(&s->gb)) {
|
if (get_bits1(&s->gb)) {
|
||||||
for(i=0;i<64;i++) {
|
for(i=0;i<64;i++) {
|
||||||
v = get_bits(&s->gb, 8);
|
v = get_bits(&s->gb, 8);
|
||||||
j = block_permute_op(i);
|
j = zigzag_direct[i];
|
||||||
s->intra_matrix[j] = v;
|
s->intra_matrix[j] = v;
|
||||||
s->chroma_intra_matrix[j] = v;
|
s->chroma_intra_matrix[j] = v;
|
||||||
}
|
}
|
||||||
|
#ifdef DEBUG
|
||||||
|
dprintf("intra matrix present\n");
|
||||||
|
for(i=0;i<64;i++)
|
||||||
|
dprintf(" %d", s->intra_matrix[zigzag_direct[i]]);
|
||||||
|
printf("\n");
|
||||||
|
#endif
|
||||||
} else {
|
} else {
|
||||||
for(i=0;i<64;i++) {
|
for(i=0;i<64;i++) {
|
||||||
v = default_intra_matrix[i];
|
v = default_intra_matrix[i];
|
||||||
@ -1416,10 +1432,16 @@ static int mpeg1_decode_sequence(AVCodecContext *avctx,
|
|||||||
if (get_bits1(&s->gb)) {
|
if (get_bits1(&s->gb)) {
|
||||||
for(i=0;i<64;i++) {
|
for(i=0;i<64;i++) {
|
||||||
v = get_bits(&s->gb, 8);
|
v = get_bits(&s->gb, 8);
|
||||||
j = block_permute_op(i);
|
j = zigzag_direct[i];
|
||||||
s->non_intra_matrix[j] = v;
|
s->non_intra_matrix[j] = v;
|
||||||
s->chroma_non_intra_matrix[j] = v;
|
s->chroma_non_intra_matrix[j] = v;
|
||||||
}
|
}
|
||||||
|
#ifdef DEBUG
|
||||||
|
dprintf("non intra matrix present\n");
|
||||||
|
for(i=0;i<64;i++)
|
||||||
|
dprintf(" %d", s->non_intra_matrix[zigzag_direct[i]]);
|
||||||
|
printf("\n");
|
||||||
|
#endif
|
||||||
} else {
|
} else {
|
||||||
for(i=0;i<64;i++) {
|
for(i=0;i<64;i++) {
|
||||||
v = default_non_intra_matrix[i];
|
v = default_non_intra_matrix[i];
|
||||||
|
Loading…
Reference in New Issue
Block a user