Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/FFmpeg/FFmpeg.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenoit Fouet <benoit.fouet@free.fr>2014-09-23 12:07:10 +0400
committerMichael Niedermayer <michaelni@gmx.at>2014-10-05 16:20:32 +0400
commitfe12b3a7a68c175b02a16b55d10c0b79080a1a9f (patch)
treed26d4b8d5278546b84ef48938c26529cab4f57df /libavformat
parenta1605af9b559ab15e3b13e0eed9d3d35cda46636 (diff)
avformat/riffenc: Filter out "BottomUp" in ff_put_bmp_header()
Fixes Ticket1304 Commit message and extradata size bugfix by commiter Signed-off-by: Michael Niedermayer <michaelni@gmx.at> (cherry picked from commit 6843b9dc78bc966bb30121828ef4f6b6755cf877) Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavformat')
-rw-r--r--libavformat/riffenc.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/libavformat/riffenc.c b/libavformat/riffenc.c
index 2af2b7f9ab..6b42fcf2f6 100644
--- a/libavformat/riffenc.c
+++ b/libavformat/riffenc.c
@@ -208,11 +208,15 @@ int ff_put_wav_header(AVIOContext *pb, AVCodecContext *enc)
void ff_put_bmp_header(AVIOContext *pb, AVCodecContext *enc,
const AVCodecTag *tags, int for_asf, int ignore_extradata)
{
+ int keep_height = enc->extradata_size >= 9 &&
+ !memcmp(enc->extradata + enc->extradata_size - 9, "BottomUp", 9);
+ int extradata_size = enc->extradata_size - 9*keep_height;
+
/* size */
- avio_wl32(pb, 40 + (ignore_extradata ? 0 : enc->extradata_size));
+ avio_wl32(pb, 40 + (ignore_extradata ? 0 :extradata_size));
avio_wl32(pb, enc->width);
//We always store RGB TopDown
- avio_wl32(pb, enc->codec_tag ? enc->height : -enc->height);
+ avio_wl32(pb, enc->codec_tag || keep_height ? enc->height : -enc->height);
/* planes */
avio_wl16(pb, 1);
/* depth */
@@ -226,9 +230,9 @@ void ff_put_bmp_header(AVIOContext *pb, AVCodecContext *enc,
avio_wl32(pb, 0);
if (!ignore_extradata) {
- avio_write(pb, enc->extradata, enc->extradata_size);
+ avio_write(pb, enc->extradata, extradata_size);
- if (!for_asf && enc->extradata_size & 1)
+ if (!for_asf && extradata_size & 1)
avio_w8(pb, 0);
}
}