summaryrefslogtreecommitdiffstats
path: root/src/gallium
diff options
context:
space:
mode:
authorMaarten Lankhorst <[email protected]>2013-06-22 09:33:52 +0200
committerMaarten Lankhorst <[email protected]>2013-06-22 09:40:15 +0200
commit6aabd9490c7b71d363a384935597b3e37295e61e (patch)
tree155a5af193b78c889965d2599e5ccca656aa7d06 /src/gallium
parentefdc6caaf50b7b707b965f8f74939e0f00576bdf (diff)
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 <[email protected]>
Diffstat (limited to 'src/gallium')
-rw-r--r--src/gallium/auxiliary/vl/vl_mpeg12_bitstream.c30
1 files changed, 24 insertions, 6 deletions
diff --git a/src/gallium/auxiliary/vl/vl_mpeg12_bitstream.c b/src/gallium/auxiliary/vl/vl_mpeg12_bitstream.c
index 23580463df9..b0fb1bb04ec 100644
--- a/src/gallium/auxiliary/vl/vl_mpeg12_bitstream.c
+++ b/src/gallium/auxiliary/vl/vl_mpeg12_bitstream.c
@@ -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;