From patchwork Tue Jul 6 09:19: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: 28805 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a5d:965a:0:0:0:0:0 with SMTP id d26csp4922627ios; Tue, 6 Jul 2021 02:26:28 -0700 (PDT) X-Google-Smtp-Source: ABdhPJw3m7TBLDF/u3wnLtSAMT0lSe7yWs9mPr6pGO1MT0OOzS9UN3vvUuUAkeNE8JwMWKlcaT73 X-Received: by 2002:a17:906:478b:: with SMTP id cw11mr17099279ejc.241.1625563588448; Tue, 06 Jul 2021 02:26:28 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1625563588; cv=none; d=google.com; s=arc-20160816; b=07bz8uy92yJITp8gIMg3peRmDzQLlkeM18icYAbDE3gLrbe/8R5OWl4k0Wz6G4TuAS yXP8l2mWiHodZ4TG9ds78tDfNcGLUep+k6EWnlJNrOf8Oy4ibZUI4bKCTVsX8Vz75SxN HM9N3FjFSTuQt07P5mp8oYL8jJOWJAuKoVBXMAGrNJ0avTErU1E9t7LnRdRl2vm5y9i7 zk1Nbtr32EuTCB12A0rYFtcxsm2Z7Xl7nrxfSBT+J+eZP6VL5hSkIOwDXyl/b9uzNJle /gmLb5T1BeVP87PvETUetUet2v6ZpKGRz35Hz26J5ShFyj3vxPGKVDd8VEjf9nDG1vBr IzWQ== 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=w9fvL3VPvb5updXCNrPNVLTpUww3JZbdNfMaMZMwtfE=; b=K+WuQANfyfD6Cgar1gMx3AMEtVqRPBoiJEpxsBzqVpV0NCdZzNWzD1CiKnnN37kh6l Lv3Lm7xTpLtij/mAg+nHNSS7Hgjp7RXaHlGLAcvVZbL+JYiWzod/vv3JbjAAZnNnEeqz it+qzurxGOtXsJdomdxGBjfRJgMDoAfFkMMQ5kqQ5jd5j0l0ghXZFbEnoW2DXn9DPUdh pOdCEZpDwjLPyLjrrO4bcZ6mq/s43Omp0pWTA4fztLgE74OlJpkuGRYATEvuIxaKKnXC A/S3ZFxM1JJusVfGuRXUhzz3ihIZlS2th+WQ2C/D4/US4/fyl90KTS3u1sTZ/9j/hH6n zK8A== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=LWRpjXCx; 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 o8si16031008ejj.94.2021.07.06.02.26.28; Tue, 06 Jul 2021 02:26: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=LWRpjXCx; 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 7F49768A8EE; Tue, 6 Jul 2021 12:26:20 +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 6286168A8E4 for ; Tue, 6 Jul 2021 12:26:18 +0300 (EEST) Received: by mail-lf1-f46.google.com with SMTP id q18so37146795lfc.7 for ; Tue, 06 Jul 2021 02:26:18 -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=jcjJhc+duK3r99E9G8l0evKr10lxN7y9j1qZpdQOThY=; b=LWRpjXCxYs35P/VVLVTcD+4v+rtF0fqDA/iH2xJIzT/rwck2ZZ7BPaO1D78J/FazwY fDpFCGulXjGv9CRkHBRgupDzTyqG8qN5PKhV9WcRcxt0oebMbWNoko0xvfE/9BUuwDwJ pgEFHOpn1h6cmpVE8r8uE8BGWv7PfyL3U8ks092yv2KVnlFq+s9y+KTAwGOY9jPsZcqn 6ba508NXFkxLqLiGPkEdmWXg416o+hycPzyTvjggojf+YnaGeOU2cj0OgK9u9q/cAP/C 7AwNbfwVA3ZeIrAEgwbpG4zHbJrGEFix9lJDt5S+agIVYU0chCOoNuGkua1uWPRpCBGw E9Ag== 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=jcjJhc+duK3r99E9G8l0evKr10lxN7y9j1qZpdQOThY=; b=IGXWV7JHiRB8+aTUrWVXkC1DAUeTwjqX/dnCDPABtsSD5Zf26Y5AAPUNweYTptDXMw TFeV7j56gvxpkJt6BcS1I9AFavvRim4KzBIZFoggQY32x4lLZF5Uedn+NGDhx3gXZXqY gJHynKDr+ixWAMmlhbtJPWxBkk8fvzjcMXzk3XtNy3dm2el+qZSBSLud6fAyW4kTLk2D +J2vZUOlrB5Tms0EtLxxNm3D1SUPTbf+0I9zdKGNtHr/354M9d/qJsG6VQ4ucGweoxu8 hXdDQUA/2BoEjiZwyQpkRBHisWze4glED5YWyhbNu9ng1e687xpBijQ3w3TI7jzFyT5w erzQ== X-Gm-Message-State: AOAM532x7KGDlbBGLJdiFtT0k1Sn1dldMY1ongFE/aLwYsZeot2VqAzF yaiUxeoR+uFRSWJu+DqK3Y20l8BVL+c= X-Received: by 2002:ac2:5a1d:: with SMTP id q29mr6436108lfn.550.1625563266181; Tue, 06 Jul 2021 02:21:06 -0700 (PDT) Received: from localhost.localdomain (deedock.humlab.lu.se. [130.235.135.183]) by smtp.gmail.com with ESMTPSA id 14sm1347305lfz.84.2021.07.06.02.21.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 06 Jul 2021 02:21:05 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Tue, 6 Jul 2021 11:19:47 +0200 Message-Id: <20210706092020.1057-2-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20210706092020.1057-1-dcnieho@gmail.com> References: <20210706092020.1057-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v3 01/34] 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: 3E55PqJIAeQs The dshow avdevice 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 | 11 ++++++----- 3 files changed, 8 insertions(+), 5 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..8e56dccbfe 100644 --- a/libavdevice/dshow_pin.c +++ b/libavdevice/dshow_pin.c @@ -309,10 +309,14 @@ 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) { + if (devtype == VideoDevice && !ctx->use_video_device_timestamps) { /* PTS from video devices is unreliable. */ IReferenceClock_GetTime(clock, &curtime); } else { @@ -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 Jul 6 09:19: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: 28795 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a5d:965a:0:0:0:0:0 with SMTP id d26csp4919412ios; Tue, 6 Jul 2021 02:21:30 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyEKuKJ1HWKFmyu1Ho71/nhNtvXGHED1VZKf36LkQALLUx1lpeaMiC6m0ePMUEIyZi5ECac X-Received: by 2002:a50:fe08:: with SMTP id f8mr22033605edt.186.1625563290253; Tue, 06 Jul 2021 02:21:30 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1625563290; cv=none; d=google.com; s=arc-20160816; b=cnGOdZF8SNmNxbml1tfbuaOErUvL39YLAOEbhdz1XbNCKeThN7WaPdQiLiK04FBmvs YDRaTWc/q5nG7TA0rUu+6uyqaatorX1lSrnolGT4iXrdv9qxSik2IxUVaLrWHsOd6gp4 baRHl90q9zXrY6hup3gm3zVlbLRasZ3QHxP0DbYvisLA3Y+h5sIqSZF48H2WZwBQQAtb KtP2lvzJtehBEuuVqZfgXR6+S3M998NXk2w7uNXpFBRY8d77Djg4MVmY8db6jY6oN44r scamRBv162VkYzz6yEdsSJsWbdsXwgvW2dYE1PBhljzN0jXndR3hRwwholO2fhoJkHzu nkwA== 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=qLekyCN9+mUXr0EI+/y4Xawxu1Be0XRwSLSaPESbWQsbRLxFiP5QXw6OGSryQdHZyb SwhPzXT/pc1cng8qIlfFGH6Bz4RgFrGUbDujGtrr2lrGPOYo2enB7Djm8qMWn5maHqgC 5GgytTNtSjWGukUYc+MZ+gL3rzUQs6Gxx/S/ux6rBSY2+MAsGHhbGz2wsNfGipyI1+ts 74lpUGvLLs5T1md0WZ6gHWsJgzQbWLZUkB4lbteQs+SY1hnq4npYqz8pf0EaLTmHD264 A5mL5Co8ceGuOfp0rKCXldefz3rOMmBY0TPwirxIlYWAKqiwFo8ho/rQjIL40og7y9Am mf9w== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=kjVnusN7; 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 p16si14513920eja.659.2021.07.06.02.21.29; Tue, 06 Jul 2021 02:21:30 -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=kjVnusN7; 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 1474C68A5CC; Tue, 6 Jul 2021 12:21:26 +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 8FA0E68A5CC for ; Tue, 6 Jul 2021 12:21:18 +0300 (EEST) Received: by mail-lj1-f179.google.com with SMTP id r16so28197646ljk.9 for ; Tue, 06 Jul 2021 02:21:18 -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=kjVnusN7Jju8AhBXH1uB6R7fXYxmpRooRWq/q+rpib+8R2tLmhP2AD8zPvqgAkswrB zyzuvIdB6vZYhZC+EWikbe9LPCdwDCtv4twTd38p0TgTsaGuW9v56bGUS1Y2X7cqZvKs WsLN/RCn67bjxG1IJeTtQRPpqw+eQ5SzcDQhk5FvWIbHbG+XLQYhFV72r0xmw1UbXD1L 1C9D7WEwJsUg0BRhBZZOESy5c7phjF39ip9RoZ60Mu29uBkjV1Vj8Z2Ffkjq8Oa8Pkkh SZliKx2114r+X1MsjV0Ei2UJ6lxBZg3r+aShvZSckkjuTtFqY18w/6nIuWwLMlSLsn8o EiKw== 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=YDsGuafUBOVjFHZUJb6chJoBv3MYnE1nliroJtbFqS0Lv2OtvGrsqT5RWJKYYC9HxE dDsRYR7ABcNPncMsSf0928jjlsW/U60mJ9lO+fid2eXEhy1RtFGpcVFJ6GL+gIKCiofE 1p5Mi9/tl0YNHHBMkKDNZao7pyOmTMerJwMrW/saS7gAjiF4IUm3rz35GEThe39hsxr2 XsF4FmWo00fWMj88nfapooiUV7bw+qWDYsw13CtVR2ga7lTS6ansbukAh2P6PZNTOyCr dFzdlUsUc5LKADOcWNG29/1NX5NY0eSPlC6Q7WiAcIq4AeWQw6fpiriQXfSIC+U878Zy kHUw== X-Gm-Message-State: AOAM530ogb7/jHh1X4kL7Onyou05zkWgbso2hIgBNmUpbqiHEJtjTZJG 3feRcyI8hy8qJDblJDIvfpw3bG9uxVk= X-Received: by 2002:a2e:9059:: with SMTP id n25mr15065221ljg.314.1625563277672; Tue, 06 Jul 2021 02:21:17 -0700 (PDT) Received: from localhost.localdomain (deedock.humlab.lu.se. [130.235.135.183]) by smtp.gmail.com with ESMTPSA id t5sm1170853lff.280.2021.07.06.02.21.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 06 Jul 2021 02:21:17 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Tue, 6 Jul 2021 11:19:48 +0200 Message-Id: <20210706092020.1057-3-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20210706092020.1057-1-dcnieho@gmail.com> References: <20210706092020.1057-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v3 02/34] 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: W1Rev05nUHDu 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 Tue Jul 6 09:19: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: 28794 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a5d:965a:0:0:0:0:0 with SMTP id d26csp4919511ios; Tue, 6 Jul 2021 02:21:41 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyfTF713ayURbLTUUs1ygl7iclcS3nqZlOSPA/M2z6YvEnMH6rNmOak6qCbibIrBOydyPzE X-Received: by 2002:a17:906:5d07:: with SMTP id g7mr16365493ejt.537.1625563301209; Tue, 06 Jul 2021 02:21:41 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1625563301; cv=none; d=google.com; s=arc-20160816; b=tWUgLJnT1A/ISbOW9exyCXXpBiXDq1SzmzDqViDjLWz3dH0rBExIfs60rVWRgY2qC8 sRiwubMhveC1U/xGRFRj5INaOdaZ8eYSjKGIJ8rAj3xNfwvnPi4bfdyRoy+JUFgvwza+ uG1SHcMMj8o6zNwsKOW/wu795XnqpoGUyVaVcAHMY16w8m0qYNMS7vNNwdYmcM6uWl1r r4hJml2CMlJjBkry5db1UxWTHRFjfElMfGrDsGRipJR9wvsqMxdSp1+ewFeD/mr5moqE h/evGjHLLms4BOBehPWwxpn4A7ig8r0NiyqxNy82S13rttuEfMn5yiWuQ0NeV91DfyF3 IZ9Q== 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=pa/7AoG/Tn1IKWdkErCmAui2uj/lRNPvOKfWL9u3LsY=; b=1DPTwf1rdyXPi8VhKC2cAAXka8V6i0njh6PX7dFu+oW5zLfpgDqR4mVf887IxdjV8i BFSDESh5lsxhRkn03zVXS1BcYKSHdffYYv0xK9WwnkofY8m2TdhebiacSN6tPHyk4UZT kq692TF8QmUZO2UGYD+ahgAfc9ss2TkbGzrRwxrTlQP0AUCF1NJcFIguS6cb53fpezwW ojeM8pXGOlvlb2mgsQz1BLYWEJfPBlRdn/8t4Yo41vab9S3o2hFwIO/YlGCFSGsmIo3/ wM+vUuUA8jFRDISLO7A9qpe3holz0Zn/IFJ576DlZGF3dWyzZXbEIQ36TwvDbZbubuoQ JHjA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=bylRRlSd; 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 p18si13672345edr.268.2021.07.06.02.21.40; Tue, 06 Jul 2021 02:21: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=bylRRlSd; 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 3948F68A6D6; Tue, 6 Jul 2021 12:21:36 +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 EB15E68A6B0 for ; Tue, 6 Jul 2021 12:21:29 +0300 (EEST) Received: by mail-lf1-f43.google.com with SMTP id r26so19650971lfp.2 for ; Tue, 06 Jul 2021 02:21:29 -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=tLBGkU73btm2UY8VXqRWlX4bo6pvicPCF5lFX+SbDcM=; b=bylRRlSdgCrhz2zow4kQNyXiFckp0LEA3vBtIua1bDjdobY6I2mmpP9dMFMat2xpF1 S3dyaUTnAuYXZ6qlKYmKGxSsJO7seAOcjDvOFMm5sbGLNs1qCkPPrPHZv1l8NrqG2hh8 4CxJnc+MMe9NsJ97IYQuKDu/itYNExd75v+1RXPZhhyZgxUgp7mlyenjVcCdekA6DT5f 9q04+S2G33VzfB6m7LfAnld+gyUxh60VwzBK8xxlrR/xFB5lhg7WY/tzCDj40NP9tIZ0 u/zbTKhpcA1qj9ueXdEqPyPti3cn+yX7H9q99i/89HKX4TT2MHfsD03phf44DTwIMpbv wAeA== 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=tLBGkU73btm2UY8VXqRWlX4bo6pvicPCF5lFX+SbDcM=; b=MzEwAfwQ1ANLNfllS9wjclBJ+VwgldyNNP7jaLDAiPzAavogen7Jrp64CD5UYIjRJY 5t1oGM2Tficv+SAlmR/J7TAYEtlDJCIlSRc+fTe7c0mdoOukE4sFUjT2E+5MKFvNEscM r7Wv/SXZK1s0Dd4HY0E0hK+jLyGZ5qMDbrt0OkLDxbqUNKMRZ2n2sr+tx0ewir6ojRzB AsxNCpc/EuwvmpPj/3II+BOwQCctBmy7i/r+eV+0bXB9Bt8jRON2TgDlG25w7hZaWqCL 2sRZAJAz2H1NmU5GbqgCuIM/LfhxVEITwuMz5ekNC5ur+DpNUGjqKVyYW4OogvNx83wj zSNA== X-Gm-Message-State: AOAM5339H4lLVLhrZ6//qJbdFCgbGVdrPe0VwUYnelPaf40dCz5v34UM 7zqMHWnIox1r6qgunMpVpwjWkpTKXlA= X-Received: by 2002:a05:6512:e93:: with SMTP id bi19mr7319082lfb.129.1625563289084; Tue, 06 Jul 2021 02:21:29 -0700 (PDT) Received: from localhost.localdomain (deedock.humlab.lu.se. [130.235.135.183]) by smtp.gmail.com with ESMTPSA id b13sm1344510lfo.104.2021.07.06.02.21.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 06 Jul 2021 02:21:28 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Tue, 6 Jul 2021 11:19:49 +0200 Message-Id: <20210706092020.1057-4-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20210706092020.1057-1-dcnieho@gmail.com> References: <20210706092020.1057-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v3 03/34] 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: 2OI8qudT+C3M No need to query twice, use value we've already unconditionally got. Improve variable names Signed-off-by: Diederick Niehorster --- libavdevice/dshow_pin.c | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/libavdevice/dshow_pin.c b/libavdevice/dshow_pin.c index 8e56dccbfe..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); + 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 Tue Jul 6 09:19: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: 28790 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a5d:965a:0:0:0:0:0 with SMTP id d26csp4919664ios; Tue, 6 Jul 2021 02:21:51 -0700 (PDT) X-Google-Smtp-Source: ABdhPJz3jZew6N//+V51yZ/OfdcuHWI0nfrVC6m0X/Ag+4EpPm53pIDDqd52axbanQVJ9McqeHQE X-Received: by 2002:a05:6402:1103:: with SMTP id u3mr21743789edv.342.1625563311820; Tue, 06 Jul 2021 02:21:51 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1625563311; cv=none; d=google.com; s=arc-20160816; b=t5I5ci/kPzScXv/6UOazpxdSHW/DYSs0fEkR2Yx+X48x6mmKBdaKYQrUsjOALIPoMa kuiPiMu0TZqLfxgaA049eUE2modm/cQnBIHfruB51qt7AJTHdQAwbyaXM9Y1ANEFfwzM 8R4glnee4ul2cKk3OrDOOaVOTVxI6y55BTMaEt+ceKr3OKEgTA1LxDz6obyMzrFxQ/sM hmKs00EIvPbgdU5CSM8D0ajUfBFBxK1P9JJxrptQElRJbMnG/JTXx91JCHmHaLNF3GWl tvEbogZWtmW0k3iioAU/9Vj6aeV2XqDfStKqTyxLp5xfppmECaZXUtKFRm2KflyAd/06 7ktw== 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=1GNbKic4/hTLN8/M2EuCDzyPjx1FXZ2iUnm51nzwk7Y=; b=YSzztZUBjvjFF7n2d2I/S0MpZiQQIu4djy4QPv1NCIWWL53KrQDH1JtkEORS1myaxv RT1DDQDtXpYDDyzzJx46BxUHnDDdTqPAIOc03F/2pCN3ezmfGS+cobC9SUGjgnpPW16P ayaOEK1dsVgMZCCkd8cbmuoseATZaEyI3YotSfJqhVNu1S8DHMxz3S0NYR7UzTbXtqoR B/0nO914km8GgjSUz5xX6N8jSDiV8/zpFzlXZQBqN3JdT1Kn6eASOROv2a8zknOhhAjt SBzzbQL84yJhyTOmAT45dtrt9XHg9ge5RspxehAAsOZ2+hQ47Gsp0frbrwYelfC+ymL9 +qkg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=hsnXMbTY; 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 hr19si10168470ejc.270.2021.07.06.02.21.51; Tue, 06 Jul 2021 02:21: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=hsnXMbTY; 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 4F56768A4C5; Tue, 6 Jul 2021 12:21:43 +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 B8FE768A4C5 for ; Tue, 6 Jul 2021 12:21:41 +0300 (EEST) Received: by mail-lf1-f54.google.com with SMTP id y42so1885255lfa.3 for ; Tue, 06 Jul 2021 02:21:41 -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=adnbYYXt3y1rSvkqYNUbMSM3zzoFE+m4ORetAFLtEoA=; b=hsnXMbTYQjJWQ9DpY4ESaOK3Fg6o/LKxN4rCAL/p5/LQQFcVx7JfRR9quxaCMJdo+w uxmLmMSEN/3omY3213aZsOhibezmhIQIaNJpi/EpOgkgCoRzCULqx+Cy9EArEPoITN+C VXee7/uRMXM31goD4Jx2zD2HgA1YJURyK8k8ys6/7zV2dAt57AAYzG43aP0IYI6lm8oE lSNz/kULh8vjkRcDjxHWWXF8kgkafZrB8FM+REzEEiZEBWa5iRgqVOH+RUygmFr+dkUm rZAgtsswzTx1Ch5lRltBdExEksmZIHFYIaCiuWS/vvNGsDbw8bpwjAMf6s/yOaLNk21U hOCw== 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=adnbYYXt3y1rSvkqYNUbMSM3zzoFE+m4ORetAFLtEoA=; b=e8sNrn/FThwlAnkAUMqJInbH8/xZdKC1AgFUo5gLfjTeOdQIzEhYI4RqzA29+4vAsp W0Da6TiTv95KKLBGf7x9hGSLqY1/BnhT43rDTfhGX4x/qgtaQqEiHncQTcD/S4/d/jH6 pu+szReDcZ37DXCwCHVZuyFdrJ8d9FoJM1TWFneDBu9hpAPSnBWqPolRXY/DB+T3zpsj EJ3JLqSF0bqhquVssphdyPLOQL/8ZuWWEJJmX3uNHZIJffeGmtMZn7VNrYEut7jl2YMu g1d3m/+JWt0nvSxJrXwcwQCzcfgE/GjC7BqPoImvCjdgAZNv9iXSTzXEDyPoirfVMp8c cSfA== X-Gm-Message-State: AOAM532Hic2iHfpYjRAUbFsx3mTGoI/tm999z1Lv6y/LwdaLHwTmxWKG BGAPyfhTCJTTD4A9dO6LvDYbcxCKyl8= X-Received: by 2002:a05:6512:2343:: with SMTP id p3mr13786682lfu.83.1625563300547; Tue, 06 Jul 2021 02:21:40 -0700 (PDT) Received: from localhost.localdomain (deedock.humlab.lu.se. [130.235.135.183]) by smtp.gmail.com with ESMTPSA id n9sm1344828lfl.69.2021.07.06.02.21.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 06 Jul 2021 02:21:40 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Tue, 6 Jul 2021 11:19:50 +0200 Message-Id: <20210706092020.1057-5-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20210706092020.1057-1-dcnieho@gmail.com> References: <20210706092020.1057-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v3 04/34] 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: axxRPe2uSyEB 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 Jul 6 09:19: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: 28797 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a5d:965a:0:0:0:0:0 with SMTP id d26csp4919766ios; Tue, 6 Jul 2021 02:22:03 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzHUF5+rbkPnHxSBUsfKIbSGUoRMkQQEXZ4Y1Rvy8ToSR5Rv0lzJzKImk7EyZv0uc0cpXAc X-Received: by 2002:a17:906:69cc:: with SMTP id g12mr17374252ejs.550.1625563323239; Tue, 06 Jul 2021 02:22:03 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1625563323; cv=none; d=google.com; s=arc-20160816; b=pJMQMsPUB1Kkj5eIWmEPRPO6ql2uG3IPJSvcaJ3xsVqNFACt1WDtWrfWWhJFD5pIVY MeuDqu/DcoDm/Tg1B/5MIgrNmTB2lYbN/yX/TTiN8uLcpNbfJm6P5o8fSI1tFXlph2f7 HVL4/IN2u72/gd5bTND4k+aUthBZMM9ImdcYrAPnK3KXw8OPQGeDzMff/hgSAsVFlOf5 tlS5VM3h+n98yAVZWqYHZH+gZJUawcn+Q1mvBT2X9dyIxkPcd1DVAp2JAo4Fwf5JxDGr eXhpcxHT9pU34OOfO8dpfRkU547fzbLB1awlEo3Wj3sDEeV4aDoBINpABG+fBbIoVK0p ZmPg== 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=sokqD8fQSNwKlswcn3buB/0JwLtVDks8mYMf2PcTuYE=; b=xgdKSzNuWmygSbLh3EjUiOEA4v4QYj/Tz+srJL3Djv7DeWjOTAz4nl8OsO6338P9NU 2r+G+39mBVd2/guLOnaAOs9mjvrCDm2WCSbrjQXzcZOzYD9jmXoYTSEQv9uuO4jOlGXE TKi/7kwdJRs7F+57BMq8NisDTZrp0YK9SeltX48MiyT3OlHWy99LSvArUTkvdBz1qLBv uCxT0jEsf3BLbHtOAzgxmlqAXTdM1U3VHpk1XKVYWPPKPpqz0Sc/zdiwhLQKxEHxRtAm 4+uIG21qPkG70DxDYq+eIcHaYbLExeG6tChBhsYiPFukGfBIOwGYXbN2JER4yEybQoxk 4Axg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=fSGqe5fW; 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 n3si14498077ejl.4.2021.07.06.02.22.01; Tue, 06 Jul 2021 02:22: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=fSGqe5fW; 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 782CB68A6F0; Tue, 6 Jul 2021 12:21:55 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lf1-f49.google.com (mail-lf1-f49.google.com [209.85.167.49]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 5DE6568A69A for ; Tue, 6 Jul 2021 12:21:53 +0300 (EEST) Received: by mail-lf1-f49.google.com with SMTP id n14so37168234lfu.8 for ; Tue, 06 Jul 2021 02:21: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=yJeuo0ydICb0kyFsuJvu0RLWdFppQ9yrf/CpLl4W04Y=; b=fSGqe5fWc8cECNLLI+a1OzjqCl8dMw0QcL2Gig9/l/vBUoE38Hye2LYbJp8k2axlkx rzw2CbPOWL8Iv+Mu7YgTnmByZRTF3CbAAZW866u3VUMXQqmeUAljkzWgl0C3cFqfxrtp rjn7MvREQRGDC09eyRmSmgIsIQM+H4hpeh3t5TRGz4LnY/2p0qoYwpIpgby82MF35z4m o7TMXkdgHnLJtO9M9G+BEDsAG1uYnCfe8kFZFcW6M+S5wpFrG8TOS//3xvTWjzXl1pBC hcgaOFrsn/SEHjdh+TmcoVcUiw4voe0ZMU1FpvMaywH7XHoTU9xcoewCWENlbKgfyHJH QzNg== 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=yJeuo0ydICb0kyFsuJvu0RLWdFppQ9yrf/CpLl4W04Y=; b=PdhFMd6EzZKHhzR5P0zaTgkww3KZQeiCxGJ5fjxEQttfnFa3ali+2geJw8J90TdonU FlKFhvn3GAi+YdKPMllUeR2H/zqxXJ0D2eYi707sFh3Nl1XsDc5EsSAQ2ex/raRdB//f 23K+CIZO4FjZlMJD3R771vzxj4QNHNWPo/EvvUQnYaNtcPzg6gKzj3+JMPpBP67vnGAB faQJ3foN/5yIa9vurM922vMOKcmNGejViVNyUKefRMjK/UkgCwfldZ6nmjj3SQZj9opH lffIHBW6UNk1PjIcqyqEpburenTJFoHHvJd5hVJy7AxRJG4txRnAZnDb8l8H04dQOCJ2 oI4A== X-Gm-Message-State: AOAM533/VYb/fjg/sLaJPWwg9mgaCiMXe5QGvtiS4sW7kML6t2WlEFfr v9UC/HabR9UW04BmOi7+L6M2s3EYjdk= X-Received: by 2002:a05:6512:3049:: with SMTP id b9mr13849723lfb.395.1625563312171; Tue, 06 Jul 2021 02:21:52 -0700 (PDT) Received: from localhost.localdomain (deedock.humlab.lu.se. [130.235.135.183]) by smtp.gmail.com with ESMTPSA id m16sm1427693lfl.300.2021.07.06.02.21.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 06 Jul 2021 02:21:51 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Tue, 6 Jul 2021 11:19:51 +0200 Message-Id: <20210706092020.1057-6-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20210706092020.1057-1-dcnieho@gmail.com> References: <20210706092020.1057-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v3 05/34] 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: atINLb2ZlGCQ 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 Tue Jul 6 09:19: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: 28793 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a5d:965a:0:0:0:0:0 with SMTP id d26csp4919869ios; Tue, 6 Jul 2021 02:22:12 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzYg3br+SIrFDVzhpTMw05QeUYV2KrdEEB9r5hboG8giHxu1ztqeG2Uk4J5DbF4JF20OVNv X-Received: by 2002:a17:907:60d4:: with SMTP id hv20mr17273853ejc.261.1625563332706; Tue, 06 Jul 2021 02:22:12 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1625563332; cv=none; d=google.com; s=arc-20160816; b=u7AfpIpEGNG8tuj0NX6UfsI27flJV/6uzS91r/BNoJzWzE/lae3TBAz7YITuN96KYt fBl3m6sZQsfCAsGcZWTqQQOAzParAznVSgOMKheLsAD+HyMkHMgdsre5OneNfzDnvFSL NjvtGdmC1kTLUxvBR3Rl/H7hOAVlTIgbnZ+h2LS2qDkymDE7eLFFXgmwRncKDPxKoHWr LFPtaFTAyfyJ+fRapSQNMUPbaQMUv0kLr7TAagvM3Wo9+Rs9dzUwxg+9DeJM9cU7MFTD vtE4XQRh6/IQa/n+8DOkTJ/JQ0zu/e01hJlnI8YyphdGVCJBAArxEfLASlOkIxQpD1Rz y5nQ== 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=Y+GaxMOwEw4R8hPWGdIw38e7rQe+BaZwjOFj88KkfYqXCYNteBevJL0z4wEpjlGaNQ xw2Zk0sO2AhfdlK5wwddHx1dryQ0PZGE1YP7EqOe4SNKc5BPU9nNCoc5FlX2MsTri4nH g2Q2uc4tmahOlYabA+ys2diRRIobUasBvQeX9XF1jw52YK8djxBPiAbnFkfJLbfkS5xX K7nuLvR9Wnuvimauuib96jO9/GC6bTGT0OimBCHEmirEii6QKXdhZQ8W7gdvN2IdAmub r4KHid2TRSpgHm49QbtFpr5a366miU5uXZg3edW3A4SoWQBaDeUUv/5t3WSrXhS0oZtc sVxQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=eK5JJgpO; 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 nb24si16077598ejc.662.2021.07.06.02.22.12; Tue, 06 Jul 2021 02:22:12 -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=eK5JJgpO; 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 781C368A723; Tue, 6 Jul 2021 12:22:06 +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 C387268A716 for ; Tue, 6 Jul 2021 12:22:04 +0300 (EEST) Received: by mail-lj1-f169.google.com with SMTP id w11so28322292ljh.0 for ; Tue, 06 Jul 2021 02:22:04 -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=eK5JJgpOUxpmsq95E1Mf93uwcPQ/NP1iyn6OYwybzxNLyaG2vy5Y6ydhTl4beO7R1b 5X2WS1mDnX2wl4W0oItBDRuQo48OVUKrGoHI47QIW+TDtFfp/cDZininJWUwxaShB7Px 5NXtGHxaHxXMI/VTu6fLqA3k3Ys8nF2RriEH2fUF9fI+LqGY73+zXWsfg81f/LRWMs59 hnNvMcA8cXtT0KGnIs89IFGz5InO4HaPH0T2GWKLoVb8zNVKaulT3sF11tIFNnThopNk gRWr6AJu0ncvGDu9PsqFH+aXhOF4Rx3HmV54CiE3nDbYKYrCrZCRw18mUovVxaD1Z3BP 4IxQ== 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=Y7PvEf8gp0heWrfvz5q0akcLpOP1XaRxNNxxh7s99ovhp4zirfqWh9ZAJf2OZgcfXt SRC9a43I1s1mBduC1X8CyjeCxNUu69vMxysc38gvenRjdoEn0qoMJ19DUdkc6IsIIam3 s4s6BxMdf5oDo/lbMM7rGfal/3EoVLZdPdd3wsiixMg1fKA9l5G6UO5jq1F6F+bjgzOq lVqTvJdPPrK/9rGhA6GWcTGjf47qnlNSPo4bVGf/MG5Q32nj0GfbUIWm+twhMu9htegW R0jq/6uhLmuknQXa5s3fkdUUfVkAsuvBtkNDsby9DKhLgEh18VH9npHKFX1EEx6ydZjU u1Og== X-Gm-Message-State: AOAM531iwgvzfBF/gTRtn8fZuenST1knbFOnexGrnd2DLeNoyWAMxkX2 x5e65lLxvsUrNfVKKaVbcH9LwHXtK/s= X-Received: by 2002:a2e:8195:: with SMTP id e21mr10330219ljg.17.1625563323668; Tue, 06 Jul 2021 02:22:03 -0700 (PDT) Received: from localhost.localdomain (deedock.humlab.lu.se. [130.235.135.183]) by smtp.gmail.com with ESMTPSA id g22sm1338474lfr.227.2021.07.06.02.22.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 06 Jul 2021 02:22:03 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Tue, 6 Jul 2021 11:19:52 +0200 Message-Id: <20210706092020.1057-7-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20210706092020.1057-1-dcnieho@gmail.com> References: <20210706092020.1057-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v3 06/34] 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: ysLeb2vSWCqM 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 Tue Jul 6 09:19: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: 28788 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a5d:965a:0:0:0:0:0 with SMTP id d26csp4920001ios; Tue, 6 Jul 2021 02:22:26 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyuE6xZSZhp8uCzpKYQ4NNmR1N8BbjdbscaYUFpFemm/3fBw7rXdbnSYs7GRcA9rUYO8oNo X-Received: by 2002:a17:906:c354:: with SMTP id ci20mr979457ejb.435.1625563346307; Tue, 06 Jul 2021 02:22:26 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1625563346; cv=none; d=google.com; s=arc-20160816; b=KiWLKziHeogXOjAkyHIk8HZYF/d9P35x4sPqGcvbXnlZTRGWTIlAFasqRJNPenKlhM ExkaQqHzavonrcKE8o2eMuHNSVIDxcd5HkhYNip0YCJTsgyzQ1EjxfYByTNEtrpnSbHx Dctka7BksbLD1TtzB8GODg34RIls1IMoOVLsxbgzOXY0Z4qLg+uWVsFDdsyFeMdN6+16 HPmx4T8qp/halgyE52m+wnMsJa7ZlQK4v3+dWx/gqL3WmNJD4asvkUvfIlBYWZJbIU8U mUAJGtzWuWY+4AikDK2nsyCcZPD0awiHt0kNcVpL6XswWiS2XFOxZvaQhI4QRTWM652y ZU9A== 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=hi3p4JVC4YXx30h8HU54Rh1dYgcs13vustRqybcIk2s=; b=lPJpOliQGzCoKrpReAKrUUq3KRpiEwfkZRZwCc8MtFTXxBTPXAs0IScTTfKANYpSyF ExLjchB/+/erYfPWRqM0K1NMIuKsZCP8SUDMJo/fZ5DItPUilQl9HKZckYy0yph6OnKu edU+Vk0ptdIMWN1xriRVv7UBcxgd9DSVtB77EXPMPok5Jjp/9ixYch2WCDBMUbtGG7o2 IvMwbwObaFVMcgut0I5mSsBmm5fGxTwhbkZrZpDZ0EuBLfr7ootX80tRzmzr1B1huZ9e F8+2hqb1JdZ5Lxe5Haj4q7HTsAur2qnuGFVC4BRZwLxyiqktK7YCmySm6uemM66JxckG LMvw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b="vX/FQcyh"; 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 gt34si9641582ejc.285.2021.07.06.02.22.25; Tue, 06 Jul 2021 02:22:26 -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="vX/FQcyh"; 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 7E61468A74E; Tue, 6 Jul 2021 12:22:22 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lf1-f48.google.com (mail-lf1-f48.google.com [209.85.167.48]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id E23A568A729 for ; Tue, 6 Jul 2021 12:22:15 +0300 (EEST) Received: by mail-lf1-f48.google.com with SMTP id p16so9699559lfc.5 for ; Tue, 06 Jul 2021 02:22:15 -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=tNu63/BMH/m9BRQPy4AqhA7Gv2OzNcdYzh97WMexFkM=; b=vX/FQcyht8K5PSjtU+EjkYhwto6JZ5WmSLll8x7LwicSJQStP8xk6lGyIWDBGjdW+F TgCA+RpTouYRmKpmLh61/T/Il/8Sbr36D42wnuthF/gtTfv5w11LdvJbPrkoiHqTi4bJ S8eHTWjBddriBJQak8w7waXwyh9D+VTVVQa/zRtDFdecrvm4mqfD3etuypkxwBWEPDjT q+nDdu8lQXIqPtKUpFlbUoj4jdODyhnSxOsh5BWj4PLmfusn6doifAsHXAaX+v/rEmW6 CEFdO78+d5n9jdb1loznzHgw9+yFy4idoCidmxjFRBp2h14Od9SsDKWZkomCtq3lokja 89UQ== 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=tNu63/BMH/m9BRQPy4AqhA7Gv2OzNcdYzh97WMexFkM=; b=kvuQkGPljmJCQ76nYqDl+SDHgxj7hKBOFCCO4nP/p31Mi2ltaJL2vtxVmJU3QaMAlS xZnK6IG/XRk4BTbquTmtlDYKk3deAQ295nhO7RhoMKIw57TA7knTG//Sa0Bgb6Y9Qxqo y7HyEXEwlaaYJ9LYO9Vv3oEwK3X+Vbj2JCFdZmhmL1ZQYx3f8+mZDjTnrdXBusE3OkEu 1+2jJn9QBHQCzYkXPac7hcjfiqP9ToRpcmHv3WXEvJxqrDp3xYDUZnt6ygwNfHU1Plcy K8B24UyEpx1CaD/KwfvYdRt9srTYzgJ/BcRw2hbgPNDqR6WWUJKNqvc+lEU1JO3w+Mag 2ZWA== X-Gm-Message-State: AOAM5331NDQCiOP0Sb8WGEPkG881VXyHQEmDXyriVMtzMlV/A60/tfy5 KshClEyHWilzTQUD0Wz4npqP8GokWwI= X-Received: by 2002:ac2:43b7:: with SMTP id t23mr10511800lfl.640.1625563334998; Tue, 06 Jul 2021 02:22:14 -0700 (PDT) Received: from localhost.localdomain (deedock.humlab.lu.se. [130.235.135.183]) by smtp.gmail.com with ESMTPSA id w3sm159671lfq.157.2021.07.06.02.22.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 06 Jul 2021 02:22:14 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Tue, 6 Jul 2021 11:19:53 +0200 Message-Id: <20210706092020.1057-8-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20210706092020.1057-1-dcnieho@gmail.com> References: <20210706092020.1057-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v3 07/34] 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: lRx6tTR9HT5j 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..8e693875c6 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 Tue Jul 6 09:19: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: 28791 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a5d:965a:0:0:0:0:0 with SMTP id d26csp4920126ios; Tue, 6 Jul 2021 02:22:36 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyqGYvQ3SU6njsxblINGn1to45vVuycSMCzFXGNi57Hp2kahMcYvOOs9Gfbt3idAJd1znjn X-Received: by 2002:aa7:d9cc:: with SMTP id v12mr21473823eds.224.1625563356485; Tue, 06 Jul 2021 02:22:36 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1625563356; cv=none; d=google.com; s=arc-20160816; b=uQFmI7VGGBxebXRPzwV3GePoX6aQ3J8RczR4G1jHHyYpCDMZSQJSQUMUjAAyemUzEo ltXfR3FfZcyKA0j9DbqJFme3883010ht8hukwquf1/yiUHvdsJ8iAOVXCVD0FSrPHpVv 6frXYYi41mZW/2abDeCuEaQ99zkKIsxOEBucXxvQG6jvCgKbFPzyVXJbflRBT4H3oiDb ODUZuZbMHiXQCSWiVo6LO1OJtQjsLLg8vPnoH93acCjFOZxoEWgKZVQ5Q9FOpHhPnS3I fAG+O+9se7pWcga29jEtz75ekStazsNuMsDuibBfWXGswzk0iYQwFT8X00owPHgRhSON FJzg== 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=XTcUtUDazvrxnQ1U/B+ZA4MUuvoZ9f5eNe084JO+cnk=; b=v2i/Xsppj8akvnHwiXl+e03dP28Fh+OkcYQ5zw5whnvJJ4sHnRrQYc0QKAOnmw96dI +vo2xDcVqQ+HJbACcy5JHZSMhPG2eJo0war7XfpX04zySjVAOWzkL/DVUssg8A2byTH4 XmzPg5bClIJKipvUTUZvr1dsQDm3TAIqDxYNhknAn3qKVJnNcVex8ruW10wtI5nehiqI B3MeQdZsCSlhtJfrUckYXRYQvAG2t9UD++O6kFQ5qxhfvWJ8fvbBaW7x+timFZzCvLdO qoSSN25hu/HYOo9fqMHt4u0SJ9SUG45g6VIKZTLl/SvPc4F1uUy1CINXURbnLyKTrne5 cG1w== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=bpU3v0Qk; 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 qa37si9230015ejc.683.2021.07.06.02.22.36; Tue, 06 Jul 2021 02:22:36 -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=bpU3v0Qk; 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 775EB68A758; Tue, 6 Jul 2021 12:22:29 +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 5A64568A700 for ; Tue, 6 Jul 2021 12:22:27 +0300 (EEST) Received: by mail-lf1-f43.google.com with SMTP id v14so11599881lfb.4 for ; Tue, 06 Jul 2021 02:22:27 -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=jkH7//Ug1KRjrqJO2w+IvuSqaoye+0tWmmd3ktLeHBM=; b=bpU3v0Qk3fLT4BrvQ2oKm6p0FVE5MTjr9l8/wxyIcbwrBd/McXLxsvN/LQP5ORFOm1 B+glu+MzZ27SVz6lO+twsc7G1/dq1yZEgvJ23tsOxFmxZo7myobRA8esI5AM7ZRUEGlh 46HPy3lh8fV2trYi4VuOQEchUrIiRFE4PKUaOuqvPGTI/6gKndhGNygq4t30FIwu27/E YRIRgu8zRtRRP0mThHsS+uzo2R6e8Ktr6bQKfZ14MlSBjxwoslOH8KKsfzoeN7s5OcZN YId3uzKCR9IdPg+3/N5IpsFAGqCqIJpqKJj4QEGM+iq1bgV2wRRf20CCer5IB4ywq+QH JT0Q== 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=jkH7//Ug1KRjrqJO2w+IvuSqaoye+0tWmmd3ktLeHBM=; b=Z05F+WUlchG77SNRXsyKuxYfRHbtrA6x+QrC2HUgdj7WYOPVdWLGAeO9pFvsC3uwmq 4ybOsS6Dtwqv8awJcoDDxQXz6Ee7qpTzS7fgHiZCfXqOE2N3qvY+PLlsjIil4u/ki/u/ 5jQdoWRicrbHchklCQKp9t1/KUQcGADPgxMAr5cfg/r5moEf8Ksaibm9v2iDTwJsa+za dxr/Hl1+6AMy665Nf3dOIx0KnS83Bn20O7feZl83mxCSMcI1xrzI/idrix2YFtBKa0ad 7jSv9tx+ZgjTGMkt5m+XcLR6xygxLbU7dC7X8QTGfx45Q8hDHUEBlWD4JuH5dEnPXfDS TMqw== X-Gm-Message-State: AOAM533gs+VD5rkrKT6X077yoEa4BpS+0T4JxCd9Gzp3XAism1l5FPEa pRE6U9q7jRwKhBwHeBy+QSVpqsmr0IU= X-Received: by 2002:a05:6512:3b21:: with SMTP id f33mr14313739lfv.185.1625563346486; Tue, 06 Jul 2021 02:22:26 -0700 (PDT) Received: from localhost.localdomain (deedock.humlab.lu.se. [130.235.135.183]) by smtp.gmail.com with ESMTPSA id g22sm1338606lfr.227.2021.07.06.02.22.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 06 Jul 2021 02:22:26 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Tue, 6 Jul 2021 11:19:54 +0200 Message-Id: <20210706092020.1057-9-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20210706092020.1057-1-dcnieho@gmail.com> References: <20210706092020.1057-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v3 08/34] 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: xi1ZTkGqK6Zj 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 Tue Jul 6 09:19: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: 28792 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a5d:965a:0:0:0:0:0 with SMTP id d26csp4920240ios; Tue, 6 Jul 2021 02:22:47 -0700 (PDT) X-Google-Smtp-Source: ABdhPJz3MLo3G9LPrVt3zaUw7H+LzWv83rWH7RGVbqBk/qwXFMa8XrX5AhcpgZc0gxHbs1Pa4KEs X-Received: by 2002:a17:906:1284:: with SMTP id k4mr12953153ejb.329.1625563367341; Tue, 06 Jul 2021 02:22:47 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1625563367; cv=none; d=google.com; s=arc-20160816; b=XIq9UVamQ1lDHRV0UAs0inaeejEFaG1iTE+6SEu/0QYtztvHMEzWvqUZBvUswyL0rM TDU9bULwfBf6p8kmKkp95iWaDIlXNoBLpJKVjh7+vk2jbFRvJ0MC8JWXsOIEJpicDfcz 1pCNvlR+0A+rwxZpKWR0O3IMYAXbSoM9rwRaqOgqxCshLigpv3+eDBftykj46UT5YXW8 YglR0B1E3oEwjNHCwF8/kfuCnAPXxHfRkBalexBJviFZ10QcUOB679ZjWpZY0UTZNPiu NBZu61yu55Z1BoIC5PZ+6Imo2xa6Ze5SK3+/XoeUDmwaeaT/PeCCJv3dUiBkBqF5eZ8e 5DhA== 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=zKvzKuV2sS5bYhwxHcu0E7tY07j48sPxCoiuRPb5T3s=; b=AjmUHlDtFAtCrTzuHXkLwBPwTRvM2GMmiySzN8ft/46ELwwtKe195fAQnyRrZ6BJF3 vvCue9B6ICzn0isRbeA0shvkcq40t7Vb9GnUzyhZyNDnc/a/ot+BQMgYmVJxdZRx+uex tXdBqDkvxOMzk0pDv3vXSfFR3QlT6FLIX8wEnCaMxCWB4jlCvtAdqLy2ruHgWvgf5z8J spNUnbGRaehG1KVbwzMH6cWPfPAkWxC07QjYfBPZJ46zxQ1NLRJYdvt0rtrB/S9bYZnW VphwrK7i/qGV3X8u2FQdJNRPBhCPviZ3zNXfFJt55/p4GBC9SdH97TCufn6JcTD8RDL3 oJ1Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=VTUReunC; 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 w6si13754675edd.335.2021.07.06.02.22.46; Tue, 06 Jul 2021 02:22:47 -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=VTUReunC; 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 9451868A6EE; Tue, 6 Jul 2021 12:22:40 +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 11E4B68A6EE for ; Tue, 6 Jul 2021 12:22:38 +0300 (EEST) Received: by mail-lj1-f174.google.com with SMTP id t30so8231054ljo.5 for ; Tue, 06 Jul 2021 02:22:38 -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=JphIRvuq57WFNLxic8QTmnM9DmaANeYI80UYvktL84Q=; b=VTUReunCr/1e/SwpeiGvJHAsitnr8asMlyf0/dp3GXByBBfKSDOOwh/uaziuJtuUnx AdML8DIfGpjY+Sx5c/JxCPGSy7uZ6zuDI8gKt+rKQSPqmicBvAZZjr3ZL+gR7pXa1EYk ljhJwWn6FN5JqOH/2+8J9kQDygkvjew8i0qHrp9cbfRK6DMoN/VwJqhXaJbmEQThnq/U YEf5lp3uDL9Aldtuh+GWY8CsWvZ0Kt5PFBi1MAyHMrTSjthQE/JJoVu4p3SQR4Xg4vBu gGr2RTpKN4OVZCKNxnCukG8sDKd2d0pvIqIypxfDRLOaHRYtAGd7NnsVEzZu+Owey8AE vD4Q== 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=JphIRvuq57WFNLxic8QTmnM9DmaANeYI80UYvktL84Q=; b=f2lCUQ1V71xc11QwD0fAPxvrwTUIriVL0BvaqFw8+yJdhhehkGAjcn6s8K2aicoMQf fPW3ubyJehpaPiEExmmHnoMCUoDvC1UtKWyPAMShGEAZoKHKZUn1R/teg+N8WuVDqniC r2Ir9CQndd/rn20Q2Hf8SX67UnMGLLINNdlj4j8QMv8iViUVNnM7jG7nj+lGmqrXSR7z D1Osdrui6QsWtQmfGv2nxvhtAGNWgVxTfPG1AhPjxBC/zsBf3CtCAojSCvlnOcCVs9NH NOHIdGUMvRS2BgaYn3vC4/B9ITb8Yel4l5N0I1OpHJVq3xSxxXZXt5vV737uAAjWeWjT HSDg== X-Gm-Message-State: AOAM533gNg3yrSWk9bTKGwNgTyRaErGbQPiVeXHMGPu0UTTy8X3rLiSt YhDf7llVUzAT0FD3/KMxnuy//AY3y9s= X-Received: by 2002:a2e:8210:: with SMTP id w16mr14567418ljg.278.1625563357920; Tue, 06 Jul 2021 02:22:37 -0700 (PDT) Received: from localhost.localdomain (deedock.humlab.lu.se. [130.235.135.183]) by smtp.gmail.com with ESMTPSA id m6sm1338824lfu.238.2021.07.06.02.22.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 06 Jul 2021 02:22:37 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Tue, 6 Jul 2021 11:19:55 +0200 Message-Id: <20210706092020.1057-10-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20210706092020.1057-1-dcnieho@gmail.com> References: <20210706092020.1057-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v3 09/34] 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: 0k0NrsWPvTeR 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 8e693875c6..dae0ae5d70 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 Tue Jul 6 09:19: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: 28789 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a5d:965a:0:0:0:0:0 with SMTP id d26csp4920345ios; Tue, 6 Jul 2021 02:23:00 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwfo5sxbXAUjNKnz9l82Um+SeHmMrZEMBKyAOq5IXzejq2MT225q53Im3i2LhB96KtGDYd8 X-Received: by 2002:a05:6402:28a1:: with SMTP id eg33mr21710184edb.249.1625563379851; Tue, 06 Jul 2021 02:22:59 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1625563379; cv=none; d=google.com; s=arc-20160816; b=EQ9lwd3poNLpChPHzykoQauG2kZChzfIstkZWtoze2OaXfqf+EAEuqy8tNiOf8lsE6 9Mcheuz+BaQVO+sd6A5O61fKULOCk+CcJ4nYsPPMbl07TaCOKsftVy1zY12BUZ0NBMns ceImj+9ciCYNVLyWAagZ487PCem269wWahjcSLcJahS501CHkfXno/5IRb1Y87fmtzBw BMbDNbwY+8uAEvp2kuDjeqd+FZ+yED3QuCyKvCyoBgvL5K0RiTgz9Dzk2vsHPBrg22Ir YjnmmhNpYudZjGTMXTO6o02twDvg0s2iLVy7Rfu2RnpYgZUgrJWfLbq8zY+DpS3y2r5I M4sA== 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=d3djEFhUomJ1Pc6Dx+qUiA0FslPo1I6WT+61+0CIWOQ=; b=t212YRg20dogAFfYhfPtvyLIvk8zcoRZUkT/H1j4zmzILrpkxCG3T7SlhhrXd9KavY aLwStsMbom+e5QNFPaFcgaG07MQ8z1mUve+v60bZ5YqRqrAXCplzct9141XvxWo7nWcj XBgbifHWgQ9X2lTLhX8LlMEYFxGbFYaGWns15UBdQLbCwBrWOtWIA2cA79+3mZuDAw67 +CDLbwvX2unp2tYd/FESJa1xYIDTvmQrTBoejvYUhTvOGxtPPp3tz52LhC530hXQTLrB 2ixvmV1VRIlUkl2/e5Vl8flAhWY7KzsijsPWPQryKxjLj9brfp5+iZ20/e7/g9pvsWUS UtFA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=U9Khr924; 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 bx16si13610932ejc.548.2021.07.06.02.22.59; Tue, 06 Jul 2021 02:22:59 -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=U9Khr924; 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 792CB68A774; Tue, 6 Jul 2021 12:22:56 +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 2ADF568A76B for ; Tue, 6 Jul 2021 12:22:50 +0300 (EEST) Received: by mail-lf1-f54.google.com with SMTP id p16so9701982lfc.5 for ; Tue, 06 Jul 2021 02:22: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=2UoCeKOEn/9eQrl8TgMcBKKVmMh/MUmOfjYFUHdHFK8=; b=U9Khr924JySJM8rDNK53iSuOU9eTkC3kGqmT3ExVpx3zRt7z3d5tfXhYMoi7Dgyte5 O9hjbac9b/9uv4qzWtqTSFz7gbfxxvBHfqRnhlkPGlzJqD+KsnGN72OlK8kj3pjy5Qke rAKyRS8v5vXur5T7Fw5CvCYx7qLSHxAS+u57vyxPIOttHr+k9Pnhx5HQaOgFhjRUIYt6 vjTcIP6F7CEdce+v9+9dtImC8/B20qanKMlGPLce6SolGp7G1y2C9zI4DTiv7Lb2ze57 7YbkJ7ZqSGrWplRfXyHGHBSDU9DaNcpegT7dUy7N8Y1g523I/dgfyulPmKwv8cjoGMaz GpBA== 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=2UoCeKOEn/9eQrl8TgMcBKKVmMh/MUmOfjYFUHdHFK8=; b=eMsyPDLOzbUVfH0eTArZ6D88xrVOy0ZJgoBX46PYqJSowML6QH65vzRhuepMgtBjA5 3zs84O89AvH75j5IjisV3ud8wO8xAF3aAaPdMAtz8sgpWG9CY06/amn8//Lmd7T3bbHc ZYPMtoJCTEdVg3SGuWN2GOncFC3Dro53dHK1YyiKGGaVulhpEe/c0nV3vHKpPC6VHGnT Vq3QNlQM8nWnNds/TcQFtcco9GVJSHUBt2suDOTWF/3bDGkQAsQy6GTyQttL44zfaTvW NAC+mHC8r7Vbp8zRT+rYh1FYfdTBgCqTG1muwuGdSd4w0HQUISfbL9mkQoQDaFvXXPSS SR6g== X-Gm-Message-State: AOAM533U7Jz68/2N+1Z9Q70Hm8MIz/kJECB0okGzHlhSEG5tsYBFjQyn zEB/wjhHrJvRYQfOvKy31FNTAftzzkg= X-Received: by 2002:a05:6512:3e0f:: with SMTP id i15mr13682233lfv.653.1625563369333; Tue, 06 Jul 2021 02:22:49 -0700 (PDT) Received: from localhost.localdomain (deedock.humlab.lu.se. [130.235.135.183]) by smtp.gmail.com with ESMTPSA id x1sm1340328lfa.21.2021.07.06.02.22.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 06 Jul 2021 02:22:48 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Tue, 6 Jul 2021 11:19:56 +0200 Message-Id: <20210706092020.1057-11-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20210706092020.1057-1-dcnieho@gmail.com> References: <20210706092020.1057-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v3 10/34] 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: HbbUOA3YbyKQ fftools now print info about what media type(s), if any, are provided by sink and source avdevices. Signed-off-by: Diederick Niehorster --- fftools/cmdutils.c | 34 ++++++++++++++++++++++++---------- 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/fftools/cmdutils.c b/fftools/cmdutils.c index 4148285971..390dc77dab 100644 --- a/fftools/cmdutils.c +++ b/fftools/cmdutils.c @@ -2205,9 +2205,29 @@ double get_rotation(AVStream *st) } #if CONFIG_AVDEVICE +static void print_device_list(const AVDeviceInfoList *device_list) +{ + // print devices + for (int i = 0; i < device_list->nb_devices; i++) { + const AVDeviceInfo *device = device_list->devices[i]; + printf("%s %s [%s] (", device_list->default_device == i ? "*" : " ", + device->device_name, device->device_description); + if (device->nb_media_types > 0 && device->media_types) { + for (int j = 0; j < device->nb_media_types; ++j) { + const char* media_type = av_get_media_type_string(device->media_types[j]); + if (j > 0) + printf(", "); + printf("%s", media_type ? media_type : "unknown"); + } + } else { + printf("none"); + } + printf(")\n"); + } +} 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 +2245,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 +2254,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 +2272,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 Tue Jul 6 09:19: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: 28801 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a5d:965a:0:0:0:0:0 with SMTP id d26csp4920458ios; Tue, 6 Jul 2021 02:23:09 -0700 (PDT) X-Google-Smtp-Source: ABdhPJz0l9CwqPCMQXkTlgeNvz43trZW9pnegIGc9uNVui1gAOlOeaQ+Aj0xW5k/ffE8zRVfalDm X-Received: by 2002:aa7:cf91:: with SMTP id z17mr21787571edx.112.1625563389601; Tue, 06 Jul 2021 02:23:09 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1625563389; cv=none; d=google.com; s=arc-20160816; b=fO6tU7kFZe9umn7ETZNhLggKUVROVjGT3h+uakDcbhRkYkpKy05OwASEPliP+MKLa1 hfgAKtB6s5ssZy2uRoIoJmqVr2Mv4HJlWa7yjJmEvPRvepaG0hJrdteGJFPv22LfxMaQ 7noQk5ea9eQBxxrAjJDc4iwXvJCSj9JGO6JRreasiijQ0MR0mq4o5jXBnOa1RORUn7nu OAGl6gjs4VCwmz1QIeM0q6kPBoSJkjv/r68/q5WU2wiAU0EPTyZDut3UAbm13LmiLgeU 4cVc6THCuYh1GlR2JBQh3QSKM/ecUxFgpdu2ZCjqykGIsdPuqOK3Ujr6J1HjZK/3ufJ9 +bZw== 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=cybFjn8vU2wbEPBNJiZZ6c2IktiSehe9ecG1z3U8g9g=; b=a2sxQjAYf+LjmvlHrB3ds+vDb0TH9OblfIWGYXiPjvO5A/yVt9YrbMStZL+PvRFswf eJRABxTSDcOqKgjONaOOzB3rGdOR/fBxnPQdbyjwE/0/pDUWzdLSi0sCtF/+LL+HiI+u OWMQw5fdxqliBXcoqR1NI6mchNndpWOddJ05181/cEIN5Mlctvb5UMBjtr7CjMDoD2PR MgOFmFOFSFMoI50/GEQ+Rklc0vuEXG0cVTRFM8SRn/nVJBeWPVKDUEMXpvK9qfekflc0 N9qTPe/9hiWcrkph0KxVwsIisA7/UFl7JSJN6+533gcIU5NBbJv/Wskh3xGGHArGwJAI cWYw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=PVRNfUKx; 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 d26si14426505ejz.183.2021.07.06.02.23.09; Tue, 06 Jul 2021 02:23: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=PVRNfUKx; 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 6927A68A77C; Tue, 6 Jul 2021 12:23:03 +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 0204168A764 for ; Tue, 6 Jul 2021 12:23:01 +0300 (EEST) Received: by mail-lf1-f45.google.com with SMTP id n14so37173445lfu.8 for ; Tue, 06 Jul 2021 02:23:01 -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=lSs2OxjHJXvD9NUzL/owyYl/U/wnpSBcfyOPhHpEjVw=; b=PVRNfUKxpg3ZuKJrmovzG2P7kcbSMc0gt6NIGB/ZiejnTI5NPUmLWRjbQZeFetJWSj J4rA+213wek4nr9xPTCtwYlEqJ+2fyih2vUdQrwJ9u6S2bBWmtL0cldJVwm6SZOCzAWG 8XCdO4IvDqDwocCLprn2bAw5FjPJ32lXT/JE10oKHyGcxJbhf4M05ruiP3QvLgTBMz59 sOTbsoJYEpQHDzw2yUxEu1fy9jp03j8iyUMs+GF5Ly2DD2GQaHEESdTeNV6GvYWgmSVN RXmW0SUF/AOMbMslC0wdji/0fHXGh+WLfjI/vql7TbKohzfwfS2pwIS5JTPbRQiYkto0 QMaw== 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=lSs2OxjHJXvD9NUzL/owyYl/U/wnpSBcfyOPhHpEjVw=; b=RTQPVQh5uuYnAVk9Ni66fdcRm9svIzQeNUdgVPaDUPN167Ly+oR/eI3wPOCkOqq3es HTjdXVWwvp0blnvKyuZG0X8ZcjI1LgLBuDL8vT+bIVYEGA5uYXBE9e6mVIoZcVUYVHb9 MFRyQtdGrxuO2CQE+zV8Odnu24Q+W0JlwZyQlucYxDPhI2y60xz93fvrxXr0vN3y14l2 AkPhdS/2usHw1AUPAEJ+S2jIkHJdHsFaBp4Oo04BTUciYKO4LU+U6ELJOFA7OkJ8HIUF Dsgo+zaQigFa7+m1SiJQ4T/0MMCTE/9cmftHGmh3at6SCLERC/Bj5ONDvrtAF3GspGgD 7LTA== X-Gm-Message-State: AOAM533iQIDhEGNFAdQ3j01LpULrPby1/u/PRdvOEQV+lXa7zBe+j6AI eEyfLBKCu9U/YvqSCl0mBsvHW3IiDXo= X-Received: by 2002:a05:6512:2207:: with SMTP id h7mr9314803lfu.202.1625563380844; Tue, 06 Jul 2021 02:23:00 -0700 (PDT) Received: from localhost.localdomain (deedock.humlab.lu.se. [130.235.135.183]) by smtp.gmail.com with ESMTPSA id a7sm430360ljp.105.2021.07.06.02.23.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 06 Jul 2021 02:23:00 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Tue, 6 Jul 2021 11:19:57 +0200 Message-Id: <20210706092020.1057-12-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20210706092020.1057-1-dcnieho@gmail.com> References: <20210706092020.1057-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v3 11/34] 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: kSy9w9Gb6AI/ 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 ++++++ 2 files changed, 11 insertions(+), 3 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 cd7b0d941c..ed02b48c84 100644 --- a/libavformat/avformat.h +++ b/libavformat/avformat.h @@ -742,6 +742,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. From patchwork Tue Jul 6 09:19: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: 28799 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a5d:965a:0:0:0:0:0 with SMTP id d26csp4920573ios; Tue, 6 Jul 2021 02:23:21 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyjqhuqs+u2Y+Afgnlvmp+sm0QdU6D6KIUe6MRqTCrKY95oJE5gI8tlOjVxxXNMACZBEl0n X-Received: by 2002:aa7:d283:: with SMTP id w3mr5856746edq.153.1625563400864; Tue, 06 Jul 2021 02:23:20 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1625563400; cv=none; d=google.com; s=arc-20160816; b=WOEE6Wj34iGeU//sAFG3BH+KvJyfxs6XqRBWYTKUzLWdZznAwmN4wOMkA90z348jxE pSyMsEjL51gGnIKbX3CRf6tuzI6djy9E5jApw89N1MroydYz9iI/N1Nzr5BZe1Zr2Mqg 3j8YKCUWVsdG9Ctaxy6tZpJyGeHtI2KSD+V+ReMLF2RLtE+aF4XIqxD8T1VSyH/uMJqH 8wm8gBDIp/bw4rUSWYZUebcrs3P3p+snfHL2u40Ups22k8IO+zPnSFRU7d99pG16hABq QOrl1xAlXMdhftUODhfsbRL0R6WLYuaKbX9JcL6dJrDwBmNv/LmA1QDBpsrlwsboRNes 61KA== 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=FySGTxMkP21Tjlhqv2NelVxQTqXGSULmoR1p3AHIU8g=; b=UQ8c4zwozY/GU+70BsDyMrat/0ZJe4blo2jqTZ42aek3eev1PYlFmLti/KiYOIlp88 e2Xg+2NUReXMJOLB8PSvFUyT8BkVfBwgwKZ+LOceB6Q9WltWoMv2lzmAzzYZU1O65n8L sSAbjVERAiyR5RgxHoeurFDb4/oFy/PqwmjFwvd1Tz1hQFW/fD0ZvJsz5NTRQiJvcYYA 6fVagAKlN3ACZ3g849xcB+SjgZ4MVhzN+wLIFkSZCqvV+r4B7kPnSpMOP84NuCDSaEtZ /kKPpUljyLvw9ISH2W2MT4GdnxwmiIYrREdgyz86Gej4izGK4vSAZKPl5BRMsldKYe+0 WCxQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=KUNECxq0; 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 d8si11376617edv.174.2021.07.06.02.23.20; Tue, 06 Jul 2021 02:23:20 -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=KUNECxq0; 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 7CE7368A77A; Tue, 6 Jul 2021 12:23:14 +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 4814F6801D3 for ; Tue, 6 Jul 2021 12:23:13 +0300 (EEST) Received: by mail-lf1-f45.google.com with SMTP id f30so37189760lfj.1 for ; Tue, 06 Jul 2021 02:23: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=pBGbXpOrCB//XrgoYQHEzqRxwEnSAa2Q6fgsNfUlWv8=; b=KUNECxq0uBy4giLs839/P65a3U5+Zl7OPEmizKMQfUcuO674qYFtUxy0az2Ec/iZC4 UN+BKLahHCi+hSmig0wevTtVOY/WT9KeOfqZGS3iCbORwkWu8Vc4qw5VOUIgAbtlar8c bULTpmEHyEYS8Nd6jFh5YtYs2I3O70/fb/o5+Bn2ul2+CTIUEh94F/Wd97arObqroq6i kDq3zxtqloTd2KMRBuTH7Mo6ZJBUi07nLhCP0ASxdi6iHKJhhsAcTY7wNowSVzfTiJQ0 8wqVQUkbjzDkrTBf1xyT1JDxbnAjmdoNuUz+BlBapbYXKWx8tUTSJR7L19qnNWW6ftfh Nv/w== 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=pBGbXpOrCB//XrgoYQHEzqRxwEnSAa2Q6fgsNfUlWv8=; b=k+KHvtOu+rd0Kk9xUPsBk8v702G5LltM6i4ymnKVHFKykcY0NpxfZmMYpB4Ulqj7T+ kaX73zcJQ2U4H1vaq+cGUEoVQVcpNwsN24/DDijivCTRo6rDzk2s+v6WqJogJPIMhCJ7 ejPWyKrlNOS8xn3zSGYROnjC2qxV6QIE1aeK52uH7WKgNeC0H5zuPAjhhH56aEmhF2Dx jF5kgbGeNe29W7UjyM87ij9l9C9w7ng5qC8OrbGmIAgiznvMj1NJT9JAOcsCes+3CLCm a0rep8/tMvEcOpOCApRDzbVqoxOUD4MKkzUSu8LTGWHl4HaKR1PRqxyiEwJlp7LzbKyY Tl8Q== X-Gm-Message-State: AOAM53038dux4lL2CKx1ZVNxyJ4A9jmALuo7dm8OuNDBKG4H23yil5Kz NNEy+ZPHQs5MB72JBL24HfhhH/ejmRk= X-Received: by 2002:a19:4888:: with SMTP id v130mr7427912lfa.68.1625563392415; Tue, 06 Jul 2021 02:23:12 -0700 (PDT) Received: from localhost.localdomain (deedock.humlab.lu.se. [130.235.135.183]) by smtp.gmail.com with ESMTPSA id w29sm1447179lfu.160.2021.07.06.02.23.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 06 Jul 2021 02:23:11 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Tue, 6 Jul 2021 11:19:58 +0200 Message-Id: <20210706092020.1057-13-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20210706092020.1057-1-dcnieho@gmail.com> References: <20210706092020.1057-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v3 12/34] 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: 2X/xUg0IFnPo 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 dae0ae5d70..3793923acf 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 Tue Jul 6 09:19: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: 28796 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a5d:965a:0:0:0:0:0 with SMTP id d26csp4920696ios; Tue, 6 Jul 2021 02:23:33 -0700 (PDT) X-Google-Smtp-Source: ABdhPJy/rwStMREuLl1iUlzfHyOKastfJxm09+WZ7uA/VBQIcitrpNqpAc0eijKM34CSPbuTFbN2 X-Received: by 2002:a05:6402:2681:: with SMTP id w1mr21607495edd.275.1625563413096; Tue, 06 Jul 2021 02:23:33 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1625563413; cv=none; d=google.com; s=arc-20160816; b=zzUGnaEKio51ZnsUex8UTHriMeXinWb9cIc1CR68abG6bSmX5BVAFo6bICfd38fdDx Ru/b5KHxcLXPONql+C+TJ94CaE1BJ1juhkfzEyo/JnpfGb+00+4nAVvjgRbeBv5YqYCa VCz5pnrtXYbBtlbh0NOkZ2IOcrAPtecPQZYR7x1y5HhkN2jyoSYtMHjIqUQPe8hRIhu/ yu4xaMW/FP9xWxaQ1RL7XZEfGqoXN+h8tSPiIjusYo0bIhlaPukvEhF6jaMsezK1zh9k ij3w8ofmIkHviOmWbVHEI7/Z3nH+Kawez6G9adA/EMwvA4jmNm+gk0iB9z9h6Ro/9SdG Q1ZA== 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=vXzvftL8tNKA6YByCkmhtezNTtx19DUCryBIybLHYH0=; b=rz05yDC3r2/q9C7nEwPKjJhh1GMA1SRnSR6G2PeLlKKVO6kP3iOtES4kKF6oQ13H/5 vZGJZy0dIh2kupzOcgLgEMwM2xviK5jzsif2wv1wuDfH8domObAMBW6yJBD5cn6rMM+o 9ms2EXEyi8s2MffxLtgF5hOfEPVM9iXSlws3uCSYXDaHLbWq2eBp2zYlsildu/NGqZcs DT5oMRF+vL1mgp6/qHL+aNr26QbukqKc0L22Mzn1KWlUzH9J/lXkNHXKTt3OsYdhrSIj j7bTQOQ++BGfg3Pvri3atz99S0lyiJZqZ3QJNneYBU6AYjpTBBmQfaFC1XMxH0MPq2ef d/xQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=F5GJyhZT; 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 q19si14877332edv.125.2021.07.06.02.23.32; Tue, 06 Jul 2021 02:23: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=F5GJyhZT; 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 7E74368A758; Tue, 6 Jul 2021 12:23:26 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lf1-f48.google.com (mail-lf1-f48.google.com [209.85.167.48]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id BDE7D68A744 for ; Tue, 6 Jul 2021 12:23:24 +0300 (EEST) Received: by mail-lf1-f48.google.com with SMTP id n14so37175192lfu.8 for ; Tue, 06 Jul 2021 02:23:24 -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=gdbFtrmMHyQgF9UhHtf/VoQVophBV2w7zjcP62i5XT4=; b=F5GJyhZTXB0jt5Q8Bnj8isGjBbl+ZFgHVCxMdbUEaEIQseH6jCTuVmkV/2uMaOR+jX VJBuRsL5Z4l5LO77QwjShjf1urncWLlDFYJ6Svucx5JgliXeCT+zbZmbquEAFaKbzb6R ad2Gz2G/SVvpbXttApEJAWBsdh7M/Ykht399ejTby1rb9lY9M5BX56imTnQ3A6LuF9Xd 8EBNmN7ZE8oVlRBV9hFD7xVUGe209hJ8RwXmq5b8Nshh4lZgi/WjjI3rixaVFzA2DP2Y qV8W/ZfDCwofVnqrbZEEC4WiZFXg9HkNNVTncfui5YuzRplWux/RFwaJJDwj5uxtrbTs 1jqQ== 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=gdbFtrmMHyQgF9UhHtf/VoQVophBV2w7zjcP62i5XT4=; b=g+8MCBBHH8bJWODQ23fG2SFnwW4hgaEaH3qqjawVFugszVYPqAwL06foPSDkk30Vs3 hOazE/T/Uww39LqYqY09Xrti6DEYX+YN194EKDavhP45jnagxR+XwdN0cTsdevprAsO4 0V3t5oCBaZiTxSbAO7mMNGwELISH5bA440lCsSQRpeFWChFfpNBLbB4H3IXkVE95/uwm QsbTLSxwzM3iOl8ZWy0S1x3ULj0PoW307WofJ5dHJpWiWIJ3Gm5lSefc/Zj1Dv2ruNfH BppaeBx94uaYCxX8gOAOiB8gL7x5Oo3tvTnQR6+zb7RbxP7NaoMrQu8st3MPx4MhhaRu /myA== X-Gm-Message-State: AOAM533xZggo22nye+VjjI+g3QZExTeI6Is0kpdR2h29nRIbDan51dAv Qi87JqtJTUXgvNyc6ZeKDLwyJsM/rVs= X-Received: by 2002:ac2:4205:: with SMTP id y5mr14371986lfh.538.1625563403907; Tue, 06 Jul 2021 02:23:23 -0700 (PDT) Received: from localhost.localdomain (deedock.humlab.lu.se. [130.235.135.183]) by smtp.gmail.com with ESMTPSA id y22sm1339886lfh.154.2021.07.06.02.23.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 06 Jul 2021 02:23:23 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Tue, 6 Jul 2021 11:19:59 +0200 Message-Id: <20210706092020.1057-14-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20210706092020.1057-1-dcnieho@gmail.com> References: <20210706092020.1057-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v3 13/34] 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: gQ0SYXvTGA8A This control message can be used to programmatically ask a device to show one of its configuration dialogs. Adding documentation of this message's int argument. Bumping avdevice version. Signed-off-by: Diederick Niehorster --- doc/indevs.texi | 34 ++++++++++++++++++++++++++++++++++ libavdevice/avdevice.h | 10 ++++++++++ libavdevice/version.h | 2 +- 3 files changed, 45 insertions(+), 1 deletion(-) diff --git a/doc/indevs.texi b/doc/indevs.texi index 685b1357a6..970441ee06 100644 --- a/doc/indevs.texi +++ b/doc/indevs.texi @@ -668,6 +668,40 @@ $ ffmpeg -f dshow -show_video_device_dialog true -crossbar_video_input_pin_numbe @end itemize +@subsection Libavdevice user notes + +The dshow device supports the @code{avdevice_app_to_dev_control_message} +interface. + +It understands the @code{AV_APP_TO_DEV_PAUSE}, @code{AV_APP_TO_DEV_PLAY} +and @code{AV_APP_TO_DEV_TOGGLE_PAUSE} commands, which respective stop and +start whether data is captured from the connected device, and toggle +capture state. + +It furthermore understands the @code{AV_APP_TO_DEV_CONFIG} message, which +requests the device to show a configuration dialog (if available). An +@code{int} should be passed along with this command to indicate which +configuration dialog should be shown. The bits in this @code{int} have +the following meaning: + +@itemize @bullet +@item +1st bit: If set, the dialog for the audio device will be shown. If not set +the dialog for the video device will be shown. + +@item +2nd bit: If set, show property dialog for the audio or video capture device, +allowing to change audio or video filter properties and configurations +manually. + +@item +3rd bit: If set, show property dialog where crossbar pin routings of the +audio/video device can be manually modified. + +@item +4th bit: If set, show property dialog where TV channels and frequencies can be manually modified (in case of video device), or TV audio (like mono vs. stereo, Language A, B or C) can be manually modified in case of audio device. +@end itemize + @section fbdev Linux framebuffer input device. diff --git a/libavdevice/avdevice.h b/libavdevice/avdevice.h index 6f24976dcc..bbeb1ae21b 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 (device-specific). + */ + 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 Tue Jul 6 09:20: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: 28800 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a5d:965a:0:0:0:0:0 with SMTP id d26csp4920833ios; Tue, 6 Jul 2021 02:23:48 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxO+j3FtRSbzr//B4xDPowjWvBsU5SBP8YwTsz5uBagGVdk2WEJsmpliPYyDOXte5xxUURP X-Received: by 2002:a17:907:868d:: with SMTP id qa13mr17729353ejc.173.1625563427998; Tue, 06 Jul 2021 02:23:47 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1625563427; cv=none; d=google.com; s=arc-20160816; b=Ay1wobc3vEbHiLpo0e/Wfq3bI6VW608uJMPg/GE5DZBNBskxCDzQ+LzGn5ON4Vhy1n 6HjF1+Ww6scuVqkEcbk2u+JXBjJit9rqIDZjjZ6Xjx0qMzfn2+PQcog2YGOotmw20o5C 4qSS1v9jEJFCs//PvaQobjCJyFg5HvBuze1KAY6JbnfiZlnibeyRUHF6fuFpWpHC4o8f +Mw5rZmWJuDGOF/l3+m8zEuCz5e1/q440TPCN6WrYKkzWlCwtvkt0TB2AuXiiVe8zb1+ 6CPvAh83H637tpgzZOQkgR5MAHGvhe2KF9EUcdvG/MjLVBryBEatmCdb4T+3oQcJhLRh Iifw== 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=iBRJfUbIbqQbIw8wsS02yHrDfu3dNqFHPdis3HDH8vI=; b=WThlMKaWcG86SfUlaF5JdphVmA5oPVkjFhAWmDBxyXSm37HZ6bNjGv6rqHFNLwV2Oc GZhCVX6HrSpWG46iUp30EKogShxPQ/r2O9CkOJJcKSQzJtmHNwcu00bBvmeDj8R0Yf+t RSJnqaN03RI8lwllCPrx+iC5O7dC3szgC70GwIi3BTIhqusePBw6T1hfng5/IGpG1CVw +0oMkpBNbuATpxioVhQdJBaFhWyWu3aFb6FWSHQT0X/Z6QHGH7BFcBlIccftZWhuZe+U 2qIJ00GLe2BVwateMh0Al/lfRme8EfNZJmsMBC5dNh7eDRkqUieFelhDrBawvA6oGNF8 ZBzQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=EKUyimu3; 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 jy1si15284533ejc.592.2021.07.06.02.23.47; Tue, 06 Jul 2021 02:23:47 -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=EKUyimu3; 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 6530F68A790; Tue, 6 Jul 2021 12:23:42 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lj1-f175.google.com (mail-lj1-f175.google.com [209.85.208.175]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 50E8268A78A for ; Tue, 6 Jul 2021 12:23:36 +0300 (EEST) Received: by mail-lj1-f175.google.com with SMTP id b40so8449772ljf.12 for ; Tue, 06 Jul 2021 02:23:36 -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=uORMR70G6JbnHxKR9LDal66X02UGXT25ssa2n+C8VWk=; b=EKUyimu3lgMmB9JVr6XYhJcC/I465Qs3bk7AM1U/rfpb0uRpz09vPCjrb8aeKpIai7 faD9ph6vScmWor3ezW3UuSPPCsYwdE6SZfLrZFvJwLTTO30ksWJfxBI2LxjRdwsM1xCD jyexL8sKhhO0o6pa7DEEGg9xG8lw51VJiu1Rw2FgIG4CNicicctUnD9gMT6P2cqNZWya UaZCr/VmdgcdymlRmFlCHr+2vYIp34yAgeG4tve9ABSPXcc77UNWIDKbvuHAPvLp+Yzh NR4UHy3EDyui881dWOQgAgrFH9qMNh2qvSEmXOqHrPl5L6evDME4QIeNMNh+/NigFet2 1Cgg== 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=uORMR70G6JbnHxKR9LDal66X02UGXT25ssa2n+C8VWk=; b=G5hvqKkcCOYgtdfzXzcPy//z1y2OS16prlcimarxkJHGZHPNIxFIzDijsI4mg8okqw WY8nixsM1wpvok1fN+gaAodsC8Vgxegm6DeUoRx1Myx7A19gTVGBlfo+5mon1souSAMq kVzkFhDl4GoFRS9KDVtENVScLT9NRQnLLQCsXjRg5qNEdCAcTGea/1INS+EAzs1tK6qe HYYSy0ChUn/pQ5BHnMzli6vIcFiQH+H24RKNyjW/xCqg5EQfHGiLZsrbOWdKoodKrmZq 1TvV5jJo2yr3+z5G8Viu2AzSd81/9wsTOQeatXjz075GvsisWj/J85kAaXfn3pyQImDc RuQg== X-Gm-Message-State: AOAM530TPuenpBVvM7mXvQwhmm6Lluw/KEPyGpHftCi+0hXHEJormPOt yeXn+8H6DPkJH8bNZq0YdgH7JKwvl18= X-Received: by 2002:a2e:7412:: with SMTP id p18mr14646295ljc.428.1625563415528; Tue, 06 Jul 2021 02:23:35 -0700 (PDT) Received: from localhost.localdomain (deedock.humlab.lu.se. [130.235.135.183]) by smtp.gmail.com with ESMTPSA id j13sm1331463lfe.108.2021.07.06.02.23.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 06 Jul 2021 02:23:35 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Tue, 6 Jul 2021 11:20:00 +0200 Message-Id: <20210706092020.1057-15-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20210706092020.1057-1-dcnieho@gmail.com> References: <20210706092020.1057-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v3 14/34] 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: ts97os7ealA0 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 | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/libavdevice/dshow.c b/libavdevice/dshow.c index 3793923acf..e693770b3f 100644 --- a/libavdevice/dshow.c +++ b/libavdevice/dshow.c @@ -1084,6 +1084,7 @@ static int dshow_control_message(AVFormatContext *avctx, int type, void *data, s struct dshow_ctx *ctx = avctx->priv_data; int run_state = ctx->is_running; HRESULT hr; + int ret = 0; switch (type) { case AV_APP_TO_DEV_PAUSE: @@ -1095,6 +1096,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: { + /* For documentation of dialog variable, see ffmpeg-devices.html in docs */ + int dialog; + enum dshowDeviceType devtype; + + if (!data) + av_log(avctx, AV_LOG_ERROR, "Use the data argument to indicate which dialog should be shown."); + dialog = *(int *) data; + 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; + } + + default: + ret = AVERROR(ENOSYS); } // if play state change requested, apply @@ -1115,7 +1142,7 @@ static int dshow_control_message(AVFormatContext *avctx, int type, void *data, s ctx->is_running = run_state; } - return 0; + return ret; } static enum AVCodecID waveform_codec_id(enum AVSampleFormat sample_fmt) From patchwork Tue Jul 6 09:20: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: 28798 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a5d:965a:0:0:0:0:0 with SMTP id d26csp4920953ios; Tue, 6 Jul 2021 02:23:59 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyugXXgJxH7wqkB8V/JY8RBgVdgArwSwFD9G40/ODfG+R0068AKazamzSGbG/CvYgC9C0O1 X-Received: by 2002:a05:6402:1042:: with SMTP id e2mr14557875edu.144.1625563439253; Tue, 06 Jul 2021 02:23:59 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1625563439; cv=none; d=google.com; s=arc-20160816; b=LXF+KniBJevzMu1FJQ5RlpZhgFm4Tcn7bB40htcdXSgwv68FWJNsamLS3jDVqbUx4L JYUy0+uozW0tVYS1wLQK6t9uZFAmhysQdThS4S4cj1qir/uBndNAkPxgEMabISREHuLM pKxETLKAx1A0ViemcT61aaIYFFWiFkXQdAK3zee5IPXvbykVARgdXho7pkjqY/zjqcmV t0XBFRGI6YtnYxrenoxxo9sRugctLvkHjFz8+GVJ0kNni5TW2x5PyctP6TgMI0ULLXBB 4ph49T5GCAuTSkWVlz36GPALfbDGVndH71qZ6bUR5ji+egkb27IbxArsfmqoMPz3nW4J 71Dw== 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=DdPue27c3QISKq4jFONbUUxFtqra3Swzsq3IITW0nPk=; b=m1NWPhZXNN0D+FhE4wN627kIpdtKvyQx8KouE1qEZQ9qMnMwuWiUVo/Ny2LjfzoYIG VKHXE4/Rfo4nJ7mTAvhUJO27191TetjwsMxJ0zL9o6Lz/tlUYEst85G95n9ESh9+CBZK 8Tgp0iSSXKc9kBWXgV7tnPaFwZgskhy06KMU4mW2PAgcJhd2zQdlI1f3bsOzGweOaYU5 QbCZra/6DHICAYDbUZbGOecgsvggtAT8VfIPGAKy72UKZeUJAGq5u1da4cnVWvdOv9pQ Obc+xzLwvZYyh9V7b0OPrUAsOH7RuIm2GKdX4lDBLWYouUpLh9vxcDE6Bfsq0d9EL0mv 1TsA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=HPF1w7d7; 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 t23si15313629ejs.626.2021.07.06.02.23.58; Tue, 06 Jul 2021 02:23:59 -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=HPF1w7d7; 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 7C0B468A7AD; Tue, 6 Jul 2021 12:23:49 +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 E170168A76F for ; Tue, 6 Jul 2021 12:23:47 +0300 (EEST) Received: by mail-lf1-f46.google.com with SMTP id q18so37135493lfc.7 for ; Tue, 06 Jul 2021 02:23: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=SN9rIlY8PdQY3SDxkDGkMVGDwlQJjAoo7o1D+SG5i5E=; b=HPF1w7d7BOf5XAmFflW8WM1WrqQx8nKt/FdQQzEWYDMBuCF8fmEWnlaXP1NFQbkyRV oaXx/wvjC3xZwM99VCQ9dTuDM8ucYAomST1h45HZkMIrGmnND0/+JRHFXl0ggMABoK7S c1GbZvdTx1WbgHp+h1T38jUJzzrxplr5soEBefdSYGUN6ZWEl4B0pDAm53JmVv8hdam/ 4dMmJz3T6+RbUfW1qfzO/ZUhMdJA+X38VaIrIO8LnqPpJjDFn0aPFyYTOFlMDjW8d+tl hLWQhHjQHJGyulw2O+xctFNLfU8B2065Pt6Heo2QQ8g0LKQHUkBH3Af17nt6+rnWVFcQ V42Q== 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=SN9rIlY8PdQY3SDxkDGkMVGDwlQJjAoo7o1D+SG5i5E=; b=EJ8UuiH2g8guVuVku8efsvXa7lOaX2pglyCbcfc9XAkBAmb4ZYQo8Co6w6gYPHgrIq Zheb86cZrzsu5JmlV7VTlNRdVKvJFvCQs4dPPkEb4SbgNv/qJVQL8SWQNn9fSPMAhbWA amHu4y4BSvZvrEbJEc+5kthF57x3kyl6XaxTCFETrzQr41yb6IZci1S1hafgI2VZYlAB W1kslLlsBiFBSyZE3G35oUyaWV6kmNLRlhkGkez7F4x8rJ5GgmZr+DZUf29Vlkb2mhOY aB0FNWRWGnYZU8/aHPmTWZf2dVPS5pGmLxHU0NPc1zD3lc7alyeHYqL3rTTfgzxQI/pp 9hlA== X-Gm-Message-State: AOAM5325Z/4GjdoNMI5NbWt17DRzF9qhSVlJ9rBN8AZCTaMLfub/bZ49 EZ6ROxQyN7HqR3ycdSlNtKDqaojN1v4= X-Received: by 2002:ac2:5e29:: with SMTP id o9mr9791815lfg.526.1625563427065; Tue, 06 Jul 2021 02:23:47 -0700 (PDT) Received: from localhost.localdomain (deedock.humlab.lu.se. [130.235.135.183]) by smtp.gmail.com with ESMTPSA id u25sm689117lfm.131.2021.07.06.02.23.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 06 Jul 2021 02:23:46 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Tue, 6 Jul 2021 11:20:01 +0200 Message-Id: <20210706092020.1057-16-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20210706092020.1057-1-dcnieho@gmail.com> References: <20210706092020.1057-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v3 15/34] 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: ROxeb437L4se Cleanup was missing for when the show_analog_tv_tuner_audio_dialog is true. 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 Tue Jul 6 09:20: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: 28835 Delivered-To: andriy.gelman@gmail.com Received: by 2002:a25:bbc9:0:0:0:0:0 with SMTP id c9csp4366976ybk; Tue, 6 Jul 2021 02:24:12 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwwoTG24stayZXDRKkhMLkC3GFbZNkXGQwvoic3iJ24GAkAgTJ7VTIPFqBf7gvq7kNyF/B2 X-Received: by 2002:a17:907:98ae:: with SMTP id ju14mr9464077ejc.365.1625563451983; Tue, 06 Jul 2021 02:24:11 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1625563451; cv=none; d=google.com; s=arc-20160816; b=cXF+fArBxv6T0oDa+zBOAxg8HUxN9GBuMrmPZzMK5gUpLDqNZrVl9EOlcCprXhqFWC XKo+6jyHEnMSpAIKGzbddtHkedoRpcgHVgDJdQ//VY0h/0vUKrGVICbvYqw6hnVbA1F8 vf7Dd76j8pLDZmQfJo3Q1Pa4VxM7g4eQeQy25T7jAoY8VGEUdTm1ZIEoTyC80uFTUpFC DoK4NrhfN5jkt+xJjUQdckPXznwdd4W19pbnKXLgJu19/QlfLG8YkotCjxf1p0zMyN77 +5N1Zz6XciCfxs8bS0HqbwDuAmZ2qGOWoQT1mBCl4J2w3x0BZg3rYCL2e/YMMXVzQIxd gxDA== 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=MiKnqTr23HgU6nwTv/3g1pjtE0gnT1NxmIOScopFiWw=; b=TKTRdK5I3uZ0fBjgFFrPS7uAQ2nH4eAAtoIhpfHK0UUuwjHV5CEOjTsQsLndftwaQx 1YZA//A67NSpbqBsfT190OXe0+ZTKXul4gdQOEJUdnj4AOtmgRSnF4pEav4oFvN0+sQH uj24n2s1YMiDeszsKSZD0AOf3p93E2WaBCn3MeKke2cgEMuvY8cC3KgHHVUcwikUa+OV 1U2Y0HEvwAGLwyW4WNdcoZKD22KIpkaoVssu5SqGnn/SsGcWHZNPNpwNTGvwVBDrI9mG FaaxFsdxFjUgsHkpvc3NjPUyBnX6tcW9Xolb+yeItEQ4ApHmcnd1p32nrtYoYLIaze93 Cxdw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=ukn2MPlg; 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 di1si1947615ejc.420.2021.07.06.02.24.11; Tue, 06 Jul 2021 02:24: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=ukn2MPlg; 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 D6FE46808E6; Tue, 6 Jul 2021 12:24:03 +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 43C6168A785 for ; Tue, 6 Jul 2021 12:23:59 +0300 (EEST) Received: by mail-lf1-f53.google.com with SMTP id t17so37251269lfq.0 for ; Tue, 06 Jul 2021 02:23: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=7HZm7YscbjGgnCFWf7FvOGy9u5n6oKQBFMnJzV5NW9A=; b=ukn2MPlgn4d/add7Krt6UNZbzEDiEMtcZYwg+Tp72Q3U0jX6E+8++pEaW2D+CHxekZ KbWmt567b46leCFsBnfc9iA+o7qyZtLQVIFhVOfuOVS708kldhDY6+YfKjf3peyfQxc2 KhZizoXUtSKAEv6D3mqiNPOMiMd/xxxXxF0lrl4v/AHz2DfCKXF67cYaC2JJXPBP2dVe T0/BCb3/iyduqVsdPvrhZomgNvqM9tCboVNyS9nTsdKxECEDM+qF/jiBuZjg/+vuTJ7u eBisgmp/xXVpjzKOFuCTy2ygNloIVidgzJ996SnXMwd7F+w4Fbg+xstqpV1ITMs32mQS zilA== 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=7HZm7YscbjGgnCFWf7FvOGy9u5n6oKQBFMnJzV5NW9A=; b=MMJkTdbsXPK4iJ8EG81g0ldICDldyO49/9vhX+Gj2bQujBJUkqpg4a1CODNpjWvCrv s6oFb0QAl1jvXbi6MtD+egVuGbe9YanLqVwGwARGuuc9SQBuY9BGeZCblEQiqDqrLg5D 5uwPMMX2G5bYcZNXBBmBWK2y770JqLn0HKqs/xwSVq07bHe+OHEsUtKDC87Bmw9lNBsy 31y9zasS6CJ2d32xOxLGDqD06aNJM8TUZo+DdSj/uJs9NkOm51MABdZtwWYvGR3NwRNW FuBhLnRn18y4YHwu23Ve2S8oMnm5O4yBG+jlOoOaLnU4bfG+NJ8APhZSglYWwsv+XTZs nZCQ== X-Gm-Message-State: AOAM531w6i2hXBS6oPYP1sMNI6HvAozQjsjzBP3HyOQoYMDohXBD1Ixb 0iC2g8P7Q1h4e5eUSAOMmdqf5jlZCi0= X-Received: by 2002:a05:6512:550:: with SMTP id h16mr14189290lfl.636.1625563438572; Tue, 06 Jul 2021 02:23:58 -0700 (PDT) Received: from localhost.localdomain (deedock.humlab.lu.se. [130.235.135.183]) by smtp.gmail.com with ESMTPSA id y12sm582603ljh.19.2021.07.06.02.23.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 06 Jul 2021 02:23:58 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Tue, 6 Jul 2021 11:20:02 +0200 Message-Id: <20210706092020.1057-17-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20210706092020.1057-1-dcnieho@gmail.com> References: <20210706092020.1057-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v3 16/34] 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: tb8aX3bODng+ Content-Length: 11843 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. Signed-off-by: Diederick Niehorster --- libavdevice/dshow.c | 51 ++++++++++++++++++-- libavdevice/dshow_capture.h | 10 ++++ libavdevice/dshow_crossbar.c | 91 +++++++++++++++++++++++------------- 3 files changed, 114 insertions(+), 38 deletions(-) diff --git a/libavdevice/dshow.c b/libavdevice/dshow.c index e693770b3f..61e14a4c82 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); @@ -1112,10 +1115,48 @@ static int dshow_control_message(AVFormatContext *avctx, int type, void *data, s ff_dshow_show_filter_properties(ctx->device_filter[devtype], avctx); } 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 Tue Jul 6 09:20: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: 28844 Delivered-To: andriy.gelman@gmail.com Received: by 2002:a25:bbc9:0:0:0:0:0 with SMTP id c9csp4367112ybk; Tue, 6 Jul 2021 02:24:24 -0700 (PDT) X-Google-Smtp-Source: ABdhPJy2tDs/E5ZtarYTOogMhh74NSy3DxHLK4RJeZdGNt2qPknz8L6YcGVBKDqMh3D45zq3ZP7o X-Received: by 2002:aa7:c799:: with SMTP id n25mr21091434eds.16.1625563464146; Tue, 06 Jul 2021 02:24:24 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1625563464; cv=none; d=google.com; s=arc-20160816; b=rxc2UgYvJWxfrec6KP69zXDx6dbgmYWjJbv4WxzkZON2aeoND980w579VajZIC8T4l FpL9gRImU0azxzKpiDFPkRvFjSRNnTdS5wvVfx+dQ6zuQFsPNVj1h1CFaEv+5exdsefm ZnN7YX4cZxJPFZrJPUFAc0NKTDE3kN94ByzH/LS5NxqVkh8OJkiJAvdmeu79p5zpd/o8 KzqC+WbTgE7geNJhQ6jFMjl6zzF54aeWxm9hUNgW3DvMWJqD6JCCG1anxltefFw60kUr ZfyjlH8WH/PysJS9Vc+hRXm3PHAJ0dh87kfkzMG8penQtApo2vXvW3hvsaHy5a0VKghn md9g== 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=wEy50abFS9Scl8GNjHwOY8fFNnFnrwHTqY9N9dBlA1M=; b=fP9JBag8rx7J/hFKIZ+pg3AsnYoVjFNusscbsDza1GWyx4YuUWFFjHRDdTpuHbi08Q o1+NAdWFOwJNvxGfbdlC7I2mxBcZeXUnvLbiYti8PmMpC3rCNUzMnVCnybDlaMMK34Ib ZZDg5GZC/+gm53JHgvT/Nne4OIQSfDWua/Op2gZXjRtMqcAXXItAWGDt+yu9Av+ml0kX bzIcc/+mkRwBY4ABb2FNIHbMx6zEWIjQMjGaiVpqG4FWsMbQNMSyT+igGO4eMui8hIfC KxgiYRDIJ5UYIwm5quNh/acoFBwyY2yzB1TlgAL2jxV7S8psl/uTbGSsHSuCsALLFNmr I6dw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=j7FU0q1b; 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 el21si14104429ejc.403.2021.07.06.02.24.23; Tue, 06 Jul 2021 02:24: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=j7FU0q1b; 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 EB9B868A7C9; Tue, 6 Jul 2021 12:24:15 +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 899F868A7C9 for ; Tue, 6 Jul 2021 12:24:11 +0300 (EEST) Received: by mail-lf1-f52.google.com with SMTP id a18so37128038lfs.10 for ; Tue, 06 Jul 2021 02:24:11 -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=piCnrV+iYBYn8Y3taMgRzLoa27114GpSMqrub5y25yk=; b=j7FU0q1byCUJua3F4wQQBnVx9oliYFeNnd8W7DL6hk2gEWZH1hBxa5Z+/u4oqexwIR eGFutMlYMdZ/Sjk11HekZIpMYytJ2m3LtGbK7WfZc9Jp5OffqPS7xPoZwM2Q+/xwQ01c 6mag/FfW970mEE/M2CDVlLUqA6ieRHrNK9shWfokOQlUA4RpsSk9mlkij1xhqhNKIBQJ HXxT0h2rM+0R2IHURdIpn0Lo8spBQv6SWEYPIeMVsa/fqbEeem+3C6u7f/1XVukSEKOI 2m47rsLRyT3qiwIUPN4iEUiLviQEeIAu13PC6SWGX3VplWbit2IXvjDPO1s0Ve4uVAKs yPTw== 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=piCnrV+iYBYn8Y3taMgRzLoa27114GpSMqrub5y25yk=; b=cjsZzUUjYnWOkqAKGHX8/wdTF4IjB3hDS7bV0K9D+a3AKi8S1BtR+VZDkPVNzqksEf e6sXnNTEwt4Zv73w7dimhv0JeGs+iZLJ63Uw7JyoTJgLyAQlakYncIkE3bfgmSUzoFdj Iiurbt2fGRDn0eCB2H+7Gtft2ruu+baXx3RX0TTwvBYcF7VrMOmXWLOMZQLf7VZ9NMlB UWwxHeCP80bfecoTz4durBQnpcQP9lo3rLLC6UqEaxt50p0K8JdChk78kMxRZxiAcEC3 420uetZoNbI1IWqmNyKjEeCSLaVIiUAK8t7iC4jNOhvXhqrj7lmc23xmLQQDbTUlu7pE Ua4w== X-Gm-Message-State: AOAM530nPotJSdTsQkZc8DihH0WVW3nfatPL0mrIaNL2PhL5DiZ7KKad xjeQXegvwO/H/yUjYTMzUcLlYuT3fOg= X-Received: by 2002:a05:6512:54a:: with SMTP id h10mr13978254lfl.386.1625563450112; Tue, 06 Jul 2021 02:24:10 -0700 (PDT) Received: from localhost.localdomain (deedock.humlab.lu.se. [130.235.135.183]) by smtp.gmail.com with ESMTPSA id a29sm229569lfk.293.2021.07.06.02.24.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 06 Jul 2021 02:24:09 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Tue, 6 Jul 2021 11:20:03 +0200 Message-Id: <20210706092020.1057-18-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20210706092020.1057-1-dcnieho@gmail.com> References: <20210706092020.1057-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v3 17/34] 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: GpRfo6zlmDev Content-Length: 15199 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. Co-authored-by: Valerii Zapodovnikov Signed-off-by: Diederick Niehorster --- libavdevice/dshow.c | 255 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 254 insertions(+), 1 deletion(-) diff --git a/libavdevice/dshow.c b/libavdevice/dshow.c index 61e14a4c82..d941107197 100644 --- a/libavdevice/dshow.c +++ b/libavdevice/dshow.c @@ -29,6 +29,31 @@ #include "libavcodec/raw.h" #include "objidl.h" #include "shlwapi.h" +// NB: technically, we should include dxva.h and use +// DXVA_ExtendedFormat, but that type is not defined in +// the MinGW headers. The DXVA2_ExtendedFormat and the +// contents of its fields is identical to +// DXVA_ExtendedFormat (see https://docs.microsoft.com/en-us/windows/win32/medfound/extended-color-information#color-space-in-media-types) +// and is provided by MinGW as well, so we use that +// instead. NB also that per the Microsoft docs, the +// lowest 8 bits of the structure, i.e. the SampleFormat +// field, contain AMCONTROL_xxx flags instead of sample +// format information, and should thus not be used. +// NB further that various values in the structure's +// fields (e.g. BT.2020 color space) are not provided +// for either of the DXVA structs, but are provided in +// the flags of the corresponding fields of Media Foundation. +// These may be provided by DirectShow devices (e.g. LAVFilters +// does so). So we use those values here too (the equivalence is +// indicated by Microsoft example code: https://docs.microsoft.com/en-us/windows/win32/api/dxva2api/ns-dxva2api-dxva2_videodesc) +typedef DWORD D3DFORMAT; // dxva2api.h header needs these types defined before include apparently in WinSDK (not MinGW). +typedef DWORD D3DPOOL; +#include "dxva2api.h" + +#ifndef AMCONTROL_COLORINFO_PRESENT +// not defined in some versions of MinGW's dvdmedia.h +# define AMCONTROL_COLORINFO_PRESENT 0x00000080 // if set, indicates DXVA color info is present in the upper (24) bits of the dwControlFlags +#endif static enum AVPixelFormat dshow_pixfmt(DWORD biCompression, WORD biBitCount) @@ -54,6 +79,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(DXVA2_ExtendedFormat *fmt_info) +{ + switch (fmt_info->NominalRange) + { + case DXVA2_NominalRange_Unknown: + return AVCOL_RANGE_UNSPECIFIED; + case DXVA2_NominalRange_Normal: // equal to DXVA2_NominalRange_0_255 + return AVCOL_RANGE_JPEG; + case DXVA2_NominalRange_Wide: // equal to DXVA2_NominalRange_16_235 + return AVCOL_RANGE_MPEG; + case DXVA2_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 DXVA2_NominalRange_Unknown; + } +} + +static enum AVColorSpace dshow_color_space(DXVA2_ExtendedFormat *fmt_info) +{ + enum AVColorSpace ret = AVCOL_SPC_UNSPECIFIED; + + switch (fmt_info->VideoTransferMatrix) + { + case DXVA2_VideoTransferMatrix_BT709: + ret = AVCOL_SPC_BT709; + break; + case DXVA2_VideoTransferMatrix_BT601: + ret = AVCOL_SPC_BT470BG; + break; + case DXVA2_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 DXVA2_VideoPrimaries_BT709: + ret = AVCOL_SPC_BT709; + break; + case DXVA2_VideoPrimaries_BT470_2_SysM: + ret = AVCOL_SPC_FCC; + break; + case DXVA2_VideoPrimaries_BT470_2_SysBG: + case DXVA2_VideoPrimaries_EBU3213: // this is PAL + ret = AVCOL_SPC_BT470BG; + break; + case DXVA2_VideoPrimaries_SMPTE170M: + case DXVA2_VideoPrimaries_SMPTE_C: + ret = AVCOL_SPC_SMPTE170M; + break; + case DXVA2_VideoPrimaries_SMPTE240M: + ret = AVCOL_SPC_SMPTE240M; + break; + } + } + + return ret; +} + +static enum AVColorPrimaries dshow_color_primaries(DXVA2_ExtendedFormat *fmt_info) +{ + switch (fmt_info->VideoPrimaries) + { + case DXVA2_VideoPrimaries_Unknown: + return AVCOL_PRI_UNSPECIFIED; + case DXVA2_VideoPrimaries_reserved: + return AVCOL_PRI_RESERVED; + case DXVA2_VideoPrimaries_BT709: + return AVCOL_PRI_BT709; + case DXVA2_VideoPrimaries_BT470_2_SysM: + return AVCOL_PRI_BT470M; + case DXVA2_VideoPrimaries_BT470_2_SysBG: + case DXVA2_VideoPrimaries_EBU3213: // this is PAL + return AVCOL_PRI_BT470BG; + case DXVA2_VideoPrimaries_SMPTE170M: + case DXVA2_VideoPrimaries_SMPTE_C: + return AVCOL_PRI_SMPTE170M; + case DXVA2_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(DXVA2_ExtendedFormat *fmt_info) +{ + switch (fmt_info->VideoTransferFunction) + { + case DXVA2_VideoTransFunc_Unknown: + return AVCOL_TRC_UNSPECIFIED; + case DXVA2_VideoTransFunc_10: + return AVCOL_TRC_LINEAR; + case DXVA2_VideoTransFunc_18: + // not an FFmpeg transfer characteristic + return AVCOL_TRC_UNSPECIFIED; + case DXVA2_VideoTransFunc_20: + // not an FFmpeg transfer characteristic + return AVCOL_TRC_UNSPECIFIED; + case DXVA2_VideoTransFunc_22: + return AVCOL_TRC_GAMMA22; + case DXVA2_VideoTransFunc_709: + return AVCOL_TRC_BT709; + case DXVA2_VideoTransFunc_240M: + return AVCOL_TRC_SMPTE240M; + case DXVA2_VideoTransFunc_sRGB: + return AVCOL_TRC_IEC61966_2_1; + case DXVA2_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(DXVA2_ExtendedFormat *fmt_info) +{ + if (fmt_info->VideoChromaSubsampling == DXVA2_VideoChromaSubsampling_Cosited) // that is: (DXVA2_VideoChromaSubsampling_Horizontally_Cosited | DXVA2_VideoChromaSubsampling_Vertically_Cosited | DXVA2_VideoChromaSubsampling_Vertically_AlignedChromaPlanes) + return AVCHROMA_LOC_TOPLEFT; + else if (fmt_info->VideoChromaSubsampling == DXVA2_VideoChromaSubsampling_MPEG1) // that is: DXVA2_VideoChromaSubsampling_Vertically_AlignedChromaPlanes + return AVCHROMA_LOC_CENTER; + else if (fmt_info->VideoChromaSubsampling == DXVA2_VideoChromaSubsampling_MPEG2) // that is: (DXVA2_VideoChromaSubsampling_Horizontally_Cosited | DXVA2_VideoChromaSubsampling_Vertically_AlignedChromaPlanes) + return AVCHROMA_LOC_LEFT; + else if (fmt_info->VideoChromaSubsampling == DXVA2_VideoChromaSubsampling_DV_PAL) // that is: (DXVA2_VideoChromaSubsampling_Horizontally_Cosited | DXVA2_VideoChromaSubsampling_Vertically_Cosited) + return AVCHROMA_LOC_TOPLEFT; + else + // unknown + return AVCHROMA_LOC_UNSPECIFIED; +} + static int dshow_read_close(AVFormatContext *s) { @@ -522,6 +733,7 @@ dshow_cycle_formats(AVFormatContext *avctx, enum dshowDeviceType devtype, VIDEO_STREAM_CONFIG_CAPS *vcaps = caps; BITMAPINFOHEADER *bih; int64_t *fr; + DXVA2_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 +746,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 = (DXVA2_ExtendedFormat *) &v->dwControlFlags; } else { goto next; } @@ -550,11 +764,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 +1476,7 @@ dshow_add_device(AVFormatContext *avctx, if (devtype == VideoDevice) { BITMAPINFOHEADER *bih = NULL; AVRational time_base; + DXVA2_ExtendedFormat *extended_format_info = NULL; if (IsEqualGUID(&type.formattype, &FORMAT_VideoInfo)) { VIDEOINFOHEADER *v = (void *) type.pbFormat; @@ -1242,6 +1486,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 = (DXVA2_ExtendedFormat *) &v->dwControlFlags; } if (!bih) { av_log(avctx, AV_LOG_ERROR, "Could not get media type.\n"); @@ -1260,6 +1506,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 Tue Jul 6 09:20: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: 28836 Delivered-To: andriy.gelman@gmail.com Received: by 2002:a25:bbc9:0:0:0:0:0 with SMTP id c9csp4367274ybk; Tue, 6 Jul 2021 02:24:38 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwURJ/xbueHeRTAV/f8k7lJudx39mEyfbtE+VQ9RexJ69sHaeIFYqIOYi753GAk1ZYAkNwe X-Received: by 2002:a50:ec16:: with SMTP id g22mr11216318edr.222.1625563478227; Tue, 06 Jul 2021 02:24:38 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1625563478; cv=none; d=google.com; s=arc-20160816; b=QePlCV3TXyF5UR5+sYRXX3Bsrs1vg3grm5T83KMyMph6mqOnkLjEx8+ea4fVfUKfA8 HdFukyDtr0AZk7PFuhQ/Nvz2EpqOFNEF/v7LEcRXNSVdH35X0V67Oqwgu92nytnFN15f PoQ7gxqfYzH74wfkSaeRBhVd8G+9cu1xUa8b3W1TmPc0TRLhZpPMNqnrwRV3hboFXPoC fK66gwJfmZnyJEufkrnYzxqaRalzCSFFJh+gSK99dTUsn7IQfbF7ZcmBzJW/GzIztJR0 x8e9nMKXcAuxcJhSyV9lGbIKWXi2H3cBCejyUz5uF4LhzK8tQm2+dQhUHp/JSsvbYpjw 34fA== 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=kw5LRYayWBaEDN2cpH7DbtCT5J6KLkztS+t48tgPrZU=; b=yBMGzbNe//hJvVemHN8gB1TocX+iE7Zm9wNk2xVKlxn8dZ+YHuS9pr9Blil0N9ngkN cQCB9/Akc0v20/fWSlLC5kLY+TwnwgqqIQ7OYUYb9iE2bzZkdU/lIQMahEF+m0VEd7jg 74F+K5yAVgZH+2Z8e6Mcg+3HXqmtoVhz49mjfFrlhDCtEDC4VUzGHCh2TBR/nnDJvQcK Qkz6JaMvJ/9/co2g8fSrQZNlhkzqR8AUvKYICBDK/k5Pvc7dXg9GA6g+T2NIRouyJdYs zou3exsAzkG1ixQ9M4BdXYgR4kHgWMHGhM88D34/QMPErpC3meVgZAKXZZbbvxk/LOMc PFnw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b="gbg2MJv/"; 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 h4si14223759edr.283.2021.07.06.02.24.37; Tue, 06 Jul 2021 02:24:38 -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="gbg2MJv/"; 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 1270868A7E5; Tue, 6 Jul 2021 12:24:25 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lf1-f44.google.com (mail-lf1-f44.google.com [209.85.167.44]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id F1EF668A7E5 for ; Tue, 6 Jul 2021 12:24:22 +0300 (EEST) Received: by mail-lf1-f44.google.com with SMTP id p1so1457042lfr.12 for ; Tue, 06 Jul 2021 02:24: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=t1bu0NUEvElN09gDquytNmyLk7RNNhzDiVeqUl6kILA=; b=gbg2MJv/3tttz7zOfhtosKmol1INj6+FXCwn6TUFZgDKj8FjVTau5vjsvHvzLppl9w ZVS5dJQ8ah8YXqooLVGe5e+9dKBnKOGYdMTUrjmKgndxlDmolj744OX5KFd/sIWEMQpW T6dTjHUnAwXwoJ5USaUEytDxZoJMsl9pyirDxqyh2pK1nwNsXDiV8cboH3bbzsP/qVDV w5UEqH6tcWQ4fmZwjTbUVlmnDf/MpAZCxjFTXe5njPbnp5x99CwqG/DioBcQKQHCSUBc DHarB2jOa1HvWj/RZ2dGlUPttOOa8BE2+fFDXG/+rjODwcvSHGBHyWKWLcOONsQCvjAX OUgg== 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=t1bu0NUEvElN09gDquytNmyLk7RNNhzDiVeqUl6kILA=; b=tMkk4w1tbK5WNhS0pPOk8sZCgs6dixWLD2yUh/Y33rqJ2D5zCPd3fNdzVJTixELIAa g5Wx7sq6JVB7ErP4/Ft08G0pciN6YPFa5PkD+S87K9jPrQeONwOdwTYCyBSc1bHC2EMc XKwTJMaoEl/IMxRG8gxF31Mq+ATZqLo0MNXpYhdooJEhHRCEY5X/GDLStUTZSn3sMPBG e+bOU9piJSEuD6q1fE0eb36bwYbpIpS7GXUhr9u0v+7FCml4B5Eofv5WoR0G2263vzPg AlZqvrn5wCDmSgRkV6oTA3T1lT5FzZ/ZpTomqPsxvearrVYEe/rQF8ORHuhXYRabTbp7 e0KA== X-Gm-Message-State: AOAM532Zt4pCEaLjv6cpSLpa4yf8YOlJOI+oIrq7I9hpzPKEjQqYB4Ud xcmlaTEoganAVqQVJ0c5fPDhuvIEk2c= X-Received: by 2002:a05:6512:3caa:: with SMTP id h42mr13756517lfv.613.1625563461606; Tue, 06 Jul 2021 02:24:21 -0700 (PDT) Received: from localhost.localdomain (deedock.humlab.lu.se. [130.235.135.183]) by smtp.gmail.com with ESMTPSA id q3sm1342158lfg.178.2021.07.06.02.24.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 06 Jul 2021 02:24:21 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Tue, 6 Jul 2021 11:20:04 +0200 Message-Id: <20210706092020.1057-19-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20210706092020.1057-1-dcnieho@gmail.com> References: <20210706092020.1057-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v3 18/34] 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: 4gyEh/7gVkfp Content-Length: 31451 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 | 457 +++++++++++++++++++++++++++++++------------- 1 file changed, 329 insertions(+), 128 deletions(-) diff --git a/libavdevice/dshow.c b/libavdevice/dshow.c index d941107197..5b9f61926b 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" @@ -695,9 +696,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; + DXVA2_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 = (DXVA2_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. */ @@ -708,9 +811,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; @@ -721,7 +842,83 @@ 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 formats of the expected type + 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; @@ -729,101 +926,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; - DXVA2_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 = (DXVA2_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; @@ -842,34 +1034,62 @@ 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) + av_freep(&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) @@ -988,11 +1208,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; @@ -1012,9 +1228,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; @@ -1057,35 +1271,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) @@ -1457,6 +1660,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; @@ -1471,12 +1675,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; - DXVA2_ExtendedFormat *extended_format_info = NULL; if (IsEqualGUID(&type.formattype, &FORMAT_VideoInfo)) { VIDEOINFOHEADER *v = (void *) type.pbFormat; @@ -1486,8 +1692,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 = (DXVA2_ExtendedFormat *) &v->dwControlFlags; } if (!bih) { av_log(avctx, AV_LOG_ERROR, "Could not get media type.\n"); @@ -1498,33 +1702,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) { @@ -1537,6 +1729,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; @@ -1561,6 +1761,7 @@ dshow_add_device(AVFormatContext *avctx, ret = 0; error: + av_freep(fmt_info); if (type.pbFormat) CoTaskMemFree(type.pbFormat); return ret; @@ -1863,8 +2064,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 Tue Jul 6 09:20: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: 28829 Delivered-To: andriy.gelman@gmail.com Received: by 2002:a25:bbc9:0:0:0:0:0 with SMTP id c9csp4367383ybk; Tue, 6 Jul 2021 02:24:50 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyw0MThlDUHL1aVAWtuKBPSJj34VRi5JmjRF/4RexU0fNRL6vFlFRmxgu3yq6bvxaVum7Xy X-Received: by 2002:aa7:c34a:: with SMTP id j10mr13488800edr.86.1625563490260; Tue, 06 Jul 2021 02:24:50 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1625563490; cv=none; d=google.com; s=arc-20160816; b=EEMME06nq63GrI/vyn123S0xHN7NzY42TnbM1au8l7OHVbgB6W7kbhxgakOlIlndD0 v8iE2ooW1NDkFIZAPTitQ85pflCVoGt/h7CNafcTt+oTHKjW6cebe7ThehCpHhEZK8tL Vzuj5UvjGdWM9mSGdPlUbJeHEuhoqwyUxGWtxFH9FSieBqWZoziEPmDl9i1FiQILqk9s mvjDJ0g/T+mf1ZO7fev9Ce8wZEgilLwJrr7YPxijkSk+rsO2LGYV31eaRLHExbBtq0MF Lqpvvt3pm13+BiKKJR5LNaaW6NAshd9Up4+nuJHOG0Z1csaCaP4URYh7tXnW4fILBIrH g38Q== 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=F9HADFYZWhrj2Z6QWWBppRzfuaFM4WqDwDpovowPpUc=; b=00qxhC6TwGvHfamsHzotzEfVbtYrStx0tL/Xf/uSIHBtqRKV3gs28S9cQ9m5TrbYKp 7mUzOCHGegNPuU9o3gYBSD6U3QIclDZSmFnwlRBjN8c4om79r3GAuigbNTN3jrA5jejw kLpRrsJPMBEgTx3IFkiKwa6cXQxTuli/tvrj6DOXjI39VucDzO5dgyg0NAmYOOWqFuvF RTLeZqr1TX9CLc5puipuqv/ivvKS5+rQGCsJKKe8exdPqUzclFPLH6jzel5rDMRBRDGb SNp8qJVai5PsbyCBzJftDh/T0plm8S7D+V6MvLQw/ZZXMqMugeG6ENMWpS/DQNwYXbOZ 4Czw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=Q1gtQEUa; 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 eb13si16439640edb.290.2021.07.06.02.24.49; Tue, 06 Jul 2021 02:24:50 -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=Q1gtQEUa; 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 3C96668A790; Tue, 6 Jul 2021 12:24:36 +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 BF8C368A790 for ; Tue, 6 Jul 2021 12:24:34 +0300 (EEST) Received: by mail-lf1-f51.google.com with SMTP id p16so9709303lfc.5 for ; Tue, 06 Jul 2021 02:24:34 -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=F1Vb9QwOkJ+5k9zCsQgnCQMrhQQDeZuGL8C0Il6DaVg=; b=Q1gtQEUa0zFGeLyt+lx/mIbyWyIN/6ZXlD1RBDlg1GgLfklRu9PM74jVCVQc66Dfci jdsjo3AqTpz2KJO6WEviYDRR6xH86osk5WYLRtoq1BFGR1gn1nmagGACIjAouxV8tbVZ L5KOOOuUiTgLWebV74iYMntMYqkkq49kwh/34Lkoouwp2RtYIB+o0AQE2xObkz3/UovN aao4SgR+dlzThuH4WR0zZLImTMEhcGfSQ8ZF0LxUlegD8hSwadfdYEM3olZYU5sTxmrh IQiVzBxSz08dcXFmt1fzg6+SCAFVrbjrvuMSfYyanJhhg5kZcvPBxFMx5mNMeP5l+KOP sqLA== 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=F1Vb9QwOkJ+5k9zCsQgnCQMrhQQDeZuGL8C0Il6DaVg=; b=rG+VwGcxy/kVTV4cpweG0F9kuUeXTvrljpPpPL0Ia2btUX2+LmLv6uMuFul75KlHoe OZlTPTW7fC3U25FXDhpfLgErHkRs/MfTf11RlraWFfkUjx6JHz6VXNGbZvWq9G9DAAdy /sVI6ozQfnP/0aLVISSeqmKnyWqMPDNj3B0jt7Ih1zloMkzngGx4w5jRpaQRHHXg0Egj 6xbzzNHqgKl+2WXwwnGmvGApmnSXlyNPmhdqwj5nNznEh2UWNs/pvI6F3ZLOCuEV8D2G iCJj+j6vgS2e5ROyuL7+k5R5ziDAIB1Sv7ji1OSzKQjgj/o5YvwPaSj5RED6Ktfz3PLF 0rAw== X-Gm-Message-State: AOAM532p7FIXoP5OEqRBXTcOycdVDeaI6FFwnGAgBShBOaolhFIcozZm tZ2GgDlNGVsiclzEhNDaMHVS6h6d+ws= X-Received: by 2002:ac2:5192:: with SMTP id u18mr2350367lfi.248.1625563473072; Tue, 06 Jul 2021 02:24:33 -0700 (PDT) Received: from localhost.localdomain (deedock.humlab.lu.se. [130.235.135.183]) by smtp.gmail.com with ESMTPSA id u9sm1061673lfm.127.2021.07.06.02.24.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 06 Jul 2021 02:24:32 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Tue, 6 Jul 2021 11:20:05 +0200 Message-Id: <20210706092020.1057-20-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20210706092020.1057-1-dcnieho@gmail.com> References: <20210706092020.1057-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v3 19/34] 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: 8coffiKRReW5 Content-Length: 7464 This reverts commit 4f49ca7bbc75a9db4cdf93f27f95a668c751f160. The next few patches clean up the API and implement this capability for avdevice/dshow. Signed-off-by: Diederick Niehorster --- libavdevice/avdevice.c | 71 ++++++++++++++++++++++++++++++++++++++---- libavdevice/avdevice.h | 5 --- libavformat/avformat.h | 21 +++++++++++++ 3 files changed, 86 insertions(+), 11 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 bbeb1ae21b..6443f865d5 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 ed02b48c84..a276aad64a 100644 --- a/libavformat/avformat.h +++ b/libavformat/avformat.h @@ -583,6 +583,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 @@ -754,6 +764,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; /** * @} From patchwork Tue Jul 6 09:20: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: 28833 Delivered-To: andriy.gelman@gmail.com Received: by 2002:a25:bbc9:0:0:0:0:0 with SMTP id c9csp4367473ybk; Tue, 6 Jul 2021 02:25:00 -0700 (PDT) X-Google-Smtp-Source: ABdhPJx/2Lq51SwPKzp/9Bdg8RdeLrPywbKeX+DE0KgFZbMTHAkk2rTXZqiFrxP3vt7VlXX831WD X-Received: by 2002:a17:906:9b8d:: with SMTP id dd13mr17636912ejc.168.1625563500389; Tue, 06 Jul 2021 02:25:00 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1625563500; cv=none; d=google.com; s=arc-20160816; b=WnhhGHUSpD6ULdGWSu/OTBWTDI3V12LQySEBydfAnI1hN2dNzHijATeM0aI2vDwqTR x7L42t8t1yLg7EGuwOiuodqLTKGm2NvW5X8B6uLgn73ItLPu+ZbJ6bWc7p8o2fvL0AEj jysTvbBluH2KWHik3ns2BFeIlEMrVAFa5R34dfWclqHBIxi6cuVTLucSJQ4z/dtNHWs/ +ZqEVWykLgR4ma/Ul/uZZYNm6gnipFA90Wv6di3dG6zVEEOloQXR9U5/SwD96dPv4zwV /AWEVs4broQJ1S9cU4t5TCMnFqFByxqaej64f9WXwgW7uvtrca3OzXtD54mo8vpBmXNh G6lw== 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=+kuaml8ht81jUriUkajf/mq3rOInxGfJrVd2RDKJg9U=; b=hjJ88yIFyQU7U5rE1vZBi/K1Bub4N9lQ0rOhlyxCvOitKx+AqRSAohB8Ps+xGYV0dq C1uN3L+RHcr/dTBHN6xQmtNwrJJC/ASnnNDJCJZKjJJTUmzRvBWkZQkfK/13+dI+vJiA PAQq9qlMviSd+yRGalgp6X8aAv369+ry2rD/Z+7b043gyhYS5RacoY70+oYUl4xuX1dr VHGCKE/B9CjptCYWTXdGnjEbxTAmTAm2iNUQx/eml51uZN999Wk/Wsjlmq7WZobNpfw0 bHZZK7JgSd9pFpdEy5cCBvFXtQYRhac1fucXafPmf4BwWHx9nlpgWIDx/2coCKnk4iyw rpxA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=C4dbdCWM; 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 l15si3596074ejo.194.2021.07.06.02.25.00; Tue, 06 Jul 2021 02:25: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=C4dbdCWM; 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 721C268A817; Tue, 6 Jul 2021 12:24:52 +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 50C0968A81D for ; Tue, 6 Jul 2021 12:24:45 +0300 (EEST) Received: by mail-lf1-f46.google.com with SMTP id f13so10375926lfh.6 for ; Tue, 06 Jul 2021 02:24: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=qkbHYUrU14uDT19T+xY2ZYh7EkHJUnhKrc8Ot4TNgRo=; b=C4dbdCWMbU67mtmp2T7X1ohmEMmk+xBa7v5vPtwaiQ6pFjMFYDwXAPCeJMZKNXle4X bG0/5U7iDnVbZXfyJj/9S7G7NXfcQkC/ZNGsK5edfG8SlS68YxhzNNOquIZxfQBsk3B7 /GKcOh7JdHrBbKkqWR/1ZqQgHD7ltrhnqx6jMQwwGMlyjvDbjZRwrPOV0RAmxFQSuvBx U+E+pz6B270IUnnSnSU0MAJAdbwqTkfQYTYBe+qzjwYfQ4c46I69emBYtyxYmj4haCTU gGhA6q8N4SPDgcWj69Kg26w5cLphgwMOl5Y+y8qF9wR3PWCk54fmTNzevAbdshkqVt/c AU4w== 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=qkbHYUrU14uDT19T+xY2ZYh7EkHJUnhKrc8Ot4TNgRo=; b=FSD2mYcs3MOhhZ/+uR3G+cCzaIBBxXdgvQQZG6F5fXfB+KqdWuF/flOqSri+bZNVRM y4KwGANt/T4BIZhkwimq6xhn2NnMjXIk0HeBSw8jfmyV9DPFZIGLysuQ74hu3sZAkl6g E05oWprmy+sT6mXbHp3/Qs26w+ktPbJKgbWB14nNlupVfXMm/MgFdWEZ+xIv/SvQ085B JkPlcJnT6oVIVEJc/ZNZgFYL4T3HuH398JfdQK7liBn22qb5zQ2mZ7O8oQtf5KkTW3Nd eUPUqOD51aLtuH6OR7r9BYKKJEOrLQx7udIkkoXv34XloniRVWIQ3Wf9+B9fqKk5at/V 8QmQ== X-Gm-Message-State: AOAM530CgDbEx/DwG/CmQmT9pTnwBgwbbFxzFWjmItsZVEd7nYcwLR65 +5n+hckK7xqRbcMwt7+g9kY5ftcRZus= X-Received: by 2002:a19:5e04:: with SMTP id s4mr14224973lfb.314.1625563484522; Tue, 06 Jul 2021 02:24:44 -0700 (PDT) Received: from localhost.localdomain (deedock.humlab.lu.se. [130.235.135.183]) by smtp.gmail.com with ESMTPSA id z9sm1201288lfu.120.2021.07.06.02.24.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 06 Jul 2021 02:24:44 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Tue, 6 Jul 2021 11:20:06 +0200 Message-Id: <20210706092020.1057-21-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20210706092020.1057-1-dcnieho@gmail.com> References: <20210706092020.1057-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v3 20/34] 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: nZvqGfl2I/w3 Content-Length: 1295 Draw implementation in line with that of avdevice_list_devices Signed-off-by: Diederick Niehorster --- libavdevice/avdevice.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/libavdevice/avdevice.c b/libavdevice/avdevice.c index 695b9143af..e66906e91b 100644 --- a/libavdevice/avdevice.c +++ b/libavdevice/avdevice.c @@ -100,11 +100,14 @@ 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)); if (!(*caps)) return AVERROR(ENOMEM); From patchwork Tue Jul 6 09:20: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: 28807 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a5d:965a:0:0:0:0:0 with SMTP id d26csp4921673ios; Tue, 6 Jul 2021 02:25:09 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxSkgkuh8HhaB6LS1DVMDiyowjjwayLYgtltl68/wnrsy1Wj5sdsrUvrTSzYrazA1RSGjnK X-Received: by 2002:a17:907:c21:: with SMTP id ga33mr12656610ejc.297.1625563509198; Tue, 06 Jul 2021 02:25:09 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1625563509; cv=none; d=google.com; s=arc-20160816; b=kBC1L+GPN8KzXuZhge/Wa69mJ1VZ1nP67OaKtZeXCP1zsTFv9JQLJAg9ZydJj7Zdeb 8fvCZOOjMZBcJPGNatwqB+8C1raX3NN6q7baw6dGUEA0Gn/B9ZmdCB7/kxRwMP0PwmRQ yovd1d2RE039yxqK40ziIKv6MtqzISZPmrT9Hrvz0Gpq4JEPPpbQG+Rgd0J37nR3Ym+q dTxaKV8R6f6bl1+i4rQx2Kzv4qKwh6Du0JL3ptTK3p2uhCVDvGlXI+T9dVdQmzk7zgG8 qRxOoqA7Rq8TrsfOqq7zSSq3ZHfxB89+VyERDuCXjRxhkFFDcIRMLOdeXZUTJi7aV1Rd dqyQ== 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=FUoAmnxFQzTsrkH2PB09/s6A98fXF4jA2IQeSJ4mMmY=; b=tYmiOtLkNW8BB8cCXS0A5otHY0UiOlNiDYpOV6GlnbmKOIUwwxphD1KJS8tXDU+J1o OG3ntmWw2/ZqQduN8mPHurT0cuq1E3w/aVjSruk8wPKI5Ak75yo/ohUwgVL678O3o8OE ejdqV1NN8ya2/2GOmdQrMNbrWtTjQ6oDYqm0Gb9YOhccFJvhjVPFz7Iua2l2rziKiSVG y5uLdqpLKYg1qjwinusNYcWmu8+qnumOG8Hf/mvDaFmt3ubcgfG7nby7oex7AYRTO4iX Eg0/pNbGpWKOIPXyQDaVjDfSnZLYtqMpCfjyf+BYPI+9cFfADo9AZb+EN8FMFjDRgpPa mjuQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=eAA9FfmO; 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 go34si10572288ejc.272.2021.07.06.02.25.08; Tue, 06 Jul 2021 02:25: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=eAA9FfmO; 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 4E78568A83B; Tue, 6 Jul 2021 12:24:59 +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 7E70168A7BF for ; Tue, 6 Jul 2021 12:24:57 +0300 (EEST) Received: by mail-lf1-f50.google.com with SMTP id p21so15428329lfj.13 for ; Tue, 06 Jul 2021 02:24: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=USVkzv8CoIATlRpFZPVTBODGxFeRpL0omO0SIYb1L5s=; b=eAA9FfmOyKsfzgxNzAc8HYn/0DhubSG0kkxkcirMV0iG9LTXjE5KjfK905TU6RGujS PXW8fSjC3kQSbBKzcVkai8CpWj4M3c12ejEYXytLwP5IHOmGTu1UIuA3UXjFvCT5W8qQ ktssAnigWEHa765Z/vFhoFbQrn7b8Y2gZklvAKJuYDH4+oa94Ht2ow29bAFQtfmM+nYe IJURACi9NVRYOc2tZzemTsrtOq/+vqTbXknjpZ96NFna3jXRyWAoepg4Sg5YGtJrE7Lx lm676mSOmqZt5Ml6k54Q9Wc2PrWnzBo2EKkhPXEU7Td03HOpoTBsKNMQDvphdsYUtFny Ov9w== 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=USVkzv8CoIATlRpFZPVTBODGxFeRpL0omO0SIYb1L5s=; b=Vr9DjvDtkraZXpP7N1CYX7VOVY8YnGs+tShZj1/ImwyTZm6GRKMAYfG43zN5DagQeg FJUg74NRdB9Y/Y3IbYqQwuI2InEs1U1GqTCzkZ7OTbadM0owbhTDykdIdrNqPx1dACca uC0I/Q/MPHKsE0WZbxiFNUExEODIqMN9UhQAaHDE2BwBTGcWz4ryXdixtOD3Ld5j4XJa 29mC3LTN9gchQL2/sIdHgPwzXb7dmfsOlICkLAHUXWcFcZ6VPK/WBoPkM6geCw+/a6Iy BFiQhXxSSIOde9x5tkI27BJM0H7R0T6SVZ61OuyYaoYep7MAdQAhe4q7rIfpQfhWBieY w4iw== X-Gm-Message-State: AOAM530GCNzN7sRulaNFr1WdbfksG0deQPBODUOIE2m4Qnhf4YUhx7av j4fMj2UWo3jwlXtNM2dd2Mhw4qPjbE8= X-Received: by 2002:ac2:5c0d:: with SMTP id r13mr13571390lfp.438.1625563496331; Tue, 06 Jul 2021 02:24:56 -0700 (PDT) Received: from localhost.localdomain (deedock.humlab.lu.se. [130.235.135.183]) by smtp.gmail.com with ESMTPSA id b2sm1337566lfj.11.2021.07.06.02.24.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 06 Jul 2021 02:24:55 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Tue, 6 Jul 2021 11:20:07 +0200 Message-Id: <20210706092020.1057-22-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20210706092020.1057-1-dcnieho@gmail.com> References: <20210706092020.1057-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v3 21/34] 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: 0CPiEcVHkbQQ Signed-off-by: Diederick Niehorster --- libavdevice/avdevice.c | 2 +- libavdevice/avdevice.h | 28 +--------------------------- libavdevice/internal.h | 33 +++++++++++++++++++++++++++++++++ libavdevice/version.h | 2 +- 4 files changed, 36 insertions(+), 29 deletions(-) diff --git a/libavdevice/avdevice.c b/libavdevice/avdevice.c index e66906e91b..cb139e6d4a 100644 --- a/libavdevice/avdevice.c +++ b/libavdevice/avdevice.c @@ -33,7 +33,7 @@ const char av_device_ffversion[] = "FFmpeg version " FFMPEG_VERSION; #define V AV_OPT_FLAG_VIDEO_PARAM #define OFFSET(x) offsetof(AVDeviceCapabilitiesQuery, x) -const AVOption av_device_capabilities[] = { +const AVOption ff_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, diff --git a/libavdevice/avdevice.h b/libavdevice/avdevice.h index 6443f865d5..44c4f185a2 100644 --- a/libavdevice/avdevice.h +++ b/libavdevice/avdevice.h @@ -400,33 +400,7 @@ int avdevice_dev_to_app_control_message(struct AVFormatContext *s, * avformat_free_context(oc); * @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[]; +typedef struct AVDeviceCapabilitiesQuery AVDeviceCapabilitiesQuery; /** * Initialize capabilities probing API based on AVOption API. diff --git a/libavdevice/internal.h b/libavdevice/internal.h index 67c90e1f87..bef3a4bd2d 100644 --- a/libavdevice/internal.h +++ b/libavdevice/internal.h @@ -19,10 +19,43 @@ #ifndef AVDEVICE_INTERNAL_H #define AVDEVICE_INTERNAL_H +#include "libavutil/log.h" +#include "libavutil/opt.h" +#include "libavutil/pixfmt.h" +#include "libavutil/rational.h" +#include "libavutil/samplefmt.h" +#include "libavcodec/codec_id.h" #include "libavformat/avformat.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 ff_device_capabilities AVOption table + * to implement capabilities probing API based on AVOption API. + */ +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; +}; + +/** + * AVOption table used by devices to implement device capabilities API. + */ +extern const AVOption ff_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 Tue Jul 6 09:20: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: 28811 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a5d:965a:0:0:0:0:0 with SMTP id d26csp4921797ios; Tue, 6 Jul 2021 02:25:20 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxNCvH8vVF6p54qMhRb9v+biBJyV2R35PFoIIanCpfu/LZ5KJLzowwVUDQbLv8FQxMdCzu8 X-Received: by 2002:a05:6402:c18:: with SMTP id co24mr16641398edb.307.1625563520710; Tue, 06 Jul 2021 02:25:20 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1625563520; cv=none; d=google.com; s=arc-20160816; b=G8Ik7buk9O9yZGbjnZINLsiEUSbrBVPcp9Y35iC9RaX1dqdMEq0tXq90Cz4Yud0LHY CVmla8yG46c2ERfqrxyP3f6ru0fVV5KZ819+sxd9XSWbMyvIqNStIsLUcX/EPIk72nW4 n1vpfUizW7+Us2KK7sr6ee6RNMlEb0TDp5y9mr+VWGRLWI+y9XTn1yZTwLSXWYTus7tB GsKqN7hMBhfpXq07uyTrrFaEZuFKNHUgYGmhUGoOzYapLOBFYqyhLR4nw5OwVXhu08VE QTTqjGg3h/nCuZRS4Cmgt6hhchnTPEfqRop4Ie3rTdtomvFMj53pr+OozUp/0bHXVPLO +2NQ== 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=+Xw++F6WbKUuAy+HxNh4IfSZsGhPwIi3Vi2mgYFU10c=; b=xi3pEezAcOuyecudt0nZuwpHKoe3TX1n0WgNwTb7/6nhGZVQ9zvM+Qr4svhD2KyVPm FhYAzErC4m5u4gw3KXqDOimLE9hani9M8JIZsbTil8euCcc0okuSM9d97SKjMSICS6U3 qYqiO5cHfMp4juaaCJbww0BAFLkQn9JC/xBTY6+WPhCnARMlAqWw5jk9n/6EMtq/pRBo /fmXjCVyr8oYralurFcIJJwOEy+GCWq6rFs7j5L3Fjfos+v5rNTu7E2jZPOlNWQvlmCj mAcCIN5LdMyFUxap1+swwl7hjz3iZjm8JCgMIyNbYpc3u87VOjK9bINAbcccDPuuID+M ayBw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=TAjVwnUR; 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 c7si13032432ejc.373.2021.07.06.02.25.20; Tue, 06 Jul 2021 02:25:20 -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=TAjVwnUR; 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 6EB7368A84B; Tue, 6 Jul 2021 12:25:15 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lj1-f178.google.com (mail-lj1-f178.google.com [209.85.208.178]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id BEFA268A84B for ; Tue, 6 Jul 2021 12:25:08 +0300 (EEST) Received: by mail-lj1-f178.google.com with SMTP id a18so2039181ljk.6 for ; Tue, 06 Jul 2021 02:25: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=AJLGpPvXVoSjSGTbNo4TPl59OEh8iUg8KH0OR8wN1Z4=; b=TAjVwnURH/GtAOAaxfaJ2bV6hmAE0H9t3fs4Igw8ZQ8Y2trBVetFsyXokKKjyqUIoN xVJ60rYCAnU8BdkUZ9oQ4zIyiwVyGw+Ekh8CMfFurh4sMMQO6zwqFh0Suqzl+uemgbOi Y0+AyTn8PnB2ClSJe30Z3r+x8N+wG8j0D2EpB1WQxU8231Y/Q1klwy4AYEsqhfvquVyl BNlMqDED2DIxXnm/wxJHkCXIcraTSCN1F0lDXrzyhH4PoiLg6NS7l4qGXsqaRAKHG7VW 8PyN2m29cLDUZpThVPPP7RiSioQNCy+Zxd3rtRbDZrznBOKxzy3rOZn8TFkeiRfOyyFz vaeA== 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=AJLGpPvXVoSjSGTbNo4TPl59OEh8iUg8KH0OR8wN1Z4=; b=RkyvRGaWlkyRvND5VFjodwnfTOocbK/eA6enNdROjnwEGJvy1mHnT+7l718EKVh4Ge sykui1ApBwC5goy/OeI5nomV85erf8Ppuw2Pk7igkRkVirvwCTSU+wXVKiBweV9WymA/ iByWckrk3nqXd/GvjttpgiRO3K7iGKtiOQiLwMubXqlwQKjOhMncGS3bxnF3gwQeW3Aj pZULmmok30NTe8rp+pkMlDQlzxlRLN4C4szE3Ga+vW0irzl0qNQgSKA8SmMv91mDPFtE A2AM+h6iCYkUG8zhpA2CQjHp/YxuGqsBH2msV5sEnNgWkdkUBjo9JYc9g76x3x2pLlZ4 Q+oA== X-Gm-Message-State: AOAM532qfmKUFZ41qzgRRttpRcuEKVsXxyYKUDkv75D1iw+tDu/cGmUH kYUe6Co63/WTloiH/Wt+M58x2612A0o= X-Received: by 2002:a2e:8248:: with SMTP id j8mr14390650ljh.300.1625563507832; Tue, 06 Jul 2021 02:25:07 -0700 (PDT) Received: from localhost.localdomain (deedock.humlab.lu.se. [130.235.135.183]) by smtp.gmail.com with ESMTPSA id p4sm1336431lfk.222.2021.07.06.02.25.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 06 Jul 2021 02:25:07 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Tue, 6 Jul 2021 11:20:08 +0200 Message-Id: <20210706092020.1057-23-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20210706092020.1057-1-dcnieho@gmail.com> References: <20210706092020.1057-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v3 22/34] avutil/opt: document AVOptionRange min_value > max_value 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: uXpcr8UR3S7H AVOptionRange needs a way to encode that an option is not set. Here i provide a documentation solution. When a range is invalid (value_min > value_max), it should be considered unset/value not available. 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 cannot be communicated through a single special value (like 0 or -1) as that has the same problem asany special value solution. Documenting that an invalid range means value not available allows communicating this situation without adding a field to the AVOptionRange struct. This further documents that an AVOptionRange denotes a single value when value_min == value_max, and a range only when value_max > value_min. This makes the is_range field superfluous. Signed-off-by: Diederick Niehorster --- libavutil/opt.c | 2 +- libavutil/opt.h | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/libavutil/opt.c b/libavutil/opt.c index 41284d4ecd..edb2c2ca41 100644 --- a/libavutil/opt.c +++ b/libavutil/opt.c @@ -1865,9 +1865,9 @@ int av_opt_query_ranges_default(AVOptionRanges **ranges_arg, void *obj, const ch ranges->range[0] = range; ranges->nb_ranges = 1; ranges->nb_components = 1; - range->is_range = 1; range->value_min = field->min; range->value_max = field->max; + range->is_range = field->max > field->min; switch (field->type) { case AV_OPT_TYPE_BOOL: diff --git a/libavutil/opt.h b/libavutil/opt.h index c2329e5589..3c64e8d3a5 100644 --- a/libavutil/opt.h +++ b/libavutil/opt.h @@ -313,6 +313,11 @@ typedef struct AVOptionRange { * Value range. * For string ranges this represents the min/max length. * For dimensions this represents the min/max pixel count or width/height in multi-component case. + * If value_min < value_max, the struct encodes a range. + * If value_min == value_max, the struct encodes a single value. + * If value_min > value_max, the range is empty (a value is not available). + * Good sentinel values to use when a range is empty + * are value_min=0, value_max=-1, but this is not required. */ double value_min, value_max; /** From patchwork Tue Jul 6 09:20: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: 28803 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a5d:965a:0:0:0:0:0 with SMTP id d26csp4921929ios; Tue, 6 Jul 2021 02:25:31 -0700 (PDT) X-Google-Smtp-Source: ABdhPJw/8OKzawXt2xMN0RJ1fIiw9xrf3yfLwjYiW82P4mfgf/GUncinUgA8GeatzSYwApzRHjOL X-Received: by 2002:a17:906:c302:: with SMTP id s2mr17302547ejz.151.1625563531534; Tue, 06 Jul 2021 02:25:31 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1625563531; cv=none; d=google.com; s=arc-20160816; b=d2OTpsNS+TaUXKZa5YY3+ANSj8vEGMlvBG7lwXkxY8Sg+DlEDEscTO05MWF16K91tH Ux+hBaDxlAz/yR/bukjgriVvuHYXl/hN8k4++htFN3Rmyksc/h7o1P8VPj3SbrTnndfp xc894qC5MKHBw8PGqoyzosKTK6vnsR6KG6l2kmZEFirmtJmxLZuy0Wg6pBQVaocBQqpR 6NeRhXpn34OhAqR/DQiKpC/uIoVxa/TFJJrK0f9HYwmAQeT0DnU9mZgsrxl5Z3U7o0/p /+g9Ftsql2VX0pM/+lMZexL3tHwgg344eRkS1vGOFQRgP103wRFyomAVifZCmDkcxzAg fuxw== 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=PLqYlIfJtqEDS74Qvvi5XzneAvqB5ShFztUB/xKX7xo=; b=W3sZYNB5FZQ6ljXzHGYvt5Jb/lGsjcAEVtZ4cI4fG8J9z+LpI4Kb7qZRQz+XHOAGXS OIkyyQ8CfY4y9ETUyqddZsysfq+/HZVKi/3iUFseoMwhYWnueq+/wWZqOHd+wkdfwwSB w85kyA0YCbUIlp7V4Tq6fl3mc3QRicKcSrgc99Wmzy9KQmdyePHTmAYXhiM8+Ege61Z5 QMpJQlXL0eAu8DTzgyRk/gGZC2bGt4IG8C8NbM26KC+eP9cQqMrdT52EepWEBqyZko+o yNKeC+0sv9dmLx1gr2RFzoDy/hxPPNsRKF4dF0VykmtlueXZ4Kn5ili7KiEWefDnDDZC TaUg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b="UDO/H+D4"; 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 s23si14150418ejc.642.2021.07.06.02.25.31; Tue, 06 Jul 2021 02:25:31 -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="UDO/H+D4"; 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 4D9CB68A84E; Tue, 6 Jul 2021 12:25:22 +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 2C88C68A84D for ; Tue, 6 Jul 2021 12:25:20 +0300 (EEST) Received: by mail-lf1-f46.google.com with SMTP id u18so6145223lff.9 for ; Tue, 06 Jul 2021 02:25: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=Hmk1QKdZmWEtTP3SAWQfIaY06johHwAf6DsAEozlFiA=; b=UDO/H+D44L1WzPwe/PHLk8AYjFj9gTeA/f90jXn7iqJeqLApmAYYD96iD54pbLYJ73 3oux1W/IrKA9G4+G7Fl7zVZKIe51i0tMWmwBofqMOH/arcb0ybfpzDfWk/jclthN87ZJ JGYVGSDxxBNDHLn8tD3K4jJMSsXy059KaCu5sDMMy7+92OoQn2N4TthWzrCRG8D0+5uM 0AIbkw9zQYgDvn2Z5F39TRtPSU2N0ceq9O5wT8ntyyrkHTTIuyCxMqr5Byz7B5mj0Gtv MKGXOeCU5beqdi90mIE5PAxSWEKHjICWF/x3U/PDXaejPrA8yGgZo6eVwStXmxWU3Qu1 4oUw== 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=Hmk1QKdZmWEtTP3SAWQfIaY06johHwAf6DsAEozlFiA=; b=V4k28iRFMdKoVjRdbKJbocpFRBVQzNOPImNBHoLM66qaGZIVmE6Lwzu6tS/AnpzAya 5UpHqTL2SRNqo9cuWC+pE36fC+wi8ppMUc5XJojP2JrsNaa6+2vASoKsyNNNPvaq4Zp7 iNg1Da1wzt+oLr2j72/GMY6Jlg+fU+9k1xMtfieENZ3MqGcLF4tcNQ2++ndjWdphBAp6 m6VHzPPMymU3OhuAPzh+kNHlKVnYFZVfS6vW6gpE1sMlkdZzAyhcQD6g4JKLkOqdt2ZV ZNb3tASaobATZzSWIpkBfo2PO4G3l7Cs7zV5v0zWALqAKVJlP2DV2curgII5tuLIvP+L YBtg== X-Gm-Message-State: AOAM532UEl3rnOij8pVTcGe+CU7QNzJ5EBtWBwGgPaz7i8ULu3aik9Tm eRvmhdFkStuhb3elvTsU+TLcBTFOBhg= X-Received: by 2002:ac2:5d2e:: with SMTP id i14mr13464676lfb.642.1625563519300; Tue, 06 Jul 2021 02:25:19 -0700 (PDT) Received: from localhost.localdomain (deedock.humlab.lu.se. [130.235.135.183]) by smtp.gmail.com with ESMTPSA id u15sm1343998lft.75.2021.07.06.02.25.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 06 Jul 2021 02:25:18 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Tue, 6 Jul 2021 11:20:09 +0200 Message-Id: <20210706092020.1057-24-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20210706092020.1057-1-dcnieho@gmail.com> References: <20210706092020.1057-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v3 23/34] 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: VtsX3uGaKPdi 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 bef3a4bd2d..eee493a4c7 100644 --- a/libavdevice/internal.h +++ b/libavdevice/internal.h @@ -58,4 +58,35 @@ struct AVDeviceCapabilitiesQuery { */ extern const AVOption ff_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..de9023f215 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 AVDeviceCapabilitiesQueryType 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 Tue Jul 6 09:20: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: 28812 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a5d:965a:0:0:0:0:0 with SMTP id d26csp4922074ios; Tue, 6 Jul 2021 02:25:43 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzIofVarglcQiFvvpaWQPfRhcgltKorB9KaFZrOxR/9Kk/Ht9dKfMnSGhCpC5fk5ba+RhZc X-Received: by 2002:a05:6402:278a:: with SMTP id b10mr22379804ede.54.1625563543728; Tue, 06 Jul 2021 02:25:43 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1625563543; cv=none; d=google.com; s=arc-20160816; b=kxjkoxLeMO3WLwchTHbmpRl04AeD2LVSBZU15oKFAuHrTMLxzU7gZp49/gMZrKkvlS yP9E0jU5oFdIAF3g/Sd+QsTAMNiKyH7G2tABR7t0lltdmSJy1XtegeiOY8rRgJZmHI/t hOhEDUvq8VMcwXIDJb9qZZF0i6ntH1vv/bSkkPFSn54cWr8tKjk3aRVleQ/dKu/qKbb8 JCwZtXs7hS4WtE+0sbNcpcuqaIyE6RVPVTSCXnebN6WP1GyTfc6xsMlRtCpIWBezgLjs R5fPN6pq2WtDF4y0BhyXj+fEYp6eCq86GMAQ+1BW8ZxsRfEJAX9TeAEHDKtb4DOnl6zK cftA== 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=6UnIcPSIaDwUfWeh4nsimsVYLoiaXB+nQRshmdWNCBc=; b=jLB81iMSjtt3vT5e2h9V3b4lptyzxjjEKrrFJVQEWsKlp2C1HInO4JG3isjChIHs6j 9gBclHuSg2nwBsz5MRywB9psaWSGlamd7fGZmKZeDwe9P3JA8OAgfogqLJH5tXOrT/vZ RWtmmSkTEqCjpCyw9g9oUusQKZYD8qOXCqMBNTqU0wHAWgl+A3eNnmVUR9FEMyChxFq6 efC4UQMV1A8+9H2/TRVdBMOr8/KUDn+WSkbud5VoodoSLFgHTCBDjAzGddab7CprCufM 1VG6Tirf87LddOSm48F50v/knaL6UWz0Uz91gK5OPk7ueBfke2dcktbsSGoUF6/l9BGU pNlQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=Xa7EbCzM; 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 q18si14205505edd.415.2021.07.06.02.25.43; Tue, 06 Jul 2021 02:25:43 -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=Xa7EbCzM; 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 6B58268A86F; Tue, 6 Jul 2021 12:25:34 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lj1-f178.google.com (mail-lj1-f178.google.com [209.85.208.178]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 6F51968A878 for ; Tue, 6 Jul 2021 12:25:31 +0300 (EEST) Received: by mail-lj1-f178.google.com with SMTP id r16so28212182ljk.9 for ; Tue, 06 Jul 2021 02:25:31 -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=Z/wuRieFwaG4Afab+wM472uURtrxTfrYxw/0ds6LNdk=; b=Xa7EbCzM8BZzEH+X+PLZUbSsVUe6nzgG8Xpci7lQBGwyy7+z3LxN4wHUZWvVDTn/CF lBG3FrD2GXZmM4hLBx/B0jqb/TiA+rMXMD2PGNdapneWEzfAqNKnLz75JkpTbqgItSjZ 4ETAGN1HiIGeGIHvkHw+FlLsFn+lzgAmKlCP6LbMuIKxIYjP0GCpss/Rz0v7mAZpwKuI HL3DO+cPQ+WrwhlmDS2R0BiegAPspDc2TbD0c7AOnYsycIvuda2YOdZpwZ2hRCjR/Wt2 opCjiURThNPQ0JK1xYzrPpLX2hlfwIRBRjtn4HHJJtZkDfzObBn6zObW4qvLbVUkz+DK MFhQ== 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=Z/wuRieFwaG4Afab+wM472uURtrxTfrYxw/0ds6LNdk=; b=OUUZmAgnR+Q6sE4mD5AqD6WC8/0OiuWYJXUUYY/ey4ql81dtwn1IOXfW/8PKtmvSb5 9mQ8kr78FFk7uokcB131eY0PDiCvGkC1I/OHnFd8cChgOpXXO4YTQZWvxDk7N/XmpRjb 7Mub/Ai+UgcTUrIJNjPV5/g1fnykZf04TC5zTDxm6LTfVP4LLn4ZHKUUN7wDzZvXj8kn VPHHjdUX2qM7RfYVUH2ZCxZrkJlTuCL/KclwFlhwoj6bim+GbHnLhxg4YjQp5HbKl138 hp7mxsER/ztnfHQ14DkKmNzKWtdjjL9mX0m9P7jvMgE5rPDvDWn92L7j4vNbP2+NJTQE tYdw== X-Gm-Message-State: AOAM533/h6fxED7C6+2zsgAuKqL2AAY6CCowLuWoCAzTGRt62Xza5oeS pIQfV0SRLR0M9lqfmeUHOEJja3m7gAk= X-Received: by 2002:a05:651c:211d:: with SMTP id a29mr14748289ljq.115.1625563530790; Tue, 06 Jul 2021 02:25:30 -0700 (PDT) Received: from localhost.localdomain (deedock.humlab.lu.se. [130.235.135.183]) by smtp.gmail.com with ESMTPSA id k12sm784667lfv.14.2021.07.06.02.25.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 06 Jul 2021 02:25:30 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Tue, 6 Jul 2021 11:20:10 +0200 Message-Id: <20210706092020.1057-25-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20210706092020.1057-1-dcnieho@gmail.com> References: <20210706092020.1057-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v3 24/34] avdevice: change device capabilities option type 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: +ZDY2E3g2PZg Changes fps option from AVRational to double. This since any device capability query results are returned in AVOptionRanges, which hold the value as doubles, which can't contain AVRationals. Also updated documentation of other capabilities, some had the wrong option type listed. micro version bump as this capabilities API is unused for now. Signed-off-by: Diederick Niehorster --- libavdevice/avdevice.c | 4 ++-- libavdevice/avdevice.h | 6 +++--- libavdevice/internal.h | 4 +++- libavdevice/version.h | 2 +- 4 files changed, 9 insertions(+), 7 deletions(-) diff --git a/libavdevice/avdevice.c b/libavdevice/avdevice.c index cb139e6d4a..73c6738383 100644 --- a/libavdevice/avdevice.c +++ b/libavdevice/avdevice.c @@ -50,8 +50,8 @@ const AVOption ff_device_capabilities[] = { {.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 }, + { "fps", "fps", OFFSET(fps), AV_OPT_TYPE_DOUBLE, + {.dbl = NAN}, 0, INT_MAX, E|D|V }, { NULL } }; diff --git a/libavdevice/avdevice.h b/libavdevice/avdevice.h index 44c4f185a2..758c650636 100644 --- a/libavdevice/avdevice.h +++ b/libavdevice/avdevice.h @@ -344,7 +344,7 @@ int avdevice_dev_to_app_control_message(struct AVFormatContext *s, * type: AV_OPT_TYPE_INT (AVCodecID value) * - Capabilities valid for audio devices: * - sample_format: supported sample formats. - * type: AV_OPT_TYPE_INT (AVSampleFormat value) + * type: AV_OPT_TYPE_SAMPLE_FMT * - sample_rate: supported sample rates. * type: AV_OPT_TYPE_INT * - channels: supported number of channels. @@ -353,13 +353,13 @@ int avdevice_dev_to_app_control_message(struct AVFormatContext *s, * type: AV_OPT_TYPE_INT64 * - Capabilities valid for video devices: * - pixel_format: supported pixel formats. - * type: AV_OPT_TYPE_INT (AVPixelFormat value) + * type: AV_OPT_TYPE_PIXEL_FMT * - window_size: supported window sizes (describes size of the window size presented to the user). * type: AV_OPT_TYPE_IMAGE_SIZE * - frame_size: supported frame sizes (describes size of provided video frames). * type: AV_OPT_TYPE_IMAGE_SIZE * - fps: supported fps values - * type: AV_OPT_TYPE_RATIONAL + * type: AV_OPT_TYPE_DOUBLE * * Value of the capability may be set by user using av_opt_set() function * and AVDeviceCapabilitiesQuery object. Following queries will diff --git a/libavdevice/internal.h b/libavdevice/internal.h index eee493a4c7..5f0bd403dd 100644 --- a/libavdevice/internal.h +++ b/libavdevice/internal.h @@ -50,7 +50,9 @@ struct AVDeviceCapabilitiesQuery { int window_height; int frame_width; int frame_height; - AVRational fps; + // NB: an AVRational cannot be represented in the AVOptionRange + // output of av_opt_query_ranges, so we store fps as double instead + double fps; }; /** diff --git a/libavdevice/version.h b/libavdevice/version.h index e0361aebc1..0df40ef4c7 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 101 +#define LIBAVDEVICE_VERSION_MICRO 102 #define LIBAVDEVICE_VERSION_INT AV_VERSION_INT(LIBAVDEVICE_VERSION_MAJOR, \ LIBAVDEVICE_VERSION_MINOR, \ From patchwork Tue Jul 6 09:20: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: 28816 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a5d:965a:0:0:0:0:0 with SMTP id d26csp4922237ios; Tue, 6 Jul 2021 02:25:55 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzKzuNEdCV+MmtdtuTzrA4siCjnY51YLcdRc3b2P20SnljohBQXK6l4yfxmJlLVqH07NQon X-Received: by 2002:aa7:ce1a:: with SMTP id d26mr8303330edv.209.1625563555259; Tue, 06 Jul 2021 02:25:55 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1625563555; cv=none; d=google.com; s=arc-20160816; b=FEmnklQc++pgOVe7REv/clC/Br7lRA7X74R10rPYbJA3F1MGzPeB2C2MthVSb95aao TxMvRWsX5P1XgtHjr84ESz9RDafAye0+T/7hGUnu24871ddd8O/1jmQ0LFcrxiZ3qlil p8PIoj2nUsaNVzY+CZZOZjR4VEuiEvRmtAOdLthQbNAxTVOdkHJgS+y3+LkIqKSDQVJT xoOeA6XJWmQv1s2gFPixcuLSTH5P1nyGlzWvUMpVk062P6s7Ion4cHtBEYD1siEtsv74 Y3SF6RLmELEvRKsJ3FQG1A5VyzIdeoVbFNvWacCC3mvpmGooeI9xvMcgRpvZHMoB+W7K M+gg== 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=2fZpiNoUpmsTDuUOhj969Do7VmPhJly0CZXpsB7JOsY=; b=s6tlho6h340fRdbYnULYWIyQwwrIWa5bKpflbUe1FVwG43vl7fadU9N3rwZBZYBg31 mjELOKOi9vnWD79jsJqUp/d3D3Y2o8SpCknO10fn693MxXmlUhJVxHCew1uu/WjNsvaN ddnoxjUk3Bey6yU82WtVNOHMy9HQNaknGlMb7nePcwXB4atEbMDG5aFfhqqxPvIF6RCf 1Z3PD+W5Q7GLF3tuoW3U7MsPNXs5PViKzhZ4PacYdea3oC3OHtZ3dGFOC/GcWp7SJcF2 VyEcxA2MMt+jZcMIDCIdxKNFTeu5sKP8ZL7WM90V9aXa/tX0pCha+EsAQh9fvNbzyaEg yIYQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=TY2tPnEs; 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 c9si15733309ejj.120.2021.07.06.02.25.54; Tue, 06 Jul 2021 02:25: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=TY2tPnEs; 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 59BB668A89C; Tue, 6 Jul 2021 12:25:45 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lj1-f170.google.com (mail-lj1-f170.google.com [209.85.208.170]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 696E468A888 for ; Tue, 6 Jul 2021 12:25:43 +0300 (EEST) Received: by mail-lj1-f170.google.com with SMTP id u25so28207911ljj.11 for ; Tue, 06 Jul 2021 02:25: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=ytZLCOr8PZ7Z4aJDakweiepJwndMNK9+FhHZpkFI0gw=; b=TY2tPnEsywSZPWhQv40CPG9eD9xgCgNt/DGnrp1Q7Jw1Qy8MEuhTNE7ROy3GSF12rs De7ClsvhNNhBzGA4m0Vl2iEw/IVVL9RnuYvd+9T2eSWOb0aR0x2exvUlp17snok5Fief qkFjw8gZRUogw9SAPY+A6fcOLujAcM2nqwCot1or2kK7fxYtFEAqGYrYHc+jty2vawSq Ckd9kL62WXDHhngFl/nEb/X+uMSY4Ypi1FytHrTdvuUC0gO/B57z/CF12xxzczPf33QH hvr9He6KyOjBv3ph38J/2nn4LhHlNp9ei6IcrItRSuD/BGjBmtD65UPSmFuRlHvPAy4n hjrg== 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=ytZLCOr8PZ7Z4aJDakweiepJwndMNK9+FhHZpkFI0gw=; b=hEUBkTTyh4pMJ0goUkPrs1a3Jd3ZEaEtC06ReFle5blHdVd1jslWonKCEL5rASo8sQ I6cqOjg0cQsusrFsOoTD6NVFAjT6jpC49gAMeLPvL3VAEd8coULbQpjamJQACbpii+Yn WKRrfIrxQG0EYlEJwzZcdOPzONiDToMfg9BifS63nnI5FWu2toNlOebM71HdtEqgz2VJ KV88ytCbSmNk35BdHQHgAPDNmMaQpEpMBTdMDQ0+NPUeY4c7uGzLEzVgByhHWAb8txMS S341X+5H1rjUossBpyQqzrWPnEXnCc2/OeDu0kAYzx3qXNbeiyGuzREgwFvRgQhxtQuu X2UQ== X-Gm-Message-State: AOAM531eM0zcahzN5/nJEr4GYMjcLdntor+RwWUZPcDR8Y2VS/sU07ON BCcq26th5SbKf/03Yp3/rm9kHJu8Gew= X-Received: by 2002:a2e:9d1a:: with SMTP id t26mr14584724lji.10.1625563542223; Tue, 06 Jul 2021 02:25:42 -0700 (PDT) Received: from localhost.localdomain (deedock.humlab.lu.se. [130.235.135.183]) by smtp.gmail.com with ESMTPSA id c5sm1348409lff.86.2021.07.06.02.25.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 06 Jul 2021 02:25:41 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Tue, 6 Jul 2021 11:20:11 +0200 Message-Id: <20210706092020.1057-26-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20210706092020.1057-1-dcnieho@gmail.com> References: <20210706092020.1057-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v3 25/34] avdevice: improve capabilities' option 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: i1y/dhCZcsBM This adds avdevice_capabilities_get_class() to allow examining the capabilities that can be queried/set through the capabilities API, and avdevice_capabilities_bprint_num() which allows printing the value returned when querying a capability. These values (min_value and max_value of an AVOptionRange) are doubles and this function formats them properly, e.g. 1. for a AV_OPT_TYPE_PIXEL_FMT -> yuyv422. bump minor version. Signed-off-by: Diederick Niehorster --- libavdevice/avdevice.c | 79 ++++++++++++++++++++++++++++++++++++++++++ libavdevice/avdevice.h | 27 +++++++++++++++ libavdevice/version.h | 4 +-- 3 files changed, 108 insertions(+), 2 deletions(-) diff --git a/libavdevice/avdevice.c b/libavdevice/avdevice.c index 73c6738383..181ce04188 100644 --- a/libavdevice/avdevice.c +++ b/libavdevice/avdevice.c @@ -19,6 +19,8 @@ #include "libavutil/avassert.h" #include "libavutil/samplefmt.h" #include "libavutil/pixfmt.h" +#include "libavutil/pixdesc.h" +#include "libavutil/avutil.h" #include "libavcodec/avcodec.h" #include "avdevice.h" #include "internal.h" @@ -128,6 +130,83 @@ int avdevice_capabilities_create(AVDeviceCapabilitiesQuery **caps, AVFormatConte return ret; } +static const AVClass avdevice_capabilities_context_class = { + .class_name = "AVDeviceCapabilitiesQuery", + .item_name = av_default_item_name, + .option = ff_device_capabilities, + .version = LIBAVUTIL_VERSION_INT +}; + +const AVClass *avdevice_capabilities_get_class(void) +{ + return &avdevice_capabilities_context_class; +} + +int avdevice_capabilities_bprint_num(AVBPrint *bp, const char *name, double val) +{ + int opt_type_set = 0, is_codec = 0; + enum AVOptionType type; // will be set below, opt_type_set tracks if has been set + const AVClass *cap_class = avdevice_capabilities_get_class(); + + // may fail, e.g. if name of a component of a multi-component option was provided as input + const AVOption *field = av_opt_find(&cap_class, name, NULL, 0, AV_OPT_SEARCH_FAKE_OBJ); + if (field) { + type = field->type; + opt_type_set = 1; + } + + // based on name, a type override or other extra info may be needed + if (opt_type_set && type==AV_OPT_TYPE_INT && strcmp(name, "codec")==0) + is_codec = 1; + // next three are for the three components of a AV_OPT_TYPE_IMAGE_SIZE + // NB: these wont be found by av_opt_find above + else if ( + strcmp(name, ff_device_get_query_component_name(AV_DEV_CAP_QUERY_WINDOW_SIZE, 0))==0 || + strcmp(name, ff_device_get_query_component_name(AV_DEV_CAP_QUERY_WINDOW_SIZE, 1))==0 || + strcmp(name, ff_device_get_query_component_name(AV_DEV_CAP_QUERY_WINDOW_SIZE, 2))==0 + ) { + type = AV_OPT_TYPE_INT; + opt_type_set = 1; + } + + // now, format if type set, else error + if (!opt_type_set) { + av_log(NULL, AV_LOG_ERROR, "A device capability with the name '%s' is not known\n", name); + return AVERROR_OPTION_NOT_FOUND; + } + + switch (type) + { + case AV_OPT_TYPE_INT: + { + int temp = lrint(val); + if (is_codec) + av_bprintf(bp, "%s", (char *)avcodec_get_name((enum AVCodecID)lrint(val))); + else + av_bprintf(bp, "%d", temp); + break; + } + case AV_OPT_TYPE_PIXEL_FMT: + av_bprintf(bp, "%s", (char *)av_x_if_null(av_get_pix_fmt_name((enum AVPixelFormat)lrint(val)), "none")); + break; + case AV_OPT_TYPE_SAMPLE_FMT: + av_bprintf(bp, "%s", (char *)av_x_if_null(av_get_sample_fmt_name((enum AVSampleFormat)lrint(val)), "none")); + break; + case AV_OPT_TYPE_DOUBLE: + av_bprintf(bp, "%f", val); + break; + case AV_OPT_TYPE_CHANNEL_LAYOUT: + av_bprintf(bp, "0x%"PRIx64, llrint(val)); + break; + + default: + av_log(NULL, AV_LOG_ERROR, "avdevice_capabilities_bprint_num is not implemented for this option type\n", name); + return AVERROR_PATCHWELCOME; + } + + return 0; +} + void avdevice_capabilities_free(AVDeviceCapabilitiesQuery **caps, AVFormatContext *s) { if (!s || !caps || !(*caps)) diff --git a/libavdevice/avdevice.h b/libavdevice/avdevice.h index 758c650636..11d1a6ae12 100644 --- a/libavdevice/avdevice.h +++ b/libavdevice/avdevice.h @@ -48,6 +48,7 @@ #include "libavutil/log.h" #include "libavutil/opt.h" #include "libavutil/dict.h" +#include "libavutil/bprint.h" #include "libavformat/avformat.h" /** @@ -402,6 +403,16 @@ int avdevice_dev_to_app_control_message(struct AVFormatContext *s, */ typedef struct AVDeviceCapabilitiesQuery AVDeviceCapabilitiesQuery; +/** + * Get the AVClass for AVDeviceCapabilitiesQuery. It can be used + * in combination with AV_OPT_SEARCH_FAKE_OBJ for examining + * which capabilities can be queried through the + * AVDeviceCapabilitiesQuery API. + * + * @see av_opt_find(), av_opt_next(). + */ +const AVClass *avdevice_capabilities_get_class(void); + /** * Initialize capabilities probing API based on AVOption API. * @@ -422,6 +433,22 @@ typedef struct AVDeviceCapabilitiesQuery AVDeviceCapabilitiesQuery; int avdevice_capabilities_create(AVDeviceCapabilitiesQuery **caps, AVFormatContext *s, AVDictionary **device_options); +/** + * Format a capabilities value as string and append to a bprint buffer. + * @param bp A buffer to which the output string will be + * appended. + * @param name Name of the option to print (provide + * AVOptionRange.str). + * @param val An capabilities value represented as a + * double (e.g. min_value or max_value of + * AVOptionRange) + * @return 0 on success, a negative error code otherwise. Even if + * return value indicates success, the state of the bp variable + * should also be checked, as it may have experienced memory allocation + * trouble. + */ +int avdevice_capabilities_bprint_num(AVBPrint *bp, const char *name, double val); + /** * Free resources created by avdevice_capabilities_create() * diff --git a/libavdevice/version.h b/libavdevice/version.h index 0df40ef4c7..8f92c3b85b 100644 --- a/libavdevice/version.h +++ b/libavdevice/version.h @@ -28,8 +28,8 @@ #include "libavutil/version.h" #define LIBAVDEVICE_VERSION_MAJOR 59 -#define LIBAVDEVICE_VERSION_MINOR 3 -#define LIBAVDEVICE_VERSION_MICRO 102 +#define LIBAVDEVICE_VERSION_MINOR 4 +#define LIBAVDEVICE_VERSION_MICRO 100 #define LIBAVDEVICE_VERSION_INT AV_VERSION_INT(LIBAVDEVICE_VERSION_MAJOR, \ LIBAVDEVICE_VERSION_MINOR, \ From patchwork Tue Jul 6 09:20: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: 28808 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a5d:965a:0:0:0:0:0 with SMTP id d26csp4922354ios; Tue, 6 Jul 2021 02:26:05 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwGYtilez3f0iIfPEPbNPzTnxeFmW3vZ7ZCZW8mFbtjgJU4Hr5QPx4DlTOuqVUOJeiAIdBP X-Received: by 2002:a05:6402:d4a:: with SMTP id ec10mr3705496edb.104.1625563565403; Tue, 06 Jul 2021 02:26:05 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1625563565; cv=none; d=google.com; s=arc-20160816; b=s9yk64X7XUwPoISNW9WoeoZ31pxu81iXLaFZGbwQANzqNs3YGhAnnSpnCmhweUix8K 2FF/y+KtkX3gJ4xW0KPVnwnPH7b3keorOvjZZ0FheneeMxUgFPmsPtQaq1P0Q3Lko5nm iNsbJl2aEVgxv8mGc5hAJAEbyM9wGJ9g0R/38swUiJwfYvxnSa06LqftriaQfwvJtTa5 W2jteGQWOry6JYERWauxjS1agtLoiGVvLIqBgI+UGyb4MBy63rLRRvw8nDgoEnUTD+1J zYaiiFfaFddnuvxaUBrsCmHMQn+CIXO8TPj5lM4rNpicmW80lhJcNfK8tl1VqS8YPXZb P7cw== 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=26b+l0uiGi3g2EY99v4JTeu6pcwxAkH0QkV1mNKql+c=; b=gCIHEUW5sbJGHnfSt3X3zPAtdhE2Wurv/CryUEHcxJdRKqkvTM8ofW96iMH/bH3CYN zoLA2Yk22dWLYtpCmKmuvvNpVTTvDGC6p6Zj0bS+NkY3Sgfawx98gtrkQxJS39m0ykqc eGc7spl7CzzUp668xT+wson2/GVznvl68K1+0IlbVXaTsL1RXJU3QiFbKxMuRlk0ZGAa DmjZ1rTbZRtipuGEsdh3HWlktTQz9K3Q5jNyh2oH7XvYLAwQMJTKH7s+NektDX/VAwVm qmZ/oSDkfi4Og1RVlFvDvFp93YD8+pkBmk39Yi7Hcob4tovN8zzjGlB9vmADbobGLo3G g98A== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b="n/iAMM9B"; 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 cf28si6366767edb.137.2021.07.06.02.26.05; Tue, 06 Jul 2021 02:26:05 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b="n/iAMM9B"; 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 5C86968A654; Tue, 6 Jul 2021 12:25:56 +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 9AEC868A88B for ; Tue, 6 Jul 2021 12:25:54 +0300 (EEST) Received: by mail-lf1-f54.google.com with SMTP id p16so9715224lfc.5 for ; Tue, 06 Jul 2021 02:25: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=xAqHskn3QndmsV6c7v0UizVEfsfEJ8gymPJtCdK1HLg=; b=n/iAMM9BnDySAMn+a9Dz+baoqOy6e8GHbARn3YSIOr4iO4QaLm5+gcYeZNbnYrQEe9 E76R8LdyLdvUtpLeFFe5zWZXg3y+rsXjtBRrIf/+Q8ywV43DbKWG9rfJda5j4A1719AV ycU6jkkyQpCiGs6ufDegrK9jY0VIzbKiKl93LOkPSV9rObPy2prqInYCu41Sc94DH4VS wxlsTyeLLv4yHOYB0gwiyxmOT8rL0VsK4SK98kh/7qB5bFaVSr5V6V6rCimGGuBpujn0 Ym2sg1gMSVuQLkvBZsg/RM719THZEI7+i/EHTJK5yzSu/K2cZ1f+yr8Oayn2tPvuKZOI BfIw== 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=xAqHskn3QndmsV6c7v0UizVEfsfEJ8gymPJtCdK1HLg=; b=TAiJcepdbyLO2uShUBxm5ptHu/zRC3+dSUKnCAo62qMKjPMYngiOURh1oZskIyuk4S ztnUc1ufB+/t+KAROTGFlMl1Fl/V1w22oOA6+sN0i+FlyifaMvv1EmQLxJDjAaHN5gU8 aJXsrO6Ewl7cTbiI47Oy7UpXXsdL2eXcQ06EMaFPtuPARON08ulVIkajIicoGdrKMtGR t2se8jhXG5LJZyyXmRmyhiFX6nIrmjr2k9Yivs3pUuzuMpGtDCyYIRs8PYM+VO0V8YGf opWdFQIIOVAGmlP8nxxD9FubLG/YYDfFfIUZYs7vo0ENEYutJ0vuhbObgtSIjifbkkNC QAQg== X-Gm-Message-State: AOAM531mOp/89EvF/P0+TTxoZu+xNAN5aMtepNdMBhK02MRYpZ7YFS5a aDX1g9fz1MNcidWLnh7tDujP48Nheas= X-Received: by 2002:ac2:4e98:: with SMTP id o24mr13830970lfr.604.1625563553756; Tue, 06 Jul 2021 02:25:53 -0700 (PDT) Received: from localhost.localdomain (deedock.humlab.lu.se. [130.235.135.183]) by smtp.gmail.com with ESMTPSA id d6sm1335617lfc.183.2021.07.06.02.25.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 06 Jul 2021 02:25:53 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Tue, 6 Jul 2021 11:20:12 +0200 Message-Id: <20210706092020.1057-27-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20210706092020.1057-1-dcnieho@gmail.com> References: <20210706092020.1057-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v3 26/34] 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: uMuelUMGfFWu 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 5b9f61926b..bc3cc2caa2 100644 --- a/libavdevice/dshow.c +++ b/libavdevice/dshow.c @@ -80,6 +80,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(DXVA2_ExtendedFormat *fmt_info) { switch (fmt_info->NominalRange) @@ -1632,26 +1652,6 @@ static int dshow_control_message(AVFormatContext *avctx, int type, void *data, s return ret; } -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 Tue Jul 6 09:20: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: 28813 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a5d:965a:0:0:0:0:0 with SMTP id d26csp4922483ios; Tue, 6 Jul 2021 02:26:16 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxDbf74C+nH/TfBmWjKttw+45EIXDA0ZLoLO6s1N9lHZIDVTuFfAq8t0LixFAsgK8GyyHuG X-Received: by 2002:a17:907:7d8c:: with SMTP id oz12mr17215631ejc.202.1625563576541; Tue, 06 Jul 2021 02:26:16 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1625563576; cv=none; d=google.com; s=arc-20160816; b=MejBZmWeDPsoC7N20qRWcN7tbY1NWElY9bAERFMn6hwd+F03f9mioj286SDJINGCv3 ekExtvW/NrtbhIDvQzN4vWi87lh1F+FCIWUv//d1Gk1iLziF64mCKA905CyO+Cp1ICPY dZC1AQtQ3tcWfbJDbOvTPpaMcEetYlkrwA+lXBvi5Bvgk/tCL3WzFIWUf4KJ+hLTzKgX jt9IUTSu6mdVL/oVB6VyFT6FRWeoWXNMM1mD3OZjs1RRogeWMrlGC/P0g+Xwvx3m4BdE 6o1LgnGtjrBVW5bQ71v6/1sZg8BoBf2GfI6qxPI4D+0NnSMpG9OHPh3uAZop/aopGjap 7NOw== 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=Y7Aat5a282cXo8nZAcT0WGY700lrn5//VhRmRN+nXWA=; b=fzLmp9ZJEDl+g+3DrONL4LZXCQOvNL8YB+NENJwqftXELTxR8kpOrgslX+P5zomm+e 98UkmRQpCz7SjKIBrQA0n6sbYQIg86ewQ1rpr7n9B4h21U4S78dyrD6HwyIP/eXtt0GZ zEzqBlmMDvVMtqxkuwhFqLkhh5cytZGT9QztIGs2EnZJLGfyNkz3BIzj8oY3zlnRGVOC tul+yUC/7z61sr8uX6X8wE6VAbToSy3iwcQhkwt9XGqY8lGoFm0FS5/IGnmLob7Y1HPv v4kb9I64/EXzHffk/Bv7zW4+tcKiri4VuPaPtwIRP9Hu/pZ/dhJqU8NfZwLyWSOTyyD5 8weA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=V5VkyoYp; 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 nd35si15043738ejc.274.2021.07.06.02.26.16; Tue, 06 Jul 2021 02:26:16 -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=V5VkyoYp; 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 6932E68A8DC; Tue, 6 Jul 2021 12:26:09 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lj1-f171.google.com (mail-lj1-f171.google.com [209.85.208.171]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 4C83568A8C1 for ; Tue, 6 Jul 2021 12:26:06 +0300 (EEST) Received: by mail-lj1-f171.google.com with SMTP id k8so28209651lja.4 for ; Tue, 06 Jul 2021 02:26:06 -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=Ts0bCc27D4k9N/McLoqplW8dex7IEwqUuePWUje50YA=; b=V5VkyoYpbAZaufg6xUP47Aqvpa050n2P19ZQqidKEE8+qkfwhPNuZuJWDDEugt3cZ1 NF4agH1bM67/PTqguce3bvO3mJG3SrQ8RMJyeRgC3nl6UFp+84/GLJ8cZF2Q4f34Wr6O dTAMI0uneQyzCBOjMaUK6a1Bdp8ziN3ATjfgpwmkD3UpQ+hNJtehryAlCqONQzRjpQfD nXrr7+g9LCdEJwSnGhAx5zik0kl5nvlcjvu4JL2wzwLo83tcROqLWeEsm1qKrpyM9tsM Nx/Up5o/Tqs1pxPEAmtxK8DJbOKJ5su3gEEHFRnvr1TvZVh9Nw3kO27xNObRYWehGzt1 rQ8w== 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=Ts0bCc27D4k9N/McLoqplW8dex7IEwqUuePWUje50YA=; b=rCrELHTz6TRXJDyAFSTW1sGBwndCWeiFBr6F2J/3HYHAsrbaQlJyfvi4RdLbBEb90s E9oXIxIrVM1iNA8ccMhMrKXfhF9ArqbrJWA5Vn3lB5Qs5Pi+v0GbZ2yXqNS6Y8KcRAii zzgKP+kdPKpli1ocNDGOVvqsFJNRmq+CddccDna+ss5MWezEf6+J8qJJwyzlCxDqzJoy MvUAbHk/xgyST8ynJ/9Quya/0OYcIlzbKZilNjGbusitD6gDogFgc3MnD/InZcX+x0jP vzSK9lEvERTXrAFNdZP2qhlZMfo0kj+WcTivWK5heFVRhT6ONcDpgOV7LCkcqsM6w5bJ UqYw== X-Gm-Message-State: AOAM531ytrCfdrDNFLkyQBr2yCemMW0QHq0cZddzLvcMUwbrc/VAFI1Z /umJvVyCi6imtHZ/324RhJLpDu8zuko= X-Received: by 2002:a2e:8708:: with SMTP id m8mr14499336lji.244.1625563565404; Tue, 06 Jul 2021 02:26:05 -0700 (PDT) Received: from localhost.localdomain (deedock.humlab.lu.se. [130.235.135.183]) by smtp.gmail.com with ESMTPSA id g22sm1339593lfr.227.2021.07.06.02.26.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 06 Jul 2021 02:26:04 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Tue, 6 Jul 2021 11:20:13 +0200 Message-Id: <20210706092020.1057-28-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20210706092020.1057-1-dcnieho@gmail.com> References: <20210706092020.1057-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v3 27/34] 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: lnXLiO5S7dms 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 after cleanup. 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 bc3cc2caa2..046c39cc24 100644 --- a/libavdevice/dshow.c +++ b/libavdevice/dshow.c @@ -296,14 +296,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; @@ -321,25 +325,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]); @@ -348,10 +361,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) { @@ -360,6 +376,7 @@ dshow_read_close(AVFormatContext *s) av_free(pktl); pktl = next; } + ctx->pktl = NULL; CoUninitialize(); From patchwork Tue Jul 6 09:20: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: 28815 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a5d:965a:0:0:0:0:0 with SMTP id d26csp4922727ios; Tue, 6 Jul 2021 02:26:40 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwc0Tx391tRRd8wsBSCxQzZz6kJ4tHedonnkbB1UWboDEcEyhJk/X/VAUIxrTzwUp7cPC9Q X-Received: by 2002:a50:eb8c:: with SMTP id y12mr21564124edr.191.1625563600492; Tue, 06 Jul 2021 02:26:40 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1625563600; cv=none; d=google.com; s=arc-20160816; b=xeBDzeoCHmXFMWsjWMbwByRFOU5woh60QyDqLdJXPGWvXpF0LNEsid3n7h6Rq3PRHh pozkxQkds0b0qxCA9sU5NwGwOEZU/sYsxl+CrccafUdJTYL62AKzjDoI89LN5SWTzSdM AI88r7XTWcJ8QapCzwV7x/e6MUF5n/aZ9IYXOAYkFiH5WPvGCzeR5sblltMex65NqJRZ +RZFjvZxnJ50e4VQwuR8vNInWEUfMfZ1+ZpOp5LoEV7JTW2WS1VAKc9qSZ60Xvgwe6a4 YHhJcSZYSM52kw0bCAAH+hUINXaTjuTQVIksDVSAr/ZiFpoj8DRKp4cd849+sg8y8AKJ C+dw== 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=pzU6mpD1X64w2Pj0C+OWMcMwwNvfe5uSa4eMnp/CG1Q=; b=H/788PYdk60aKj1SWxEjl29+TJOi39SMgHwPdEA99Zqi/I+OTjShRhvd6e7iLloEK7 ciBEIZp150m6llPv1ylcQqtYtgJDfaXOjEHp5GS5kcih71T8HN4oCYSqX1f5B1SqAfGU oXgCmm0vmf+nLw67ha0RtBPa0/vYhWUL5v4HUnqSVIB4hVLRy8Quy06Ktej/nL8f3Cb+ iX0OvVG8y+QpLr+r9Lve8xiCd5naTkbUtgHVmOKp4ZcVGq2n3ZI/0o0tokBPAzR0PiWv ePN9YBS/HBMiO/1F5urytT/dWtCWt7ZDfzNkgiPdtIPXytGkFXYNuWkKcp2YqTkK/n3b sajg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=uZzBhxFp; 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 dp16si16792783ejc.554.2021.07.06.02.26.40; Tue, 06 Jul 2021 02:26: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=uZzBhxFp; 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 7A7DA68A901; Tue, 6 Jul 2021 12:26:21 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lj1-f173.google.com (mail-lj1-f173.google.com [209.85.208.173]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 774D268A8E6 for ; Tue, 6 Jul 2021 12:26:18 +0300 (EEST) Received: by mail-lj1-f173.google.com with SMTP id u25so28209716ljj.11 for ; Tue, 06 Jul 2021 02:26:18 -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=5Jof89QDZVYagHIEzH0GqQ5PnFtc7mEIV45T1zBt830=; b=uZzBhxFpE5uYPHvtKpsnapKkcrHr56snvbmtvf81NgV//bA63YlG2HxWKlkr1ewWcJ 7wglMfezQvKOs7Xupw2NiMXXJPk4WjHszDM4F45OkvVcfHVyWVEQ94uQu0CFCEdhRkQi QpH7o7RfgNXOlEJW8zeyTSA4YPkteT0bBp5hFDrc2UOu4jHNnqCiPgxu9N2tc8mV7gDR wWmz5hh55Fbjff7wPHUrf+ybKT446oJpy+c1OUD/bTqK5pbLevH22v1dwBk1hiAwKXlF tmGFbR4clScF6X6SEXAM4ayk85vPQoMZKweEjub0CVamZdDXW6XgNy2nHzN8JjY19J9y SWTw== 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=5Jof89QDZVYagHIEzH0GqQ5PnFtc7mEIV45T1zBt830=; b=P077/GkSPwYc03Y3GDlKbS4DLYNghcOOMl6CM3IjUl2DLnR7ituVX+R5S3c5zy5FHR HubtIX4YH5WKteZhdnrTE88m18CP5uMJjGxEzZDxGnobBB6CEImi82UJXeANl20kfukC SgDyHAXr4rjijQC6G3XIjaSRGhlUiwUzGZHX1LNDM+zBNG7exPLQuQjsrCJ37y8/fbD/ f8o7rF6f0CshSoeW+sn5AOx4QbKJrhenHlBG48JrfzplX4pDeplMl4/BDmW4ozLN6gG4 b/LK6bTNYVnObh8qD+K2Xum1qqAie3cHeZ567cVLCJfWHkSuym/JTWvZvRLU8lGR5RBY q9EQ== X-Gm-Message-State: AOAM53248Ol+qk72gaxmL/i9KWv5FIpKEPTb+RXtrf3l0tNi1BHyUuJK pSe7y6JzU7oxvwjW3P1o384Jhk01m9o= X-Received: by 2002:a05:651c:168a:: with SMTP id bd10mr14451192ljb.341.1625563577085; Tue, 06 Jul 2021 02:26:17 -0700 (PDT) Received: from localhost.localdomain (deedock.humlab.lu.se. [130.235.135.183]) by smtp.gmail.com with ESMTPSA id bp34sm1337006lfb.125.2021.07.06.02.26.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 06 Jul 2021 02:26:16 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Tue, 6 Jul 2021 11:20:14 +0200 Message-Id: <20210706092020.1057-29-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20210706092020.1057-1-dcnieho@gmail.com> References: <20210706092020.1057-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v3 28/34] 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: yDiuVVlGf9gE This implements avdevice_capabilities_create and avdevice_capabilities_free for the dshow device. This enables 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 device's capabilities through the list_options option with an FFmpeg tool, and listing what they want to configure in dumb text boxes. Signed-off-by: Diederick Niehorster --- libavdevice/dshow.c | 430 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 411 insertions(+), 19 deletions(-) diff --git a/libavdevice/dshow.c b/libavdevice/dshow.c index 046c39cc24..590a007073 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" @@ -839,11 +840,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; @@ -887,7 +892,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; @@ -954,7 +959,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) @@ -990,7 +997,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) { @@ -1054,6 +1061,60 @@ 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; + new_range[j]->value_max = -1.; // init (min:0, max:-1 means value not set) + ++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; + 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; + 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; + } + break; + } + case AV_DEV_CAP_QUERY_FPS: + new_range[j]->value_min = 1e7 / vcaps->MaxFrameInterval; + new_range[j]->value_max = 1e7 / vcaps->MinFrameInterval; + 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; @@ -1065,7 +1126,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); @@ -1089,15 +1150,69 @@ 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; + new_range[j]->value_max = -1.; // init (min:0, max:-1 means value not set) + ++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); + break; + case AV_DEV_CAP_QUERY_SAMPLE_RATE: + new_range[j]->value_min = acaps->MinimumSampleFrequency; + new_range[j]->value_max = acaps->MaximumSampleFrequency; + break; + case AV_DEV_CAP_QUERY_CHANNELS: + new_range[j]->value_min = acaps->MinimumChannels; + new_range[j]->value_max = acaps->MaximumChannels; + 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; + 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) { @@ -1108,6 +1223,12 @@ dshow_cycle_formats(AVFormatContext *avctx, enum dshowDeviceType devtype, } next: av_freep(&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); @@ -1230,10 +1351,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; @@ -1272,6 +1396,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); @@ -1296,7 +1421,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; } @@ -1310,12 +1435,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); } @@ -1328,8 +1456,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) @@ -1361,17 +1506,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; @@ -1455,7 +1602,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; } @@ -1881,14 +2028,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; } @@ -2034,6 +2181,249 @@ 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; + } + + // 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; + // dshow checks whether requested framerate is set by means of !ctx->framerate. + // fill with something + if (!isnan(caps->fps)) { + ctx->requested_framerate = av_d2q(caps->fps, INT_MAX); + 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. + 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 = ctx->video_codec_id ? ctx->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); + +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 = ff_device_capabilities, + .version = LIBAVUTIL_VERSION_INT, + .query_ranges = dshow_query_ranges, +}; + +static int dshow_create_device_capabilities(struct AVFormatContext *avctx, AVDeviceCapabilitiesQuery *caps) +{ + struct dshow_ctx *ctx = avctx->priv_data; + int ret = 0; + ICreateDevEnum *devenum = NULL; + + // set class so queries work + caps->av_class = &dshow_dev_caps_class; + + if (ctx->device_name[0] || ctx->device_name[1]) { + av_log(avctx, AV_LOG_ERROR, "You cannot query device capabilities on an opened device\n"); + ret = AVERROR(EIO); + goto fail; + } + + 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 fail; + } + + 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 fail; + } + + // check devices can be found + if (ctx->device_name[VideoDevice]) { + IBaseFilter *device_filter = NULL; + char *device_unique_name = NULL; + if ((ret = dshow_cycle_devices(avctx, devenum, VideoDevice, VideoSourceDevice, &device_filter, &device_unique_name, NULL)) < 0) + return ret; + + if (ret >= 0) { + ctx->device_filter[VideoDevice] = device_filter; + ctx->device_unique_name[VideoDevice] = device_unique_name; + } + } + if (ctx->device_name[AudioDevice]) { + IBaseFilter *device_filter = NULL; + char *device_unique_name = NULL; + if (dshow_cycle_devices(avctx, devenum, AudioDevice, AudioSourceDevice, &device_filter, &device_unique_name, NULL) < 0) { + /* try to access audio from combined video+audio sources as fallback */ + if ((ret = dshow_cycle_devices(avctx, devenum, AudioDevice, VideoSourceDevice, &device_filter, &device_unique_name, NULL)) < 0) + goto fail; + } + if (ret >= 0) { + ctx->device_filter[AudioDevice] = device_filter; + ctx->device_unique_name[AudioDevice] = device_unique_name; + } + } + +fail: + if (devenum) + ICreateDevEnum_Release(devenum); + + if (ret < 0) + return ret; + else + return 0; +} + +static int dshow_free_device_capabilities(struct AVFormatContext *avctx, AVDeviceCapabilitiesQuery *caps) +{ + // clear state variables that may have been set during the querying process + // (e.g. frees device names, removes device_filters, etc) + dshow_read_close(avctx); + + return 0; +} + #define OFFSET(x) offsetof(struct dshow_ctx, x) #define DEC AV_OPT_FLAG_DECODING_PARAM static const AVOption options[] = { @@ -2083,6 +2473,8 @@ 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, + .free_device_capabilities = dshow_free_device_capabilities, .flags = AVFMT_NOFILE | AVFMT_NOBINSEARCH | AVFMT_NOGENSEARCH | AVFMT_NO_BYTE_SEEK, .priv_class = &dshow_class, }; From patchwork Tue Jul 6 09:20:15 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: 28810 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a5d:965a:0:0:0:0:0 with SMTP id d26csp4922845ios; Tue, 6 Jul 2021 02:26:53 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzR9YiLBJiqPpvWdNIYWgjuJI13xosfbslgc37XZY2hDKhHMoYjgJuH+uW6OQ0F5T/fiIGn X-Received: by 2002:aa7:c405:: with SMTP id j5mr21861507edq.122.1625563613392; Tue, 06 Jul 2021 02:26:53 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1625563613; cv=none; d=google.com; s=arc-20160816; b=aToADx2BuaMy0KoB+KrM1OgiFlNnQHtawYJEEYIe6RMedirS31BozkJpJ1/GrXEKPH ZPpyFjpWUKRsT5F0ZkFaXAVWR/vMZuodYJkiMEbd/0v8ubjT+eDXq+sIeS2WMjPrW/4X jFK2kj0F+iO8RflUNnDYIxJOd7YV/z7/co9NpXbaS0QD3swlzYOa6ZFl6pDpU2glMOVj CinZ+G8d9cO4QpdFnlHZ7uZa6pLoHqBDJqFUCMLhEcmYjHBQbT8AkDciDJlAbI6hSjMs RbGZmFbNj/xxPDhvzaq7vmsPaaPZe62TGzxnjVld4SNm+5loWsU9GeE4JKlMuszt5Gly y48w== 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=tl1zOn+BN4wKoigslojN/S17c5oa5jgqvsjLynM3l5A=; b=CFAzGAnRGmVex0aeQoc1Gj6nOvGITTDXJySN7Kmx0VmE2XoVfbvFGMl+yZT01K78AL rxPc/49q10t1Cne9Z/+Lw1G4X1gkCGJDncnBhbhZMoL7tPXFRHpWO2e+iqsnj5D/+4Sf SJokvJydyb/dTFRyPJzBd6RVO9KvzegbmYkNOmIRK2lKcmFuNtjYAKXfvIOCTYG2OhHc DJnME60qC80SoxpJGoM5PgZcPiE34GddGyuiL0Z5FctMz4KvtW+jizjEyIFKyt8+FIeE sXrXptxK/HxEWnmNnyEfQryeb+Ov4LbztKMxZ+FUwbMjLtJalK4l7CQTcBhdIb3lqlkx YtpA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=X8uYdJzR; 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 b9si12227359edt.280.2021.07.06.02.26.53; Tue, 06 Jul 2021 02:26: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=X8uYdJzR; 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 8AA6168A920; Tue, 6 Jul 2021 12:26:36 +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 6B44268A906 for ; Tue, 6 Jul 2021 12:26:29 +0300 (EEST) Received: by mail-lf1-f43.google.com with SMTP id n14so37189092lfu.8 for ; Tue, 06 Jul 2021 02:26:29 -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=qfFKQXhkcuhRl2ADT89geLysnLo2M+neSwQ0qOQEo2Y=; b=X8uYdJzRLOW0RHzXbxyaJU6pF9LbLOCjU0Ov8pQVyqlrDCGscdvH0p53ybV1RAcze5 tBFmvole+CrbHuXMW166DjKtHcEDtdbQ98vzrxJylbsk0W31cFvuqfQp7NuKpa15biwc tCyZTNrOdKwlCK3+wpxif253YSLX8/ew+JBu7+/85ZV92kEK4hsjgldRx+LivGU1RBJQ cdiGwCKDmVyY7NLoODM70+wkKxHplsEXvvGjFcvFM36dnU7HaKcHBVOSxiOkoaTtpy2O EFTUcbxmFUkhcUsEPUNSp7vv65mtKlnxZag/knqOIr5cBX3tyXZZdXSfs8orGfVau2UN h1PA== 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=qfFKQXhkcuhRl2ADT89geLysnLo2M+neSwQ0qOQEo2Y=; b=rRb3/yUtGrC61nkadhSRAVr9RD9uLLvDnVULw+mLW/gMJZNG00Av1vhKJxAAfSv6sf cPZemix6TfmOgozrxKJ2VopWTHj2OBJ0WZRR6UrbFvlqi80h8iONwcGcDqkALY1eUevL J+hGfu6zH5Tb0MxgNtnjDCxZ/IKQkUA4cVIlIZvdYJ2sqKQijqiHCYaka4saeCRm0q2D yADEBJ56pSIq1VV/429Pb7LiY7029yu0jQbs3T3HPSsWW8FYWw7F41CncjqcPmJTqnU9 lYxxZ/WAmJt2C4SJOiuBXe8BNTAxXf+6484o0B8CxTO+YmY1eDb4w0SSea/j/w6Jw15R jOlg== X-Gm-Message-State: AOAM532dMVpoAoR9rDi17gT6Tfurs8y2X9emyUazI79mhTbqkArUsO/I 6YVyCm5+TYuVSXMSeCcsNnM1Z38R/vs= X-Received: by 2002:a05:6512:239d:: with SMTP id c29mr2003210lfv.355.1625563588655; Tue, 06 Jul 2021 02:26:28 -0700 (PDT) Received: from localhost.localdomain (deedock.humlab.lu.se. [130.235.135.183]) by smtp.gmail.com with ESMTPSA id i4sm1339401lfo.308.2021.07.06.02.26.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 06 Jul 2021 02:26:28 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Tue, 6 Jul 2021 11:20:15 +0200 Message-Id: <20210706092020.1057-30-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20210706092020.1057-1-dcnieho@gmail.com> References: <20210706092020.1057-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v3 29/34] 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: xYilKnxfLXYU Signed-off-by: Diederick Niehorster --- libavdevice/dshow.c | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/libavdevice/dshow.c b/libavdevice/dshow.c index 590a007073..f900e89988 100644 --- a/libavdevice/dshow.c +++ b/libavdevice/dshow.c @@ -963,6 +963,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; @@ -1580,7 +1581,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) { @@ -2465,16 +2467,16 @@ 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, - .free_device_capabilities = dshow_free_device_capabilities, - .flags = AVFMT_NOFILE | AVFMT_NOBINSEARCH | AVFMT_NOGENSEARCH | AVFMT_NO_BYTE_SEEK, - .priv_class = &dshow_class, + .free_device_capabilities = dshow_free_device_capabilities, + .flags = AVFMT_NOFILE | AVFMT_NOBINSEARCH | AVFMT_NOGENSEARCH | AVFMT_NO_BYTE_SEEK, + .priv_class = &dshow_class, }; From patchwork Tue Jul 6 09:20:16 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: 28802 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a5d:965a:0:0:0:0:0 with SMTP id d26csp4922942ios; Tue, 6 Jul 2021 02:27:04 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzqmML6Vv7/PI/TYmCIgb1POpBVNBALMnd9pKq25NVFXgjkfs1XIW/NJgICcCilxbqkA6l4 X-Received: by 2002:a17:907:3d86:: with SMTP id he6mr18047677ejc.440.1625563624030; Tue, 06 Jul 2021 02:27:04 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1625563624; cv=none; d=google.com; s=arc-20160816; b=W9DlzAsU8v7Z8T+xR3PiBvhCO7Dn13txm2XiyZUzpYLvVZQ1IGtSRL8Ry//QW4GzJD j9GpUVinmzoO7NSNAu/CfSTiD5qX6B64BkkKT0rJZxQ9b7fj65oe7QSGkhYyO41s3DUw KeVj7zVsArIBoTLuGvHxSuDtrZiJTTUtsbNHwmAdxMIIeds0R7m0/y2wXyeiI5HGpvnz T7X3cO/11xn1+cHYsiucBGH+6ea+Wh7A1o7JFDBDGeWSTWJ3/GLkA3Z3kEe/S59TeZVO GidsmNF8nL8wKXOUQ+KaIC7h3oYRazhRqSBL5YsRc/vLSCMUPUfKTHWaUhRXPJEAfdic V6IA== 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=mMruHb9GX/04GTWkmNiFEeLpD/wsgKycTHD4nuvDleA=; b=b9yct7/TmkIdpeoeXq3nsiV3ttf7OSAg+JY/uHVQyqoOQO8M+xgAz0ng0+3vB7t6EJ xqDAJWIIXSBjbjwwqoCMcTxfZKJb9S23i5BJWRezvR63QnkNw4v1ovukEGe+mCZNmaq4 OaHkogTk8mjeCJJIzllcBkZqUeqJ85ILJV6AgvkopBQTmkYwOvI2RkAL4q5RHFPSsovs Cur2slBh4y6976u+C0XZQBYU8Drh7AqxEpkufr7Kpc+NNs5nFxOFD7yX5h+6lVlV0nH9 B4GdJVRk1XG5Jk39+OhzPXTAyKDXwvnv8yzQkUtZJugVjlUfGTSe5W8dpN836KFF6SZI cVzA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=Wil12HL2; 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 cw19si13322115ejc.372.2021.07.06.02.27.03; Tue, 06 Jul 2021 02:27: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=Wil12HL2; 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 B746F68A936; Tue, 6 Jul 2021 12:26:42 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lj1-f178.google.com (mail-lj1-f178.google.com [209.85.208.178]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 1A34A68A917 for ; Tue, 6 Jul 2021 12:26:41 +0300 (EEST) Received: by mail-lj1-f178.google.com with SMTP id s18so6473823ljg.7 for ; Tue, 06 Jul 2021 02:26:41 -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=nWA/F1KE/bFpWAQAcLJza+oAlo2bbpYiWL6I6UHffys=; b=Wil12HL29VlH1QEPWv2pvlZpE/MP1D+H5UzuXn8Laa3CxtKPCpbqOdxv8alyyRSPTp gQoQTH+Se3SyvtDh2wWMoXNRCG5L4QMEaOQ7xB/HBCbqkASQ+8zPb2r9Z9JEYq2pUnQL Y2FYGug26Z8BZUCtmMCe6ObhFPi+ynmKgp3QFxpnxiWd+gQaDR6g+VoH60CYzIL7wNlC tqnkfBL80pkQFELU+i8Jl9tc1SxmNVU5LBdNogMVENQvdjkTV2V5c6b3xF+LlkHiTEvH dEDsFHWj0ATNX4HjLN0wrhj0vA67XNuDXQGBD8cAC6LqZxvTGIgrruNOigusaC9TSDR6 6WwQ== 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=nWA/F1KE/bFpWAQAcLJza+oAlo2bbpYiWL6I6UHffys=; b=l9iDzXFRZodS/lCDHGzaVm5maKitmJdQ313GxkpYDPQoqBknK4iaYvPlJexKwkohMO 43BBkeR7yt6SaUXyFGPsiikpdKNyavVh09mkcFsPZQ0001QJhFdcMRxHwtqWN5ZiwdN8 UGE7mDwkIqKRSlIo2KwCvPj/b3zo/f+kXbs17yRs+fO5poQrkxwRDOXb6lnXpTNR+etf Qbd3B46CipaA8JH0UMrSMR/Iq6ZyTfQblXr0O5QqcWU4RhEeiaJoicJ5n3ITB2aCONYr 6zbWBlODxdethFM+pkgiOZytDOp5L9vZlmYE7TqvA2rNV0S9dWe0fhcXqPGkPC5m6N7H 964w== X-Gm-Message-State: AOAM530hBCwbhn/Qbg0NLLY8pk9jP51S2Qo1y1Olo/gQQ4ODOC3koF1a gz3q8YTaEshZFWkLlQwZ2mdeKTg09QE= X-Received: by 2002:a2e:7203:: with SMTP id n3mr14510280ljc.372.1625563600173; Tue, 06 Jul 2021 02:26:40 -0700 (PDT) Received: from localhost.localdomain (deedock.humlab.lu.se. [130.235.135.183]) by smtp.gmail.com with ESMTPSA id n24sm1340051lfb.273.2021.07.06.02.26.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 06 Jul 2021 02:26:39 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Tue, 6 Jul 2021 11:20:16 +0200 Message-Id: <20210706092020.1057-31-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20210706092020.1057-1-dcnieho@gmail.com> References: <20210706092020.1057-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v3 30/34] 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: p/JU+zsC2nE9 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 case that a 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. 4b. do reset options to default and apply provided options (if any) 5. add 4b to docs of avformat_open_input Bumping avformat version. Signed-off-by: Diederick Niehorster --- libavformat/avformat.h | 29 +++++++++++++++-- libavformat/utils.c | 74 ++++++++++++++++++++++++++++++++++++++---- 2 files changed, 94 insertions(+), 9 deletions(-) diff --git a/libavformat/avformat.h b/libavformat/avformat.h index a276aad64a..a0a20b9045 100644 --- a/libavformat/avformat.h +++ b/libavformat/avformat.h @@ -1889,6 +1889,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. @@ -1984,9 +2004,9 @@ int av_probe_input_buffer(AVIOContext *pb, const AVInputFormat **fmt, * Open an input stream and read the header. The codecs are not opened. * The stream must be closed with avformat_close_input(). * - * @param ps Pointer to user-supplied AVFormatContext (allocated by avformat_alloc_context). - * May be a pointer to NULL, in which case an AVFormatContext is allocated by this - * function and written into ps. + * @param ps Pointer to user-supplied AVFormatContext (allocated by avformat_alloc_context, or + * avformat_alloc_input_context). May be a pointer to NULL, in which case an + * AVFormatContext is allocated by this function and written into ps. * Note that a user-supplied AVFormatContext will be freed on failure. * @param url URL of the stream to open. * @param fmt If non-NULL, this parameter forces a specific input format. @@ -1994,6 +2014,9 @@ int av_probe_input_buffer(AVIOContext *pb, const AVInputFormat **fmt, * @param options A dictionary filled with AVFormatContext and demuxer-private options. * On return this parameter will be destroyed and replaced with a dict containing * options that were not found. May be NULL. + * Note that if a AVFormatContext allocated by avformat_alloc_input_context + * is provided, any demuxer-private options will be overwritten by their defaults + * before applying this new set of demuxer-private options, if any. * * @return 0 on success, a negative AVERROR on failure. * diff --git a/libavformat/utils.c b/libavformat/utils.c index 0df14682a4..34e21d6450 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,12 +605,16 @@ int avformat_open_input(AVFormatContext **ps, const char *filename, s->duration = s->start_time = AV_NOPTS_VALUE; - /* Allocate private data. */ + /* Allocate private data and set options. */ if (s->iformat->priv_data_size > 0) { - if (!(s->priv_data = av_mallocz(s->iformat->priv_data_size))) { - ret = AVERROR(ENOMEM); - goto fail; + /* allocate if not already allocated */ + if (!s->priv_data) { + if (!(s->priv_data = av_mallocz(s->iformat->priv_data_size))) { + ret = AVERROR(ENOMEM); + goto fail; + } } + /* Overwrite any options already set (1: back to defaults, 2: apply options, if any) */ if (s->iformat->priv_class) { *(const AVClass **) s->priv_data = s->iformat->priv_class; av_opt_set_defaults(s->priv_data); From patchwork Tue Jul 6 09:20:17 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: 28804 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a5d:965a:0:0:0:0:0 with SMTP id d26csp4923076ios; Tue, 6 Jul 2021 02:27:15 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzNqdaIw6bz4LcXWR7h9Sy9Nga1fj8L44cytYqIhZhvyCqoTm96gvgZJFqPkqwKfd8Bbx4y X-Received: by 2002:a17:906:368e:: with SMTP id a14mr17778968ejc.60.1625563635257; Tue, 06 Jul 2021 02:27:15 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1625563635; cv=none; d=google.com; s=arc-20160816; b=heI4zSSI08+eDzHE/xTdPvqQzBWcZWwWjT8o3fhat+W6kEK7uDfDZRvdylB4NJusqc jIk0inyCBF9shpDttMBpgcb+pg/v6yHaf73dev9BbQoXo15j9g7D0oSHxhgNDaMa5w+0 B0W2qiLhjC8PBZ6LY0jrBXwyr8iFqA8ooKRy12YkUtT5XGZexfbhIh105z8gr0RVntAS sENcl+PWy2vAAF2MTEnk7YCyKEUWvRMJsW0sPNgfB/7pWNejeBIU8y6gt/GIE1/ByWkG Zw5QT/MIRnjYyjpGP3HwcwI8yjaXdVWHgiaHzYzueZQOdFpmmnNMWM6RDtpKxFh9MeZF Lq9g== 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=Ov+l6LN72ABgZ1q0m9l7Z0DIdNTE+ehxX4Wv7SlVA48=; b=Wv5aoBptJNiLxCk2eK9cKWdZRrD2NxB2ByjNHW83Pe+QnR6yo9O0vRhVy4DKtLNkvi S1NADeKP1hWd3xOrk6IZFhyfoQw21TeLVELTIHQ7m7Ea3p8wcLinvoq9opz4QouNnmnr wt84eMEf8YDT7+c4Qrc5riViG7rJbGKU2J2ouiV28cjQynH3kgqBSzhf0k3EtPSVH1Ci gKyIek0EjEzJ+xjS0sDkSL0E85YynZdwjKPGJD9WajWBgx6ptCP44mW1esQmiQ6SxWID z4m33ZsB07YmGerxFYCOokSrElC/69X8RF0XraKFcO/Az9lvgR6fFJkNySGec5gyXyuB UpPQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=VBboW4dk; 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 v10si7370690edc.102.2021.07.06.02.27.14; Tue, 06 Jul 2021 02:27: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=VBboW4dk; 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 B32D268A92D; Tue, 6 Jul 2021 12:26:59 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lj1-f178.google.com (mail-lj1-f178.google.com [209.85.208.178]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 9D71A68A942 for ; Tue, 6 Jul 2021 12:26:52 +0300 (EEST) Received: by mail-lj1-f178.google.com with SMTP id p24so28267973ljj.1 for ; Tue, 06 Jul 2021 02:26: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=x5pNMmtBjj7YYadN3yHFja2qtYgfPbldNY7RuVICA8U=; b=VBboW4dk0d0Z0FFNdTOP9ahSwf/0Rl3l5bSz/BCpdY2FkzxIHRP8kVP2ZncIUDYh1O uOBRuwekwtOELYN/stxVlr0GhxFsIGK5//oTaVLHWdMmmx1l/7ahEfHNFBNQIFUhdI1g Drk7m8WYGQakh4a0yf0Hr7bAmnkCRp6v9omOkkob+daoZvP3osya2YItcEn6jmOLxEXv W1RbVaq3xhTQt0pITgV57BMporWR+VBZRWh6WyLy5YKJX5/toYNMMbmzCab+KBxyVckF ow6uVzeVQ3MAxNdgVsGIMOpd48fnu+20gP8t9D8sdoF+bDJDqLOqs7xPfKQPrFka3Pa2 7IKw== 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=x5pNMmtBjj7YYadN3yHFja2qtYgfPbldNY7RuVICA8U=; b=ZI3qSTWqpJv7kGLNn5Ex26W3zyPoKBsxfSC61VSaXxnmM/Hdot+OxSqIfnGcgBDSLm ZpgsW6Z8SC8K0UypbTwOGxbFaXci3GKndLc9ZIozRhc7Su6bKKqVOFPk9VG406uVW0CT 72VpZyG5CJtx6OabZGwux+MVMHh7D9FJIy7+Bf5WY8px80X2vqCjczCJ4NSQ5It/kaZw NTOWd1fJqJXHr2WIGNAvUEKcvCrOtOktmKWSZgph8DOTA7JzWeW5K4ufhF1J7m3URUN9 9mUVGZtfifEHr8be3Zwtg+1TK8B0v2ysUA3PHkzXMj5GwxMrri69EZkxus/yCw84VqmH 6Fow== X-Gm-Message-State: AOAM531DZq1I3e52E3KnSxdMr1w+8jnypGS96RS/TCCDdX7DUAagP77o h1wwClYiz8MDfVPWgZgloTX+COJH3AA= X-Received: by 2002:a2e:b4b8:: with SMTP id q24mr4062780ljm.241.1625563611665; Tue, 06 Jul 2021 02:26:51 -0700 (PDT) Received: from localhost.localdomain (deedock.humlab.lu.se. [130.235.135.183]) by smtp.gmail.com with ESMTPSA id p15sm226173lfr.88.2021.07.06.02.26.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 06 Jul 2021 02:26:51 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Tue, 6 Jul 2021 11:20:17 +0200 Message-Id: <20210706092020.1057-32-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20210706092020.1057-1-dcnieho@gmail.com> References: <20210706092020.1057-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v3 31/34] doc/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: f5XOEM/fyXdo This example also shows use of get_device_list API. Also improve capability API doc in avdevice.h: now point to this example instead of rough example code given in the header. 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 | 243 +++++++++++++++++++++++++ libavdevice/avdevice.h | 33 +--- 6 files changed, 249 insertions(+), 32 deletions(-) create mode 100644 doc/examples/device_get_capabilities.c diff --git a/configure b/configure index b124411609..ab5d6fee30 100755 --- a/configure +++ b/configure @@ -1706,6 +1706,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 @@ -3716,6 +3717,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..45eb2eadf4 --- /dev/null +++ b/doc/examples/device_get_capabilities.c @@ -0,0 +1,243 @@ +/* + * 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 +#include + +int print_option_ranges(enum AVOptionType type, AVOptionRanges *ranges) +{ + for (int range_index = 0; range_index < ranges->nb_ranges; range_index++) { + int ret; + char *out_val = NULL; + AVBPrint bp; + av_bprint_init(&bp, 0, AV_BPRINT_SIZE_UNLIMITED); + 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) + av_bprintf(&bp, ", "); + av_bprintf(&bp, "%s: ", range->str); + if (range->value_min > range->value_max) + av_bprintf(&bp, ""); + else { + avdevice_capabilities_bprint_num(&bp, range->str, range->value_min); + if (range->is_range) { + av_bprintf(&bp, " -- "); + avdevice_capabilities_bprint_num(&bp, range->str, range->value_max); + } + } + } + if (!av_bprint_is_complete(&bp)) + return AVERROR(ENOMEM); + if ((ret = av_bprint_finalize(&bp, &out_val)) < 0) + return ret; + printf("%s\n", out_val); + av_freep(&out_val); + } + + return 0; +} + +void list_queries() +{ + const AVOption *opt = NULL; + const AVClass *class = avdevice_capabilities_get_class(); + while (opt = av_opt_next(&class, opt)) + fprintf(stderr, " %s\n", opt->name); +} + +void list_device_sources(const AVInputFormat *fmt) +{ + int ret; + AVDeviceInfoList *device_list = NULL; + + if (!fmt || !fmt->priv_class || !AV_IS_INPUT_DEVICE(fmt->priv_class->category)) + return; + + if (!fmt->get_device_list) { + ret = AVERROR(ENOSYS); + fprintf(stderr, " Cannot list sources. Not implemented.\n"); + return; + } + + if ((ret = avdevice_list_input_sources(fmt, NULL, NULL, &device_list)) < 0) { + fprintf(stderr, " Cannot list sources.\n"); + return; + } + + for (int i = 0; i < device_list->nb_devices; i++) { + const AVDeviceInfo *device = device_list->devices[i]; + fprintf(stderr, " %s %s (", device_list->default_device == i ? "*" : " ", device->device_name); + if (device->nb_media_types > 0 && device->media_types) { + for (int j = 0; j < device->nb_media_types; ++j) { + const char* media_type = av_get_media_type_string(device->media_types[j]); + if (j > 0) + fprintf(stderr, ", "); + fprintf(stderr, "%s", media_type ? media_type : "unknown"); + } + } + else { + fprintf(stderr, "none"); + } + fprintf(stderr, ")\n"); + } + + avdevice_free_list_devices(&device_list); +} + + + +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; + AVDeviceCapabilitiesQuery *caps = NULL; + AVOptionRanges *ranges = 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(input_name); + + // prepare query object, setting device options + ret = avdevice_capabilities_create(&caps, fmt_ctx, NULL); + if (ret < 0) { + fprintf(stderr, "avdevice_capabilities_create() failed. Possibly the input name you specified ('%s') is not available for this device ('%s').\n%s can access the following sources:\n", input_name, device_name, device_name); + list_device_sources(fmt); + 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.\nYou can query the following capabilities:\n", query_cap); + list_queries(); + 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 + ret = print_option_ranges(opt->type, ranges); + if (ret < 0) { + fprintf(stderr, "printing the AVOptionRanges failed\n"); + goto end; + } + 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 when trying to set the capability '%s'. Possibly it is not available.\nYou can set the following capabilities:\n", set_cap_name); + list_queries(); + 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; +} diff --git a/libavdevice/avdevice.h b/libavdevice/avdevice.h index 11d1a6ae12..67572db992 100644 --- a/libavdevice/avdevice.h +++ b/libavdevice/avdevice.h @@ -368,38 +368,7 @@ int avdevice_dev_to_app_control_message(struct AVFormatContext *s, * For example, setting a codec may impact number of formats or fps values * returned during next query. Setting invalid value may limit results to zero. * - * Example of the usage basing on opengl output device: - * - * @code - * AVFormatContext *oc = NULL; - * AVDeviceCapabilitiesQuery *caps = NULL; - * AVOptionRanges *ranges; - * int ret; - * - * if ((ret = avformat_alloc_output_context2(&oc, NULL, "opengl", NULL)) < 0) - * goto fail; - * if (avdevice_capabilities_create(&caps, oc, NULL) < 0) - * goto fail; - * - * //query codecs - * if (av_opt_query_ranges(&ranges, caps, "codec", AV_OPT_MULTI_COMPONENT_RANGE)) < 0) - * goto fail; - * //pick codec here and set it - * av_opt_set(caps, "codec", AV_CODEC_ID_RAWVIDEO, 0); - * - * //query format - * if (av_opt_query_ranges(&ranges, caps, "pixel_format", AV_OPT_MULTI_COMPONENT_RANGE)) < 0) - * goto fail; - * //pick format here and set it - * av_opt_set(caps, "pixel_format", AV_PIX_FMT_YUV420P, 0); - * - * //query and set more capabilities - * - * fail: - * //clean up code - * avdevice_capabilities_free(&query, oc); - * avformat_free_context(oc); - * @endcode + * @see examples/device_get_capabilities.c */ typedef struct AVDeviceCapabilitiesQuery AVDeviceCapabilitiesQuery; From patchwork Tue Jul 6 09:20:18 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: 28806 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a5d:965a:0:0:0:0:0 with SMTP id d26csp4923202ios; Tue, 6 Jul 2021 02:27:26 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwDZKaBeUkNf7AQ8AWY6ViISLKz+WTi9gkyhvBdDJbdiW8kKBr6usVN2EV69rdfB1r+0LS0 X-Received: by 2002:a05:6402:1057:: with SMTP id e23mr22269237edu.352.1625563646715; Tue, 06 Jul 2021 02:27:26 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1625563646; cv=none; d=google.com; s=arc-20160816; b=h43aESGE2PccogUzsigRgBgagIvRKU1PKeBGGtGiTWkhRFNHMkOi4mK8lA7MToUKIE RFDLtQAdQVM96DpS6VZ5AZpbna2y8ZYugTdMD5ybogsnwwZUm8eMjY12j4alPybAr7Yj nY1BuSCtOV5xeqK9KqHU4P2mnQCIw0ywJOG79OwASTvoQRFTi4PmB9EuCxOSexnov1AB XZ1cTIzJ4G0So1sUMWyaIAH56L2JYVnvMn42eo946muu1fvS99wEd0oVO9jdI0fNgIvu vR4a6bG4bDF0qC1gzpoz0FjgJ48J9Y+LJBiJWacRjhKAEq4Xsmqx8Vj1J1FnZAG4O8b6 /C6Q== 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=Wnrpl/rfLw6hxUg8W63SFuN+Nevn3KM7CoUj7eaI02hwSOr6uMJhjYYiiG3YbvXpR1 CmzzAlK1E6r3lB8AgGUyOGDxCm6nMcrcUim4CdNRgeEdxBgp4CGCJJ9E6ZGIjtoUmPSx oQU+Bemxk+TsRrSy6+hS1f/hx0uPTbegNtLN+2+NaEySkaLcv/o2X9vwxGyp4mCAshMS +Khzb+ep9afjQY6TsKeFihwT0eVfF9cnB+R9ofe6XCD7Y6bhpXUtfkYyZgll86RmWuu0 eK8Ul6kgNb8BCHPvu99+QY346KzXybA377SzC6d02tiiYDDpCbqvMBKsjt5/g3JpUbjM L9WA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=LH+4p37S; 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 bx2si9865221edb.442.2021.07.06.02.27.26; Tue, 06 Jul 2021 02:27:26 -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=LH+4p37S; 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 B47F268A956; Tue, 6 Jul 2021 12:27:05 +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 314A868A929 for ; Tue, 6 Jul 2021 12:27:03 +0300 (EEST) Received: by mail-lf1-f42.google.com with SMTP id p16so9720229lfc.5 for ; Tue, 06 Jul 2021 02:27:03 -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=LH+4p37Sme0MtStu+zTOESnSSTmB++8we3CfuqumZB8Q5gei3iwS+K74TCPqknCmkW Kpv6HcmxqYJCTTtDWhhyGygAn/olaRaT77NtXBrslS8AEXRbog99pjcMcq19N9vKEIWY 3TiHYiK9xEPtFrlt1S3duVIjYz4xRK/AjvgcrknqVvyIHcQpO7i+LAxfjQtlB6EvrGy9 8feh9ZgALbrhwh5r51f25EU15Rs77wYyZBEBZd6vs0YPO6a7CfrQjsVUnHn8NDJahs/t td08il8ChTczqvUnQnYQfaFaCYwI1yA8H1TNGqQq4Q+Ag3NaiKUi9vmBNk5whKTeGq3D reOA== 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=ZcmHnpDvhAXOM1uAVrrViXwTb0DaL7u41TUIzk33MtMM3cFgiK0OLJXVf/jQYM5eI/ nOsQ1SV32tE0kWWw2HPCES3wFUNiL/ElUlpkwEIV34iZkVyAp1Ozgh+sHSalIlQuWwJ+ qDjGrI+6A27dCf+l2oomA6NxPmzXrxO+BbkVyFmaNft/25Ez1FWdwcw/gxRqcqoalSsy fqCsOhSZrgp8R7T+ajxPb5ZO3lUPXPRsnP4YBFIfEvjuFjmpFOfx7NteXRA7dvjHcKOL RjfkDpIERrV8YWI+FraOuCzou40QxbQ6ArZSPVvRT/6tZu9adfc01BIzSQscc0KI6mL6 iA9w== X-Gm-Message-State: AOAM5332dFqqsF61aMUEKHw9PqqcxUalChg1mmx8SYsfN4ZuK6PwV4sf 4blYGO0JE378wbok8RYqx0wubL3AmtU= X-Received: by 2002:a05:6512:ba8:: with SMTP id b40mr14955493lfv.588.1625563623118; Tue, 06 Jul 2021 02:27:03 -0700 (PDT) Received: from localhost.localdomain (deedock.humlab.lu.se. [130.235.135.183]) by smtp.gmail.com with ESMTPSA id 14sm806427lft.5.2021.07.06.02.27.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 06 Jul 2021 02:27:02 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Tue, 6 Jul 2021 11:20:18 +0200 Message-Id: <20210706092020.1057-33-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20210706092020.1057-1-dcnieho@gmail.com> References: <20210706092020.1057-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v3 32/34] 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: +0L4M/bhLA53 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 Tue Jul 6 09:20:19 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: 28809 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a5d:965a:0:0:0:0:0 with SMTP id d26csp4923295ios; Tue, 6 Jul 2021 02:27:38 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyvmPvbvyKmACw0Q7a0wls5CqAuutOCIsN5jg3WYqPa8ML7f4yHkek4x8euUfAmOx7LFLbf X-Received: by 2002:a17:906:a019:: with SMTP id p25mr17610803ejy.483.1625563658317; Tue, 06 Jul 2021 02:27:38 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1625563658; cv=none; d=google.com; s=arc-20160816; b=V3uK+QQ5RN5slXL+kJQ5uHM487ed2Gz0OzVz6kpc7u6Nld6ZUbfPoWCJDiz3Ek5Oqb J9vzmR/ZHSuSJOKMEviLSde8tOuwM0tiqUHnUghUkd8To51qKvHSd9LLzzBedtD9B4yR hmuQ2fgiA9O0S7VKFk9NtuE2LPs4Xk0KiI4rM5OcBRyLsEI3L+0qrACU4MG5J1NPScgk L5gh8pYA2NChz20KfNE2JY3J4GhgqqE7PHkAF7y+h/qPYljsjh9fHmYYxIZY8fgRUfmG Cf9MsrwvTYtQaIjLATnVRPItNml8kOKr0dQ2FrHsQ0aYlOQFOqXpXqIXSvDJiucHoC0t O7+g== 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=HYBAPkc9V7XLBqm/bTdG4VH12LxRvL0j3lmDRVLFELA=; b=G/L5gxZb9CckctGD26YN41aX37htD/7k/IQldDE7WG8qa5nOIw+JuuP3eEGAJot70d IqtrYqNv+8IB1Ac5zZy9EgCogWfLGbbk4GcjUyJK4pzlmUa4afP3RcGzH1gPQn61dZ9b B9augO9UbBtdm5qtJhWmZGmC3gpl0HeVDEy1bmI8miErmx59fbdefXDxaYUAAmFtaZ6t 5G1ekAt/rJRvvA3KJ3nUVQQO4sOUGhUeomdLCHp6xrLA3yMIaLivIelhX9c86nN4CSw+ j7NHz9iA+s6gVIQrklFfoSzMm7IMicAcBNKV9VjdgR1sdIvBX+xGapvC3G24Ep0GFJrV iueA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=cBARZlWs; 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 e8si15002809edz.556.2021.07.06.02.27.38; Tue, 06 Jul 2021 02:27:38 -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=cBARZlWs; 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 ED0A268A96A; Tue, 6 Jul 2021 12:27:16 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lf1-f44.google.com (mail-lf1-f44.google.com [209.85.167.44]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 741FA68A958 for ; Tue, 6 Jul 2021 12:27:15 +0300 (EEST) Received: by mail-lf1-f44.google.com with SMTP id p21so15438449lfj.13 for ; Tue, 06 Jul 2021 02:27:15 -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=PW6QcP3xG8rUlNSZPBtFabYTOQPmGGw1r30AnJrHSJA=; b=cBARZlWszQCtG8o2hVBcAo5ROT48WmE7REZ907Pr/EgREl810wp4JT2Zsmi2iXLmay PZY187uddIzGNGfxQaH5/AsP8r86PTV2p+SuKsT2yMq38k+VrnhW3JeoLKid972oaYwU Ap2M+Y06vvOTEekYfO6ekNQqCswQ/k+g3LeEK0Y2vYnRUYHt4kBv+DcyQi/mqtWLDK3c 5mGM7m4YoB1jdyjD6j+ZSX6VlPsluZKagyXA3dr9HKIsc7+thal7Bh1yDfPVOyLpTzqr Nz4CIoLGUR4EhzuuRt9hgzJcJAH3dG8EmmIjNS8tgN8fF3W0JaCgY5DUbpo3w+TV5HJ5 BjgQ== 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=PW6QcP3xG8rUlNSZPBtFabYTOQPmGGw1r30AnJrHSJA=; b=Tn/yFnsMVKe99GxXNii/zk1t04RdepB+D+qU0Vvw27YTnRYa00MQydqNyd8N7NPfC+ 7DKJm7cB1m5fRkf9p4AoC7CQ/k8N4jx2o6yw1hCiJKoHCU56872kwCCt6NKqwlrQJQag n/roInkD2Ddw2vpLqLzwtgVF2AT1e/4hgX4LaBv+VDANUua1cigdQd2W9vB4uHQ4o/UQ 25nPFOJzWaN3YiZsmc1V/O0ZtB5SLHaEYpGG1+mS9gdWNb1KUBLJEemmScuLuAo7LGYl RF/6WmVsvBikyQ5E88yJ9viDubBZrgj+TDaxrp0eqagtb+MJDHkXDHrDKc2HKGwIDB8B xK7Q== X-Gm-Message-State: AOAM5338tdttWqgrgSXTRjjag22Vds6H5ybI6qOK/GqGq9ICgBTytCsS vbs4bKyybgXoCHkwD9DkuUYQ4GNLzL0= X-Received: by 2002:ac2:5c11:: with SMTP id r17mr2803825lfp.67.1625563634596; Tue, 06 Jul 2021 02:27:14 -0700 (PDT) Received: from localhost.localdomain (deedock.humlab.lu.se. [130.235.135.183]) by smtp.gmail.com with ESMTPSA id s5sm1800016ljj.18.2021.07.06.02.27.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 06 Jul 2021 02:27:14 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Tue, 6 Jul 2021 11:20:19 +0200 Message-Id: <20210706092020.1057-34-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20210706092020.1057-1-dcnieho@gmail.com> References: <20210706092020.1057-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v3 33/34] 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: IW2VjrSMXy2L list_options true would crash when both a video and an audio device were specified as input. Crash would occur on line 1588 (in this new rev) because ctx->device_unique_name[otherDevType] would be NULL Signed-off-by: Diederick Niehorster --- libavdevice/dshow.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libavdevice/dshow.c b/libavdevice/dshow.c index f900e89988..a66f7b81fd 100644 --- a/libavdevice/dshow.c +++ b/libavdevice/dshow.c @@ -1519,9 +1519,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; } @@ -2043,6 +2043,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 Tue Jul 6 09:20:20 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: 28814 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a5d:965a:0:0:0:0:0 with SMTP id d26csp4923388ios; Tue, 6 Jul 2021 02:27:50 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwG505wQIAemXFJyVACZQ5ddbjGX+fSsYiVTS+93ludLudVFhQ96AzsJeX983jGa2n5rvOX X-Received: by 2002:a50:f0ce:: with SMTP id a14mr20994434edm.176.1625563670194; Tue, 06 Jul 2021 02:27:50 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1625563670; cv=none; d=google.com; s=arc-20160816; b=hdLEn7yWiHuP/GMu62FhzZ81sdRkDV/J7ZkdPhum/ZLvBIDNxM/pSbzvnguuW8gu7Q FytbQvBmNf2t//nF7pamFOjxMPtGF67ryKhsWVuLdsvY9Grh2EQvX7mToFKFMBiwcDoJ xVhXM3QBUANuGRrZ+UoNjPYjhCkogmZL2DxbINYBEriaxHDBvNmjDU8uECWgLi91vON3 DcudLKfbnfYV6LGP31zzRLmWKQ1kSyFlSH1/UQpuC0Jb8akulVBgLqWJkoE/gd8oe6BM Nk9rmhEc3RoZNrjYKzPo+ueOpsIZf5GPGdBO68oKTjVeuJGKWWZm5xCiL1JJtRl98naD TMrA== 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=AD9mQxdQqw6CVmhPh7yqpRhLHifktUWmNoukHNexnfk=; b=afI0J0Rvht8YlKTElcDejg8xB3ezmnpct8K+KexzWdeq+hwQf8XkddwwdtrE+1yhlA s1d/HE0YpzRPu7ZsqgitnZkx1FV5C9AwHyzQP1ROeQu/GRXN5eQwWmsjmBU8Hy1QkP5k 9ulPYCUiNQqWV4JSbAAQUJF9LLpJL8t7MZfhGVr5ByUYUtAcSFKBD4OUqASeuxYLtWCf Vv3QwMNNCwzA0ArZN7d1TbDsbJP+uvUbbpNWQy3byd7m/7T4qOfOaFzeLuABxKESfDS5 n1v8Xv3AiCIHtKlrrZDX8GhIFS3IGWQFSlqsy5GvQ4K6qDinOQgNrkqMnzdFfh7Ug1W2 88og== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=L67DNb91; 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 hv20si3685488ejc.521.2021.07.06.02.27.49; Tue, 06 Jul 2021 02:27:50 -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=L67DNb91; 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 F423168A982; Tue, 6 Jul 2021 12:27:33 +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 ED66968A970 for ; Tue, 6 Jul 2021 12:27:26 +0300 (EEST) Received: by mail-lf1-f54.google.com with SMTP id p1so1471242lfr.12 for ; Tue, 06 Jul 2021 02:27:26 -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=9hRuUIPhfn6sRc55ga+51OmjmgcHGu9+EplVS94wSGo=; b=L67DNb91cxuJsLCvjnRLGRDk5D33PAhtmeMPf2ljrLtDjIljbDWf5r2HMMj5zE8Njn qpVPUx8qWSHpYxs+X8RH8qP7ZSN5rbIysW+sEJXwOJW5zQO5UUxAUowbKLzWqtUv2Ria PnunMGon1VE6+xe1rufqzXe8mJHLKC1wpCpoW4ktjJfri+LzH5xy1X28HViaS5GmHwZR o2feK8QVjMCkGCnYHJrL14/wGDm/YCHGCkVBkoAGmfLjFaD3ZvzRUjHZUaPpyzh1nI4+ UY+PU2jxMTaRRPQx84tCmYckSXT5tDUQ9JQjfb16aCokE8F74yoQtVq6gHTKfxOlqr4W IX+A== 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=9hRuUIPhfn6sRc55ga+51OmjmgcHGu9+EplVS94wSGo=; b=aza57ENhuswC8amXaRhTA0kgA7dV/kofXxy93XjN1y8Ou3pwiElwnjQspbFeEsdCIP IPkXesemhQFEkTLJGbXobfzsn2DkQZZH4SkApXsI7hsJidgqaQS0a6f+Lv4Lu6k7mrTC hb3l472QEo9wuS0sA+xpehM4tPfMvAUYRYAkJ/LHrW3NXCClACV7ChaRjb8p8ut/xau2 tATakS/Dy2OJylrUo2dqcDltbUWjf6qjqXveY0strJsYLAasDvDTI65/kMb0r0/k09Of WaJBabshIJZ5ZWlW7sCyUXRAvNOniUNfpcJCapfej6+60G9tM9UKWWlT5iKjBScAR/D6 IvXA== X-Gm-Message-State: AOAM533gnaVlKSjBpH8X0oZ81N3XrSEyjlNv5T7CPok6w5w6kOPvYgro /9JADI/8M2BUz74H25azlh2cCH5Yals= X-Received: by 2002:a05:6512:3618:: with SMTP id f24mr6732704lfs.517.1625563646119; Tue, 06 Jul 2021 02:27:26 -0700 (PDT) Received: from localhost.localdomain (deedock.humlab.lu.se. [130.235.135.183]) by smtp.gmail.com with ESMTPSA id 14sm1349081lfz.84.2021.07.06.02.27.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 06 Jul 2021 02:27:25 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Tue, 6 Jul 2021 11:20:20 +0200 Message-Id: <20210706092020.1057-35-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20210706092020.1057-1-dcnieho@gmail.com> References: <20210706092020.1057-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v3 34/34] 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: bOVI7tX6C1h2 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 | 110 +++++++++++++++++++++--------------- libavdevice/dshow_capture.h | 3 + 2 files changed, 66 insertions(+), 47 deletions(-) diff --git a/libavdevice/dshow.c b/libavdevice/dshow.c index a66f7b81fd..5c1fadc23d 100644 --- a/libavdevice/dshow.c +++ b/libavdevice/dshow.c @@ -858,7 +858,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 @@ -884,6 +884,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: @@ -1191,7 +1194,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. @@ -1516,12 +1519,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; + + // 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; + } 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; + return 0; } @@ -2344,7 +2354,8 @@ fail1: return ret; } -// fake class to point av_opt_query_ranges to our query_ranges function +// fake class to point av_opt functions to capabilities that can be queried, +// and av_opt_query_ranges to our query_ranges function static const AVClass dshow_dev_caps_class = { .class_name = "", .item_name = av_default_item_name, @@ -2362,49 +2373,51 @@ static int dshow_create_device_capabilities(struct AVFormatContext *avctx, AVDev // set class so queries work caps->av_class = &dshow_dev_caps_class; - if (ctx->device_name[0] || ctx->device_name[1]) { - av_log(avctx, AV_LOG_ERROR, "You cannot query device capabilities on an opened device\n"); - ret = AVERROR(EIO); - goto fail; - } + // check if device setup is needed or we will be querying capabilities of an already opened device + ctx->cap_query_already_opened = ctx->device_name[0] || ctx->device_name[1]; + if (ctx->cap_query_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)) { - 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 fail; - } - - 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 fail; - } + // if device not already opened, check that what user specified can be opened + if (!ctx->cap_query_already_opened) { + 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 fail; + } - // check devices can be found - if (ctx->device_name[VideoDevice]) { - IBaseFilter *device_filter = NULL; - char *device_unique_name = NULL; - if ((ret = dshow_cycle_devices(avctx, devenum, VideoDevice, VideoSourceDevice, &device_filter, &device_unique_name, NULL)) < 0) - return ret; - - if (ret >= 0) { - ctx->device_filter[VideoDevice] = device_filter; - ctx->device_unique_name[VideoDevice] = device_unique_name; + 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 fail; } - } - if (ctx->device_name[AudioDevice]) { - IBaseFilter *device_filter = NULL; - char *device_unique_name = NULL; - if (dshow_cycle_devices(avctx, devenum, AudioDevice, AudioSourceDevice, &device_filter, &device_unique_name, NULL) < 0) { - /* try to access audio from combined video+audio sources as fallback */ - if ((ret = dshow_cycle_devices(avctx, devenum, AudioDevice, VideoSourceDevice, &device_filter, &device_unique_name, NULL)) < 0) - goto fail; + + // check devices can be found + if (ctx->device_name[VideoDevice]) { + IBaseFilter *device_filter = NULL; + char *device_unique_name = NULL; + if ((ret = dshow_cycle_devices(avctx, devenum, VideoDevice, VideoSourceDevice, &device_filter, &device_unique_name, NULL)) < 0) + return ret; + + if (ret >= 0) { + ctx->device_filter[VideoDevice] = device_filter; + ctx->device_unique_name[VideoDevice] = device_unique_name; + } } - if (ret >= 0) { - ctx->device_filter[AudioDevice] = device_filter; - ctx->device_unique_name[AudioDevice] = device_unique_name; + if (ctx->device_name[AudioDevice]) { + IBaseFilter *device_filter = NULL; + char *device_unique_name = NULL; + if (dshow_cycle_devices(avctx, devenum, AudioDevice, AudioSourceDevice, &device_filter, &device_unique_name, NULL) < 0) { + /* try to access audio from combined video+audio sources as fallback */ + if ((ret = dshow_cycle_devices(avctx, devenum, AudioDevice, VideoSourceDevice, &device_filter, &device_unique_name, NULL)) < 0) + goto fail; + } + if (ret >= 0) { + ctx->device_filter[AudioDevice] = device_filter; + ctx->device_unique_name[AudioDevice] = device_unique_name; + } } } @@ -2420,9 +2433,12 @@ fail: static int dshow_free_device_capabilities(struct AVFormatContext *avctx, AVDeviceCapabilitiesQuery *caps) { + struct dshow_ctx *ctx = avctx->priv_data; + // clear state variables that may have been set during the querying process // (e.g. frees device names, removes device_filters, etc) - dshow_read_close(avctx); + if (!ctx->cap_query_already_opened) + dshow_read_close(avctx); return 0; } diff --git a/libavdevice/dshow_capture.h b/libavdevice/dshow_capture.h index 127695a86b..06ac4a6fd6 100644 --- a/libavdevice/dshow_capture.h +++ b/libavdevice/dshow_capture.h @@ -345,6 +345,9 @@ struct dshow_ctx { int sample_rate; int sample_size; int channels; + + // for capabilities query + int cap_query_already_opened; }; /*****************************************************************************