diff options
author | Maarten Lankhorst <[email protected]> | 2013-06-22 09:33:52 +0200 |
---|---|---|
committer | Maarten Lankhorst <[email protected]> | 2013-06-22 09:40:15 +0200 |
commit | 6aabd9490c7b71d363a384935597b3e37295e61e (patch) | |
tree | 155a5af193b78c889965d2599e5ccca656aa7d06 /src/gallium | |
parent | efdc6caaf50b7b707b965f8f74939e0f00576bdf (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.c | 30 |
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; |