From patchwork Mon Jun 7 23:03:40 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Diederick C. Niehorster" X-Patchwork-Id: 28156 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:b214:0:0:0:0:0 with SMTP id b20csp3890021iof; Mon, 7 Jun 2021 16:10:55 -0700 (PDT) X-Google-Smtp-Source: ABdhPJy6Va3XCrc9lmKsgCirIFEjG24TCxGh320Pz7cCiNKpZ9/Cb9POZUZwAWxsn9zoOiKmU8wX X-Received: by 2002:a05:6402:845:: with SMTP id b5mr22115577edz.266.1623107455654; Mon, 07 Jun 2021 16:10:55 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1623107455; cv=none; d=google.com; s=arc-20160816; b=r5w/Ufr9jZ0m+kakKoLs8Wu5vDLSEJeJsiXVqabJqSWWLPRSnY64xO4K7FjkIlhlIp Rkl6dDA629sS1pxpg6pKAUmNH2F/JokCAPfARl/rtjbP04azjB3bu2SQuWL/RrwNxrr0 3caY3ujssbCtrtsqU3RmXQH4YnSAhoHFX6qlUWiWBT2bC0LULQFhC/p2U3+T/JEVS2Hk wW7mX2RB9Bb/WTIOhvfhLgPangErCC2/3TroNMwRMPamgSL37If9QQw+cjGdUJAoAsjt GNbn6N03UGlky45jsxF884UpjM5NQuD04aOVNb0Z2zI54Tv059NHSJHxgv2p4xjk+0gH gLug== 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=uxhc0lREL3hlZNUBlWpd+7ODKhk4DZKCxj/H5B51W7U=; b=AG2ltNozraoJwr645s3oRsaprDazPIIAqsFhsMYfygDkYqqIQcjJxP0RumAvJMNjvV R+CJBevLO4DGdu8GgRQatt/u5Yel2cEVHmy86VcbEuOiigKrj0V9E0SjhCs6Xq6/7xQH BBZnKE8XtkNlD9nmRpFFGxU+LAwEUdhtwFHYilmZKBNczDdEKyt/OdZekX9WzRC71Ofk GBwytWzh2xRyOmaJ/Gu4fQ1E85l+4ZKJRsvaUwXekFV/tRYPRj23aKtYgdHigksZ5bVO /XOSJOIV0BuVg6tm8YKgxBe4r7K5QmO8Jim2h4cpsQHvjVhi3dv5kYbnJngFpeo5lZfO QYcQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b="KfcSnW7/"; 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 j8si8973162edj.124.2021.06.07.16.10.55; Mon, 07 Jun 2021 16:10:55 -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=20161025 header.b="KfcSnW7/"; 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 88E66688055; Tue, 8 Jun 2021 02:10:41 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-ed1-f43.google.com (mail-ed1-f43.google.com [209.85.208.43]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id AFDB56818DB for ; Tue, 8 Jun 2021 02:10:39 +0300 (EEST) Received: by mail-ed1-f43.google.com with SMTP id b11so22357799edy.4 for ; Mon, 07 Jun 2021 16:10:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=HuLyuMU42sGh1fXMH20agcBjKGYt8amXpumK5Mpct/c=; b=KfcSnW7/IH1K5UoHoGka/kQAUC9rY3rOP2UK9DF7V4+7xZE9DRCqCJ82HwDCnjd28K oBqQEtTxdtBE9WVwlWFxKL3EtK3pMWDookn3rx578vvp+4HJf0DsSCMIwHG9/ZgqXEv/ oqFj/G4tXrALcc5WW8sQP6Cd5eXE0LpfXzCJHSh05l2gz0MsOH1xeAuT3RTp2+29yq1m x/2EteUUABdpClXs22BvP8aq6XmErCW2g8zRM5BKZqCOccpaGmSletarUE2/Dwr7ddOZ 1Et4j9wTySv5P+Zq/2XUL3m0Z/UEmhLcDMT+e+9HkNHRZDtu1R5reSngeLuE2ANqbMap LJQg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=HuLyuMU42sGh1fXMH20agcBjKGYt8amXpumK5Mpct/c=; b=Hpq/XaZ45qik3sW+7fqCz8YuMZTI6E/6qmNtPnK2TGkGRkJH/7OaeuqK30dlIpnKfv UOimESfExv35Sg44xuUwHBZLMUmofqrlE/paEernPob/VYPq/YGxWJR9q08QllVY33DR qdQpoNLeRaIvw3JBcpAHKgl7XAX/tfEDhXN4eF4D+UuzFelj6Nj7f89qQPHavTNumioD XjVNzCwpgYrEq5CAEqTPDW2UQwvCNc6y8ey6dAbmlfWZdKaZutrwSItq5NLofZMjwDNe IKu3RhE+Yr46G41S09zu/mCbGYC3NnjOxMbzge2fFxA9exNdjQOJsCiGiZpo+TBRNk7n vvMw== X-Gm-Message-State: AOAM532bpGd3m5SpTAgg+wcAlZ6yIhZnVzi+b6xFutB5/wegNyykpwA6 Gm9/CFWyqT/+EuDNS32czuZ9nnYhOXcmFw== X-Received: by 2002:a05:6512:3095:: with SMTP id z21mr13264543lfd.587.1623107067084; Mon, 07 Jun 2021 16:04:27 -0700 (PDT) Received: from localhost.localdomain (84-217-56-54.customers.ownit.se. [84.217.56.54]) by smtp.gmail.com with ESMTPSA id v9sm1999563ljv.131.2021.06.07.16.04.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Jun 2021 16:04:26 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Tue, 8 Jun 2021 01:03:40 +0200 Message-Id: <20210607230414.612-2-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20210607230414.612-1-dcnieho@gmail.com> References: <20210607230414.612-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 01/35] avdevice/dshow: implement option to use device video timestamps 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: Diederick Niehorster Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: LawKKY1DGwAc The dshow plugin ignores timestamps for video frames provided by the DirectShow device, instead using wallclock time, apparently because the implementer of this code had a device that provided unreliable timestamps. Me (and others) would like to use the device's timestamps. The new use_video_device_timestamps option for dshow device enables them to do so. Since the majority of video devices out there probably provide fine timestamps, this patch sets the default to using the device timestamps, which means best fidelity timestamps are used by default. Using the new option, the user can switch this off and revert to the old behavior, so a fall back remains available in case the device provides broken timestamps. Closes: #8620 Signed-off-by: Diederick Niehorster --- libavdevice/dshow.c | 1 + libavdevice/dshow_capture.h | 1 + libavdevice/dshow_pin.c | 15 ++++++++------- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/libavdevice/dshow.c b/libavdevice/dshow.c index 8d0a6fcc09..2e9f9ddf3f 100644 --- a/libavdevice/dshow.c +++ b/libavdevice/dshow.c @@ -1317,6 +1317,7 @@ static const AVOption options[] = { { "audio_device_save", "save audio capture filter device (and properties) to file", OFFSET(audio_filter_save_file), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, DEC }, { "video_device_load", "load video capture filter device (and properties) from file", OFFSET(video_filter_load_file), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, DEC }, { "video_device_save", "save video capture filter device (and properties) to file", OFFSET(video_filter_save_file), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, DEC }, + { "use_video_device_timestamps", "use device instead of wallclock timestamps for video frames", OFFSET(use_video_device_timestamps), AV_OPT_TYPE_BOOL, {.i64 = 1}, 0, 1, DEC }, { NULL }, }; diff --git a/libavdevice/dshow_capture.h b/libavdevice/dshow_capture.h index 06ded2ba96..5a2691518c 100644 --- a/libavdevice/dshow_capture.h +++ b/libavdevice/dshow_capture.h @@ -312,6 +312,7 @@ struct dshow_ctx { char *audio_filter_save_file; char *video_filter_load_file; char *video_filter_save_file; + int use_video_device_timestamps; IBaseFilter *device_filter[2]; IPin *device_pin[2]; diff --git a/libavdevice/dshow_pin.c b/libavdevice/dshow_pin.c index 3dae405e65..ab0ead8041 100644 --- a/libavdevice/dshow_pin.c +++ b/libavdevice/dshow_pin.c @@ -309,12 +309,16 @@ long ff_dshow_meminputpin_Receive(DShowMemInputPin *this, IMediaSample *sample) if (!sample) return E_POINTER; + priv_data = pin->filter->priv_data; + s = priv_data; + ctx = s->priv_data; + IMediaSample_GetTime(sample, &orig_curtime, &dummy); orig_curtime += pin->filter->start_time; IReferenceClock_GetTime(clock, &graphtime); - if (devtype == VideoDevice) { - /* PTS from video devices is unreliable. */ - IReferenceClock_GetTime(clock, &curtime); + if (devtype == VideoDevice && !ctx->use_video_device_timestamps) { + /* PTS from video devices is unreliable. */ + IReferenceClock_GetTime(clock, &curtime); } else { IMediaSample_GetTime(sample, &curtime, &dummy); if(curtime > 400000000000000000LL) { @@ -322,7 +326,7 @@ long ff_dshow_meminputpin_Receive(DShowMemInputPin *this, IMediaSample *sample) like 437650244077016960 which FFmpeg doesn't like. TODO figure out math. For now just drop them. */ av_log(NULL, AV_LOG_DEBUG, - "dshow dropping initial (or ending) audio frame with odd PTS too high %"PRId64"\n", curtime); + "dshow dropping initial (or ending) frame with odd PTS too high %"PRId64"\n", curtime); return S_OK; } curtime += pin->filter->start_time; @@ -330,9 +334,6 @@ long ff_dshow_meminputpin_Receive(DShowMemInputPin *this, IMediaSample *sample) buf_size = IMediaSample_GetActualDataLength(sample); IMediaSample_GetPointer(sample, &buf); - priv_data = pin->filter->priv_data; - s = priv_data; - ctx = s->priv_data; index = pin->filter->stream_index; av_log(NULL, AV_LOG_VERBOSE, "dshow passing through packet of type %s size %8d " From patchwork Tue Jun 8 10:47:38 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Diederick C. Niehorster" X-Patchwork-Id: 28166 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:b214:0:0:0:0:0 with SMTP id b20csp4279458iof; Tue, 8 Jun 2021 03:48:03 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzETY0Fd+G77yULnDjaR/fRD/kgXMcFzYo87NRgVx5XIb98TtS9lrm/QAxLJ86mZIBcDnI+ X-Received: by 2002:a17:906:19d0:: with SMTP id h16mr22952997ejd.193.1623149283248; Tue, 08 Jun 2021 03:48:03 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1623149283; cv=none; d=google.com; s=arc-20160816; b=M2qIqWlAaFlINE01Kouh1AA8PiSPmCJPlEbE3jOKBzd2p4ke5+REi5D6uoMTfA1/2N Q//3ESxGW19MdgAMHOmO44YowtCMETx0wNulVCcqg6Xtv11MYlBD/JCazBlizWIGfmMs 10JgQ+/85on/ilC9bUx+X0qEOaGP0UpckayZPNSjc7435Gz9eCdhwABjgHm+8kAsTdFZ R+fcKF0oN70MlMk7x3SWSR9e60JZacwmTtO9prbEtRF5ufG0ux1+I+HEQRShHLya0mth tKtS3LT4MUKPrrNQi2+9MWh0qVb2mfLv5UHLO/4oUBsU2KuOrvGIkDRoarvB2fkqymm3 xeng== 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=y89IWCDtNEdg82+DPT3uAlsVAZPx1zB1cADW/vCIeUI=; b=E2cABA3R/EPTQSg32M7O87gfLQ5yjt3FFcXvFmE5OoVJSOoLkYetsBDzauJD9vvzZH 3BFmZAlSRxi/XF1XWcN46QEgRQPJ2fmIyz7cH6BVQ8A5PeqyPb2dZ3jxOI9rTRwZioij natIrzki6xrAlzICOgTsyCKkwX0M9vnRsw/OGz/dsL3JUofl8jmeubHcR5CfXJxB4xT/ /x4nVw93841noy5n7PS6+bUKFHb5n7faYpIZpOU0WXLyJiv1VVgwE7ZsXpbmB6bntgNe /pSxFalnXqnAvRHaa32OkoSRLpRUgYMrRRpICT3jR8zhSXi1kRmj34OimGrU+449U0IH ogIg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=dc85eRTR; 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 jz3si14963483ejb.9.2021.06.08.03.48.02; Tue, 08 Jun 2021 03:48:03 -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=20161025 header.b=dc85eRTR; 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 AF71E680990; Tue, 8 Jun 2021 13:48:00 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lj1-f182.google.com (mail-lj1-f182.google.com [209.85.208.182]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 7A5DA6802FF for ; Tue, 8 Jun 2021 13:47:53 +0300 (EEST) Received: by mail-lj1-f182.google.com with SMTP id bn21so26403536ljb.1 for ; Tue, 08 Jun 2021 03:47:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=mAEjrl7hEHQBcrq0yJPFwd642liMEhpSRVnsQ9bOCMY=; b=dc85eRTRqYIZNUIygC+o31XOdo2kLdXqYdIAthJq4NARAbz8fkb8wgfR4E5OdLXkrC n38LWypLTvFB1EsvSomxdkzK4hkbR6s3sZgbaDHdxwkd5h1kKghh9ZoLGQEmZgwzIZ77 CuB0Ev8IVUVaWGYC9rQo31+DbnqXtDeJHNtalyAlMegYetIaVwIKVCY3yFtcSap+pNAo 5yQiG/HhpSgSjX2CDaIU06iG1TfJQOyGSwSUEE9Z6T3DlJJvmNynufFodHLLpxsBTvY1 ZvgEurYHaeWL+E1OJiygaJvk/f53fwyRlWxBNcmJAahL8btpvzr7u2gVndlVi1ieykUj ophg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=mAEjrl7hEHQBcrq0yJPFwd642liMEhpSRVnsQ9bOCMY=; b=oBHaCiOS7Sk4TJYHjfOW7W5FJPNlmKG79O7HSUYNZx0LKDY4DutPr3qPTO9rkZN3Et hcoQiBKE7/N3WfJdWdFjc7ZDMWQ1lFx5CAmpcfImBHYCDX+ADpR9FtmfsTDvsil8mwz+ r0JjzPkIbpaaELhUrmKKEZ12tnCm7btsUbAxQSKYKn/sVOs82WIkkPDifoVE5ElM+WA4 mlWLIvRpDfk8mu1Hwot6pAHwOdpZxPBHIzVk7WjPBweh2E6PMJh7ayFiiUMeXToFPK8G bNLnQELc6CE0OMZZXFLi80RYgrsJ9kUKw9EQ001pJN9qSRGYJifP1lMt9n6XHTkyi6KF /ikg== X-Gm-Message-State: AOAM531xafmbV57Q8K4kUjbkjF0HdkQ7epFoZD8JiWBWPjUUaychP55W aGcKuvi9vgnsaTB/IbzYawwXuVY9tPo= X-Received: by 2002:a2e:9b54:: with SMTP id o20mr4031864ljj.449.1623149272565; Tue, 08 Jun 2021 03:47:52 -0700 (PDT) Received: from localhost.localdomain (eduroam-employee-08.wireless.lu.se. [130.235.240.8]) by smtp.gmail.com with ESMTPSA id t12sm1111932ljk.116.2021.06.08.03.47.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 08 Jun 2021 03:47:51 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Tue, 8 Jun 2021 12:47:38 +0200 Message-Id: <20210608104738.773-1-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20210607230414.612-1-dcnieho@gmail.com> References: <20210607230414.612-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 02/33] avdevice/dshow: add use_video_device_timestamps to docs 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: Diederick Niehorster Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: 9nBI65JkGBB3 Signed-off-by: Diederick Niehorster --- doc/indevs.texi | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/doc/indevs.texi b/doc/indevs.texi index b377924c2f..685b1357a6 100644 --- a/doc/indevs.texi +++ b/doc/indevs.texi @@ -611,6 +611,12 @@ Save the currently used video capture filter device and its parameters (if the filter supports it) to a file. If a file with the same name exists it will be overwritten. +@item use_video_device_timestamps +If set to @option{false}, the timestamp for video frames will be +derived from the wallclock instead of the timestamp provided by +the capture device. This allows working around devices that +provide unreliable timestamps. + @end table @subsection Examples From patchwork Mon Jun 7 23:03:42 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Diederick C. Niehorster" X-Patchwork-Id: 28153 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:b214:0:0:0:0:0 with SMTP id b20csp3891172iof; Mon, 7 Jun 2021 16:12:41 -0700 (PDT) X-Google-Smtp-Source: ABdhPJywyElXyevZo71ScMIbE6kzs572yuR5HHogXES4PD0LD+UTgE8LB/M0cJ8sRhHERjR3Wx2J X-Received: by 2002:aa7:d755:: with SMTP id a21mr22732427eds.146.1623107561220; Mon, 07 Jun 2021 16:12:41 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1623107561; cv=none; d=google.com; s=arc-20160816; b=x4D8aaclw78Vk/RHBPx1AQgYxTmtholqlZhexug02CUqFp5LNsqJkYhWKfLjfJ704t +G/qx+jvuBOiwMd63Wr2lUmrUAGu3jepCDJSaSRkZAa66kbcX2dbngyrNmyv1+QRQO7+ GyxpHOeMTu0yJoJVFlQl/i3Gglz3SgWL1VJ14lsc45D4bxfZ8MNNYPFXzlEsGh+rIPTx i3/dvp40D4WTl2WA7MteagpQxAy49iOyh6s7+dP1mx/H513ypEzdSjVu9dbRTHHmJWVG /Giv2AoBq3lX3t7mKBD80vKvUi6Z+6TATdmMTU6BYDXjkiPDYaevUdmrf49cVoooM2S+ rMeA== 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=aaMH+qt3GozJrxSuAMoOXCF/VLBYSwoL0o/ticBRciY=; b=iSoGfdPOBxEqIthNjYur8RLT/xtW4EcmGkcMJZTBx6izacugRnbVMxyUrETCRHWEbW Ou3iVbMMHxe/WCzCT9eX9Fa7K77Ic/Wspyac1qEE3gjIJ6XmPbnk6XJEGyefsDhpgRb1 0nOmQfXZVHq3/chv6uifRH3JcxhEYLeZQ5lPn01nbiPV7QCmDAnq/v/5nmjivnhW0Wg8 CMb8DAFsnnyWATkh6hdMEJOaLu92lRBo/oEqjRiw6Ujegnv/KGxTiMQAivhAc5Hh5PVp +UpdlSmVIA1nvMbpXzbUZCgvRXT5mB+xr9kDWohxd3Jd+f/l3N3+w5w/GhmmrJa4XTrw iJWg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=ecrRTV0F; 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 v11si13155404edx.139.2021.06.07.16.12.40; Mon, 07 Jun 2021 16:12:41 -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=20161025 header.b=ecrRTV0F; 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 B8FB768979B; Tue, 8 Jun 2021 02:12:38 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f47.google.com (mail-wr1-f47.google.com [209.85.221.47]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 2DC4D680524 for ; Tue, 8 Jun 2021 02:12:37 +0300 (EEST) Received: by mail-wr1-f47.google.com with SMTP id q5so19430866wrm.1 for ; Mon, 07 Jun 2021 16:12:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=+/0FysBxSdwFGrBRyG5wiqWrNxXJfirYCGv3vtM9eOc=; b=ecrRTV0FW2nzhCpzHHHiOGPhVBnE6VRlLsX3iRmWKl7Ej2HBOHcJ2eiegYyqSsnWwg 1hrzcpW7lkpXlIoq9N6bH5j8ipjTViBJrsqtWIBGm0EKlQ0+d/RANJqI+VJCdXP0NWFn noqP0WV2nelmS1jQeNa1h5LldlWT8W5NYL0AyRESmOizkhHN+KXU+BXXGgTN3ut0JOgq 1I1CfwhLiJ9CkNTiGmoBFqQKSwc1Ij3C5yfqGUP9+LwcFlFM8CwDLf2F75/C/OCY1GM8 +kvLgQNdDhMDE/wGE9ta55MTWIR/ZgSse/5ZnkqJTRmbeEaCWCaAJswgmAG2Tlcjkd4n pwKA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=+/0FysBxSdwFGrBRyG5wiqWrNxXJfirYCGv3vtM9eOc=; b=kXCkDKFUUM/yDVsP2hUBYyU4MkygnC+wBWE4cmKU04DP2tmLBfLi2lEAQDF8Of7VVI oehLOPtfMDKyfr3AzpqyCDsDIsjXmRmAAW2O+6FUHx03ayjQMIHGNg8kz9tEq92Yz8hD AB7mmdF/PQQAyMhtg9eCMPezLMF6706U9yJ+ZvL81KUjOi/GzBwqQWqDEyKW/hnjthJ5 Ac7KGlE+SiCv2bvFnAfdTSCg6D7yeWgdPrvM6GchN0TAZNGocPb3p5m1CagjK3v31tBZ Gt3LY7onYfaOMrgQPSB1TDriSY4nv1rZ0c93ELwGsGj95A/JBWSYLTz767dvNVgvjCtH 0BXA== X-Gm-Message-State: AOAM530ricLiVgUG94szlpnDdcwOor2Zeb6sBBkjbb7UNBSVuuz+mVBu xPG9Go/MJeEIyTPTlWY8z1cbY0+Vn3jUjw== X-Received: by 2002:a05:6512:38cd:: with SMTP id p13mr12887958lft.419.1623107069425; Mon, 07 Jun 2021 16:04:29 -0700 (PDT) Received: from localhost.localdomain (84-217-56-54.customers.ownit.se. [84.217.56.54]) by smtp.gmail.com with ESMTPSA id v9sm1999563ljv.131.2021.06.07.16.04.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Jun 2021 16:04:28 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Tue, 8 Jun 2021 01:03:42 +0200 Message-Id: <20210607230414.612-4-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20210607230414.612-1-dcnieho@gmail.com> References: <20210607230414.612-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 03/35] avdevice/dshow: query graph and sample time only once 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: Diederick Niehorster Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: gvcHuCt5Umus No need to query twice, use value we've already unconditionally got. Improve variable names Signed-off-by: Diederick Niehorster --- libavdevice/dshow_pin.c | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/libavdevice/dshow_pin.c b/libavdevice/dshow_pin.c index ab0ead8041..1d0e880480 100644 --- a/libavdevice/dshow_pin.c +++ b/libavdevice/dshow_pin.c @@ -295,9 +295,10 @@ long ff_dshow_meminputpin_Receive(DShowMemInputPin *this, IMediaSample *sample) uint8_t *buf; int buf_size; /* todo should be a long? */ int index; - int64_t curtime; - int64_t orig_curtime; + int64_t chosentime; + int64_t sampletime; int64_t graphtime; + int use_sample_time = 1; const char *devtypename = (devtype == VideoDevice) ? "video" : "audio"; IReferenceClock *clock = pin->filter->clock; int64_t dummy; @@ -313,24 +314,27 @@ long ff_dshow_meminputpin_Receive(DShowMemInputPin *this, IMediaSample *sample) s = priv_data; ctx = s->priv_data; - IMediaSample_GetTime(sample, &orig_curtime, &dummy); - orig_curtime += pin->filter->start_time; + IMediaSample_GetTime(sample, &sampletime, &dummy); IReferenceClock_GetTime(clock, &graphtime); if (devtype == VideoDevice && !ctx->use_video_device_timestamps) { - /* PTS from video devices is unreliable. */ - IReferenceClock_GetTime(clock, &curtime); + /* PTS from video devices is unreliable. */ + chosentime = graphtime; + use_sample_time = 0; } else { - IMediaSample_GetTime(sample, &curtime, &dummy); - if(curtime > 400000000000000000LL) { + if (sampletime > 400000000000000000LL) { /* initial frames sometimes start < 0 (shown as a very large number here, - like 437650244077016960 which FFmpeg doesn't like. + like 437650244077016960 which FFmpeg doesn't like). TODO figure out math. For now just drop them. */ av_log(NULL, AV_LOG_DEBUG, - "dshow dropping initial (or ending) frame with odd PTS too high %"PRId64"\n", curtime); + "dshow dropping initial (or ending) frame with odd PTS too high %"PRId64"\n", sampletime); return S_OK; } - curtime += pin->filter->start_time; + chosentime = sampletime; } + // media sample time is relative to graph start time + sampletime += pin->filter->start_time; + if (use_sample_time) + chosentime += pin->filter->start_time; buf_size = IMediaSample_GetActualDataLength(sample); IMediaSample_GetPointer(sample, &buf); @@ -338,8 +342,8 @@ long ff_dshow_meminputpin_Receive(DShowMemInputPin *this, IMediaSample *sample) av_log(NULL, AV_LOG_VERBOSE, "dshow passing through packet of type %s size %8d " "timestamp %"PRId64" orig timestamp %"PRId64" graph timestamp %"PRId64" diff %"PRId64" %s\n", - devtypename, buf_size, curtime, orig_curtime, graphtime, graphtime - orig_curtime, ctx->device_name[devtype]); - pin->filter->callback(priv_data, index, buf, buf_size, curtime, devtype); + devtypename, buf_size, chosentime, sampletime, graphtime, graphtime - sampletime, ctx->device_name[devtype]); + pin->filter->callback(priv_data, index, buf, buf_size, chosentime, devtype); return S_OK; } From patchwork Mon Jun 7 23:03:43 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Diederick C. Niehorster" X-Patchwork-Id: 28161 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:b214:0:0:0:0:0 with SMTP id b20csp3889792iof; Mon, 7 Jun 2021 16:10:35 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwPWBmKZjem26BeOChreQW9eHYQQgNsMzoHBBPolELT5Nu9hcpZ6jqqdBQpvxZyKGurnMzs X-Received: by 2002:a17:906:394:: with SMTP id b20mr20099529eja.108.1623107435005; Mon, 07 Jun 2021 16:10:35 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1623107435; cv=none; d=google.com; s=arc-20160816; b=G37nJEIdPS3VvfwsMYgE7E6ZimXohll7QWkaVAlq6MCQbgJ7HPJZS9h7vMZsufw5MB dTJef2qEf+Z4No2spO+ZXfgkY/lgyCrcZ/SFg1JBSRjR0PpbwQvZlwCBxFADFdMkiHY9 eAZ/98s9cORVHjPepQG3MfJLzFOS/v63yheIn7S36oxhWl57y8AIVgdklO8pvwrQ0q7S gc69TazresWZWu6WzjdsboN1lGGksbs/603ouK/aTd+osK86UBoXw7lo7fbZg6WHIoZo ZVQk83PFlCLyA2hBC919i6kQZCGHNZEtKAl501e2uhP00IuyygroLcL0FjnfDpobovhq S8zQ== 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=+ebHyRTijEqfyQAbEzNZ8SxGuXZab4wxBcIeLGIELv8=; b=x6kXN+l4J9Ny+932n8mcCmcaRoQCEcY5rMxhgBsGodO1lwmWmi8rw/Vjf63xmuFzcu QGT3AXKImYCkGl1j0DiCvoTS0+O07Tf6O+fWrmsOpTySUU3HS5Hguca5zIlY2mwyuehw ZMNPbKqRkadFm519HapKZD8vBCO/8Lhw3TVKRjsmUDZDSB4hwotZd8vc+aKjuNEJO3bS epajWuBlw1yZkzjxYj5lqd1nibrBw4cZu5DN3476D+ca5ziXb+CcEvSKYuX8YU1T2Yq3 hGWLEdUPaggjF0HRFxotQsLSv3asxh93z25B6nlZn0taXEGFYVLHDf+CPnru7v4oDXZc z+Vg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=jT7W2e1M; 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 r7si6829148edd.2.2021.06.07.16.10.34; Mon, 07 Jun 2021 16:10:34 -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=20161025 header.b=jT7W2e1M; 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 415AB687F3D; Tue, 8 Jun 2021 02:10:24 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lj1-f182.google.com (mail-lj1-f182.google.com [209.85.208.182]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 8E4366818DB for ; Tue, 8 Jun 2021 02:10:22 +0300 (EEST) Received: by mail-lj1-f182.google.com with SMTP id r16so5257278ljk.9 for ; Mon, 07 Jun 2021 16:10:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=vM85fUiUmL5WPImQHPYnayxMXdiC3qAvMR9o+8z2els=; b=jT7W2e1MhvA1N1aMBH0IkhnpeqRgWNeHpgwP5lOwEi/Rg8XU80SPCxtrluuMYpyJio pXeYjdad5aP8pu6fp2y0IzAo3dhF/Nqfll0F663TZvyG3La3vZpeuqmnH2xeOYHzoyox f4kepzU+r+bQsZFFMtPsBv1iEtGF6UcA1dustqxC1A6HcX0W99p57r2/Z65qBTEnLRrg RdSb7CfZFvk2YDjaG4S1C7VxdU49rQw38gKA05Xe7uuzDqV8EmSkNkHwW89Lud+7EGHp 0gxJ5O0w0VnLs2Muf2SM/R1mevABU6ujAsZzj7wnfEU7pUi6ekMnTvhN659HlvYw8yIW 11rg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=vM85fUiUmL5WPImQHPYnayxMXdiC3qAvMR9o+8z2els=; b=NTkh3vaQEr8j+Vuko9MaACFX2RXDFt5eU3iZpfrcT4l8RvGr1ZjEJyXDL2iy5toMfn xmgZM+h6evrH3vEUwQ+r/X4Jrs1gaBh/isHiYcwUmbO1o48QhcKetwdxlz9ftrwN9dHt sYijpqY0Y94PLqVq1eFM9jLqxcW2Pcz27cH1vrWrmpUwc6aSTdGiLULC3KyVnfQsU+h9 9LfRpNecT1q8KWg4A5GS0WP3Aoxv+Je/NDy+V4w7AlBAb6Plrmrs4XrzK0GqgLAOb7+G SidqNQfbxUa6L1jsBgjRlvl4jR8CCPBN78MjO7m/DYa3qfZah0IJJuK0MEtJFFt61uXo HQHw== X-Gm-Message-State: AOAM533FnCYHN1cjYN/+WKd7Z50w4u7dumCvLeEh0nGQhT8le+LRn9i/ Z84c1cuSvjlCZEVMDWe5bzmld4kp0ncLsw== X-Received: by 2002:a05:6512:2397:: with SMTP id c23mr13391658lfv.114.1623107070393; Mon, 07 Jun 2021 16:04:30 -0700 (PDT) Received: from localhost.localdomain (84-217-56-54.customers.ownit.se. [84.217.56.54]) by smtp.gmail.com with ESMTPSA id v9sm1999563ljv.131.2021.06.07.16.04.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Jun 2021 16:04:30 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Tue, 8 Jun 2021 01:03:43 +0200 Message-Id: <20210607230414.612-5-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20210607230414.612-1-dcnieho@gmail.com> References: <20210607230414.612-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 04/35] avdevice/dshow: handle unknown sample time 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: Diederick Niehorster Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: P0LKlNxF1w2C GetTime may return an error indication that the sample has not timestamps, or may return a NULL start time. In those cases, fall back to graph time better debug message in case sample dropped: could now be audio or video frame Signed-off-by: Diederick Niehorster --- libavdevice/dshow_pin.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/libavdevice/dshow_pin.c b/libavdevice/dshow_pin.c index 1d0e880480..310f48c85e 100644 --- a/libavdevice/dshow_pin.c +++ b/libavdevice/dshow_pin.c @@ -295,14 +295,15 @@ long ff_dshow_meminputpin_Receive(DShowMemInputPin *this, IMediaSample *sample) uint8_t *buf; int buf_size; /* todo should be a long? */ int index; - int64_t chosentime; - int64_t sampletime; - int64_t graphtime; + int64_t chosentime = 0; + int64_t sampletime = 0; + int64_t graphtime = 0; int use_sample_time = 1; const char *devtypename = (devtype == VideoDevice) ? "video" : "audio"; IReferenceClock *clock = pin->filter->clock; int64_t dummy; struct dshow_ctx *ctx; + HRESULT hr; dshowdebug("ff_dshow_meminputpin_Receive(%p)\n", this); @@ -314,22 +315,26 @@ long ff_dshow_meminputpin_Receive(DShowMemInputPin *this, IMediaSample *sample) s = priv_data; ctx = s->priv_data; - IMediaSample_GetTime(sample, &sampletime, &dummy); + hr = IMediaSample_GetTime(sample, &sampletime, &dummy); IReferenceClock_GetTime(clock, &graphtime); if (devtype == VideoDevice && !ctx->use_video_device_timestamps) { /* PTS from video devices is unreliable. */ chosentime = graphtime; use_sample_time = 0; } else { - if (sampletime > 400000000000000000LL) { + if (hr == VFW_E_SAMPLE_TIME_NOT_SET || sampletime == 0) { + chosentime = graphtime; + use_sample_time = 0; + } + else if (sampletime > 400000000000000000LL) { /* initial frames sometimes start < 0 (shown as a very large number here, like 437650244077016960 which FFmpeg doesn't like). TODO figure out math. For now just drop them. */ av_log(NULL, AV_LOG_DEBUG, "dshow dropping initial (or ending) frame with odd PTS too high %"PRId64"\n", sampletime); return S_OK; - } - chosentime = sampletime; + } else + chosentime = sampletime; } // media sample time is relative to graph start time sampletime += pin->filter->start_time; From patchwork Tue Jun 8 10:48:49 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Diederick C. Niehorster" X-Patchwork-Id: 28168 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:b214:0:0:0:0:0 with SMTP id b20csp4280144iof; Tue, 8 Jun 2021 03:49:19 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzUFZrXE1ZcLgKOv45eUYhXUYLRAxvZ5tFCHwjOXQMY5wmLjtzDI+/ptYVVSRm7FBh54tct X-Received: by 2002:a05:6402:26c2:: with SMTP id x2mr16108650edd.124.1623149358966; Tue, 08 Jun 2021 03:49:18 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1623149358; cv=none; d=google.com; s=arc-20160816; b=Cj4BZhbrUrlWVYoCzl+W3v+s9xchwsCEUx4soTJlwJz+ghxKoZctDJTuylE7qkukxX y2QbGUsSUiMUDlStiyyhG5wqAqC6QuFJ2VJ16f2DL6MujRi36ToNqAhb93EpCtqE0z79 0Oi7J8g4Gu6NESu/WbiNa2gWR30Rdiq+WTh+uQy9rYWRfaSD9LBTxNpGnKqklhczKwRG 4qadDs31oQNoifnO11eLxuBhAp7lKTVOrIpkQZBYWRfnQGiLsu2KSLWnDN/wI/dPpT3F 34iAdVuo1ePWuykoYTCFfOdENo0IFrfUaaNchg/G8kGf9WbxhA0GLM7sdlC2R1iqy2jZ 13MQ== 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=+ORDt7QsIkHrduN6ffwTvhvZmVN4JSMFgki1d0WqEAU=; b=JkFRAdGtKZa9f1W81jpyIoLXQW0uA1TQFz+qimDxnEt45aE5BlDiBBUTlclCME0qV+ G1jLtVs1EvnEzL8OtF3qtGeCDQ0Te/+xXl97fJei+QLYikc1OucLySIl+EYT6gclsDM9 WF9aArx08CCIfMWWJXGYcdHuXWvvf99y3rN9t0wE4yWRt6vrL6cXACOUZKTs/F1wJ9Bh nGPnIh7Ld7UFKfrj2Cm5IdpOmdT0oKus6WmT93uOG8NqLIP6ozOwTO0xPHaj7yOZvfkI cnJdX+UKPb6JeG7JYeabEqch9damwg6uxftV4Xq63GQGuRYKTiEp3dFqwktH+ZAQd8Ra XzrQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=B2GugXbi; 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 e8si15299042edy.573.2021.06.08.03.49.17; Tue, 08 Jun 2021 03:49:18 -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=20161025 header.b=B2GugXbi; 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 C8FD7680910; Tue, 8 Jun 2021 13:49:15 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lj1-f179.google.com (mail-lj1-f179.google.com [209.85.208.179]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id CD5A16802FF for ; Tue, 8 Jun 2021 13:49:08 +0300 (EEST) Received: by mail-lj1-f179.google.com with SMTP id r16so7215248ljk.9 for ; Tue, 08 Jun 2021 03:49:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=IdfTEkOwKy3kOStZMzn++FqcVYTGE2dLKFflvDdgHdY=; b=B2GugXbiPHxIrlMWKevDRW7n65TdO/HnkyekVsvDqzBN2XEwpb2krCQG4fZBEihs+T rgfsTy0thG1t4EmZeqg6UjxJWvKmKnGE2uyG7pCROGvd4p1hV3PWFo3oJTW+pzHxKS8i Y6hZ6KCJA/y5Is/k3QB+RG/48wpo7bbkXJKUBKLk/iS0AA72kTLdHcJQmFpvH+zahLbE 90yf4uFzVk2bKH+4r4r0k1ALJGJ1XTknwOab+mxSvdQIHQqvq/wwNLyfDkm9BtOCSOy6 HbINa6h1J522FzIUdhFmS0CWNTgRMUPs4fXJ3kQRGBKEH9igARMEs7PMPi9RKTLDlMaE cMVg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=IdfTEkOwKy3kOStZMzn++FqcVYTGE2dLKFflvDdgHdY=; b=a6/KP/+ap8UdLf3y7XkdaBuBAy7SjcILi1H7MU/DsGcw41vzsplErbCuMFXDaOJtfg jiLAYJR8qD83XuRV59kATNYWzcwH7zEvDD3PzxIfSPV1i4QuGEzUcNjGja+FQrmSOZeD ENUbNRdqxhEzzNOz5i5v6LPIL8Aells3Qxm0UwuxV0Orh4ZcYAXITuDcU4DLgN8pQKKx GHBNpQmqx6I+3NCne3eU7qlw1VeXZkuQDbULstzm739TRBulXaVrZZE9h8fcAwcUt+m7 p3X0pyMsnjug2JR3ZzwYNaC9FDwtcBMPX0eBzjXJ2yUw63STFcbgR60Mvip/r8iphyJJ YSTA== X-Gm-Message-State: AOAM533CEoPPa9OkV2Gvm16HdDDVeyqu5z2VauZvcMfXq27Wc9++Z8Ep ON74QIEepsjF/5ba74qaLwLX/rzsUws= X-Received: by 2002:a2e:3c0c:: with SMTP id j12mr13448233lja.131.1623149347958; Tue, 08 Jun 2021 03:49:07 -0700 (PDT) Received: from localhost.localdomain (eduroam-employee-08.wireless.lu.se. [130.235.240.8]) by smtp.gmail.com with ESMTPSA id m9sm2223964ljh.6.2021.06.08.03.49.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 08 Jun 2021 03:49:07 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Tue, 8 Jun 2021 12:48:49 +0200 Message-Id: <20210608104849.829-1-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20210607230414.612-1-dcnieho@gmail.com> References: <20210607230414.612-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 05/33] avdevice/dshow: set no-seek flags 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: Diederick Niehorster Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: zQlHJuFVVBup avdevice/dshow is a realtime device and as such does not support seeking. Therefore, its demuxer format should define the AVFMT_NOBINSEARCH, AVFMT_NOGENSEARCH and AVFMT_NO_BYTE_SEEK flags. With these flags set, attempting to seek (with e.g. avformat_seek_file()) correctly yields -1 (operation not permitted) instead of -22 (invalid argument). This actually seems to apply to many other devices, at least the gdigrab, v4l2, vfwcap, x11grab, fbdev, kmsgrab and android_camera devices, from reading the source. Signed-off-by: Diederick Niehorster --- libavdevice/dshow.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libavdevice/dshow.c b/libavdevice/dshow.c index 2e9f9ddf3f..389daa6380 100644 --- a/libavdevice/dshow.c +++ b/libavdevice/dshow.c @@ -1336,6 +1336,6 @@ const AVInputFormat ff_dshow_demuxer = { .read_header = dshow_read_header, .read_packet = dshow_read_packet, .read_close = dshow_read_close, - .flags = AVFMT_NOFILE, + .flags = AVFMT_NOFILE | AVFMT_NOBINSEARCH | AVFMT_NOGENSEARCH | AVFMT_NO_BYTE_SEEK, .priv_class = &dshow_class, }; From patchwork Mon Jun 7 23:03:45 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Diederick C. Niehorster" X-Patchwork-Id: 28152 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:b214:0:0:0:0:0 with SMTP id b20csp3889603iof; Mon, 7 Jun 2021 16:10:17 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxAAq1uWvSd7AvF0I9jspfRaGZOaZai2fitxk8/ukfIMmSnQIaNpCHWofKPmGjbdxE4xRcE X-Received: by 2002:a17:906:3b87:: with SMTP id u7mr20486231ejf.548.1623107417370; Mon, 07 Jun 2021 16:10:17 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1623107417; cv=none; d=google.com; s=arc-20160816; b=yKfXz1BaqflGrxoETmnXSKFgDckUYtUz7oiohsSo07grlHRngfnq0zlaGIYi2dbpkX tZteI9OH2ikYY9a+CM4+ACi+PLT1EF0mITfrd+zDQYORDiumAW37bJ4nB4aZgWImM5Hp V9yk+ZrZ29ECMreCu3ovLVH2KQ62kOx9dtzQVd0lsZHvurMmALg7N+ERUfCCE8ANE9iW 9KjsiCdT7BW2a7sU/LMnE73BMUq2ySyTotvfcGEk/Jlip1Fnw19zzRX+WGTgZjZ/HIcS cV1Y1mwE+n2BHgCDbTfZ3159B7Su2/qQ//kj27IOUVmXtHp3KTrhH01jQ4mwmsbnkdKT cYZg== 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=c58zCNFxeu/uoUmlzUOM1hC3IXccJZaE5xrwkjZOTxc=; b=tRdnltGSSWoMw9z882PquprilgkXdkVePSnsasPeAQmhMwIhwbOnIrLNJwibkxsj6Y osd0L068j/L+OFEQdn0++0cpeSV92IHaEFx8G+yzLCAEI0/oudZAyyvLAAV3XB7t5GQk LeyY9RhbEwO2I697qNmFF2rzQikhjPUtumGrd+GhnRNkJ9ufN7zMdrLMmKACDYbzOmHh YHtWjCBHSQHFQy2p3dbpwOjXzAAVi63Y8rjWhIFzWx8xoPgqfOj3vAh5giQcUw3k4O5E huSw5uE6CHL4M7XjaGdSC7ZOTm6E7aWY1Vm9zcEAy9c4t7WNlzdhFFG0ESDrxFDhpST5 grMQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b="F/FOtq9n"; 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 e1si12566510edk.506.2021.06.07.16.10.17; Mon, 07 Jun 2021 16:10:17 -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=20161025 header.b="F/FOtq9n"; 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 0DF5F6802C7; Tue, 8 Jun 2021 02:10:15 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-ed1-f51.google.com (mail-ed1-f51.google.com [209.85.208.51]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id C471D6802C7 for ; Tue, 8 Jun 2021 02:10:13 +0300 (EEST) Received: by mail-ed1-f51.google.com with SMTP id r7so7941663edv.12 for ; Mon, 07 Jun 2021 16:10:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=BrTK3X3u/wxoTVDT2kQRQncJycwAhH4CuYt0VViKbQU=; b=F/FOtq9nFWwI4v4RA375IPQjiarI3rkTav9BfmBI8dznMxuH/hJgbNEUp7zDdPg4qk Agl1BTZVr3FhU3Rfll7aiRUXe12UOJttk1YJPG2T2DUEEMMeUJCdi5YBQC0txmeo8e1X R0iIFHsHhLsvCCfQ3wGQEKNQnUeYqAa2mZOdlnL1e/JdfXn6Ct+zEFJi5YWPW0l8+fFh w/TDbpMtmlgPCFxrcMP/fnxNhFZ7nl1qdCKiM4zq02qeO1R1mIeR5L4XTguoHIAnOikA FRHsmMCwPyFPoRPHIx/QG4S/xFTVFJq6wpKLVDoTYlLQpkZYniqX8YbHeOkRcwHvl4gl 9cZA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=BrTK3X3u/wxoTVDT2kQRQncJycwAhH4CuYt0VViKbQU=; b=nxmjiSRjO5jFlYXmTL87Pu8iWxuV/pfxn1BGOJQxRvmmY4GWMw8LsU/0YWTkjIQlhe pBn1tsm9EbjpySeJXHCJqx+9YLE3JEjKyGVagzy58/XLZihcFQbiqzmbDP7rSM2oRZxQ F6rosCfo6GsxzuChRrzj3yftfZnHnR3rkG/hciycvpnTFVpu/nsnSn8BLIUSt/YHO5BZ BgcGd0xZtTIisS746pEPHPrFyJ5NEvLz4JbVD3WUc2kpRln1LMLrIs6thv12UHNTKz7O uByQv7VR3JBUekkAhrKd9G0fd17pWKbEcsozwn7NqktC+hvjrtFXsz7KJxTj/TTGzoMH U0SA== X-Gm-Message-State: AOAM530iNUJ0hjSdVWr4OWQZDvq8E1U9hoXivctApS6xSix85dLIZ3cL aTiirSHkVeCOzOgIBXVMK5Och/WcycSykw== X-Received: by 2002:a05:6512:3054:: with SMTP id b20mr5926087lfb.375.1623107072678; Mon, 07 Jun 2021 16:04:32 -0700 (PDT) Received: from localhost.localdomain (84-217-56-54.customers.ownit.se. [84.217.56.54]) by smtp.gmail.com with ESMTPSA id v9sm1999563ljv.131.2021.06.07.16.04.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Jun 2021 16:04:32 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Tue, 8 Jun 2021 01:03:45 +0200 Message-Id: <20210607230414.612-7-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20210607230414.612-1-dcnieho@gmail.com> References: <20210607230414.612-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 06/35] avdevice/dshow: implement get_device_list 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: Diederick Niehorster Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: xr9xNwaIiweG Needed to enable programmatic discovery of DirectShow devices Signed-off-by: Diederick Niehorster --- libavdevice/dshow.c | 80 +++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 73 insertions(+), 7 deletions(-) diff --git a/libavdevice/dshow.c b/libavdevice/dshow.c index 389daa6380..25de6b1acd 100644 --- a/libavdevice/dshow.c +++ b/libavdevice/dshow.c @@ -202,11 +202,14 @@ fail: * retrieve the device with type specified by devtype and return the * pointer to the object found in *pfilter. * If pfilter is NULL, list all device names. + * If device_list is not NULL, populate it with found devices instead of + * outputting device names to log */ static int dshow_cycle_devices(AVFormatContext *avctx, ICreateDevEnum *devenum, enum dshowDeviceType devtype, enum dshowSourceFilterType sourcetype, - IBaseFilter **pfilter, char **device_unique_name) + IBaseFilter **pfilter, char **device_unique_name, + AVDeviceInfoList **device_list) { struct dshow_ctx *ctx = avctx->priv_data; IBaseFilter *device_filter = NULL; @@ -238,6 +241,7 @@ dshow_cycle_devices(AVFormatContext *avctx, ICreateDevEnum *devenum, IBindCtx *bind_ctx = NULL; LPOLESTR olestr = NULL; LPMALLOC co_malloc = NULL; + AVDeviceInfo *device = NULL; int i; r = CoGetMalloc(1, &co_malloc); @@ -282,11 +286,39 @@ dshow_cycle_devices(AVFormatContext *avctx, ICreateDevEnum *devenum, // success, loop will end now } } else { - av_log(avctx, AV_LOG_INFO, " \"%s\"\n", friendly_name); - av_log(avctx, AV_LOG_INFO, " Alternative name \"%s\"\n", unique_name); + if (device_list) { + device = av_mallocz(sizeof(AVDeviceInfo)); + if (!device) + goto fail1; + + device->device_name = av_strdup(friendly_name); + device->device_description = av_strdup(unique_name); + if (!device->device_name || !device->device_description) + goto fail1; + + // store to device_list output + if (av_reallocp_array(&(*device_list)->devices, + (*device_list)->nb_devices + 1, + sizeof(*(*device_list)->devices)) < 0) + goto fail1; + (*device_list)->devices[(*device_list)->nb_devices] = device; + (*device_list)->nb_devices++; + device = NULL; // copied into array, make sure not freed below + } + else { + av_log(avctx, AV_LOG_INFO, " \"%s\"\n", friendly_name); + av_log(avctx, AV_LOG_INFO, " Alternative name \"%s\"\n", unique_name); + } } fail1: + if (device) { + if (device->device_name) + av_freep(&device->device_name); + if (device->device_name) + av_freep(&device->device_description); + av_free(device); + } if (olestr && co_malloc) IMalloc_Free(co_malloc, olestr); if (bind_ctx) @@ -312,6 +344,39 @@ fail1: return 0; } +static int dshow_get_device_list(AVFormatContext *avctx, AVDeviceInfoList *device_list) +{ + struct dshow_ctx *ctx = avctx->priv_data; + ICreateDevEnum *devenum = NULL; + int r; + int ret = AVERROR(EIO); + + if (!device_list) + return AVERROR(EINVAL); + + CoInitialize(0); + + r = CoCreateInstance(&CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, + &IID_ICreateDevEnum, (void**)&devenum); + if (r != S_OK) { + av_log(avctx, AV_LOG_ERROR, "Could not enumerate system devices.\n"); + goto error; + } + + ret = dshow_cycle_devices(avctx, devenum, VideoDevice, VideoSourceDevice, NULL, NULL, &device_list); + if (ret < S_OK) + goto error; + ret = dshow_cycle_devices(avctx, devenum, AudioDevice, AudioSourceDevice, NULL, NULL, &device_list); + +error: + if (devenum) + ICreateDevEnum_Release(devenum); + + CoUninitialize(); + + return ret; +} + /** * Cycle through available formats using the specified pin, * try to set parameters specified through AVOptions and if successful @@ -713,7 +778,7 @@ dshow_list_device_options(AVFormatContext *avctx, ICreateDevEnum *devenum, char *device_unique_name = NULL; int r; - if ((r = dshow_cycle_devices(avctx, devenum, devtype, sourcetype, &device_filter, &device_unique_name)) < 0) + if ((r = dshow_cycle_devices(avctx, devenum, devtype, sourcetype, &device_filter, &device_unique_name, NULL)) < 0) return r; ctx->device_filter[devtype] = device_filter; if ((r = dshow_cycle_pins(avctx, devtype, sourcetype, device_filter, NULL)) < 0) @@ -773,7 +838,7 @@ dshow_open_device(AVFormatContext *avctx, ICreateDevEnum *devenum, av_log(avctx, AV_LOG_INFO, "Capture filter loaded successfully from file \"%s\".\n", filename); } else { - if ((r = dshow_cycle_devices(avctx, devenum, devtype, sourcetype, &device_filter, &device_filter_unique_name)) < 0) { + if ((r = dshow_cycle_devices(avctx, devenum, devtype, sourcetype, &device_filter, &device_filter_unique_name, NULL)) < 0) { ret = r; goto error; } @@ -1130,9 +1195,9 @@ static int dshow_read_header(AVFormatContext *avctx) if (ctx->list_devices) { av_log(avctx, AV_LOG_INFO, "DirectShow video devices (some may be both video and audio devices)\n"); - dshow_cycle_devices(avctx, devenum, VideoDevice, VideoSourceDevice, NULL, NULL); + dshow_cycle_devices(avctx, devenum, VideoDevice, VideoSourceDevice, NULL, NULL, NULL); av_log(avctx, AV_LOG_INFO, "DirectShow audio devices\n"); - dshow_cycle_devices(avctx, devenum, AudioDevice, AudioSourceDevice, NULL, NULL); + dshow_cycle_devices(avctx, devenum, AudioDevice, AudioSourceDevice, NULL, NULL, NULL); ret = AVERROR_EXIT; goto error; } @@ -1336,6 +1401,7 @@ const AVInputFormat ff_dshow_demuxer = { .read_header = dshow_read_header, .read_packet = dshow_read_packet, .read_close = dshow_read_close, + .get_device_list= dshow_get_device_list, .flags = AVFMT_NOFILE | AVFMT_NOBINSEARCH | AVFMT_NOGENSEARCH | AVFMT_NO_BYTE_SEEK, .priv_class = &dshow_class, }; From patchwork Mon Jun 7 23:03:46 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Diederick C. Niehorster" X-Patchwork-Id: 28151 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:b214:0:0:0:0:0 with SMTP id b20csp3889914iof; Mon, 7 Jun 2021 16:10:45 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyC/ln4h5POg1SpOUbFzZACBcQjUlIM+JorEFYYeqksTpjCJqz4MsxBdsUE/PAqNkW4rPGF X-Received: by 2002:a05:6402:177a:: with SMTP id da26mr22524600edb.40.1623107445517; Mon, 07 Jun 2021 16:10:45 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1623107445; cv=none; d=google.com; s=arc-20160816; b=aCvDrjJp2O71rTDcM6GJoqLHBhnNgBei0BY6yzHaSI4EhmfDEMxnQfSIWo1T3U5OTx EW4eVHNnAHgtrdzy/KwgxSzrv7TOQXzqbIUkiJWQWHp8l+Qd92PyTY83zYDVM2r+pbIO pmEKGWUMLszCZg4J1gzl2GTR4uzc5uC9WuCrjuefVZvpP6L0Zh5pvXk3W+drG50k78h6 Tmb3x0qQ9pVauj5I3ajb3xG3jnPIjvxIHHLe0ykoce8Z1KRWEJTZpf5n+jDzFIDl1GXP cEudWyfxKw44sHsdF7wpQnALHEADQq62DwPRTPJSEqHeEubBB6iFQCehKZ2waVWHUDIM nstA== 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=hhFq6hp+ssRRMmGA0tLg+nF0fqnJplc57K1C7Fk+NLE=; b=YUoNec0zZOVMzkEegOJWwepkhjunSn8boALxxBnuSGmu3ODkw/1ph8LnhW7RQYOn0W HFW2eNEmlo9H+qbeatJJoJMC8xEDv5OBHnot2os4uJ2/Z0G+5LlfSAUfSzlVHfWp7zp1 B/d1I69q+J/0TrJTY0tnvnLo06kpxOnjio30pkukboHrZe5vGznFm2vbkXTw2kMEDPAM 9XqNTcXZpblD4IOgFf5yd4Jl7xTuySlGMmhPAFJFLolehiHXbwSai9m/1ciLMhm9VLRd Kio/959vMvXj6EKWVKskTnvBB21hunY8frJ5P2+jsaXHn7XQ3XewmlWdZirZJmCoSFbF cO1g== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=KccG9101; 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 q1si14024340ejy.298.2021.06.07.16.10.45; Mon, 07 Jun 2021 16:10:45 -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=20161025 header.b=KccG9101; 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 55727687FC5; Tue, 8 Jun 2021 02:10:40 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-ej1-f46.google.com (mail-ej1-f46.google.com [209.85.218.46]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id EA871680B74 for ; Tue, 8 Jun 2021 02:10:33 +0300 (EEST) Received: by mail-ej1-f46.google.com with SMTP id a11so28662052ejf.3 for ; Mon, 07 Jun 2021 16:10:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=q8yKlHTQIoC7D5SknHSClmRWbR3S6+R58ys/tpqsGFo=; b=KccG9101KnNDC/qMUSaOuAJCr8yZHsvXQPh13lLIaWcB8DEHYXGQ4u89ySO2kKVwNF LKTf4coz3CQVq5kaL4Dp4i6eKnqGU+YT/5bhDM0kpO5coAPrSzFsmuEI22t0syESJht8 +LnpRyjcko9YRx8zDA+qEIjYGe8nuRHhPlynLNpi0LmelM3SadkroeAFCR2xoaulANjz rPkZ409T/zdc1zi7IE0lKJUY/lWM4k8r9k5ZobYtq6SwtevoxSwEj5gylEfzQkV/ojs6 jNTxCG/lEvj6UJ/VN2e807U/qdEUVYRjXH0z22VTykw2ie+s1jgOJjfYbmGBt6CwJyFE Oj1Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=q8yKlHTQIoC7D5SknHSClmRWbR3S6+R58ys/tpqsGFo=; b=FoBe8SVtQBR49xmpi5UgJ9ela2Ur4UXAOFzbVSA3XMLdFseWQwIioezv/s/ekoqEh+ wB8KHcgunFbDqgZen27LKYDRztLs2mz6KAA0Zwn32wRBveiw+FamPCwdvjFeEOaZ0AOh 6iCLdyQTG7q6F1jE75oiaPKqN98JEXlncj3171Hw5St6KswQcpkgQiqQTKc+kOeuT3zC UFXFwwGBypUcA8NLscFtC5BQjAtRn34mpxGBout0JCHhGz/RaxC0mb5MQ0txQiDcpwXM /HXDeeU9SS9ZhAu6MJoDCHYSh3YENeBgXt2SGsUgWfx73ZedfppgL0JRggNO2WwHfzkY 4zgw== X-Gm-Message-State: AOAM531r9hjaxyHueRtU48ott5XWeLGih79mTzFK0xB193WoOuC05Cvf laYSJrkeBp/r8lRG7sHhH/P+D7KzWjtRig== X-Received: by 2002:a05:651c:308:: with SMTP id a8mr8012614ljp.330.1623107073697; Mon, 07 Jun 2021 16:04:33 -0700 (PDT) Received: from localhost.localdomain (84-217-56-54.customers.ownit.se. [84.217.56.54]) by smtp.gmail.com with ESMTPSA id v9sm1999563ljv.131.2021.06.07.16.04.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Jun 2021 16:04:33 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Tue, 8 Jun 2021 01:03:46 +0200 Message-Id: <20210607230414.612-8-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20210607230414.612-1-dcnieho@gmail.com> References: <20210607230414.612-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 07/35] avdevice/dshow: list_devices: show media type(s) per device 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: Diederick Niehorster Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: uAEv8rQzFM1e the list_devices option of dshow didn't indicate whether a specific device provides audio or video output. This patch iterates through all media formats of all pins exposed by the device to see what types it provides for capture, and prints this to the console for each device. Importantly, this now allows to find devices that provide both audio and video, and devices that provide neither. Signed-off-by: Diederick Niehorster --- libavdevice/dshow.c | 103 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 98 insertions(+), 5 deletions(-) diff --git a/libavdevice/dshow.c b/libavdevice/dshow.c index 25de6b1acd..5d7f065a8c 100644 --- a/libavdevice/dshow.c +++ b/libavdevice/dshow.c @@ -197,6 +197,79 @@ fail: return; } +static void dshow_get_device_media_types(AVFormatContext *avctx, enum dshowDeviceType devtype, + enum dshowSourceFilterType sourcetype, IBaseFilter *device_filter, + enum AVMediaType **media_types, int *nb_media_types) +{ + struct dshow_ctx *ctx = avctx->priv_data; + IEnumPins *pins = 0; + IPin *pin; + int has_audio = 0, has_video = 0; + + if (IBaseFilter_EnumPins(device_filter, &pins) != S_OK) + return; + + while (IEnumPins_Next(pins, 1, &pin, NULL) == S_OK) { + IKsPropertySet *p = NULL; + PIN_INFO info = { 0 }; + GUID category; + DWORD r2; + IEnumMediaTypes *types = NULL; + AM_MEDIA_TYPE *type; + + if (IPin_QueryPinInfo(pin, &info) != S_OK) + goto next; + IBaseFilter_Release(info.pFilter); + + if (info.dir != PINDIR_OUTPUT) + goto next; + if (IPin_QueryInterface(pin, &IID_IKsPropertySet, (void **) &p) != S_OK) + goto next; + if (IKsPropertySet_Get(p, &ROPSETID_Pin, AMPROPERTY_PIN_CATEGORY, + NULL, 0, &category, sizeof(GUID), &r2) != S_OK) + goto next; + if (!IsEqualGUID(&category, &PIN_CATEGORY_CAPTURE)) + goto next; + + if (IPin_EnumMediaTypes(pin, &types) != S_OK) + goto next; + + // enumerate media types exposed by pin + // NB: don't know if a pin can expose both audio and video, check 'm all to be safe + IEnumMediaTypes_Reset(types); + while (IEnumMediaTypes_Next(types, 1, &type, NULL) == S_OK) { + if (IsEqualGUID(&type->majortype, &MEDIATYPE_Video)) { + has_video = 1; + } else if (IsEqualGUID(&type->majortype, &MEDIATYPE_Audio)) { + has_audio = 1; + } + CoTaskMemFree(type); + } + + next: + if (types) + IEnumMediaTypes_Release(types); + if (p) + IKsPropertySet_Release(p); + if (pin) + IPin_Release(pin); + } + + IEnumPins_Release(pins); + + if (has_audio || has_video) { + int nb_types = has_audio + has_video; + *media_types = av_malloc_array(nb_types, sizeof(enum AVMediaType)); + if (*media_types) { + if (has_audio) + *media_types[0] = AVMEDIA_TYPE_AUDIO; + if (has_video) + *media_types[0+has_audio] = AVMEDIA_TYPE_VIDEO; + *nb_media_types = nb_types; + } + } +} + /** * Cycle through available devices using the device enumerator devenum, * retrieve the device with type specified by devtype and return the @@ -242,6 +315,8 @@ dshow_cycle_devices(AVFormatContext *avctx, ICreateDevEnum *devenum, LPOLESTR olestr = NULL; LPMALLOC co_malloc = NULL; AVDeviceInfo *device = NULL; + enum AVMediaType *media_types = NULL; + int nb_media_types = 0; int i; r = CoGetMalloc(1, &co_malloc); @@ -286,6 +361,12 @@ dshow_cycle_devices(AVFormatContext *avctx, ICreateDevEnum *devenum, // success, loop will end now } } else { + // get media types exposed by pins of device + if (IMoniker_BindToObject(m, 0, 0, &IID_IBaseFilter, (void* ) &device_filter) == S_OK) { + dshow_get_device_media_types(avctx, devtype, sourcetype, device_filter, &media_types, &nb_media_types); + IBaseFilter_Release(device_filter); + device_filter = NULL; + } if (device_list) { device = av_mallocz(sizeof(AVDeviceInfo)); if (!device) @@ -306,12 +387,26 @@ dshow_cycle_devices(AVFormatContext *avctx, ICreateDevEnum *devenum, device = NULL; // copied into array, make sure not freed below } else { - av_log(avctx, AV_LOG_INFO, " \"%s\"\n", friendly_name); - av_log(avctx, AV_LOG_INFO, " Alternative name \"%s\"\n", unique_name); + av_log(avctx, AV_LOG_INFO, "\"%s\"", friendly_name); + if (nb_media_types > 0 && media_types) { + const char* media_type = av_get_media_type_string(media_types[0]); + av_log(NULL, AV_LOG_INFO, " (%s", media_type ? media_type : "unknown"); + for (int i = 1; i < nb_media_types; ++i) { + media_type = av_get_media_type_string(media_types[i]); + av_log(NULL, AV_LOG_INFO, ", %s", media_type ? media_type : "unknown"); + } + av_log(NULL, AV_LOG_INFO, ")"); + } else { + av_log(NULL, AV_LOG_INFO, " (none)"); + } + av_log(avctx, AV_LOG_INFO, "\n"); + av_log(avctx, AV_LOG_INFO, " Alternative name \"%s\"\n", unique_name); } } -fail1: + fail1: + if (media_types) + av_freep(&media_types); if (device) { if (device->device_name) av_freep(&device->device_name); @@ -1194,9 +1289,7 @@ static int dshow_read_header(AVFormatContext *avctx) } if (ctx->list_devices) { - av_log(avctx, AV_LOG_INFO, "DirectShow video devices (some may be both video and audio devices)\n"); dshow_cycle_devices(avctx, devenum, VideoDevice, VideoSourceDevice, NULL, NULL, NULL); - av_log(avctx, AV_LOG_INFO, "DirectShow audio devices\n"); dshow_cycle_devices(avctx, devenum, AudioDevice, AudioSourceDevice, NULL, NULL, NULL); ret = AVERROR_EXIT; goto error; From patchwork Mon Jun 7 23:03:47 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Diederick C. Niehorster" X-Patchwork-Id: 28155 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:b214:0:0:0:0:0 with SMTP id b20csp3890899iof; Mon, 7 Jun 2021 16:12:15 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzb4iSc/j2MyQgfmMXr2V5uUhJmMUOkzi7o6Iz0ltbpKCFoe8o8JWjpiSlNkHPIr6gFzTxN X-Received: by 2002:a05:6402:8d4:: with SMTP id d20mr22306856edz.117.1623107535736; Mon, 07 Jun 2021 16:12:15 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1623107535; cv=none; d=google.com; s=arc-20160816; b=qOGi31SK6cEj2B1IyK7zp9PqmCe1Supr41HnaJvpW/Qqh1WUZMRPp0xBHiqQsUu98B DOkMnyk0aj4bBTg5slycPZPEYSnMj/QR7JBsBLoRKVb6RxH6eAQhxI3a2BINq7BpZf8m i549+GUibt5xGJOWvr1xjnM6ZG6hXrhZ8KtizMAEQrTTdPz2v5Cr4OWsiZax5D/9DlZf ebRCXrzF/LHpx0JZfZUK2dFZfld4ygMU1jum+a9jw1+Z60PEk87TZHwgI2n9PCfNj2XO 80ht1xlkQdDuiZmbB+XZbY2wOBpDoGzaBdjwyBsJqkjeBek3Ji08K6gflKgcP/oHLo0S NYFw== 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=QmR6ausPzZLOFdZdVgL1O9hDcnhn+K73UV7C+LjgvtU=; b=0lcxCF6PYBpG1CNqHrtl8/uNt4lpTPlaEWHabIkHH3/3tmxjPKoBc1vTy784Z0D3rZ /UzGDWep4JDs+bAMvTQcng4B1x90DZ+o13k52KS7IRSxE3AvUjkz0xhm877rtNV7oq8G Jbk+IMWZf5ZUKRc40SI5VZS0L85SXuA/iefHgwxcSLbsp59NJZWBGDM/pUbRzTLMSChw 03/k9wVpDT53l1OxB6Q32H4B6yJl+7wre6DCtKssXYd/vfK5l/4jqvgSIMtjphOxH36T v/Atf1VQfbAGcg+WsAtwvHAdAh1mJ6UvjOjw53SxQf9JqCHvtpTtbi/L+fYB6xbh+5jA tDpw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=MVzDJRe7; 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 z11si14049865edr.492.2021.06.07.16.12.15; Mon, 07 Jun 2021 16:12:15 -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=20161025 header.b=MVzDJRe7; 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 97AC6688369; Tue, 8 Jun 2021 02:12:12 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lj1-f174.google.com (mail-lj1-f174.google.com [209.85.208.174]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 8591E68836F for ; Tue, 8 Jun 2021 02:12:05 +0300 (EEST) Received: by mail-lj1-f174.google.com with SMTP id o8so24464874ljp.0 for ; Mon, 07 Jun 2021 16:12:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=kJ69sDqBxwWyHcTOhOmXVrmC/8Fh09oaEzgandQy/Gg=; b=MVzDJRe70Nf+lSi7sim3F3o73JLcAEqipxCUZsMPLar+CORxTB/OqjRAOldSxqUl6p mUWW0Z3TL3ZXPP3/8fHGwjemXlrrnTzdmPycKYmWuFkxTpj+j2Xg432k0jtNKDPwfLey 9lAEleXHon9nhqbwe/pS2zTOMFeXJo2c4OWI9USF7U23BGOg9I1+JC0VSwI8Hw6R0Hcl qzS+HdsCEnbH81U7EtaHhKvBOP+JwisVb66gnSHEF14HY9w4mgZDWeq+vDiqo7vdAGYG XXSTHbcPXxQhv4pbgXC9dcH92EwRJ0IfE1f9fKwHTbsV5XgMGPruiwRdfJbXgauf3SrE xhnA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=kJ69sDqBxwWyHcTOhOmXVrmC/8Fh09oaEzgandQy/Gg=; b=oq4wDodF9v7A0VJGb/ain83y2Xk8hGX7Zo5DUz76PbEXZL99GZZGiIDgV3LAn5GUJ7 VEVC6l61pKT2wEY3shXmv6FFqVjW22jE9zdwdWXAKoedF9Mp6SYZgGmQWwP4Kx2MOwm9 y+hbTML7NzMO/tc5WKx7vSycj2B+xosOzRQ0yt4qGQR8H99UXw5JgvMimRSwRVjoY9I6 uDlKRtwByPtb/B4JvB+OI7nCO7VKlu2FCRprPvUskekzCDHvgu5B/KmF0Atgx3mMoOCg kt9ajUCq3KpIz3LGqibYcFv9GwYFqn8pPOxiKVJP2MiQsDdpIPv5RZ9JaWT/ZRzoo7gp iNgA== X-Gm-Message-State: AOAM5305hEcCnx9hTDGJWuxltcwrQcyyMxQIr5XtUbYxljfOPVlbYOyY fK3JT6zvJ9bwirSmZE87iHLnBcASGPPS5w== X-Received: by 2002:a05:651c:484:: with SMTP id s4mr2025420ljc.260.1623107074518; Mon, 07 Jun 2021 16:04:34 -0700 (PDT) Received: from localhost.localdomain (84-217-56-54.customers.ownit.se. [84.217.56.54]) by smtp.gmail.com with ESMTPSA id v9sm1999563ljv.131.2021.06.07.16.04.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Jun 2021 16:04:34 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Tue, 8 Jun 2021 01:03:47 +0200 Message-Id: <20210607230414.612-9-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20210607230414.612-1-dcnieho@gmail.com> References: <20210607230414.612-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 08/35] avdevice: add info about media types(s) to AVDeviceInfo 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: Diederick Niehorster Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: ErSL3sIK2F0a An avdevice, regardless of whether its category says its an audio or video device, may provide access to devices providing different media types, or even single devices providing multiple media types. Also, some devices may provide no media types. dshow is an example encompassing all of these cases. Users should be provided with this information, so AVDeviceInfo is extended to provide it. Bump avdevice version Signed-off-by: Diederick Niehorster --- libavdevice/avdevice.c | 2 ++ libavdevice/avdevice.h | 2 ++ libavdevice/version.h | 2 +- 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/libavdevice/avdevice.c b/libavdevice/avdevice.c index 22b7595ab1..4a40929007 100644 --- a/libavdevice/avdevice.c +++ b/libavdevice/avdevice.c @@ -158,6 +158,8 @@ void avdevice_free_list_devices(AVDeviceInfoList **device_list) if (dev) { av_freep(&dev->device_name); av_freep(&dev->device_description); + if (dev->media_types) + av_freep(&dev->media_types); av_free(dev); } } diff --git a/libavdevice/avdevice.h b/libavdevice/avdevice.h index 8370bbc7f2..6f24976dcc 100644 --- a/libavdevice/avdevice.h +++ b/libavdevice/avdevice.h @@ -457,6 +457,8 @@ void avdevice_capabilities_free(AVDeviceCapabilitiesQuery **caps, AVFormatContex typedef struct AVDeviceInfo { char *device_name; /**< device name, format depends on device */ char *device_description; /**< human friendly name */ + enum AVMediaType *media_types; /**< array indicating what media types(s), if any, a device can provide. If null, cannot provide any */ + int nb_media_types; /**< length of media_types array, 0 if device cannot provide any media types */ } AVDeviceInfo; /** diff --git a/libavdevice/version.h b/libavdevice/version.h index 6021a0dd65..6e593ba00e 100644 --- a/libavdevice/version.h +++ b/libavdevice/version.h @@ -28,7 +28,7 @@ #include "libavutil/version.h" #define LIBAVDEVICE_VERSION_MAJOR 59 -#define LIBAVDEVICE_VERSION_MINOR 0 +#define LIBAVDEVICE_VERSION_MINOR 1 #define LIBAVDEVICE_VERSION_MICRO 100 #define LIBAVDEVICE_VERSION_INT AV_VERSION_INT(LIBAVDEVICE_VERSION_MAJOR, \ From patchwork Mon Jun 7 23:03:48 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Diederick C. Niehorster" X-Patchwork-Id: 28159 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:b214:0:0:0:0:0 with SMTP id b20csp3889697iof; Mon, 7 Jun 2021 16:10:26 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxvQJDQycHM7m8yxYlbPIhFdEOTxBMlGeHB6Noywv7MAC2PA8gUlVKB7HfPNs6mk2UA6xtC X-Received: by 2002:a17:906:2b04:: with SMTP id a4mr6696251ejg.6.1623107425943; Mon, 07 Jun 2021 16:10:25 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1623107425; cv=none; d=google.com; s=arc-20160816; b=DShZnSO+bLzF617bhSiVum3SFB06RucE+z69cYQbt48DbZHIbvFQVF3I7jLb7Wy8gH V2+Hvc+5li8JAtGDTw2A7QpmtZaRR2apUnj8bijr1dRpY3SCmAGWlMXl6YqFUySaF1Pd Gr36Gz0j1ztz/l9qJbiUG/+Yne0pHxtCSOilpI9+AySQPOLY+khb6AtyetYHCPxDs0YI 2h2NOldH+O6nROQ/EE9IqE7fvmqMCvENuv3LqQEe2J3VVFkcSElo8UZU+ExdKsV0A/GD +Stjos8Y1ElaFlFmjoUT4A+ibPSnnkC2SmRWdNaBPf7mwex8Tt3aUvwxLWtH0WVBrQ8U sQOA== 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=VX6uoCEoMNvdMSlqg7Kb1z3GWHz/DMqrSgx4X5ICJ9A=; b=Y7xzh8DVdWclvBj9yNabsZw3xXMEiG5sHwamrHwKo4+z0AGDzBMG5zStTSXWDmmHYP US/Uf6xnrH/Rdqj7x+pivS2Aq4SxoBMPNt001LnPvydhRkKyTtLggZETDnWVLz/Hk0lJ nf1f7HgVBycXauhOHzpa2sw6xYZ0I/3kNODeKvvhSx3RCDe511RzJ2QJ1e0iDH84p1Qa vUEnypnyErfaiBNjZrHHsLKJ6NJbPnFO6vufWt4AsJLlakcZYWTSFjtc7LNQxYqih9zT +v+SprgSXGfILMwoIGvyIu4/bNDOi0USkPDWy9xhOUM0oe1FgmEXYH9/E5iQkLczhh9C /0Aw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b="Bxophv/Z"; 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 b22si6620284ejl.199.2021.06.07.16.10.25; Mon, 07 Jun 2021 16:10:25 -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=20161025 header.b="Bxophv/Z"; 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 27C9F687EC8; Tue, 8 Jun 2021 02:10:19 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-ej1-f42.google.com (mail-ej1-f42.google.com [209.85.218.42]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 2C275680A07 for ; Tue, 8 Jun 2021 02:10:17 +0300 (EEST) Received: by mail-ej1-f42.google.com with SMTP id g8so29407423ejx.1 for ; Mon, 07 Jun 2021 16:10:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=BAOzOt4BHq6+8NBQ68Xw34anW2BwSZfUjCa9hOJqUac=; b=Bxophv/ZP7kAgKVukNlU41GMgHp4dZZYRJ39wgEVBqF8Vd1EJfRc0w0eiujBwb94su 0/G6xCc9iXE/MxwxdJxsxGhj4L8H+cghN1l2M5RGNGsZlo1yvTH484tbxIGTJfa5r0sN SC25dJuSFUwpgtlTViH/eEkcQoAKFsZD0/v+lazxupBA1R1QpkcS3iKE7mg8xv3d8DNK vmc8j9HA6YbfSevX/6GoyjMxJsmsH90Z1ijT746nDgOxfO+ZJPezTLtSio5iyVdD56vS ePZ4K/+GOp2Ayiolejb1yFayldWuuI1NreO7uaaNwE1Mn7SWv0hZ/zNvC1SlVH0OS72j a1Fg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=BAOzOt4BHq6+8NBQ68Xw34anW2BwSZfUjCa9hOJqUac=; b=VR7HjQIEbrgTIJTCjQFI/dmoAKWDcoLxzupNBj+d49XHiijtJyp18XErPylwZwNwWd q3S8wogEv9VSYQWANi+yqnyQVoE/TC5IxZmDpHoXE27ZPitKjw8pQ/lNLj/0u8HEw2EC KPedphhh8BqkdC0pfw154Wz7d44PfIOl2FfZA7RERs4Y9dPlgpv7d8YYC+tNTRc6M06T RE6xqVIbqzIdVcLAUQ7KRXEhFEFQShhLNZpCMlaohXfOKAlJkHrhc3grO0dtQoVzFvFB XhSn88mCowyhKFOL4jKLnOJhEyqlOZ9rAZ2hUBJlBQg9s8or44JAZvXxve0IX+bf6SVA u3wg== X-Gm-Message-State: AOAM5327PsgoHSMQOTYDpkatARP1LnLNnQrTTtUhMvydmIR28ofYTZYX v1LKTmBSkuuFFNuUCTk/3sKbdz4kwyvQmg== X-Received: by 2002:a05:6512:2023:: with SMTP id s3mr12807172lfs.169.1623107075379; Mon, 07 Jun 2021 16:04:35 -0700 (PDT) Received: from localhost.localdomain (84-217-56-54.customers.ownit.se. [84.217.56.54]) by smtp.gmail.com with ESMTPSA id v9sm1999563ljv.131.2021.06.07.16.04.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Jun 2021 16:04:34 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Tue, 8 Jun 2021 01:03:48 +0200 Message-Id: <20210607230414.612-10-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20210607230414.612-1-dcnieho@gmail.com> References: <20210607230414.612-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 09/35] avdevice/dshow: add media type info to get_device_list 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: Diederick Niehorster Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: pAjshrHhV3LG The list returned by get_device_list now contains info about what media type(s), if any, can be provided by each device. Signed-off-by: Diederick Niehorster --- libavdevice/dshow.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/libavdevice/dshow.c b/libavdevice/dshow.c index 5d7f065a8c..3e41f4f99f 100644 --- a/libavdevice/dshow.c +++ b/libavdevice/dshow.c @@ -377,6 +377,11 @@ dshow_cycle_devices(AVFormatContext *avctx, ICreateDevEnum *devenum, if (!device->device_name || !device->device_description) goto fail1; + device->nb_media_types = nb_media_types; + device->media_types = media_types; + nb_media_types = 0; + media_types = NULL; + // store to device_list output if (av_reallocp_array(&(*device_list)->devices, (*device_list)->nb_devices + 1, @@ -412,6 +417,8 @@ dshow_cycle_devices(AVFormatContext *avctx, ICreateDevEnum *devenum, av_freep(&device->device_name); if (device->device_name) av_freep(&device->device_description); + if (device->media_types) + av_freep(&device->media_types); av_free(device); } if (olestr && co_malloc) From patchwork Mon Jun 7 23:03:49 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: "Diederick C. Niehorster" X-Patchwork-Id: 28163 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:b214:0:0:0:0:0 with SMTP id b20csp3904313iof; Mon, 7 Jun 2021 16:34:29 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxHkXKOUn5liojwiGa+mRmJgFtY6lS+EtFCRrJcxsik+Fh2gLjJcbhtijfbd4AXZZMFljda X-Received: by 2002:aa7:cd42:: with SMTP id v2mr22781972edw.245.1623108869580; Mon, 07 Jun 2021 16:34:29 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1623108869; cv=none; d=google.com; s=arc-20160816; b=ZqfNHHzIsthqC7Slv64jPpl9uGf0O8RLBnmX/JqO2auUm+cf29piyVArYWHThKfXrX +UZZjEg40eU+TZ25fzu2oRUc8YYSa1JgYsPc5cwLsG9SJFqH9YPkQ3LV6T5Y6a4IODuC G34bbXuHtILJ2DQ2YcYxqRLqas//fUpH0A1Y5ZHZPD8cHh6Gym7VDPhIsg2Jiu4ywudr BcYuWZuqHpbTTqLJwFR2K7T4CmXoMCb2Mq5aoq6moghbNXVGmVZqKbVhcM2ILVkHO5Ys Y6MG3dmvAyaJwY8/3Ze7ZTwdCS04MEedzRzXGoLp4DBRY6RaUjQ3bBJyCPb4cH8sa7H0 JNAQ== 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=gDLr+lsIJZYjCEbYQ5l7OHpxwfQoGdz/iKYJao+ru2Q=; b=iW5Bg2NjnD4qgHtUXleQ6gXU5IvLs4MnPMCkeN4xQGDRqduE5VIq7OUGPabxnUXlkm O2GkZE5m6FPrRh5ENzNjRKkk+FK6D2zhzur0F5L7uFFM1XRqWR9awYyk4OcvKfpf0d7k pi0SoZf9aeGkrDn9nKOkl0bO1MdJXAyLCN95HVpRv2pvt86Dk6rfE9/4qXkhZo2RUmYn uGDDrFqCdlTOCmLRc8M6PDDOJuHbUy0xVqdsJpCg6LNx4CESET9rqIa62B9dHS+OPazV 0mzCJuM5zxKZ5zfzct2QYX35VLTQ6TPoIB8vmULEfccX0zY9V8U9vdBS+o/aJYSqm/BP yAUg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=m0CJ6Nls; 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 b20si11059214ejq.607.2021.06.07.16.34.29; Mon, 07 Jun 2021 16:34:29 -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=20161025 header.b=m0CJ6Nls; 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 67A2E6808F5; Tue, 8 Jun 2021 02:34:26 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lj1-f169.google.com (mail-lj1-f169.google.com [209.85.208.169]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 81681680226 for ; Tue, 8 Jun 2021 02:34:20 +0300 (EEST) Received: by mail-lj1-f169.google.com with SMTP id d2so20316315ljj.11 for ; Mon, 07 Jun 2021 16:34:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=/GbahymUo8EgUi/GGGeyBCtgTFGWUNA/XWWTFi37dxw=; b=m0CJ6NlsAPgkK+1Su/sbEhfe4eiANDD9IJ0JwJ293Zxa8mbLLnaJr624IxxlsTOyEn UPksK5VWBxRK4+B9a9F/PCH5LEOBuW4nLLFEOgzTg0JsoCfytA0WU8OE3mDfbdcJagT4 UjVyiz5FnWJ6+Ko53MtRSyCB54dON8vMl88XYEDIcn6efsEMegj+XQ8eZTvFF1P+kxG6 cPFNFnGG7dFqvKzLw3aIlrBG758PRQJtzCL8DTET4HcrrPoIIUBvZXcMrEv7gsBSXXsP w6opHcG9jXJNpPAIFEBqd+F8TG0K7ha0Xj0tCqvywHh1Ej+ZR+UPw1ggEJPGH8bjaist 5/CA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=/GbahymUo8EgUi/GGGeyBCtgTFGWUNA/XWWTFi37dxw=; b=gEJi1IS6BJHW6LVlZksZCwL3ghukLIHGxTOWFAGs95JI6GGXtD5MNwqanuxSt+HjDY SPVdQVD4DWdV2p7YTGuLGV4cF8es1fzST2cyBACGZsyE9iVpfUUucrKcdGXM/51s6hhq egMr6CFO1qQGm4+AHizV3LV/8wGxfgQcHSDOA3DXgouVl3xtjV6R1J9yGkLnWefbqwxX Teyhblftmr8mXi/RC9ipgbAx9d6oLS1s82g7k53U7cnahZOu9mgSCkJHikS7mxeAIs5W Oq28+Ov2AGqMidWQ24OfdQ31FK2omNJ0T3w+bYs+uYqnw4Ucsaoyt2YQ+asajE0zYCNu pXQw== X-Gm-Message-State: AOAM533PoMN7hS1+/50+joHitG5ADWSv2r41qhmFJLPGKe4z7JNPOvqh hYZ0KJne1ea5ZL6sPOU7DhPaOK4Pa2Hwhg== X-Received: by 2002:a2e:7311:: with SMTP id o17mr1216300ljc.415.1623107076298; Mon, 07 Jun 2021 16:04:36 -0700 (PDT) Received: from localhost.localdomain (84-217-56-54.customers.ownit.se. [84.217.56.54]) by smtp.gmail.com with ESMTPSA id v9sm1999563ljv.131.2021.06.07.16.04.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Jun 2021 16:04:35 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Tue, 8 Jun 2021 01:03:49 +0200 Message-Id: <20210607230414.612-11-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20210607230414.612-1-dcnieho@gmail.com> References: <20210607230414.612-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 10/35] fftools: provide media type info for devices 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: Diederick Niehorster Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: Zk8aCJMbYFK+ fftools now print info about what media type(s), if any, are provided by sink and source avdevices. Furthermore, printing is done with av_log instead of printf as the latter doesn't handle characters in some device names correctly (e.g. "Microphone Array (Intel® Smart Sound Technology (Intel® SST))" is printed incorrectly). Signed-off-by: Diederick Niehorster --- fftools/cmdutils.c | 41 +++++++++++++++++++++++++++++++---------- 1 file changed, 31 insertions(+), 10 deletions(-) diff --git a/fftools/cmdutils.c b/fftools/cmdutils.c index 4148285971..b7018b7dab 100644 --- a/fftools/cmdutils.c +++ b/fftools/cmdutils.c @@ -2205,9 +2205,36 @@ double get_rotation(AVStream *st) } #if CONFIG_AVDEVICE +static void print_device_list(AVDeviceInfoList *device_list) +{ + int i, error_level = av_log_get_level(); + // reset log level such that info messages are displayed + // we need to use av_log instead of printf as it handles + // unicode better + av_log_set_level(AV_LOG_INFO); + // print devices + for (i = 0; i < device_list->nb_devices; i++) { + av_log(NULL, AV_LOG_INFO, "%s %s [%s]", device_list->default_device == i ? "*" : " ", + device_list->devices[i]->device_name, device_list->devices[i]->device_description); + if (device_list->devices[i]->nb_media_types > 0 && device_list->devices[i]->media_types) { + const char* media_type = av_get_media_type_string(device_list->devices[i]->media_types[0]); + av_log(NULL, AV_LOG_INFO, " (%s", media_type ? media_type : "unknown"); + for (int i = 1; i < device_list->devices[i]->nb_media_types; ++i) { + media_type = av_get_media_type_string(device_list->devices[i]->media_types[i]); + av_log(NULL, AV_LOG_INFO, ", %s", media_type ? media_type : "unknown"); + } + av_log(NULL, AV_LOG_INFO, ")"); + } else { + av_log(NULL, AV_LOG_INFO, " (none)"); + } + av_log(NULL, AV_LOG_INFO, "\n"); + } + + av_log_set_level(error_level); +} static int print_device_sources(const AVInputFormat *fmt, AVDictionary *opts) { - int ret, i; + int ret; AVDeviceInfoList *device_list = NULL; if (!fmt || !fmt->priv_class || !AV_IS_INPUT_DEVICE(fmt->priv_class->category)) @@ -2225,10 +2252,7 @@ static int print_device_sources(const AVInputFormat *fmt, AVDictionary *opts) goto fail; } - for (i = 0; i < device_list->nb_devices; i++) { - printf("%s %s [%s]\n", device_list->default_device == i ? "*" : " ", - device_list->devices[i]->device_name, device_list->devices[i]->device_description); - } + print_device_list(device_list); fail: avdevice_free_list_devices(&device_list); @@ -2237,7 +2261,7 @@ static int print_device_sources(const AVInputFormat *fmt, AVDictionary *opts) static int print_device_sinks(const AVOutputFormat *fmt, AVDictionary *opts) { - int ret, i; + int ret; AVDeviceInfoList *device_list = NULL; if (!fmt || !fmt->priv_class || !AV_IS_OUTPUT_DEVICE(fmt->priv_class->category)) @@ -2255,10 +2279,7 @@ static int print_device_sinks(const AVOutputFormat *fmt, AVDictionary *opts) goto fail; } - for (i = 0; i < device_list->nb_devices; i++) { - printf("%s %s [%s]\n", device_list->default_device == i ? "*" : " ", - device_list->devices[i]->device_name, device_list->devices[i]->device_description); - } + print_device_list(device_list); fail: avdevice_free_list_devices(&device_list); From patchwork Mon Jun 7 23:03:50 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Diederick C. Niehorster" X-Patchwork-Id: 28157 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:b214:0:0:0:0:0 with SMTP id b20csp3890781iof; Mon, 7 Jun 2021 16:12:04 -0700 (PDT) X-Google-Smtp-Source: ABdhPJz41QhuJv7Mr56aCV/HiH0n17vy4KZkr/GHoqVe5AjlcLyTWnVsz4INCPclUXWk7hjUr/0B X-Received: by 2002:a17:906:dbec:: with SMTP id yd12mr1173783ejb.126.1623107524503; Mon, 07 Jun 2021 16:12:04 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1623107524; cv=none; d=google.com; s=arc-20160816; b=FcVHm0w7j1oku8HB5JyG6j2qgQgDcoY9WciA6/Z2S36v/zylvAqGsZV0yatB8vMu0r 9BYZ+YAuB+wuWQEmyHamHkOzeKSp3wfJcconHTEjMqGPrcJ5I3b35pPZok7EHvx5DO96 OKlO6bgQi5EOpk0Yfp6pSvzjAFXx/iZONXk/MTGLTxY79C29jWWjJeE74GbXgmqfyJ68 b5y1HI7GxZryQngI7Zo+h8wifwFuAHyC7s3dbRltT+7dG/+NgbXY4LEiv/Oua4FExV6W BBWwCG5q0bmMT8dg8oLpLC0QBV/7O7U/5Ckx076hWn72szJCiOB74DG3/9yM+Oru5Cln QfNQ== 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=dNXmsSIuHtYyW4pek8kQ1WcZF/5FObG1lIVL06PX7xM=; b=s8l8bNMgxORE0/uTyDZ/UwCNroE5uqPuvSds1dwPIEBFw4SzCMGwCdTSA++Bji1WPN IMDfy2WfXAAflvWQTQwxhPrephJw+JEMmTueRFCrjhoYpCpzsfYv2Ba9lsJqv52Qc5XB bFKTqAnPP/KHDzEQFckXRXp7dTlG4rlloZx/SUx0wqdRafMcD9SGrr1r80+TpUwjArJx 1ssO0MM86lpyz5C9juOqOi3j3n7Kzw97Sev8qxKfdADvxX3rBHiefmPgneTT7cmQDcDP Wg5tXramSuqJCYPREpF453uUhU9EHwQxy9WOawRndMULw4EWpOKIPNa9MMWibsagq549 h78g== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=rIFA5dGI; 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 c7si12975658ejz.386.2021.06.07.16.12.04; Mon, 07 Jun 2021 16:12:04 -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=20161025 header.b=rIFA5dGI; 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 985AC688324; Tue, 8 Jun 2021 02:12:01 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-ej1-f53.google.com (mail-ej1-f53.google.com [209.85.218.53]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id C3991680AF3 for ; Tue, 8 Jun 2021 02:11:54 +0300 (EEST) Received: by mail-ej1-f53.google.com with SMTP id my49so12679225ejc.7 for ; Mon, 07 Jun 2021 16:11:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=41qKzCf9BVvhUhZ/WGQBasQuSN11e31lwRq//8NVWQA=; b=rIFA5dGIESw14D/Y9fnlnMHrlW1cNyQgcd+Hg2kHJXPHH9qDYfoR9/AHiaegTI8uWg 4yGOZygRynOpPtuQ2oTUSa/jUd3dMIFuGU2GYSULAkQjjP9usfPWuyAwHCveAkJusauV L+AEhyz1jvP12lox36lG2hXLdlj0XPpFqg97ZM7+U0MSzB4ack/18+1YmBs08G1Yv6eA 2Dw0VxJHfi86KDCiNoPQzURq0QiRsb4tqfkVQchm8Mz5VRwwTEMnUyIL7WrTvg9L0LKK 2tKodQJOAvpQtHaa0uF4ZzzcKvjJsAotCcudfy5Glfp6CziWkPO9yE0w0p7rkajUeG2i O9OQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=41qKzCf9BVvhUhZ/WGQBasQuSN11e31lwRq//8NVWQA=; b=AqzrJXrbcQjkyKdxij4xxLuRUOxVeA6+uF7zyMxUT2SeRYz7U3RZ3O7nV61SIeKdTT F4sAStSLNaDGKvP5SI0YEY1beixqitK16KlWlVH0O0K+AWlUjPd2qYG+7SCKZ9BoX0De hdB/xwi8wl3sq4T32mMoBhXP8oBrD6CyhK1wNzayVwoLzZxh1bvwPz9uwgKthh6KuwSx IUCXbG/VH/UnwtMoMJ1IawQJ5KHlJamXcR3+T+RxBFuxKfqxob6fcLLL8S4i7Jv0fc/y JcNiTczOsGMbbCsuJrUO7zDnXdYHLtzrRCxt61n326b2yigwVWhSv4hk55j3b+xpQ59g Rd1A== X-Gm-Message-State: AOAM533fgPysnbd4essKKJzmh1Kq1AfrZzHlvL5KdfjOVTM6YFqGo49P 1QXRzFeCkhVRroOz4/ui1zwv+yuZQ1sV2A== X-Received: by 2002:a2e:5342:: with SMTP id t2mr16150350ljd.321.1623107077369; Mon, 07 Jun 2021 16:04:37 -0700 (PDT) Received: from localhost.localdomain (84-217-56-54.customers.ownit.se. [84.217.56.54]) by smtp.gmail.com with ESMTPSA id v9sm1999563ljv.131.2021.06.07.16.04.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Jun 2021 16:04:36 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Tue, 8 Jun 2021 01:03:50 +0200 Message-Id: <20210607230414.612-12-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20210607230414.612-1-dcnieho@gmail.com> References: <20210607230414.612-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 11/35] avformat: add control_message function to AVInputFormat 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: Diederick Niehorster Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: KklRtlstMvcu Control messages are useful for programmatic control of not only outdevs but also indevs. Bumping avformat version. Signed-off-by: Diederick Niehorster --- libavdevice/avdevice.c | 8 +++++--- libavformat/avformat.h | 6 ++++++ libavformat/version.h | 4 ++-- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/libavdevice/avdevice.c b/libavdevice/avdevice.c index 4a40929007..e339cebf2d 100644 --- a/libavdevice/avdevice.c +++ b/libavdevice/avdevice.c @@ -53,9 +53,11 @@ const char * avdevice_license(void) int avdevice_app_to_dev_control_message(struct AVFormatContext *s, enum AVAppToDevMessageType type, void *data, size_t data_size) { - if (!s->oformat || !s->oformat->control_message) - return AVERROR(ENOSYS); - return s->oformat->control_message(s, type, data, data_size); + if (s->oformat && s->oformat->control_message) + return s->oformat->control_message(s, type, data, data_size); + if (s->iformat && s->iformat->control_message) + return s->iformat->control_message(s, type, data, data_size); + return AVERROR(ENOSYS); } int avdevice_dev_to_app_control_message(struct AVFormatContext *s, enum AVDevToAppMessageType type, diff --git a/libavformat/avformat.h b/libavformat/avformat.h index a28ac372da..adbdd712a7 100644 --- a/libavformat/avformat.h +++ b/libavformat/avformat.h @@ -737,6 +737,12 @@ typedef struct AVInputFormat { */ int (*read_seek2)(struct AVFormatContext *s, int stream_index, int64_t min_ts, int64_t ts, int64_t max_ts, int flags); + /** + * Allows sending messages from application to device. + */ + int (*control_message)(struct AVFormatContext *s, int type, + void *data, size_t data_size); + /** * Returns device list with it properties. * @see avdevice_list_devices() for more details. diff --git a/libavformat/version.h b/libavformat/version.h index 5de0814316..7f02e18f24 100644 --- a/libavformat/version.h +++ b/libavformat/version.h @@ -32,8 +32,8 @@ // Major bumping may affect Ticket5467, 5421, 5451(compatibility with Chromium) // Also please add any ticket numbers that you believe might be affected here #define LIBAVFORMAT_VERSION_MAJOR 59 -#define LIBAVFORMAT_VERSION_MINOR 2 -#define LIBAVFORMAT_VERSION_MICRO 101 +#define LIBAVFORMAT_VERSION_MINOR 3 +#define LIBAVFORMAT_VERSION_MICRO 100 #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ LIBAVFORMAT_VERSION_MINOR, \ From patchwork Mon Jun 7 23:03:51 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Diederick C. Niehorster" X-Patchwork-Id: 28149 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:b214:0:0:0:0:0 with SMTP id b20csp3891271iof; Mon, 7 Jun 2021 16:12:49 -0700 (PDT) X-Google-Smtp-Source: ABdhPJx/1Q0YiiVoIJmlhD6KO9kb06OvTgBrgB2lR5q0bGXoF0qYP6DFdGGaamWmabrtmJFpxwLw X-Received: by 2002:a17:907:2059:: with SMTP id pg25mr19027892ejb.130.1623107569612; Mon, 07 Jun 2021 16:12:49 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1623107569; cv=none; d=google.com; s=arc-20160816; b=kyOynSgau6DstGmEc+jJPbzpmq5OaTeTef1thZjkZklkB7QgHwlTz5eROtbwIOzC/R XODq7g/5V3mM99B1NKXk98lJGwG1pHcM+NGlOI9+s990QOoDqop82RewlaLZokgOha1O voGTtgghyfDY9HCREDBUne9wi2V9nprv7l8VUulBvxJATiwt1MhrqaKTjxip8htHgaor 81LvN8lb1kL7VV8kfZGQyFgR98u067nxsejEq2vLcAY+kVti9dEFza8lbfU7Q81YNVKH DH+dsDp8nKulbl3t94zMtbNDZ6s6TZa/0tV4XQauq/LlnBTqkKXuPLLg/Ns4qpYCVM5h gy1w== 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=bMIwGhjd+cjSoVWar3CDKf/Pn7HxRTW4PpJrPG9NKXI=; b=gwuq0Gah5lKfujqBO3H+PhZsMulGBDCBTQsaf9Ror7PomoCXXKJcOLko+6tZ2E95Sp rLop0PRXFp6hBJyNfXItiovR+bYWVLlmtqstMjujnmDg/DE66Pl7XBMhaRTNxFlNFQ6b Dp1BSGkHbtNRtsTJGnmW3rH6JmhlaJtrdzuhUiiO+FqyJx9vYxUNCCb6qY5haTCxxBOn WWU6WDg29t4qF88ktDPdVDYH64ZrTUMdWmc2KDd4rte1IXA4AE4Lb2dgH+h4CyrJzwLK NQKnAVNtK6Bqm0PbV1RxAT0kpek0PYkWgPcuwxD56ofn3Bej0ksZj5/YhYbKQncu6vaO ATaw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=eegsU5Hq; 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 5si8724043ejh.625.2021.06.07.16.12.49; Mon, 07 Jun 2021 16:12:49 -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=20161025 header.b=eegsU5Hq; 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 A12DA689888; Tue, 8 Jun 2021 02:12:41 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lf1-f52.google.com (mail-lf1-f52.google.com [209.85.167.52]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 736AE6897E8 for ; Tue, 8 Jun 2021 02:12:35 +0300 (EEST) Received: by mail-lf1-f52.google.com with SMTP id v8so28986149lft.8 for ; Mon, 07 Jun 2021 16:12:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=Yw4pbT+q6JVdOQPqoVouNRAO798uCbdtWjU9nA/l3ls=; b=eegsU5HqRGViXJaqrZSziLUb4D22/1PWP+CpOflw4939zxLzrTR/Qz7/TMHARPq/T0 jayiBDT8UvtgggPp8T1pYUp4w5p9w9yZVHpCWv7V6ZijSOpnbULwdqsZXIvAw5JRtUyt Kp1GPTrX53fWKVgBP0h+KflfkEkUXgdXP6VLeRvdoz+AGltO2Kt+4oqTKaVCAvXC54PR xAaEbsd4IHtaw5SZ0iINdiC3rorQykn/Vb7zLVIcLDG2q2eKd3NKRw2AfOVMqntWwRYy 15zf7SjP/G4ZvVh+TQ58HHhG0h2MSx5wx+M4eYu3Ip3zF/V6hv59Lo9V6XQ9Z9VxDHyd g+MQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=Yw4pbT+q6JVdOQPqoVouNRAO798uCbdtWjU9nA/l3ls=; b=ccOks4tuXvdEY/PmYSdTXJYtke+SepooQ9HoF001r+JN25vj5wHPe4YkfJi4oBYgGv Wqn0ABafD0568FoSux3nqSvNSiselCyE8jNEw5ZlCJIPPVkzPSvMvSBu+l92jTA+GUVW uDWTRuSu9a1WuV+8aQFeNK0/8+TXxsyWIqD5RKn2MnkT14P/3cS08rZafo8mB5eo/vMt ryqq0Jd5Xx1z0FjG/EsvRereKozMXEcV1h++58rajyXQKzo7SA1sSSIFYTSTOazUUWla 1crozAlQcZBRen9JLYv5uP9sugypzlfekKg3kIVjztkK8iT/wnpZTZlxtgl2YVF+ewcl 49cw== X-Gm-Message-State: AOAM5328V42PdLkMtO7f6XzDTwqZlTRla5pzBHTbWGUul4BabdfbpIiE VxTaXo2cY+keIp0gHiwNKngt2WEm3/eJjQ== X-Received: by 2002:a19:c793:: with SMTP id x141mr13515098lff.151.1623107078225; Mon, 07 Jun 2021 16:04:38 -0700 (PDT) Received: from localhost.localdomain (84-217-56-54.customers.ownit.se. [84.217.56.54]) by smtp.gmail.com with ESMTPSA id v9sm1999563ljv.131.2021.06.07.16.04.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Jun 2021 16:04:37 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Tue, 8 Jun 2021 01:03:51 +0200 Message-Id: <20210607230414.612-13-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20210607230414.612-1-dcnieho@gmail.com> References: <20210607230414.612-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 12/35] avdevice/dshow: implement control_message interface 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: Diederick Niehorster Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: lMDwRVklIxAW This allows programmatic users of avdevice to start and stop the DirectShow Capture graph (i.e. receive frames or not). This is important because now the buffer fills up and starts dropping samples when enqueued packets are not read out immediately after the demuxer is opened. Signed-off-by: Diederick Niehorster --- libavdevice/dshow.c | 42 +++++++++++++++++++++++++++++++++++++ libavdevice/dshow_capture.h | 1 + 2 files changed, 43 insertions(+) diff --git a/libavdevice/dshow.c b/libavdevice/dshow.c index 3e41f4f99f..9f041e90f8 100644 --- a/libavdevice/dshow.c +++ b/libavdevice/dshow.c @@ -1079,6 +1079,45 @@ error: return ret; } +static int dshow_control_message(AVFormatContext *avctx, int type, void *data, size_t data_size) +{ + struct dshow_ctx *ctx = avctx->priv_data; + int run_state = ctx->is_running; + HRESULT hr; + + switch (type) { + case AV_APP_TO_DEV_PAUSE: + run_state = 0; + break; + case AV_APP_TO_DEV_PLAY: + run_state = 1; + break; + case AV_APP_TO_DEV_TOGGLE_PAUSE: + run_state = !run_state; + break; + } + + // if play state change requested, apply + if (run_state != ctx->is_running) { + if (run_state) + hr = IMediaControl_Run(ctx->control); + else + hr = IMediaControl_Pause(ctx->control); + + if (hr == S_FALSE) { + OAFilterState pfs; + hr = IMediaControl_GetState(ctx->control, 0, &pfs); + } + if (hr != S_OK) { + av_log(avctx, AV_LOG_ERROR, "Could not run/pause graph\n"); + return AVERROR(EIO); + } + ctx->is_running = run_state; + } + + return 0; +} + static enum AVCodecID waveform_codec_id(enum AVSampleFormat sample_fmt) { switch (sample_fmt) { @@ -1317,6 +1356,7 @@ static int dshow_read_header(AVFormatContext *avctx) } } } + ctx->is_running = 0; if (ctx->device_name[VideoDevice]) { if ((r = dshow_open_device(avctx, devenum, VideoDevice, VideoSourceDevice)) < 0 || (r = dshow_add_device(avctx, VideoDevice)) < 0) { @@ -1390,6 +1430,7 @@ static int dshow_read_header(AVFormatContext *avctx) av_log(avctx, AV_LOG_ERROR, "Could not run graph (sometimes caused by a device already in use by other application)\n"); goto error; } + ctx->is_running = 1; ret = 0; @@ -1502,6 +1543,7 @@ const AVInputFormat ff_dshow_demuxer = { .read_packet = dshow_read_packet, .read_close = dshow_read_close, .get_device_list= dshow_get_device_list, + .control_message = dshow_control_message, .flags = AVFMT_NOFILE | AVFMT_NOBINSEARCH | AVFMT_NOGENSEARCH | AVFMT_NO_BYTE_SEEK, .priv_class = &dshow_class, }; diff --git a/libavdevice/dshow_capture.h b/libavdevice/dshow_capture.h index 5a2691518c..bb0f76a8f2 100644 --- a/libavdevice/dshow_capture.h +++ b/libavdevice/dshow_capture.h @@ -331,6 +331,7 @@ struct dshow_ctx { IMediaControl *control; IMediaEvent *media_event; + int is_running; enum AVPixelFormat pixel_format; enum AVCodecID video_codec_id; From patchwork Mon Jun 7 23:03:52 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Diederick C. Niehorster" X-Patchwork-Id: 28150 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:b214:0:0:0:0:0 with SMTP id b20csp3890654iof; Mon, 7 Jun 2021 16:11:54 -0700 (PDT) X-Google-Smtp-Source: ABdhPJx2ekyAG5IFyTSI9mCA8rOTcO0IwWRMXuhWkDJec9E27irww21C3B2wfkmRKL0aaTbisAnN X-Received: by 2002:a05:6402:19b9:: with SMTP id o25mr21784180edz.192.1623107513950; Mon, 07 Jun 2021 16:11:53 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1623107513; cv=none; d=google.com; s=arc-20160816; b=C0xkbpY46nUBFsjApYQNHLDBJQ6NdJr57AJU46UPL718VHH0df9STNRi6O/COFRE0W TRNd1o8TYmqdVYmiPXuRGhKWg7SEViIBT/aioirgYGZEWQDUz1E9CYVgnJ6HrMvLcV8O I1HQ67bGGXiXNLqYQQd/tiQYioR6GeULRpR/qNztMeuXwh4vaj1GU/FpDQdjBdnF1tDs QmaE1Ga1nDo9shxP7AWOhuv8+gxDSpEfDH7SQh5us1F6J5u/ruv5csnzL2/y6oG24LSB JP5N8Q8mV1ZD4EUBypQaNep3iV0UTHSfdqDYaqbgJgaUHKjEHplDXt7Oy/rg+osXsRff +Fqw== 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=syS0So876NduagKVuFWKr45+sNq2yecvRDB9lcJ0Rb8=; b=Vwz71UGewEDXRZecfGKBzRHXZjI7opf9u3TY2ncNBnkyCPVyQdyjHG7lawQ3vYsq6J EHuOWJzfgq7Kj9EF08Pp5OmWjYI7jQ+pKj4GoJnNo/M2WyhjFBzPM8/SjJwL2M3zBqLS iSYjqApRkUGYyO+vSy/kzD2NcRwba0DvEytz0dM5Bl0EAVWvXLSMrn+PpYnAbfRe5a0n toMpfbz0ONmQSUnA2oZpGJe30TFexNLlEprWxySsvnGuslUJ/BZZxut6l6bP0JqNRHr9 PpZdwFithEpOfpBJ9E4LfwoxLXVYlqh/mT0F/zz9DPN13czGPt8TllYes76/vx6dx8Bu 1eIg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=SMSLJyp9; 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 w23si13448799ejf.188.2021.06.07.16.11.53; Mon, 07 Jun 2021 16:11:53 -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=20161025 header.b=SMSLJyp9; 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 989266881C2; Tue, 8 Jun 2021 02:11:51 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-ed1-f47.google.com (mail-ed1-f47.google.com [209.85.208.47]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 5B86568804D for ; Tue, 8 Jun 2021 02:11:45 +0300 (EEST) Received: by mail-ed1-f47.google.com with SMTP id i13so22359628edb.9 for ; Mon, 07 Jun 2021 16:11:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=Un/X8CQxNM2m8zal2Lf+42DTx1pxqCI9ToxJTSheCrc=; b=SMSLJyp9LCrL46hzZWpIZfFP8CYmFj2OBbZjTp9o/rXqV2S9qoudMPXo5V0fY+EiIK SEMXiMFWFwLKECs/uWod3gO1+m4itoT3jyaQ4F+t1EvPfncFjFaH0ToI+N7PtvdoPish ySs16pUahG6QxFRQq9cS7CmQtBRt67nDYVsNSc5xzNBDsSk6P4jtaaOXFuGUQGAqP/wA NT9SuylOcC8Ap1K+6poc2UC2ntYn8VJV9vbqbZ3FV96NOEIko8Rd8WyigO6GR+tT+ul8 a1bzEhfmJLBMrc8mkyIdh3sqwkJUCkkpYA/aB0jrvy0DC0YGmIquTfB34D6AnOK4P5ej meKA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=Un/X8CQxNM2m8zal2Lf+42DTx1pxqCI9ToxJTSheCrc=; b=gQ4F8K7GLyIQkI8M62koGRQh4kMCJXa3XIagO91lD0kJIFW1CFz5Nqw0c2h5HcaHR5 bTm5ASH4ngDfvNN7bv5JCvyqXMdsiMfPpaQ7DB2X2WCwBpbChj23jmFjC58l2+fkcg9G B95X9ZFxyn1bW1/iWnWSGy0VZhnCi6RzENohZ9NJ3N+cpZEQVTghVdnMBSw4nhXsP6sz eOG49wxinkgGJ0/01eOroQA/qQBVQ0FrkYYGRQxuY8UlBvyB3oHw/9dLxYb9jjeZNNFN tLn4Li5/6DNGdhJ1wb5DvGkYNhkQ9EZmQqPxBP4g7Y0/0+4BH7EwRonCMpqs0rneWm/C NuqA== X-Gm-Message-State: AOAM533fljBLvj7YKq34GXmXuIbibl0LjwV1gxnE6GrHIjUo3DCe38HX 66NWqRPRBz9BRn0ScJxATDzpw0b092f+zg== X-Received: by 2002:a2e:8542:: with SMTP id u2mr116948ljj.141.1623107079067; Mon, 07 Jun 2021 16:04:39 -0700 (PDT) Received: from localhost.localdomain (84-217-56-54.customers.ownit.se. [84.217.56.54]) by smtp.gmail.com with ESMTPSA id v9sm1999563ljv.131.2021.06.07.16.04.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Jun 2021 16:04:38 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Tue, 8 Jun 2021 01:03:52 +0200 Message-Id: <20210607230414.612-14-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20210607230414.612-1-dcnieho@gmail.com> References: <20210607230414.612-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 13/35] avdevice: adding control message requesting to show config dialog 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: Diederick Niehorster Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: P10I5geKRn4T This control message can be used to programmatically ask a device to show its configuration dialog. Bumping avdevice version. Signed-off-by: Diederick Niehorster --- libavdevice/avdevice.h | 10 ++++++++++ libavdevice/version.h | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/libavdevice/avdevice.h b/libavdevice/avdevice.h index 6f24976dcc..4fbdf6aabc 100644 --- a/libavdevice/avdevice.h +++ b/libavdevice/avdevice.h @@ -190,6 +190,16 @@ enum AVAppToDevMessageType { */ AV_APP_TO_DEV_GET_VOLUME = MKBETAG('G', 'V', 'O', 'L'), AV_APP_TO_DEV_GET_MUTE = MKBETAG('G', 'M', 'U', 'T'), + + /** + * Request to show configuration dialog. + * + * If device has a configuration dialog of type indicated by + * data, show it. + * + * data: int. + */ + AV_APP_TO_DEV_CONFIG = MKBETAG('C', 'O', 'N', 'F'), }; /** diff --git a/libavdevice/version.h b/libavdevice/version.h index 6e593ba00e..0381d6cd0d 100644 --- a/libavdevice/version.h +++ b/libavdevice/version.h @@ -28,7 +28,7 @@ #include "libavutil/version.h" #define LIBAVDEVICE_VERSION_MAJOR 59 -#define LIBAVDEVICE_VERSION_MINOR 1 +#define LIBAVDEVICE_VERSION_MINOR 2 #define LIBAVDEVICE_VERSION_MICRO 100 #define LIBAVDEVICE_VERSION_INT AV_VERSION_INT(LIBAVDEVICE_VERSION_MAJOR, \ From patchwork Mon Jun 7 23:03:53 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Diederick C. Niehorster" X-Patchwork-Id: 28154 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:b214:0:0:0:0:0 with SMTP id b20csp3890214iof; Mon, 7 Jun 2021 16:11:14 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyToe+GQEKpB8tUMTe7BbRxhLHUcypBZk7p+A7+JCYF508T2kkR1bAvGHLhoPJ85xocZbgN X-Received: by 2002:a17:906:180a:: with SMTP id v10mr20132813eje.22.1623107474715; Mon, 07 Jun 2021 16:11:14 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1623107474; cv=none; d=google.com; s=arc-20160816; b=OF51vkK6SfjLVqfex2ZhskmASFwQsVNjU1wB+ExFXhYGrkT5n2/TGvGW6GBjnI23lO mRDpx2XD4Xp1eJnOj2ftpjvfTyD+vziWXRrRKH14gXoGWyB9DQZfTgxprDQFWgju9G5Y tg283itjGGjcXqMlKKl+fNgbkHtm3wmgb3NvUNCitABU0f7zZzgWilNlKidcI5Lnlko7 MKUqE07EmSyvVlogbUfS6qDJL7wub/WSqUBqa9WwFJvCd2dqnPaU+g3oCArfkoPRTvRa uNcQAPbn/rMI9N/8k2D8+G/tkeyveTwM1T7QyZTfFadh9zlmEbbi7cuwRrxup8wYqmP6 f93A== 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=OoAMEdfu0q+jysUjmUnWU5UcChrfLas+NG9dwhsW0EE=; b=0kAzpOJrzKV18qXt+8enT8pUatlHUXfIuwRFOthuvViSKvXf/tdpUr3bWSxYtavdEI OuhY+jCjpwpBqMVns3XByGKqHCqNbgEufzASk/5oxrfz0WXakq/EEfn+GCzfcmtZplZt MvaB/VWpI6/s+mkfwa68XwDmYQiNZdFnKov7f8VwSYTgINbom8RwV+czN1fmCRo5763i FY5vnUoaCHXcInVV0utH3hwU1iHlPoO/F3EDHVvjUkI9jP3FnRbCRx7Z/E8fP6Xwlvyn tr/HVfy2mQ66B/sL7aGIEOWDq2HElmsKY8FeFTbyL2aAu866aTJ7USgPYwHe58YAxp+v 3+DA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=SuFZQTSQ; 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 24si12951483ejx.746.2021.06.07.16.11.14; Mon, 07 Jun 2021 16:11:14 -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=20161025 header.b=SuFZQTSQ; 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 97EBD680C01; Tue, 8 Jun 2021 02:11:10 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lj1-f181.google.com (mail-lj1-f181.google.com [209.85.208.181]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id D7E5D680898 for ; Tue, 8 Jun 2021 02:11:08 +0300 (EEST) Received: by mail-lj1-f181.google.com with SMTP id s22so4003515ljg.5 for ; Mon, 07 Jun 2021 16:11:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=8Oi6aDNZ0FS0Qbgx9uIKTChQlg1nv3Uc9XuKFQnJuEM=; b=SuFZQTSQBko8J8POf1btYdw+uTkE6XjqWAvdbojit8k0LdF5m8FJy4/1xw5SsRJ72C PHEMf2scdA7WQUdHSsR7dur3V57T7lbazrYSn5Rv85JCuS7FT/GcO238M1NW2vBzpppl k9jruT2S6hwVJ9iK1yWvBrTuGuMMeghZwcGuBAfqB0OpNjFgS1MYRNG9DZUL6NMGlFJ9 0pePLVEIDtzqGoGzy8IwnpRxSeUmPQdPFQQk79vMzwJ/PAf2VVArNZaWQH3eyJGmvh++ LtoJq3FVQdVaKOMH2MBdXlPkqA1O0WpCdRp2QxlG2R5cqxfvWmaZqGQoY75I845+YMUa 6ksA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=8Oi6aDNZ0FS0Qbgx9uIKTChQlg1nv3Uc9XuKFQnJuEM=; b=nq0kdZyD2T/PpLdLVMBXT9LZpOYzLBSlaxlXYzkh5MUz72lqTL4+70QKT2zugWalp3 JzgQRO1aWD8CT+LGQHye0OAW+qhJujuSWzuSYCFH8DT+QR53PX7m/yQH1BVVdTwO1J0D Ctk5QBs1hVOPz9ogmn0MSGD3LcfaXj6SAnxRVSz71IP91TkJJMvJyqkuUhE/kEq5aG0c OlrcZoOu/dIhCyVg9UOv3TqZFgeJINxf/PntrJiSz3UKip++E8zPYt61yBF88h3atx7B qkbcpZIaK/KjvSL+jyZCiQ6Wl0pJyhUPZT8MFs0HHg2UrEq93GIRJ/OeS+/zOp5Pm0v6 TbEQ== X-Gm-Message-State: AOAM533yOzkPeEblONjQoFyjNUYau2s14+AVqS5oRorkGQFj8lyKz8Rv DPI2BJStNfFAGJ4D1F72LYNZHXJUOVwWFg== X-Received: by 2002:a2e:711e:: with SMTP id m30mr16754088ljc.489.1623107080024; Mon, 07 Jun 2021 16:04:40 -0700 (PDT) Received: from localhost.localdomain (84-217-56-54.customers.ownit.se. [84.217.56.54]) by smtp.gmail.com with ESMTPSA id v9sm1999563ljv.131.2021.06.07.16.04.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Jun 2021 16:04:39 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Tue, 8 Jun 2021 01:03:53 +0200 Message-Id: <20210607230414.612-15-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20210607230414.612-1-dcnieho@gmail.com> References: <20210607230414.612-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 14/35] avdevice/dshow: accept show config dialog control message 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: Diederick Niehorster Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: MIkAomGdaula DirectShow source will pop up its configuration dialog when AV_APP_TO_DEV_CONFIG is received. Implementation for several other possible configuration dialogs is more involved and will be provided in the next commit. Signed-off-by: Diederick Niehorster --- libavdevice/dshow.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/libavdevice/dshow.c b/libavdevice/dshow.c index 9f041e90f8..b3c005d3f7 100644 --- a/libavdevice/dshow.c +++ b/libavdevice/dshow.c @@ -1095,6 +1095,32 @@ static int dshow_control_message(AVFormatContext *avctx, int type, void *data, s case AV_APP_TO_DEV_TOGGLE_PAUSE: run_state = !run_state; break; + case AV_APP_TO_DEV_CONFIG: + { + /* + * Documentation of dialog variable: + * 1st bit: if set, audio device, if not set, video device + * 2nd bit: if set, show property dialog for audio/video capture device + * 3rd bit: if set, show property dialog for crossbar connecting pins filter on audio/video device + * 4th bit: if set, show property dialog for analog tuner audio / analog tuner filter + */ + int dialog = *(int *) data; + enum dshowDeviceType devtype = (dialog & 1) ? AudioDevice : VideoDevice; + if (dialog & 1<<1) { + // device_dialog + if (ctx->device_filter[devtype]) + ff_dshow_show_filter_properties(ctx->device_filter[devtype], avctx); + } + else if (dialog & 1<<2) { + // crossbar_connection_dialog + // TODO + } + else if (dialog & 1<<3) { + // tv_tuner_dialog + // TODO + } + break; + } } // if play state change requested, apply From patchwork Mon Jun 7 23:03:54 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Diederick C. Niehorster" X-Patchwork-Id: 28160 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:b214:0:0:0:0:0 with SMTP id b20csp3890109iof; Mon, 7 Jun 2021 16:11:04 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwfaTJjAG8I8d+lkkrQwZ9AlTY1O92HbcKC9PnC9Hq0kkPl7NzbKQviQJQvZ2mTk7NF8nuI X-Received: by 2002:a17:906:c1d2:: with SMTP id bw18mr19962015ejb.123.1623107464678; Mon, 07 Jun 2021 16:11:04 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1623107464; cv=none; d=google.com; s=arc-20160816; b=UY7FwGmuZTG/esUN6TZZ6jXyPxK0nW72Dpv0JByAlm+x8TobJYSJOHd2/mtYscq/T9 dg8P6dx+AZEyRsfk7iE+roSk2rq8GmVw6RBkSff1NRWNb53SEdPsf18uRDyMRhCYiS8P 7rkiTv6Dzx5rcBVAGhKdPHvu07w9f4Zylxa/zdQZlloY1QJ8MUjs/IwAD5nM2loWsXKX 5gFnvYQwMbGSP34wcNgIfuA6zmpJrCUwTx5CxFSgtFbb04jhoAqm3nfK+gBhTA9X+wPN PxTMV8LMa33kiaE+HiWyCB3NvNsF+Srq/oWePZUOPg21XyQow0u442yRm4ARB2HAztck pWSA== 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=XCu248PzwMAozMSlmdtLD+IxtRlVIM6FYC3XUfHe8Ok=; b=e1n0NHrC9OwVgQ/b89rjs1ydP/LDJodz1I/5ZoZBlO2a1jK2alVa80hJmRVO+/a36E yhgodrT+ufpDleiTiLw25I7qq3Jd0vw4n+Wx7HIf0BY5iYDPh/NM7jOyHRV9OACq7yf6 WW05V4pGpdJfvs25XzyAbARjkRsAzR8vTm2NQpVNm53pj0SfjxVlKPXx0GL1hsleabMM fSX7XThGeJkGx1fCiSKujeGSG2gbt7LV1YuOr0mBxYAE3GHoyAsJlSOctRpHLrX2n5vN HbxGnwS5hwMjuiPZ908YPgON1iydPhBR7s7UhOqhP4puZHmj5ymVUgIklhi8O4BMg90J VT6w== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=A0WhEgKK; 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 op2si13608135ejb.522.2021.06.07.16.11.04; Mon, 07 Jun 2021 16:11:04 -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=20161025 header.b=A0WhEgKK; 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 922AE688115; Tue, 8 Jun 2021 02:10:47 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lf1-f50.google.com (mail-lf1-f50.google.com [209.85.167.50]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 1A9996818DB for ; Tue, 8 Jun 2021 02:10:45 +0300 (EEST) Received: by mail-lf1-f50.google.com with SMTP id m21so13291156lfg.13 for ; Mon, 07 Jun 2021 16:10:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=TiS2EyLNfOgvHsMC5x9MpWtcUa1+OfdI7FPuIjhXpYk=; b=A0WhEgKKpPqOiTaLbhioejBy69Abeur8qI1OaRh7vb8pGO6IRN9QJPMKlZXAfQfcbN GRAKTj7EOW1fm9dzIKVWl0WndjjtxydzNdPpJOlaDeVWSMQKtQb0n+KynVIj7UK4AnIq By1PS3g36mbdiqt9/cvfybOWiGbOB2RHsiVcZU5hlIDzCLPZ3pIUF1mGRdK0fzDfp1nW GwUliNLRJagV9FKiyypBevsbLMIKUEXZuPIADH177Uf8xfQL5Vaq8Lh0o9LnuYA+xPre DZyP1rE+oRBo2sQ04OQlgNLjDv2JR4R74AuCJNGGtAVHp9bpR7tTUH6GGTWqBpxf/NGz 3RiA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=TiS2EyLNfOgvHsMC5x9MpWtcUa1+OfdI7FPuIjhXpYk=; b=J1tyqjI7fCtN8ZHpkOMcGiDEGII6wBJc3+XB6T0nvxCiW3ZwrpdMpAr+xyzhd4BWU+ LjZNcDHCBb/sB7wy2yNRZ10k14FIsMWltCmQ3+IvbVyq5TDClXdsLtg+3hPI4Te3Amqi /HFrXsjgwUXIGyNMi0bYF86RHkVU3FqjwHSDoc/JbOphcYxISmRpfqly1/Ovh5NOcdLo qP1lKScyz+N1gSI/FlI6A/rDcSqw1v5nqK4yUm0i7Cw7u3tv8vg+zIDxrfTKtq6O+zOA G6W99d8L3GEtT/jqvDgg1kD5FGfvV7Vz0kbRXGIa8XjmUxqNXP/NWFIwJsemjkHHRHm/ Ouxg== X-Gm-Message-State: AOAM532Wg6RWNBc4atb9u0Ir4tSng1EhyupUiXczcMpTH1UacqoH14WY +MRAJkF7H1afW8C6wXp/cGuWWuktFS0BVA== X-Received: by 2002:a2e:bf2a:: with SMTP id c42mr16514462ljr.1.1623107080816; Mon, 07 Jun 2021 16:04:40 -0700 (PDT) Received: from localhost.localdomain (84-217-56-54.customers.ownit.se. [84.217.56.54]) by smtp.gmail.com with ESMTPSA id v9sm1999563ljv.131.2021.06.07.16.04.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Jun 2021 16:04:40 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Tue, 8 Jun 2021 01:03:54 +0200 Message-Id: <20210607230414.612-16-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20210607230414.612-1-dcnieho@gmail.com> References: <20210607230414.612-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 15/35] avdevice/dshow: tv_tuner_audio_dialog cleanup missing 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: Diederick Niehorster Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: qgVRvEfbJ06q Cleanup in case the show_analog_tv_tuner_audio_dialog was set was missing. Signed-off-by: Diederick Niehorster --- libavdevice/dshow_crossbar.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/libavdevice/dshow_crossbar.c b/libavdevice/dshow_crossbar.c index 2438683cde..961defe690 100644 --- a/libavdevice/dshow_crossbar.c +++ b/libavdevice/dshow_crossbar.c @@ -204,5 +204,9 @@ end: IAMTVTuner_Release(tv_tuner_filter); if (tv_tuner_base_filter) IBaseFilter_Release(tv_tuner_base_filter); + if (tv_audio_filter) + IAMAudioInputMixer_Release(tv_audio_filter); + if (tv_audio_base_filter) + IBaseFilter_Release(tv_audio_base_filter); return hr; } From patchwork Mon Jun 7 23:03:55 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Diederick C. Niehorster" X-Patchwork-Id: 28162 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:b214:0:0:0:0:0 with SMTP id b20csp3898650iof; Mon, 7 Jun 2021 16:25:24 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzlVirLFDnLqJI8u3UB1U8EDvUxeIUf4vVxjF2W0i3/16wIdaJ8M1QHDx4+yAbSpHN48kvO X-Received: by 2002:aa7:dd14:: with SMTP id i20mr22838921edv.110.1623108323910; Mon, 07 Jun 2021 16:25:23 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1623108323; cv=none; d=google.com; s=arc-20160816; b=pwAj0YfcjH8owu/X2jwAOdt+bV9jiKjstZ9PNxTxAMlBYeZqOEsrcTfCgiZx7sZNNE N/2N2YSfWR/jDePxxABaZJBxORTfzs1bUjZteUqnoNGrp+C1Lzghhgufgb91FaLGMAAu HsEwiS41QEwxZh5eEHRfVN3Is6BRNJeBwDpBRuBLv9PZpD8m3stvbVujp+iGN/hYBpl6 c4uU9xiYTFqiNTGIs1zYyfS5KExDC6omfNgoCshnN/m9rL+mQrvnDF/CqxEU8fNdJasK T5cW6NRm6e/qd/vu4HTVdszWo8+nHDlGU9rR34a0WAFLzxhZJQahKC9tfDU4ZK4mmiOx 738A== 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=cSYfmI3FkBi2A1vZ2BWBm1l7bYrZ7DoTvuSt5dJXsM0=; b=HN1xjM6tyizOs5T3/IGWOeCRQoRlXsZ/tCum8cq+JaN9W3CHrJiMDvyh+AMyqE0Qwb tTnyDZpFIqjW/pzUBD9lijYhKNW9WL3PKNj0ZOcBZzUYEim7woGC7AJwBAqhdmZmq+FW v5fajtCtqPAXX3qtA+2z67tlLMGIQYLNvph+znhAiGohOZkHHUATATCAfp2wXg2Xj81y r8qxlIoycOD0kbj0eF8Dd95NmhY4HZHswh1kDBJTeK7S/cc9wToiM4Ro4uojdCc/bnYg vLSkgNGHpfh2nXT5t2cxCT9JjfM4xIehbk0c0gFK2OfJ1v1D7bbYJaltI+vQn+TlLhL4 J+Qw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=NoG8vBSL; 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 q15si6818669edd.4.2021.06.07.16.25.22; Mon, 07 Jun 2021 16:25:23 -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=20161025 header.b=NoG8vBSL; 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 C246068804B; Tue, 8 Jun 2021 02:25:20 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lf1-f51.google.com (mail-lf1-f51.google.com [209.85.167.51]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 78E4E6804B3 for ; Tue, 8 Jun 2021 02:25:14 +0300 (EEST) Received: by mail-lf1-f51.google.com with SMTP id v22so27710655lfa.3 for ; Mon, 07 Jun 2021 16:25:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=OGUMfd5Cc4GFPZOtAPQCVer/++AQwqD22Yy5WZibdJc=; b=NoG8vBSLoVeinfToBhHoSuWFyZNraIONrQvfa47fiLdpLJaGTBq/xBim0Xjc0OTNDT mkGCVoikOMCiT7NggBUVFzQciNRqYTXMiX/QXRjyqDr9eH8zrk0u1hVFC+D/iQj3IVwT SaIZZKQi44gjEp5I9jvZN9mpgsJgmL94uWhfxM0Xr21zGUtyF8NLKKHbX3W2SmeqJB3r 3gXOBtOzLB+cYmjatazKGDKDQC+5E/uu9nH2/El4cZM27HswC0o66Lhad4meQTdxCxZY 75M2yCL0E3ZK0XPeB+77tUoXBqNGCeUuc3jWkB+GKlqgFC7q1+GYqJrGdpBjm/apOQQ3 /JDw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=OGUMfd5Cc4GFPZOtAPQCVer/++AQwqD22Yy5WZibdJc=; b=X5g8SrjfvUo5YKx3VDgtqIMDnYJc3m3B+0jk6zzpxAepQeRkHlJakQdzQtg099U0/d yLBRsj4H7wD/ox+p85TjDrq6FzhgmISdpyBwthfZmnzZUy0ynntU0sUo4GjaOvi+8ush CsbX2BV9yMTLbIyXEOC2c/2dBMSFs0Z6fcOAk889aZCz34/oD5H+BY4J+d2MU+AYCIbf vJjbkIztGjhaRj5c59zgFqTYX1vnEr36RnipDfaZ4sW6zI33wA5FH6a/KY3b3ffe8Pwe 6CVlEbO08cZxYUg3ylU1aFhwupTEpfdMK7m/rolDrMIb/Q8P31ecJP2vWpNIyruuY85D DH4w== X-Gm-Message-State: AOAM530050pJgoWfsfBG1JDNGQxHLO4qYgwHK84bst+7lvEWtX5ieVRB e0XhaGfL3g84zApnq3q/smXpS1OEyxqH/w== X-Received: by 2002:a19:4307:: with SMTP id q7mr13267640lfa.262.1623107081805; Mon, 07 Jun 2021 16:04:41 -0700 (PDT) Received: from localhost.localdomain (84-217-56-54.customers.ownit.se. [84.217.56.54]) by smtp.gmail.com with ESMTPSA id v9sm1999563ljv.131.2021.06.07.16.04.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Jun 2021 16:04:41 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Tue, 8 Jun 2021 01:03:55 +0200 Message-Id: <20210607230414.612-17-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20210607230414.612-1-dcnieho@gmail.com> References: <20210607230414.612-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 16/35] avdevice/dshow: add config dialog command for crossbar and tv tuner 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: Diederick Niehorster Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: fmdbke/DrSLy The "show config dialog" command message can now also trigger dialog boxes for the crossbar connecting pins filter the analog tuner audio / analog tuner filters. _Untested_ as I do not have either device. Signed-off-by: Diederick Niehorster --- libavdevice/dshow.c | 52 +++++++++++++++++++-- libavdevice/dshow_capture.h | 10 ++++ libavdevice/dshow_crossbar.c | 91 +++++++++++++++++++++++------------- 3 files changed, 115 insertions(+), 38 deletions(-) diff --git a/libavdevice/dshow.c b/libavdevice/dshow.c index b3c005d3f7..d8a97797cc 100644 --- a/libavdevice/dshow.c +++ b/libavdevice/dshow.c @@ -60,6 +60,11 @@ dshow_read_close(AVFormatContext *s) struct dshow_ctx *ctx = s->priv_data; PacketList *pktl; + if (ctx->graph_builder2[VideoDevice]) + ICaptureGraphBuilder2_Release(ctx->graph_builder2[VideoDevice]); + if (ctx->graph_builder2[AudioDevice]) + ICaptureGraphBuilder2_Release(ctx->graph_builder2[AudioDevice]); + if (ctx->control) { IMediaControl_Stop(ctx->control); IMediaControl_Release(ctx->control); @@ -1040,6 +1045,7 @@ dshow_open_device(AVFormatContext *avctx, ICreateDevEnum *devenum, av_log(avctx, AV_LOG_ERROR, "Could not create CaptureGraphBuilder2\n"); goto error; } + ctx->graph_builder2[devtype] = graph_builder2; ICaptureGraphBuilder2_SetFiltergraph(graph_builder2, graph); if (r != S_OK) { av_log(avctx, AV_LOG_ERROR, "Could not set graph for CaptureGraphBuilder2\n"); @@ -1064,9 +1070,6 @@ dshow_open_device(AVFormatContext *avctx, ICreateDevEnum *devenum, ret = 0; error: - if (graph_builder2 != NULL) - ICaptureGraphBuilder2_Release(graph_builder2); - if (pers_stream) IPersistStream_Release(pers_stream); @@ -1113,11 +1116,50 @@ static int dshow_control_message(AVFormatContext *avctx, int type, void *data, s } else if (dialog & 1<<2) { // crossbar_connection_dialog - // TODO + if (ctx->device_filter[devtype] && ctx->graph_builder2[devtype]) { + IAMCrossbar *cross_bar = NULL; + IBaseFilter *cross_bar_base_filter = NULL; + hr = ff_dshow_get_crossbar_and_filter(ctx->graph_builder2[devtype], ctx->device_filter[devtype], cross_bar, &cross_bar_base_filter); + + if (hr == S_OK && cross_bar_base_filter) + ff_dshow_show_filter_properties(cross_bar_base_filter, avctx); + + if (cross_bar) + IAMCrossbar_Release(cross_bar); + if (cross_bar_base_filter) + IBaseFilter_Release(cross_bar_base_filter); + } } else if (dialog & 1<<3) { // tv_tuner_dialog - // TODO + if (ctx->device_filter[devtype] && ctx->graph_builder2[devtype]) { + if (devtype == VideoDevice) { + IAMTVTuner *tv_tuner_filter = NULL; + IBaseFilter *tv_tuner_base_filter = NULL; + hr = ff_dshow_get_tvtuner_and_filter(ctx->graph_builder2[devtype], ctx->device_filter[devtype], tv_tuner_filter, tv_tuner_base_filter); + + if (hr == S_OK && tv_tuner_base_filter) + ff_dshow_show_filter_properties(tv_tuner_base_filter, avctx); + + if (tv_tuner_filter) + IAMTVTuner_Release(tv_tuner_filter); + if (tv_tuner_base_filter) + IBaseFilter_Release(tv_tuner_base_filter); + } + else { + IAMAudioInputMixer *tv_audio_filter = NULL; + IBaseFilter *tv_audio_base_filter = NULL; + hr = ff_dshow_get_audiomixer_and_filter(ctx->graph_builder2[devtype], ctx->device_filter[devtype], tv_audio_filter, tv_audio_base_filter); + + if (hr == S_OK && tv_audio_base_filter) + ff_dshow_show_filter_properties(tv_audio_base_filter, avctx); + + if (tv_audio_filter) + IAMAudioInputMixer_Release(tv_audio_filter); + if (tv_audio_base_filter) + IBaseFilter_Release(tv_audio_base_filter); + } + } } break; } diff --git a/libavdevice/dshow_capture.h b/libavdevice/dshow_capture.h index bb0f76a8f2..127695a86b 100644 --- a/libavdevice/dshow_capture.h +++ b/libavdevice/dshow_capture.h @@ -318,6 +318,7 @@ struct dshow_ctx { IPin *device_pin[2]; DShowFilter *capture_filter[2]; DShowPin *capture_pin[2]; + ICaptureGraphBuilder2 *graph_builder2[2]; HANDLE mutex; HANDLE event[2]; /* event[0] is set by DirectShow @@ -352,6 +353,15 @@ struct dshow_ctx { HRESULT ff_dshow_try_setup_crossbar_options(ICaptureGraphBuilder2 *graph_builder2, IBaseFilter *device_filter, enum dshowDeviceType devtype, AVFormatContext *avctx); +HRESULT ff_dshow_get_crossbar_and_filter(ICaptureGraphBuilder2 *graph_builder2, IBaseFilter *device_filter, + IAMCrossbar *cross_bar, IBaseFilter **cross_bar_base_filter); + +HRESULT ff_dshow_get_tvtuner_and_filter(ICaptureGraphBuilder2 *graph_builder2, IBaseFilter *device_filter, + IAMTVTuner *tv_tuner_filter, IBaseFilter *tv_tuner_base_filter); + +HRESULT ff_dshow_get_audiomixer_and_filter(ICaptureGraphBuilder2 *graph_builder2, IBaseFilter *device_filter, + IAMAudioInputMixer *tv_audio_filter, IBaseFilter *tv_audio_base_filter); + void ff_dshow_show_filter_properties(IBaseFilter *pFilter, AVFormatContext *avctx); #endif /* AVDEVICE_DSHOW_CAPTURE_H */ diff --git a/libavdevice/dshow_crossbar.c b/libavdevice/dshow_crossbar.c index 961defe690..6b714e849c 100644 --- a/libavdevice/dshow_crossbar.c +++ b/libavdevice/dshow_crossbar.c @@ -133,6 +133,44 @@ setup_crossbar_options(IAMCrossbar *cross_bar, enum dshowDeviceType devtype, AVF return S_OK; } +HRESULT +ff_dshow_get_crossbar_and_filter(ICaptureGraphBuilder2 *graph_builder2, IBaseFilter *device_filter, + IAMCrossbar *cross_bar, IBaseFilter **cross_bar_base_filter) +{ + HRESULT hr = ICaptureGraphBuilder2_FindInterface(graph_builder2, &LOOK_UPSTREAM_ONLY, (const GUID *) NULL, + device_filter, &IID_IAMCrossbar, (void **) &cross_bar); + if (hr != S_OK) + /* no crossbar found */ + return hr; + + if (cross_bar_base_filter) + hr = IAMCrossbar_QueryInterface(cross_bar, &IID_IBaseFilter, (void**)cross_bar_base_filter); + + return hr; +} + +HRESULT +ff_dshow_get_tvtuner_and_filter(ICaptureGraphBuilder2 *graph_builder2, IBaseFilter *device_filter, + IAMTVTuner *tv_tuner_filter, IBaseFilter *tv_tuner_base_filter) +{ + HRESULT hr = ICaptureGraphBuilder2_FindInterface(graph_builder2, &LOOK_UPSTREAM_ONLY, NULL, + device_filter, &IID_IAMTVTuner, (void **) &tv_tuner_filter); + if (hr == S_OK) + hr = IAMCrossbar_QueryInterface(tv_tuner_filter, &IID_IBaseFilter, (void **) &tv_tuner_base_filter); + return hr; +} + +HRESULT +ff_dshow_get_audiomixer_and_filter(ICaptureGraphBuilder2 *graph_builder2, IBaseFilter *device_filter, + IAMAudioInputMixer *tv_audio_filter, IBaseFilter *tv_audio_base_filter) +{ + HRESULT hr = ICaptureGraphBuilder2_FindInterface(graph_builder2, &LOOK_UPSTREAM_ONLY, NULL, + device_filter, &IID_IAMTVAudio, (void **) &tv_audio_filter); + if (hr == S_OK) + hr = IAMCrossbar_QueryInterface(tv_audio_filter, &IID_IBaseFilter, (void **) &tv_audio_base_filter); + return hr; +} + /** * Given a fully constructed graph, check if there is a cross bar filter, and configure its pins if so. */ @@ -140,55 +178,42 @@ HRESULT ff_dshow_try_setup_crossbar_options(ICaptureGraphBuilder2 *graph_builder2, IBaseFilter *device_filter, enum dshowDeviceType devtype, AVFormatContext *avctx) { - struct dshow_ctx *ctx = avctx->priv_data; - IAMCrossbar *cross_bar = NULL; - IBaseFilter *cross_bar_base_filter = NULL; - IAMTVTuner *tv_tuner_filter = NULL; - IBaseFilter *tv_tuner_base_filter = NULL; - IAMAudioInputMixer *tv_audio_filter = NULL; - IBaseFilter *tv_audio_base_filter = NULL; + struct dshow_ctx *ctx = avctx->priv_data; + IAMCrossbar *cross_bar = NULL; + IBaseFilter *cross_bar_base_filter = NULL; + IAMTVTuner *tv_tuner_filter = NULL; + IBaseFilter *tv_tuner_base_filter = NULL; + IAMAudioInputMixer *tv_audio_filter = NULL; + IBaseFilter *tv_audio_base_filter = NULL; HRESULT hr; + int should_show_crossbar_properties = (devtype == VideoDevice) ? ctx->show_video_crossbar_connection_dialog : ctx->show_audio_crossbar_connection_dialog; - hr = ICaptureGraphBuilder2_FindInterface(graph_builder2, &LOOK_UPSTREAM_ONLY, (const GUID *) NULL, - device_filter, &IID_IAMCrossbar, (void**) &cross_bar); + hr = ff_dshow_get_crossbar_and_filter(graph_builder2, device_filter, cross_bar, should_show_crossbar_properties ? &cross_bar_base_filter : NULL); if (hr != S_OK) { - /* no crossbar found */ - hr = S_OK; + if (!cross_bar) + /* no crossbar found */ + hr = S_OK; goto end; } + /* TODO some TV tuners apparently have multiple crossbars? */ - if (devtype == VideoDevice && ctx->show_video_crossbar_connection_dialog || - devtype == AudioDevice && ctx->show_audio_crossbar_connection_dialog) { - hr = IAMCrossbar_QueryInterface(cross_bar, &IID_IBaseFilter, (void **) &cross_bar_base_filter); - if (hr != S_OK) - goto end; + if (should_show_crossbar_properties && cross_bar_base_filter) ff_dshow_show_filter_properties(cross_bar_base_filter, avctx); - } if (devtype == VideoDevice && ctx->show_analog_tv_tuner_dialog) { - hr = ICaptureGraphBuilder2_FindInterface(graph_builder2, &LOOK_UPSTREAM_ONLY, NULL, - device_filter, &IID_IAMTVTuner, (void**) &tv_tuner_filter); - if (hr == S_OK) { - hr = IAMCrossbar_QueryInterface(tv_tuner_filter, &IID_IBaseFilter, (void **) &tv_tuner_base_filter); - if (hr != S_OK) - goto end; + hr = ff_dshow_get_tvtuner_and_filter(graph_builder2, device_filter, tv_tuner_filter, tv_tuner_base_filter); + if (hr == S_OK && tv_tuner_base_filter) ff_dshow_show_filter_properties(tv_tuner_base_filter, avctx); - } else { + else av_log(avctx, AV_LOG_WARNING, "unable to find a tv tuner to display dialog for!"); - } } if (devtype == AudioDevice && ctx->show_analog_tv_tuner_audio_dialog) { - hr = ICaptureGraphBuilder2_FindInterface(graph_builder2, &LOOK_UPSTREAM_ONLY, NULL, - device_filter, &IID_IAMTVAudio, (void**) &tv_audio_filter); - if (hr == S_OK) { - hr = IAMCrossbar_QueryInterface(tv_audio_filter, &IID_IBaseFilter, (void **) &tv_audio_base_filter); - if (hr != S_OK) - goto end; + hr = ff_dshow_get_audiomixer_and_filter(graph_builder2, device_filter, tv_audio_filter, tv_audio_base_filter); + if (hr == S_OK && tv_audio_base_filter) ff_dshow_show_filter_properties(tv_audio_base_filter, avctx); - } else { + else av_log(avctx, AV_LOG_WARNING, "unable to find a tv audio tuner to display dialog for!"); - } } hr = setup_crossbar_options(cross_bar, devtype, avctx); From patchwork Mon Jun 7 23:03:56 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Diederick C. Niehorster" X-Patchwork-Id: 28131 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:b214:0:0:0:0:0 with SMTP id b20csp3885749iof; Mon, 7 Jun 2021 16:04:48 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyKr4FKFJgeykBQYqiNMS1+abvcRPGk9vrRGFJ2Y+lmxJYuZ5NZkO+RrB0q4QvbOZnLZ6Cm X-Received: by 2002:aa7:c4d0:: with SMTP id p16mr23038693edr.150.1623107088683; Mon, 07 Jun 2021 16:04:48 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1623107088; cv=none; d=google.com; s=arc-20160816; b=BrtSb4Lf7ilQjQH402BrynDru9U/Mk5HElnL9ad7TDhfnVo05ZJ+yXZO09W8fpLUNR w/Efj9T3xL+i6JEQ/gy/8EBpa+19XpRYdfXW530IrCJEW9QPnzZOBvnyxrum4KkqdO+T DF4CT/BkfSaXnYPsMQsB1DIH5YZLNpXXxdo4JNXDCq1RdQeoEBDHgrN4OoLZxRPyEmyl 6NrbE9ZjGaVJZjcsXstQY+grUH+qYumBsHTN33/bbugoCPMKbYhraSWPXYs3Up2V2Ndz A4aNM3jfGIcqonFvkxmeYX5FGu6nZ1G0+uu/i+yIbJaD9HlyF0AHQtp2nssUZMotDQIu mPUQ== 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=ZLt/rt4xdHB+vBqnMSwbD9hg0pCPouK/I8kzuUQJ1Eo=; b=a7KKIVOs+/U/4uhjpE9m9i4paL4Lfvpnl71JAvI/fe5LhVA4kNonuWYr4FcQEnfOTm mQKV/ij5Fb06SCmM3VzZnXt4EFNSRL/xPIecNvLV32uCvTSBeHydKIgG3KyrKbHWc9yg IE1bt+3nTOhn1dAbshoN1CDGA0VT13YNnBy9PWGqv1rQBcCLilpi90Ue+4kA42Wzb/K0 WNxyVDLt0BiD4CuQb4yUPqifqaLBHPsTxJP1rvBSUlBk/JPbBs3OuAzftemLYOt65+h4 bH1ZYnaTGvVB+lUjC6d6JRx6KnRkFKp9r3DQIvI4/tHzDh1XWXr2NSOEJoHS8d8fVXj8 a5XQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=JoO91yxw; 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 e7si11182939eds.607.2021.06.07.16.04.48; Mon, 07 Jun 2021 16:04:48 -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=20161025 header.b=JoO91yxw; 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 0C6EB6808D9; Tue, 8 Jun 2021 02:04:45 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lj1-f181.google.com (mail-lj1-f181.google.com [209.85.208.181]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 32F866802B6 for ; Tue, 8 Jun 2021 02:04:43 +0300 (EEST) Received: by mail-lj1-f181.google.com with SMTP id r16so5242946ljk.9 for ; Mon, 07 Jun 2021 16:04:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=iHdAuhOAnpZYrrkQnkinXR2KoaQk82/x/x4nyoZNn0I=; b=JoO91yxwUFNb7B/0flXY6oOkNSwQwe81VyQKBikRNGpsI9s/7GElWzHCkaXZHUPX2D 1BGfUjSOdsTrIOT+QeAVZWDu7jpEVYHim01dGdOd1CmsFHkuDKkWvb+RNJ0YYHJ1RG4+ 3n9Nkgk7OfwwwfcYA17GUmktgRTIbFOwA7bXjHLAN4ivq2Waftfcvx8uErJqtj7kAI56 JjVewFsolFU5KepczHcklYsk5FDzwq6ly31n0nfiq1R1NiTtM6uBXf+kAWx5oJpf1RuY Sd/St0qGVLBJg9uqDPNEY2exfPECfY+zOdpjoTh8mpMO5tu+CNNqU8kGokFXOFpXjT7d MJEA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=iHdAuhOAnpZYrrkQnkinXR2KoaQk82/x/x4nyoZNn0I=; b=sd8iLDgC7ZIX3NgL9ciuqBD3tHRhdcSWYH5H+xCf3L37Q91u60wRhAgo7vf6K/FNpK iWeemM5GCwnSlHxwTaZkYLKcGSx9WKlVOuWifBWZ88UH+KgiOyXJDBZZptfRWeUmE5kz MirayhTDOdj0L/sZW80K/CkiHcco6YQcl9/3jFN5CqsWZ/eU57ChetXIkQEBhr8YMmnu hruwFyotaYP14Km09T+vn2TYPkXWcomVv1k0JH4s9E+HqsNNDd0RQEp3tMNjp6gUiJCg Bp+XGzZYXQwL43GD1p5KY9dh9Jv5QA1MHO6++6yw3aOc/VIZaIMPCQ5s8bc+y2QE9I46 ioWg== X-Gm-Message-State: AOAM532oEBxeuGmF02k68h0ufXD4aWMtiyr0tpCkhkbXpsQNO84UWeSf K8q8LTr0+66LwovRy3VP0U4P+QACcLrpEQ== X-Received: by 2002:a2e:155e:: with SMTP id 30mr59858ljv.316.1623107082950; Mon, 07 Jun 2021 16:04:42 -0700 (PDT) Received: from localhost.localdomain (84-217-56-54.customers.ownit.se. [84.217.56.54]) by smtp.gmail.com with ESMTPSA id v9sm1999563ljv.131.2021.06.07.16.04.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Jun 2021 16:04:42 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Tue, 8 Jun 2021 01:03:56 +0200 Message-Id: <20210607230414.612-18-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20210607230414.612-1-dcnieho@gmail.com> References: <20210607230414.612-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 17/35] avdevice/dshow: discover source color range/space/etc 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: Diederick Niehorster , Valerii Zapodovnikov Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: HbELDXK5hSCr Enabled discovering a DirectShow device's color range, space, primaries, transfer characteristics and chroma location, if the device exposes that information. Sets them in the stream's codecpars. Signed-off-by: Diederick Niehorster Co-authored-by: Valerii Zapodovnikov --- libavdevice/dshow.c | 231 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 230 insertions(+), 1 deletion(-) diff --git a/libavdevice/dshow.c b/libavdevice/dshow.c index d8a97797cc..6a7bac579a 100644 --- a/libavdevice/dshow.c +++ b/libavdevice/dshow.c @@ -29,6 +29,7 @@ #include "libavcodec/raw.h" #include "objidl.h" #include "shlwapi.h" +#include "dxva.h" static enum AVPixelFormat dshow_pixfmt(DWORD biCompression, WORD biBitCount) @@ -54,6 +55,192 @@ static enum AVPixelFormat dshow_pixfmt(DWORD biCompression, WORD biBitCount) return avpriv_find_pix_fmt(avpriv_get_raw_pix_fmt_tags(), biCompression); // all others } +static enum AVColorRange dshow_color_range(DXVA_ExtendedFormat* fmt_info) +{ + switch (fmt_info->NominalRange) + { + case DXVA_NominalRange_Unknown: + return AVCOL_RANGE_UNSPECIFIED; + case DXVA_NominalRange_Normal: // equal to DXVA_NominalRange_0_255 + return AVCOL_RANGE_JPEG; + case DXVA_NominalRange_Wide: // equal to DXVA_NominalRange_16_235 + return AVCOL_RANGE_MPEG; + case DXVA_NominalRange_48_208: + // not an ffmpeg color range + return AVCOL_RANGE_UNSPECIFIED; + + // values from MediaFoundation SDK (mfobjects.h) + case 4: // MFNominalRange_64_127 + // not an ffmpeg color range + return AVCOL_RANGE_UNSPECIFIED; + + default: + return DXVA_NominalRange_Unknown; + } +} + +static enum AVColorSpace dshow_color_space(DXVA_ExtendedFormat* fmt_info) +{ + enum AVColorSpace ret = AVCOL_SPC_UNSPECIFIED; + + switch (fmt_info->VideoTransferMatrix) + { + case DXVA_VideoTransferMatrix_BT709: + ret = AVCOL_SPC_BT709; + break; + case DXVA_VideoTransferMatrix_BT601: + ret = AVCOL_SPC_BT470BG; + break; + case DXVA_VideoTransferMatrix_SMPTE240M: + ret = AVCOL_SPC_SMPTE240M; + break; + + // values from MediaFoundation SDK (mfobjects.h) + case 4: // MFVideoTransferMatrix_BT2020_10 + case 5: // MFVideoTransferMatrix_BT2020_12 + if (fmt_info->VideoTransferFunction==12) // MFVideoTransFunc_2020_const + ret = AVCOL_SPC_BT2020_CL; + else + ret = AVCOL_SPC_BT2020_NCL; + break; + } + + if (ret == AVCOL_SPC_UNSPECIFIED) + { + // if color space not known from transfer matrix, + // fall back to using primaries to guess color space + switch (fmt_info->VideoPrimaries) + { + case DXVA_VideoPrimaries_BT709: + ret = AVCOL_SPC_BT709; + break; + case DXVA_VideoPrimaries_BT470_2_SysM: + ret = AVCOL_SPC_FCC; + break; + case DXVA_VideoPrimaries_BT470_2_SysBG: + case DXVA_VideoPrimaries_EBU3213: // this is PAL + ret = AVCOL_SPC_BT470BG; + break; + case DXVA_VideoPrimaries_SMPTE170M: + case DXVA_VideoPrimaries_SMPTE_C: + ret = AVCOL_SPC_SMPTE170M; + break; + case DXVA_VideoPrimaries_SMPTE240M: + ret = AVCOL_SPC_SMPTE240M; + break; + } + } + + return ret; +} + +static enum AVColorPrimaries dshow_color_primaries(DXVA_ExtendedFormat* fmt_info) +{ + switch (fmt_info->VideoPrimaries) + { + case DXVA_VideoPrimaries_Unknown: + return AVCOL_PRI_UNSPECIFIED; + case DXVA_VideoPrimaries_reserved: + return AVCOL_PRI_RESERVED; + case DXVA_VideoPrimaries_BT709: + return AVCOL_PRI_BT709; + case DXVA_VideoPrimaries_BT470_2_SysM: + return AVCOL_PRI_BT470M; + case DXVA_VideoPrimaries_BT470_2_SysBG: + case DXVA_VideoPrimaries_EBU3213: // this is PAL + return AVCOL_PRI_BT470BG; + case DXVA_VideoPrimaries_SMPTE170M: + case DXVA_VideoPrimaries_SMPTE_C: + return AVCOL_PRI_SMPTE170M; + case DXVA_VideoPrimaries_SMPTE240M: + return AVCOL_PRI_SMPTE240M; + + // values from MediaFoundation SDK (mfobjects.h) + case 9: // MFVideoPrimaries_BT2020 + return AVCOL_PRI_BT2020; + case 10: // MFVideoPrimaries_XYZ + return AVCOL_PRI_SMPTE428; + case 11: // MFVideoPrimaries_DCI_P3 + return AVCOL_PRI_SMPTE431; + case 12: // MFVideoPrimaries_ACES (Academy Color Encoding System) + // not an FFmpeg color primary + return AVCOL_PRI_UNSPECIFIED; + + default: + return AVCOL_PRI_UNSPECIFIED; + } +} + +static enum AVColorTransferCharacteristic dshow_color_trc(DXVA_ExtendedFormat* fmt_info) +{ + switch (fmt_info->VideoTransferFunction) + { + case DXVA_VideoTransFunc_Unknown: + return AVCOL_TRC_UNSPECIFIED; + case DXVA_VideoTransFunc_10: + return AVCOL_TRC_LINEAR; + case DXVA_VideoTransFunc_18: + // not an FFmpeg transfer characteristic + return AVCOL_TRC_UNSPECIFIED; + case DXVA_VideoTransFunc_20: + // not an FFmpeg transfer characteristic + return AVCOL_TRC_UNSPECIFIED; + case DXVA_VideoTransFunc_22: + return AVCOL_TRC_GAMMA22; + case DXVA_VideoTransFunc_22_709: + return AVCOL_TRC_BT709; + case DXVA_VideoTransFunc_22_240M: + return AVCOL_TRC_SMPTE240M; + case DXVA_VideoTransFunc_22_8bit_sRGB: + return AVCOL_TRC_IEC61966_2_1; + case DXVA_VideoTransFunc_28: + return AVCOL_TRC_GAMMA28; + + // values from MediaFoundation SDK (mfobjects.h) + case 9: // MFVideoTransFunc_Log_100 + return AVCOL_TRC_LOG; + case 10: // MFVideoTransFunc_Log_316 + return AVCOL_TRC_LOG_SQRT; + case 11: // MFVideoTransFunc_709_sym + // not an FFmpeg transfer characteristic + return AVCOL_TRC_UNSPECIFIED; + case 12: // MFVideoTransFunc_2020_const + case 13: // MFVideoTransFunc_2020 + if (fmt_info->VideoTransferMatrix==5) // MFVideoTransferMatrix_BT2020_12 + return AVCOL_TRC_BT2020_12; + else + return AVCOL_TRC_BT2020_10; + case 14: // MFVideoTransFunc_26 + // not an FFmpeg transfer characteristic + return AVCOL_TRC_UNSPECIFIED; + case 15: // MFVideoTransFunc_2084 + return AVCOL_TRC_SMPTEST2084; + case 16: // MFVideoTransFunc_HLG + return AVCOL_TRC_ARIB_STD_B67; + case 17: // MFVideoTransFunc_10_rel + // not an FFmpeg transfer characteristic? Undocumented also by MS + return AVCOL_TRC_UNSPECIFIED; + + default: + return AVCOL_TRC_UNSPECIFIED; + } +} + +static enum AVChromaLocation dshow_chroma_loc(DXVA_ExtendedFormat* fmt_info) +{ + if (fmt_info->VideoChromaSubsampling == DXVA_VideoChromaSubsampling_Cosited) // that is: (DXVA_VideoChromaSubsampling_Horizontally_Cosited | DXVA_VideoChromaSubsampling_Vertically_Cosited | DXVA_VideoChromaSubsampling_Vertically_AlignedChromaPlanes) + return AVCHROMA_LOC_TOPLEFT; + else if (fmt_info->VideoChromaSubsampling == DXVA_VideoChromaSubsampling_MPEG1) // that is: DXVA_VideoChromaSubsampling_Vertically_AlignedChromaPlanes + return AVCHROMA_LOC_CENTER; + else if (fmt_info->VideoChromaSubsampling == DXVA_VideoChromaSubsampling_MPEG2) // that is: (DXVA_VideoChromaSubsampling_Horizontally_Cosited | DXVA_VideoChromaSubsampling_Vertically_AlignedChromaPlanes) + return AVCHROMA_LOC_LEFT; + else if (fmt_info->VideoChromaSubsampling == DXVA_VideoChromaSubsampling_DV_PAL)// that is: (DXVA_VideoChromaSubsampling_Horizontally_Cosited | DXVA_VideoChromaSubsampling_Vertically_Cosited) + return AVCHROMA_LOC_TOPLEFT; + else + // unknown + return AVCHROMA_LOC_UNSPECIFIED; +} + static int dshow_read_close(AVFormatContext *s) { @@ -522,6 +709,7 @@ dshow_cycle_formats(AVFormatContext *avctx, enum dshowDeviceType devtype, VIDEO_STREAM_CONFIG_CAPS *vcaps = caps; BITMAPINFOHEADER *bih; int64_t *fr; + DXVA_ExtendedFormat *extended_format_info = NULL; const AVCodecTag *const tags[] = { avformat_get_riff_video_tags(), NULL }; #if DSHOWDEBUG ff_print_VIDEO_STREAM_CONFIG_CAPS(vcaps); @@ -534,6 +722,8 @@ dshow_cycle_formats(AVFormatContext *avctx, enum dshowDeviceType devtype, VIDEOINFOHEADER2 *v = (void *) type->pbFormat; fr = &v->AvgTimePerFrame; bih = &v->bmiHeader; + if (v->dwControlFlags & AMCONTROL_COLORINFO_PRESENT) + extended_format_info = (DXVA_ExtendedFormat*)&v->dwControlFlags; } else { goto next; } @@ -550,11 +740,40 @@ dshow_cycle_formats(AVFormatContext *avctx, enum dshowDeviceType devtype, } else { av_log(avctx, AV_LOG_INFO, " pixel_format=%s", av_get_pix_fmt_name(pix_fmt)); } - av_log(avctx, AV_LOG_INFO, " min s=%ldx%ld fps=%g max s=%ldx%ld fps=%g\n", + av_log(avctx, AV_LOG_INFO, " min s=%ldx%ld fps=%g max s=%ldx%ld fps=%g", vcaps->MinOutputSize.cx, vcaps->MinOutputSize.cy, 1e7 / vcaps->MaxFrameInterval, vcaps->MaxOutputSize.cx, vcaps->MaxOutputSize.cy, 1e7 / vcaps->MinFrameInterval); + if (extended_format_info) { + enum AVColorRange col_range = dshow_color_range(extended_format_info); + enum AVColorSpace col_space = dshow_color_space(extended_format_info); + enum AVColorPrimaries col_prim = dshow_color_primaries(extended_format_info); + enum AVColorTransferCharacteristic col_trc = dshow_color_trc(extended_format_info); + enum AVChromaLocation chroma_loc = dshow_chroma_loc(extended_format_info); + if (col_range != AVCOL_RANGE_UNSPECIFIED || col_space != AVCOL_SPC_UNSPECIFIED || col_prim != AVCOL_PRI_UNSPECIFIED || col_trc != AVCOL_TRC_UNSPECIFIED) { + const char* range = av_color_range_name(col_range); + const char* space = av_color_space_name(col_space); + const char* prim = av_color_primaries_name(col_prim); + const char* trc = av_color_transfer_name(col_trc); + av_log(avctx, AV_LOG_INFO, " (%s, %s/%s/%s", + range ? range : "unknown", + space ? space : "unknown", + prim ? prim : "unknown", + trc ? trc : "unknown"); + if (chroma_loc != AVCHROMA_LOC_UNSPECIFIED) { + const char* chroma = av_chroma_location_name(chroma_loc); + av_log(avctx, AV_LOG_INFO, ", %s", chroma ? chroma : "unknown"); + } + av_log(avctx, AV_LOG_INFO, ")"); + } + else if (chroma_loc != AVCHROMA_LOC_UNSPECIFIED) { + const char* chroma = av_chroma_location_name(chroma_loc); + av_log(avctx, AV_LOG_INFO, "(%s)", chroma ? chroma : "unknown"); + } + } + + av_log(avctx, AV_LOG_INFO, "\n"); continue; } if (ctx->video_codec_id != AV_CODEC_ID_RAWVIDEO) { @@ -1233,6 +1452,7 @@ dshow_add_device(AVFormatContext *avctx, if (devtype == VideoDevice) { BITMAPINFOHEADER *bih = NULL; AVRational time_base; + DXVA_ExtendedFormat* extended_format_info = NULL; if (IsEqualGUID(&type.formattype, &FORMAT_VideoInfo)) { VIDEOINFOHEADER *v = (void *) type.pbFormat; @@ -1242,6 +1462,8 @@ dshow_add_device(AVFormatContext *avctx, VIDEOINFOHEADER2 *v = (void *) type.pbFormat; time_base = (AVRational) { v->AvgTimePerFrame, 10000000 }; bih = &v->bmiHeader; + if (v->dwControlFlags & AMCONTROL_COLORINFO_PRESENT) + extended_format_info = (DXVA_ExtendedFormat*)&v->dwControlFlags; } if (!bih) { av_log(avctx, AV_LOG_ERROR, "Could not get media type.\n"); @@ -1260,6 +1482,13 @@ dshow_add_device(AVFormatContext *avctx, av_log(avctx, AV_LOG_DEBUG, "attempt to use full range for HDYC...\n"); par->color_range = AVCOL_RANGE_MPEG; // just in case it needs this... } + if (extended_format_info) { + par->color_range = dshow_color_range(extended_format_info); + par->color_space = dshow_color_space(extended_format_info); + par->color_primaries = dshow_color_primaries(extended_format_info); + par->color_trc = dshow_color_trc(extended_format_info); + par->chroma_location = dshow_chroma_loc(extended_format_info); + } if (par->format == AV_PIX_FMT_NONE) { const AVCodecTag *const tags[] = { avformat_get_riff_video_tags(), NULL }; par->codec_id = av_codec_get_id(tags, bih->biCompression); From patchwork Mon Jun 7 23:03:57 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Diederick C. Niehorster" X-Patchwork-Id: 28148 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:b214:0:0:0:0:0 with SMTP id b20csp3885947iof; Mon, 7 Jun 2021 16:05:00 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyrQ59Ixvo1bELe+R8VDF++3GGMSfMyvF+g7h9csi8RrpSJXH+nSmQvDacIXioZBrR898l4 X-Received: by 2002:aa7:d6cc:: with SMTP id x12mr22458558edr.55.1623107100023; Mon, 07 Jun 2021 16:05:00 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1623107100; cv=none; d=google.com; s=arc-20160816; b=XKrb6v0AEDr9+EOKNsQgVq4GbnLxy0CVwmh4uS18s7OL580DWtI8uMH8OgQCXYo9ZN Ar0jaUa/dF7/VXPTC3tcxociXraB+FW8pk4qXIlKtx+9h4m2jreCzyOYynPmC/AI+IZu b7d9VFieEfojtc5haiC5P8IZW60UQW2ISvL2WzN+wTotE5OfZ28u/RYhLcp7aUKaqphg /w3yWEmKDzqKHrDat+a8EbjV9P47nQjtsmV1AzbgDiWmdMe4HEAgU5VIKaAOsvaOMRIm EP3pM0GuYok3iE6TLrO+eJckPG5G89q6zi3GKp6nC6c6GvFwcO6nkANXU2qWYcz3zyQY Nt3w== 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=88YsbiGv3SJIniMWD/OayQTJSzyHKVZs3zuEnrIV+Zk=; b=H2BH5bD0NnSymdS5ySood1xvgCNWYZUrZuKfkT0rPMip6ZDDRF9bMJR7A7A21Qal/Y CqLxq9O7Crb/Md4IyJFi1EJuvdXn6/r2pWOU226FvHw8g+r9Zm7rm/kmOIAqnd/qR3vt EU2z6Cn8mFgja2ahjgfSeuuy8eDOIfzgvFqA+VHXPY5ZNC2Lz8iq1/7UUGGscKXMbF9r +VG8dWCNA20d7/GQsXsadpnhZHWgGU8r/+NwgeUw+5kZK0eEqe2xTV5fQ4PyuscbLaOz ODATPwARnWk6s9FeDBJL/o3CqxRMjPnFlx4uoSHQjwdcmKT+duoIsT5N94AC+sXTW3l+ Sflg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=Zh04+yBS; 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 l20si13366936ejz.525.2021.06.07.16.04.59; Mon, 07 Jun 2021 16:05:00 -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=20161025 header.b=Zh04+yBS; 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 EA7266808BA; Tue, 8 Jun 2021 02:04:47 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lf1-f46.google.com (mail-lf1-f46.google.com [209.85.167.46]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id A0D7A6808F5 for ; Tue, 8 Jun 2021 02:04:45 +0300 (EEST) Received: by mail-lf1-f46.google.com with SMTP id r198so25655447lff.11 for ; Mon, 07 Jun 2021 16:04:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=C/Guu3n6us0bq9w+SdFJeKNDZnNJjbO4coPCLwul6qI=; b=Zh04+yBS/xxo8ivRwI379dPypN1n2oR8FDiiUnI7sPa4zPR5oPoTIcKgwrM3nACV8t hJW3XxjRVr0PZaJKu69FefVNHC1H0C32Jc+CyL4HPKTqt7sGfNml/LdmWPhibeynDY15 DOg8gsOiNVgChLusmE9hAsNstFHhus+PrD+FQqEH+DDL59iSkGtEY+/SzHtjqakTEKaF /aFXouDpw6qTsYvAAwVkvCXCPXt9rbbo/l2H1gsOplyF4joncpNYLixInSv4nYBN9oDm gn6D36Xi6htO7fiKOyU5Tyhqz7wRsNdIJwQNcUoxkXs/ENZ1aYc3wASkPLVmwvFXEFcz PxuA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=C/Guu3n6us0bq9w+SdFJeKNDZnNJjbO4coPCLwul6qI=; b=p83TiZNRh/x5XsPpYtnIDCnnzWZlJOS0X+JV5uS0BRY/ukhA3cDbrVpCnA9hbOYwaB NDXaTdjtCT8gqcYVnVL5d5fioHxL16mE3YH6hevRF4H4UTcieNgphNgFPcSYDrpM+y+i xVOZ/Wf1BoguzB2VTv1TNp5MB0oPNkD9wglIGa0Oe4cA4lI0m6a5eo2lPeeLQYU+4eWV 7sZBs97ZTlXZcaHfY9Jkxpoj79lNh6rUWgFx4gUdrW9fwgq6Ucx42VRLc/7+Pj2iAlGr hBehH2nAff/PmNSZJLGxcXIx/SIGAGpYig6D9Q+dDlpCc34+oZRh9f3AbvjWYiwTQC7K Y2JQ== X-Gm-Message-State: AOAM530l6csZMC0RUioQfF3sddVxUPa3iuyZ/xeUY+GMtIVurJFOc+0h Od7UKV9jNUZdLahbZuoPDxqGW2g3+o/33g== X-Received: by 2002:ac2:46f0:: with SMTP id q16mr8440463lfo.293.1623107084154; Mon, 07 Jun 2021 16:04:44 -0700 (PDT) Received: from localhost.localdomain (84-217-56-54.customers.ownit.se. [84.217.56.54]) by smtp.gmail.com with ESMTPSA id v9sm1999563ljv.131.2021.06.07.16.04.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Jun 2021 16:04:43 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Tue, 8 Jun 2021 01:03:57 +0200 Message-Id: <20210607230414.612-19-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20210607230414.612-1-dcnieho@gmail.com> References: <20210607230414.612-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 18/35] avdevice/dshow: select format with extended color info 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: Diederick Niehorster Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: ph1HP0A8ZJgb Some DirectShow devices (Logitech C920 webcam) expose each DirectShow format they support twice, once without and once with extended color information. During format selection, both match, this patch ensures that the format with extended color information is selected if it is available, else it falls back to a matching format without such information. This also necessitated a new code path taken for default formats of a device (when user didn't request any specific video size, etc), because the default format may be one without extended color information when a twin with extended color information is also available. Getting the extended color information when available is important as it allows setting the color space, range, primaries, transfer characteristics and chroma location of the stream provided by dshow, enabling users to get more correct color automatically out of their device. Closes: #9271 Signed-off-by: Diederick Niehorster --- libavdevice/dshow.c | 460 ++++++++++++++++++++++++++++++++------------ 1 file changed, 332 insertions(+), 128 deletions(-) diff --git a/libavdevice/dshow.c b/libavdevice/dshow.c index 6a7bac579a..252db47351 100644 --- a/libavdevice/dshow.c +++ b/libavdevice/dshow.c @@ -23,6 +23,7 @@ #include "libavutil/parseutils.h" #include "libavutil/pixdesc.h" #include "libavutil/opt.h" +#include "libavutil/mem.h" #include "libavformat/internal.h" #include "libavformat/riff.h" #include "avdevice.h" @@ -671,9 +672,111 @@ error: return ret; } +static int dshow_should_set_format(AVFormatContext* avctx, enum dshowDeviceType devtype) +{ + struct dshow_ctx* ctx = avctx->priv_data; + + return (devtype == VideoDevice && (ctx->framerate || + (ctx->requested_width && ctx->requested_height) || + ctx->pixel_format != AV_PIX_FMT_NONE || + ctx->video_codec_id != AV_CODEC_ID_RAWVIDEO)) + || (devtype == AudioDevice && (ctx->channels || ctx->sample_size || ctx->sample_rate)); +} + + +struct dshow_format_info { + enum dshowDeviceType devtype; + // video + int64_t framerate; + enum AVPixelFormat pix_fmt; + enum AVCodecID codec_id; + enum AVColorRange col_range; + enum AVColorSpace col_space; + enum AVColorPrimaries col_prim; + enum AVColorTransferCharacteristic col_trc; + enum AVChromaLocation chroma_loc; + int width; + int height; + // audio + int sample_rate; + int sample_size; + int channels; +}; + +// user must av_free the returned pointer +static struct dshow_format_info* dshow_get_format_info(AM_MEDIA_TYPE* type) +{ + struct dshow_format_info *fmt_info = NULL; + BITMAPINFOHEADER *bih; + DXVA_ExtendedFormat *extended_format_info = NULL; + WAVEFORMATEX *fx; + enum dshowDeviceType devtype; + int64_t framerate; + + if (!type) + return NULL; + + if (IsEqualGUID(&type->formattype, &FORMAT_VideoInfo)) { + VIDEOINFOHEADER *v = (void *) type->pbFormat; + framerate = v->AvgTimePerFrame; + bih = &v->bmiHeader; + devtype = VideoDevice; + } else if (IsEqualGUID(&type->formattype, &FORMAT_VideoInfo2)) { + VIDEOINFOHEADER2 *v = (void *) type->pbFormat; + devtype = VideoDevice; + framerate = v->AvgTimePerFrame; + bih = &v->bmiHeader; + if (v->dwControlFlags & AMCONTROL_COLORINFO_PRESENT) + extended_format_info = (DXVA_ExtendedFormat *) &v->dwControlFlags; + } else if (IsEqualGUID(&type->formattype, &FORMAT_WaveFormatEx)) { + fx = (void *) type->pbFormat; + devtype = AudioDevice; + } else { + return NULL; + } + + fmt_info = av_mallocz(sizeof(struct dshow_format_info)); + if (!fmt_info) + return NULL; + // initialize fields where unset is not zero + fmt_info->pix_fmt = AV_PIX_FMT_NONE; + fmt_info->col_space = AVCOL_SPC_UNSPECIFIED; + fmt_info->col_prim = AVCOL_PRI_UNSPECIFIED; + fmt_info->col_trc = AVCOL_TRC_UNSPECIFIED; + // now get info about format + fmt_info->devtype = devtype; + if (devtype == VideoDevice) { + fmt_info->width = bih->biWidth; + fmt_info->height = bih->biHeight; + fmt_info->framerate = framerate; + fmt_info->pix_fmt = dshow_pixfmt(bih->biCompression, bih->biBitCount); + if (fmt_info->pix_fmt == AV_PIX_FMT_NONE) { + const AVCodecTag *const tags[] = { avformat_get_riff_video_tags(), NULL }; + fmt_info->codec_id = av_codec_get_id(tags, bih->biCompression); + } + else + fmt_info->codec_id = AV_CODEC_ID_RAWVIDEO; + + if (extended_format_info) { + fmt_info->col_range = dshow_color_range(extended_format_info); + fmt_info->col_space = dshow_color_space(extended_format_info); + fmt_info->col_prim = dshow_color_primaries(extended_format_info); + fmt_info->col_trc = dshow_color_trc(extended_format_info); + fmt_info->chroma_loc = dshow_chroma_loc(extended_format_info); + } + } else { + fmt_info->sample_rate = fx->nSamplesPerSec; + fmt_info->sample_size = fx->wBitsPerSample; + fmt_info->channels = fx->nChannels; + } + + return fmt_info; +} + /** - * Cycle through available formats using the specified pin, - * try to set parameters specified through AVOptions and if successful + * Cycle through available formats available from the specified pin, + * try to set parameters specified through AVOptions, or the pin's + * default format if no such parameters were set. If successful, * return 1 in *pformat_set. * If pformat_set is NULL, list all pin capabilities. */ @@ -684,9 +787,27 @@ dshow_cycle_formats(AVFormatContext *avctx, enum dshowDeviceType devtype, struct dshow_ctx *ctx = avctx->priv_data; IAMStreamConfig *config = NULL; AM_MEDIA_TYPE *type = NULL; + AM_MEDIA_TYPE *previous_match_type = NULL; int format_set = 0; void *caps = NULL; int i, n, size, r; + int wait_for_better = 0; + int use_default; + + // format parameters requested by user + // if none are requested by user, the values will below be set to + // those of the default format + // video + enum AVCodecID requested_video_codec_id = ctx->video_codec_id; + enum AVPixelFormat requested_pixel_format = ctx->pixel_format; + int64_t requested_framerate = ctx->framerate ? ((int64_t)ctx->requested_framerate.den * 10000000) + / ctx->requested_framerate.num : 0; + int requested_width = ctx->requested_width; + int requested_height = ctx->requested_height; + // audio + int requested_sample_rate = ctx->sample_rate; + int requested_sample_size = ctx->sample_size; + int requested_channels = ctx->channels; if (IPin_QueryInterface(pin, &IID_IAMStreamConfig, (void **) &config) != S_OK) return; @@ -697,7 +818,84 @@ dshow_cycle_formats(AVFormatContext *avctx, enum dshowDeviceType devtype, if (!caps) goto end; + /** + * If we should open the device with the default format, + * then: + * 1. check what the format of the default device is, and + * 2. below we iterate all formats till we find a matching + * one, with most info exposed (see comment below). + */ + use_default = !dshow_should_set_format(avctx, devtype); + if (use_default && pformat_set) + { + HRESULT hr; + + // get default + if ((hr = IAMStreamConfig_GetFormat(config, &type)) != S_OK) { + if (hr == E_NOTIMPL || !IsEqualGUID(&type->majortype, devtype==VideoDevice ? &MEDIATYPE_Video : &MEDIATYPE_Audio)) { + // default not available or of wrong type, + // fall back to iterating exposed formats + // until one of the right type is found + IEnumMediaTypes *types = NULL; + if (IPin_EnumMediaTypes(pin, &types) != S_OK) + goto end; + IEnumMediaTypes_Reset(types); + while (IEnumMediaTypes_Next(types, 1, &type, NULL) == S_OK) { + if (IsEqualGUID(&type->majortype, devtype==VideoDevice ? &MEDIATYPE_Video : &MEDIATYPE_Audio)) { + break; + } + CoTaskMemFree(type); + type = NULL; + } + IEnumMediaTypes_Release(types); + } + + if (!type) + // this pin does not expose any video formats + goto end; + } + + if (type) { + // interrogate default format, so we know what to search for below + struct dshow_format_info *fmt_info = dshow_get_format_info(type); + if (fmt_info) { + if (fmt_info->devtype == VideoDevice) + { + requested_video_codec_id = fmt_info->codec_id; + requested_pixel_format = fmt_info->pix_fmt; + requested_framerate = fmt_info->framerate; + requested_width = fmt_info->width; + requested_height = fmt_info->height; + } else { + requested_sample_rate = fmt_info->sample_rate; + requested_sample_size = fmt_info->sample_size; + requested_channels = fmt_info->channels; + } + av_free(fmt_info); // free but don't set to NULL to enable below check + } + + if (type && type->pbFormat) + CoTaskMemFree(type->pbFormat); + CoTaskMemFree(type); + type = NULL; + if (!fmt_info) + // default format somehow invalid, can't continue with this pin + goto end; + fmt_info = NULL; + } + } + + // NB: some devices (e.g. Logitech C920) expose each video format twice: + // both a format containing a VIDEOINFOHEADER and a format containing + // a VIDEOINFOHEADER2. We want, if possible, to select a format with a + // VIDEOINFOHEADER2, as this potentially provides more info about the + // format. So, if in the iteration below we have found a matching format, + // but it is a VIDEOINFOHEADER, keep looking for a matching format that + // exposes contains a VIDEOINFOHEADER2. Fall back to the VIDEOINFOHEADER + // format if no corresponding VIDEOINFOHEADER2 is found when we finish + // iterating. for (i = 0; i < n && !format_set; i++) { + struct dshow_format_info *fmt_info = NULL; r = IAMStreamConfig_GetStreamCaps(config, i, &type, (void *) caps); if (r != S_OK) goto next; @@ -705,101 +903,96 @@ dshow_cycle_formats(AVFormatContext *avctx, enum dshowDeviceType devtype, ff_print_AM_MEDIA_TYPE(type); #endif + fmt_info = dshow_get_format_info(type); + if (!fmt_info) + goto next; + if (devtype == VideoDevice) { VIDEO_STREAM_CONFIG_CAPS *vcaps = caps; BITMAPINFOHEADER *bih; int64_t *fr; - DXVA_ExtendedFormat *extended_format_info = NULL; - const AVCodecTag *const tags[] = { avformat_get_riff_video_tags(), NULL }; #if DSHOWDEBUG ff_print_VIDEO_STREAM_CONFIG_CAPS(vcaps); #endif + + if (fmt_info->devtype != VideoDevice) + goto next; + if (IsEqualGUID(&type->formattype, &FORMAT_VideoInfo)) { VIDEOINFOHEADER *v = (void *) type->pbFormat; - fr = &v->AvgTimePerFrame; + fr = &v->AvgTimePerFrame; bih = &v->bmiHeader; + wait_for_better = 1; } else if (IsEqualGUID(&type->formattype, &FORMAT_VideoInfo2)) { VIDEOINFOHEADER2 *v = (void *) type->pbFormat; - fr = &v->AvgTimePerFrame; + fr = &v->AvgTimePerFrame; bih = &v->bmiHeader; - if (v->dwControlFlags & AMCONTROL_COLORINFO_PRESENT) - extended_format_info = (DXVA_ExtendedFormat*)&v->dwControlFlags; - } else { - goto next; + wait_for_better = 0; } + if (!pformat_set) { - enum AVPixelFormat pix_fmt = dshow_pixfmt(bih->biCompression, bih->biBitCount); - if (pix_fmt == AV_PIX_FMT_NONE) { - enum AVCodecID codec_id = av_codec_get_id(tags, bih->biCompression); - const AVCodec *codec = avcodec_find_decoder(codec_id); - if (codec_id == AV_CODEC_ID_NONE || !codec) { + if (fmt_info->pix_fmt == AV_PIX_FMT_NONE) { + const AVCodec *codec = avcodec_find_decoder(fmt_info->codec_id); + if (fmt_info->codec_id == AV_CODEC_ID_NONE || !codec) { av_log(avctx, AV_LOG_INFO, " unknown compression type 0x%X", (int) bih->biCompression); } else { av_log(avctx, AV_LOG_INFO, " vcodec=%s", codec->name); } } else { - av_log(avctx, AV_LOG_INFO, " pixel_format=%s", av_get_pix_fmt_name(pix_fmt)); + av_log(avctx, AV_LOG_INFO, " pixel_format=%s", av_get_pix_fmt_name(fmt_info->pix_fmt)); } av_log(avctx, AV_LOG_INFO, " min s=%ldx%ld fps=%g max s=%ldx%ld fps=%g", vcaps->MinOutputSize.cx, vcaps->MinOutputSize.cy, 1e7 / vcaps->MaxFrameInterval, vcaps->MaxOutputSize.cx, vcaps->MaxOutputSize.cy, 1e7 / vcaps->MinFrameInterval); - if (extended_format_info) { - enum AVColorRange col_range = dshow_color_range(extended_format_info); - enum AVColorSpace col_space = dshow_color_space(extended_format_info); - enum AVColorPrimaries col_prim = dshow_color_primaries(extended_format_info); - enum AVColorTransferCharacteristic col_trc = dshow_color_trc(extended_format_info); - enum AVChromaLocation chroma_loc = dshow_chroma_loc(extended_format_info); - if (col_range != AVCOL_RANGE_UNSPECIFIED || col_space != AVCOL_SPC_UNSPECIFIED || col_prim != AVCOL_PRI_UNSPECIFIED || col_trc != AVCOL_TRC_UNSPECIFIED) { - const char* range = av_color_range_name(col_range); - const char* space = av_color_space_name(col_space); - const char* prim = av_color_primaries_name(col_prim); - const char* trc = av_color_transfer_name(col_trc); - av_log(avctx, AV_LOG_INFO, " (%s, %s/%s/%s", - range ? range : "unknown", - space ? space : "unknown", - prim ? prim : "unknown", - trc ? trc : "unknown"); - if (chroma_loc != AVCHROMA_LOC_UNSPECIFIED) { - const char* chroma = av_chroma_location_name(chroma_loc); - av_log(avctx, AV_LOG_INFO, ", %s", chroma ? chroma : "unknown"); - } - av_log(avctx, AV_LOG_INFO, ")"); - } - else if (chroma_loc != AVCHROMA_LOC_UNSPECIFIED) { - const char* chroma = av_chroma_location_name(chroma_loc); - av_log(avctx, AV_LOG_INFO, "(%s)", chroma ? chroma : "unknown"); - } + + const char *chroma = av_chroma_location_name(fmt_info->chroma_loc); + if (fmt_info->col_range != AVCOL_RANGE_UNSPECIFIED || + fmt_info->col_space != AVCOL_SPC_UNSPECIFIED || + fmt_info->col_prim != AVCOL_PRI_UNSPECIFIED || + fmt_info->col_trc != AVCOL_TRC_UNSPECIFIED) { + const char *range = av_color_range_name(fmt_info->col_range); + const char *space = av_color_space_name(fmt_info->col_space); + const char *prim = av_color_primaries_name(fmt_info->col_prim); + const char *trc = av_color_transfer_name(fmt_info->col_trc); + av_log(avctx, AV_LOG_INFO, " (%s, %s/%s/%s", + range ? range : "unknown", + space ? space : "unknown", + prim ? prim : "unknown", + trc ? trc : "unknown"); + if (fmt_info->chroma_loc != AVCHROMA_LOC_UNSPECIFIED) + av_log(avctx, AV_LOG_INFO, ", %s", chroma ? chroma : "unknown"); + av_log(avctx, AV_LOG_INFO, ")"); } + else if (fmt_info->chroma_loc != AVCHROMA_LOC_UNSPECIFIED) + av_log(avctx, AV_LOG_INFO, "(%s)", chroma ? chroma : "unknown"); av_log(avctx, AV_LOG_INFO, "\n"); continue; } - if (ctx->video_codec_id != AV_CODEC_ID_RAWVIDEO) { - if (ctx->video_codec_id != av_codec_get_id(tags, bih->biCompression)) + if (requested_video_codec_id != AV_CODEC_ID_RAWVIDEO) { + if (requested_video_codec_id != fmt_info->codec_id) goto next; } - if (ctx->pixel_format != AV_PIX_FMT_NONE && - ctx->pixel_format != dshow_pixfmt(bih->biCompression, bih->biBitCount)) { + if (requested_pixel_format != AV_PIX_FMT_NONE && + requested_pixel_format != fmt_info->pix_fmt) { goto next; } - if (ctx->framerate) { - int64_t framerate = ((int64_t) ctx->requested_framerate.den*10000000) - / ctx->requested_framerate.num; - if (framerate > vcaps->MaxFrameInterval || - framerate < vcaps->MinFrameInterval) + if (requested_framerate) { + if (requested_framerate > vcaps->MaxFrameInterval || + requested_framerate < vcaps->MinFrameInterval) goto next; - *fr = framerate; + *fr = requested_framerate; } - if (ctx->requested_width && ctx->requested_height) { - if (ctx->requested_width > vcaps->MaxOutputSize.cx || - ctx->requested_width < vcaps->MinOutputSize.cx || - ctx->requested_height > vcaps->MaxOutputSize.cy || - ctx->requested_height < vcaps->MinOutputSize.cy) + if (requested_width && requested_height) { + if (requested_width > vcaps->MaxOutputSize.cx || + requested_width < vcaps->MinOutputSize.cx || + requested_height > vcaps->MaxOutputSize.cy || + requested_height < vcaps->MinOutputSize.cy) goto next; - bih->biWidth = ctx->requested_width; - bih->biHeight = ctx->requested_height; + bih->biWidth = requested_width; + bih->biHeight = requested_height; } } else { AUDIO_STREAM_CONFIG_CAPS *acaps = caps; @@ -818,34 +1011,63 @@ dshow_cycle_formats(AVFormatContext *avctx, enum dshowDeviceType devtype, acaps->MaximumChannels, acaps->MaximumBitsPerSample, acaps->MaximumSampleFrequency); continue; } - if (ctx->sample_rate) { - if (ctx->sample_rate > acaps->MaximumSampleFrequency || - ctx->sample_rate < acaps->MinimumSampleFrequency) + if (requested_sample_rate) { + if (requested_sample_rate > acaps->MaximumSampleFrequency || + requested_sample_rate < acaps->MinimumSampleFrequency) goto next; - fx->nSamplesPerSec = ctx->sample_rate; + fx->nSamplesPerSec = requested_sample_rate; } - if (ctx->sample_size) { - if (ctx->sample_size > acaps->MaximumBitsPerSample || - ctx->sample_size < acaps->MinimumBitsPerSample) + if (requested_sample_size) { + if (requested_sample_size > acaps->MaximumBitsPerSample || + requested_sample_size < acaps->MinimumBitsPerSample) goto next; - fx->wBitsPerSample = ctx->sample_size; + fx->wBitsPerSample = requested_sample_size; } - if (ctx->channels) { - if (ctx->channels > acaps->MaximumChannels || - ctx->channels < acaps->MinimumChannels) + if (requested_channels) { + if (requested_channels > acaps->MaximumChannels || + requested_channels < acaps->MinimumChannels) goto next; - fx->nChannels = ctx->channels; + fx->nChannels = requested_channels; } } - if (IAMStreamConfig_SetFormat(config, type) != S_OK) - goto next; - format_set = 1; + + // found a matching format. Either apply or store + // for safekeeping if we might maybe find a better + // format with more info attached to it (see comment + // above loop) + if (!wait_for_better) { + if (IAMStreamConfig_SetFormat(config, type) != S_OK) + goto next; + format_set = 1; + } + else if (!previous_match_type) { + // store this matching format for possible later use. + // If we have already found a matching format, ignore it + previous_match_type = type; + type = NULL; + } next: - if (type->pbFormat) + if (fmt_info) + av_free(fmt_info); + if (type && type->pbFormat) CoTaskMemFree(type->pbFormat); CoTaskMemFree(type); } + // previously found a matching VIDEOINFOHEADER format and stored + // it for safe keeping. Searching further for a matching + // VIDEOINFOHEADER2 format yielded nothing. So set the pin's + // format based on the VIDEOINFOHEADER format. + // NB: this never applies to an audio format because + // previous_match_type always NULL in that case + if (!format_set && previous_match_type) { + if (IAMStreamConfig_SetFormat(config, previous_match_type) == S_OK) + format_set = 1; + } + end: + if (previous_match_type && previous_match_type->pbFormat) + CoTaskMemFree(previous_match_type->pbFormat); + CoTaskMemFree(previous_match_type); IAMStreamConfig_Release(config); av_free(caps); if (pformat_set) @@ -964,11 +1186,7 @@ dshow_cycle_pins(AVFormatContext *avctx, enum dshowDeviceType devtype, const char *devtypename = (devtype == VideoDevice) ? "video" : "audio only"; const char *sourcetypename = (sourcetype == VideoSourceDevice) ? "video" : "audio"; - int set_format = (devtype == VideoDevice && (ctx->framerate || - (ctx->requested_width && ctx->requested_height) || - ctx->pixel_format != AV_PIX_FMT_NONE || - ctx->video_codec_id != AV_CODEC_ID_RAWVIDEO)) - || (devtype == AudioDevice && (ctx->channels || ctx->sample_rate)); + int set_format = dshow_should_set_format(avctx, devtype); int format_set = 0; int should_show_properties = (devtype == VideoDevice) ? ctx->show_video_device_dialog : ctx->show_audio_device_dialog; @@ -988,9 +1206,7 @@ dshow_cycle_pins(AVFormatContext *avctx, enum dshowDeviceType devtype, while (!device_pin && IEnumPins_Next(pins, 1, &pin, NULL) == S_OK) { IKsPropertySet *p = NULL; - IEnumMediaTypes *types = NULL; PIN_INFO info = {0}; - AM_MEDIA_TYPE *type; GUID category; DWORD r2; char *name_buf = NULL; @@ -1033,35 +1249,24 @@ dshow_cycle_pins(AVFormatContext *avctx, enum dshowDeviceType devtype, } } - if (set_format) { - dshow_cycle_formats(avctx, devtype, pin, &format_set); - if (!format_set) { - goto next; - } + // will either try to find format matching options supplied by user + // or try to open default format. Successful if returns with format_set==1 + dshow_cycle_formats(avctx, devtype, pin, &format_set); + if (!format_set) { + goto next; } + if (devtype == AudioDevice && ctx->audio_buffer_size) { if (dshow_set_audio_buffer_size(avctx, pin) < 0) { av_log(avctx, AV_LOG_ERROR, "unable to set audio buffer size %d to pin, using pin anyway...", ctx->audio_buffer_size); } } - if (IPin_EnumMediaTypes(pin, &types) != S_OK) - goto next; - - IEnumMediaTypes_Reset(types); - /* in case format_set was not called, just verify the majortype */ - while (!device_pin && IEnumMediaTypes_Next(types, 1, &type, NULL) == S_OK) { - if (IsEqualGUID(&type->majortype, mediatype[devtype])) { - device_pin = pin; - av_log(avctx, AV_LOG_DEBUG, "Selecting pin %s on %s\n", name_buf, devtypename); - goto next; - } - CoTaskMemFree(type); + if (format_set) { + device_pin = pin; + av_log(avctx, AV_LOG_DEBUG, "Selecting pin %s on %s\n", name_buf, devtypename); } - next: - if (types) - IEnumMediaTypes_Release(types); if (p) IKsPropertySet_Release(p); if (device_pin != pin) @@ -1433,6 +1638,7 @@ dshow_add_device(AVFormatContext *avctx, AM_MEDIA_TYPE type; AVCodecParameters *par; AVStream *st; + struct dshow_format_info *fmt_info = NULL; int ret = AVERROR(EIO); type.pbFormat = NULL; @@ -1447,12 +1653,14 @@ dshow_add_device(AVFormatContext *avctx, ctx->capture_filter[devtype]->stream_index = st->index; ff_dshow_pin_ConnectionMediaType(ctx->capture_pin[devtype], &type); + fmt_info = dshow_get_format_info(&type); + if (!fmt_info) + goto error; par = st->codecpar; if (devtype == VideoDevice) { BITMAPINFOHEADER *bih = NULL; AVRational time_base; - DXVA_ExtendedFormat* extended_format_info = NULL; if (IsEqualGUID(&type.formattype, &FORMAT_VideoInfo)) { VIDEOINFOHEADER *v = (void *) type.pbFormat; @@ -1462,8 +1670,6 @@ dshow_add_device(AVFormatContext *avctx, VIDEOINFOHEADER2 *v = (void *) type.pbFormat; time_base = (AVRational) { v->AvgTimePerFrame, 10000000 }; bih = &v->bmiHeader; - if (v->dwControlFlags & AMCONTROL_COLORINFO_PRESENT) - extended_format_info = (DXVA_ExtendedFormat*)&v->dwControlFlags; } if (!bih) { av_log(avctx, AV_LOG_ERROR, "Could not get media type.\n"); @@ -1474,33 +1680,21 @@ dshow_add_device(AVFormatContext *avctx, st->r_frame_rate = av_inv_q(time_base); par->codec_type = AVMEDIA_TYPE_VIDEO; - par->width = bih->biWidth; - par->height = bih->biHeight; + par->width = fmt_info->width; + par->height = fmt_info->height; par->codec_tag = bih->biCompression; - par->format = dshow_pixfmt(bih->biCompression, bih->biBitCount); + par->format = fmt_info->pix_fmt; if (bih->biCompression == MKTAG('H', 'D', 'Y', 'C')) { av_log(avctx, AV_LOG_DEBUG, "attempt to use full range for HDYC...\n"); par->color_range = AVCOL_RANGE_MPEG; // just in case it needs this... } - if (extended_format_info) { - par->color_range = dshow_color_range(extended_format_info); - par->color_space = dshow_color_space(extended_format_info); - par->color_primaries = dshow_color_primaries(extended_format_info); - par->color_trc = dshow_color_trc(extended_format_info); - par->chroma_location = dshow_chroma_loc(extended_format_info); - } - if (par->format == AV_PIX_FMT_NONE) { - const AVCodecTag *const tags[] = { avformat_get_riff_video_tags(), NULL }; - par->codec_id = av_codec_get_id(tags, bih->biCompression); - if (par->codec_id == AV_CODEC_ID_NONE) { - av_log(avctx, AV_LOG_ERROR, "Unknown compression type. " - "Please report type 0x%X.\n", (int) bih->biCompression); - ret = AVERROR_PATCHWELCOME; - goto error; - } - par->bits_per_coded_sample = bih->biBitCount; - } else { - par->codec_id = AV_CODEC_ID_RAWVIDEO; + par->color_range = fmt_info->col_range; + par->color_space = fmt_info->col_space; + par->color_primaries = fmt_info->col_prim; + par->color_trc = fmt_info->col_trc; + par->chroma_location = fmt_info->chroma_loc; + par->codec_id = fmt_info->codec_id; + if (par->codec_id == AV_CODEC_ID_RAWVIDEO) { if (bih->biCompression == BI_RGB || bih->biCompression == BI_BITFIELDS) { par->bits_per_coded_sample = bih->biBitCount; if (par->height < 0) { @@ -1513,6 +1707,14 @@ dshow_add_device(AVFormatContext *avctx, } } } + } else { + if (par->codec_id == AV_CODEC_ID_NONE) { + av_log(avctx, AV_LOG_ERROR, "Unknown compression type. " + "Please report type 0x%X.\n", (int) bih->biCompression); + ret = AVERROR_PATCHWELCOME; + goto error; + } + par->bits_per_coded_sample = bih->biBitCount; } } else { WAVEFORMATEX *fx = NULL; @@ -1537,6 +1739,8 @@ dshow_add_device(AVFormatContext *avctx, ret = 0; error: + if (fmt_info) + av_free(fmt_info); if (type.pbFormat) CoTaskMemFree(type.pbFormat); return ret; @@ -1839,8 +2043,8 @@ const AVInputFormat ff_dshow_demuxer = { .read_header = dshow_read_header, .read_packet = dshow_read_packet, .read_close = dshow_read_close, - .get_device_list= dshow_get_device_list, .control_message = dshow_control_message, + .get_device_list= dshow_get_device_list, .flags = AVFMT_NOFILE | AVFMT_NOBINSEARCH | AVFMT_NOGENSEARCH | AVFMT_NO_BYTE_SEEK, .priv_class = &dshow_class, }; From patchwork Mon Jun 7 23:03:58 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Diederick C. Niehorster" X-Patchwork-Id: 28147 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:b214:0:0:0:0:0 with SMTP id b20csp3886092iof; Mon, 7 Jun 2021 16:05:11 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzHBjXqgG9VKOIMmzwYFmfRfLl4UZPaIO02YD9gsHb6kzh3vzvdxlEe8+SNSqKOxuNaTSNC X-Received: by 2002:a50:bf0f:: with SMTP id f15mr21965498edk.205.1623107111206; Mon, 07 Jun 2021 16:05:11 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1623107111; cv=none; d=google.com; s=arc-20160816; b=OwQ+2ou2h2EqT//ObcZApX3Kj4J8H4lj79YTYs11mxTdnfToxY4I+duG/EZyrnghK9 D57XmbcAOrwuZe/SjUvRB7Zz64aejEe+S3z1MtVAMynejEfB6ccHrOFKWZeXj0khWeRS OdfuTloyD7+kLNUhm8AdkgWNsmvqdu8yNq8KhPO089H06w4kT7EmcaoG/rgnnehw1JKT d821a0qQLHC7+2hYz5eVWV1UDWe76vueNtPAkLhTXNlpHKw6hnKnaFBpIDkNkVgKqwiP YqZ/1tv6yh1XTWcDfUoMwf3Q08rdMzhQqXIs00pXtygLW/SQT8HC8Ji8ezrqmOjNs0TW jrvg== 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=dd488VGOg1orfwWdrC6UGUF/hEok2dsWQSkkSpWvR/8=; b=e/F53yKXI+BrmCXFqCNGkRs5d7BO8bL82zv2rHbV0bwBWX8/Bz/5DvnZjBa1pfKFjv sSyXPZM82QEZcIZplnS2bIBbt/naS1E3pLU3oSAIinM74OgWYMlXNeGpkekLa8S3aiDr 2yjoBnlqSa/tarFhbbmyAwHSP1IUxLt0RC98rO+ONzBOgFCm1Lkq0kCEKS96kiWn8zv/ II+uFTcIB1/H/WtqJ8Y4GZD3KcUc/qdfeRrdz4jKslRr7O/YIc5pknzslZoxZK8Lz/o+ QDE80ZxI2Jd5SIW5kh+3kKyFTpe2bzddOcVYP8GcC3/oh3VqZUMU1NMOPxZA+/sSJnq5 xySw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=lY1KP9et; 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 de12si13652180ejc.296.2021.06.07.16.05.10; Mon, 07 Jun 2021 16:05:11 -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=20161025 header.b=lY1KP9et; 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 9AC916809A6; Tue, 8 Jun 2021 02:04:49 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lf1-f45.google.com (mail-lf1-f45.google.com [209.85.167.45]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 32B216808F5 for ; Tue, 8 Jun 2021 02:04:45 +0300 (EEST) Received: by mail-lf1-f45.google.com with SMTP id m21so13271673lfg.13 for ; Mon, 07 Jun 2021 16:04:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=nIH6cDoD/RROiyfeOFQZIRrAU1jjsbsOmKPvhX1etiQ=; b=lY1KP9et+WHCb4A7FDIHZcZOHJNJKAdrKk8j7Z8d7t3e6WHghyEV22qUNJAHkJ+VYW RRuHEM+esAdvxDUHzYPbkrv/5cILa0rDmFrPHTXbMHXqLWOwmTmlwd/+jCx4EmKtJgiF zjIUQIYcap6STD26VKEVv466mBdnkKsMMpz+4OSg18asslCByGL3hIc9wRjzghqp97AH af0ffOsTp7nlRUTBW22Pnj4lx4bYoOP5Fqqus4Fx0NblZKOe/XrNSPVo09fPQL5WoHco dvzJVSAsIk2FbTg9HoSC1+E8EgKu/JTF6GDTbvPK1nhPgEf6L4HdUHk2b2GSf5UL+8Wz dBOw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=nIH6cDoD/RROiyfeOFQZIRrAU1jjsbsOmKPvhX1etiQ=; b=Ih9+C5tfTMYvvNc08aF9hXt0ZanddFIXWoGThXFx9tA6X9HUJN+NT1aOzC57Zi4Oxh ED1HlPoTccsJAaPv9C6X6pdqHoSUMaGk6RrB+m3XO3M5NcfoPl2cmVOpMnPFLVn93AJo KmGAB7S5KGnvJSVVMJzhjKKpX9DdkZ3RbbjnQzuHFycFsPvFEOJOZTbQIFKujHIoiG/x 9uhw56ws3doxqeoy1oZCDOg3noeNmcm8S551g7vI9U27K3hF1qK1RW1IJ8fmjXWUkai8 YEk9joQkph50ryr92cCtdZmoudYRc1uBKZ8VBIDWrXtT4Gl7iGbOV1HgtKL2IP0ifUoW 6qHg== X-Gm-Message-State: AOAM531i+RX0iYiBheIsB0K/1s7iNJwwaGFWij4iG40tfB6HbNmMCDbC eJdic8fOtYEDTKOFH7Wau24dgIeW/hR/BA== X-Received: by 2002:ac2:58c3:: with SMTP id u3mr9840205lfo.371.1623107084893; Mon, 07 Jun 2021 16:04:44 -0700 (PDT) Received: from localhost.localdomain (84-217-56-54.customers.ownit.se. [84.217.56.54]) by smtp.gmail.com with ESMTPSA id v9sm1999563ljv.131.2021.06.07.16.04.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Jun 2021 16:04:44 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Tue, 8 Jun 2021 01:03:58 +0200 Message-Id: <20210607230414.612-20-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20210607230414.612-1-dcnieho@gmail.com> References: <20210607230414.612-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 19/35] avdevice/avdevice: Revert "Deprecate AVDevice Capabilities API" 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: Diederick Niehorster Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: TnCDjN/O1d5b This reverts commit 4f49ca7bbc75a9db4cdf93f27f95a668c751f160. This patch series will implement this capability for avdevice/dshow, enabling configuration discovery of DirectShow devices through the API, which is important for my use case. It enables making proper GUIs presenting users with options, instead of asking them to discover a dshow devices capabilities through the list_options option with an ffmpeg tool, and listing what they want to configure in text boxes. Signed-off-by: Diederick Niehorster --- libavdevice/avdevice.c | 71 ++++++++++++++++++++++++++++++++++++++---- libavdevice/avdevice.h | 5 --- libavformat/avformat.h | 21 +++++++++++++ libavformat/version.h | 2 +- 4 files changed, 87 insertions(+), 12 deletions(-) diff --git a/libavdevice/avdevice.c b/libavdevice/avdevice.c index e339cebf2d..695b9143af 100644 --- a/libavdevice/avdevice.c +++ b/libavdevice/avdevice.c @@ -27,11 +27,39 @@ #include "libavutil/ffversion.h" const char av_device_ffversion[] = "FFmpeg version " FFMPEG_VERSION; -#if FF_API_DEVICE_CAPABILITIES +#define E AV_OPT_FLAG_ENCODING_PARAM +#define D AV_OPT_FLAG_DECODING_PARAM +#define A AV_OPT_FLAG_AUDIO_PARAM +#define V AV_OPT_FLAG_VIDEO_PARAM +#define OFFSET(x) offsetof(AVDeviceCapabilitiesQuery, x) + const AVOption av_device_capabilities[] = { + { "codec", "codec", OFFSET(codec), AV_OPT_TYPE_INT, + {.i64 = AV_CODEC_ID_NONE}, AV_CODEC_ID_NONE, INT_MAX, E|D|A|V }, + { "sample_format", "sample format", OFFSET(sample_format), AV_OPT_TYPE_SAMPLE_FMT, + {.i64 = AV_SAMPLE_FMT_NONE}, AV_SAMPLE_FMT_NONE, INT_MAX, E|D|A }, + { "sample_rate", "sample rate", OFFSET(sample_rate), AV_OPT_TYPE_INT, + {.i64 = -1}, -1, INT_MAX, E|D|A }, + { "channels", "channels", OFFSET(channels), AV_OPT_TYPE_INT, + {.i64 = -1}, -1, INT_MAX, E|D|A }, + { "channel_layout", "channel layout", OFFSET(channel_layout), AV_OPT_TYPE_CHANNEL_LAYOUT, + {.i64 = -1}, -1, INT_MAX, E|D|A }, + { "pixel_format", "pixel format", OFFSET(pixel_format), AV_OPT_TYPE_PIXEL_FMT, + {.i64 = AV_PIX_FMT_NONE}, AV_PIX_FMT_NONE, INT_MAX, E|D|V }, + { "window_size", "window size", OFFSET(window_width), AV_OPT_TYPE_IMAGE_SIZE, + {.str = NULL}, -1, INT_MAX, E|D|V }, + { "frame_size", "frame size", OFFSET(frame_width), AV_OPT_TYPE_IMAGE_SIZE, + {.str = NULL}, -1, INT_MAX, E|D|V }, + { "fps", "fps", OFFSET(fps), AV_OPT_TYPE_RATIONAL, + {.dbl = -1}, -1, INT_MAX, E|D|V }, { NULL } }; -#endif + +#undef E +#undef D +#undef A +#undef V +#undef OFFSET unsigned avdevice_version(void) { @@ -68,18 +96,49 @@ int avdevice_dev_to_app_control_message(struct AVFormatContext *s, enum AVDevToA return s->control_message_cb(s, type, data, data_size); } -#if FF_API_DEVICE_CAPABILITIES int avdevice_capabilities_create(AVDeviceCapabilitiesQuery **caps, AVFormatContext *s, AVDictionary **device_options) { - return AVERROR(ENOSYS); + int ret; + av_assert0(s && caps); + av_assert0(s->iformat || s->oformat); + if ((s->oformat && !s->oformat->create_device_capabilities) || + (s->iformat && !s->iformat->create_device_capabilities)) + return AVERROR(ENOSYS); + *caps = av_mallocz(sizeof(**caps)); + if (!(*caps)) + return AVERROR(ENOMEM); + (*caps)->device_context = s; + if (((ret = av_opt_set_dict(s->priv_data, device_options)) < 0)) + goto fail; + if (s->iformat) { + if ((ret = s->iformat->create_device_capabilities(s, *caps)) < 0) + goto fail; + } else { + if ((ret = s->oformat->create_device_capabilities(s, *caps)) < 0) + goto fail; + } + av_opt_set_defaults(*caps); + return 0; + fail: + av_freep(caps); + return ret; } void avdevice_capabilities_free(AVDeviceCapabilitiesQuery **caps, AVFormatContext *s) { - return; + if (!s || !caps || !(*caps)) + return; + av_assert0(s->iformat || s->oformat); + if (s->iformat) { + if (s->iformat->free_device_capabilities) + s->iformat->free_device_capabilities(s, *caps); + } else { + if (s->oformat->free_device_capabilities) + s->oformat->free_device_capabilities(s, *caps); + } + av_freep(caps); } -#endif int avdevice_list_devices(AVFormatContext *s, AVDeviceInfoList **device_list) { diff --git a/libavdevice/avdevice.h b/libavdevice/avdevice.h index 4fbdf6aabc..7c5e77df00 100644 --- a/libavdevice/avdevice.h +++ b/libavdevice/avdevice.h @@ -331,7 +331,6 @@ int avdevice_dev_to_app_control_message(struct AVFormatContext *s, enum AVDevToAppMessageType type, void *data, size_t data_size); -#if FF_API_DEVICE_CAPABILITIES /** * Following API allows user to probe device capabilities (supported codecs, * pixel formats, sample formats, resolutions, channel counts, etc). @@ -427,7 +426,6 @@ typedef struct AVDeviceCapabilitiesQuery { /** * AVOption table used by devices to implement device capabilities API. Should not be used by a user. */ -attribute_deprecated extern const AVOption av_device_capabilities[]; /** @@ -447,7 +445,6 @@ extern const AVOption av_device_capabilities[]; * * @return >= 0 on success, negative otherwise. */ -attribute_deprecated int avdevice_capabilities_create(AVDeviceCapabilitiesQuery **caps, AVFormatContext *s, AVDictionary **device_options); @@ -457,9 +454,7 @@ int avdevice_capabilities_create(AVDeviceCapabilitiesQuery **caps, AVFormatConte * @param caps Device capabilities data to be freed. * @param s Context of the device. */ -attribute_deprecated void avdevice_capabilities_free(AVDeviceCapabilitiesQuery **caps, AVFormatContext *s); -#endif /** * Structure describes basic parameters of the device. diff --git a/libavformat/avformat.h b/libavformat/avformat.h index adbdd712a7..6fd09f52cb 100644 --- a/libavformat/avformat.h +++ b/libavformat/avformat.h @@ -578,6 +578,16 @@ typedef struct AVOutputFormat { * @see avdevice_list_devices() for more details. */ int (*get_device_list)(struct AVFormatContext *s, struct AVDeviceInfoList *device_list); + /** + * Initialize device capabilities submodule. + * @see avdevice_capabilities_create() for more details. + */ + int (*create_device_capabilities)(struct AVFormatContext *s, struct AVDeviceCapabilitiesQuery *caps); + /** + * Free device capabilities submodule. + * @see avdevice_capabilities_free() for more details. + */ + int (*free_device_capabilities)(struct AVFormatContext *s, struct AVDeviceCapabilitiesQuery *caps); enum AVCodecID data_codec; /**< default data codec */ /** * Initialize format. May allocate data here, and set any AVFormatContext or @@ -749,6 +759,17 @@ typedef struct AVInputFormat { */ int (*get_device_list)(struct AVFormatContext *s, struct AVDeviceInfoList *device_list); + /** + * Initialize device capabilities submodule. + * @see avdevice_capabilities_create() for more details. + */ + int (*create_device_capabilities)(struct AVFormatContext *s, struct AVDeviceCapabilitiesQuery *caps); + + /** + * Free device capabilities submodule. + * @see avdevice_capabilities_free() for more details. + */ + int (*free_device_capabilities)(struct AVFormatContext *s, struct AVDeviceCapabilitiesQuery *caps); } AVInputFormat; /** * @} diff --git a/libavformat/version.h b/libavformat/version.h index 7f02e18f24..6519bba101 100644 --- a/libavformat/version.h +++ b/libavformat/version.h @@ -32,7 +32,7 @@ // Major bumping may affect Ticket5467, 5421, 5451(compatibility with Chromium) // Also please add any ticket numbers that you believe might be affected here #define LIBAVFORMAT_VERSION_MAJOR 59 -#define LIBAVFORMAT_VERSION_MINOR 3 +#define LIBAVFORMAT_VERSION_MINOR 4 #define LIBAVFORMAT_VERSION_MICRO 100 #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ From patchwork Mon Jun 7 23:03:59 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Diederick C. Niehorster" X-Patchwork-Id: 28136 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:b214:0:0:0:0:0 with SMTP id b20csp3886211iof; Mon, 7 Jun 2021 16:05:21 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwpfkPhr/UDiyDOPT8GWQ2iAfxhl6S1EegdJSDxqrr1U0B0T+/Jia6XlCAA31YW1Dls6EgR X-Received: by 2002:a17:907:9486:: with SMTP id dm6mr19696612ejc.377.1623107121042; Mon, 07 Jun 2021 16:05:21 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1623107121; cv=none; d=google.com; s=arc-20160816; b=sVfHionlfP8RomTa8HcauGwS867m4qnDfWCzZDrb0X+wKhV2EviXXZ/vIuoABAp0TQ 85lC6k08Igbo++z/yaYtZT2R5wbIRl4S2V7rxr740gzY3H7LyXnsSCH1Y19QV5vdPgo8 ayEe410xdAl+mPl5Z3NB/SuI1fh8MiYggxKv6nNeFgWMzi/U6rIZyq3LEV1YqXm69g9x csVz3Aib59IdNdJSKlOYhWOrI5XJccZDIFUppGWeXsnVv4gn6utr4EtVW3Ver7eenCkA ELpvRqtIt7Toq1lRllN1y0qUpbMse+xquCwb928N3lN/lysXvx8wzs9H6GMWFYlJRcpy V4Vg== 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=TghckmX1Pn3ZLJf9wxhnODcK9Q89ziN9cpx0u4zRUm0=; b=rpxJrjylkLv3XAr83T+aarlM5aNbP9uf/KVKnj6Zi8NTrCrbV8FDTaOTeJ9Y12BeqH LkQ3oFo+fSoUt0KG4m8CaABTVHOFI0576nLM7q2ta5RWBzhvwAriUqsYuhiAN1Xk1SsD yzoXOs3wbptrE8c8EKbnR8fM8CC7kNytt/nOaNl97g1b+TDbechHcOEaUvmtSwn3IYW9 eWhh5I1UWj9lqHnqV0JtZ4F0IyA1zllU+62+QHAkV373go8XeKeO406jVRmpUPdekdjC B/aLj1UvKkzh3ii1QhR6TUaYJdT3AMTXe57Wu9kBU09xYuUfMaGSg5FzRVBl4Km6QN1y baBg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=nwnbh1uG; 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 bh7si13446429ejb.383.2021.06.07.16.05.20; Mon, 07 Jun 2021 16:05:21 -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=20161025 header.b=nwnbh1uG; 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 8BA4B680A2B; Tue, 8 Jun 2021 02:04:50 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lj1-f181.google.com (mail-lj1-f181.google.com [209.85.208.181]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id A5B1E6808F2 for ; Tue, 8 Jun 2021 02:04:46 +0300 (EEST) Received: by mail-lj1-f181.google.com with SMTP id r14so5241748ljd.10 for ; Mon, 07 Jun 2021 16:04:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=ZiiCuq0+yuRI6zFVdh40rJZEOdFRaD4mr1Cuqw8EbNU=; b=nwnbh1uGce3N8Q8VBCp9LFOR5vUh3qvG2pC/WU+/YQO9oXQS5aS89D/BDLwRiBsoRX 264hG4JzTNq9664cfwKc6+iAaH+oBTgf8K2xdkdv8SKi3u5Z2LfRVlP+rSjAZtWbMVLy 810iAODZ7Iv01p+zPXGP/HMd65kvE5dRmKIqLlYo9BFPdE+GL71fkWTReQu7tRptYQv/ xlMbWFIpBP4ZYzqf9yXJY7eIm6fRE77u34EJJTghfaIFl1BQuRwySzBNwgJQqV9nwJ00 RUlQJDVTAicIZrm9Er16zUe+7ki5iuKhX1Ig+OqR//4p3a5+bf23bAYM0yqH9Dd4CNo/ Ac9g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=ZiiCuq0+yuRI6zFVdh40rJZEOdFRaD4mr1Cuqw8EbNU=; b=pv5Fkmvbz6C0tGFOvQzPLFJVkN/W7MRGUzoAfkCgyREheMXoCs/GzzIhtrSZ+YhNgp CiRo/h4Sp+2nyEJPn6zzglBY5VBOTsoe1MGyxqwveE2ni1BB8gCVXyEkBgfL5wMRU0pJ K3T1LBcpXKRbriZcQNyK32ob/oII3iQAEoPM2e4wXiMX2DStvZ/AHIMYMXs0BIIwu0NY rwdqHd+H/muZaYWNPK+sZ/gxnysh0vLHlfTTYrajTvr3+F2J0gB5NIHe2Ukcy98klG7V Z+1WuRcmZmFaP16BhEywW+8/oiReLnyMWxIQXUYkat8dF0cb48XLqC6bygDV4DEc2dUs H/Gw== X-Gm-Message-State: AOAM530kcBBMSWanNLKSvjDQ1V0ctxmMKIwKPOQdv/qGk8HVTS53aK4w 3p6vmXQ3xCKrZo70wXdsh9avOOJqy8HDLg== X-Received: by 2002:a2e:8397:: with SMTP id x23mr16210289ljg.228.1623107085760; Mon, 07 Jun 2021 16:04:45 -0700 (PDT) Received: from localhost.localdomain (84-217-56-54.customers.ownit.se. [84.217.56.54]) by smtp.gmail.com with ESMTPSA id v9sm1999563ljv.131.2021.06.07.16.04.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Jun 2021 16:04:45 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Tue, 8 Jun 2021 01:03:59 +0200 Message-Id: <20210607230414.612-21-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20210607230414.612-1-dcnieho@gmail.com> References: <20210607230414.612-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 20/35] avdevice/avdevice: clean up avdevice_capabilities_create 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: Diederick Niehorster Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: +AeffnYYXbVZ Draw implementation in line with that of avdevice_list_devices Signed-off-by: Diederick Niehorster --- libavdevice/avdevice.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/libavdevice/avdevice.c b/libavdevice/avdevice.c index 695b9143af..d73d36e1dd 100644 --- a/libavdevice/avdevice.c +++ b/libavdevice/avdevice.c @@ -100,12 +100,15 @@ int avdevice_capabilities_create(AVDeviceCapabilitiesQuery **caps, AVFormatConte AVDictionary **device_options) { int ret; - av_assert0(s && caps); + av_assert0(s); + av_assert0(caps); av_assert0(s->iformat || s->oformat); if ((s->oformat && !s->oformat->create_device_capabilities) || - (s->iformat && !s->iformat->create_device_capabilities)) + (s->iformat && !s->iformat->create_device_capabilities)) { + *caps = NULL; return AVERROR(ENOSYS); - *caps = av_mallocz(sizeof(**caps)); + } + *caps = av_mallocz(sizeof(AVDeviceCapabilitiesQuery)); if (!(*caps)) return AVERROR(ENOMEM); (*caps)->device_context = s; From patchwork Mon Jun 7 23:04:00 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Diederick C. Niehorster" X-Patchwork-Id: 28142 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:b214:0:0:0:0:0 with SMTP id b20csp3886352iof; Mon, 7 Jun 2021 16:05:32 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzWDASm6i/ksmhDoBr+YtjbPD5bDUm5r2qIT6plDCIcLeHbiLbt4mowiJqV09CsB7r/ygT+ X-Received: by 2002:aa7:c547:: with SMTP id s7mr22048480edr.239.1623107132091; Mon, 07 Jun 2021 16:05:32 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1623107132; cv=none; d=google.com; s=arc-20160816; b=qkTGYmO4LYa7RPCvJA5Ghl8bMjLC/Jw4Zr8kD0eupFB+Y2BM4bJnRorZd4/Who1FVS beoWiRsftOZ6D9Amr5ve2HSsaHao49kv7EBL35pRRdc+ECPM8pXrBfdUZTcGjJoJTki/ MWfUVw/UH9yKDOFxdqWfjGEMKUg78fpcQ95j2snY9pkfxHUdcffGXJiUDFjQ//xzQP4K PCMSfCkF9MKJXwiiiYQiSJXu2SpuA+EQqT7F9xYkParp4MPiZQoOH3BqC+eRHyG7JU/k AjFZhlYXTfEZof9cKvHwTs2TnWqnoIfE5r32zU6/X2/S+FwRUJ5uX43+0mwC0hDe6ZDa bYbQ== 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=Y/N+P8islhg0pQRuurco54ewG7OB337mXsFBXbg6K+U=; b=a9bo9UCQ5AUfQyQAsjVMnwFOEWelsqFimvLkErkargIAyOPin9rmtvn227Ad0xkv73 IEPaSB9caYUzMlNVDyKnwFKXFmoz59meG7wsu/qsPX3M97V1tsYjYqi2xu1EIF84p4NY Xp2XSi03rufWOiFWJ2jI2VAU3pD58Lm+xB9l+VMtWp6Crc6s19TWIjfx6eqXQftF5m1f O/WuV6s7lm3YyRiUrrWNwT7bcdDb3oWicZiDspH8fWbZszZ4LjJP6erbkem46kNlpaQB Wl5nS3BzigovM1TsUU7gNpEASpqYvknKopidJaoc6I5pv+/by+ozesa2yrYbCuGUZhE8 aSHw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=D29zbJZL; 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 bq17si382435ejb.171.2021.06.07.16.05.30; Mon, 07 Jun 2021 16:05: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 header.s=20161025 header.b=D29zbJZL; 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 70F7E680A07; Tue, 8 Jun 2021 02:04:51 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lf1-f45.google.com (mail-lf1-f45.google.com [209.85.167.45]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id A08E1680923 for ; Tue, 8 Jun 2021 02:04:47 +0300 (EEST) Received: by mail-lf1-f45.google.com with SMTP id f30so29026516lfj.1 for ; Mon, 07 Jun 2021 16:04:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=jsQe9tTS/A408I+gJNr6RNZYGwNa8iaF53DL4fvUiYU=; b=D29zbJZLLiv2/IeLWyzTAVoU50Tj+cw7gIDqcoevsH6o0Rk/4Vp2CSSHLkbA7qhoa8 mekIfLPB/jo5z3jqrf+a8ZTKyR629pDP1aukfL8RHdU9G7MjJsbZE3P2VF9Md/Sy6293 h/fUW0obxeId+URpehUhNg0v6MgMBoJGC6hUbaLTLHTKK/iNEBEQiwoiGEhqOrYSdqsx tZkYupy5tfkV5qfG9epvK9Lj6hfiEekBBIU43OLqfsMVyR9iV/zcfOOZwRuz3TZGdfvg 3f9jsiqolAXkv3/MnydSvFzhYjq3JqCEMfLMFI/INuIqUOTIyoGP8jRVOpCd2Y0UUEf+ dZuA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=jsQe9tTS/A408I+gJNr6RNZYGwNa8iaF53DL4fvUiYU=; b=Mlf763U4Tk6EHL6zPzDdIY9tSik6lWx+i8+1Kak0/SMxCSaNepc521Bj75NcASJvxr DY9XIvsvPQjhXVHzJFIjU+VvfVs7GhaNs2tkREBNEVld/AkVHwxqFRbLsv0qDi2+qoMh rFtzuZpNzAFDxtqXp+0shUumM6PtVeyTJHB3rvzliWnS0sfq5swoaRaFuhZRDCU6SPJX P6QgqWWIpOO1zjj9HCMj2BjhSY3kcSkxI+kcCXpQSHwqsQTJPTg0HMm8xJsPQGWwSF6k dxTHNTkmb9Aou2idpv3wO8qCt91RVifoiPuSUti5AdW9VgAkceF0GyQGVOofTOedLGnF gJRA== X-Gm-Message-State: AOAM532OaQG97u3msFFxbdl4Ty9FOzsWfrD5e1Bv+iL6VJk3BfOH2J7/ ouu1um3AvTt8svJu8UMkPJ2h/wDFEADYfA== X-Received: by 2002:a19:6d19:: with SMTP id i25mr10071231lfc.655.1623107086671; Mon, 07 Jun 2021 16:04:46 -0700 (PDT) Received: from localhost.localdomain (84-217-56-54.customers.ownit.se. [84.217.56.54]) by smtp.gmail.com with ESMTPSA id v9sm1999563ljv.131.2021.06.07.16.04.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Jun 2021 16:04:46 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Tue, 8 Jun 2021 01:04:00 +0200 Message-Id: <20210607230414.612-22-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20210607230414.612-1-dcnieho@gmail.com> References: <20210607230414.612-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 21/35] avdevice: capabilities API details no longer public 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: Diederick Niehorster Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: oreTauB21Im7 NB: will break build, makes needed corresponding changes to avformat. Signed-off-by: Diederick Niehorster --- libavdevice/avdevice.c | 34 ++++++++++++++++++++-------------- libavdevice/avdevice.h | 42 +++++++++--------------------------------- libavdevice/internal.h | 33 +++++++++++++++++++++++++++++++++ libavdevice/version.h | 2 +- 4 files changed, 63 insertions(+), 48 deletions(-) diff --git a/libavdevice/avdevice.c b/libavdevice/avdevice.c index d73d36e1dd..b521516ff5 100644 --- a/libavdevice/avdevice.c +++ b/libavdevice/avdevice.c @@ -96,51 +96,57 @@ int avdevice_dev_to_app_control_message(struct AVFormatContext *s, enum AVDevToA return s->control_message_cb(s, type, data, data_size); } -int avdevice_capabilities_create(AVDeviceCapabilitiesQuery **caps, AVFormatContext *s, +int avdevice_capabilities_create(void** opaque, AVFormatContext *s, AVDictionary **device_options) { int ret; + AVDeviceCapabilitiesQuery *caps = NULL; av_assert0(s); - av_assert0(caps); + av_assert0(opaque); av_assert0(s->iformat || s->oformat); + *opaque = NULL; if ((s->oformat && !s->oformat->create_device_capabilities) || (s->iformat && !s->iformat->create_device_capabilities)) { - *caps = NULL; return AVERROR(ENOSYS); } - *caps = av_mallocz(sizeof(AVDeviceCapabilitiesQuery)); - if (!(*caps)) + *opaque = caps = av_mallocz(sizeof(AVDeviceCapabilitiesQuery)); + if (!caps) return AVERROR(ENOMEM); - (*caps)->device_context = s; + caps->device_context = s; if (((ret = av_opt_set_dict(s->priv_data, device_options)) < 0)) goto fail; if (s->iformat) { - if ((ret = s->iformat->create_device_capabilities(s, *caps)) < 0) + if ((ret = s->iformat->create_device_capabilities(s, caps)) < 0) goto fail; } else { - if ((ret = s->oformat->create_device_capabilities(s, *caps)) < 0) + if ((ret = s->oformat->create_device_capabilities(s, caps)) < 0) goto fail; } - av_opt_set_defaults(*caps); + av_opt_set_defaults(caps); return 0; fail: av_freep(caps); + *opaque = NULL; return ret; } -void avdevice_capabilities_free(AVDeviceCapabilitiesQuery **caps, AVFormatContext *s) +void avdevice_capabilities_free(void **opaque, AVFormatContext *s) { - if (!s || !caps || !(*caps)) + AVDeviceCapabilitiesQuery *caps; + if (!s || !opaque) + return; + caps = *(AVDeviceCapabilitiesQuery **) opaque; + if (!caps) return; av_assert0(s->iformat || s->oformat); if (s->iformat) { if (s->iformat->free_device_capabilities) - s->iformat->free_device_capabilities(s, *caps); + s->iformat->free_device_capabilities(s, caps); } else { if (s->oformat->free_device_capabilities) - s->oformat->free_device_capabilities(s, *caps); + s->oformat->free_device_capabilities(s, caps); } - av_freep(caps); + av_freep(opaque); } int avdevice_list_devices(AVFormatContext *s, AVDeviceInfoList **device_list) diff --git a/libavdevice/avdevice.h b/libavdevice/avdevice.h index 7c5e77df00..389ac0b5f2 100644 --- a/libavdevice/avdevice.h +++ b/libavdevice/avdevice.h @@ -401,40 +401,15 @@ int avdevice_dev_to_app_control_message(struct AVFormatContext *s, * @endcode */ -/** - * Structure describes device capabilities. - * - * It is used by devices in conjunction with av_device_capabilities AVOption table - * to implement capabilities probing API based on AVOption API. Should not be used directly. - */ -typedef struct AVDeviceCapabilitiesQuery { - const AVClass *av_class; - AVFormatContext *device_context; - enum AVCodecID codec; - enum AVSampleFormat sample_format; - enum AVPixelFormat pixel_format; - int sample_rate; - int channels; - int64_t channel_layout; - int window_width; - int window_height; - int frame_width; - int frame_height; - AVRational fps; -} AVDeviceCapabilitiesQuery; - -/** - * AVOption table used by devices to implement device capabilities API. Should not be used by a user. - */ -extern const AVOption av_device_capabilities[]; - /** * Initialize capabilities probing API based on AVOption API. * * avdevice_capabilities_free() must be called when query capabilities API is * not used anymore. - * - * @param[out] caps Device capabilities data. Pointer to a NULL pointer must be passed. + * + * @param[out] opaque A pointer where the capabilities API state will be stored. Pointer + * to a NULL pointer must be passed and caller must not touch this in + * any way. * @param s Context of the device. * @param device_options An AVDictionary filled with device-private options. * On return this parameter will be destroyed and replaced with a dict @@ -445,16 +420,17 @@ extern const AVOption av_device_capabilities[]; * * @return >= 0 on success, negative otherwise. */ -int avdevice_capabilities_create(AVDeviceCapabilitiesQuery **caps, AVFormatContext *s, +int avdevice_capabilities_create(void **opaque, AVFormatContext *s, AVDictionary **device_options); /** * Free resources created by avdevice_capabilities_create() * - * @param caps Device capabilities data to be freed. - * @param s Context of the device. + * @param[out] opaque Pointer to be freed that was returned from + * avdevice_capabilities_create. + * @param s Context of the device. */ -void avdevice_capabilities_free(AVDeviceCapabilitiesQuery **caps, AVFormatContext *s); +void avdevice_capabilities_free(void **opaque, AVFormatContext *s); /** * Structure describes basic parameters of the device. diff --git a/libavdevice/internal.h b/libavdevice/internal.h index 67c90e1f87..fe4be64ee7 100644 --- a/libavdevice/internal.h +++ b/libavdevice/internal.h @@ -20,9 +20,42 @@ #define AVDEVICE_INTERNAL_H #include "libavformat/avformat.h" +#include "libavcodec/codec_id.h" +#include "libavutil/log.h" +#include "libavutil/opt.h" +#include "libavutil/pixfmt.h" +#include "libavutil/rational.h" +#include "libavutil/samplefmt.h" av_warn_unused_result int ff_alloc_input_device_context(struct AVFormatContext **avctx, const AVInputFormat *iformat, const char *format); +/** + * Structure describes device capabilities. + * + * It is used by devices in conjunction with av_device_capabilities AVOption table + * to implement capabilities probing API based on AVOption API. Should not be used directly. + */ +typedef struct AVDeviceCapabilitiesQuery { + const AVClass *av_class; + AVFormatContext *device_context; + enum AVCodecID codec; + enum AVSampleFormat sample_format; + enum AVPixelFormat pixel_format; + int sample_rate; + int channels; + int64_t channel_layout; + int window_width; + int window_height; + int frame_width; + int frame_height; + AVRational fps; +} AVDeviceCapabilitiesQuery; + +/** + * AVOption table used by devices to implement device capabilities API. Should not be used by a user. + */ +extern const AVOption av_device_capabilities[]; + #endif diff --git a/libavdevice/version.h b/libavdevice/version.h index 0381d6cd0d..53af6fa0d0 100644 --- a/libavdevice/version.h +++ b/libavdevice/version.h @@ -28,7 +28,7 @@ #include "libavutil/version.h" #define LIBAVDEVICE_VERSION_MAJOR 59 -#define LIBAVDEVICE_VERSION_MINOR 2 +#define LIBAVDEVICE_VERSION_MINOR 3 #define LIBAVDEVICE_VERSION_MICRO 100 #define LIBAVDEVICE_VERSION_INT AV_VERSION_INT(LIBAVDEVICE_VERSION_MAJOR, \ From patchwork Mon Jun 7 23:04:01 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Diederick C. Niehorster" X-Patchwork-Id: 28143 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:b214:0:0:0:0:0 with SMTP id b20csp3886435iof; Mon, 7 Jun 2021 16:05:41 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwM8j9SKBs9xpkrM+ZP6U66JurdJYVa05cwat8boQvxULa/6bY5b0mZybHDyGc6OnWWUptr X-Received: by 2002:a17:906:7203:: with SMTP id m3mr19592089ejk.381.1623107140990; Mon, 07 Jun 2021 16:05:40 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1623107140; cv=none; d=google.com; s=arc-20160816; b=vq0LpJ5UKYQVjgEACIgzQIlzkJbKqgMfx83qK/FQGR49jdge9H9PQLMJ4aNF5yDdAP 3oiZmzCRNHL3wuhn2vL8slQcQew1CpSOmVHuX1NqfQfipHl6U2+7i2737UUWHWf14vqf FgG1TgYFHT3PN5Wp5NIhEfp8zGMaLqfcabFqH3xXw2/ZvSBD/IUxEQ57gdscOfxzs862 7WyEAyEUQatukiV/c27Kfqi3lza8Zzpz8k92ofTgJGo5QAOG0vEXnonVU7K7+D1vuqka z5f1Ws44zU2QsyUx5RgjnGaCNMm+K2wIybSuPmqrR3zdmm5xq2PGynQQMrTNVVC9D3A0 4luA== 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=2980k7BrwrFkk4jbCO5JieAoAWHdOcJ0rr6+/TlYehU=; b=cfZDibh2hUGKhVLY7UdKflqgFVzBj2wgHBVk+hj/aJOwAskJSYPybsOkH8Fn0FnsPo 9XtqlLExpNpZ7CTvoq5J0wyYXBSpdPbtU7RKSgGPlzwMwiQBklUY2aHVI2eIeHZQsH/1 z7OinMw7w2N49pAinuDMN+vmEUbcSQ5EapUyfDKmnr2dNXCusY3A5aRgAgzxVSyVKO33 8E7cuz1OYnSJ/7DjMNkpdihSkgR1NoVAEYHNySS64rWWmw+vmB7b7FdIVhKmrH/Pltpn l0uXS8NpqH5kO7ewAjirGji274rB52iRG/cEwyNOGaSG8wj4cns9PlqcAk7HJZNUASEj IfqA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=YvXF8Qdf; 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 b3si14385444ejb.219.2021.06.07.16.05.40; Mon, 07 Jun 2021 16:05:40 -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=20161025 header.b=YvXF8Qdf; 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 47DDE6808F5; Tue, 8 Jun 2021 02:04:52 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lf1-f43.google.com (mail-lf1-f43.google.com [209.85.167.43]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 58886680998 for ; Tue, 8 Jun 2021 02:04:48 +0300 (EEST) Received: by mail-lf1-f43.google.com with SMTP id f30so29026544lfj.1 for ; Mon, 07 Jun 2021 16:04:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=oHVAeKDuucuEIh1/hyHpZLNNwjov342Uy2aNdWG+EeI=; b=YvXF8Qdf1zV8RtKkXewY7Fpf+thTaCy7M68VLovADZ4RqkWg/hx2y3I8YlHdfSv8VE fvOUh5wtsWFxFP05n/Zfy0+HBqyHcrEHcDS+WuSONUyH3HcDygO8ig6Befy5bqvPq7mF 4kpTBxL7prS0CAalN0ni//jSOpX6f1551GiIK2bzF/BYngShch6xHf8fu+0G6FjAuUjf CmMN8DiHuYly+FmzIBiIQ4e4pX5huVFOmueHOnOgD96Mq2ebaDHR44KtgXYB885UfuKv /IhqkMORPQM/hhDwaZw01eBXF/BrTclGZ/DACqANCm6O8DK+Pc0hwYmgmHCcjcqlspIH PONg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=oHVAeKDuucuEIh1/hyHpZLNNwjov342Uy2aNdWG+EeI=; b=C2Laf+vUCdUgS6MEucNRPefNUDSZ4vNL5xbAkevbhoo+GqTOfRrbNHIG3TCcPyDb0A eg8n9w891t7h2iH7Tz4NqpUkKYWHgPAkeN6cdGUV9Fwfj6VtWd+N324w5P3qvKCe78MV xkqMUep+RfO2f9yuppacjGbhyC4tLuC3VxuN1M/JMnn1jeoQw870YojlMqJV1mjZd/uZ i4IlGVmgFqhPUdeG2eSEelQcu60zRBMqEZM7ntiWyBZVuNULXr3U4/rR/RtjIBHX/sSZ Ds6qfW0v+F9iCl85adMsvlAE6oYUOGkAzpbBihxJEYBUQyjEgEAja3ei/CRz3XBMTQoV NKoA== X-Gm-Message-State: AOAM530k12Rzfq4R3ZVxmREwhsxg95BCJsMAfiCJ/5MTjTnmS355CeKJ MWTYNZ/H8AZxk27hrDjB+lDo9vG7jPFpbA== X-Received: by 2002:a05:6512:3588:: with SMTP id m8mr13813078lfr.309.1623107087457; Mon, 07 Jun 2021 16:04:47 -0700 (PDT) Received: from localhost.localdomain (84-217-56-54.customers.ownit.se. [84.217.56.54]) by smtp.gmail.com with ESMTPSA id v9sm1999563ljv.131.2021.06.07.16.04.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Jun 2021 16:04:47 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Tue, 8 Jun 2021 01:04:01 +0200 Message-Id: <20210607230414.612-23-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20210607230414.612-1-dcnieho@gmail.com> References: <20210607230414.612-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 22/35] avformat: avdevice capabilities API details no longer public 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: Diederick Niehorster Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: 6iU6FrdOxlfw Signed-off-by: Diederick Niehorster --- libavformat/avformat.h | 9 ++++----- libavformat/version.h | 2 +- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/libavformat/avformat.h b/libavformat/avformat.h index 6fd09f52cb..12197465bc 100644 --- a/libavformat/avformat.h +++ b/libavformat/avformat.h @@ -319,7 +319,6 @@ struct AVFormatContext; struct AVDeviceInfoList; -struct AVDeviceCapabilitiesQuery; /** * @defgroup metadata_api Public Metadata API @@ -582,12 +581,12 @@ typedef struct AVOutputFormat { * Initialize device capabilities submodule. * @see avdevice_capabilities_create() for more details. */ - int (*create_device_capabilities)(struct AVFormatContext *s, struct AVDeviceCapabilitiesQuery *caps); + int (*create_device_capabilities)(struct AVFormatContext *s, void *opaque); /** * Free device capabilities submodule. * @see avdevice_capabilities_free() for more details. */ - int (*free_device_capabilities)(struct AVFormatContext *s, struct AVDeviceCapabilitiesQuery *caps); + int (*free_device_capabilities)(struct AVFormatContext *s, void *opaque); enum AVCodecID data_codec; /**< default data codec */ /** * Initialize format. May allocate data here, and set any AVFormatContext or @@ -763,13 +762,13 @@ typedef struct AVInputFormat { * Initialize device capabilities submodule. * @see avdevice_capabilities_create() for more details. */ - int (*create_device_capabilities)(struct AVFormatContext *s, struct AVDeviceCapabilitiesQuery *caps); + int (*create_device_capabilities)(struct AVFormatContext *s, void *opaque); /** * Free device capabilities submodule. * @see avdevice_capabilities_free() for more details. */ - int (*free_device_capabilities)(struct AVFormatContext *s, struct AVDeviceCapabilitiesQuery *caps); + int (*free_device_capabilities)(struct AVFormatContext *s, void *opaque); } AVInputFormat; /** * @} diff --git a/libavformat/version.h b/libavformat/version.h index 6519bba101..13df244d97 100644 --- a/libavformat/version.h +++ b/libavformat/version.h @@ -32,7 +32,7 @@ // Major bumping may affect Ticket5467, 5421, 5451(compatibility with Chromium) // Also please add any ticket numbers that you believe might be affected here #define LIBAVFORMAT_VERSION_MAJOR 59 -#define LIBAVFORMAT_VERSION_MINOR 4 +#define LIBAVFORMAT_VERSION_MINOR 5 #define LIBAVFORMAT_VERSION_MICRO 100 #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ From patchwork Mon Jun 7 23:04:02 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Diederick C. Niehorster" X-Patchwork-Id: 28133 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:b214:0:0:0:0:0 with SMTP id b20csp3886540iof; Mon, 7 Jun 2021 16:05:52 -0700 (PDT) X-Google-Smtp-Source: ABdhPJy+oYxLGEtKST1aC4KRSpsuVRefmaU2WNmZYHB/Up41clwB148MFL0IOSjJAcJWYTbpHjmj X-Received: by 2002:a17:906:68c1:: with SMTP id y1mr20084972ejr.32.1623107151825; Mon, 07 Jun 2021 16:05:51 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1623107151; cv=none; d=google.com; s=arc-20160816; b=G4U/EvMtn7wTDX3BkTCxepkGpgTklJxktV3fE9BVoLrSzB0g2e+nhXgU6gI3fPOiNA MC0RJpbCGtdafclNCZyYn44wOvqO1TJGlLbIX6J/vXE68ifmuCtqP+wfdU731oE0qJVq nNKKpHLeJ2jUlikFxt4/BsTa5/lRAc/DNJ2jpGZWVSUwqQa45moFIqX8Z5Q8LR7/4NVW RIphV71M9xJS77Tgbrm5N9Jwvpts+ROQ2RnGvgXXiD9XoNZTKSntQYGTAUzMqigS/XTc PcanY6brOZcUFdnC55TI3LRilaROb3t0yHL3pTuTtq8U7AX5/qU7kcZAf864JrchmQvp k3pQ== 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=HsqzSy6y3KLiEuNc4+XkKbJ+RHJnPW9Ms5VCXFktlqo=; b=VDWaXbKF4vXRDIaZikKp4szAlqSZ6iqLZBK5GQl6ChUQ8E8l3nAOWNXhvCSfuuVMXs u1FGUxlvCXYeIpdZv9V9isOIB/fwlAtz7wRgbef9CSVdTqRfFvUrowQNQ2TAahiUNzqJ sSLwUSoh3FFklw/BDhaGxUOy2hcomgAdGjyP4ziq0cVxlf2kzOFrDLzejROBkoOCRSDh NZ2QNzQ5oxoWYu9EHPeFsVZgkiUmB4SC9YZkRTv1sFQ9ddLaQ5BZzdF7DMQpkrmrirkO KA8cMVsIbDH96f3LIPAukpXNRxP1hYpNw98blG1jK2t75dqeXuXH8iGWio2tAhEF7uFK UwZg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=m+h2I3f7; 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 m19si290552edc.271.2021.06.07.16.05.51; Mon, 07 Jun 2021 16:05:51 -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=20161025 header.b=m+h2I3f7; 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 1E685680987; Tue, 8 Jun 2021 02:04:53 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lf1-f47.google.com (mail-lf1-f47.google.com [209.85.167.47]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 7EA8768094F for ; Tue, 8 Jun 2021 02:04:49 +0300 (EEST) Received: by mail-lf1-f47.google.com with SMTP id p17so28209780lfc.6 for ; Mon, 07 Jun 2021 16:04:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=2reeoo50ei0GRmk7xSiMdED0daVl9VtBSGL5UJ2+viY=; b=m+h2I3f7GJv4fsNpVGVrsLvcQ6KhIqGdpcDnn+Y/35dHEjP0R4Nd5iXjQH/poZGqkg aKDGaWem3BT00gJJgVB8/tWuJ2CalyUPtYzN7dxE6QvxseFIBbMM3d4XwDHej/N0HWus eGmkSEJj8AHaSRzPDNGUeTYdXbdBIcltQ8WdwgN8oMBbpMwMT8+EtSjr9sjO9cWYzlED 9bU3fPX6duziaE5KO/txAhVb/I1R5yLevo8dhI/dCKWmMb1hSUxc+XXX5QZzIb6U21nG DG8gIFbzj14rBtgIPCM4zUQccWPs190Lb5Id7WHthakKP2w0A7HW06yIZljXCi/Fy+8z HBlA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=2reeoo50ei0GRmk7xSiMdED0daVl9VtBSGL5UJ2+viY=; b=HdqKAYpQiJzrBb/beVq3ucY8JG8ufYk0ce+xAAVbo2KP0xWBym0WuVE4p5jg46d62/ hYSxanAsYI3XJTZuf8hk2RISUkZOxKddEZtJKwBehIW1vk7oMsgZiQ/1hNAGr8LCetCf cmmpA9GrJTzpM+++1H5DRKK/zM6dERH+GTnMGJ4JEMp+zP0gSKEfEJoNdEWWSEZtmdmj dlrnBNBVo8nHVb5k6RBM5dfLvMNtsCCCCDmNbRtBSqRZzPuq+l6+wYyhxSymyDEyHkh9 YxXehq3WNqPuEmtjv8RGab5JoGWjgi+VUfzTpxxALbKL1Bs4JPgOQVCahpXMsgbWMHD0 pOBQ== X-Gm-Message-State: AOAM533gFzRlpV2SQneHE1yxUTCOichPEaDZjYPoIQNGQLE/t8hvh21P fSiwftpLjf1/9rOVOmRgxZfP0gB9oQtRJg== X-Received: by 2002:a19:645e:: with SMTP id b30mr12166689lfj.577.1623107088470; Mon, 07 Jun 2021 16:04:48 -0700 (PDT) Received: from localhost.localdomain (84-217-56-54.customers.ownit.se. [84.217.56.54]) by smtp.gmail.com with ESMTPSA id v9sm1999563ljv.131.2021.06.07.16.04.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Jun 2021 16:04:48 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Tue, 8 Jun 2021 01:04:02 +0200 Message-Id: <20210607230414.612-24-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20210607230414.612-1-dcnieho@gmail.com> References: <20210607230414.612-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 23/35] avformat: cosmetics 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: Diederick Niehorster Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: bQpCcMJsl7Ug Signed-off-by: Diederick Niehorster --- libavformat/avformat.h | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/libavformat/avformat.h b/libavformat/avformat.h index 12197465bc..5e1e82a315 100644 --- a/libavformat/avformat.h +++ b/libavformat/avformat.h @@ -530,6 +530,7 @@ typedef struct AVOutputFormat { int priv_data_size; int (*write_header)(struct AVFormatContext *); + /** * Write a packet. If AVFMT_ALLOW_FLUSH is set in flags, * pkt can be NULL in order to flush data buffered in the muxer. @@ -538,7 +539,9 @@ typedef struct AVOutputFormat { * data. */ int (*write_packet)(struct AVFormatContext *, AVPacket *pkt); + int (*write_trailer)(struct AVFormatContext *); + /** * A format-specific function for interleavement. * If unset, packets will be interleaved by dts. @@ -577,17 +580,21 @@ typedef struct AVOutputFormat { * @see avdevice_list_devices() for more details. */ int (*get_device_list)(struct AVFormatContext *s, struct AVDeviceInfoList *device_list); + /** * Initialize device capabilities submodule. * @see avdevice_capabilities_create() for more details. */ int (*create_device_capabilities)(struct AVFormatContext *s, void *opaque); + /** * Free device capabilities submodule. * @see avdevice_capabilities_free() for more details. */ int (*free_device_capabilities)(struct AVFormatContext *s, void *opaque); + enum AVCodecID data_codec; /**< default data codec */ + /** * Initialize format. May allocate data here, and set any AVFormatContext or * AVStream parameters that need to be set before packets are sent. @@ -598,6 +605,7 @@ typedef struct AVOutputFormat { * Any allocations made here must be freed in deinit(). */ int (*init)(struct AVFormatContext *); + /** * Deinitialize format. If present, this is called whenever the muxer is being * destroyed, regardless of whether or not the header has been written. @@ -607,6 +615,7 @@ typedef struct AVOutputFormat { * This is called if init() fails as well. */ void (*deinit)(struct AVFormatContext *); + /** * Set up any necessary bitstream filtering and extract any extra data needed * for the global header. From patchwork Mon Jun 7 23:04:03 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Diederick C. Niehorster" X-Patchwork-Id: 28145 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:b214:0:0:0:0:0 with SMTP id b20csp3886627iof; Mon, 7 Jun 2021 16:06:00 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxRI9v49DtErSGa7wsjnYjZ28WA/PIo37tSHnGNSnp+1/w5OdHFZmVWBF4pf8HhOn/DehV3 X-Received: by 2002:a17:906:e10d:: with SMTP id gj13mr19945237ejb.150.1623107160753; Mon, 07 Jun 2021 16:06:00 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1623107160; cv=none; d=google.com; s=arc-20160816; b=Zrm5jnKuz9KOWi8J/3e+v2p71TojC6+vM53JZATYKR0ssxZVp13J5iFVsyicfCwRtQ pEnqn+5yp4DqLczbbzbSoYaU5yFVn/fSjlSg+dy4jvmP2lrg6Poarq2Z0LVFsF5DyCwp H/4GuZXBAJEuy0MARaEkMjDa8IMS/CY7f3Z29SRsCXvtKz+h8/RSLju2h9RVgXvFZ8F8 s9eAQZcdXvJWJoK+dWdw6kX9sebwS4BiGkwfwdQd0AXgfKhFzdTPOOlVzkGnbmk0ld7n UtdZjq8A9DjCltCyY2Xq0ac3jSDgywbKLjXPEYBoyzZ6zMqyKBPjDB12lfSkHsFpB5pk wB1Q== 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=7PH6nnlExoupq+AiynGEl0YhaKcKO+kKU6DIGaLr78I=; b=CymoVlUhhN2VDAuERlniEYqDNmBL91kVpf83gFEg/jJHkmvCgPeisptAk6ckXxl7BJ ndy4pgcBjupq1G7QtY1ReN9nDLfEXPoldgJ4kiIc7hwlsE4s9Kx0sHz7xlwTA2UquIqW 9/3AJytIr0jE0td4nWdm7EPaz9YeKw2XUqlK1x97jVEa3TJPtSNsJ7WLkq83iLXXdmwG W7ThlwDnShMBCkJ6w3R2R84VU8qUwX23oSJqi9o7A0d6j0CU1txd9RzusehiXoo1d3zO mUaQ2OSX4RkhwavXbWdgchLlJnXtpImj8LtYMS0DRbXsLGGfn1LXrlRgpGoLoNA3M73Z 1YzQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=ZpZpHF1G; 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 h11si12917959edw.427.2021.06.07.16.06.00; Mon, 07 Jun 2021 16:06:00 -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=20161025 header.b=ZpZpHF1G; 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 EE063680C0F; Tue, 8 Jun 2021 02:04:53 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lf1-f46.google.com (mail-lf1-f46.google.com [209.85.167.46]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 492AF680A2B for ; Tue, 8 Jun 2021 02:04:50 +0300 (EEST) Received: by mail-lf1-f46.google.com with SMTP id v8so28962000lft.8 for ; Mon, 07 Jun 2021 16:04:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=SPFMbIFXJf7I1JEEyfxQrRWUvUTDwBFzNpApDQWd7Vk=; b=ZpZpHF1G013u8JlwuWlS4CrLoXtF3vV0P9u7rDHN2I04utR6ncg7e9nEhL5fYNjKif f2oabqo7oQQ0kCWQWVbM+Kck+fa9XgEJcXnjfYbs57lBkM40K4Zbyob9oZwPbL1UZadC zBrbOWs2sk4o95pto+092ZgZzGJzWMGaxc8kur8crwMwUwhBnnkn6Piibmfxj/ymoKws T3G67qIPCAFgryyriT9tMZgKO9zTO5SvqjIMoXXBWUzHkS+thjr0fGOURfz93x4Hdnxc FWIrZcFK3IuZ1okhLF78YsoYRDUYnHOxTkiBQpzawNUMWPwsBocHuB0RJgcCssCdC9+k zOUg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=SPFMbIFXJf7I1JEEyfxQrRWUvUTDwBFzNpApDQWd7Vk=; b=VEjIZvIgQe6INVeQeoPT8EHPOUfrWT7gtCdBA5p25eiMqWuoHmVVYrAf8t/JY/Kn88 ozvD0Ju1mj8+Yc/7zB7LyXXuPF7W+eH0gvsPjxGrwVXO+TTntjKQeMGkkqxOvfzd3HoZ Zo0t56MuWQUg/AGi7fqbI/yKGPOBdZCzkR0+ot0lMLsK9qW3vIAE6CUQaM7Lkrt6U8mB rd8Q0qu9ARaIEvU8zscTYsAcwE5s5CcSzQL38J3j/3inKAuZ1CoxVgIU3lyZajwZbUSn +NW4paXqgxZ8DvRd92ViiVPqg64w6+tztiTqj1XM64RCwaz5X2gt927dgK9Uffr6Q3yo EsgA== X-Gm-Message-State: AOAM531wlJFEngqYUTwHQpVTYumkTR7xFFrVgcEedUvX+w9cZFs2OICs z7Cm4Zy8M1zdUP8GKI4+S3+IfpeJ8Uvesg== X-Received: by 2002:a05:6512:987:: with SMTP id w7mr13235916lft.41.1623107089376; Mon, 07 Jun 2021 16:04:49 -0700 (PDT) Received: from localhost.localdomain (84-217-56-54.customers.ownit.se. [84.217.56.54]) by smtp.gmail.com with ESMTPSA id v9sm1999563ljv.131.2021.06.07.16.04.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Jun 2021 16:04:49 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Tue, 8 Jun 2021 01:04:03 +0200 Message-Id: <20210607230414.612-25-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20210607230414.612-1-dcnieho@gmail.com> References: <20210607230414.612-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 24/35] avutil/opt: AVOptionRange gains is_set field. 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: Diederick Niehorster Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: l+5qrp9Uqmtp When querying a range of formats of an avdevice, sometimes for a given format the queried option is not available. This is not an error as the user is asking for a valid capability, it just doesn't always apply to all the matching formats of the device. This is now communicated through a special value (like 0 or -1), but that is a problem (like always with special values). The is_set field alleviates the use of special values. This will be used when implementing the avdevice capabilities API for avdevice/dshow in a later commit Signed-off-by: Diederick Niehorster --- libavutil/opt.c | 1 + libavutil/opt.h | 5 +++++ libavutil/version.h | 2 +- 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/libavutil/opt.c b/libavutil/opt.c index 4124efd9b6..ab127b30fa 100644 --- a/libavutil/opt.c +++ b/libavutil/opt.c @@ -1865,6 +1865,7 @@ int av_opt_query_ranges_default(AVOptionRanges **ranges_arg, void *obj, const ch ranges->nb_ranges = 1; ranges->nb_components = 1; range->is_range = 1; + range->is_set = 1; range->value_min = field->min; range->value_max = field->max; diff --git a/libavutil/opt.h b/libavutil/opt.h index c2329e5589..ac0b4567a6 100644 --- a/libavutil/opt.h +++ b/libavutil/opt.h @@ -325,6 +325,11 @@ typedef struct AVOptionRange { * If set to 1 the struct encodes a range, if set to 0 a single value. */ int is_range; + /** + * Is set flag. + * If set to 1 the struct contains a value, if set to 0, the range is empty. + */ + int is_set; } AVOptionRange; /** diff --git a/libavutil/version.h b/libavutil/version.h index e11eaa20d0..34b83112de 100644 --- a/libavutil/version.h +++ b/libavutil/version.h @@ -79,7 +79,7 @@ */ #define LIBAVUTIL_VERSION_MAJOR 57 -#define LIBAVUTIL_VERSION_MINOR 0 +#define LIBAVUTIL_VERSION_MINOR 1 #define LIBAVUTIL_VERSION_MICRO 100 #define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \ From patchwork Mon Jun 7 23:04:04 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Diederick C. Niehorster" X-Patchwork-Id: 28134 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:b214:0:0:0:0:0 with SMTP id b20csp3886727iof; Mon, 7 Jun 2021 16:06:09 -0700 (PDT) X-Google-Smtp-Source: ABdhPJw1twi5KGEyNWosulwaKPfhSkCfvrWLIU7cjxpjzxJSSr1QFFIuzoRDsvRySvyUJEKdtqv9 X-Received: by 2002:a17:906:d92:: with SMTP id m18mr18277502eji.27.1623107169316; Mon, 07 Jun 2021 16:06:09 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1623107169; cv=none; d=google.com; s=arc-20160816; b=ZbJ1Pi8J5C5NYP9v3wYgE5TsLybQJblaykc1gRS9MAxQLNQLWTkvak5HxCU8WxGMgp KswCnfaBMzmGhCjx1pGWCZgR+beW1a+rqUkbmoVEw8VvwEvY6kvx+OFHlcuzpXo1RpP9 WVJngp4KkqQRLsa6TXefVYzsc7g1h5bg9AEgs6ujJdonq5LSbgD/Wnvttc9NnStIjUQQ Q/m1eikUCTx2FepKdRX9cUa/3BSkcdbSGWLifIGslvc1xnLwthO3zDhhVTHilT1zQi/R 0W1nyl6QEjs4a0jXS0jThy1SCiDIbTrXK+gdvIt+MIZjqx/tPxk9wjRsefSweizjxRdF koTw== 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=ogfrJfKIvcyDIYa2Yy98fo95/RBkYPC4XwiE4cBrpDU=; b=oitGEcOCVk3NUtAeyKER+Y7bAMNJTXm0r/ex0Hmy3jjmHUSW3N5Twzw9Y437KiQh9q DDPZe4c3tAhEucVzu30VUiMVGiVT3k61ZmGufQb+Ffba42nOSk/Gn+0pcoLYSGhr3JJq 8gQzPsPufvGKEUDq3Qu5BcksEbQ/ZKvq/S2MzOlnTSTIjK4YsvDckJ0hpQ5+t3UmslRC +wlzS9s/F9rNAwOHnzWjGhQfHD/eq3wjFPWf3uo51MMR+npHL/5+mZYeZK+/VZGltcmG 6uYI9j74Cyw6RjBu/rEaMixUdDKikKTzWV9OZCL0k8vcw/RAGRa2SQCiqZxez8pPdlKz FLiw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=afZnLDC2; 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 j12si13239360ejy.26.2021.06.07.16.06.09; Mon, 07 Jun 2021 16:06:09 -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=20161025 header.b=afZnLDC2; 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 EEE966809C9; Tue, 8 Jun 2021 02:04:54 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lf1-f42.google.com (mail-lf1-f42.google.com [209.85.167.42]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 324B76808F5 for ; Tue, 8 Jun 2021 02:04:51 +0300 (EEST) Received: by mail-lf1-f42.google.com with SMTP id v8so28962034lft.8 for ; Mon, 07 Jun 2021 16:04:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=wV/vu1hwYesFxXQ71GNOAneoY6bxdimNCPxHKRhh4Kc=; b=afZnLDC2FFlS0tisa/W4vxJwZiFfS5sKrSpJCEUNlhCi2YGPn5tNurpFOzNi3/Yt7Y VvNyYKhV83g/xkOlaBYQ1gmvnC/wYADS8h3JJ8GpvEdYKcC0OAuPep0dxJxSuzyWFfe1 6JoiCMFIAZGcbdeOdDAy04BNxwxjAmmenI/XHZolcdK79eUhoq/VsGtpAlmDYrJpsQOE OYyQseVdSssgM2h7D/5gd4DgtfhVE5NMnTqUW0u7fY64a8XrNyjY7RmPeuupal2KXjr8 Md5RKrasSqfVCZHQHCdgK8Hz/xp476WWMrIhhIHNE7CG6HpPDeCFQPV4pFq+RsJv0ULJ 6rOg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=wV/vu1hwYesFxXQ71GNOAneoY6bxdimNCPxHKRhh4Kc=; b=X1ZJPmJa+0LpGlw/4sO+Odk3HnPqjA9//+PP5b5N2bRlVRoAjCGGvdCFv0eC+QwPC9 QzZguvQdWSdOpfS3cpnwLCSdiIJECh0Z3QzGD7ebTh7o1u8DJl5Dg7UUbHSOIQFGl1vD WeDLN978/Q+BlOxnZ8AxzWEpejlA7KT832dcrjB3qKsZynIpJ/Bz8YMCkQ3MwKRb7nbD gSHRx86QE1EzeYoGGX8dCRqm0NBT3Ju7qrSNma+WEHr3WfY+rmyDDVAsSkAJAJ4z2COE 0GltNZ/vCiwLgQvELgZ5W4dNM10J0sAre/za5SFwMyiq7lscL0EeegUff+BLh1tJougO EXhA== X-Gm-Message-State: AOAM532iwgHkNJLr8qMlHIqBdfNFK9yJeC9cB3eGazUUs7ouIbUkxglN kguO1nYtvP4b6ytLGNaOF6oHIpJD5cXUJA== X-Received: by 2002:a05:6512:38ce:: with SMTP id p14mr13706214lft.197.1623107090206; Mon, 07 Jun 2021 16:04:50 -0700 (PDT) Received: from localhost.localdomain (84-217-56-54.customers.ownit.se. [84.217.56.54]) by smtp.gmail.com with ESMTPSA id v9sm1999563ljv.131.2021.06.07.16.04.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Jun 2021 16:04:49 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Tue, 8 Jun 2021 01:04:04 +0200 Message-Id: <20210607230414.612-26-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20210607230414.612-1-dcnieho@gmail.com> References: <20210607230414.612-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 25/35] avutil/opt: add av_opt_to_string 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: Diederick Niehorster Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: W2r6xFmtbiJp This function allows formatting an option value stored in a double (such as the min and max fields of an AVOption, or min_value and max_value of an AVOptionRange) properly, e.g. 1 for a AV_OPT_TYPE_PIXEL_FMT -> yuyv422. Useful when printing more info about an option than just its value. Usage will be shown in upcoming device_get_capabilities example. av_opt_get (body changed) still passes FATE. Signed-off-by: Diederick Niehorster --- libavutil/opt.c | 93 +++++++++++++++++++++++++++++++++++++-------- libavutil/opt.h | 12 +++++- libavutil/version.h | 2 +- 3 files changed, 89 insertions(+), 18 deletions(-) diff --git a/libavutil/opt.c b/libavutil/opt.c index ab127b30fa..3e385852eb 100644 --- a/libavutil/opt.c +++ b/libavutil/opt.c @@ -776,24 +776,14 @@ static void format_duration(char *buf, size_t size, int64_t d) *(--e) = 0; } -int av_opt_get(void *obj, const char *name, int search_flags, uint8_t **out_val) +static int print_option(void* dst, enum AVOptionType type, int search_flags, uint8_t** out_val) { - void *dst, *target_obj; - const AVOption *o = av_opt_find2(obj, name, NULL, 0, search_flags, &target_obj); - uint8_t *bin, buf[128]; + uint8_t* bin, buf[128]; int len, i, ret; int64_t i64; - if (!o || !target_obj || (o->offset<=0 && o->type != AV_OPT_TYPE_CONST)) - return AVERROR_OPTION_NOT_FOUND; - - if (o->flags & AV_OPT_FLAG_DEPRECATED) - av_log(obj, AV_LOG_WARNING, "The \"%s\" option is deprecated: %s\n", name, o->help); - - dst = (uint8_t *)target_obj + o->offset; - buf[0] = 0; - switch (o->type) { + switch (type) { case AV_OPT_TYPE_BOOL: ret = snprintf(buf, sizeof(buf), "%s", (char *)av_x_if_null(get_bool_name(*(int *)dst), "invalid")); break; @@ -819,9 +809,6 @@ int av_opt_get(void *obj, const char *name, int search_flags, uint8_t **out_val) case AV_OPT_TYPE_RATIONAL: ret = snprintf(buf, sizeof(buf), "%d/%d", ((AVRational *)dst)->num, ((AVRational *)dst)->den); break; - case AV_OPT_TYPE_CONST: - ret = snprintf(buf, sizeof(buf), "%f", o->default_val.dbl); - break; case AV_OPT_TYPE_STRING: if (*(uint8_t **)dst) { *out_val = av_strdup(*(uint8_t **)dst); @@ -889,6 +876,80 @@ int av_opt_get(void *obj, const char *name, int search_flags, uint8_t **out_val) return *out_val ? 0 : AVERROR(ENOMEM); } +int av_opt_get(void *obj, const char *name, int search_flags, uint8_t **out_val) +{ + void *dst, *target_obj; + const AVOption *o = av_opt_find2(obj, name, NULL, 0, search_flags, &target_obj); + uint8_t buf[128]; + int ret; + + if (!o || !target_obj || (o->offset<=0 && o->type != AV_OPT_TYPE_CONST)) + return AVERROR_OPTION_NOT_FOUND; + + if (o->flags & AV_OPT_FLAG_DEPRECATED) + av_log(obj, AV_LOG_WARNING, "The \"%s\" option is deprecated: %s\n", name, o->help); + + dst = (uint8_t *)target_obj + o->offset; + + + if (o->type != AV_OPT_TYPE_CONST) + return print_option(dst, o->type, search_flags, out_val); + + // special case for a const + ret = snprintf(buf, sizeof(buf), "%f", o->default_val.dbl); + if (ret >= sizeof(buf)) + return AVERROR(EINVAL); + *out_val = av_strdup(buf); + return *out_val ? 0 : AVERROR(ENOMEM); +} +int av_opt_to_string(double val, enum AVOptionType type, uint8_t** out_val) +{ + *out_val = NULL; + + switch (type) { + case AV_OPT_TYPE_FLAGS: + case AV_OPT_TYPE_BOOL: + case AV_OPT_TYPE_INT: + case AV_OPT_TYPE_PIXEL_FMT: + case AV_OPT_TYPE_SAMPLE_FMT: + { + int temp = lrint(val); + return print_option(&temp, type, 0, out_val); + } + case AV_OPT_TYPE_INT64: + case AV_OPT_TYPE_DURATION: + case AV_OPT_TYPE_CHANNEL_LAYOUT: + { + int64_t temp = llrint(val); + return print_option(&temp, type, 0, out_val); + } + case AV_OPT_TYPE_UINT64: + { + uint64_t temp = llrint(val); + return print_option(&temp, type, 0, out_val); + } + case AV_OPT_TYPE_FLOAT: + { + float temp = (float)val; + return print_option(&temp, type, 0, out_val); + } + case AV_OPT_TYPE_DOUBLE: + return print_option(&val, type, 0, out_val); + + default: + // AV_OPT_TYPE_DICT, + // AV_OPT_TYPE_COLOR, + // AV_OPT_TYPE_BINARY, + // AV_OPT_TYPE_STRING, + // AV_OPT_TYPE_RATIONAL, + // AV_OPT_TYPE_IMAGE_SIZE, + // AV_OPT_TYPE_VIDEO_RATE, + // AV_OPT_TYPE_CONST + // cannot be stored in a single double, and are thus not a valid input + return AVERROR(EINVAL); + } +} + static int get_number(void *obj, const char *name, const AVOption **o_out, double *num, int *den, int64_t *intnum, int search_flags) { diff --git a/libavutil/opt.h b/libavutil/opt.h index ac0b4567a6..bd386c411b 100644 --- a/libavutil/opt.h +++ b/libavutil/opt.h @@ -361,7 +361,7 @@ typedef struct AVOptionRanges { * for (range_index = 0; range_index < ranges->nb_ranges; range_index++) { * for (component_index = 0; component_index < ranges->nb_components; component_index++) * range[component_index] = ranges->range[ranges->nb_ranges * component_index + range_index]; - * //do something with range here. + * //do something with range here. For printing the value, av_opt_to_string() may be of use. * } * av_opt_freep_ranges(&ranges); * @endcode @@ -760,6 +760,16 @@ int av_opt_get_channel_layout(void *obj, const char *name, int search_flags, int * be freed with av_dict_free() by the caller */ int av_opt_get_dict_val(void *obj, const char *name, int search_flags, AVDictionary **out_val); +/** + * Format option value and output to string. + * @param[in] val an option value that can be represented as a double. + * @param[in] type of the option. + * @param[out] out_val value of the option will be written here + * @return >=0 on success, a negative error code otherwise + * + * @note the returned string will be av_malloc()ed and must be av_free()ed by the caller + */ +int av_opt_to_string(double val, enum AVOptionType type, uint8_t **out_val); /** * @} */ diff --git a/libavutil/version.h b/libavutil/version.h index 34b83112de..77ca4becd6 100644 --- a/libavutil/version.h +++ b/libavutil/version.h @@ -79,7 +79,7 @@ */ #define LIBAVUTIL_VERSION_MAJOR 57 -#define LIBAVUTIL_VERSION_MINOR 1 +#define LIBAVUTIL_VERSION_MINOR 2 #define LIBAVUTIL_VERSION_MICRO 100 #define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \ From patchwork Mon Jun 7 23:04:05 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Diederick C. Niehorster" X-Patchwork-Id: 28135 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:b214:0:0:0:0:0 with SMTP id b20csp3886831iof; Mon, 7 Jun 2021 16:06:19 -0700 (PDT) X-Google-Smtp-Source: ABdhPJysFZ3TwFNJhUBJbyLL4Dn2atYAQlYRT68nPWcyo0eB0kqYtQ7Ue67fNzfhI9l8/nCv+And X-Received: by 2002:a17:906:ae91:: with SMTP id md17mr20894855ejb.433.1623107178954; Mon, 07 Jun 2021 16:06:18 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1623107178; cv=none; d=google.com; s=arc-20160816; b=y65INKRYuVPIl+VeoQDBy7t0Iem2rqJeZenRogT3ewWsCVRIAIImu/eY4WdSPKUd5g fniLzBM6mdSEtHROzcOlx1yZm/Ox6INVO98sE463Fw5/pB4tITlcFTvpOEdmyyhXS/Ku QI3SZDi2Nn4UkJu6z66gaoPPOMqRmSj5/vtkd9FfHt3edw68A2CvD2pgx272ZNY5Vnb1 vgL1n5lPXvNK0oUYFvxJpabyXzMhkp0krsoYJQw3mHx1QKisW0HJPAZeA7q8E8RDo4OX t5yOW4HQqH4zA5xacVmf9jyXHl4D4HDknzURCJcrTMOpsCU45v8i9m1CIQfeG7NUwByu MKOg== 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=bnd/zRI0Jmme15Ta46WmA/JfEXbu0OJsjFMIywX0F48=; b=UJ1nsQLYf00RR0T9PTdIbnvrYvc2T9NgR31QeKVZswZtAEG/Ev59hK1NHRDmNCuZJf nIlsg0GG2wKLgeeOEVGrioisNUZ84ZJwT78LIQ8cJkPSu9pYq4d2B2khr1PN5l0aGmpl gOCdx8zYnwuCIsZ4PSLjyRkqnmKX9nTyQucyMNmZsj4j7V0+/ApHPX9Vi/5N0XNX5Tyb pKnvHN4OOLOjloMefQfT+8ISj1LzkQLf8j/PgcHN6cQ1/4aCa0S5FxWxk8HGythjDKW7 rocVGEAoeVUj92MD3XbGj+cFHqMDoyF5a262KKZGbbiJ7oMgLiqqbEP3ZmtER4vQB3jN 7rDg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=HA5dD6Pa; 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 y3si6842383edr.383.2021.06.07.16.06.18; Mon, 07 Jun 2021 16:06:18 -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=20161025 header.b=HA5dD6Pa; 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 EBEC6687EBB; Tue, 8 Jun 2021 02:04:55 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lf1-f50.google.com (mail-lf1-f50.google.com [209.85.167.50]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 29030680BAD for ; Tue, 8 Jun 2021 02:04:51 +0300 (EEST) Received: by mail-lf1-f50.google.com with SMTP id m21so13271991lfg.13 for ; Mon, 07 Jun 2021 16:04:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=Hudq24CVdXclAlL3gXpQklvP2RodUiETeAWyipBe6Kk=; b=HA5dD6Pa9uKwYOFAdhPVUuvHvT7ZOUwaB7MBXAGkXuNbCL42qqRJtjmg+T4/x1cq4E B0wad5WPP+DSPBUVM9xILASW3gCITdWkFATPCk/8LU6lq9fm6rHD7fH8Id3cqSZvgGp8 t0667ihRsDQYquQ4QSFOsFZs9wbuOY3FGoszPYAMa2YvQgN2uucXKZDLrMOsidkI2SXY Y0wf2lEwshftClqlFqJUuoiB5o3EUsTIfGll7dnmhBmzTF1joxIEI39QJvkeSRQursYO YNbcCieJriPWfoO+pdwuaChn2zC9K3jn5O5b1pjr65xrmKWExR1177+8vmL7cm2CsagH aIog== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=Hudq24CVdXclAlL3gXpQklvP2RodUiETeAWyipBe6Kk=; b=W6FMSXMnG2fjZpHBmaoArTis2P53omVFU9tm7076OurGVEtr2FJF4SIPL0BbaLYP2X t24pptvNZfOflla5gKIxgSr98syMsrSJdDzLfqwO5FtVlxntx5JXiNXDUMKZsSm6LtId x6g1nw1FgSF1hsjB6u874uS0wb7WTUeTVhst0iQhqaLQZeBlwLt6C0Qo49ScuVHFCnoT i+uQAAbJOKln4Gr7J0wrrgaqk+dhERVWZ+Q0OJw9gsXF61dDu9qXvowAWcU7SsbQOdrx gW/9oCn5oGOYRSZ/3YLFICZQ9iXVtMnO0SQ8+VZdEtBBqcKMkgBrk9wwVZBrInuQdnER GZWA== X-Gm-Message-State: AOAM530P/Qiz9RPS8/BjgG2yJsMUBIAArMVWpqat5sNfyNeOVoPKwtFl jNVlI6lXIuKQtpNG3Pe4cc3AvkU67jrpCw== X-Received: by 2002:a05:6512:32a5:: with SMTP id q5mr12821778lfe.171.1623107090973; Mon, 07 Jun 2021 16:04:50 -0700 (PDT) Received: from localhost.localdomain (84-217-56-54.customers.ownit.se. [84.217.56.54]) by smtp.gmail.com with ESMTPSA id v9sm1999563ljv.131.2021.06.07.16.04.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Jun 2021 16:04:50 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Tue, 8 Jun 2021 01:04:05 +0200 Message-Id: <20210607230414.612-27-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20210607230414.612-1-dcnieho@gmail.com> References: <20210607230414.612-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 26/35] avdevice: Add internal helpers for querying device capabilities 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: Diederick Niehorster Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: uiK+pRAC6Ra9 Signed-off-by: Diederick Niehorster --- libavdevice/internal.h | 31 +++++++++++++++++++++++++++ libavdevice/utils.c | 48 ++++++++++++++++++++++++++++++++++++++++++ libavdevice/version.h | 2 +- 3 files changed, 80 insertions(+), 1 deletion(-) diff --git a/libavdevice/internal.h b/libavdevice/internal.h index fe4be64ee7..10e1cdb80c 100644 --- a/libavdevice/internal.h +++ b/libavdevice/internal.h @@ -58,4 +58,35 @@ typedef struct AVDeviceCapabilitiesQuery { */ extern const AVOption av_device_capabilities[]; +/** + * Enumeration indicating which device capability is being queried. + */ +enum AVDeviceCapabilitiesQueryType { + AV_DEV_CAP_QUERY_NONE = 0, + // both audio and video + AV_DEV_CAP_QUERY_CODEC, + // audio + AV_DEV_CAP_QUERY_SAMPLE_FORMAT, + AV_DEV_CAP_QUERY_SAMPLE_RATE, + AV_DEV_CAP_QUERY_CHANNELS, + AV_DEV_CAP_QUERY_CHANNEL_LAYOUT, + // video + AV_DEV_CAP_QUERY_PIXEL_FORMAT, + AV_DEV_CAP_QUERY_WINDOW_SIZE, + AV_DEV_CAP_QUERY_FRAME_SIZE, + AV_DEV_CAP_QUERY_FPS +}; + +/** + * Find AVDeviceCapabilitiesQueryType enumeration by means of options name. + * Returns AV_DEV_CAP_QUERY_NONE if not found. + */ +enum AVDeviceCapabilitiesQueryType ff_device_get_query_type(const char* option_name); + +/** + * Get component name from AVDeviceCapabilitiesQueryType enumeration and component index. + * (Some options have multiple components, e.g. AV_DEV_CAP_QUERY_FRAME_SIZE). + */ +const char* ff_device_get_query_component_name(enum AVDeviceCapabilitiesQueryType query_type, int component); + #endif diff --git a/libavdevice/utils.c b/libavdevice/utils.c index d9a52c53ab..73fdc5766e 100644 --- a/libavdevice/utils.c +++ b/libavdevice/utils.c @@ -19,6 +19,7 @@ #include "internal.h" #include "libavutil/opt.h" #include "libavformat/avformat.h" +#include "libavutil/avassert.h" int ff_alloc_input_device_context(AVFormatContext **avctx, const AVInputFormat *iformat, const char *format) { @@ -57,3 +58,50 @@ int ff_alloc_input_device_context(AVFormatContext **avctx, const AVInputFormat * avformat_free_context(s); return ret; } + +typedef struct AVDeviceCapabilitiesQueryTypeEntry { + const char* name; + enum DshowCapQueryType query_type; +} AVDeviceCapabilitiesQueryTypeEntry; + +static const AVDeviceCapabilitiesQueryTypeEntry query_table[] = { + // both audio and video + { "codec", AV_DEV_CAP_QUERY_CODEC }, + // audio + { "sample_format", AV_DEV_CAP_QUERY_SAMPLE_FORMAT }, + { "sample_rate", AV_DEV_CAP_QUERY_SAMPLE_RATE }, + { "channels", AV_DEV_CAP_QUERY_CHANNELS }, + { "channel_layout", AV_DEV_CAP_QUERY_CHANNEL_LAYOUT }, + // video + { "pixel_format", AV_DEV_CAP_QUERY_PIXEL_FORMAT }, + { "frame_size", AV_DEV_CAP_QUERY_FRAME_SIZE }, + { "window_size", AV_DEV_CAP_QUERY_WINDOW_SIZE }, + { "fps", AV_DEV_CAP_QUERY_FPS }, +}; + +enum AVDeviceCapabilitiesQueryType ff_device_get_query_type(const char* option_name) +{ + for (int i = 0; i < FF_ARRAY_ELEMS(query_table); ++i) { + if (!strcmp(query_table[i].name, option_name)) + return query_table[i].query_type; + } + // not found + return AV_DEV_CAP_QUERY_NONE; +} + +const char* ff_device_get_query_component_name(enum AVDeviceCapabilitiesQueryType query_type, int component) +{ + if (query_type == AV_DEV_CAP_QUERY_WINDOW_SIZE || query_type == AV_DEV_CAP_QUERY_FRAME_SIZE) { + // special case: different name for each component + return component == 0 ? "pixel_count" : (component == 1 ? "width" : (component == 2 ? "height" : "")); + } + else { + av_assert0(component == 0); + for (int i = 0; i < FF_ARRAY_ELEMS(query_table); ++i) { + if (query_table[i].query_type == query_type) + return query_table[i].name; + } + } + // not found + return NULL; +} \ No newline at end of file diff --git a/libavdevice/version.h b/libavdevice/version.h index 53af6fa0d0..e0361aebc1 100644 --- a/libavdevice/version.h +++ b/libavdevice/version.h @@ -29,7 +29,7 @@ #define LIBAVDEVICE_VERSION_MAJOR 59 #define LIBAVDEVICE_VERSION_MINOR 3 -#define LIBAVDEVICE_VERSION_MICRO 100 +#define LIBAVDEVICE_VERSION_MICRO 101 #define LIBAVDEVICE_VERSION_INT AV_VERSION_INT(LIBAVDEVICE_VERSION_MAJOR, \ LIBAVDEVICE_VERSION_MINOR, \ From patchwork Mon Jun 7 23:04:06 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Diederick C. Niehorster" X-Patchwork-Id: 28139 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:b214:0:0:0:0:0 with SMTP id b20csp3886934iof; Mon, 7 Jun 2021 16:06:28 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzYfcLfpoLPlRDFKXgM00zU3Q43GJ7eDy7NDyVumnVKveHpBH7/mqLsLzY05lELAkG2f3vK X-Received: by 2002:a17:906:7188:: with SMTP id h8mr20218862ejk.529.1623107188141; Mon, 07 Jun 2021 16:06:28 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1623107188; cv=none; d=google.com; s=arc-20160816; b=uNBF9TQjZQIBvHqZRCMiFv6CigH96KfnmWR5bE7xb5GLUtoAvlcmkU59SUyi+hKUSf 7AyoGFT6jCeFAqymk6VYNDpasG1DSea5ktc5bOEWT2/hf7k+y6+bAcQsP9m0DNbql7Lv Rn29qengs6oMyFN66mJOBOWlgMf5wlPqZcIcn04nQ8H4gT8oSo0lgLJbPy6Y/c9U1Os9 o+/pIIRZ284S0XK3TBz+umN+7GOz746jLNISpcqIMG1CGVoMWcKXsRpZRSSfIGOXLBNs kixsSGaZAjISZYAMtKfaDru0v4H6ET3nYc7CYs5anF3xtZGl52WMk0400CrbL2mqm4WA caaA== 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=28DKf0SkX6TmVKV32nJkRdMd/xcpmzbp9urseHXSqLw=; b=DTC2N2HUG6aJro0oVsn32itzeKm4V7cktaYb+Bn/aVNyehv00c2ZClODDeRGy874nF OQVfFmj1Qq5B5smHwLWRlWBTMGBq6RJVR2/iR6jZgloEi8Ga74+eiz0z+25AGtuUT+a9 Ni3GC600C35vqKVtVDDP81vuEaCgMYFR1rvb2HkdCLCriMXAOxVm5fGB88sOE3kIXpxj OwN9MXo1BAzC7TEu3aB5CYWszE4I2UI6Pg4GIDszRG3+DiPhrzJ3wf152n9ce3XjrdW+ i++h7qoJpbAc4nkYp5wzIJ399JYNUb5BzBmlI4MnbFiACbm7I4xiUPMohpcyoqk+ZJPU HsfA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b="cR5eD/04"; 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 k13si13162061ejb.687.2021.06.07.16.06.27; Mon, 07 Jun 2021 16:06: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=20161025 header.b="cR5eD/04"; 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 E7FD56818DB; Tue, 8 Jun 2021 02:04:56 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lf1-f46.google.com (mail-lf1-f46.google.com [209.85.167.46]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id C4EF5680987 for ; Tue, 8 Jun 2021 02:04:52 +0300 (EEST) Received: by mail-lf1-f46.google.com with SMTP id v8so28962108lft.8 for ; Mon, 07 Jun 2021 16:04:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=n/iFnDWu/ZfLORjT+xFjFuTdgPvhmLVKzk87w7dbAH0=; b=cR5eD/04rNBfYb7b7WzKHQMFoHHDp2B1eTOtck+EZ0XXqTo/6E5jIbBwI3WCt0Eu9g YhiSQA/TJOuZHJVARCekpYqq1V9LCJFsaRUwjM3WcH6ErxE4aGeI4GFpeei3g5/r98uT 6AwWIfMCOB9cVhi0l73tNf1yniLYyrxYgRjm1UuSLEtyeDulhI/Ls5+eqL74T32Xs2up ZbNxfSj5MLkKuapwKlBoamwkY0hHa9ATvFkCoO8fWCT5sa6nrLb5Sib3+DS7Mjwp1L9+ rwZPjLV7+sxBDegI6wCM9Msyy0AO7SaJpg3Kll6fkCUWdEWU0O9/77ZGUuhebHNcsVEe IKjA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=n/iFnDWu/ZfLORjT+xFjFuTdgPvhmLVKzk87w7dbAH0=; b=SVZmuhGW4ipiSEc/Mv6k+mEdZ+UMgxSlaVaBv9mxEyUOCCKO28j0vP7aUmHK7gpNw+ UycdFncvxN507HlFWYuKHkU63JcP4KOOcWVC2bPVZ4uiv5W75Iz7XF0EUwQJexmf6/ZD naozpnhjhogX4FEhmkmvrh0yMJryk2zSw1KlSUOAn2p03aauO9w/Hxy9N7HC09IkZafk zliFta/HpnyI/IholPdc0mZPSx2oyh0Z1++NRhot172q6wns9gv5e26H+mvRlbUnv/Dq YisWu1esE4W1jDMVEX1cTU5wyu2piRXNDXy+t3RZ6v4V0EVmMBjuYjH9ntPOyMhSKLWe gqmg== X-Gm-Message-State: AOAM532NuqsaIgj3npFLgU2M9IETAdfOmOl9yA00qPqMLPsJXYHK5Vpy Y2k6nZDl8RuhMYUKTjUoqWtYp5dAbVI5Aw== X-Received: by 2002:a19:441a:: with SMTP id r26mr13717413lfa.104.1623107091915; Mon, 07 Jun 2021 16:04:51 -0700 (PDT) Received: from localhost.localdomain (84-217-56-54.customers.ownit.se. [84.217.56.54]) by smtp.gmail.com with ESMTPSA id v9sm1999563ljv.131.2021.06.07.16.04.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Jun 2021 16:04:51 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Tue, 8 Jun 2021 01:04:06 +0200 Message-Id: <20210607230414.612-28-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20210607230414.612-1-dcnieho@gmail.com> References: <20210607230414.612-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 27/35] avdevice/dshow: move audio format helpers 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: Diederick Niehorster Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: opGLGqFAopux Needs to be moved up in file for upcoming implementation of avdevice_capabilities_create. Signed-off-by: Diederick Niehorster --- libavdevice/dshow.c | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/libavdevice/dshow.c b/libavdevice/dshow.c index 252db47351..004b4e6154 100644 --- a/libavdevice/dshow.c +++ b/libavdevice/dshow.c @@ -56,6 +56,26 @@ static enum AVPixelFormat dshow_pixfmt(DWORD biCompression, WORD biBitCount) return avpriv_find_pix_fmt(avpriv_get_raw_pix_fmt_tags(), biCompression); // all others } +static enum AVCodecID waveform_codec_id(enum AVSampleFormat sample_fmt) +{ + switch (sample_fmt) { + case AV_SAMPLE_FMT_U8: return AV_CODEC_ID_PCM_U8; + case AV_SAMPLE_FMT_S16: return AV_CODEC_ID_PCM_S16LE; + case AV_SAMPLE_FMT_S32: return AV_CODEC_ID_PCM_S32LE; + default: return AV_CODEC_ID_NONE; /* Should never happen. */ + } +} + +static enum AVSampleFormat sample_fmt_bits_per_sample(int bits) +{ + switch (bits) { + case 8: return AV_SAMPLE_FMT_U8; + case 16: return AV_SAMPLE_FMT_S16; + case 32: return AV_SAMPLE_FMT_S32; + default: return AV_SAMPLE_FMT_NONE; /* Should never happen. */ + } +} + static enum AVColorRange dshow_color_range(DXVA_ExtendedFormat* fmt_info) { switch (fmt_info->NominalRange) @@ -1610,26 +1630,6 @@ static int dshow_control_message(AVFormatContext *avctx, int type, void *data, s return 0; } -static enum AVCodecID waveform_codec_id(enum AVSampleFormat sample_fmt) -{ - switch (sample_fmt) { - case AV_SAMPLE_FMT_U8: return AV_CODEC_ID_PCM_U8; - case AV_SAMPLE_FMT_S16: return AV_CODEC_ID_PCM_S16LE; - case AV_SAMPLE_FMT_S32: return AV_CODEC_ID_PCM_S32LE; - default: return AV_CODEC_ID_NONE; /* Should never happen. */ - } -} - -static enum AVSampleFormat sample_fmt_bits_per_sample(int bits) -{ - switch (bits) { - case 8: return AV_SAMPLE_FMT_U8; - case 16: return AV_SAMPLE_FMT_S16; - case 32: return AV_SAMPLE_FMT_S32; - default: return AV_SAMPLE_FMT_NONE; /* Should never happen. */ - } -} - static int dshow_add_device(AVFormatContext *avctx, enum dshowDeviceType devtype) From patchwork Mon Jun 7 23:04:07 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Diederick C. Niehorster" X-Patchwork-Id: 28138 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:b214:0:0:0:0:0 with SMTP id b20csp3887040iof; Mon, 7 Jun 2021 16:06:39 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzomLdtEcCYEfJVJ5M9BELzVKcXtQiI/TyyQy6MqbyYJMLDCXqtwkzWUyx3lZf3GZ/H6lG7 X-Received: by 2002:a05:6402:754:: with SMTP id p20mr21822526edy.311.1623107199525; Mon, 07 Jun 2021 16:06:39 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1623107199; cv=none; d=google.com; s=arc-20160816; b=Y1aXksiBJQQW03LA3HII+a5M0IkwG5VsAkzh340t/5Q8kE2LOY7eTv9IV3cAN3t3XK 5/I/e7ze0kt4Da4g+BHn2PsitIs1PWxKiXU0uakU5sHmoDTU+68aPvatItGbHe8po4Bc Sezqxl7k9GMJYp2lstqI2SFiKLCWwXbIwerBE59wHofB2NtFuXXs0jrE4jeVfyYx2ciE i3UEyX292MWzSx5Ew1JXTvh4i4ePEgicMWHKPU9SZh+ti7awgF/MubEs967tsVaR3/Qv +m+y6HZDkhsJruaLZL3MlYP53dI7EZJ556lxtcVMw7QIVjzNNqJoCbcIUefwsYZal6Wc O92w== 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=DR/j76K20adpgHhbdbpOA1NGtz49J/E8zLizEV0IubI=; b=Ep8ngf3Irk4wHuKz6OpPQWPJyMMfa9V9qe1WK4ZLQP4eNEwIma0pG6dGvzsLZcfDty 0deeHQD/snHNwVeqj+PoVYc44CnM4UBXXspwOzS6tSJ3x0hndg7L4HhnF2kgLGU/AJhX e6j+FIwEJ71EALVhNPp29jDjJliEkWbUDmKnIxKwclcjy/Iv9rtU8EsZzIuSXzIMnBIs CprZU8TXKlxcBf5PtByTwYt30s91jXN0wIKIFBtlr1TRJA4Hg14g+KPdC9hB+fCRh6vy 5jEqrKWf6V4p3h6aH7mOnaVc292tC/4mbBvN6ES0u4qe6PxXEB4WDvXVFkRU4/HAcTLy GI6w== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=CMtRDp6W; 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 l18si13085091edc.264.2021.06.07.16.06.37; Mon, 07 Jun 2021 16:06:39 -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=20161025 header.b=CMtRDp6W; 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 CE981687F8C; Tue, 8 Jun 2021 02:04:57 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lf1-f42.google.com (mail-lf1-f42.google.com [209.85.167.42]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id BE446680C0F for ; Tue, 8 Jun 2021 02:04:53 +0300 (EEST) Received: by mail-lf1-f42.google.com with SMTP id m21so13272080lfg.13 for ; Mon, 07 Jun 2021 16:04:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=9ocYUP/GphBKza6O+W1dpNazPJve7+uOBzeixMJAdsE=; b=CMtRDp6WkzQYJtVe5VJRb96dhAOluDGZYqdmUqPljvgMo0BZQbaSXnWDH96flHa3eg ScXfqUUQO/Ftb+NkQ/5UJQIR+4bHlTw9gBo+HP/ZY8Iejy4eLxMGm2w8x+Gyy6cYb+16 QXqMErdDKNYvS6slnKPDoYPLXUcC0zLbSeQkDeKEy2jHFWE6O4EtbUA4DDuXLGGFs71o Hs7D/3oAwtOaqknVMrnlj8XyIhrnDOWjuJO7hvyp0N4Oyj23mR1fSvKKFjG+dzR0drFe fC3dChaAzWAqLySWYbB1MZIEsW3opPek2VWDR0U/LcBUfh3F6Q/GoIAgqIZeneCJULzi DPzg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=9ocYUP/GphBKza6O+W1dpNazPJve7+uOBzeixMJAdsE=; b=oY9mCrfZu8XZmlzL01OPVOOpO4equGE9C8IQYUoMcWdo1UOHRqvM54gH5Yf9Fi2fM7 kTEY58WLZIKaSWUWM6jTAgchpuFBhwq2UEGY1/z2jXiTLfeeTFryBCcPmzEFvQU5wXrQ 991quWOAHsNI8m/mqqyU9TPmQ7w8KHb7UoOZRxJgfJuauml+nxc7IU7v9DKarCLXEUMf rE45/bbmPBdNs45TJC4jCbb2RG8W/nGuHKLtxg+zhxBaorEKRE2+/LHDyzme4JyMfeUE hMh1etiiPy2UTEUdlU7VCMSQGyegNh6M5yQKoK/aOk3eRIsJx4pxDc+3rjietwcdGp4s gUIQ== X-Gm-Message-State: AOAM532b0q5/8oHkweXEVgsMyDAOMmQhIAFe6yGpxF6z+LuIaZDyGvFr ryegwe8mPO3otzmvpVAHn2h3AfurKaiMLg== X-Received: by 2002:ac2:4542:: with SMTP id j2mr13170385lfm.435.1623107092852; Mon, 07 Jun 2021 16:04:52 -0700 (PDT) Received: from localhost.localdomain (84-217-56-54.customers.ownit.se. [84.217.56.54]) by smtp.gmail.com with ESMTPSA id v9sm1999563ljv.131.2021.06.07.16.04.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Jun 2021 16:04:52 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Tue, 8 Jun 2021 01:04:07 +0200 Message-Id: <20210607230414.612-29-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20210607230414.612-1-dcnieho@gmail.com> References: <20210607230414.612-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 28/35] avdevice/dshow: when closing, set context fields back to zero 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: Diederick Niehorster Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: anjNzU2oKuax After the avdevice capabilities API is implemented, the format context may be reused after querying device capabilities in a later avformat_open_input call. To enable this reuse, after releasing resources, make sure to also set the corresponding pointers back to NULL. This correctly indicates their state. Signed-off-by: Diederick Niehorster --- libavdevice/dshow.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/libavdevice/dshow.c b/libavdevice/dshow.c index 004b4e6154..40a492b787 100644 --- a/libavdevice/dshow.c +++ b/libavdevice/dshow.c @@ -272,14 +272,18 @@ dshow_read_close(AVFormatContext *s) ICaptureGraphBuilder2_Release(ctx->graph_builder2[VideoDevice]); if (ctx->graph_builder2[AudioDevice]) ICaptureGraphBuilder2_Release(ctx->graph_builder2[AudioDevice]); + ctx->graph_builder2[0] = NULL; + ctx->graph_builder2[1] = NULL; if (ctx->control) { IMediaControl_Stop(ctx->control); IMediaControl_Release(ctx->control); } + ctx->control = NULL; if (ctx->media_event) IMediaEvent_Release(ctx->media_event); + ctx->media_event = NULL; if (ctx->graph) { IEnumFilters *fenum; @@ -297,25 +301,34 @@ dshow_read_close(AVFormatContext *s) IEnumFilters_Release(fenum); } IGraphBuilder_Release(ctx->graph); + ctx->graph = NULL; } if (ctx->capture_pin[VideoDevice]) ff_dshow_pin_Release(ctx->capture_pin[VideoDevice]); if (ctx->capture_pin[AudioDevice]) ff_dshow_pin_Release(ctx->capture_pin[AudioDevice]); + ctx->capture_pin[0] = NULL; + ctx->capture_pin[1] = NULL; if (ctx->capture_filter[VideoDevice]) ff_dshow_filter_Release(ctx->capture_filter[VideoDevice]); if (ctx->capture_filter[AudioDevice]) ff_dshow_filter_Release(ctx->capture_filter[AudioDevice]); + ctx->capture_filter[0] = NULL; + ctx->capture_filter[1] = NULL; if (ctx->device_pin[VideoDevice]) IPin_Release(ctx->device_pin[VideoDevice]); if (ctx->device_pin[AudioDevice]) IPin_Release(ctx->device_pin[AudioDevice]); + ctx->device_pin[0] = NULL; + ctx->device_pin[1] = NULL; if (ctx->device_filter[VideoDevice]) IBaseFilter_Release(ctx->device_filter[VideoDevice]); if (ctx->device_filter[AudioDevice]) IBaseFilter_Release(ctx->device_filter[AudioDevice]); + ctx->device_filter[0] = NULL; + ctx->device_filter[1] = NULL; av_freep(&ctx->device_name[0]); av_freep(&ctx->device_name[1]); @@ -324,10 +337,13 @@ dshow_read_close(AVFormatContext *s) if(ctx->mutex) CloseHandle(ctx->mutex); + ctx->mutex = NULL; if(ctx->event[0]) CloseHandle(ctx->event[0]); if(ctx->event[1]) CloseHandle(ctx->event[1]); + ctx->event[0] = NULL; + ctx->event[1] = NULL; pktl = ctx->pktl; while (pktl) { @@ -336,6 +352,7 @@ dshow_read_close(AVFormatContext *s) av_free(pktl); pktl = next; } + ctx->pktl = NULL; CoUninitialize(); From patchwork Mon Jun 7 23:04:08 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Diederick C. Niehorster" X-Patchwork-Id: 28144 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:b214:0:0:0:0:0 with SMTP id b20csp3887163iof; Mon, 7 Jun 2021 16:06:49 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwaAwe4dutNkq91fnX8yLySrjEvt5MeqSsyX+k95J4QWdV6OyddROnshtfO+sLKZ8pxKZ5V X-Received: by 2002:a05:6402:1d38:: with SMTP id dh24mr22735772edb.18.1623107208985; Mon, 07 Jun 2021 16:06:48 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1623107208; cv=none; d=google.com; s=arc-20160816; b=wkJbNWd+ZZqiQ3iR+vfwJulALpzOEgZ3bBbdS3FhysI8NxSpe0+skI2uyAdxzuVLhM KqC4+qlpwuevtq7IsU+5rk8o3l3HguwuDAplAu/m8G2QkEOw177ZSSwcve8tCQ4SAdBV 2vMyCq9yRvbyjYBh7cZACHFQXITpAbM2vXhAiSLzoU8O+0NrYiTCOmm5rfI7UAOPGC6I 5BrcShCvEFUSgdk7kVMTNc8+L8mA7R1u9G6EaGEpODh7XIIhPHs6pYWw52X/IsKAg3Yk tDHvOE+jmaOQjhrYxMNcIl0go3ayBO5+yXvcXOawM5IlKWZkBj6qszrGNWYngcXfwkiL zcSQ== 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=PCN6y0Nj8Ux0dkg1HQx83lWWjyPogCfFm81vpVJjoF4=; b=xstMkFKt5yb/bUaAOWA186ZtodQDHYPQjS/nVR/ChLzAPLx7EY3MW5JD5yNroouZFD FBXbOuhun5JONNFdhdmBUR+oe3F9gGZKUtuKwCLgnJthIMg9MwWGloJKJmJAceWkR/C3 PXid7xg7JPW3i8Kftu33gCOKKSK19lPWTDV1k94BXMM+sf5VMESWYZqZgiqMabDLBdYZ +OXpp/xNBBtROVkM9RoGF2HB4CyJaDeqCNOMWAANVPG18slGKEbXVHHYhCXQEZ3U3EGP EA+wHPV1YHMgeAEmU++DpgCgMefVDCIna87Dzs6iVvnri1F/gcEQFwcYM2xO4BNRV8to 0zBQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=h6M43PSx; 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 ga2si13545490ejb.249.2021.06.07.16.06.48; Mon, 07 Jun 2021 16:06:48 -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=20161025 header.b=h6M43PSx; 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 EEF78687FD9; Tue, 8 Jun 2021 02:04:58 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lf1-f43.google.com (mail-lf1-f43.google.com [209.85.167.43]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 47BF9680BBD for ; Tue, 8 Jun 2021 02:04:55 +0300 (EEST) Received: by mail-lf1-f43.google.com with SMTP id t7so21898062lff.0 for ; Mon, 07 Jun 2021 16:04:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=l4gTKpId/8dXk0MDHDWJxoYPN1z/4E74WRGN8NMECA4=; b=h6M43PSxAuMa4Bida22qYbcKiyQew++mg12SLn563Ye9AiyEJYE1aANM2TyZwBsNtA 0Z+iHSLbvLNELkmZ74MJB8mo0op+uNtxKJIA2GvyxnvCi2I9ce9urKaW4fGUmDlS8sID lfazT3oHGPqxnwa4xgncADVm7JL+G7mc3mf41xV+gx353Aepm1O5IcA+8fsoG3Ww2nRC HzgXOJCmFTBsVxR9eYZu62SeSDfjGxVboeYS9Jgd4tUibeiUpUi8malYcqS0pO7oKtKa BotPHbkslTrHkXZgk714QuftdQUs6zCakBK0xHzMZPjSBDVThUqubE3dvzStAELtwrmo ne8A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=l4gTKpId/8dXk0MDHDWJxoYPN1z/4E74WRGN8NMECA4=; b=CTvclVVLNaoMBtQY89sRetHiDBAzKtwr6jDsv9HQo2Ya6/V3aoBwypQ5VqQBt8nNEd q/hRTPwpzRNFjDdPmRMP8s1n0hs/IOvHswX6TvMCqWbIn6wcUk0MZvLNj1nINgYbdMnK cBWOzenCnLpauJVw41aFI22oYqnw2D5GsJ/NZCMMim4EmUaKj3HqXVRu6MRO8ikTJ0Tx WUr1e/QtMCpdIwIz8UuOlGbcaHMPvo0b7TeVFYStpZX4qdwS9Qvoo0AjX9TfSNQovpvx eIfV+7bJhhDkzN7K6dvwRes19YaHIJV6AQaB6yC0RVr1enQhikznwwnygvT+uTh6M0g0 RmzQ== X-Gm-Message-State: AOAM532LHawSi85LWFsJZvB0fjpBt+BSMALUhQvy/VbV4ZEtTjxo95Pp LgURjVM74QelAVS8jGj5/hiEDss9pY9CcA== X-Received: by 2002:a19:6a08:: with SMTP id u8mr7480115lfu.93.1623107093939; Mon, 07 Jun 2021 16:04:53 -0700 (PDT) Received: from localhost.localdomain (84-217-56-54.customers.ownit.se. [84.217.56.54]) by smtp.gmail.com with ESMTPSA id v9sm1999563ljv.131.2021.06.07.16.04.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Jun 2021 16:04:53 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Tue, 8 Jun 2021 01:04:08 +0200 Message-Id: <20210607230414.612-30-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20210607230414.612-1-dcnieho@gmail.com> References: <20210607230414.612-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 29/35] avdevice/dshow: implement capabilities API 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: Diederick Niehorster Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: HwjHkY7jCaYo This implements avdevice_capabilities_create for the dshow device (avdevice_capabilities_free not needed as it would be no-op). Signed-off-by: Diederick Niehorster --- libavdevice/dshow.c | 384 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 365 insertions(+), 19 deletions(-) diff --git a/libavdevice/dshow.c b/libavdevice/dshow.c index 40a492b787..082ae5f26c 100644 --- a/libavdevice/dshow.c +++ b/libavdevice/dshow.c @@ -27,6 +27,7 @@ #include "libavformat/internal.h" #include "libavformat/riff.h" #include "avdevice.h" +#include "internal.h" #include "libavcodec/raw.h" #include "objidl.h" #include "shlwapi.h" @@ -815,11 +816,15 @@ static struct dshow_format_info* dshow_get_format_info(AM_MEDIA_TYPE* type) * try to set parameters specified through AVOptions, or the pin's * default format if no such parameters were set. If successful, * return 1 in *pformat_set. - * If pformat_set is NULL, list all pin capabilities. + * If pformat_set is NULL or the ranges input is not NULL, list all + * pin capabilities. + * When listing pin capabilities, if ranges is NULL, output to log, + * else store capabilities in ranges. */ static void dshow_cycle_formats(AVFormatContext *avctx, enum dshowDeviceType devtype, - IPin *pin, int *pformat_set) + IPin *pin, int *pformat_set, + AVOptionRanges *ranges, enum AVDeviceCapabilitiesQueryType query_type) { struct dshow_ctx *ctx = avctx->priv_data; IAMStreamConfig *config = NULL; @@ -863,7 +868,7 @@ dshow_cycle_formats(AVFormatContext *avctx, enum dshowDeviceType devtype, * one, with most info exposed (see comment below). */ use_default = !dshow_should_set_format(avctx, devtype); - if (use_default && pformat_set) + if (use_default && pformat_set && !ranges) { HRESULT hr; @@ -931,7 +936,9 @@ dshow_cycle_formats(AVFormatContext *avctx, enum dshowDeviceType devtype, // exposes contains a VIDEOINFOHEADER2. Fall back to the VIDEOINFOHEADER // format if no corresponding VIDEOINFOHEADER2 is found when we finish // iterating. - for (i = 0; i < n && !format_set; i++) { + for (i = 0; i < n && (!format_set || ranges); i++) { + AVOptionRange *new_range[3] = { NULL }; + int nb_range = 0; struct dshow_format_info *fmt_info = NULL; r = IAMStreamConfig_GetStreamCaps(config, i, &type, (void *) caps); if (r != S_OK) @@ -967,7 +974,7 @@ dshow_cycle_formats(AVFormatContext *avctx, enum dshowDeviceType devtype, wait_for_better = 0; } - if (!pformat_set) { + if (!pformat_set && !ranges) { if (fmt_info->pix_fmt == AV_PIX_FMT_NONE) { const AVCodec *codec = avcodec_find_decoder(fmt_info->codec_id); if (fmt_info->codec_id == AV_CODEC_ID_NONE || !codec) { @@ -1031,6 +1038,63 @@ dshow_cycle_formats(AVFormatContext *avctx, enum dshowDeviceType devtype, bih->biWidth = requested_width; bih->biHeight = requested_height; } + + if (ranges) { + for (int j = 0; j < ranges->nb_components; j++) { + new_range[j] = av_mallocz(sizeof(**new_range)); + if (!new_range[j]) + goto next; + ++nb_range; + + switch (query_type) + { + case AV_DEV_CAP_QUERY_CODEC: + if (dshow_pixfmt(bih->biCompression, bih->biBitCount) == AV_PIX_FMT_NONE) { + const AVCodecTag* const tags[] = { avformat_get_riff_video_tags(), NULL }; + new_range[j]->value_min = av_codec_get_id(tags, bih->biCompression); + } + else + new_range[j]->value_min = AV_CODEC_ID_RAWVIDEO; + new_range[j]->value_max = new_range[j]->value_min; + new_range[j]->is_set = 1; + break; + case AV_DEV_CAP_QUERY_PIXEL_FORMAT: + new_range[j]->value_min = new_range[j]->value_max = dshow_pixfmt(bih->biCompression, bih->biBitCount); + new_range[j]->value_min; + new_range[j]->is_set = 1; + break; + case AV_DEV_CAP_QUERY_FRAME_SIZE: + { + switch (j) + { + case 0: + new_range[j]->value_min = vcaps->MinOutputSize.cx * vcaps->MinOutputSize.cy; + new_range[j]->value_max = vcaps->MaxOutputSize.cx * vcaps->MaxOutputSize.cy; + break; + case 1: + new_range[j]->value_min = vcaps->MinOutputSize.cx; + new_range[j]->value_max = vcaps->MaxOutputSize.cx; + break; + case 2: + new_range[j]->value_min = vcaps->MinOutputSize.cy; + new_range[j]->value_max = vcaps->MaxOutputSize.cy; + break; + } + new_range[j]->is_set = 1; + break; + } + case AV_DEV_CAP_QUERY_FPS: + new_range[j]->value_min = 1e7 / vcaps->MaxFrameInterval; + new_range[j]->value_max = 1e7 / vcaps->MinFrameInterval; + new_range[j]->is_set = 1; + break; + + // default: + // an audio property is being queried, output all fields 0 (mallocz above) is fine + } + } + } + } else { AUDIO_STREAM_CONFIG_CAPS *acaps = caps; WAVEFORMATEX *fx; @@ -1042,7 +1106,7 @@ dshow_cycle_formats(AVFormatContext *avctx, enum dshowDeviceType devtype, } else { goto next; } - if (!pformat_set) { + if (!pformat_set && !ranges) { av_log(avctx, AV_LOG_INFO, " min ch=%lu bits=%lu rate=%6lu max ch=%lu bits=%lu rate=%6lu\n", acaps->MinimumChannels, acaps->MinimumBitsPerSample, acaps->MinimumSampleFrequency, acaps->MaximumChannels, acaps->MaximumBitsPerSample, acaps->MaximumSampleFrequency); @@ -1066,15 +1130,72 @@ dshow_cycle_formats(AVFormatContext *avctx, enum dshowDeviceType devtype, goto next; fx->nChannels = requested_channels; } + + if (ranges) { + for (int j = 0; j < ranges->nb_components; j++) { + new_range[j] = av_mallocz(sizeof(**new_range)); + if (!new_range[j]) + goto next; + ++nb_range; + + switch (query_type) + { + case AV_DEV_CAP_QUERY_SAMPLE_FORMAT: + new_range[j]->value_min = sample_fmt_bits_per_sample(acaps->MinimumBitsPerSample); + new_range[j]->value_max = sample_fmt_bits_per_sample(acaps->MaximumBitsPerSample); + new_range[j]->is_set = 1; + break; + case AV_DEV_CAP_QUERY_SAMPLE_RATE: + new_range[j]->value_min = acaps->MinimumSampleFrequency; + new_range[j]->value_max = acaps->MaximumSampleFrequency; + new_range[j]->is_set = 1; + break; + case AV_DEV_CAP_QUERY_CHANNELS: + new_range[j]->value_min = acaps->MinimumChannels; + new_range[j]->value_max = acaps->MaximumChannels; + new_range[j]->is_set = 1; + break; + + // default: + // a video property is being queried, output all fields 0 (mallocz above) is fine + // NB: this is a for-loop since some of the video queries are multi-component + // and all components should be set + } + } + } } // found a matching format. Either apply or store // for safekeeping if we might maybe find a better // format with more info attached to it (see comment - // above loop) - if (!wait_for_better) { + // above loop). If storing all capabilities of device + // in ranges, try to apply in all cases, and store + // caps if successfully applied + if (!wait_for_better || ranges) { if (IAMStreamConfig_SetFormat(config, type) != S_OK) goto next; + else if (ranges) { + // format matched and could be set successfully. + // fill in some fields for each capability + for (int j = 0; j < nb_range; j++) { + new_range[j]->str = av_strdup(ff_device_get_query_component_name(query_type, j)); + if (!new_range[j]->str) + goto next; + if (new_range[j]->is_set) + new_range[j]->is_range = new_range[j]->value_min != new_range[j]->value_max; + } + + // store to ranges output + if (av_reallocp_array(&ranges->range, + ranges->nb_ranges*ranges->nb_components + nb_range*ranges->nb_components, + sizeof(*ranges->range)) < 0) + goto next; + for (int j = 0; j < nb_range; ++j) { + ranges->range[ranges->nb_ranges] = new_range[j]; + ranges->nb_ranges++; + new_range[j] = NULL; // copied into array, make sure not freed below + } + } format_set = 1; } else if (!previous_match_type) { @@ -1086,6 +1207,12 @@ dshow_cycle_formats(AVFormatContext *avctx, enum dshowDeviceType devtype, next: if (fmt_info) av_free(fmt_info); + for (int j = 0; j < nb_range; ++j) { + if (new_range[j]) { + av_freep(&new_range[j]->str); + av_freep(&new_range[j]); + } + } if (type && type->pbFormat) CoTaskMemFree(type->pbFormat); CoTaskMemFree(type); @@ -1208,10 +1335,13 @@ end: * devtype, retrieve the first output pin and return the pointer to the * object found in *ppin. * If ppin is NULL, cycle through all pins listing audio/video capabilities. + * If ppin is not NULL and ranges is also not null, enumerate all formats + * supported by the selected pin. */ static int dshow_cycle_pins(AVFormatContext *avctx, enum dshowDeviceType devtype, - enum dshowSourceFilterType sourcetype, IBaseFilter *device_filter, IPin **ppin) + enum dshowSourceFilterType sourcetype, IBaseFilter *device_filter, + IPin **ppin, AVOptionRanges *ranges, enum AVDeviceCapabilitiesQueryType query_type) { struct dshow_ctx *ctx = avctx->priv_data; IEnumPins *pins = 0; @@ -1250,6 +1380,7 @@ dshow_cycle_pins(AVFormatContext *avctx, enum dshowDeviceType devtype, wchar_t *pin_id = NULL; char *pin_buf = NULL; char *desired_pin_name = devtype == VideoDevice ? ctx->video_pin_name : ctx->audio_pin_name; + int nb_ranges = ranges ? ranges->nb_ranges : 0; IPin_QueryPinInfo(pin, &info); IBaseFilter_Release(info.pFilter); @@ -1274,7 +1405,7 @@ dshow_cycle_pins(AVFormatContext *avctx, enum dshowDeviceType devtype, if (!ppin) { av_log(avctx, AV_LOG_INFO, " Pin \"%s\" (alternative pin name \"%s\")\n", name_buf, pin_buf); - dshow_cycle_formats(avctx, devtype, pin, NULL); + dshow_cycle_formats(avctx, devtype, pin, NULL, NULL, AV_DEV_CAP_QUERY_NONE); goto next; } @@ -1288,12 +1419,15 @@ dshow_cycle_pins(AVFormatContext *avctx, enum dshowDeviceType devtype, // will either try to find format matching options supplied by user // or try to open default format. Successful if returns with format_set==1 - dshow_cycle_formats(avctx, devtype, pin, &format_set); + // if ranges is non-NULL, will iterate over all formats and return info + // about all the valid ones. If any valid found, format_set==1, else + // format_set will be 0 + dshow_cycle_formats(avctx, devtype, pin, &format_set, ranges, query_type); if (!format_set) { goto next; } - if (devtype == AudioDevice && ctx->audio_buffer_size) { + if (devtype == AudioDevice && ctx->audio_buffer_size && !ranges) { if (dshow_set_audio_buffer_size(avctx, pin) < 0) { av_log(avctx, AV_LOG_ERROR, "unable to set audio buffer size %d to pin, using pin anyway...", ctx->audio_buffer_size); } @@ -1306,8 +1440,25 @@ dshow_cycle_pins(AVFormatContext *avctx, enum dshowDeviceType devtype, next: if (p) IKsPropertySet_Release(p); - if (device_pin != pin) + if (device_pin != pin) { IPin_Release(pin); + // remove any option ranges info we just added, wrong pin + if (ranges && nb_ranges>0) { + int nb_original_entries = nb_ranges * ranges->nb_components; + for (int i = nb_original_entries; i < ranges->nb_ranges * ranges->nb_components; i++) { + AVOptionRange* range = ranges->range[i]; + if (range) { + av_freep(&range->str); + av_freep(&ranges->range[i]); + } + } + if (av_reallocp_array(&ranges->range, nb_original_entries, sizeof(*ranges->range)) < 0) + ranges->nb_ranges = 0; + else + ranges->nb_ranges = nb_ranges; + } + device_pin = NULL; + } av_free(name_buf); av_free(pin_buf); if (pin_id) @@ -1339,17 +1490,19 @@ next: */ static int dshow_list_device_options(AVFormatContext *avctx, ICreateDevEnum *devenum, - enum dshowDeviceType devtype, enum dshowSourceFilterType sourcetype) + enum dshowDeviceType devtype, enum dshowSourceFilterType sourcetype, + AVOptionRanges *ranges, enum AVDeviceCapabilitiesQueryType query_type) { struct dshow_ctx *ctx = avctx->priv_data; IBaseFilter *device_filter = NULL; + IPin *device_pin = NULL; char *device_unique_name = NULL; int r; if ((r = dshow_cycle_devices(avctx, devenum, devtype, sourcetype, &device_filter, &device_unique_name, NULL)) < 0) return r; ctx->device_filter[devtype] = device_filter; - if ((r = dshow_cycle_pins(avctx, devtype, sourcetype, device_filter, NULL)) < 0) + if ((r = dshow_cycle_pins(avctx, devtype, sourcetype, device_filter, ranges ? &device_pin : NULL, ranges, query_type)) < 0) return r; av_freep(&device_unique_name); return 0; @@ -1433,7 +1586,7 @@ dshow_open_device(AVFormatContext *avctx, ICreateDevEnum *devenum, goto error; } - if ((r = dshow_cycle_pins(avctx, devtype, sourcetype, device_filter, &device_pin)) < 0) { + if ((r = dshow_cycle_pins(avctx, devtype, sourcetype, device_filter, &device_pin, NULL, AV_DEV_CAP_QUERY_NONE)) < 0) { ret = r; goto error; } @@ -1860,14 +2013,14 @@ static int dshow_read_header(AVFormatContext *avctx) } if (ctx->list_options) { if (ctx->device_name[VideoDevice]) - if ((r = dshow_list_device_options(avctx, devenum, VideoDevice, VideoSourceDevice))) { + if ((r = dshow_list_device_options(avctx, devenum, VideoDevice, VideoSourceDevice, NULL, AV_DEV_CAP_QUERY_NONE))) { ret = r; goto error; } if (ctx->device_name[AudioDevice]) { - if (dshow_list_device_options(avctx, devenum, AudioDevice, AudioSourceDevice)) { + if (dshow_list_device_options(avctx, devenum, AudioDevice, AudioSourceDevice, NULL, AV_DEV_CAP_QUERY_NONE)) { /* show audio options from combined video+audio sources as fallback */ - if ((r = dshow_list_device_options(avctx, devenum, AudioDevice, VideoSourceDevice))) { + if ((r = dshow_list_device_options(avctx, devenum, AudioDevice, VideoSourceDevice, NULL, AV_DEV_CAP_QUERY_NONE))) { ret = r; goto error; } @@ -2013,6 +2166,198 @@ static int dshow_read_packet(AVFormatContext *s, AVPacket *pkt) return ctx->eof ? AVERROR(EIO) : pkt->size; } +// TODO: consider if and how to expose extra info we have about formats, such as color_range +static int dshow_query_ranges(AVOptionRanges** ranges_arg, void* obj, const char* key, int flags) +{ + AVDeviceCapabilitiesQuery *caps = obj; + const AVFormatContext *avctx = caps->device_context; + struct dshow_ctx *ctx = avctx->priv_data; + + int backup_sample_size; + int backup_sample_rate; + int backup_channels; + enum AVCodecID backup_video_codec_id; + enum AVPixelFormat backup_pixel_format; + int backup_requested_width; + int backup_requested_height; + char* backup_framerate = NULL; + + enum AVDeviceCapabilitiesQueryType query_type = AV_DEV_CAP_QUERY_NONE; + + AVOptionRanges *ranges = av_mallocz(sizeof(**ranges_arg)); + const AVOption *field = av_opt_find(obj, key, NULL, 0, flags); + int ret; + + ICreateDevEnum *devenum = NULL; + + *ranges_arg = NULL; + + if (!ranges) { + ret = AVERROR(ENOMEM); + goto fail1; + } + + if (!field) { + ret = AVERROR_OPTION_NOT_FOUND; + goto fail1; + } + + // turn option name into cap query + query_type = ff_device_get_query_type(field->name); + + if (query_type == AV_DEV_CAP_QUERY_CHANNEL_LAYOUT || query_type == AV_DEV_CAP_QUERY_WINDOW_SIZE) { + av_log(avctx, AV_LOG_ERROR, "Querying the option %s is not supported for a dshow device\n", field->name); + ret = AVERROR(EINVAL); + goto fail1; + } + + if (ctx->device_name[0]) { + av_log(avctx, AV_LOG_ERROR, "You cannot query device capabilities on an opened device\n"); + ret = AVERROR(EIO); + goto fail1; + } + + if (!parse_device_name(avctx)) { + av_log(avctx, AV_LOG_ERROR, "You must set a device name (AVFormatContext url) to specify which device to query capabilities from\n"); + ret = AVERROR(EINVAL); + goto fail1; + } + + // take backup of dshow parameters/options + // audio + backup_sample_size = ctx->sample_size; + backup_sample_rate = ctx->sample_rate; + backup_channels = ctx->channels; + // video + backup_video_codec_id = ctx->video_codec_id; + backup_pixel_format = ctx->pixel_format; + backup_requested_width = ctx->requested_width; + backup_requested_height= ctx->requested_height; + backup_framerate = ctx->framerate; + + + // set format constraints set in AVDeviceCapabilitiesQuery + // audio (NB: channel_layout not used) + ctx->sample_size = av_get_bytes_per_sample(caps->sample_format) << 3; + ctx->sample_rate = (caps->sample_rate == -1) ? 0 : caps->sample_rate; + ctx->channels = (caps->channels == -1) ? 0 : caps->channels; + // video (NB: window_width and window_height not used) + ctx->video_codec_id = caps->codec; + ctx->pixel_format = caps->pixel_format; + ctx->requested_width = caps->frame_width; + ctx->requested_height = caps->frame_height; + // checking whether requested framerate is set is done by !ctx->framerate + if (caps->fps.num > 0 && caps->fps.den > 0) { + ctx->requested_framerate = caps->fps; + ctx->framerate = av_strdup("dummy"); // just make sure its non-zero + if (!ctx->framerate) { + ret = AVERROR(ENOMEM); + goto fail2; + } + } + else + ctx->framerate = NULL; // make sure its NULL (if it wasn't, we already have a backup of the pointer to restore later) + + // now iterate matching format of pin that would be selected when device + // is opened with options currently in effect. + // for each matching format, output its parameter range, also if that same + // range already returned for another format. That way, user can reconstruct + // possible valid combinations by av_opt_query_ranges() for each of the + // format options and matching returned values by sequence number. + CoInitialize(0); + + if (CoCreateInstance(&CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, + &IID_ICreateDevEnum, (void **) &devenum)) { + av_log(avctx, AV_LOG_ERROR, "Could not enumerate system devices.\n"); + ret = AVERROR(EIO); + goto fail2; + } + ctx->video_codec_id = avctx->video_codec_id ? avctx->video_codec_id + : AV_CODEC_ID_RAWVIDEO; + + ranges->nb_components = (field->type == AV_OPT_TYPE_IMAGE_SIZE && (flags & AV_OPT_MULTI_COMPONENT_RANGE)) ? 3 : 1; + if (ctx->device_name[VideoDevice]) + if ((ret = dshow_list_device_options(avctx, devenum, VideoDevice, VideoSourceDevice, ranges, query_type)) < 0) + goto fail2; + if (ctx->device_name[AudioDevice]) { + if (dshow_list_device_options(avctx, devenum, AudioDevice, AudioSourceDevice, ranges, query_type) < 0) { + /* show audio options from combined video+audio sources as fallback */ + if ((ret = dshow_list_device_options(avctx, devenum, AudioDevice, VideoSourceDevice, ranges, query_type)) < 0) + goto fail2; + } + } + ret = ranges->nb_ranges ? ranges->nb_components : 0; + + // when dealing with a multi-component item (regardless of whether + // AV_OPT_MULTI_COMPONENT_RANGE is set or not), we need to reorganize the + // output range array from [r1_c1 r1_c2 r1_c3 r2_c1 r2_c2 r2_c3 ...] to + // [r1_c1 r2_c1 ... r1_c2 r2_c2 ... r1_c3 r2_c3 ...] to be consistent with + // documentation of AVOptionRanges in libavutil/opt.h + if (ranges->nb_ranges && ranges->nb_components>1) { + AVOptionRange **new_range = av_malloc_array(ranges->nb_components * ranges->nb_ranges, sizeof(*ranges->range)); + AVOptionRange **old_range = ranges->range; + if (!new_range) { + ret = AVERROR(ENOMEM); + goto fail2; + } + ranges->nb_ranges /= ranges->nb_components; + for (int n = 0; n < ranges->nb_components * ranges->nb_ranges; n++) { + int i = n / ranges->nb_components; + int j = n % ranges->nb_components; + new_range[ranges->nb_ranges * j + i] = old_range[n]; + } + ranges->range = new_range; + av_freep(&old_range); + } + + // success, set output + *ranges_arg = ranges; + +fail2: + // set dshow parameters/options back to original values + // audio + ctx->sample_size = backup_sample_size; + ctx->sample_rate = backup_sample_rate; + ctx->channels = backup_channels; + // video + ctx->video_codec_id = backup_video_codec_id; + ctx->pixel_format = backup_pixel_format; + ctx->requested_width = backup_requested_width; + ctx->requested_height = backup_requested_height; + if (ctx->framerate) + av_free(ctx->framerate); + ctx->framerate = backup_framerate; + + if (devenum) + ICreateDevEnum_Release(devenum); + + // clear state variables that may have been set during the above process + // (e.g. frees device names, removes device_filters, etc) + dshow_read_close(avctx); + +fail1: + if (ret < 0) + av_opt_freep_ranges(&ranges); + + return ret; +} + +// fake class to point av_opt_query_ranges to our query_ranges function +static const AVClass dshow_dev_caps_class = { + .class_name = "", + .item_name = av_default_item_name, + .option = av_device_capabilities, + .version = LIBAVUTIL_VERSION_INT, + .query_ranges = dshow_query_ranges, +}; + +static int dshow_create_device_capabilities(struct AVFormatContext* avctx, void *opaque) +{ + struct AVDeviceCapabilitiesQuery *caps = opaque; + caps->av_class = &dshow_dev_caps_class; + return 0; +} + #define OFFSET(x) offsetof(struct dshow_ctx, x) #define DEC AV_OPT_FLAG_DECODING_PARAM static const AVOption options[] = { @@ -2062,6 +2407,7 @@ const AVInputFormat ff_dshow_demuxer = { .read_close = dshow_read_close, .control_message = dshow_control_message, .get_device_list= dshow_get_device_list, + .create_device_capabilities = dshow_create_device_capabilities, .flags = AVFMT_NOFILE | AVFMT_NOBINSEARCH | AVFMT_NOGENSEARCH | AVFMT_NO_BYTE_SEEK, .priv_class = &dshow_class, }; From patchwork Mon Jun 7 23:04:09 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Diederick C. Niehorster" X-Patchwork-Id: 28137 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:b214:0:0:0:0:0 with SMTP id b20csp3887255iof; Mon, 7 Jun 2021 16:06:57 -0700 (PDT) X-Google-Smtp-Source: ABdhPJw47z2SYp1tm6EbNV+aJKBjRMQsBSllaoLV8Ls9VayLBue8WPPArzlkzeBKPwhpMSnZVgbO X-Received: by 2002:a05:6402:42d2:: with SMTP id i18mr22303272edc.168.1623107217773; Mon, 07 Jun 2021 16:06:57 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1623107217; cv=none; d=google.com; s=arc-20160816; b=SqNqQjEcVj4v8ejLFqkP5VwPQ82nDocjXC4ZZmZ+VA8Gp/5QMXQwoOrwc0+qs6R64S mYaHPhOYACx58DEms1ZfUrUZKrFUwMBoMW46IZCtNFOWijvwz0TflaERV35RBuvb23D+ mDmb+H+j3+qqoc4Lg4DVMI0waS/FHFsHqRUwCiyX0FX7Hc52QQraVyVP/+kFrk/Zgc1K P6GRwh01hrQ6ZCORvD+evzci+MgX5Ka3a7rLGhZN76T/gpJzIoydHzUXelAs4+gearVT p7Qg+hfwoL88m+VaqftTj5QABE9mM0EqxB+Lo2MpbYKlsJwDFF+Nr0F8IwcdxAv3qJ3/ y37A== 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=8wX6OCkzNsD5idQqNDrvwnxTSehTvOMC0a1JKvd78k0=; b=d5efbjRnLiTp9kGr/2tIseJuazR+rydhCszBD6F7VA6fPIHsOySYRfLpK8ylSgJ9tu qLt+NFng3jC/vOL1N58LFCKOF4kDtJJVGHmZBtSNxml0/B65uxyGX8MBpgMvGDwvW2xD c6xicDzYwi5zJ0cbVutfRAM/iiTZ9ZIXS+2eVLvRG/mmCyp3zAhbXpNGVTVUdT/Jky6r bljq9tc7HfW2fpkzhHUJ6OLcwB0h2jq8blSvQ7cSijYg6Hhs1KbtEgQ/tx7e6tfjYxOv SXw5gSEXdFKhuVJuSEs0zriGkMRKqVu8rqV9UkXf7Rr0R5ajjAxOP6W3M+fCb8oNfZ3z 4TZg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=qSxm1SQq; 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 m26si15076233edp.349.2021.06.07.16.06.57; Mon, 07 Jun 2021 16:06:57 -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=20161025 header.b=qSxm1SQq; 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 EE64A687FC5; Tue, 8 Jun 2021 02:04:59 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lf1-f53.google.com (mail-lf1-f53.google.com [209.85.167.53]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id E246D6818DB for ; Tue, 8 Jun 2021 02:04:55 +0300 (EEST) Received: by mail-lf1-f53.google.com with SMTP id i10so29004925lfj.2 for ; Mon, 07 Jun 2021 16:04:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=qXkAJYSghJDl64VFrJ3sXAtSXszoeD2B44GUe77vHBs=; b=qSxm1SQqKofvLMEx7bO9Oxr4jJCs2+Hsg74EtyQBORfK1xXUL2Rek2ZgWcPOSHULaJ RXkBR87kAN26690jEHMqh5svIvGlXx3l/sbjr9nGuWx4qY4BFM9AYyd9rTXQ7JaHdOTI 8f1oYTw9rQ+4rSi5AGouzqqmmQoTWqVijsUpHPG4yyME1L9PAVdwhm59tvN7dTh9Xyqh DI7pQMnbxf/d2+eH/65jZoF2rovK0gf6TekS7JuWyi5zvJPJaTM0dTTGm8AEPy6iPuKL JWfNYJPB/l5EFjwMyJt3XOyWnZPcHiiVGtLXZDm1BRBRS5DA8DUlf8a1P8O/8V0fuxdx HspA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=qXkAJYSghJDl64VFrJ3sXAtSXszoeD2B44GUe77vHBs=; b=YySGFgDZxJhmmp+G73nyXXAqw8qo/+2L9XZwS2z9VYOz5u2LA9Rb2KmLxRvG4ACAqX xeHS+EBCCXFb6JAuLbr0WxxNQ0eGYsmoi5ntjrv7Ct2YCRdByrqENjq3F1eU24DVAhqC 9Og/3w00M+hf6jWxzgA1//O0oZy1XVbTWw6TRhE0jlTz+17tSylYHgOfDtuprvQDC45d 1WNu4tS1AsMe3iRG2w57oNWRyQ1jSueAm2JilQgfsRAvYTuC/iP4h7pivQxvfnfqNdOM Pmrc9o3OAd8gaRUTGf+W5I6eArMkySo4Vh3xaMDfcOYgEb0KwAS+5f8UAwEWcpgYO1zd q+6Q== X-Gm-Message-State: AOAM532sEoWRokB01If59LIzKQlH8WDAbl2u17urgpfUA3e5WbqOEgkH uviomsuR/J4D9rSRu9QMHkGcpCpVJ55acA== X-Received: by 2002:a19:c347:: with SMTP id t68mr13089233lff.653.1623107094736; Mon, 07 Jun 2021 16:04:54 -0700 (PDT) Received: from localhost.localdomain (84-217-56-54.customers.ownit.se. [84.217.56.54]) by smtp.gmail.com with ESMTPSA id v9sm1999563ljv.131.2021.06.07.16.04.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Jun 2021 16:04:54 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Tue, 8 Jun 2021 01:04:09 +0200 Message-Id: <20210607230414.612-31-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20210607230414.612-1-dcnieho@gmail.com> References: <20210607230414.612-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 30/35] avdevice/dshow: cosmetics 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: Diederick Niehorster Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: KKxwQGl9B68t Signed-off-by: Diederick Niehorster --- libavdevice/dshow.c | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/libavdevice/dshow.c b/libavdevice/dshow.c index 082ae5f26c..c158a536d8 100644 --- a/libavdevice/dshow.c +++ b/libavdevice/dshow.c @@ -940,6 +940,7 @@ dshow_cycle_formats(AVFormatContext *avctx, enum dshowDeviceType devtype, AVOptionRange *new_range[3] = { NULL }; int nb_range = 0; struct dshow_format_info *fmt_info = NULL; + r = IAMStreamConfig_GetStreamCaps(config, i, &type, (void *) caps); if (r != S_OK) goto next; @@ -2399,15 +2400,15 @@ static const AVClass dshow_class = { }; const AVInputFormat ff_dshow_demuxer = { - .name = "dshow", - .long_name = NULL_IF_CONFIG_SMALL("DirectShow capture"), - .priv_data_size = sizeof(struct dshow_ctx), - .read_header = dshow_read_header, - .read_packet = dshow_read_packet, - .read_close = dshow_read_close, - .control_message = dshow_control_message, - .get_device_list= dshow_get_device_list, + .name = "dshow", + .long_name = NULL_IF_CONFIG_SMALL("DirectShow capture"), + .priv_data_size = sizeof(struct dshow_ctx), + .read_header = dshow_read_header, + .read_packet = dshow_read_packet, + .read_close = dshow_read_close, + .control_message = dshow_control_message, + .get_device_list = dshow_get_device_list, .create_device_capabilities = dshow_create_device_capabilities, - .flags = AVFMT_NOFILE | AVFMT_NOBINSEARCH | AVFMT_NOGENSEARCH | AVFMT_NO_BYTE_SEEK, - .priv_class = &dshow_class, + .flags = AVFMT_NOFILE | AVFMT_NOBINSEARCH | AVFMT_NOGENSEARCH | AVFMT_NO_BYTE_SEEK, + .priv_class = &dshow_class, }; From patchwork Mon Jun 7 23:04:10 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Diederick C. Niehorster" X-Patchwork-Id: 28132 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:b214:0:0:0:0:0 with SMTP id b20csp3887378iof; Mon, 7 Jun 2021 16:07:06 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzRR1nGSE6T8FRBOX/NGYRs2x2I+fliXDgidv82rvUyRxyva0BcEoXe9tm4MdhKv6VDhFKw X-Received: by 2002:a17:907:2074:: with SMTP id qp20mr20032943ejb.35.1623107226184; Mon, 07 Jun 2021 16:07:06 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1623107226; cv=none; d=google.com; s=arc-20160816; b=A89qOpVOBbDAf9rv3tbZ6wzmKFsD9aGTvmVByuoZpqVJOBBce66uWGPWZutW1e10Jk zqgwyz8rsDBum9QC90EAl07JcmDjlf0UtekLra/dYYfBQQ+R4JkWJ1WRORmZC0oaNh7w COJEuVtp64c6q0IaXP2dlPGWPVlotNdzpXIua99lFTchXpCjIs9+ZQHt8/GcHWBuiGWA y650tTZGhddBW2OHyTTgG79F2HpcXatmQdJyPf7TKW4gtW3qpA6GaWGDajgxsK2tmFJz hC0BLkF442ennv8ZHe2lGDqWb7fbjLj54vx3kW0G7wMTDbtq2MR6BfvBxI8iMo7NcRZO 74iw== 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=jUGv146QYOxgRb7l7LOx3T1qwsYcswKrT+ceWtB1aEk=; b=KPNSet2JmBWF8IAqCzJnGnlvVp984LvOl9EoH54ir+JeTVp+WNyAp58SQUB6j48zri v3qpNK5D/xhApXbC01ij3OiPtqWIlknXjqvhhAXhxoByOiON/vs88V76K9WGVU1MezMu HpzYoHK12vHcwV8LC8UeVPcSnhYTSm2hwKpPpYQp+UK9UWkbb9HIzIGreOVJ0OXGsVzM D7SmyaS5JoYZdjF/RBY8xYL4Fs+OQvLn4CHDYLj8x4wmKlMgkg7MNulYpOtQqXj+M/m9 HFfAWKgDn5ZoYzdi/7iqCgNR83n+8Ehr8+v7KI1QGgg2WUHi6Zffbpnmm3i1AI9l3egn XjqA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b="uTG3/G32"; 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 m11si13263296edq.265.2021.06.07.16.07.05; Mon, 07 Jun 2021 16:07:06 -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=20161025 header.b="uTG3/G32"; 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 D4ECE687F3D; Tue, 8 Jun 2021 02:05:00 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lf1-f50.google.com (mail-lf1-f50.google.com [209.85.167.50]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 9A0BA680C55 for ; Tue, 8 Jun 2021 02:04:56 +0300 (EEST) Received: by mail-lf1-f50.google.com with SMTP id t7so21898137lff.0 for ; Mon, 07 Jun 2021 16:04:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=Yi+tpy1lCcTejLc8cCCtnq9dSO48mpsu9CqVm3/+hHo=; b=uTG3/G32uyCLPTwkiSf7xNyVpmUoPnyc0swn1RUNIl3GpfJvr7cJo/BrKaV4nT6rBm Or851heJWBAa6i79Mmq2NjC6iTax0jK2LAsyfKXa8sIWxtlGz6EN5NNlXcIiQGcQWGSi 9M7tPsUg50p73bGoAIoKU9+lSSLVWpRfrecpyow+oB4W2AWEMdVP22yCn0Y8PXatS5QF yhYCpL/ypMSKLFFGrOqiPXS0eWoO2Hm2BHVVCumJpHRM88SmRJlVX8NZdivDqwILGEdB U2M7jac4y4oDmF55nUDRPQ1NDzBxcc82IUUy5YpKLtiSVNVWqjBN3AOtDly2mp2U192V H7BQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=Yi+tpy1lCcTejLc8cCCtnq9dSO48mpsu9CqVm3/+hHo=; b=RyNAYOMW12h04P86j7b4NgjTILMGonKCj7iBiVmP4V2N2pvX2mAJsiBBcRcVE5KRrj IZBu+q+dM+AosQFHNfwb+vnqJa6By1jOK2yz0Py5fFKBkG99ada5mmJd36VMdOkmCb+s 9/hhF2Kp11EL/VMDq535i3kQ0/FUge8sXh2eOAH6o5mTtewyWGR00cY+ppxjFHyrrooX GPRzTTR2+UO2ZF+6siiIVCVODP7gBZAP2+/yymPqPgzvGflKpPsJaIE/xMWRl7WBJ3BZ iFFMQA6HnhoK2fH/gT/mpuJoZz5alHN2+gJDpz9YDrgPbIJWby9vSK74rdRD4njHzvW4 37BQ== X-Gm-Message-State: AOAM530x4257WHjKXSfeYkZ/5zVyJD4kOqjzAS8ivgqfX5ZA4lMIVWD8 4oE4l654QLek70yJqJyoY0hEtWyFTnEeiA== X-Received: by 2002:ac2:55b7:: with SMTP id y23mr11944540lfg.40.1623107095537; Mon, 07 Jun 2021 16:04:55 -0700 (PDT) Received: from localhost.localdomain (84-217-56-54.customers.ownit.se. [84.217.56.54]) by smtp.gmail.com with ESMTPSA id v9sm1999563ljv.131.2021.06.07.16.04.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Jun 2021 16:04:55 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Tue, 8 Jun 2021 01:04:10 +0200 Message-Id: <20210607230414.612-32-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20210607230414.612-1-dcnieho@gmail.com> References: <20210607230414.612-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 31/35] avformat: add avformat_alloc_input_context() 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: Diederick Niehorster Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: fG300/WUobsE avformat_alloc_input_context function analogous to avformat_alloc_output_context2, except that it does not take a filename argument as guessing the format by just the filename does not make sense. avformat_alloc_input_context can be used e.g. with the avdevice capabilities API, which needs an allocated input format with priv_data (and default options) set, but device should not be opened. Added some checks to avformat_open_input, for the that AVFormatContext* allocated by avformat_alloc_input_context is provided: 1. if avformat_open_input's AVInputFormat *fmt argument is not NULL, clean up any already set s->iformat 2. if s->url is already set and avformat_open_input's filename argument is not NULL, free current url and replace by provided filename 3. if s->url is already set and avformat_open_input's filename argument is NULL, do not set s->url to "", but keep current url 4. if s->priv_data has already been allocated, do not do so again. Signed-off-by: Diederick Niehorster --- libavformat/avformat.h | 20 +++++++++++++ libavformat/utils.c | 66 +++++++++++++++++++++++++++++++++++++++--- libavformat/version.h | 2 +- 3 files changed, 83 insertions(+), 5 deletions(-) diff --git a/libavformat/avformat.h b/libavformat/avformat.h index 5e1e82a315..b444602b86 100644 --- a/libavformat/avformat.h +++ b/libavformat/avformat.h @@ -1896,6 +1896,26 @@ AVProgram *av_new_program(AVFormatContext *s, int id); * @} */ + /** + * Allocate an AVFormatContext for an input format. + * avformat_free_context() can be used to free the context and + * everything allocated by the framework within it. NB: in general + * the correct format cannot be known (unless the user has extra + * information) until the file is opened. If forcing a format by + * this method, but it turns out not to match the file's format + * upon avformat_open_input(), the latter will throw an error. + * + * @param *ctx is set to the created format context, or to NULL in + * case of failure + * @param iformat format to use for allocating the context, if NULL + * format_name is used instead + * @param format_name the name of input format to use for allocating the + * context + * @return >= 0 in case of success, a negative AVERROR code in case of + * failure + */ +int avformat_alloc_input_context(AVFormatContext** ctx, const AVInputFormat* iformat, + const char* format_name); /** * Allocate an AVFormatContext for an output format. diff --git a/libavformat/utils.c b/libavformat/utils.c index fe8eaa6cb3..2e8084a41b 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -478,6 +478,56 @@ static int update_stream_avctx(AVFormatContext *s) } +int avformat_alloc_input_context(AVFormatContext** avctx, const AVInputFormat* iformat, + const char* format) +{ + AVFormatContext* s = avformat_alloc_context(); + int ret = 0; + + *avctx = NULL; + if (!s) + goto nomem; + + if (!iformat) { + if (format) { + iformat = av_find_input_format(format); + if (!iformat) { + av_log(s, AV_LOG_ERROR, "Requested input format '%s' not found\n", format); + ret = AVERROR(EINVAL); + goto error; + } + } + else { + av_log(s, AV_LOG_ERROR, "You should provide an input format or the name of an input format when calling this function\n"); + ret = AVERROR(EINVAL); + goto error; + } + } + + s->iformat = iformat; + if (s->iformat->priv_data_size > 0) { + s->priv_data = av_mallocz(s->iformat->priv_data_size); + if (!s->priv_data) + goto nomem; + if (s->iformat->priv_class) { + *(const AVClass**)s->priv_data = s->iformat->priv_class; + av_opt_set_defaults(s->priv_data); + } + } + else + s->priv_data = NULL; + + *avctx = s; + return 0; +nomem: + av_log(s, AV_LOG_ERROR, "Out of memory\n"); + ret = AVERROR(ENOMEM); +error: + avformat_free_context(s); + return ret; +} + + int avformat_open_input(AVFormatContext **ps, const char *filename, const AVInputFormat *fmt, AVDictionary **options) { @@ -492,8 +542,14 @@ int avformat_open_input(AVFormatContext **ps, const char *filename, av_log(NULL, AV_LOG_ERROR, "Input context has not been properly allocated by avformat_alloc_context() and is not NULL either\n"); return AVERROR(EINVAL); } - if (fmt) + if (fmt) { + if (s->iformat) { + if (s->iformat->priv_class && s->priv_data) + av_opt_free(s->priv_data); + av_freep(&s->priv_data); + } s->iformat = fmt; + } if (options) av_dict_copy(&tmp, *options, 0); @@ -504,7 +560,9 @@ int avformat_open_input(AVFormatContext **ps, const char *filename, if ((ret = av_opt_set_dict(s, &tmp)) < 0) goto fail; - if (!(s->url = av_strdup(filename ? filename : ""))) { + if (filename && s->url) + av_freep(&s->url); + if (!s->url && !(s->url = av_strdup(filename ? filename : ""))) { ret = AVERROR(ENOMEM); goto fail; } @@ -547,8 +605,8 @@ int avformat_open_input(AVFormatContext **ps, const char *filename, s->duration = s->start_time = AV_NOPTS_VALUE; - /* Allocate private data. */ - if (s->iformat->priv_data_size > 0) { + /* Allocate private data if not already allocated. */ + if (s->iformat->priv_data_size > 0 && !s->priv_data) { if (!(s->priv_data = av_mallocz(s->iformat->priv_data_size))) { ret = AVERROR(ENOMEM); goto fail; diff --git a/libavformat/version.h b/libavformat/version.h index 13df244d97..d5dd22059b 100644 --- a/libavformat/version.h +++ b/libavformat/version.h @@ -32,7 +32,7 @@ // Major bumping may affect Ticket5467, 5421, 5451(compatibility with Chromium) // Also please add any ticket numbers that you believe might be affected here #define LIBAVFORMAT_VERSION_MAJOR 59 -#define LIBAVFORMAT_VERSION_MINOR 5 +#define LIBAVFORMAT_VERSION_MINOR 6 #define LIBAVFORMAT_VERSION_MICRO 100 #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ From patchwork Mon Jun 7 23:04:11 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Diederick C. Niehorster" X-Patchwork-Id: 28130 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:b214:0:0:0:0:0 with SMTP id b20csp3887494iof; Mon, 7 Jun 2021 16:07:15 -0700 (PDT) X-Google-Smtp-Source: ABdhPJz+5WntB3oqOhct58xa2LpboSBAPTC6dTwdw+g7aclukpQqKH7sIHqEE9kxabi6JJwd0Hct X-Received: by 2002:a17:906:4111:: with SMTP id j17mr19836775ejk.488.1623107235176; Mon, 07 Jun 2021 16:07:15 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1623107235; cv=none; d=google.com; s=arc-20160816; b=qGZT1TTofyRJLUd0kFavjKf62vWuVDsoROjc4a5vRo8OZLhkBH0ZNeD5DSy486HTsu nz29YP1bbe3vSzV19x0sMSz+twDJKstFeiw0XUrVWhRNZ9vUbiA0AIbon3bL+PsuaOoG BrpksfDZalP8PxVqoKUNetmW8qUurP9ictRaPE2YgBS8LWEYzBBceBO6qPxkouYch0h2 hf5vZEoaR5N/Vd0sZt20isahIH6c1Dx1mgZ925CVFNeb+DVj6lMC+JzYwWQFXAhp3xav Q7K8LGEYT02Zj1IxyP8iQxKBiGjp0HQmazMBKiCTck2DArZ1eOO6IyyiMCkWatPzVfRB XVCQ== 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=x89Go4lf0EsXpvlwS24RYOya//t8OGx5capR0YoJVEg=; b=bDU3AKLcrtEH3u8KNfseaRa/PZhOBG02AAA6/xSU4XFMf5+vLnD506aI/M0E2rQ5t+ fVRBJidkeCj1O0uGQgUgwJGEFE00hBMu2fX1C4+XQtMDbGoQpTvRPUHm5ERp9xTPRPyE ylUC0sJdX1xlWycEF/jsFZO5vqkfzKCxESnDEQfardjjTBV0mci96gM7XxZhgVAT/Twe i5CwtOrAYEobeWYn3spBUf3ikJS/nnqkpFmg23hHYyo7sYZIQkuhT8wc+HwsM71H/nmm gOK98DzzonIVd9yCyMO32ULyHJhW6+Z5IpIcIrLa0/0BY/oiSbDDpDoDohX1mSqpyhUa VolA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=DVbLeirc; 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 b11si13279016ejl.253.2021.06.07.16.07.14; Mon, 07 Jun 2021 16:07:15 -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=20161025 header.b=DVbLeirc; 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 C754968806D; Tue, 8 Jun 2021 02:05:01 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lf1-f54.google.com (mail-lf1-f54.google.com [209.85.167.54]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id D3D42687FB2 for ; Tue, 8 Jun 2021 02:04:57 +0300 (EEST) Received: by mail-lf1-f54.google.com with SMTP id p17so28210221lfc.6 for ; Mon, 07 Jun 2021 16:04:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=zdBo2j68x0AXRtlcLkP3QlNN4PLChZM62tX1gLgkF84=; b=DVbLeircXaT8fQhFSiZYHgFtEZw2q80cz1Sq1bG7bzNbVvlz/vhCsKfu6pR6GGODN7 edO6g6iEp24Pb4pR3b4R74UkIme3WMb3xuQB6bT9D2MIwBXWGMiuhosbejy8LcF9I+ub ZxzafIiQNgNgNJhDqAGO79Y4qsyKkFufkhGb7Q4rzwCg7O9qMEjEbFm+sxpzBSRcvCea CCeRw1YH17hw9nf7QdKP+cIcBR1Q+798D5RzN63UcX+TVdouqUJFxh7uojdHTc42Fb5M +cFG8nNRUMkJxKwUBoZ+ocvsC5ONj+qKZk0cv7UAfeIgG1qpdENKoOw4gXEymh6Wm9NL zNuw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=zdBo2j68x0AXRtlcLkP3QlNN4PLChZM62tX1gLgkF84=; b=TewhU02C1D8C1dwY4q4KtVeitGXkCItUWK+uvI/QXoReFQQNju4xHUWEekDHksEiJd M5SUn26oNvMrMFVPGYvsec7ExmDPJQVb38rs7QG6YlrAHK7sdHojmZ6O6Ka01nryrRMq WoQnkUugaqpT+y2/9Jevcu48x6pIc3SNL2a1NImEUQcmoj0hsjiJ1Ye50TR5j0Brs6VV ikh1keRTbKf/ondQlw6CJdTqfyAfg+DQZcDgtEk60U3a3BkmE9Bu+oym9TXWFBfcEh31 24UCv0WEcRwDKpIeNQw3Bw4VQU7alf5ngpqkb/l1X63QEXtPuXyEkRB5HAeUxamjytL/ A9xQ== X-Gm-Message-State: AOAM530NeQOWieb11wtPRNuSiDAvCbiQ0WR4Aqf7YuY0U90XzbmlXB8G wikwzj7EaFHBYpo3gFVwdPZAECgFSKqT3Q== X-Received: by 2002:a05:6512:ac9:: with SMTP id n9mr13235641lfu.235.1623107096613; Mon, 07 Jun 2021 16:04:56 -0700 (PDT) Received: from localhost.localdomain (84-217-56-54.customers.ownit.se. [84.217.56.54]) by smtp.gmail.com with ESMTPSA id v9sm1999563ljv.131.2021.06.07.16.04.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Jun 2021 16:04:55 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Tue, 8 Jun 2021 01:04:11 +0200 Message-Id: <20210607230414.612-33-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20210607230414.612-1-dcnieho@gmail.com> References: <20210607230414.612-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 32/35] examples: adding device_get_capabilities example 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: Diederick Niehorster Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: jzxy10m8Pwqd Signed-off-by: Diederick Niehorster --- configure | 2 + doc/examples/.gitignore | 1 + doc/examples/Makefile | 1 + doc/examples/Makefile.example | 1 + doc/examples/device_get_capabilities.c | 192 +++++++++++++++++++++++++ 5 files changed, 197 insertions(+) create mode 100644 doc/examples/device_get_capabilities.c diff --git a/configure b/configure index 6bfd98b384..31b1790c8d 100755 --- a/configure +++ b/configure @@ -1705,6 +1705,7 @@ EXAMPLE_LIST=" decode_audio_example decode_video_example demuxing_decoding_example + device_get_capabilities_example encode_audio_example encode_video_example extract_mvs_example @@ -3712,6 +3713,7 @@ avio_reading_deps="avformat avcodec avutil" decode_audio_example_deps="avcodec avutil" decode_video_example_deps="avcodec avutil" demuxing_decoding_example_deps="avcodec avformat avutil" +device_get_capabilities_example_deps="avdevice avformat avutil" encode_audio_example_deps="avcodec avutil" encode_video_example_deps="avcodec avutil" extract_mvs_example_deps="avcodec avformat avutil" diff --git a/doc/examples/.gitignore b/doc/examples/.gitignore index 44960e1de7..256f33a600 100644 --- a/doc/examples/.gitignore +++ b/doc/examples/.gitignore @@ -3,6 +3,7 @@ /decode_audio /decode_video /demuxing_decoding +/device_get_capabilities /encode_audio /encode_video /extract_mvs diff --git a/doc/examples/Makefile b/doc/examples/Makefile index 81bfd34d5d..de707bb3ca 100644 --- a/doc/examples/Makefile +++ b/doc/examples/Makefile @@ -3,6 +3,7 @@ EXAMPLES-$(CONFIG_AVIO_READING_EXAMPLE) += avio_reading EXAMPLES-$(CONFIG_DECODE_AUDIO_EXAMPLE) += decode_audio EXAMPLES-$(CONFIG_DECODE_VIDEO_EXAMPLE) += decode_video EXAMPLES-$(CONFIG_DEMUXING_DECODING_EXAMPLE) += demuxing_decoding +EXAMPLES-$(CONFIG_DEVICE_GET_CAPABILITIES_EXAMPLE) += device_get_capabilities EXAMPLES-$(CONFIG_ENCODE_AUDIO_EXAMPLE) += encode_audio EXAMPLES-$(CONFIG_ENCODE_VIDEO_EXAMPLE) += encode_video EXAMPLES-$(CONFIG_EXTRACT_MVS_EXAMPLE) += extract_mvs diff --git a/doc/examples/Makefile.example b/doc/examples/Makefile.example index a232d97f98..b861b9cc74 100644 --- a/doc/examples/Makefile.example +++ b/doc/examples/Makefile.example @@ -16,6 +16,7 @@ EXAMPLES= avio_list_dir \ decode_audio \ decode_video \ demuxing_decoding \ + device_get_capabilities \ encode_audio \ encode_video \ extract_mvs \ diff --git a/doc/examples/device_get_capabilities.c b/doc/examples/device_get_capabilities.c new file mode 100644 index 0000000000..f5909aaa0b --- /dev/null +++ b/doc/examples/device_get_capabilities.c @@ -0,0 +1,192 @@ +/* + * Copyright (c) 2021 Diederick Niehorster + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +/** + * @file + * avdevice getting capabilities example. + * + * Shows how to use the avdevice capabilities API to probe + * device capabilities (supported codecs, pixel formats, sample + * formats, resolutions, channel counts, etc) + * @example device_get_capabilities.c + */ + +#include +#include +#include +#include + +void print_option_ranges(enum AVOptionType type, AVOptionRanges* ranges) +{ + for (int range_index = 0; range_index < ranges->nb_ranges; range_index++) { + for (int component_index = 0; component_index < ranges->nb_components; component_index++) + { + AVOptionRange* range = ranges->range[ranges->nb_ranges * component_index + range_index]; + if (component_index > 0) + printf(", "); + printf("%s: ", range->str); + if (!range->is_set) + { + printf(""); + } + else { + uint8_t* buf; + if (av_opt_to_string(range->value_min, type, &buf) < 0) + // fallback to just printing value + printf("%.2f", range->value_min); + else { + printf("%s", (const char*)buf); + av_freep(&buf); + } + if (range->is_range) { + if (av_opt_to_string(range->value_max, type, &buf) < 0) + // fallback to just printing value + printf(" -- %.2f", range->value_max); + else { + printf(" -- %s", (const char*)buf); + av_freep(&buf); + } + } + } + } + printf("\n"); + } +} + + + +int main (int argc, char **argv) +{ + int ret = 0; + const char* device_name = NULL; + const char* input_name = NULL; + const char* query_cap = NULL; + const char* set_cap_name = NULL; + const char* set_cap_value = NULL; + + const AVInputFormat* fmt = NULL; + AVFormatContext* fmt_ctx = NULL; + void* caps = NULL; + AVOptionRanges* ranges = NULL; + AVDictionary* options = NULL; + const AVOption* opt = NULL; + + if (argc != 6) { + fprintf(stderr, "usage: %s device_name input_name query_cap set_cap_name set_cap_value\n" + "API example program to show how to use the avdevice\n" + "capabilities API to probe device capabilities \n" + "(supported codecs, pixel formats, sample formats,\n" + "resolutions, channel counts, etc).\n\n" + "example invocation: " + "%s dshow video=\"Integrated Webcam\" frame_size pixel_format yuyv422", + argv[0], argv[0]); + exit(1); + } + device_name = argv[1]; + input_name = argv[2]; + query_cap = argv[3]; + set_cap_name = argv[4]; + set_cap_value = argv[5]; + + // make sure avdevices can be found among input and output formats + avdevice_register_all(); + // find specified device + fmt = av_find_input_format(device_name); + if (!fmt) { + fprintf(stderr, "Could not find the device '%s'\n",device_name); + ret = AVERROR(EINVAL); + goto end; + } + + // prepare device format context, and set device to query, + ret = avformat_alloc_input_context(&fmt_ctx, fmt, NULL); + if (ret < 0) { + fprintf(stderr, "Cannot allocate input format context\n"); + goto end; + } + fmt_ctx->url = av_strdup("video=Integrated Webcam:audio=OBS-Audio"); + + // prepare query object, setting device options (if any) + ret = avdevice_capabilities_create(&caps, fmt_ctx, &options); + if (ret < 0) { + fprintf(stderr, "avdevice_capabilities_create() failed\n"); + goto end; + } + + // check capability to query, and get info about the return type + opt = av_opt_find(caps, query_cap, NULL, 0, 0); + if (!opt) { + fprintf(stderr, "Capability '%s' you wish to query is not available\n", query_cap); + ret = AVERROR_OPTION_NOT_FOUND; + goto end; + } + + // query the capability without any filter set + ret = av_opt_query_ranges(&ranges, caps, opt->name, AV_OPT_MULTI_COMPONENT_RANGE); + if (ret < 0) { + fprintf(stderr, "av_opt_query_ranges() failed\n"); + goto end; + } + + // print results + print_option_ranges(opt->type, ranges); + av_opt_freep_ranges(&ranges); + + printf("=============\n"); + + // set one capability, which may filter out some returned capabilities + // (or all, if set to an invalid value) + ret = av_opt_set(caps, set_cap_name, set_cap_value, 0); + if (ret < 0) { + fprintf(stderr, "av_opt_set() failed\n"); + goto end; + } + + // query again + ret = av_opt_query_ranges(&ranges, caps, opt->name, AV_OPT_MULTI_COMPONENT_RANGE); + if (ret < 0) { + fprintf(stderr, "av_opt_query_ranges() failed\n"); + goto end; + } + + // print results + print_option_ranges(opt->type, ranges); + + +end: + if (ranges) + av_opt_freep_ranges(&ranges); + if (caps) + avdevice_capabilities_free(&caps, fmt_ctx); + + if (fmt_ctx) + avformat_free_context(fmt_ctx); + + if (ret < 0) { + char a[AV_ERROR_MAX_STRING_SIZE] = { 0 }; + av_make_error_string(a, AV_ERROR_MAX_STRING_SIZE, ret); + + printf("Error: %s\n", a); + } + + return ret < 0; +} From patchwork Mon Jun 7 23:04:12 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Diederick C. Niehorster" X-Patchwork-Id: 28141 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:b214:0:0:0:0:0 with SMTP id b20csp3887607iof; Mon, 7 Jun 2021 16:07:24 -0700 (PDT) X-Google-Smtp-Source: ABdhPJypBUuBW7ijEzq7i5LJ8vyuSDKPUnkR3qiOL7mocvTc48UrUCBw00TtrkcUhFPphm66mVss X-Received: by 2002:a17:907:7b9e:: with SMTP id ne30mr20335923ejc.389.1623107244081; Mon, 07 Jun 2021 16:07:24 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1623107244; cv=none; d=google.com; s=arc-20160816; b=lyw7WRCiO4VeBJW/wtMFePC4NClXTASTxyUAlqBIEpOkrQjLF0eKtA/ZeeTcCn+Rm6 zSsofj7Bint6zIYkIoQGSEwwbFQE+YHz9EJ2k7fv/f42neb81VrJovaK2K6p/ylaZiDV SOlzhBFc4JKPMT37d9A+ag9xQ4EPbj+phDaIPxj9q6SXtCJ+S0QlS6u37wMSMbI0pY/n pP3dokAWAALet/Qyn/qoVBl0bOMrp4+gfEtrVqCrF8bWvBBNMjk6rbMNzzStnwH0CDI4 KDEbdTQbkutIRestNYPBKzyTgG5Yyi6HP+UsML/YHzICU1W+YSnJAuODALDdI/B9v1VQ 1/Bg== 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=IrDst6eY/FmevbXjerxXr42ZZQbWVKkW3PHdSFdvq54=; b=lqLA29uFTOOPNeUqE8sOGSAKQNWS00oThSH8hYPyvGJBs+dL0GRH+evuTJwpe9QHGG vmvx2A8NDyGw2U4yNBt2bHWWJfvXXr2uqSNCXsRi2lZFkjvrzu0JsT2bisnLywYF50zu uf4Xe6XFUm/PDLietMtlcGDft8yvsu5usLAkQYlyjqAailk9oUY/hmkrSDdtY0g2gT/c 4PS3S7rWC9d/kegNXoBawaTpbJwMs5UGZkaeVx4Bn0T+VINa0CJdYeWariUwu1GwTPkm 9yxYJ4QbuLntLXj0lWZ8S6lipphLWOW0xCqYaRR20SdPShwTaoAs/gIh+e2wcpinoYgP djiw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=naCdbezm; 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 n13si12476637ejh.510.2021.06.07.16.07.23; Mon, 07 Jun 2021 16:07:24 -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=20161025 header.b=naCdbezm; 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 A973B6880AF; Tue, 8 Jun 2021 02:05:02 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lf1-f54.google.com (mail-lf1-f54.google.com [209.85.167.54]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 57227687FB2 for ; Tue, 8 Jun 2021 02:04:58 +0300 (EEST) Received: by mail-lf1-f54.google.com with SMTP id t7so21898199lff.0 for ; Mon, 07 Jun 2021 16:04:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=qRgAhwEaIAPRZtmx9B1/sp/bKAQK+XSNSi8QFTYYZ28=; b=naCdbezmkqVwCXehCXNOs5looavWPggEx015G4DOOFCE6zARXnWrZ88f0AJiWG09nw 9BOm1MQH3f1BzSjKDlSQ9GiVH6ZMec8r2ZYJGHyc/lMVo7B2PFweaKQnIUwId18AhiHC K2RM6aBWR4iD+uzA8hT9yUMw3f+vX0x0QxXOVZRosLuN3M3oEMStJS7wF6OuBSyZ/ROd r6fH8g/UXM23CEZayHeNgpoQdhPGCFv6KKDUNNnmJ2dkMfL94aoBQ6IVWBkYnhEzAVkQ ovmug9ZLfd+4aFRB7ddmnwFWUuzitVLh8IGHZJ2BogiS0pGKG184BWVHtM0FLUpDhx7p mVjA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=qRgAhwEaIAPRZtmx9B1/sp/bKAQK+XSNSi8QFTYYZ28=; b=iztn5oFYka6R1GKlbY6daPPfVGnbAIfSat46huaQcz1Pvkm3DuKD2SB4K5aD1ulT+I 9y6TKkOk6MxbN4g1gwfnYkOv0kU1wanJZ9crhcqYkawP9fvtarfLq6da5mMVnNlD83pp XGPkTnVD0ixl7kBEcqDCGDOj8wYPevrgdGLCvHPmdjt7JTTp5OojcmiL4YawMycS1G0L KUIWhLLTAlInTM21x6WUmfRMiTBoDY2jMyRjMCmfkBr0N+pk3kzwy/2nxJs21ebjJEN5 /Tkksc0d/gWsqJwSVatCL2LZGgEkDam+YmHsnMQaURVKfHLH28ZeAIwsIfm35Z7+CF6p AgYQ== X-Gm-Message-State: AOAM531yAxL5n6JnuhnSI3LJIuqjYZz+x9Sis0dBawGFsCd2dQUlES+a 7NxkVpi2k2RGvO7XDFwt2roviv/dLoKGOw== X-Received: by 2002:a05:6512:3e28:: with SMTP id i40mr1736243lfv.470.1623107097471; Mon, 07 Jun 2021 16:04:57 -0700 (PDT) Received: from localhost.localdomain (84-217-56-54.customers.ownit.se. [84.217.56.54]) by smtp.gmail.com with ESMTPSA id v9sm1999563ljv.131.2021.06.07.16.04.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Jun 2021 16:04:57 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Tue, 8 Jun 2021 01:04:12 +0200 Message-Id: <20210607230414.612-34-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20210607230414.612-1-dcnieho@gmail.com> References: <20210607230414.612-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 33/35] Makefile/examples: cosmetics 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: Diederick Niehorster Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: kwyGojOLEQht Signed-off-by: Diederick Niehorster --- doc/examples/Makefile | 48 +++++++++++++++++++++---------------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/doc/examples/Makefile b/doc/examples/Makefile index de707bb3ca..7988ed4226 100644 --- a/doc/examples/Makefile +++ b/doc/examples/Makefile @@ -1,27 +1,27 @@ -EXAMPLES-$(CONFIG_AVIO_LIST_DIR_EXAMPLE) += avio_list_dir -EXAMPLES-$(CONFIG_AVIO_READING_EXAMPLE) += avio_reading -EXAMPLES-$(CONFIG_DECODE_AUDIO_EXAMPLE) += decode_audio -EXAMPLES-$(CONFIG_DECODE_VIDEO_EXAMPLE) += decode_video -EXAMPLES-$(CONFIG_DEMUXING_DECODING_EXAMPLE) += demuxing_decoding -EXAMPLES-$(CONFIG_DEVICE_GET_CAPABILITIES_EXAMPLE) += device_get_capabilities -EXAMPLES-$(CONFIG_ENCODE_AUDIO_EXAMPLE) += encode_audio -EXAMPLES-$(CONFIG_ENCODE_VIDEO_EXAMPLE) += encode_video -EXAMPLES-$(CONFIG_EXTRACT_MVS_EXAMPLE) += extract_mvs -EXAMPLES-$(CONFIG_FILTER_AUDIO_EXAMPLE) += filter_audio -EXAMPLES-$(CONFIG_FILTERING_AUDIO_EXAMPLE) += filtering_audio -EXAMPLES-$(CONFIG_FILTERING_VIDEO_EXAMPLE) += filtering_video -EXAMPLES-$(CONFIG_HTTP_MULTICLIENT_EXAMPLE) += http_multiclient -EXAMPLES-$(CONFIG_HW_DECODE_EXAMPLE) += hw_decode -EXAMPLES-$(CONFIG_METADATA_EXAMPLE) += metadata -EXAMPLES-$(CONFIG_MUXING_EXAMPLE) += muxing -EXAMPLES-$(CONFIG_QSVDEC_EXAMPLE) += qsvdec -EXAMPLES-$(CONFIG_REMUXING_EXAMPLE) += remuxing -EXAMPLES-$(CONFIG_RESAMPLING_AUDIO_EXAMPLE) += resampling_audio -EXAMPLES-$(CONFIG_SCALING_VIDEO_EXAMPLE) += scaling_video -EXAMPLES-$(CONFIG_TRANSCODE_AAC_EXAMPLE) += transcode_aac -EXAMPLES-$(CONFIG_TRANSCODING_EXAMPLE) += transcoding -EXAMPLES-$(CONFIG_VAAPI_ENCODE_EXAMPLE) += vaapi_encode -EXAMPLES-$(CONFIG_VAAPI_TRANSCODE_EXAMPLE) += vaapi_transcode +EXAMPLES-$(CONFIG_AVIO_LIST_DIR_EXAMPLE) += avio_list_dir +EXAMPLES-$(CONFIG_AVIO_READING_EXAMPLE) += avio_reading +EXAMPLES-$(CONFIG_DECODE_AUDIO_EXAMPLE) += decode_audio +EXAMPLES-$(CONFIG_DECODE_VIDEO_EXAMPLE) += decode_video +EXAMPLES-$(CONFIG_DEMUXING_DECODING_EXAMPLE) += demuxing_decoding +EXAMPLES-$(CONFIG_DEVICE_GET_CAPABILITIES_EXAMPLE) += device_get_capabilities +EXAMPLES-$(CONFIG_ENCODE_AUDIO_EXAMPLE) += encode_audio +EXAMPLES-$(CONFIG_ENCODE_VIDEO_EXAMPLE) += encode_video +EXAMPLES-$(CONFIG_EXTRACT_MVS_EXAMPLE) += extract_mvs +EXAMPLES-$(CONFIG_FILTER_AUDIO_EXAMPLE) += filter_audio +EXAMPLES-$(CONFIG_FILTERING_AUDIO_EXAMPLE) += filtering_audio +EXAMPLES-$(CONFIG_FILTERING_VIDEO_EXAMPLE) += filtering_video +EXAMPLES-$(CONFIG_HTTP_MULTICLIENT_EXAMPLE) += http_multiclient +EXAMPLES-$(CONFIG_HW_DECODE_EXAMPLE) += hw_decode +EXAMPLES-$(CONFIG_METADATA_EXAMPLE) += metadata +EXAMPLES-$(CONFIG_MUXING_EXAMPLE) += muxing +EXAMPLES-$(CONFIG_QSVDEC_EXAMPLE) += qsvdec +EXAMPLES-$(CONFIG_REMUXING_EXAMPLE) += remuxing +EXAMPLES-$(CONFIG_RESAMPLING_AUDIO_EXAMPLE) += resampling_audio +EXAMPLES-$(CONFIG_SCALING_VIDEO_EXAMPLE) += scaling_video +EXAMPLES-$(CONFIG_TRANSCODE_AAC_EXAMPLE) += transcode_aac +EXAMPLES-$(CONFIG_TRANSCODING_EXAMPLE) += transcoding +EXAMPLES-$(CONFIG_VAAPI_ENCODE_EXAMPLE) += vaapi_encode +EXAMPLES-$(CONFIG_VAAPI_TRANSCODE_EXAMPLE) += vaapi_transcode EXAMPLES := $(EXAMPLES-yes:%=doc/examples/%$(PROGSSUF)$(EXESUF)) EXAMPLES_G := $(EXAMPLES-yes:%=doc/examples/%$(PROGSSUF)_g$(EXESUF)) From patchwork Mon Jun 7 23:04:13 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Diederick C. Niehorster" X-Patchwork-Id: 28140 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:b214:0:0:0:0:0 with SMTP id b20csp3887718iof; Mon, 7 Jun 2021 16:07:33 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyhWeKeO0/vvvhilVsWiECJIkuegK+HsWtjAQ1sHUH2TaVAbtzctyoCGDDw964ZXAhVeRIm X-Received: by 2002:aa7:d5d6:: with SMTP id d22mr22239557eds.302.1623107253558; Mon, 07 Jun 2021 16:07:33 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1623107253; cv=none; d=google.com; s=arc-20160816; b=Hkp5NfWSjBQoD/ltPdiOPXVsZI/gh7UrCmwZ2nxpkqwab2Sm9y5QNEOmIpr7zNjrJl hvs47VrhuTtt1hPAjUX3FU1MGntJUZRwNNKpqFypbGV3jcF6uZ/VmukkS9h0lvRyTaJT D885O0/UjAvUiwolI/ZC1Oo2L8QR8h3HC3ax1bUsuLXO8kDv/X9IvvbbLq+snPGXov5r Zf3IL09/8jbqnhD6K2exhnBy5OKOsSe86yYKjk4V4jkO8GrEbghDnxy9jm7MdYia43uj BE1NOdFDHL0jZvsrRWbDdxzzBP/igqMdZjs1Lw4WSk3FdQBZ0Dwvg1LLhbpEQuViYQa+ 8bww== 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=dOV9fN6ZMF+6WHU3EeUtuS+ARRe7UP4KrjIw7eFWUk4=; b=q6MvE9hAQS/y/d+HBpVz4gShD/Vl8Ktd0VRw8bKF4Mj5/c7m7aO1TdPcacPp64QBm1 goJ3gGF6MtmmVJrKLRVk5pEF1znc4rNGurHeZ7fwnESw9QMA7D90JhZwRwFd0pq5GgSD IJ3duGVQj1F45A++yWI5Ae5501V1lS9GbDobdSD5sSsVeyqbWFbaie5cGtlhLSch7MJL Y+bfd6lQMWX9MGigfXCkRwqb9J7DzUDLFfWSxBGEGz+/XpDy8b2I6cvfh9b6UrPitZ7e Zb2pzzPbgfYFl9yUZa54eTORoApZ8SgRfaBUWfQJjgQt6nguhWhacrogXs5ZA6eL+Hh+ rb8A== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=BqiXqEEg; 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 j5si6496165ejj.184.2021.06.07.16.07.32; Mon, 07 Jun 2021 16:07:33 -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=20161025 header.b=BqiXqEEg; 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 7C0C3688115; Tue, 8 Jun 2021 02:05:03 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lf1-f50.google.com (mail-lf1-f50.google.com [209.85.167.50]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 57DB3687FFE for ; Tue, 8 Jun 2021 02:04:59 +0300 (EEST) Received: by mail-lf1-f50.google.com with SMTP id w33so29021217lfu.7 for ; Mon, 07 Jun 2021 16:04:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=0IwTtKkxgdS0nvnjOpfSRmxRTQwAlAfg2KTd0EUpX08=; b=BqiXqEEgpk+h6ldThEOCjAoc8IFjCRP8LRkMWXDlz9eFEQXLA0VvScDNyp2Q8bXNrv +cOr4wRzqLRWWt9Z2DPhR+K5JSn5ZLLVWBoCXgxXqwpl0h9duQULgRSRV4kZAY4nwroP VQAQJGFW0WXptuN3+fNTyNM7kKiC03mNX4B74h0+xNwHfjBX4nWkaw2o5vfVXfXzRNsw pHtJzYWBYHv5ZkiL7wa88yc9DSB4hzl/TKRdSG6xZ60I92oKFADtylgUVC6NsOuCAFTc 4wy6y/B4nZrVaQwwIw176+3JvneSXVaLV5rBVNM14YlOSjylHc63J4GChkEMfPVeA4/k NRPQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=0IwTtKkxgdS0nvnjOpfSRmxRTQwAlAfg2KTd0EUpX08=; b=SasIKgb6FAkiP/SPjj9qDTUMDHzCFBQVvPlqQ3Ths0WjHQ2VydtxuHHCYlJFAaimyX 3Rd2AyE21PzCVkY3AbZ9KnL0JNZPgnOW+V5JgXImY3R7gDco7xdWRpSx27naxIubdo3j KUQZGmlRuZRSmL6qSY3JfYLH62z0Tp4Yac7es0wh2NQASqKs3aXb9Ezi0v83YRLBhTTo QsoWlhxdRj0np+eFj522XBZS+yJgUNQy6Q6Y8nw8rsfAFwtFp+JJ4E7pZjodyqj9GMaJ k5Y1Vm0vckv9nFL6n7aqfneLlCmGlt3yQ0lZuJyhzuFjinuYOgyox28rG2fEsxHUo+XY E9Lg== X-Gm-Message-State: AOAM530imJIYOsfQ8M4eA4QSI/LP7oMG5keVyZWn/aknaAn78oQXn6dy GrNLSxw5V8m1aJr0nFnMu6SzS3e3RCdH4w== X-Received: by 2002:a05:6512:1693:: with SMTP id bu19mr11537890lfb.569.1623107098354; Mon, 07 Jun 2021 16:04:58 -0700 (PDT) Received: from localhost.localdomain (84-217-56-54.customers.ownit.se. [84.217.56.54]) by smtp.gmail.com with ESMTPSA id v9sm1999563ljv.131.2021.06.07.16.04.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Jun 2021 16:04:57 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Tue, 8 Jun 2021 01:04:13 +0200 Message-Id: <20210607230414.612-35-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20210607230414.612-1-dcnieho@gmail.com> References: <20210607230414.612-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 34/35] avdevice/dshow: prevent NULL access 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: Diederick Niehorster Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: 6KQ15r0m25oz list_options true would crash when both a video and an audio device were specified as input. Crash would occur on line 1618 (in this new rev) because ctx->device_unique_name[otherDevType] would be NULL Signed-off-by: Diederick Niehorster --- libavdevice/dshow.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/libavdevice/dshow.c b/libavdevice/dshow.c index c158a536d8..9af3360317 100644 --- a/libavdevice/dshow.c +++ b/libavdevice/dshow.c @@ -1503,9 +1503,9 @@ dshow_list_device_options(AVFormatContext *avctx, ICreateDevEnum *devenum, if ((r = dshow_cycle_devices(avctx, devenum, devtype, sourcetype, &device_filter, &device_unique_name, NULL)) < 0) return r; ctx->device_filter[devtype] = device_filter; + ctx->device_unique_name[devtype] = device_unique_name; if ((r = dshow_cycle_pins(avctx, devtype, sourcetype, device_filter, ranges ? &device_pin : NULL, ranges, query_type)) < 0) return r; - av_freep(&device_unique_name); return 0; } @@ -1565,7 +1565,8 @@ dshow_open_device(AVFormatContext *avctx, ICreateDevEnum *devenum, goto error; } } - if (ctx->device_filter[otherDevType]) { + + if (ctx->device_filter[otherDevType]) { // avoid adding add two instances of the same device to the graph, one for video, one for audio // a few devices don't support this (could also do this check earlier to avoid double crossbars, etc. but they seem OK) if (strcmp(device_filter_unique_name, ctx->device_unique_name[otherDevType]) == 0) { @@ -2027,6 +2028,7 @@ static int dshow_read_header(AVFormatContext *avctx) } } } + // don't exit yet, allow it to list crossbar options in dshow_open_device } ctx->is_running = 0; if (ctx->device_name[VideoDevice]) { From patchwork Mon Jun 7 23:04:14 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Diederick C. Niehorster" X-Patchwork-Id: 28146 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:b214:0:0:0:0:0 with SMTP id b20csp3887832iof; Mon, 7 Jun 2021 16:07:42 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzc66o2g0dVGhPa74q/In5pd7ZEyn0zdbNHkBvGJIf9vRk4hlELUDe7vbrWG2/6A/LoDx1A X-Received: by 2002:a05:6402:4cf:: with SMTP id n15mr23150597edw.162.1623107262553; Mon, 07 Jun 2021 16:07:42 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1623107262; cv=none; d=google.com; s=arc-20160816; b=s38y/uHOHKcZbXm7q3XWQCXH9DKA5AuzwBCTYTQEcvFNii4K5rJsrnG80TSAt6Qs+X XdLdF8VonBw01rxBdCHOrAf19s1Y3Y630zX1KcCDEDtLS9CIMJI4IqOst9PF8UoxMcMq IQGsoRpDf4AeNAvLux1tG99HsWYU5aVixTIgeIKO/BHogGin6byvvt/USFFafhOExSam yu8jYboAHfPdrhl7r+uzlVhKerU4LgvAo1mjHlJJuUUqOcTcOZpjo7mDb/+QMEkfHKaO m3XqNBZTTgoPQwopoG4068JCHvc3VBT/SAYCsZF75Z7t6u0uneBBiaYEFgTIP3PmFxkD d3+A== 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=jB1asXvWTMLxoiPz1jBKx8yPEGKhUsdRRwAuYYlTl1A=; b=wf9fap5zyM5UfxK9hI9KUWVB6BqaYe4dz9GTdPyUEzYu/dQfIlePqCdfLKoyRSTAGd SgaFMOVQmau9meHWZfIQLbvsBkMLsMv67Hcva8s5zQaIdHtbKa3c4dCfqSJgZp2VDAeS e89cSwgNqUUiuq1Z311bxa61dy1wwdL+XaOBkfLcQGcz3ghXKc1h4mZnS9DBbFrcbEG0 NyzpfDUCINC68dFC/VwF4iLqWNPEHMW7CldD4vz8Vbx7G6nxjD/A8XxguJUcJCg5Tftm e0tYBzE6USDU8G1adS7NsFiHamnRFoX7pa1c0iH6Xu+PZOmc3Z4C+55ZohHYigJdzJYi 9I9g== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=AifXht6C; 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 g12si12023968ejd.330.2021.06.07.16.07.42; Mon, 07 Jun 2021 16:07:42 -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=20161025 header.b=AifXht6C; 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 4FBF868812C; Tue, 8 Jun 2021 02:05:04 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lf1-f46.google.com (mail-lf1-f46.google.com [209.85.167.46]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 52328687FFA for ; Tue, 8 Jun 2021 02:05:00 +0300 (EEST) Received: by mail-lf1-f46.google.com with SMTP id v22so27648299lfa.3 for ; Mon, 07 Jun 2021 16:05:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=yZCvqiRgMx+ONd84mxjHmzy71zdHHJS5NHJfKjDaIF4=; b=AifXht6ClStZ0wUnAvrYCXc1vgLfd9KwtWQdGbS/qyNmueuR/cYaIs5JixZC8/Iphm AL6+TkWv+HJmxsUJxZLcoUyyUxzspA66VywddRwI7ea/4jykjGUhSli6u23q5CTA+LBC V1OE1jIYxDY5wXpufLfQRp8jVzzxqGqhl1nQiAyQxvxTEkZUfOEBJ7W2Ay4omylmWGnD yhE+e+xmm1cKD0ZU4HKFAYCqCklib4W3/A6nPbQHlomyS4QXlJ+VJy/3d1/wq2ihvrKS 8eHcFKmjwV9pRpXBirb/8DsXwHsc45gwu83N3wS2eHPey3MVceXSW4PQdrcEI5PBnDhI c6Ig== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=yZCvqiRgMx+ONd84mxjHmzy71zdHHJS5NHJfKjDaIF4=; b=VXguqO//d5KnALPbQ87oOWJTkKUzDjiYSCuM8YS3S48Uz5X6pM7msQ8C4JJDl5j8iF 8/BFR9Q11jJ6TdAQFgMnOE4Ekz+8/6R+cOOx4jmrPlcMUyZy7BCFHz4L+eBJ8XmT5mf6 9SJSKusO5PNmPoXj+nxVZM3YAqEl2VZni/jGNoiDNOmqtANroBGqCTxSTmUHKJz1ZqNx wSVU4BwKao1M+SIwPDoJOiyHnHW8UM0rR4n1IEqGJH4qAydxTwK4/SJIs+7NwSd8CyAA Obz1vUjlAD+t26K+gLG+GIgYmFeVjDsKWgRCkqKnTvJ4Xr8yP8QVqxCQ5qj1J21oI1Aa g+bw== X-Gm-Message-State: AOAM5333DJvFYXUeN7SNCHv6tg/Yh9SoB+iMB+p3RkR2tJX+7BzTucRM +N4VN+hPmsM7I0PqPrFk7nio2U2m+pQEag== X-Received: by 2002:a05:6512:3882:: with SMTP id n2mr13257213lft.193.1623107099367; Mon, 07 Jun 2021 16:04:59 -0700 (PDT) Received: from localhost.localdomain (84-217-56-54.customers.ownit.se. [84.217.56.54]) by smtp.gmail.com with ESMTPSA id v9sm1999563ljv.131.2021.06.07.16.04.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Jun 2021 16:04:58 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Tue, 8 Jun 2021 01:04:14 +0200 Message-Id: <20210607230414.612-36-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20210607230414.612-1-dcnieho@gmail.com> References: <20210607230414.612-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 35/35] avdevice/dshow: capabilities query also works on opened device 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: Diederick Niehorster Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: odGassCG9c2F While the capabilities API is in principle meant to be used with an allocated format context belonging to an unopened device, small changes make it work for an opened dshow device as well. So hereby done. Signed-off-by: Diederick Niehorster --- libavdevice/dshow.c | 36 +++++++++++++++++++++++------------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/libavdevice/dshow.c b/libavdevice/dshow.c index 9af3360317..c0032ae726 100644 --- a/libavdevice/dshow.c +++ b/libavdevice/dshow.c @@ -834,7 +834,7 @@ dshow_cycle_formats(AVFormatContext *avctx, enum dshowDeviceType devtype, void *caps = NULL; int i, n, size, r; int wait_for_better = 0; - int use_default; + int use_default, already_opened; // format parameters requested by user // if none are requested by user, the values will below be set to @@ -860,6 +860,9 @@ dshow_cycle_formats(AVFormatContext *avctx, enum dshowDeviceType devtype, if (!caps) goto end; + // get if device is already opened + already_opened = ctx->device_name[0] || ctx->device_name[1]; + /** * If we should open the device with the default format, * then: @@ -1173,7 +1176,7 @@ dshow_cycle_formats(AVFormatContext *avctx, enum dshowDeviceType devtype, // in ranges, try to apply in all cases, and store // caps if successfully applied if (!wait_for_better || ranges) { - if (IAMStreamConfig_SetFormat(config, type) != S_OK) + if (!already_opened && IAMStreamConfig_SetFormat(config, type) != S_OK) // skip if device already opened goto next; else if (ranges) { // format matched and could be set successfully. @@ -1500,12 +1503,19 @@ dshow_list_device_options(AVFormatContext *avctx, ICreateDevEnum *devenum, char *device_unique_name = NULL; int r; - if ((r = dshow_cycle_devices(avctx, devenum, devtype, sourcetype, &device_filter, &device_unique_name, NULL)) < 0) - return r; - ctx->device_filter[devtype] = device_filter; - ctx->device_unique_name[devtype] = device_unique_name; + if (!ctx->device_filter[devtype]) { + if ((r = dshow_cycle_devices(avctx, devenum, devtype, sourcetype, &device_filter, &device_unique_name, NULL)) < 0) + return r; + } else + device_filter = ctx->device_filter[devtype]; if ((r = dshow_cycle_pins(avctx, devtype, sourcetype, device_filter, ranges ? &device_pin : NULL, ranges, query_type)) < 0) return r; + + if (!ctx->device_filter[devtype]) { + // put them in context so they'll be cleaned up again + ctx->device_filter[devtype] = device_filter; + ctx->device_unique_name[devtype] = device_unique_name; + } return 0; } @@ -2175,6 +2185,7 @@ static int dshow_query_ranges(AVOptionRanges** ranges_arg, void* obj, const char AVDeviceCapabilitiesQuery *caps = obj; const AVFormatContext *avctx = caps->device_context; struct dshow_ctx *ctx = avctx->priv_data; + int already_opened; int backup_sample_size; int backup_sample_rate; @@ -2214,13 +2225,11 @@ static int dshow_query_ranges(AVOptionRanges** ranges_arg, void* obj, const char goto fail1; } - if (ctx->device_name[0]) { - av_log(avctx, AV_LOG_ERROR, "You cannot query device capabilities on an opened device\n"); - ret = AVERROR(EIO); - goto fail1; - } + already_opened = ctx->device_name[0] || ctx->device_name[1]; + if (already_opened) + av_log(avctx, AV_LOG_WARNING, "Querying device capabilities on an opened device: may yield false positives\n"); - if (!parse_device_name(avctx)) { + if (!already_opened && !parse_device_name(avctx)) { av_log(avctx, AV_LOG_ERROR, "You must set a device name (AVFormatContext url) to specify which device to query capabilities from\n"); ret = AVERROR(EINVAL); goto fail1; @@ -2336,7 +2345,8 @@ fail2: // clear state variables that may have been set during the above process // (e.g. frees device names, removes device_filters, etc) - dshow_read_close(avctx); + if (!already_opened) + dshow_read_close(avctx); fail1: if (ret < 0)