From patchwork Mon Aug 29 00:02:38 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stephen Hutchinson X-Patchwork-Id: 37539 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:139a:b0:8f:1db5:eae2 with SMTP id w26csp1633720pzh; Sun, 28 Aug 2022 17:03:28 -0700 (PDT) X-Google-Smtp-Source: AA6agR6EmqsF+BMmI1S4+p+vTidSPTT9wsXvNyJEHE9hR5QjOW15hJ6RyecwOK3lRbhBnTAcjHxX X-Received: by 2002:a50:ec07:0:b0:447:ee9d:effc with SMTP id g7-20020a50ec07000000b00447ee9deffcmr9832976edr.245.1661731408136; Sun, 28 Aug 2022 17:03:28 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1661731408; cv=none; d=google.com; s=arc-20160816; b=NEfBMhOc1Ze7E8qcN2BW5KmwTg8wUF7FQPMPOMHSAjDU+iZXxOvgivjjmXJXQ7QZWC EkLTrfN8Msj8Ln2yQRMgbTFHEbsVZKqrm+DqVrQGmcMsL6Jo3/zl7JyIpdHw7eFiBMd3 e6T4ehoeVu+GBnKaFGTGG2gxK10Fr6B08LGTpaZeTMS45D780KWKz0Z9HWX0uwec+YG+ Iz/Tl2Yj6PTl3D5ZyUlmAPULzRXozo3BtaLyVg5PHQvQ2EAAzmgQVRGeOXAYv6vWAUn0 ZHv0Uvs3PYh1B0x7HP/Hhmq46cGCfLAp29+oWgTbt1mSNfyo4E9eirWxxk1ArX5FuU2K 02YQ== 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=2Pz1eewwXBJhXjStF3U+cKYsE+iOx8fGyU/GZwhJ0yg=; b=HrQl3C+hJkngSuZMLHvWKD6d5XsU7Bl9EaDAQfnGFi8XNU7QRtuYSqVYKcOAVEtZPi l9U6g7lqT9c30ptMJ8qPawiGil4f/+qSckkWEqlt8WI8EtZEzF+vMQGRK2PYWrMMje+3 04nMc2f8GNnx0CLU9NbuyrFl2D2GqzCE7mXyk1xBT+OyABdQARmo3y0s94kYwHhUSo1n NU1b504fq5NvjXWsXkoawu/wHlMwAKrgA//5wSw50M8VSEj8eWZ0RXueX220P+pmwF4v IqGPeZB1t0bbceXp5ldgEkfidcCxp2K/AcaefkUBuW//ACZSdiT0Nj+uTcdXMcxUdHlx z/Pw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=XE7zf3bk; 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 hg4-20020a1709072cc400b0073d615565fesi4893845ejc.494.2022.08.28.17.03.27; Sun, 28 Aug 2022 17:03:28 -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=XE7zf3bk; 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 34BD668B556; Mon, 29 Aug 2022 03:03:03 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-vs1-f41.google.com (mail-vs1-f41.google.com [209.85.217.41]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 98A1168B99F for ; Mon, 29 Aug 2022 03:02:56 +0300 (EEST) Received: by mail-vs1-f41.google.com with SMTP id m66so6818192vsm.12 for ; Sun, 28 Aug 2022 17:02:56 -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; bh=qYyWAFXU8mWo49UvLvlOMHlWWA0nTivep3/0vCPgKMM=; b=XE7zf3bkmQKFLK4XULxAhX0BCoXid59VawlsbJtNy201Piz82h29MT7ljrTPjNzisb fcgY9T9tevbBAtvpvXFecV1fgsIdQgSCAF0GYrilwNMcJnLOieE+B6C97jM3AjQCwuFp rPAvfL9I0R5yt90xdNacxOa6RYVpALzMxdx1ZZl9p6ZQJy3/e/TUnGqmsA2qd+TJSFYK 1EDVTS1ND5P8lFrd1pLlU8nnxawbrUMSMNlFzmLJtkQnVhKWV0btaUi+RjwIyvHsTzmT k7JDYW6fNEzvy65aSIQX8kXxVn0Blh5Hfp9z4sal4jRI9tN+era6vOTXcVGT2WgrxtL+ bGfA== 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; bh=qYyWAFXU8mWo49UvLvlOMHlWWA0nTivep3/0vCPgKMM=; b=74WDiYVd+80Hi3MgqO/717okejfrRfU2UIS8ITe1b3Llja8RQ0vPYCV9toV4m1Wjsh /8d/6ntFEUlJUExobGs9SePUA/pZsC460hEMJ3YJYc+Jv5wXHfc+cxGEMav1SG/JFPJX U9TlDyxvMII/fJQKGw97usnOXj/M8NSmKsMiRfAKcpKKU7ycM0tW3X1D3T1duDpeKAr5 sdFk0LXUtY4oQEwVRyM+948I6xlx7uoLKL9qrt8ovv95GhtfpTIXu+OuQr42N13be4/s m/eGM8INX67Po+sy8VPY52N8GtcXaOcSp9q1n1ev/14B9ieFRD4Va0j+LtD6EooyHlUO 9csQ== X-Gm-Message-State: ACgBeo3dovJ9tqZVE8Ft+4GKOXnYGIT6XbYe7b9iFBtlrUwtcoylskgg SX8OigMQ7tekP4At0Owrbaa1qBLAkTtn5A== X-Received: by 2002:a05:6102:21a8:b0:390:9b63:25a5 with SMTP id i8-20020a05610221a800b003909b6325a5mr2841505vsb.56.1661731374916; Sun, 28 Aug 2022 17:02:54 -0700 (PDT) Received: from cappuccino.. (075-115-109-114.inf.spectrum.com. [75.115.109.114]) by smtp.gmail.com with ESMTPSA id z5-20020ab05645000000b0039f07e29623sm1382804uaa.4.2022.08.28.17.02.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 28 Aug 2022 17:02:54 -0700 (PDT) From: Stephen Hutchinson To: ffmpeg-devel@ffmpeg.org Date: Sun, 28 Aug 2022 20:02:38 -0400 Message-Id: <20220829000244.71123-4-qyot27@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220829000244.71123-1-qyot27@gmail.com> References: <20220829000244.71123-1-qyot27@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 3/9] avformat/avisynth: add read_frameprops option 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: Stephen Hutchinson Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: ClAasLlTskqr Allows turning the reading of frame properties entirely on and off. Defaults to reading frame properties. Signed-off-by: Stephen Hutchinson --- libavformat/avisynth.c | 355 +++++++++++++++++++++-------------------- 1 file changed, 179 insertions(+), 176 deletions(-) diff --git a/libavformat/avisynth.c b/libavformat/avisynth.c index d503c7ed40..5d726d70a5 100644 --- a/libavformat/avisynth.c +++ b/libavformat/avisynth.c @@ -103,6 +103,7 @@ typedef struct AviSynthContext { int error; /* (de)activate reading frame properties */ + int frameprops; int frameprop_sar; /* Linked list pointers. */ @@ -522,227 +523,228 @@ static int avisynth_create_stream_video(AVFormatContext *s, AVStream *st) frame = avs_library.avs_get_frame(avs->clip, 0); avsmap = avs_library.avs_get_frame_props_ro(avs->env, frame); - /* Field order */ - if(avs_library.avs_prop_get_type(avs->env, avsmap, "_FieldBased") == AVS_PROPTYPE_UNSET) { - st->codecpar->field_order = AV_FIELD_UNKNOWN; - } else { - switch (avs_library.avs_prop_get_int(avs->env, avsmap, "_FieldBased", 0, &error)) { - case 0: - st->codecpar->field_order = AV_FIELD_PROGRESSIVE; - break; - case 1: - st->codecpar->field_order = AV_FIELD_BB; - break; - case 2: - st->codecpar->field_order = AV_FIELD_TT; - break; - default: + if(avs->frameprops) { + /* Field order */ + if(avs_library.avs_prop_get_type(avs->env, avsmap, "_FieldBased") == AVS_PROPTYPE_UNSET) { st->codecpar->field_order = AV_FIELD_UNKNOWN; + } else { + switch (avs_library.avs_prop_get_int(avs->env, avsmap, "_FieldBased", 0, &error)) { + case 0: + st->codecpar->field_order = AV_FIELD_PROGRESSIVE; + break; + case 1: + st->codecpar->field_order = AV_FIELD_BB; + break; + case 2: + st->codecpar->field_order = AV_FIELD_TT; + break; + default: + st->codecpar->field_order = AV_FIELD_UNKNOWN; + } } - } - /* Color Range */ - if(avs_library.avs_prop_get_type(avs->env, avsmap, "_ColorRange") == AVS_PROPTYPE_UNSET) { - st->codecpar->color_range = AVCOL_RANGE_UNSPECIFIED; - } else { - switch (avs_library.avs_prop_get_int(avs->env, avsmap, "_ColorRange", 0, &error)) { - case 0: - st->codecpar->color_range = AVCOL_RANGE_JPEG; - break; - case 1: - st->codecpar->color_range = AVCOL_RANGE_MPEG; - break; - default: + /* Color Range */ + if(avs_library.avs_prop_get_type(avs->env, avsmap, "_ColorRange") == AVS_PROPTYPE_UNSET) { st->codecpar->color_range = AVCOL_RANGE_UNSPECIFIED; + } else { + switch (avs_library.avs_prop_get_int(avs->env, avsmap, "_ColorRange", 0, &error)) { + case 0: + st->codecpar->color_range = AVCOL_RANGE_JPEG; + break; + case 1: + st->codecpar->color_range = AVCOL_RANGE_MPEG; + break; + default: + st->codecpar->color_range = AVCOL_RANGE_UNSPECIFIED; + } } - } - /* Color Primaries */ - switch (avs_library.avs_prop_get_int(avs->env, avsmap, "_Primaries", 0, &error)) { - case 1: - st->codecpar->color_primaries = AVCOL_PRI_BT709; - break; - case 2: - st->codecpar->color_primaries = AVCOL_PRI_UNSPECIFIED; - break; - case 4: - st->codecpar->color_primaries = AVCOL_PRI_BT470M; - break; - case 5: - st->codecpar->color_primaries = AVCOL_PRI_BT470BG; - break; - case 6: - st->codecpar->color_primaries = AVCOL_PRI_SMPTE170M; - break; - case 7: - st->codecpar->color_primaries = AVCOL_PRI_SMPTE240M; - break; - case 8: - st->codecpar->color_primaries = AVCOL_PRI_FILM; - break; - case 9: - st->codecpar->color_primaries = AVCOL_PRI_BT2020; - break; - case 10: - st->codecpar->color_primaries = AVCOL_PRI_SMPTE428; - break; - case 11: - st->codecpar->color_primaries = AVCOL_PRI_SMPTE431; - break; - case 12: - st->codecpar->color_primaries = AVCOL_PRI_SMPTE432; - break; - case 22: - st->codecpar->color_primaries = AVCOL_PRI_EBU3213; - break; - default: - st->codecpar->color_primaries = AVCOL_PRI_UNSPECIFIED; - } - - /* Color Transfer Characteristics */ - switch (avs_library.avs_prop_get_int(avs->env, avsmap, "_Transfer", 0, &error)) { - case 1: - st->codecpar->color_trc = AVCOL_TRC_BT709; - break; - case 2: - st->codecpar->color_trc = AVCOL_TRC_UNSPECIFIED; - break; - case 4: - st->codecpar->color_trc = AVCOL_TRC_GAMMA22; - break; - case 5: - st->codecpar->color_trc = AVCOL_TRC_GAMMA28; - break; - case 6: - st->codecpar->color_trc = AVCOL_TRC_SMPTE170M; - break; - case 7: - st->codecpar->color_trc = AVCOL_TRC_SMPTE240M; - break; - case 8: - st->codecpar->color_trc = AVCOL_TRC_LINEAR; - break; - case 9: - st->codecpar->color_trc = AVCOL_TRC_LOG; - break; - case 10: - st->codecpar->color_trc = AVCOL_TRC_LOG_SQRT; - break; - case 11: - st->codecpar->color_trc = AVCOL_TRC_IEC61966_2_4; - break; - case 12: - st->codecpar->color_trc = AVCOL_TRC_BT1361_ECG; - break; - case 13: - st->codecpar->color_trc = AVCOL_TRC_IEC61966_2_1; - break; - case 14: - st->codecpar->color_trc = AVCOL_TRC_BT2020_10; - break; - case 15: - st->codecpar->color_trc = AVCOL_TRC_BT2020_12; - break; - case 16: - st->codecpar->color_trc = AVCOL_TRC_SMPTE2084; - break; - case 17: - st->codecpar->color_trc = AVCOL_TRC_SMPTE428; - break; - case 18: - st->codecpar->color_trc = AVCOL_TRC_ARIB_STD_B67; - break; - default: - st->codecpar->color_trc = AVCOL_TRC_UNSPECIFIED; - } - - /* Matrix coefficients */ - if(avs_library.avs_prop_get_type(avs->env, avsmap, "_Matrix") == AVS_PROPTYPE_UNSET) { - st->codecpar->color_space = AVCOL_SPC_UNSPECIFIED; - } else { - switch (avs_library.avs_prop_get_int(avs->env, avsmap, "_Matrix", 0, &error)) { - case 0: - st->codecpar->color_space = AVCOL_SPC_RGB; - break; + /* Color Primaries */ + switch (avs_library.avs_prop_get_int(avs->env, avsmap, "_Primaries", 0, &error)) { case 1: - st->codecpar->color_space = AVCOL_SPC_BT709; + st->codecpar->color_primaries = AVCOL_PRI_BT709; break; case 2: - st->codecpar->color_space = AVCOL_SPC_UNSPECIFIED; + st->codecpar->color_primaries = AVCOL_PRI_UNSPECIFIED; break; case 4: - st->codecpar->color_space = AVCOL_SPC_FCC; + st->codecpar->color_primaries = AVCOL_PRI_BT470M; break; case 5: - st->codecpar->color_space = AVCOL_SPC_BT470BG; + st->codecpar->color_primaries = AVCOL_PRI_BT470BG; break; case 6: - st->codecpar->color_space = AVCOL_SPC_SMPTE170M; + st->codecpar->color_primaries = AVCOL_PRI_SMPTE170M; break; case 7: - st->codecpar->color_space = AVCOL_SPC_SMPTE240M; + st->codecpar->color_primaries = AVCOL_PRI_SMPTE240M; break; case 8: - st->codecpar->color_space = AVCOL_SPC_YCGCO; + st->codecpar->color_primaries = AVCOL_PRI_FILM; break; case 9: - st->codecpar->color_space = AVCOL_SPC_BT2020_NCL; + st->codecpar->color_primaries = AVCOL_PRI_BT2020; break; case 10: - st->codecpar->color_space = AVCOL_SPC_BT2020_CL; + st->codecpar->color_primaries = AVCOL_PRI_SMPTE428; break; case 11: - st->codecpar->color_space = AVCOL_SPC_SMPTE2085; + st->codecpar->color_primaries = AVCOL_PRI_SMPTE431; break; case 12: - st->codecpar->color_space = AVCOL_SPC_CHROMA_DERIVED_NCL; + st->codecpar->color_primaries = AVCOL_PRI_SMPTE432; break; - case 13: - st->codecpar->color_space = AVCOL_SPC_CHROMA_DERIVED_CL; - break; - case 14: - st->codecpar->color_space = AVCOL_SPC_ICTCP; + case 22: + st->codecpar->color_primaries = AVCOL_PRI_EBU3213; break; default: - st->codecpar->color_space = AVCOL_SPC_UNSPECIFIED; + st->codecpar->color_primaries = AVCOL_PRI_UNSPECIFIED; } - } - /* Chroma Location */ - if(avs_library.avs_prop_get_type(avs->env, avsmap, "_ChromaLocation") == AVS_PROPTYPE_UNSET) { - st->codecpar->chroma_location = AVCHROMA_LOC_UNSPECIFIED; - } else { - switch (avs_library.avs_prop_get_int(avs->env, avsmap, "_ChromaLocation", 0, &error)) { - case 0: - st->codecpar->chroma_location = AVCHROMA_LOC_LEFT; - break; + /* Color Transfer Characteristics */ + switch (avs_library.avs_prop_get_int(avs->env, avsmap, "_Transfer", 0, &error)) { case 1: - st->codecpar->chroma_location = AVCHROMA_LOC_CENTER; + st->codecpar->color_trc = AVCOL_TRC_BT709; break; case 2: - st->codecpar->chroma_location = AVCHROMA_LOC_TOPLEFT; - break; - case 3: - st->codecpar->chroma_location = AVCHROMA_LOC_TOP; + st->codecpar->color_trc = AVCOL_TRC_UNSPECIFIED; break; case 4: - st->codecpar->chroma_location = AVCHROMA_LOC_BOTTOMLEFT; + st->codecpar->color_trc = AVCOL_TRC_GAMMA22; break; case 5: - st->codecpar->chroma_location = AVCHROMA_LOC_BOTTOM; + st->codecpar->color_trc = AVCOL_TRC_GAMMA28; + break; + case 6: + st->codecpar->color_trc = AVCOL_TRC_SMPTE170M; + break; + case 7: + st->codecpar->color_trc = AVCOL_TRC_SMPTE240M; + break; + case 8: + st->codecpar->color_trc = AVCOL_TRC_LINEAR; + break; + case 9: + st->codecpar->color_trc = AVCOL_TRC_LOG; + break; + case 10: + st->codecpar->color_trc = AVCOL_TRC_LOG_SQRT; + break; + case 11: + st->codecpar->color_trc = AVCOL_TRC_IEC61966_2_4; + break; + case 12: + st->codecpar->color_trc = AVCOL_TRC_BT1361_ECG; + break; + case 13: + st->codecpar->color_trc = AVCOL_TRC_IEC61966_2_1; + break; + case 14: + st->codecpar->color_trc = AVCOL_TRC_BT2020_10; + break; + case 15: + st->codecpar->color_trc = AVCOL_TRC_BT2020_12; + break; + case 16: + st->codecpar->color_trc = AVCOL_TRC_SMPTE2084; + break; + case 17: + st->codecpar->color_trc = AVCOL_TRC_SMPTE428; + break; + case 18: + st->codecpar->color_trc = AVCOL_TRC_ARIB_STD_B67; break; default: + st->codecpar->color_trc = AVCOL_TRC_UNSPECIFIED; + } + + /* Matrix coefficients */ + if(avs_library.avs_prop_get_type(avs->env, avsmap, "_Matrix") == AVS_PROPTYPE_UNSET) { + st->codecpar->color_space = AVCOL_SPC_UNSPECIFIED; + } else { + switch (avs_library.avs_prop_get_int(avs->env, avsmap, "_Matrix", 0, &error)) { + case 0: + st->codecpar->color_space = AVCOL_SPC_RGB; + break; + case 1: + st->codecpar->color_space = AVCOL_SPC_BT709; + break; + case 2: + st->codecpar->color_space = AVCOL_SPC_UNSPECIFIED; + break; + case 4: + st->codecpar->color_space = AVCOL_SPC_FCC; + break; + case 5: + st->codecpar->color_space = AVCOL_SPC_BT470BG; + break; + case 6: + st->codecpar->color_space = AVCOL_SPC_SMPTE170M; + break; + case 7: + st->codecpar->color_space = AVCOL_SPC_SMPTE240M; + break; + case 8: + st->codecpar->color_space = AVCOL_SPC_YCGCO; + break; + case 9: + st->codecpar->color_space = AVCOL_SPC_BT2020_NCL; + break; + case 10: + st->codecpar->color_space = AVCOL_SPC_BT2020_CL; + break; + case 11: + st->codecpar->color_space = AVCOL_SPC_SMPTE2085; + break; + case 12: + st->codecpar->color_space = AVCOL_SPC_CHROMA_DERIVED_NCL; + break; + case 13: + st->codecpar->color_space = AVCOL_SPC_CHROMA_DERIVED_CL; + break; + case 14: + st->codecpar->color_space = AVCOL_SPC_ICTCP; + break; + default: + st->codecpar->color_space = AVCOL_SPC_UNSPECIFIED; + } + } + + /* Chroma Location */ + if(avs_library.avs_prop_get_type(avs->env, avsmap, "_ChromaLocation") == AVS_PROPTYPE_UNSET) { st->codecpar->chroma_location = AVCHROMA_LOC_UNSPECIFIED; + } else { + switch (avs_library.avs_prop_get_int(avs->env, avsmap, "_ChromaLocation", 0, &error)) { + case 0: + st->codecpar->chroma_location = AVCHROMA_LOC_LEFT; + break; + case 1: + st->codecpar->chroma_location = AVCHROMA_LOC_CENTER; + break; + case 2: + st->codecpar->chroma_location = AVCHROMA_LOC_TOPLEFT; + break; + case 3: + st->codecpar->chroma_location = AVCHROMA_LOC_TOP; + break; + case 4: + st->codecpar->chroma_location = AVCHROMA_LOC_BOTTOMLEFT; + break; + case 5: + st->codecpar->chroma_location = AVCHROMA_LOC_BOTTOM; + break; + default: + st->codecpar->chroma_location = AVCHROMA_LOC_UNSPECIFIED; + } } - } - /* Sample aspect ratio */ - if (avs->frameprop_sar) { - sar_num = avs_library.avs_prop_get_int(avs->env, avsmap, "_SARNum", 0, &error); - sar_den = avs_library.avs_prop_get_int(avs->env, avsmap, "_SARDen", 0, &error); - st->sample_aspect_ratio = (AVRational){ sar_num, sar_den }; + /* Sample aspect ratio */ + if (avs->frameprop_sar) { + sar_num = avs_library.avs_prop_get_int(avs->env, avsmap, "_SARNum", 0, &error); + sar_den = avs_library.avs_prop_get_int(avs->env, avsmap, "_SARDen", 0, &error); + st->sample_aspect_ratio = (AVRational){ sar_num, sar_den }; + } } - avs_library.avs_release_video_frame(frame); } else { st->codecpar->field_order = AV_FIELD_UNKNOWN; @@ -1149,6 +1151,7 @@ static int avisynth_read_seek(AVFormatContext *s, int stream_index, #define OFFSET(x) offsetof(AviSynthContext, x) static const AVOption avisynth_options[] = { + { "read_frameprops", "Read frame properties from script (AviSynth+ v3.7.1+).", OFFSET(frameprops), AV_OPT_TYPE_BOOL, {.i64 = 1}, 0, 1, AV_OPT_FLAG_DECODING_PARAM }, { "read_frameprop_sar", "Read SAR from script's frame properties (AviSynth+ v3.7.1+).", OFFSET(frameprop_sar), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, AV_OPT_FLAG_DECODING_PARAM }, { NULL }, };