From patchwork Mon May 8 18:46:22 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 3621 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.103.3.129 with SMTP id 123csp982749vsd; Mon, 8 May 2017 11:47:32 -0700 (PDT) X-Received: by 10.28.103.214 with SMTP id b205mr14521721wmc.125.1494269252149; Mon, 08 May 2017 11:47:32 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1494269252; cv=none; d=google.com; s=arc-20160816; b=OXLyIOFN6/ejaQMise7HW71zckZgzURzCWORW4Xy8+hW7gM8Wp8Es1QwJDdLMGZZIZ 1VZ+pKeyGf6Dlu1yKMjKChoAxkKHQPyJT9MpVN7LkE0n9LJg/fKC7AlZOnd3Ga0RVDgV ++9U4vmsMXWQg7cQ3p4U4HP3lZ3ArzdEhVguXG2+8Z9lSVNWxonCYZFSniNxDcRQT9/S z2PRTtTDob0UL3cZ4B4Rz9Yr1HP0YZVZm/Lb52ORlLLlkaujzdLmCLtvTZN34pVFyNre iJXXQv5EOlk3/jfDVKPf9dgVbbvry8/OsLU91tnXuQnqju39zVSa3vXQpb5DAYqNbRV6 qN6A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:message-id:date:to:from:dkim-signature :delivered-to:arc-authentication-results; bh=YS9gZ3kqzvoo0MutjhFu6GuOfu0nh2SW1XJVJCczEsI=; b=P9JjON0mdvHMlwEWEva/7Pg67Z0Vy5yqAbuqz3pTAS3pWUUgrC/MfQrU2nyRodAzG/ gDQXXruMqHetYG9X0Ldbuz0iivQiFOkJZeRhv6BKJe+I7rOVCCwnlqbbfIcnsM38+joe AJkVWQEyuwdA9XVJ6B8iGdflvnk3olSNfaZjxEMbOC0Ptg1dgYoz9FN1bCcGEvYSD+aE tiDI1Vt5l5je/quf8z3FX5PMVSIgXoy2JTabuutz+g6pefp1eTyN7U6FiPHLm7O1bkcL 2L8NhO+RfNJxu9G3VP5qOww6mALumGYCZd8bfYmuTSu2tNqi4E9X1pIStuo5WfJmjNdi ewcw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id l12si14903488wmd.30.2017.05.08.11.47.31; Mon, 08 May 2017 11:47:32 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 28C7668832F; Mon, 8 May 2017 21:47:22 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qk0-f170.google.com (mail-qk0-f170.google.com [209.85.220.170]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id A59D66803A4 for ; Mon, 8 May 2017 21:47:15 +0300 (EEST) Received: by mail-qk0-f170.google.com with SMTP id a72so43968074qkj.2 for ; Mon, 08 May 2017 11:47:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id; bh=sxp7ko6ORK9XHTrXcpVwHXGoCsNcwWwOSZ4hQjsDDRc=; b=rSQlh0g5/JcisK1sTtVsEw+xAaLkIA+BhS042gDCzYodtTMiqXMsp3CkrlvZIJObln YOZ2mG+bUko4kjiAvOnILibFkCmyFLlBgLSqvYk9TRVnBdJ2dyawuN3DGYYZmQcpWMTZ sFQOX5dY2ooM3SzbWm+hnYH83lbMtBke8pjGmJMlOesBcXW41oYs0Y8vBuB2y5Yomben WceoX2SKbSQkftR2QksGYuJcyQ3Cuf68U6yn+m8L+r4VbkBihIlwhfCEoV5Jf7G7e2R1 vhzx67wdcQxmNqks5wpOZPo85ZVhOmlAwF5QmBwgcQ0wKYpzZe+khTXRnnjC7KZSaU9h 26UQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id; bh=sxp7ko6ORK9XHTrXcpVwHXGoCsNcwWwOSZ4hQjsDDRc=; b=oO1z74G+YxxzzS9VXoay5ka1t0WzWCeK46bdg7xe9VeDc7O5VDpG2foKsogboiHWv6 ZCbtofo9BKKeG5qsmMA/kqwB32Iba9EZlqZ9Zj/ApxDFRg5FsCMlwQxRuoK0ba8ZYALw Momsd5JGV//IqOng3USKzoiqDude0uetfl5Bj88Z5tc83Q/Dx12UPHMb+PO7hAbVPeZ4 jUv77A1Jk+U35uboYc3SSBqrpkflN3hFbEa9dcOMrLv49a1dzkY783uQrWwFEAsg9h+g y4tXpDDifQ6DT+r8j/VJw1/MCcexsFVNy8X+lt2D6S/ZfBYQfOvPJ6La6rZ2HXeY9eZD guQA== X-Gm-Message-State: AN3rC/5FA72HX5Ka33JBWR3PgM/ZIbV72ALaD81Su01kbTwb88V9pSrC DndGlozgCdOo2TA6 X-Received: by 10.55.181.194 with SMTP id e185mr24097802qkf.162.1494269240382; Mon, 08 May 2017 11:47:20 -0700 (PDT) Received: from localhost.localdomain ([181.231.116.134]) by smtp.gmail.com with ESMTPSA id t136sm702878qke.40.2017.05.08.11.47.19 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 08 May 2017 11:47:19 -0700 (PDT) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Mon, 8 May 2017 15:46:22 -0300 Message-Id: <20170508184625.7056-1-jamrial@gmail.com> X-Mailer: git-send-email 2.12.1 Subject: [FFmpeg-devel] [PATCH 1/4] hevcdec: export cropping information instead of handling it internally X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" From: Anton Khirnov --- This merges commit a02ae1c6837a54ed9e7735da2b1f789b2f4b6e13 from libav 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(-) diff --git a/libavcodec/hevc_parser.c b/libavcodec/hevc_parser.c index d6102f3ab9..46e13de5c3 100644 --- a/libavcodec/hevc_parser.c +++ b/libavcodec/hevc_parser.c @@ -57,6 +57,7 @@ static int hevc_parse_slice_header(AVCodecParserContext *s, H2645NAL *nal, HEVCSEIContext *sei = &ctx->sei; SliceHeader *sh = &ctx->sh; GetBitContext *gb = &nal->gb; + const HEVCWindow *ow; int i, num = 0, den = 0; sh->first_slice_in_pic_flag = get_bits1(gb); @@ -83,11 +84,12 @@ static int hevc_parse_slice_header(AVCodecParserContext *s, H2645NAL *nal, ps->sps = (HEVCSPS*)ps->sps_list[ps->pps->sps_id]->data; ps->vps = (HEVCVPS*)ps->vps_list[ps->sps->vps_id]->data; } + ow = &ps->sps->output_window; s->coded_width = ps->sps->width; s->coded_height = ps->sps->height; - s->width = ps->sps->output_width; - s->height = ps->sps->output_height; + s->width = ps->sps->width - ow->left_offset - ow->right_offset; + s->height = ps->sps->height - ow->top_offset - ow->bottom_offset; s->format = ps->sps->pix_fmt; avctx->profile = ps->sps->ptl.general_ptl.profile_idc; avctx->level = ps->sps->ptl.general_ptl.level_idc; 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)); } diff --git a/libavcodec/hevc_ps.h b/libavcodec/hevc_ps.h index 016f0075d4..78f9dd876e 100644 --- a/libavcodec/hevc_ps.h +++ b/libavcodec/hevc_ps.h @@ -227,8 +227,6 @@ typedef struct HEVCSPS { int chroma_format_idc; uint8_t separate_colour_plane_flag; - ///< output (i.e. cropped) values - int output_width, output_height; HEVCWindow output_window; HEVCWindow pic_conf_win; diff --git a/libavcodec/hevc_refs.c b/libavcodec/hevc_refs.c index fc1385ca55..f9818c958e 100644 --- a/libavcodec/hevc_refs.c +++ b/libavcodec/hevc_refs.c @@ -163,7 +163,10 @@ int ff_hevc_set_new_ref(HEVCContext *s, AVFrame **frame, int poc) ref->poc = poc; ref->sequence = s->seq_decode; - ref->window = s->ps.sps->output_window; + ref->frame->crop_left = s->ps.sps->output_window.left_offset; + ref->frame->crop_right = s->ps.sps->output_window.right_offset; + ref->frame->crop_top = s->ps.sps->output_window.top_offset; + ref->frame->crop_bottom = s->ps.sps->output_window.bottom_offset; return 0; } @@ -204,12 +207,8 @@ int ff_hevc_output_frame(HEVCContext *s, AVFrame *out, int flush) if (nb_output) { HEVCFrame *frame = &s->DPB[min_idx]; - AVFrame *dst = out; - AVFrame *src = frame->frame; - const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(src->format); - int pixel_shift = !!(desc->comp[0].depth > 8); - ret = av_frame_ref(out, src); + ret = av_frame_ref(out, frame->frame); if (frame->flags & HEVC_FRAME_FLAG_BUMPING) ff_hevc_unref_frame(s, frame, HEVC_FRAME_FLAG_OUTPUT | HEVC_FRAME_FLAG_BUMPING); else @@ -217,13 +216,6 @@ int ff_hevc_output_frame(HEVCContext *s, AVFrame *out, int flush) if (ret < 0) return ret; - for (i = 0; i < 3; i++) { - int hshift = (i > 0) ? desc->log2_chroma_w : 0; - int vshift = (i > 0) ? desc->log2_chroma_h : 0; - int off = ((frame->window.left_offset >> hshift) << pixel_shift) + - (frame->window.top_offset >> vshift) * dst->linesize[i]; - dst->data[i] += off; - } av_log(s->avctx, AV_LOG_DEBUG, "Output frame with POC %d.\n", frame->poc); return 1; diff --git a/libavcodec/hevcdec.c b/libavcodec/hevcdec.c index ee001fd9f2..cf56a41297 100644 --- a/libavcodec/hevcdec.c +++ b/libavcodec/hevcdec.c @@ -288,13 +288,14 @@ static void export_stream_params(AVCodecContext *avctx, const HEVCParamSets *ps, const HEVCSPS *sps) { const HEVCVPS *vps = (const HEVCVPS*)ps->vps_list[sps->vps_id]->data; + const HEVCWindow *ow = &sps->output_window; unsigned int num = 0, den = 0; avctx->pix_fmt = sps->pix_fmt; avctx->coded_width = sps->width; avctx->coded_height = sps->height; - avctx->width = sps->output_width; - avctx->height = sps->output_height; + avctx->width = sps->width - ow->left_offset - ow->right_offset; + avctx->height = sps->height - ow->top_offset - ow->bottom_offset; avctx->has_b_frames = sps->temporal_layer[sps->max_sub_layers - 1].num_reorder_pics; avctx->profile = sps->ptl.general_ptl.profile_idc; avctx->level = sps->ptl.general_ptl.level_idc; @@ -3110,7 +3111,6 @@ static int hevc_ref_frame(HEVCContext *s, HEVCFrame *dst, HEVCFrame *src) dst->poc = src->poc; dst->ctb_count = src->ctb_count; - dst->window = src->window; dst->flags = src->flags; dst->sequence = src->sequence; @@ -3398,4 +3398,5 @@ AVCodec ff_hevc_decoder = { AV_CODEC_CAP_SLICE_THREADS | AV_CODEC_CAP_FRAME_THREADS, .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE, .profiles = NULL_IF_CONFIG_SMALL(ff_hevc_profiles), + .caps_internal = FF_CODEC_CAP_EXPORTS_CROPPING, }; diff --git a/libavcodec/hevcdec.h b/libavcodec/hevcdec.h index d5d6bbcdb6..695ccfb591 100644 --- a/libavcodec/hevcdec.h +++ b/libavcodec/hevcdec.h @@ -317,8 +317,6 @@ typedef struct HEVCFrame { int poc; struct HEVCFrame *collocated_ref; - HEVCWindow window; - AVBufferRef *tab_mvf_buf; AVBufferRef *rpl_tab_buf; AVBufferRef *rpl_buf;