[FFmpeg-trac] #4043(undetermined:new): mss2: fix decoding of mss2
FFmpeg
trac at avcodec.org
Sun Oct 19 13:50:56 CEST 2014
#4043: mss2: fix decoding of mss2
-------------------------------------+-------------------------------------
Reporter: ami_stuff | Owner:
Type: defect | Status: new
Priority: normal | Component:
Version: | undetermined
unspecified | Keywords:
Blocked By: | Blocking:
Reproduced by developer: 0 | Analyzed by developer: 0
-------------------------------------+-------------------------------------
"fail.wmv" file decodes fine with wmp, but not with ffmpeg.
"patch.wmv" file decodes fine sine
b077eb07805dc5d139b2f118ddb122cc9df8b87a and I belive that
this code must be changed to fix decoding of "fail.wmv"
{{{
commit b077eb07805dc5d139b2f118ddb122cc9df8b87a
Author: Alberto Delmás <adelmas at gmail.com>
Date: Sun Nov 11 09:23:06 2012 +0100
mss2: fix handling of unmasked implicit WMV9 rectangles
Signed-off-by: Kostya Shishkov <kostya.shishkov at gmail.com>
diff --git a/libavcodec/mss2.c b/libavcodec/mss2.c
index 597ebb6..ceeff5a 100644
--- a/libavcodec/mss2.c
+++ b/libavcodec/mss2.c
@@ -474,7 +474,7 @@ static int mss2_decode_frame(AVCodecContext *avctx,
void *data, int *data_size,
int keyframe, has_wmv9, has_mv, is_rle, is_555, ret;
Rectangle wmv9rects[MAX_WMV9_RECTANGLES], *r;
- int used_rects = 0, i, implicit_rect, av_uninit(wmv9_mask);
+ int used_rects = 0, i, implicit_rect = 0, av_uninit(wmv9_mask);
av_assert0(FF_INPUT_BUFFER_PADDING_SIZE >=
ARITH2_PADDING + (MIN_CACHE_BITS + 7) / 8);
@@ -650,7 +650,14 @@ static int mss2_decode_frame(AVCodecContext *avctx,
void *data, int *data_size,
return AVERROR_INVALIDDATA;
buf_size -= bytestream2_tell(&gB);
- } else if (is_rle) {
+ } else {
+ if (keyframe) {
+ c->corrupted = 0;
+ ff_mss12_slicecontext_reset(&ctx->sc[0]);
+ if (c->slice_split)
+ ff_mss12_slicecontext_reset(&ctx->sc[1]);
+ }
+ if (is_rle) {
init_get_bits(&gb, buf, buf_size * 8);
if (ret = decode_rle(&gb, c->pal_pic, c->pal_stride,
c->rgb_pic, c->rgb_stride, c->pal, keyframe,
@@ -669,14 +676,8 @@ static int mss2_decode_frame(AVCodecContext *avctx,
void *data, int *data_size,
align_get_bits(&gb);
buf += get_bits_count(&gb) >> 3;
buf_size -= get_bits_count(&gb) >> 3;
- } else {
- if (keyframe) {
- c->corrupted = 0;
- ff_mss12_slicecontext_reset(&ctx->sc[0]);
- if (c->slice_split)
- ff_mss12_slicecontext_reset(&ctx->sc[1]);
- }
- else if (c->corrupted)
+ } else if (!implicit_rect || wmv9_mask != -1) {
+ if (c->corrupted)
return AVERROR_INVALIDDATA;
bytestream2_init(&gB, buf, buf_size + ARITH2_PADDING);
arith2_init(&acoder, &gB);
@@ -702,6 +703,8 @@ static int mss2_decode_frame(AVCodecContext *avctx,
void *data, int *data_size,
buf += arith2_get_consumed_bytes(&acoder);
buf_size -= arith2_get_consumed_bytes(&acoder);
}
+ } else
+ memset(c->pal_pic, 0, c->pal_stride * avctx->height);
}
if (has_wmv9) {
}}}
{{{
C:\>ffmpeg -i fail.wmv -f null -
ffmpeg version N-66438-g4f4f08e Copyright (c) 2000-2014 the FFmpeg
developers
built on Sep 24 2014 22:26:49 with gcc 4.9.1 (GCC)
configuration: --enable-gpl --enable-version3 --disable-w32threads
--enable-av
isynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls
--enab
le-iconv --enable-libass --enable-libbluray --enable-libbs2b --enable-
libcaca --
enable-libfreetype --enable-libgme --enable-libgsm --enable-libilbc
--enable-lib
modplug --enable-libmp3lame --enable-libopencore-amrnb --enable-
libopencore-amrw
b --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-
libschroedinge
r --enable-libsoxr --enable-libspeex --enable-libtheora --enable-
libtwolame --en
able-libvidstab --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-
libvorbis
--enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264
--enable-
libx265 --enable-libxavs --enable-libxvid --enable-zlib
libavutil 54. 7.101 / 54. 7.101
libavcodec 56. 1.101 / 56. 1.101
libavformat 56. 5.100 / 56. 5.100
libavdevice 56. 1.100 / 56. 1.100
libavfilter 5. 1.102 / 5. 1.102
libswscale 3. 1.100 / 3. 1.100
libswresample 1. 1.100 / 1. 1.100
libpostproc 53. 1.100 / 53. 1.100
Guessed Channel Layout for Input Stream #0.0 : stereo
Input #0, asf, from 'fail.wmv':
Metadata:
SfOriginalFPS : 300000
WMFSDKVersion : 9.00.00.4509
WMFSDKNeeded : 0.0.0.0000
Buffer Average : 2566
VBR Peak : 216276
IsVBR : 1
DeviceConformanceTemplate: @
Duration: 00:00:05.03, start: 0.000000, bitrate: 565 kb/s
Stream #0:0(pol): Audio: wmav2 (a[1][0][0] / 0x0161), 44100 Hz, 2
channels,
fltp, 128 kb/s
Stream #0:1(pol): Video: mss2 (MSS2 / 0x3253534D), rgb24, 720x480, 414
kb/s,
SAR 10:11 DAR 15:11, 1k tbr, 1k tbn, 1k tbc
Output #0, null, to 'pipe:':
Metadata:
SfOriginalFPS : 300000
WMFSDKVersion : 9.00.00.4509
WMFSDKNeeded : 0.0.0.0000
Buffer Average : 2566
VBR Peak : 216276
IsVBR : 1
DeviceConformanceTemplate: @
encoder : Lavf56.5.100
Stream #0:0(pol): Video: rawvideo (RGB[24] / 0x18424752), rgb24,
720x480 [SA
R 10:11 DAR 15:11], q=2-31, 200 kb/s, 1k fps, 1k tbn, 1k tbc
Metadata:
encoder : Lavc56.1.101 rawvideo
Stream #0:1(pol): Audio: pcm_s16le, 44100 Hz, stereo, s16, 1411 kb/s
Metadata:
encoder : Lavc56.1.101 pcm_s16le
Stream mapping:
Stream #0:1 -> #0:0 (mss2 (native) -> rawvideo (native))
Stream #0:0 -> #0:1 (wmav2 (native) -> pcm_s16le (native))
Press [q] to stop, [?] for help
[mss2 @ 031b19a0] buffer not fully consumed
[null @ 02e4ee60] Encoder did not produce proper pts, making some up.
[mss2 @ 031b19a0] buffer not fully consumed
frame= 2 fps=0.0 q=0.0 Lsize=N/A time=00:00:05.01 bitrate=N/A
video:0kB audio:872kB subtitle:0kB other streams:0kB global headers:0kB
muxing o
verhead: unknown
}}}
--
Ticket URL: <https://trac.ffmpeg.org/ticket/4043>
FFmpeg <https://ffmpeg.org>
FFmpeg issue tracker
More information about the FFmpeg-trac
mailing list