summaryrefslogtreecommitdiff
path: root/libavcodec/h264_slice.c
diff options
context:
space:
mode:
authorAnton Khirnov <anton@khirnov.net>2016-12-27 19:07:18 +0100
committerAnton Khirnov <anton@khirnov.net>2017-01-12 16:28:05 +0100
commit4fded0480f20f4d7ca5e776a85574de34dfead14 (patch)
tree000be0b40f2cebfb57e013d99aa5d4728608e873 /libavcodec/h264_slice.c
parenta02ae1c6837a54ed9e7735da2b1f789b2f4b6e13 (diff)
h264dec: be more explicit in handling container cropping
The current condition can trigger in cases where it shouldn't, with unexpected results. Make sure that: - container cropping is really based on the original dimensions from the caller - those dimenions are discarded on size change The code is still quite hacky and eventually should be deprecated and removed, with the decision about which cropping is used delegated to the caller.
Diffstat (limited to 'libavcodec/h264_slice.c')
-rw-r--r--libavcodec/h264_slice.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/libavcodec/h264_slice.c b/libavcodec/h264_slice.c
index 1b35c2baaf..a54d3816e4 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;
@@ -797,10 +799,15 @@ static int init_dimensions(H264Context *h)
int height = h->height - (sps->crop_top + sps->crop_bottom);
/* handle container cropping */
- if (FFALIGN(h->avctx->width, 16) == FFALIGN(width, 16) &&
- FFALIGN(h->avctx->height, 16) == FFALIGN(height, 16)) {
- 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)) {
+ 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;