diff options
author | James Almer <jamrial@gmail.com> | 2017-05-08 15:46:22 -0300 |
---|---|---|
committer | James Almer <jamrial@gmail.com> | 2017-05-26 11:15:45 -0300 |
commit | 000fb61a71c6288c377167fea1541700aef3612d (patch) | |
tree | e4a5d4c5c6ab8184017eef6617442d4907af7f0e /libavcodec/hevc_ps.c | |
parent | 43c394dcaebe9eec5802b420f273385473380909 (diff) | |
download | ffmpeg-000fb61a71c6288c377167fea1541700aef3612d.tar.gz |
avcodec/hevcdec: export cropping information instead of handling it internally
This merges commit a02ae1c6837a54ed9e7735da2b1f789b2f4b6e13 from libav,
originally written by Anton Khirnov and skipped in
fc63d5ceb357c4b760cb02772de0b50d0557140f.
libavcodec/hevc_parser.c | 6 ++++--
libavcodec/hevc_ps.c | 31 ++++++++++++-------------------
libavcodec/hevc_ps.h | 2 --
libavcodec/hevc_refs.c | 18 +++++-------------
libavcodec/hevcdec.c | 7 ++++---
libavcodec/hevcdec.h | 2 --
6 files changed, 25 insertions(+), 41 deletions(-)
Signed-off-by: James Almer <jamrial@gmail.com>
Diffstat (limited to 'libavcodec/hevc_ps.c')
-rw-r--r-- | libavcodec/hevc_ps.c | 31 |
1 files changed, 12 insertions, 19 deletions
diff --git a/libavcodec/hevc_ps.c b/libavcodec/hevc_ps.c index b5a970e4f7..1808b0b420 100644 --- a/libavcodec/hevc_ps.c +++ b/libavcodec/hevc_ps.c @@ -826,6 +826,7 @@ static int map_pixel_format(AVCodecContext *avctx, HEVCSPS *sps) int ff_hevc_parse_sps(HEVCSPS *sps, GetBitContext *gb, unsigned int *sps_id, int apply_defdispwin, AVBufferRef **vps_list, AVCodecContext *avctx) { + HEVCWindow *ow; int ret = 0; int log2_diff_max_min_transform_block_size; int bit_depth_chroma, start, vui_present, sublayer_ordering_info; @@ -1092,30 +1093,21 @@ int ff_hevc_parse_sps(HEVCSPS *sps, GetBitContext *gb, unsigned int *sps_id, sps->output_window.top_offset += sps->vui.def_disp_win.top_offset; sps->output_window.bottom_offset += sps->vui.def_disp_win.bottom_offset; } - if (sps->output_window.left_offset & (0x1F >> (sps->pixel_shift)) && - !(avctx->flags & AV_CODEC_FLAG_UNALIGNED)) { - sps->output_window.left_offset &= ~(0x1F >> (sps->pixel_shift)); - av_log(avctx, AV_LOG_WARNING, "Reducing left output window to %d " - "chroma samples to preserve alignment.\n", - sps->output_window.left_offset); - } - sps->output_width = sps->width - - (sps->output_window.left_offset + sps->output_window.right_offset); - sps->output_height = sps->height - - (sps->output_window.top_offset + sps->output_window.bottom_offset); - if (sps->width <= sps->output_window.left_offset + (int64_t)sps->output_window.right_offset || - sps->height <= sps->output_window.top_offset + (int64_t)sps->output_window.bottom_offset) { - av_log(avctx, AV_LOG_WARNING, "Invalid visible frame dimensions: %dx%d.\n", - sps->output_width, sps->output_height); + + ow = &sps->output_window; + if (ow->left_offset >= INT_MAX - ow->right_offset || + ow->top_offset >= INT_MAX - ow->bottom_offset || + ow->left_offset + ow->right_offset >= sps->width || + ow->top_offset + ow->bottom_offset >= sps->height) { + av_log(avctx, AV_LOG_WARNING, "Invalid cropping offsets: %u/%u/%u/%u\n", + ow->left_offset, ow->right_offset, ow->top_offset, ow->bottom_offset); if (avctx->err_recognition & AV_EF_EXPLODE) { return AVERROR_INVALIDDATA; } av_log(avctx, AV_LOG_WARNING, "Displaying the whole video surface.\n"); + memset(ow, 0, sizeof(*ow)); memset(&sps->pic_conf_win, 0, sizeof(sps->pic_conf_win)); - memset(&sps->output_window, 0, sizeof(sps->output_window)); - sps->output_width = sps->width; - sps->output_height = sps->height; } // Inferred parameters @@ -1221,7 +1213,8 @@ int ff_hevc_decode_nal_sps(GetBitContext *gb, AVCodecContext *avctx, "Parsed SPS: id %d; coded wxh: %dx%d; " "cropped wxh: %dx%d; pix_fmt: %s.\n", sps_id, sps->width, sps->height, - sps->output_width, sps->output_height, + sps->width - (sps->output_window.left_offset + sps->output_window.right_offset), + sps->height - (sps->output_window.top_offset + sps->output_window.bottom_offset), av_get_pix_fmt_name(sps->pix_fmt)); } |