diff options
author | Anton Khirnov <anton@khirnov.net> | 2017-05-19 11:47:21 +0200 |
---|---|---|
committer | Anton Khirnov <anton@khirnov.net> | 2017-05-20 09:41:30 +0200 |
commit | 8652a2c24836ce5546b398f12b7fed45000050e1 (patch) | |
tree | 7393929cfde5fa658e38aa209204a59a1c711889 | |
parent | c3f0357bdf7d3c542aad2c58b94184b9f56edc41 (diff) | |
download | ffmpeg-8652a2c24836ce5546b398f12b7fed45000050e1.tar.gz |
decode: fix the code reducing cropping to preserve alignment
Currently it does not work at all.
Bug-Id: 1058
-rw-r--r-- | libavcodec/decode.c | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/libavcodec/decode.c b/libavcodec/decode.c index 8aa27095b6..bb58dfc561 100644 --- a/libavcodec/decode.c +++ b/libavcodec/decode.c @@ -525,6 +525,7 @@ static int apply_cropping(AVCodecContext *avctx, AVFrame *frame) /* adjust the offsets to avoid breaking alignment */ if (!(avctx->flags & AV_CODEC_FLAG_UNALIGNED)) { + int log2_crop_align = frame->crop_left ? av_ctz(frame->crop_left) : INT_MAX; int min_log2_align = INT_MAX; for (i = 0; frame->data[i]; i++) { @@ -532,8 +533,13 @@ static int apply_cropping(AVCodecContext *avctx, AVFrame *frame) min_log2_align = FFMIN(log2_align, min_log2_align); } + /* we assume, and it should always be true, that the data alignment is + * related to the cropping alignment by a constant power-of-2 factor */ + if (log2_crop_align < min_log2_align) + return AVERROR_BUG; + if (min_log2_align < 5) { - frame->crop_left &= ~((1 << min_log2_align) - 1); + frame->crop_left &= ~((1 << (5 + log2_crop_align - min_log2_align)) - 1); calc_cropping_offsets(offsets, frame, desc); } } |