summaryrefslogtreecommitdiffstats
path: root/libavcodec/hevc_ps.c
diff options
context:
space:
mode:
authorJames Almer <jamrial@gmail.com>2017-05-08 15:46:22 -0300
committerJames Almer <jamrial@gmail.com>2017-05-26 11:15:45 -0300
commit000fb61a71c6288c377167fea1541700aef3612d (patch)
treee4a5d4c5c6ab8184017eef6617442d4907af7f0e /libavcodec/hevc_ps.c
parent43c394dcaebe9eec5802b420f273385473380909 (diff)
downloadffmpeg-streaming-000fb61a71c6288c377167fea1541700aef3612d.zip
ffmpeg-streaming-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.c31
1 files changed, 12 insertions, 19 deletions
diff --git a/libavcodec/hevc_ps.c b/libavcodec/hevc_ps.c
index b5a970e..1808b0b 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));
}
OpenPOWER on IntegriCloud