vl/mpeg12: fix mpeg-1 bytestream parsing

This fixes the bytestream parsing of mpeg-1 stream, but still leaves
open a number of issues with the interpretation:
- IDCT mismatch control is not correct for MPEG-1.
- Slices do not have to start and end on the same horizontal row of macroblocks.
- picture_coding_type = 4 (D-pictures) is not handled.
- full_pel_*_vector is not handled.

Signed-off-by: Maarten Lankhorst <maarten.lankhorst@canonical.com>
This commit is contained in:
Maarten Lankhorst
2013-06-22 09:33:52 +02:00
parent efdc6caaf5
commit 6aabd9490c
+24 -6
View File
@@ -766,6 +766,19 @@ entry:
continue;
}
} else if (entry->run == dct_Escape &&
bs->decoder->profile == PIPE_VIDEO_PROFILE_MPEG1) {
i += vl_vlc_get_uimsbf(&bs->vlc, 6) + 1;
if (i > 64)
break;
dst[i] = vl_vlc_get_simsbf(&bs->vlc, 8);
if (dst[i] == -128)
dst[i] = vl_vlc_get_uimsbf(&bs->vlc, 8) - 256;
else if (dst[i] == 0)
dst[i] = vl_vlc_get_uimsbf(&bs->vlc, 8);
dst[i] *= scale;
} else if (entry->run == dct_Escape) {
i += vl_vlc_get_uimsbf(&bs->vlc, 6) + 1;
if (i > 64)
@@ -812,18 +825,23 @@ decode_slice(struct vl_mpg12_bs *bs, struct pipe_video_buffer *target)
do {
int inc = 0;
if (bs->decoder->profile == PIPE_VIDEO_PROFILE_MPEG1)
while (1) {
/* MPEG-1 macroblock stuffing, can appear an arbitrary number of times. */
while (vl_vlc_peekbits(&bs->vlc, 11) == 15) {
vl_vlc_eatbits(&bs->vlc, 11);
vl_vlc_fillbits(&bs->vlc);
}
while (vl_vlc_peekbits(&bs->vlc, 11) == 8) {
vl_vlc_eatbits(&bs->vlc, 11);
vl_vlc_fillbits(&bs->vlc);
inc += 33;
if (vl_vlc_peekbits(&bs->vlc, 11) == 8) {
vl_vlc_eatbits(&bs->vlc, 11);
vl_vlc_fillbits(&bs->vlc);
inc += 33;
} else {
inc += vl_vlc_get_vlclbf(&bs->vlc, tbl_B1, 11);
break;
}
}
inc += vl_vlc_get_vlclbf(&bs->vlc, tbl_B1, 11);
if (x != -1) {
if (!inc)
return;