From patchwork Fri Nov 4 14:13:35 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitrii Ovchinnikov X-Patchwork-Id: 39160 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a21:999a:b0:a4:2148:650a with SMTP id ve26csp445117pzb; Fri, 4 Nov 2022 07:14:05 -0700 (PDT) X-Google-Smtp-Source: AMsMyM7CvNdT4qv7zjOS1DvesQyrEu3xf2dkH9VY4imowu39nhreECYLLE56SI5SzBHXfle7VgpL X-Received: by 2002:a17:906:66ce:b0:7ad:d178:c252 with SMTP id k14-20020a17090666ce00b007add178c252mr26691340ejp.158.1667571245287; Fri, 04 Nov 2022 07:14:05 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1667571245; cv=none; d=google.com; s=arc-20160816; b=0OouV3LNOrNz3s6abpK0RTq2xidr6A+5JgCWKJ/r8114eWh9163iGAhw0ytSr7pZrW cu2lm8dyPanv8xPt52NLFM9fHeODLpHSV5oI8e32cciGSRjGSt1jPjdT5YO9UpnvHnwJ o9bIOVbfSrS1z6CoGzjI8Kjf9NnDbd+Wd39P7LV1+GoPvDexF7IsP/V+FMdy+EuOv2lW za1R9IaUOqPtSdapTsuQ4jE+zRb7TWAcrBplOmC++2TByJsnuW9F2BqQGM3pf2faXC6Z FuQeAOX6qAF9OAmEKz00a/OwDXUl7A4HiXZE/qf0M8ov32RpNaqfXeIfwZw7lWxFGG9b Xsyw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to :message-id:date:to:from:dkim-signature:delivered-to; bh=u2fsI9tskh8EJRsqqobPiZ5FXVmS3jOrPd8YIxIWZiA=; b=Mu+AcH2H65kRTESybkfFRi2mS2cK38/ShPi8qCi6zCtue7ZCGGk6WPTEEcMh6/lq6u 7MwO3QhHMHXFc4Hkq9TLEpWAW1T0ZpY138CUASETHgCCf46DMaxP5u+cdlzG3SJ1vSpz y6VWtCNS9wZfVl/IGY9WFczyADnSdAsDTnTVyquJRKsuaYy2HAXJKi2NyXlXD4xeUFnf hdUVwwAm6w66UnWb1ZunvAK9dyoPbQnVWbz/iuVuCA06BT0VLzJ5a7juWuJ948vz6jrH tKnlo8rqRuTzR/ESV0M6knpB8Kj2MXQ/eQdGZ9J9JWSE41tVNsCs/5B7TalEGxK6qMJ/ P1PA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=M23G7iPY; 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=QUARANTINE 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 f13-20020a170906084d00b0078168566b26si2702810ejd.356.2022.11.04.07.14.01; Fri, 04 Nov 2022 07:14:05 -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 header.s=20210112 header.b=M23G7iPY; 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=QUARANTINE 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 6738B68B720; Fri, 4 Nov 2022 16:13:53 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f45.google.com (mail-wr1-f45.google.com [209.85.221.45]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 14A3A68B6D3 for ; Fri, 4 Nov 2022 16:13:45 +0200 (EET) Received: by mail-wr1-f45.google.com with SMTP id j15so7258286wrq.3 for ; Fri, 04 Nov 2022 07:13:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=XOP6/j+A1N8sXpdYpW8mXcwpOh6Pl5ucV3LFXWvB0K4=; b=M23G7iPYj9lgeEsKSVLKfo0HEABMcD1tK+EVlpioRGPkyrqDnSivbYqUg4rWBOqVSK ViarMDSaIDAq4yHW5zG7FYm5mb+2hSIsSH+UR8QrH91nT8XOKotsL97XsnRpFPPigxL7 SfiYGI4a+ASqf0bDwoVsjfd2aVcaKca0/N7tt1SeprBKqUaEsEsat0t60u5TenI0wbG+ jrBTRbBKJT/S0arH9ck/krOTUyxYsBiDSpwDbqw777AsMjRBCA6SaLK5NGs0nLkHU6Qy 9r02F7A3pFoEeP23sRY2Mx57WRWKfy1321kLE62tm7mMwm42CmPXrxA9AdJ1FKAQsWsv 3pAg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=XOP6/j+A1N8sXpdYpW8mXcwpOh6Pl5ucV3LFXWvB0K4=; b=Plwxa2QlVeT9RwCjxnpRbl+agW6OuHguY4XvXJiWXeJ6Y3ymMlZnxMV90JicTdOj2H BxrdJYs00dyy41xonIKDvAjI4EjZjNFHqDtmbqdMli5g2ca8VGB+KTcXRL/fs8p2vg4p zRnFx+CsI0RyFaIIiv/VL5zWlyhe4C6SbSAqdwFzHFcDnl8jkh9iVIrYYVP6NGiEuqmZ JnWX90vGjLLd9LjZVwNzuEZGKmazKSItMxe6gpbANrbETTMBfgCVAnyBzpDE/GGreDap foQx/qAkcME8QeJJb+TisE37FuIEYTie+5O994R6EgVW83/pzkgGeDyRZv2qkD5u6w+J qwBA== X-Gm-Message-State: ACrzQf2B0u+Ac2gh+JVItOlWFQ0xKy1pNtu4eBdz3loESkvFeSPRl9j1 OepquS9aEfwVzfdUyVHhMaWhY3Mjs3hHCg== X-Received: by 2002:adf:e711:0:b0:236:2f7f:4f08 with SMTP id c17-20020adfe711000000b002362f7f4f08mr23001245wrm.375.1667571223981; Fri, 04 Nov 2022 07:13:43 -0700 (PDT) Received: from dovchinn.amd.com (178-222-23-217.dynamic.isp.telekom.rs. [178.222.23.217]) by smtp.gmail.com with ESMTPSA id f10-20020a05600c154a00b003a2f2bb72d5sm4021436wmg.45.2022.11.04.07.13.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 04 Nov 2022 07:13:43 -0700 (PDT) From: OvchinnikovDmitrii To: ffmpeg-devel@ffmpeg.org Date: Fri, 4 Nov 2022 15:13:35 +0100 Message-Id: <20221104141336.1812-2-ovchinnikov.dmitrii@gmail.com> X-Mailer: git-send-email 2.30.0.windows.2 In-Reply-To: <20221104141336.1812-1-ovchinnikov.dmitrii@gmail.com> References: <20221104141336.1812-1-ovchinnikov.dmitrii@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [crop support for matroska demuxer, V4 2/3] libavcodec: Public code to support container crop X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 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 Cc: OvchinnikovDmitrii Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: RpAuZ3w2rdcX Support both simple and receive_frame api The container crop information is applied additional to frame crop information --- libavcodec/codec_par.c | 30 ++++++++++++++--------- libavcodec/decode.c | 54 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+), 11 deletions(-) diff --git a/libavcodec/codec_par.c b/libavcodec/codec_par.c index abda649aa8..9738402434 100644 --- a/libavcodec/codec_par.c +++ b/libavcodec/codec_par.c @@ -115,17 +115,21 @@ int avcodec_parameters_from_context(AVCodecParameters *par, switch (par->codec_type) { case AVMEDIA_TYPE_VIDEO: - par->format = codec->pix_fmt; - par->width = codec->width; - par->height = codec->height; - par->field_order = codec->field_order; - par->color_range = codec->color_range; - par->color_primaries = codec->color_primaries; - par->color_trc = codec->color_trc; - par->color_space = codec->colorspace; - par->chroma_location = codec->chroma_sample_location; - par->sample_aspect_ratio = codec->sample_aspect_ratio; - par->video_delay = codec->has_b_frames; + par->format = codec->pix_fmt; + par->width = codec->width; + par->height = codec->height; + par->container_crop_top = codec->container_crop_top; + par->container_crop_left = codec->container_crop_left; + par->container_crop_bottom = codec->container_crop_bottom; + par->container_crop_right = codec->container_crop_right; + par->field_order = codec->field_order; + par->color_range = codec->color_range; + par->color_primaries = codec->color_primaries; + par->color_trc = codec->color_trc; + par->color_space = codec->colorspace; + par->chroma_location = codec->chroma_sample_location; + par->sample_aspect_ratio = codec->sample_aspect_ratio; + par->video_delay = codec->has_b_frames; break; case AVMEDIA_TYPE_AUDIO: par->format = codec->sample_fmt; @@ -199,6 +203,10 @@ int avcodec_parameters_to_context(AVCodecContext *codec, codec->pix_fmt = par->format; codec->width = par->width; codec->height = par->height; + codec->container_crop_top = par->container_crop_top; + codec->container_crop_left = par->container_crop_left; + codec->container_crop_bottom = par->container_crop_bottom; + codec->container_crop_right = par->container_crop_right; codec->field_order = par->field_order; codec->color_range = par->color_range; codec->color_primaries = par->color_primaries; diff --git a/libavcodec/decode.c b/libavcodec/decode.c index 6be2d3d6ed..9e44fcb293 100644 --- a/libavcodec/decode.c +++ b/libavcodec/decode.c @@ -693,6 +693,60 @@ static int apply_cropping(AVCodecContext *avctx, AVFrame *frame) if (!avctx->apply_cropping) return 0; + if (avctx->container_apply_cropping == FF_CONTAINER_CROPPING_ADDITION) + { + /*check if container parameter and elementary streaming cropping parameters are safe for applying */ + if (avctx->container_crop_left + frame->crop_left>= INT_MAX - (avctx->container_crop_right + frame->crop_right) || + avctx->container_crop_top + frame->crop_top >= INT_MAX - (avctx->container_crop_bottom + frame->crop_bottom) || + (avctx->container_crop_left + frame->crop_left + avctx->container_crop_right + frame->crop_right) >= frame->width || + (avctx->container_crop_top + frame->crop_top + avctx->container_crop_bottom + frame->crop_bottom) >= frame->height) { + av_log(avctx, AV_LOG_WARNING, + "Apply container and elementary stream corpping parametes error: " + "container cropping parameters" + "%"SIZE_SPECIFIER"/%"SIZE_SPECIFIER"/%"SIZE_SPECIFIER"/%"SIZE_SPECIFIER" " + "elementary stream croping paramters" + "%"SIZE_SPECIFIER"/%"SIZE_SPECIFIER"/%"SIZE_SPECIFIER"/%"SIZE_SPECIFIER" " + "(frame size %dx%d). This is a bug, please report it\n", + avctx->container_crop_left, avctx->container_crop_right, avctx->container_crop_top, avctx->container_crop_bottom, + frame->crop_left, frame->crop_right, frame->crop_top, frame->crop_bottom, + frame->width, frame->height); + frame->crop_left = 0; + frame->crop_right = 0; + frame->crop_top = 0; + frame->crop_bottom = 0; + return 0; + } + + frame->crop_top += avctx->container_crop_top; + frame->crop_left += avctx->container_crop_left; + frame->crop_bottom += avctx->container_crop_bottom; + frame->crop_right += avctx->container_crop_right; + }else if (avctx->container_apply_cropping == FF_CONTAINER_CROPPING_OVERWRITE) { + + /*check the croppping parameters from container are reasonable and correct*/ + if (avctx->container_crop_left >= INT_MAX - avctx->container_crop_right || + avctx->container_crop_top >= INT_MAX - avctx->container_crop_bottom || + (avctx->container_crop_left + avctx->container_crop_right) >= frame->width || + (avctx->container_crop_top + avctx->container_crop_bottom) >= frame->height) { + av_log(avctx, AV_LOG_WARNING, + "Invalid container cropping information set by a demuxer: " + "%"SIZE_SPECIFIER"/%"SIZE_SPECIFIER"/%"SIZE_SPECIFIER"/%"SIZE_SPECIFIER" " + "(frame size %dx%d). This is a bug, please report it\n", + avctx->container_crop_left, avctx->container_crop_right, avctx->container_crop_top, avctx->container_crop_bottom, + frame->width, frame->height); + frame->crop_left = 0; + frame->crop_right = 0; + frame->crop_top = 0; + frame->crop_bottom = 0; + return 0; + } + + frame->crop_top = avctx->container_crop_top; + frame->crop_left = avctx->container_crop_left; + frame->crop_bottom = avctx->container_crop_bottom; + frame->crop_right = avctx->container_crop_right; + } + return av_frame_apply_cropping(frame, avctx->flags & AV_CODEC_FLAG_UNALIGNED ? AV_FRAME_CROP_UNALIGNED : 0); }