diff options
author | James Almer <jamrial@gmail.com> | 2017-05-08 21:46:23 +0300 |
---|---|---|
committer | James Almer <jamrial@gmail.com> | 2017-05-26 17:15:45 +0300 |
commit | 6505e8cfd02b9112e24bb40c145d6c760f15d622 (patch) | |
tree | e55cf237b2e7065eb4f69a5ec2f8f14bb95ccb6b /libavcodec | |
parent | 000fb61a71c6288c377167fea1541700aef3612d (diff) |
avcodec/h264dec: be more explicit in handling container cropping
This merges commit 4fded0480f20f4d7ca5e776a85574de34dfead14 from libav,
originally written by Anton Khirnov and skipped in
fc63d5ceb357c4b760cb02772de0b50d0557140f.
libavcodec/h264_slice.c | 20 +++++++++++++-------
libavcodec/h264dec.c | 3 +++
libavcodec/h264dec.h | 5 +++++
3 files changed, 21 insertions(+), 7 deletions(-)
Diffstat (limited to 'libavcodec')
-rw-r--r-- | libavcodec/h264_slice.c | 20 | ||||
-rw-r--r-- | libavcodec/h264dec.c | 3 | ||||
-rw-r--r-- | libavcodec/h264dec.h | 5 |
3 files changed, 21 insertions, 7 deletions
diff --git a/libavcodec/h264_slice.c b/libavcodec/h264_slice.c index acf6a73f60..a7916e09ce 100644 --- a/libavcodec/h264_slice.c +++ b/libavcodec/h264_slice.c @@ -378,6 +378,8 @@ int ff_h264_update_thread_context(AVCodecContext *dst, h->avctx->coded_width = h1->avctx->coded_width; h->avctx->width = h1->avctx->width; h->avctx->height = h1->avctx->height; + h->width_from_caller = h1->width_from_caller; + h->height_from_caller = h1->height_from_caller; h->coded_picture_number = h1->coded_picture_number; h->first_field = h1->first_field; h->picture_structure = h1->picture_structure; @@ -874,13 +876,17 @@ static int init_dimensions(H264Context *h) av_assert0(sps->crop_top + sps->crop_bottom < (unsigned)h->height); /* handle container cropping */ - if (FFALIGN(h->avctx->width, 16) == FFALIGN(width, 16) && - FFALIGN(h->avctx->height, 16) == FFALIGN(height, 16) && - h->avctx->width <= width && - h->avctx->height <= height - ) { - width = h->avctx->width; - height = h->avctx->height; + if (h->width_from_caller > 0 && h->height_from_caller > 0 && + !sps->crop_top && !sps->crop_left && + FFALIGN(h->width_from_caller, 16) == FFALIGN(width, 16) && + FFALIGN(h->height_from_caller, 16) == FFALIGN(height, 16) && + h->width_from_caller <= width && + h->height_from_caller <= height) { + width = h->width_from_caller; + height = h->height_from_caller; + } else { + h->width_from_caller = 0; + h->height_from_caller = 0; } h->avctx->coded_width = h->width; diff --git a/libavcodec/h264dec.c b/libavcodec/h264dec.c index 35ab51f616..a8d07df1e7 100644 --- a/libavcodec/h264dec.c +++ b/libavcodec/h264dec.c @@ -309,6 +309,9 @@ static int h264_init_context(AVCodecContext *avctx, H264Context *h) h->avctx = avctx; h->cur_chroma_format_idc = -1; + h->width_from_caller = avctx->width; + h->height_from_caller = avctx->height; + h->picture_structure = PICT_FRAME; h->workaround_bugs = avctx->workaround_bugs; h->flags = avctx->flags; diff --git a/libavcodec/h264dec.h b/libavcodec/h264dec.h index 1c0dfbf7f7..5e03d55558 100644 --- a/libavcodec/h264dec.h +++ b/libavcodec/h264dec.h @@ -534,6 +534,11 @@ typedef struct H264Context { int cur_bit_depth_luma; int16_t slice_row[MAX_SLICES]; ///< to detect when MAX_SLICES is too low + /* original AVCodecContext dimensions, used to handle container + * cropping */ + int width_from_caller; + int height_from_caller; + int enable_er; H264SEIContext sei; |