From patchwork Fri Mar 25 14:10:20 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Diederick C. Niehorster" X-Patchwork-Id: 34962 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:ab0:5fda:0:0:0:0:0 with SMTP id g26csp1376287uaj; Fri, 25 Mar 2022 07:11:20 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxXUZGJkt1xC9N08llhCHf7dHDgr0UfJUapQ0C71z8eGtVQn7n41k0cAHH6S5cUwEMgxQWR X-Received: by 2002:a17:906:ae0b:b0:6df:c7d6:9235 with SMTP id le11-20020a170906ae0b00b006dfc7d69235mr12027991ejb.664.1648217480628; Fri, 25 Mar 2022 07:11:20 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1648217480; cv=none; d=google.com; s=arc-20160816; b=hG1zaG4Dd6u8HZJ8ZykVNpahjYBdEGaToD6Xgk85ck+rLJ98B5hanRCAZIUVrMvRFP CuDPJIGqPpWV/DMP4Y/h0Fy7N6Vwh3Bzt9vVCQE2gJC/Oj8ikMGvcflme8p4+9D+DdyV aViJdzNLTtvThnMY3nBBcN8YeOqw825syqpIWjsLGTkVZuF3GHer/pkhSPZbn5PpWy8d gvJYkJL9BQ9uX4nnbfuRPMRrWTTGXIwSyvHPLs/iCXWZw9sV1EP/GPP9epd4n8iyhIhb HKiWXDS8LA6pg0r2U/BxHhtw/rs3NDZOLsdzupQ1iCZ2m/nAUV664AteWzg+iENuziZ0 7tGA== 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=OdXWPt/cYUDpKIcG0gYBl/JDGmi3JxvcAX95ZDxyKkY=; b=seVFuppa+Vp6IVSbdNt1gQL41FpabElY1YaEnlC0bG73tRO8F9gd4zIgnbmtC/uC9S InCqYx15LXPO/ztAU863DPJKRfHaAnBKcKxe6RcQzlcXBd4pG5wXt93PcNcr+ZmED82V 0XDE8kROYPlAxzFCsuvfpcExgmDrLX+hEalCgyNfMSUOIF053wig5gLVDsn/JWyR8MKO g19paUgywcx0rsbrBuJ3dYgglx2Q3vP4qfvhtSC4l9MNkd/a6BO6uz2D3ENzNtpFiwTg LB3osa7AB3RwUMbPZJtjw61oQiqTM5ntq8bs4zrlQUyY9hkhOK1b3hMrPAWh9lp1TVK7 7j2A== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=iXQonLQ5; 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 o5-20020a170906768500b006df76385de7si2730923ejm.647.2022.03.25.07.11.20; Fri, 25 Mar 2022 07:11: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=20210112 header.b=iXQonLQ5; 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 8CB2768B229; Fri, 25 Mar 2022 16:11:11 +0200 (EET) 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 EE0FD68A2CF for ; Fri, 25 Mar 2022 16:11:04 +0200 (EET) Received: by mail-lj1-f171.google.com with SMTP id q14so10445962ljc.12 for ; Fri, 25 Mar 2022 07:11:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=og1PEU8UG/emqhcpeOuIkabshXI3ULsjkmvpqXudE4k=; b=iXQonLQ5AbvTHGw9su/1TubTiVnQjhSoYNfTi5WjO5typz9IjOhTdtGj2jmfM+U244 m9+jPVlrMP3vw0+dx9R9b2/FLOsxJcYT0MvGvWwXfxe1ucB1wQrDrtd6zlFUkWOPifr8 fk7u5zOfIL4Z+CtXD8SMfMYpASnEZhD5NwIJ0woXsC9CzWX/wYT27zMofzVcpj5x5bSG 8fxmGFxB652aad/+dEKEd6kDzFqLC+gTISOBFmY6TboPWHTAcIi3ojv68IR2jVXHpdqG h2Ks9bgXS+gq7QScqRI6YqLs+zbIn3hEqcQKBSFNNhBvLDDrS/GKjV9wsjPTi4Q2z01e S/pg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=og1PEU8UG/emqhcpeOuIkabshXI3ULsjkmvpqXudE4k=; b=cdgGGP4v3QayeVk1Fd6N5nvIoN2qXkijEcBz4Qpejq9VCU1pefpoQnVANXl0zdkn2X ix1ob+KxAPxRfsz14RbH1zVnhKbZkHEtIKyrbuOoKCZxYKnCsMGE6nw9O3g+KzF+NpeP rS1Q0KtCld6VK6LMlSvNk8JUTwHZ1pdWiof91tcVpt0MUL3IkbK6xCAKIUcg/sRWjd/P kS0+8Lt2258k73G46euj3oKAWjh6PIGGoztBMQsFMQ2mAsGc7N1b1UcXB9KgW2yvr6tj oM7sC/26DX0/ELOmK2KyfkXUXhl78+MJNKBebDOzg67oAzIu1J6kY1RoOOwl3g5YYzjT U/rQ== X-Gm-Message-State: AOAM531GuOkz+AEjMfEY69D0ggE5BI5NYJPePH3ZgVidTSmLtdYaxOYO i8wTrlL0xos+t49xzeAPeX2C0ecPZg8= X-Received: by 2002:a05:651c:887:b0:247:f630:d069 with SMTP id d7-20020a05651c088700b00247f630d069mr8362902ljq.514.1648217464056; Fri, 25 Mar 2022 07:11:04 -0700 (PDT) Received: from localhost.localdomain (deedock.humlab.lu.se. [130.235.135.183]) by smtp.gmail.com with ESMTPSA id n13-20020a056512388d00b00443d9064160sm718022lft.125.2022.03.25.07.11.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 25 Mar 2022 07:11:03 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Fri, 25 Mar 2022 15:10:20 +0100 Message-Id: <20220325141041.1748-2-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20220325141041.1748-1-dcnieho@gmail.com> References: <20220325141041.1748-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v4 01/22] avdevice/dshow: fix regression 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: +PNQJ9DCFoH+ a1c4929f accidentally undid part of d9a9b4c8, so the bug in ticket #9420 resurfaced. Fixing again. Signed-off-by: Diederick Niehorster --- libavdevice/dshow.c | 23 ++++++----------------- 1 file changed, 6 insertions(+), 17 deletions(-) diff --git a/libavdevice/dshow.c b/libavdevice/dshow.c index 6039578ff9..abb8325bc3 100644 --- a/libavdevice/dshow.c +++ b/libavdevice/dshow.c @@ -1002,23 +1002,12 @@ dshow_cycle_formats(AVFormatContext *avctx, enum dshowDeviceType devtype, ); continue; } - if (requested_sample_rate) { - if (requested_sample_rate > acaps->MaximumSampleFrequency || - requested_sample_rate < acaps->MinimumSampleFrequency) - goto next; - fx->nSamplesPerSec = requested_sample_rate; - } - if (requested_sample_size) { - if (requested_sample_size > acaps->MaximumBitsPerSample || - requested_sample_size < acaps->MinimumBitsPerSample) - goto next; - fx->wBitsPerSample = requested_sample_size; - } - if (requested_channels) { - if (requested_channels > acaps->MaximumChannels || - requested_channels < acaps->MinimumChannels) - goto next; - fx->nChannels = requested_channels; + if ( + (ctx->sample_rate && ctx->sample_rate != fx->nSamplesPerSec) || + (ctx->sample_size && ctx->sample_size != fx->wBitsPerSample) || + (ctx->channels && ctx->channels != fx->nChannels ) + ) { + goto next; } } From patchwork Fri Mar 25 14:10:21 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Diederick C. Niehorster" X-Patchwork-Id: 34963 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:ab0:5fda:0:0:0:0:0 with SMTP id g26csp1376356uaj; Fri, 25 Mar 2022 07:11:30 -0700 (PDT) X-Google-Smtp-Source: ABdhPJx+HTALfbkD3EVReOlOw5DH4uREy6K9G5kErMy9q9Td8/3AOlHoduiqmVv8VEzlnwjghE8f X-Received: by 2002:a05:6402:18:b0:410:86cd:9dce with SMTP id d24-20020a056402001800b0041086cd9dcemr13417977edu.70.1648217490792; Fri, 25 Mar 2022 07:11:30 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1648217490; cv=none; d=google.com; s=arc-20160816; b=XlPCmLWq3sYRvNF1w3eNJ99Teq56Mh/gTw6ljkyFhLWUMap7PTEO0xoA6Ax6PrKDNZ 5V/2A9OZP0PNkml7xhj+mTfbbzcPlVwZ6D+IIbq/RvJZER5364LUHQcVdlh4FUKdc4g3 FYOAd7elmzlohIrrikKLQ+Bv4b/PHZiFfmxCvbbwu0cGZ67HZRkaBCFqgLm7VEpRWtiZ /wjcmo/FMwP8TulTIGkB90oqE1vn947ZSlANmG6b3I+eF5mT7YktqpxcrRRqx0NSPXjq U7x6Qry5KdR85zSKH4JWyISbQPOANVr42C7c5V1nYi3VunTiceUc5co15uy+farOPU+P zJug== 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=3snGBuOwmhowU55f3H/s2KYtk+TEC+8f4GqAvO9S+s8=; b=WvzolNMeW7HSfe6XOwZs1eehSS2Lp8z/8ZK1Xf9v9ydfw5ZQmXEdwFFk+oiORNgi5C LOvPDcoAKl1J5w566V9Q/DAwR4EocUaF8vzKe5X+UJhJGEfi0a3IFJPDmctk71yLlq7Z Y10CbBkUcL+mUgFjmGLAjkVdmFmIDp8p0LcmwOH+XxVf6YwCLhf5kwgSHQuhsJfY6heN FSzpf8cNNeJBB5Zra1N2iUkqzACQE1j/MvjQ35kmmTifRycs05IJ43wa9JpgwErFmq33 ytZI+GEqc6HCnyRzXa6lYOmrni1541rX+rq7aDYDU2GyBEqp348nXneG0mzxk60bcXlK fzZg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b="AOmEGME/"; 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 p23-20020a1709061b5700b006df76385f35si2706356ejg.981.2022.03.25.07.11.30; Fri, 25 Mar 2022 07:11: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=20210112 header.b="AOmEGME/"; 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 A744368B223; Fri, 25 Mar 2022 16:11:26 +0200 (EET) 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 344CB68B226 for ; Fri, 25 Mar 2022 16:11:20 +0200 (EET) Received: by mail-lj1-f169.google.com with SMTP id q14so10447061ljc.12 for ; Fri, 25 Mar 2022 07:11:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=tXs8ox1/4RHrSDOFWIJWqjZWHt/g1eY+wm8TMZiRvpA=; b=AOmEGME/DqcFUgbBg3YDwIDLAiYjRzh/uQP7WX6pBGMUat+uyufX9QtFepoyWxt9GP xPW81LB3cW1cD5XAAVXc2Fxp7MZftZWPqX1Ba0VB+zk+B8td8mGavwvG+ikpk5+qTefx OiAKv7twBSmnsWHYj7RWZEdCgnsLpnWXP9mp2VjpXIaFr5UNRvLgbsoGGTdlYCZQnzqj O/2jocysBF7j5rt6gaIIM2uQt44FRSfkNTdaOcXZ97PG6NgdVIVuUTYa4TtSHyOHyuil 4SjEl130ai/zLAZwuuII9yUnwf7pdsvwoWZdZJQJca559faLAy1eFzsNcXsGCa5kEaNg nZTw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=tXs8ox1/4RHrSDOFWIJWqjZWHt/g1eY+wm8TMZiRvpA=; b=j1t/MMwiRW7Yf3ktlsnJnfMvaJ4/BuGYu51G9B+ACP5wOro+hje0o3De6KpRjgOpvB ZtTdFg/lhh2z01XeT8nhe4dDy3ySZYIkJvU4Vlk3ZAKhEbLYn2dCf1hdV+jlFreANFsd flJRc0mOAsKObRg8uaroEW3Oi0EgYBVCLwM01ZlgeRDnVdl8KwQLWSRNBwbHDPirTypF 2fZHaXf2AQkefmcm5lYy0SZTaDNj/vFE612TxAn/YnSx57yaSwRiGQpmTNG+Y+FLQfTg sKYcsts/F3L2B8L+GxOumLefoYiZ6ukKCgV+UrHnUHYr2KxL2hJJ0MHtqHTnChvEyvPg wtFA== X-Gm-Message-State: AOAM533hkbKpxdhB6v/5UR4+doq0pDguAP2B1M2PBKbwcZl0/UP02TYt yL8yhBRtRmoFtmGxT4ogRlhNxMCn8kY= X-Received: by 2002:a2e:3607:0:b0:249:87a5:af18 with SMTP id d7-20020a2e3607000000b0024987a5af18mr8388605lja.93.1648217478913; Fri, 25 Mar 2022 07:11:18 -0700 (PDT) Received: from localhost.localdomain (deedock.humlab.lu.se. [130.235.135.183]) by smtp.gmail.com with ESMTPSA id s6-20020a197706000000b0044a3dd3773csm719516lfc.47.2022.03.25.07.11.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 25 Mar 2022 07:11:15 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Fri, 25 Mar 2022 15:10:21 +0100 Message-Id: <20220325141041.1748-3-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20220325141041.1748-1-dcnieho@gmail.com> References: <20220325141041.1748-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v4 02/22] avdevice: lock to minor version of avformat 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: /IBstty0hbol As per discussion on the list ( https://ffmpeg.org/pipermail/ffmpeg-devel/2021-June/281513.html, see especially https://ffmpeg.org/pipermail/ffmpeg-devel/2021-June/281586.html), to resolve the the unholy ABI-relationship between libavdevice and libavformat and allow easier working on the part of the avdevice API that lives in avformat, lock avdevice to a specific major and minor version of avformat. Documentation of this restriction added. Signed-off-by: Diederick Niehorster --- libavdevice/avdevice.c | 13 +++++++++++++ libavdevice/avdevice.h | 10 ++++++++++ libavdevice/version.h | 13 ++++++++++++- libavformat/avformat.h | 3 +++ libavformat/utils.c | 5 +++++ libavformat/version.h | 14 ++++++++++++-- libavutil/avutil.h | 3 +++ libavutil/macros.h | 3 +++ 8 files changed, 61 insertions(+), 3 deletions(-) diff --git a/libavdevice/avdevice.c b/libavdevice/avdevice.c index 833d200054..9b684251aa 100644 --- a/libavdevice/avdevice.c +++ b/libavdevice/avdevice.c @@ -19,6 +19,7 @@ #include "libavutil/avassert.h" #include "libavutil/samplefmt.h" #include "libavutil/pixfmt.h" +#include "libavformat/version.h" #include "avdevice.h" #include "internal.h" #include "config.h" @@ -39,6 +40,18 @@ unsigned avdevice_version(void) return LIBAVDEVICE_VERSION_INT; } +unsigned avdevice_version_same_minor() +{ + // check version of loaded lavf has same major and minor version as + // this library was compiled against + // NB: this function doesn't have to be called, dynamic linker will + // signal error when avformat of wrong major or minor version is found. + if ((avformat_version_same_minor()) & ~0xFF != (LIBAVFORMAT_VERSION_INT & ~0xFF)) + abort(); + + return avdevice_version(); +} + const char * avdevice_configuration(void) { return FFMPEG_CONFIGURATION; diff --git a/libavdevice/avdevice.h b/libavdevice/avdevice.h index 0b32e59fed..db16a2f27e 100644 --- a/libavdevice/avdevice.h +++ b/libavdevice/avdevice.h @@ -47,6 +47,16 @@ * * To use libavdevice, simply call avdevice_register_all() to register all * compiled muxers and demuxers. They all use standard libavformat API. + * + * Note that libavdevice is locked to be used with the same major and minor + * version of libavformat that it was built against. Attempting to use a + * shared build of FFmpeg or its libavdevice library with a libavformat of + * a different major or minor version will generate a dynamic linker error. + * This is achieved by the internal function check_avformat_same_minor() in + * avdevice.c. This function does not have to be called, its call to + * avformat_version_same_minor() (a macro which expands to a name with the + * specific major and minor version of avformat embedded in it) is sufficient + * to trigger link failure. * * @{ */ diff --git a/libavdevice/version.h b/libavdevice/version.h index 09c1d778dc..01e566a1be 100644 --- a/libavdevice/version.h +++ b/libavdevice/version.h @@ -26,10 +26,11 @@ */ #include "libavutil/version.h" +#include "libavutil/macros.h" #include "version_major.h" -#define LIBAVDEVICE_VERSION_MINOR 6 +#define LIBAVDEVICE_VERSION_MINOR 7 #define LIBAVDEVICE_VERSION_MICRO 100 #define LIBAVDEVICE_VERSION_INT AV_VERSION_INT(LIBAVDEVICE_VERSION_MAJOR, \ @@ -42,4 +43,14 @@ #define LIBAVDEVICE_IDENT "Lavd" AV_STRINGIFY(LIBAVDEVICE_VERSION) +/** + * avdevice_version_same_minor() expands to a function with + * the same minor and major version it was compiled against + * encoded in it. Enables locking to the minor version of + * other libraries they were compiled against. Does not have + * to be called by user. + */ +#define avdevice_version_same_minor AV_MAKE_MAJOR_MINOR_FUNC_NAME(device,LIBAVFORMAT_VERSION_MAJOR,LIBAVFORMAT_VERSION_MINOR) +unsigned avdevice_version_same_minor(); + #endif /* AVDEVICE_VERSION_H */ diff --git a/libavformat/avformat.h b/libavformat/avformat.h index f12fa7d904..350912e272 100644 --- a/libavformat/avformat.h +++ b/libavformat/avformat.h @@ -64,6 +64,9 @@ * set by user for input, always set by user for output (unless you are dealing * with an AVFMT_NOFILE format). * + * Note that libavdevice is locked to a specific major and minor version of + * libavformat, see @ref lavd "libavdevice" for more details. + * * @section lavf_options Passing options to (de)muxers * It is possible to configure lavf muxers and demuxers using the @ref avoptions * mechanism. Generic (format-independent) libavformat options are provided by diff --git a/libavformat/utils.c b/libavformat/utils.c index 3f253c2045..5c4f14535e 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -64,6 +64,11 @@ unsigned avformat_version(void) return LIBAVFORMAT_VERSION_INT; } +unsigned avformat_version_same_minor() +{ + return avformat_version(); +} + const char *avformat_configuration(void) { return FFMPEG_CONFIGURATION; diff --git a/libavformat/version.h b/libavformat/version.h index f4a26c2870..ac14f8eb37 100644 --- a/libavformat/version.h +++ b/libavformat/version.h @@ -28,11 +28,12 @@ */ #include "libavutil/version.h" +#include "libavutil/macros.h" #include "version_major.h" -#define LIBAVFORMAT_VERSION_MINOR 20 -#define LIBAVFORMAT_VERSION_MICRO 101 +#define LIBAVFORMAT_VERSION_MINOR 21 +#define LIBAVFORMAT_VERSION_MICRO 100 #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ LIBAVFORMAT_VERSION_MINOR, \ @@ -44,4 +45,13 @@ #define LIBAVFORMAT_IDENT "Lavf" AV_STRINGIFY(LIBAVFORMAT_VERSION) +/** + * avformat_version_same_minor() expands to a function with + * the same minor and major version it was compiled against + * encoded in it. Enables locking to the minor version of + * other libraries they were compiled against. + */ +#define avformat_version_same_minor AV_MAKE_MAJOR_MINOR_FUNC_NAME(format,LIBAVFORMAT_VERSION_MAJOR,LIBAVFORMAT_VERSION_MINOR) +unsigned avformat_version_same_minor(); + #endif /* AVFORMAT_VERSION_H */ diff --git a/libavutil/avutil.h b/libavutil/avutil.h index 4d633156d1..94ce472c27 100644 --- a/libavutil/avutil.h +++ b/libavutil/avutil.h @@ -76,6 +76,9 @@ * situations may change slightly (and be documented). All those are accompanied * by an entry in doc/APIchanges and incrementing either the minor or micro * version number. + * + * Note that libavdevice is locked to a specific major and minor version of + * libavformat, see @ref lavd "libavdevice" for more details. */ /** diff --git a/libavutil/macros.h b/libavutil/macros.h index 2a7567c3ea..dab530a8a0 100644 --- a/libavutil/macros.h +++ b/libavutil/macros.h @@ -73,6 +73,9 @@ * @} */ +#define AV_MAKE_MAJOR_MINOR_FUNC_NAME_IMPL(name,major,minor) av ## name ## _version_ ## major ## _ ## minor +#define AV_MAKE_MAJOR_MINOR_FUNC_NAME(name,major,minor) AV_MAKE_MAJOR_MINOR_FUNC_NAME_IMPL(name,major,minor) + #define AV_PRAGMA(s) _Pragma(#s) #define FFALIGN(x, a) (((x)+(a)-1)&~((a)-1)) From patchwork Fri Mar 25 14:10:22 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Diederick C. Niehorster" X-Patchwork-Id: 34965 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:ab0:5fda:0:0:0:0:0 with SMTP id g26csp1376429uaj; Fri, 25 Mar 2022 07:11:42 -0700 (PDT) X-Google-Smtp-Source: ABdhPJx/NVTR5srDNKpECTy/kC6jqWMH+T36+i6+fRXEfcRhixUP4g8JEZf0KuOM0agOHQzchHLt X-Received: by 2002:a17:906:a08b:b0:6cf:65bc:e7de with SMTP id q11-20020a170906a08b00b006cf65bce7demr11974069ejy.220.1648217502057; Fri, 25 Mar 2022 07:11:42 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1648217502; cv=none; d=google.com; s=arc-20160816; b=E2gfzDTiWve72Kkr8XWzbQ8QSpvbgZQJimUOYw0f4IRMEJKWn5hTdy2GISqEXdfQ/c ZgQBwJQYbDWITPpkEtxFlRcy7uKrpnIUFwXUZh3M21MaYs9hcRVD7cLEk2pLXjGSsOzz 0zALP8ZmMIVXs7BFqILYzj/ANyXDc5Y2/0wvw0XaQdpwZDrR81IJMEWdAgZLwcmcvWa5 b2BBcjL9emhxEjn9K4mNufoSi9aDq7e8QAzgPx8SER0HV52dqjHf5RdHL9H3ekg2ZDoY COGu81FRFJpFfdCymh35NitGjtcNzTadMRvfsEhFahm8M9B7eWFpr+4PmThoaQ3bSXg0 tOfg== 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=orH/dN7cCdMPVpeCaTGSb39pRev8SjBhAdpZvz/qy3k=; b=hOJnfin5e3nVWebYAXmsh6qBykGbSZXQ00iMpDqluWzjj54aqGiQnsQIkutXXiqQ1E bNKczEDhhpswbmsSyJpKs0tX0186aAMAHHK1W2/53jYl3mam0o4Efm3RpNXv1MyDNqo4 gNznlXi8ccQbU2Mp0cektiFlG9agWB5s7d3hO+jfMMfVIJa+i5gJl9q+aCk94xKQy/oC 424xIsqy23II66RO7SBleEOUhXt6pjGoH+j8BRfR2DFlXU4iPIZCG49B8m+eWEy+eEKs +cKerJ97EpwirXIqot2XCQ1BPxBNAPqJSr/lhnY+SxTDUjB/PNnOKxsJwDR52LpZnYKn +9Iw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=Vse7ufvy; 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 ev2-20020a17090729c200b006df76385b67si2429110ejc.7.2022.03.25.07.11.41; Fri, 25 Mar 2022 07:11:42 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=Vse7ufvy; 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 E46C468B248; Fri, 25 Mar 2022 16:11:32 +0200 (EET) 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 69C1168B236 for ; Fri, 25 Mar 2022 16:11:26 +0200 (EET) Received: by mail-lj1-f170.google.com with SMTP id bn33so10486658ljb.6 for ; Fri, 25 Mar 2022 07:11:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=LW/EbX2KWXbhPhbIjpmltDxDeHXCpAZI7M1lQWdynps=; b=Vse7ufvyttyK/axHRNxVICPe6wxeg71batPrzDHCwtTHJwVuBWtaTdgcy4RCeGSSil XPU/hde07KDfmlG9nGSKv/j8uGsJuPdTalBX4FH0bv6dMrhVFi+1eVGqN1CNi7K3RfsQ fND9O8Hyx2vgJD8WLFJ8Xqwnv28/vaeN4dnB1YABLABGqFVrfplmj1/4cP3NR2vbobb4 Eio4PUS2iooglLnRspw8ZNceATKDoap/m7YkeHG+u4oGVBxCi0yU6h55cDLyXfoGkgcn ob4EzdAG4HqC7NGnvfcsTjFKbKmOJAw2XiluTy+rSqiQqax5z832yVaimR3KbhkrrP0f D68Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=LW/EbX2KWXbhPhbIjpmltDxDeHXCpAZI7M1lQWdynps=; b=yK70zlmdcQk5DdfXMcb5FaMXVSylzrTQY+Gq0xjrj4Jm9iSPSQqQ28J7hxLbctuyeR Z7xDS7dxX4tCf50QCdrA40n0Q4hs3xqbBu4Mp/LZhtx7JJqzdyWK9NfIUObeQHh9W5/U TJLWHhMoPs1tHid9LOMks7mxeD7DwU8v8goM+k88nc6E1MlIaA5RG69CrzAKCi6LO48x JpIfLrdHnQOCYNC1lAfgsuqHweH6FBpa2oAV7dKcp+KFllSbyem1FabfOYxK3iMstCmB OpzS9AuqMKF7RnkR+yMB0rfDBw/7vuscqeaO+p4+KJqn67lNgdGlKd6XP2s7Bagv3xKA l9Ow== X-Gm-Message-State: AOAM530Q31C5pMeZpbNoF3sOluUVGCyAg/27HJLpPSRr4B1PPVn5WA13 O9A9RFJbe9/x5JzFRmpsxE0X/tlQ0D4= X-Received: by 2002:a2e:81cc:0:b0:247:ea38:28e7 with SMTP id s12-20020a2e81cc000000b00247ea3828e7mr8356025ljg.203.1648217485426; Fri, 25 Mar 2022 07:11:25 -0700 (PDT) Received: from localhost.localdomain (deedock.humlab.lu.se. [130.235.135.183]) by smtp.gmail.com with ESMTPSA id f25-20020a056512323900b0044a39b6e1adsm719797lfe.171.2022.03.25.07.11.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 25 Mar 2022 07:11:24 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Fri, 25 Mar 2022 15:10:22 +0100 Message-Id: <20220325141041.1748-4-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20220325141041.1748-1-dcnieho@gmail.com> References: <20220325141041.1748-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v4 03/22] 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: V1a7CbcvqSrl Control messages are useful for programmatic control of not only outdevs but also indevs. Bumping avformat version. Signed-off-by: Diederick Niehorster --- libavdevice/avdevice.c | 8 +++++--- libavformat/avformat.h | 6 ++++++ libavformat/version.h | 2 +- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/libavdevice/avdevice.c b/libavdevice/avdevice.c index 9b684251aa..617c28d725 100644 --- a/libavdevice/avdevice.c +++ b/libavdevice/avdevice.c @@ -66,9 +66,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 350912e272..06db024559 100644 --- a/libavformat/avformat.h +++ b/libavformat/avformat.h @@ -785,6 +785,12 @@ typedef struct AVInputFormat { */ int (*read_seek2)(struct AVFormatContext *s, int stream_index, int64_t min_ts, int64_t ts, int64_t max_ts, int flags); + /** + * Allows sending messages from application to device. + */ + int (*control_message)(struct AVFormatContext *s, int type, + void *data, size_t data_size); + /** * Returns device list with it properties. * @see avdevice_list_devices() for more details. diff --git a/libavformat/version.h b/libavformat/version.h index ac14f8eb37..af5e2c496c 100644 --- a/libavformat/version.h +++ b/libavformat/version.h @@ -32,7 +32,7 @@ #include "version_major.h" -#define LIBAVFORMAT_VERSION_MINOR 21 +#define LIBAVFORMAT_VERSION_MINOR 22 #define LIBAVFORMAT_VERSION_MICRO 100 #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ From patchwork Fri Mar 25 14:10:23 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Diederick C. Niehorster" X-Patchwork-Id: 34966 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:ab0:5fda:0:0:0:0:0 with SMTP id g26csp1376510uaj; Fri, 25 Mar 2022 07:11:56 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzh6PTQmQhrQiRlPr5A5mcZX+e1J1YkGWGrhCHvKyV0jLaWtGKU9ppdyXSZ/fOuS4v5q7Iz X-Received: by 2002:a17:907:6d0d:b0:6db:f0f8:654d with SMTP id sa13-20020a1709076d0d00b006dbf0f8654dmr11941231ejc.304.1648217516082; Fri, 25 Mar 2022 07:11:56 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1648217516; cv=none; d=google.com; s=arc-20160816; b=nFt+LR3uYsdIMkJjhUxDSO9sTt98Y2j++4/FVaElxr9yzkxKAnk5FBmP1/Yj5//H2b 3DYYlLwXoHoN1T6Y9I5uJpLRUFucK/E8qcobdeHyMkLMfoYoaTk48Jqkg81+UGLyJQYf M2dJWqnhC6QLf2muC/ezz4F8pprEarRPkl1TRxW3hka97cntjT+hiFozENbOHk9F3tb5 dLGSSJj6Zy620VgghPBORRxKNnSx6hCcKDN4QzwcQWFzUsKv8m/mczHkbYDHcirS2wgF Mrt/Y+EP5pdna20IFUnQgqpvDql+SrqfZw6byDaT6BDRW1QaPKKRmVEnYoy94aD5nxYI 7ydA== 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=MJSAqIuq2Yd8zKRqARYn0l1gfSA3cDtEUuvYPUJjKI0=; b=V/wkKDE5Z8d+2o5/NUCJhm7kGrAIElt2Kbtspx9MC8tcssfJeXC3cIcoyGydmnDYkg eaN8qUbJ/XEiQ/XtvAUyfUZdz2HI6ykWJtdda7aoFCxdGWZQfBzhT9DdI8FRAoBqkjSu dTPzPZKs5g4Nq5geEBGZRi3xhHItpFQhHFRfm0Nky+rirzWashaA1kOquzbN2yzp6U6d LdOLa8QFJyiskxetamqVDcRBRljsTm7hlFQZM0ArkW5eLWSxlzG8Acb68D90OSZm5CgL VwWc8ydM5EGMAsUObWl3FvHXxqd7iuZ92CEYmqnAU2NnuxzdKgEHGRkhLla7pNVUwHOp UaYQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=gJU+ESty; 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 k3-20020a056402048300b00418c2b5be43si2839938edv.293.2022.03.25.07.11.53; Fri, 25 Mar 2022 07:11:56 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=gJU+ESty; 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 E777568B251; Fri, 25 Mar 2022 16:11:36 +0200 (EET) 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 5AA0A68B240 for ; Fri, 25 Mar 2022 16:11:34 +0200 (EET) Received: by mail-lf1-f51.google.com with SMTP id bu29so13681862lfb.0 for ; Fri, 25 Mar 2022 07:11:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=g1lgHVjWngNs9b9/sHUUezN1BW/V71DT6B2ywGZsOtY=; b=gJU+EStyC/F9BRiTEu8JHFVZiUzkMTc7J1IuGw1etuMqPlaR8iwt5WKX6Rb46J+TeS /GMwibgqg+TlqEYYkMssfTJ9p8cwXVOjmgYS4cpgcL7vIAowN3jLbrVIE1fGFBsAbRNM fdOLkEvIhVq6HJoDtOp6meHblPetBlzf8KkjkO7n2DNjdySG6sB/fkMEude7Zp9BfXL+ LtgAudFf46UU1Q7f2c+XjRr90KXYRGGerQ8PRXMhr8fxRtdIFiQJSdpYoweGQg7cdNNB vELwXLM85oGg00QM2CbjQUAw2vwErAqXD35Fivqy28IB9fX8HCTf/gwGVTDSKyu2aYVE 4i3A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=g1lgHVjWngNs9b9/sHUUezN1BW/V71DT6B2ywGZsOtY=; b=KEgIUQNsOR5jCeLIafFsDa4Zg/Yu6Np0f4ZsZME7EVbQht3+bbAWNQFxLqASGku9KU ljUjYINbSlbY2j2DFNeBr7F2cqLVqIpCLlz+vky40ZefTrYAVdyYCQwq5H5XMqHxZclv FmtKsWKWhDlmzuGgCvRXMgtT5W0o+xSqpCmVltzMWLvDD0YDiOvFR5hWZfUZFhIHZBN1 F8FOEZ51dzeBegRkI0eA4Xvp8Z4sAZjSljQimeoYvlmNntROdjtqs51k21zIsVLbw9tK 4AZw3PjXn18SXR0V+Hi6etaywdFy3SidJaDNLnWzzGi7az5PyP7AHDyVtj/f+cjR90ON VBHQ== X-Gm-Message-State: AOAM532lMglShVklbkG8cBibKzO4b+EhmQ+OothzUNUkv1Q4zIeWzQAe oxnFBNZCYPda7jvHoyB2pNgbJzcmiD4= X-Received: by 2002:a05:6512:2347:b0:44a:6e3f:74f7 with SMTP id p7-20020a056512234700b0044a6e3f74f7mr3630414lfu.660.1648217493021; Fri, 25 Mar 2022 07:11:33 -0700 (PDT) Received: from localhost.localdomain (deedock.humlab.lu.se. [130.235.135.183]) by smtp.gmail.com with ESMTPSA id h14-20020a056512338e00b0044a1d49f459sm715604lfg.227.2022.03.25.07.11.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 25 Mar 2022 07:11:31 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Fri, 25 Mar 2022 15:10:23 +0100 Message-Id: <20220325141041.1748-5-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20220325141041.1748-1-dcnieho@gmail.com> References: <20220325141041.1748-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v4 04/22] 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: dZLvdhv5Pbfv 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. Bumping avdevice version. Signed-off-by: Diederick Niehorster --- libavdevice/dshow.c | 42 +++++++++++++++++++++++++++++++++++++ libavdevice/dshow_capture.h | 1 + libavdevice/version.h | 2 +- 3 files changed, 44 insertions(+), 1 deletion(-) diff --git a/libavdevice/dshow.c b/libavdevice/dshow.c index abb8325bc3..652e093204 100644 --- a/libavdevice/dshow.c +++ b/libavdevice/dshow.c @@ -1503,6 +1503,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) { @@ -1747,6 +1786,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]) { if ((r = dshow_open_device(avctx, devenum, VideoDevice, VideoSourceDevice)) < 0 || (r = dshow_add_device(avctx, VideoDevice)) < 0) { @@ -1820,6 +1860,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; @@ -1932,6 +1973,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 b548cd7afc..d0dd35a670 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; diff --git a/libavdevice/version.h b/libavdevice/version.h index 01e566a1be..69317c9280 100644 --- a/libavdevice/version.h +++ b/libavdevice/version.h @@ -31,7 +31,7 @@ #include "version_major.h" #define LIBAVDEVICE_VERSION_MINOR 7 -#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 Fri Mar 25 14:10:24 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Diederick C. Niehorster" X-Patchwork-Id: 34967 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:ab0:5fda:0:0:0:0:0 with SMTP id g26csp1376576uaj; Fri, 25 Mar 2022 07:12:07 -0700 (PDT) X-Google-Smtp-Source: ABdhPJx/B5Xv+PTRUGr56WWixPH4qrXiaWtLnrDsXTNgrvUdpHmBktVpjEH+2nn0gzKGF60+8FZX X-Received: by 2002:a17:906:6a81:b0:6da:d7e5:4fa with SMTP id p1-20020a1709066a8100b006dad7e504famr11900867ejr.223.1648217527132; Fri, 25 Mar 2022 07:12:07 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1648217527; cv=none; d=google.com; s=arc-20160816; b=h8me+fQhiE0SVCqJIgF20ZRwYqt9kG0bvtFBPIE48S4k2MAIAIhj8kShgFqE7j6irF P6wGaYPToQK1caTiIZQ0hgqKNCk4CXxlqfkASE0WVdezfOiFRBUpBdYQE6TBIbXC50rk ZY2VvNuustV21zOu3LjjXU/WcJ3vmMMuA0BtvTMwffGCBOoZF5jtra3DJ1S0sTrVQzc4 MOGxauHFHOoN16ZvVZP9G6u7UF2k+tXeo4DM8Gvo357Pzph3gjHNOXGmwLtnSCZDGGbO S7G4XCu1NWEE+FeajWE1INAueD0Tm+KN+LEoRWvuIG7ATrhKmyPDi6BpoX4Bnq/Q/VLF p7+w== 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=LkE3p9PuuJq4gzpRut73FtCqlFMY5PgYmz1y1Pn58l4=; b=aeJwWsKOosX00FYRhaIeQJDtaJ83x8ecBcWMm6GP/6zbNOnMvjrcGZEjnvkfn99jKe DESonfjaWQq6aM6giandBfZtP86RgepxWvdRbOIy+SkELHXNJ+QZ3l41qiz8zbV7xu6t JK/rBLAbDPm4zcAZWaSI6NjMBnee1LXGTk6LIsjOdQk0GVVApZXolVWeprb6SDT15tk3 4bBBY2QT24jePJp5RL165gAhhDWGrNBNcuMR9zN5Mg7yrNAe19nsso//So+ZR8iF8m/G jks37DgDRW7GD4RL6A5WsXl/U7a+yfsm5NSMahVl3rJvucd2531I0S9rzgLGzZA3MRt9 v/yA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=ZcPgU33+; 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 kz10-20020a17090777ca00b006df76385e5asi2647809ejc.762.2022.03.25.07.12.06; Fri, 25 Mar 2022 07:12:07 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=ZcPgU33+; 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 E054368B24C; Fri, 25 Mar 2022 16:11:42 +0200 (EET) 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 DFDF368B239 for ; Fri, 25 Mar 2022 16:11:40 +0200 (EET) Received: by mail-lf1-f49.google.com with SMTP id m3so13569297lfj.11 for ; Fri, 25 Mar 2022 07:11:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=lmRYz16L51G1okEkN7HBUHQAWXgpdxYTGfVOQdpJSVE=; b=ZcPgU33+j8LdxCmpE7EvYA0HNJulm62uqLEKosfIjMMPUY/0IKC3HU8/BGXaNEg0MW TcgVHblhOFCKNiBWxPEqEjt5z6BJIXrpJ5Qwt4SiDhiIT2R0x0HZQLDzmUlObW6H8r2c nNP0q4uev6wgDgNr1SBVNyIOikwmNaGm1u89wnyl8IvGFxRE+FHDnGo5+fsl56gIZXQL /RXAgHoTu6TPSATwn0LVvlo7idmS85/MW2Q5GoYzKj3dBi0DSDTs0mhfa88km47YIHT2 ORjdNdXRsPYyUozu0m56NhSIDdmIQzbFMljsyYx1S4WQj8yvRONf0qp7Do6uvFuTwjZ8 Xh1A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=lmRYz16L51G1okEkN7HBUHQAWXgpdxYTGfVOQdpJSVE=; b=tXTrMvlY77gohtIye+YbcQfbgYmVdkyrux249zyPawo4QRsSkrXGrkeUil9A0VdWXQ QZBpdDyRFKN/Y2UMatHe80J7PdVrwUiGZ1RFkz7fkQ6hOngw+W7FaagM8CeGilkMSK3g xonAUiMe2xkTRPYwrH6/hDR0XkRXn+GrdUfZaqawD+x/mnpLRIvX7MnXlrWxXmZ1sz2G 1Bt+mb1664BU5D+hEbx3B8jhy4wIlp4bRuCB7luHqHcS7dTismLidilHmCawPZF1JcDZ SSEqP3H5u71Zvuv5XC5l5Wga4eizjgZQ2/qDJiDHZTzb78KPPvU5O+L26fn4FoSPr8O/ bJjQ== X-Gm-Message-State: AOAM530UjbtVDzqTl7kAffoKymd0EKtjfWumj9RuTS+rmq4JV2aCNmPt 2yDUBbXHivSSV0q/fA0cfLkf8Kk2g4U= X-Received: by 2002:a05:6512:2214:b0:44a:348a:d6d with SMTP id h20-20020a056512221400b0044a348a0d6dmr7908707lfu.506.1648217499566; Fri, 25 Mar 2022 07:11:39 -0700 (PDT) Received: from localhost.localdomain (deedock.humlab.lu.se. [130.235.135.183]) by smtp.gmail.com with ESMTPSA id x1-20020a056512130100b004484c116de3sm717108lfu.246.2022.03.25.07.11.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 25 Mar 2022 07:11:38 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Fri, 25 Mar 2022 15:10:24 +0100 Message-Id: <20220325141041.1748-6-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20220325141041.1748-1-dcnieho@gmail.com> References: <20220325141041.1748-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v4 05/22] avdevice: add 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: 1EH19tl/X7lU 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 | 4 ++-- 3 files changed, 46 insertions(+), 2 deletions(-) diff --git a/doc/indevs.texi b/doc/indevs.texi index 9d8020311a..0302859552 100644 --- a/doc/indevs.texi +++ b/doc/indevs.texi @@ -682,6 +682,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 db16a2f27e..74e9518a8e 100644 --- a/libavdevice/avdevice.h +++ b/libavdevice/avdevice.h @@ -206,6 +206,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 69317c9280..96347a3893 100644 --- a/libavdevice/version.h +++ b/libavdevice/version.h @@ -30,8 +30,8 @@ #include "version_major.h" -#define LIBAVDEVICE_VERSION_MINOR 7 -#define LIBAVDEVICE_VERSION_MICRO 101 +#define LIBAVDEVICE_VERSION_MINOR 8 +#define LIBAVDEVICE_VERSION_MICRO 100 #define LIBAVDEVICE_VERSION_INT AV_VERSION_INT(LIBAVDEVICE_VERSION_MAJOR, \ LIBAVDEVICE_VERSION_MINOR, \ From patchwork Fri Mar 25 14:10:25 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Diederick C. Niehorster" X-Patchwork-Id: 34968 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:ab0:5fda:0:0:0:0:0 with SMTP id g26csp1376620uaj; Fri, 25 Mar 2022 07:12:21 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyJ3q3+IMlPstMctA8mijNjiElQ/6FU7ohoSeR+ZxY/I0GpbuIItTopx2TNdSYsjQbsufrg X-Received: by 2002:a05:6402:2216:b0:419:25d2:3652 with SMTP id cq22-20020a056402221600b0041925d23652mr13354683edb.277.1648217541484; Fri, 25 Mar 2022 07:12:21 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1648217541; cv=none; d=google.com; s=arc-20160816; b=DWqzzDaa19K8fop9/F13yXvKnmol1u12NjIDzFVdedotBeD1ANr0IZgqC3iEpdqVQn KpqvUkzPDe79pCdl56WmWvxPGI0/2/EM81gQKLr6wxFbk4lEnxccuc3LKxt26YuffFoX VKZP3D77wq4ORgwjvsvR0NAugR9wlWjIKRdqW4CVy038RebqPDF3Au59WZRUUUmQqeim 1wP15Wsg9/3EF4avf2FK/h+1fS31gIN9FPVtFqrBgPIa7wpsE27f3Ly12WVLu+E2HWbu aULKxlDwiZMQR86Zil+1OF4xig5dL6gdvgre1TE+M7q5Do6J2tdHXT6XB7Yna2FfhiOo EJ/Q== 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=qZBSiQQxre/XhbTpWK0HUMsyUYGYp1VWZkESF4VPI7I=; b=dJyLJ4maxaXtEzmvc/ajrxlKkN/l+5L385cxgU4/SlnMxqfjAWQOQhxXk8VYglE06y +/BUVQkrLlRk/RlS9xBW+7pD4Yg5qXGs7KGIeW/Jl+v5srop2m5XalsoxB0W0QfZBUGP JBRTIAimtMb1IeVJKBTPu9BsYM7LtvboecRjS+jADs1FCjcwkfP3ObDkQdXL1CsGLqFy XVA/jZniYkH+L1OBp0rb+2QFR8g9INs3yU4jGvGkkhLFBn9YNOVsOkbR8DDr0ejM4fHB O+VYa5LSq8seDXTzPciHAkmRTDsGQaT6aTJIAo8pFa2Mk4KgQDUdPl6Y/9vJe8rGAzsW nSeA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=Utgn2+Z6; 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 u24-20020a056402111800b0041939558a00si2518239edv.48.2022.03.25.07.12.21; Fri, 25 Mar 2022 07:12:21 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=Utgn2+Z6; 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 DD2A668B25F; Fri, 25 Mar 2022 16:11:54 +0200 (EET) 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 4FAD968B192 for ; Fri, 25 Mar 2022 16:11:48 +0200 (EET) Received: by mail-lj1-f179.google.com with SMTP id 17so10473748ljw.8 for ; Fri, 25 Mar 2022 07:11:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=gvjbBjGhD+4DTkoqUBR4omF9/1lb4OFPtJ3RkssfsRQ=; b=Utgn2+Z6vKcQpfpdc8JlaI0vgkeWFJ7EXlcCPaTKNkwatQXE4jCKLUO9g++BzAEb80 I6PbTgnVXfb302Pqe71hjoKucKxMX97iSthsbyhtQcLgHshlscl9nA9dJhTY1MZrWBab sTl4yTCEiw1IrBwEczvzHFjc04l/hgLvm3ZXTD/CJdQCvaPB+qHgYQK98G02Ecowwlj7 Gi4tvjHSRoQoHHOJI/M1HGF+3UQ1XDt8QVlpxTZtt45NiSGX27M8IWzyCbeO+F2yMEbj j6kGx5d5VMnlewzHPyucPTu9QEqexu7oQbMUL+Se/AmzxF3KwuKyZF3RhBJHda1CVX2a zGaA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=gvjbBjGhD+4DTkoqUBR4omF9/1lb4OFPtJ3RkssfsRQ=; b=QWb9hrBeaplkGL4z3u7R0mJaWjzXMP+umdkyG7wrakE8RpQ6MyQsat2ZQ0wqn9b3/C MODNt3WTc4BNuWROFXhuPotXfE87U4hMTZRZf5Y8yKuzVkKvHeCflXHhV9jLCDfkbNhF 1+S3MYCAdCCjB0i+QCZECD0WTSQKwLEezAy2RRX25gT6649TMwPt6xLSKFQVBgcNU9Ko d47yUbIdLaTLLC0aM/WS0WECaOCdsF5niFUSNHLGmZ4kCV/qe4IJ3G2S+gK8OH7xWgTL DtDxqaj3r/FzgdhxvOpKbVgMnuYrG5CdwZCh4XmC4dJY+Vd0xuW23yTVSAkhcz5F6KoW 678w== X-Gm-Message-State: AOAM5324616DRo9phuhDVoFNcFvLcSmR/BDonY3NC1rCDpmC2KIFfCoK eSlBDhmIJsA0hCxJXiua5Q4mGLMhIJU= X-Received: by 2002:a05:651c:19a3:b0:249:b26c:80d1 with SMTP id bx35-20020a05651c19a300b00249b26c80d1mr5117588ljb.344.1648217506175; Fri, 25 Mar 2022 07:11:46 -0700 (PDT) Received: from localhost.localdomain (deedock.humlab.lu.se. [130.235.135.183]) by smtp.gmail.com with ESMTPSA id d25-20020a194f19000000b0044a2ad98dcasm718409lfb.167.2022.03.25.07.11.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 25 Mar 2022 07:11:45 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Fri, 25 Mar 2022 15:10:25 +0100 Message-Id: <20220325141041.1748-7-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20220325141041.1748-1-dcnieho@gmail.com> References: <20220325141041.1748-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v4 06/22] 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: cNMgOcPSzxaR 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 652e093204..78194406b5 100644 --- a/libavdevice/dshow.c +++ b/libavdevice/dshow.c @@ -1508,6 +1508,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: @@ -1519,6 +1520,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 @@ -1539,7 +1566,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 Fri Mar 25 14:10:26 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Diederick C. Niehorster" X-Patchwork-Id: 34969 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:ab0:5fda:0:0:0:0:0 with SMTP id g26csp1376678uaj; Fri, 25 Mar 2022 07:12:35 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzd7Ur031orqpIT9PN232CtsVcCPomSIS6jfVeneashCpLgU34zT6SEy7b3du148ER8wpkP X-Received: by 2002:a17:907:96a8:b0:6df:85f5:e695 with SMTP id hd40-20020a17090796a800b006df85f5e695mr11549320ejc.215.1648217554817; Fri, 25 Mar 2022 07:12:34 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1648217554; cv=none; d=google.com; s=arc-20160816; b=gmY7yzYxvjTuRDx3B8kQ6LYyAvB7dvNp5KW6pxylF9TJ37kwdXRZZcBUyEyaiDMsfz LwL8TSOA9Tfie3HfJQjkOusaIMIpKKZZDE3bJ/NN7SuIMmtvgmksCkGpdVfsm132T60b yXVKbqKsd8/ubzRVgXvCw6dcPiQ2K5PCWTgL7gERkyj78YhjvV1T+bs0/AEu6rFmMO/W qOKyd2W1AWg7uXbyZPoGuri87e2Y5P2fgWso4/N75eHb6NoYZDydEPRLENT6Nk69U4Fv FsuRj73MgJgUIbltpeha6bGOY7g/AhkjfwbnAjcJku04gXsfx/AoD38O+zioP68jG0QW 9Wcg== 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=aB7G3rZCF9xkhJLWOvexkZ5e+msXCWTYkRDaJd5DdMs=; b=D0S6TGDWq5bMXnULIFAJS2jq2QYBUmDaKiBqb/Fb8PB64RvWyfIpAERD9yd7GRgMHc cR6oAaBd4BWwuJRpjeg8QeQCERV4ker5xK75v20YFKbhaMl893ZgFeSIVN1qEaWo6/UZ Af3mBMmKa/nvDfc0E636JFPBDNU2f4SO1myNJY9qGc/AXajkyZALHBqQgb5/R1tDzhRW nIcqf5D4/YizC1izl6yWoSZQNeR4LGqV4Q2ULxKNkCeUPxL1FqRcA0wo8IKz7zSFn1i4 sndvsS9P8UAto1mXiOaYN8svUKro05BsFuA0pQD2KmfAQwXokIVDF81x1ulfA05RZ+oa O1Vw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=T+mM63cx; 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 gl17-20020a170906e0d100b006df76385df2si2323133ejb.658.2022.03.25.07.12.34; Fri, 25 Mar 2022 07:12:34 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=T+mM63cx; 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 CA13B68B266; Fri, 25 Mar 2022 16:11:55 +0200 (EET) 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 8CEAF68B25F for ; Fri, 25 Mar 2022 16:11:54 +0200 (EET) Received: by mail-lf1-f51.google.com with SMTP id bt26so13599008lfb.3 for ; Fri, 25 Mar 2022 07:11:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=jMyiN1fBtRYbjfpg+all+54IAAFnZCh9QBMN0r8HJXc=; b=T+mM63cxA8lHUL7cX1eYDmSTF/I7F9fDgzxsIRN3k2pShAkCTR2rAvuclZ3X68kZG/ J7s2f3Zylw2BukA7MhaNDGMWAn/k+43yUESc9fuQz1wIg7HABiQMohgSAjoeS+K7NXp0 S05+zRAc1AzKNC99SAfEuzP6Am3pgMjoskTrXGS97LwMd80rWOHJXVSzA1kKJ8SBUJfp jnshOnQapcW3RPOCR0QX2sUTe/Djwhd3FZYrVp4t3Li+IWGjyW2Jf5KNyY2/Aqze0uYv WCAJrNzAAiJL+W6zC5XuOpRPGhCEvtPRfjwmOBf5bnRavFQSzYvDL8PLS+dZQX8pYcw/ 4iBw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=jMyiN1fBtRYbjfpg+all+54IAAFnZCh9QBMN0r8HJXc=; b=SQ5s5RAtZh9CRnFsAI7FxHFAg3m2A96KKMAAS1kuInmsgS+z8iKn2ZiAKN7QIJZ/Tp nJFbm/QOqfB3pZvrzgRRX8AISwtCtGfNLnLyoLMZpu5grlJU0w02unkceZdwoTnYHboS 91Fgxos7i0yeUs85yOfNDATTkFyiR4ThUQstGFqu9IPckkt6D2tAWbyBM8hCartr/Sfc p8CMFIkiswKurZPj/k62erv8m/pONa5ltOBL9Edj5jxBGeaMPB/RZV2TfgvBlE6U/3yo PB0uiLqtPU5cZvEh0H7sJXO987yve8IQpeBJyEk44hrDCvG3mCO6+TAWRW2BxJ6UFvPt ASCg== X-Gm-Message-State: AOAM532+N5QFei2IxX4pXNe1dEj8tCDYwbWGMsJJw0Yq9CkbsavQBrxN IoQTFuEnp4VAAH0GiQtbqeLnlwlgkSc= X-Received: by 2002:ac2:510f:0:b0:44a:5ccc:99fb with SMTP id q15-20020ac2510f000000b0044a5ccc99fbmr7420519lfb.38.1648217513524; Fri, 25 Mar 2022 07:11:53 -0700 (PDT) Received: from localhost.localdomain (deedock.humlab.lu.se. [130.235.135.183]) by smtp.gmail.com with ESMTPSA id l11-20020a056512332b00b0044a3038393asm719368lfe.188.2022.03.25.07.11.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 25 Mar 2022 07:11:52 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Fri, 25 Mar 2022 15:10:26 +0100 Message-Id: <20220325141041.1748-8-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20220325141041.1748-1-dcnieho@gmail.com> References: <20220325141041.1748-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v4 07/22] 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: crvJVlyXC0pI 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. Bumping avdevice version. Signed-off-by: Diederick Niehorster --- libavdevice/dshow.c | 51 ++++++++++++++++++-- libavdevice/dshow_capture.h | 10 ++++ libavdevice/dshow_crossbar.c | 91 +++++++++++++++++++++++------------- libavdevice/version.h | 2 +- 4 files changed, 115 insertions(+), 39 deletions(-) diff --git a/libavdevice/dshow.c b/libavdevice/dshow.c index 78194406b5..a780351170 100644 --- a/libavdevice/dshow.c +++ b/libavdevice/dshow.c @@ -240,6 +240,11 @@ dshow_read_close(AVFormatContext *s) struct dshow_ctx *ctx = s->priv_data; PacketListEntry *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); @@ -1464,6 +1469,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"); @@ -1488,9 +1494,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); @@ -1536,10 +1539,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 d0dd35a670..94ba9896b7 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); diff --git a/libavdevice/version.h b/libavdevice/version.h index 96347a3893..feb15ba9c8 100644 --- a/libavdevice/version.h +++ b/libavdevice/version.h @@ -31,7 +31,7 @@ #include "version_major.h" #define LIBAVDEVICE_VERSION_MINOR 8 -#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 Fri Mar 25 14:10:27 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Diederick C. Niehorster" X-Patchwork-Id: 34970 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:ab0:5fda:0:0:0:0:0 with SMTP id g26csp1376726uaj; Fri, 25 Mar 2022 07:12:47 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwCdIxAFBwT2r+meMzQ4HNyuaKsZjqKvWkm/CCQFWVv7xNtjkrSavRRpXKclr7dSdGaPsHM X-Received: by 2002:a17:907:2ce6:b0:6df:a489:d2e1 with SMTP id hz6-20020a1709072ce600b006dfa489d2e1mr12035059ejc.264.1648217567181; Fri, 25 Mar 2022 07:12:47 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1648217567; cv=none; d=google.com; s=arc-20160816; b=WFRJfPvBidOPbJf4HyrfCtlexCp/YgQROddrl3R8fvDzsy8yNqkEtgTx86vZJDSQ5y WnZUFSgbF1PYp+zlGSuaeUWhI7gaBp3vssbK7THGEzWKc3sJuDGymbA9UOADnjWetLU9 +D2Q1Nu5UY6Ig+X5lrLMtbdPuUnMwBT5C5OoHjs//yeBogXIlDLrNpVSBAjugIm+qzRW DSF5qdFes3nAJTvrK9+bbLc+o9Wr/aCieEKwOmLTw0eOSxDbt64PqZn0SoRO6DI+i5FG Ne9hDYvbOICFiasVzA8V1BTyFxpLO9O5Ri1NSl7Qs3dSyj4AXu0QEY9yPQbMEKpGw8yx GjBQ== 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=4IAVJpP5hVW43jUiKFRtnKi0UKdRpeenOXF8gG4eCS0=; b=l0dAHh3bcje6FjMFv/ENCIIgeZ8mVJGQZ6ATKmgJb94NTfWLZ01Wmyk0I9aCG5rw6x nOyg0WG429/fl0exsoZ+UcOj6X1eAdPluy+cY9OjmgHcl58nQGUB3fnG6X9b60R9gXjg t+rg/o7Om/MTWbjSzoPamk83031tdutOIQZ1i7GABcG+o4FKvink07oQJtQaLoxB8GA3 1fMxd5BZh860fGv+3r5ftakK648asUPHyfbZgkw2yqgAVhrOg5coxNqzTuW/neIMYE3U DK3bHLWTsDab5WPHIjlJ9MeqwXwzlLEFxc0UKH5qvPGNgY1/4iANJ6G4CeAA2GdyPzqK Q5MQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=bNMN1Tqd; 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 ak15-20020a170906888f00b006df76385e08si2396667ejc.680.2022.03.25.07.12.46; Fri, 25 Mar 2022 07:12: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=20210112 header.b=bNMN1Tqd; 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 ACBFF68B26D; Fri, 25 Mar 2022 16:12:02 +0200 (EET) 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 4995C68B204 for ; Fri, 25 Mar 2022 16:12:01 +0200 (EET) Received: by mail-lf1-f42.google.com with SMTP id w27so13609119lfa.5 for ; Fri, 25 Mar 2022 07:12:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=JHNexG3mBtUPQd992q3SH0cxgNhq4KEn5pbZs6slYQI=; b=bNMN1TqdqKGzJLPhs2iB6ZSCXzDF08VTvWwwH4b+TY3JUAPhzrmBZke93S9nlmvI/f MxDv2J8LW9f4JtzaiHO2GNJaMDn3Io5gHMHL71EhUCbpC1+42N4KfWX/X7QMA2oXQOBg bZTj64ewHg30bXPOVHmL09yOcgGasY4Xo7zSDM9k9INJmwgEbnTLR19b1EGK73EsDts5 210OyYk0TxR58ARzJ93PQIMnv1DMpttERRHeqcUg/7EsqFftSpW4toZl5XUnVNsHC9bQ pPvX93ARWJRD+DkcQgAcI4avP6WuRBYIdx2hQ2PMjv1KR6wOyaX2k8M4ntwawmISWVQx v/9w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=JHNexG3mBtUPQd992q3SH0cxgNhq4KEn5pbZs6slYQI=; b=owL2WrgQfWUOvrYGDrVxnetj/Mx0Qt12VJVX1BFpfUs9pBt/88JAK3y+AKUbBi7GJ7 i+0LV9cF4ZJJ/dz22Qo1oGy/Y/QABz02ZDL3cN4yP2aDriXSCyKReGSkkPhtk+htW/bw bYHFiOnLwMd1e5DSzs2ofPUFLp8rDgT0jkLGBMbDRQFUrCB6ANWI/vY4sA63iMNSwms3 GWbBCl+wYp4z5uWrBEQ9xxCfDAjKCWVt3atjDCcCKnbkmy9LAMYybwMEEKzwn/RQG53I qNLE8Gb8sBfBay3yJLQI6A+QpixU7XbEfgO+S4bHuZOJXu8032UkqQ2+SFMy2TFgJ+cN RMKw== X-Gm-Message-State: AOAM533QTdPMm/5MpX3XQ1QcD3+MIcPEu8/1ngxqf3+NYyJ7hS4CLmTh YsbzesNK1onL6pTCxeFSuoCmwLaicmo= X-Received: by 2002:a05:6512:c01:b0:448:6aec:65c5 with SMTP id z1-20020a0565120c0100b004486aec65c5mr8157379lfu.193.1648217519997; Fri, 25 Mar 2022 07:11:59 -0700 (PDT) Received: from localhost.localdomain (deedock.humlab.lu.se. [130.235.135.183]) by smtp.gmail.com with ESMTPSA id a12-20020a2eb16c000000b0024805905f1bsm702126ljm.98.2022.03.25.07.11.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 25 Mar 2022 07:11:59 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Fri, 25 Mar 2022 15:10:27 +0100 Message-Id: <20220325141041.1748-9-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20220325141041.1748-1-dcnieho@gmail.com> References: <20220325141041.1748-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v4 08/22] 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: kArrXqq85jET This reverts commit 4f49ca7bbc75a9db4cdf93f27f95a668c751f160. The next few patches clean up the API and implement this capability for avdevice/dshow. Bumping avformat and avdevice version. Signed-off-by: Diederick Niehorster --- libavdevice/avdevice.c | 71 ++++++++++++++++++++++++++++++++++++++---- libavdevice/avdevice.h | 5 --- libavdevice/version.h | 4 +-- libavformat/avformat.h | 21 +++++++++++++ libavformat/version.h | 2 +- 5 files changed, 89 insertions(+), 14 deletions(-) diff --git a/libavdevice/avdevice.c b/libavdevice/avdevice.c index 617c28d725..2000e63bb2 100644 --- a/libavdevice/avdevice.c +++ b/libavdevice/avdevice.c @@ -28,11 +28,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) { @@ -81,18 +109,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 74e9518a8e..9724e7edf5 100644 --- a/libavdevice/avdevice.h +++ b/libavdevice/avdevice.h @@ -347,7 +347,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). @@ -443,7 +442,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[]; /** @@ -463,7 +461,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); @@ -473,9 +470,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/libavdevice/version.h b/libavdevice/version.h index feb15ba9c8..2c25804784 100644 --- a/libavdevice/version.h +++ b/libavdevice/version.h @@ -30,8 +30,8 @@ #include "version_major.h" -#define LIBAVDEVICE_VERSION_MINOR 8 -#define LIBAVDEVICE_VERSION_MICRO 101 +#define LIBAVDEVICE_VERSION_MINOR 9 +#define LIBAVDEVICE_VERSION_MICRO 100 #define LIBAVDEVICE_VERSION_INT AV_VERSION_INT(LIBAVDEVICE_VERSION_MAJOR, \ LIBAVDEVICE_VERSION_MINOR, \ diff --git a/libavformat/avformat.h b/libavformat/avformat.h index 06db024559..027a914e13 100644 --- a/libavformat/avformat.h +++ b/libavformat/avformat.h @@ -617,6 +617,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 @@ -797,6 +807,17 @@ typedef struct AVInputFormat { */ int (*get_device_list)(struct AVFormatContext *s, struct AVDeviceInfoList *device_list); + /** + * Initialize device capabilities submodule. + * @see avdevice_capabilities_create() for more details. + */ + int (*create_device_capabilities)(struct AVFormatContext *s, struct AVDeviceCapabilitiesQuery *caps); + + /** + * Free device capabilities submodule. + * @see avdevice_capabilities_free() for more details. + */ + int (*free_device_capabilities)(struct AVFormatContext *s, struct AVDeviceCapabilitiesQuery *caps); } AVInputFormat; /** * @} diff --git a/libavformat/version.h b/libavformat/version.h index af5e2c496c..1ab39022c2 100644 --- a/libavformat/version.h +++ b/libavformat/version.h @@ -32,7 +32,7 @@ #include "version_major.h" -#define LIBAVFORMAT_VERSION_MINOR 22 +#define LIBAVFORMAT_VERSION_MINOR 23 #define LIBAVFORMAT_VERSION_MICRO 100 #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ From patchwork Fri Mar 25 14:10:28 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Diederick C. Niehorster" X-Patchwork-Id: 34971 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:ab0:5fda:0:0:0:0:0 with SMTP id g26csp1376771uaj; Fri, 25 Mar 2022 07:12:59 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwHVViG2nDXYGR1ro49R/pEHtbGeO/kGjWECSA3w+M5eRW9Y1p8URo/XC7d3vEf60FlDgk4 X-Received: by 2002:a17:907:2ce3:b0:6df:b0ad:1f1a with SMTP id hz3-20020a1709072ce300b006dfb0ad1f1amr11802475ejc.392.1648217579439; Fri, 25 Mar 2022 07:12:59 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1648217579; cv=none; d=google.com; s=arc-20160816; b=wP5iCkjjM/f/NHyS7xJjqrpiH+BhXk8BUDiAtR0lOgRdsu9wiJ/OmPdIQUaO+KxKLm 1sKIqwvGRUMWKmqHeJHZh/Bo+C4+2HEbvYwhv+Oi8I5MaA4TlpUljg5NnS0PnJFYoTwb K8a+u6e8uLWiZfPrmXZWG9b1JnLNdfTqD4fJ0G2FWZTt+/ez7hn/qGwMNZngY6ohiXjD PRXN98+HVwZGqxcx0ntca1J8nSl6FtdPj7O1+rGpV1LTo+kKjSs9HChizkbLftyQ06vM zmd6PJy0flBK3X9/7+MHDwSVq/m8z7LUBvrUDr2bvmpGZTwX8NTDQNIhnVMQ6kHuqxQ3 VJ6g== 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=4/vfbo+T84ev29/+KUJJzDUDf7WDIc3U8mnbvMJ0I7E=; b=PIqbcCPC2T4qDev9/fr1RietNmAE5hkG9cmzvC1mbggNevUSMonv6jEyKWX3AYrjBG wfFd/A+jG03z3lTN/+dktp4cCOh2jQK4KAxkxe0K0Gh+oRWC+5QDV3CgZRtpHd/TQ7Kx EeplG12L8Y/nChbiOhaYVQDTK7gJnc02/VR3hHUuJlmvr9mlygXaAkwC5vmQaEwixtbn cEQDyXMAUn26Rlzh3rcDzFiES0OPsQuJqYVBkTMbFEUfI8s+C/O1LubRM+/Q+XPuPs2i oV06GP7H4wbCzowpzkd1EtQ0UTAbO17+qwDa7hXxzp/SAmt1yhicJoF2tDYsDZqR2syS iMCg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=F+OKke1g; 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 v12-20020a170906380c00b006e0829ae7a0si2597627ejc.51.2022.03.25.07.12.59; Fri, 25 Mar 2022 07:12: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=20210112 header.b=F+OKke1g; 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 A696C68B274; Fri, 25 Mar 2022 16:12:09 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lj1-f180.google.com (mail-lj1-f180.google.com [209.85.208.180]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id E826B68B229 for ; Fri, 25 Mar 2022 16:12:07 +0200 (EET) Received: by mail-lj1-f180.google.com with SMTP id b43so5948984ljr.10 for ; Fri, 25 Mar 2022 07:12:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=80soOFwT8QpRk4qENTX2E/+2lOGQpKWaDuvDVFAV6Qk=; b=F+OKke1gggu1K1YQOVT422Ux5nHFHLYGraVeCVo0zPi3s1KnxXgCl7sVOCkurXajVs SyXWI1qbHQmV+GAczPw15yfAvTnuqKFsgF4f9XNUXgcHSjZwWVZle+Sz6MppFHSDcQ5a 37A1lB4CEr6NtJmDD7WsaYy4f5DmZZxA7PKTWS2NSvPs7n4tsaojtN5jyNCLolTCHugk mewEx+SAy/ASvLsDjgnezTyZrVwYoQVQo0dOndfmzXOje5igBZC5oIUx7SoszXRy8bC3 eJSY+HXTjkS096aBKG+gk12+Qaj9eymklFcH7k1BmJUFtN/nG28XkfKKIgj04sAp3M/D bfnQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=80soOFwT8QpRk4qENTX2E/+2lOGQpKWaDuvDVFAV6Qk=; b=j8536tS0n3NLoXuSiQzNe+yHiXqhQLTFCnKv2uIWVfz7IIxf9envKwz3iF/ZjX3ULM A4/NPmpT8dYprfIDgVjLhzngtN9xxIeOjvlFaZBIPA4gbY7Jc5SLeju6Lismuup7LZeF AjUKchyLH7SbWztaVQPXavAA746m2sOWINIMjfFueOGsejmzciSq67GnBeeoogVMYVhy UTHLxBgKJzuCZNlfYkkkbkvXQbu4Wx+FVeuKegxsNtbg7LeNBz422GmmXO7cxRAuXrdu xRh6/Y9MyoUBmPCSPgqnoXYz4lCltgGHv7SbgJsBAxglCcvUOyF20iwYdQkqLvWDYJlk 1qeQ== X-Gm-Message-State: AOAM533fQXCyYtQOjdft5D/GEJfCGIc1JWaZXDfrKpn8I9DnYJwDOQuG lOr7svkGILz/VlpycpEIXEHdRvRFwkk= X-Received: by 2002:a05:651c:2118:b0:249:20cb:a42 with SMTP id a24-20020a05651c211800b0024920cb0a42mr8425481ljq.157.1648217526584; Fri, 25 Mar 2022 07:12:06 -0700 (PDT) Received: from localhost.localdomain (deedock.humlab.lu.se. [130.235.135.183]) by smtp.gmail.com with ESMTPSA id u26-20020a19ab1a000000b00449fb00eef6sm720093lfe.209.2022.03.25.07.12.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 25 Mar 2022 07:12:06 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Fri, 25 Mar 2022 15:10:28 +0100 Message-Id: <20220325141041.1748-10-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20220325141041.1748-1-dcnieho@gmail.com> References: <20220325141041.1748-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v4 09/22] 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: shXR0S51C93F 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 2000e63bb2..24e14b84c9 100644 --- a/libavdevice/avdevice.c +++ b/libavdevice/avdevice.c @@ -113,11 +113,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 Fri Mar 25 14:10:29 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Diederick C. Niehorster" X-Patchwork-Id: 34972 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:ab0:5fda:0:0:0:0:0 with SMTP id g26csp1376815uaj; Fri, 25 Mar 2022 07:13:13 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzUxKsNdS/QLLnTUuQGMlM9ZRi/AZnw2fuW9Thu7KnU0lXkvDEUDWDXln9XdCTDrCwJ/+XC X-Received: by 2002:a05:6402:4305:b0:419:2aeb:2a9b with SMTP id m5-20020a056402430500b004192aeb2a9bmr13456348edc.346.1648217592864; Fri, 25 Mar 2022 07:13:12 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1648217592; cv=none; d=google.com; s=arc-20160816; b=di2odGmTaq5LBCMrVle2kaBgEZ1TplXxXo2Pn748Pz/iEcxeXRwGz5YrpJ0IdLW1QO Tmcu+LcsID+nQEoyDLpxKWD8Jz7tKGywZTxIwMuLB1LF0nVLdnuUonaA0YHIcjaT4x8l JqbB7Y+lDXj0mXgwu+zfyPQbalhjDV7wf9KnZzqU00N4qbaoiOUKAxemsCk16TBzh7Sh bsyNFaYD4PaBU/90cuwd/CmqEqmtmcGuo6qk/uYnG3p6D/D0hxWLFiLEToAjPetXJChN OryVZF3X6nfd9DRFCmhkksiKd3EXPCjAWjgiMlqJn6qoaztMyfskMPYceWWRxsSsokQw G1YA== 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=wzQ9fkyMbYf4Gv3yrjz+cQB8X5dNDIOAkB8JHM8lQns=; b=VzNp9jKwLyE9yEvFwOyLm/ybKlDkhieZzQgTlsdPNjc+HMQOiayihm5ASpdILyf/WC Ki58sCUrVhpDQhP2fQPpUw/JuTDHv08FCIIvXu2tXf719kFWJlW7mrvreHgn/TAFlKRs rO0Rmibl8rCPe70YzzbvIGlj7QNKeqTK7F1sD9hdaWxasvRrKwsL3GCaT94xoyMMJ0KZ nIxet/SMgx87+tUYuz336V6A081Cz7HQ2ndJ6dS4Z+gwM1VFRgJ10bm05Z1n8HTcOEDr xPUOqUdvOcrFG9zCsuEJf8VQzb//ZcmHAYy3pNjcmg37yX43MwTaxnz9oykYL6sPLYKN V5aQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=l6a9MUY1; 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 s4-20020aa7d784000000b00418c2b5be2dsi2677389edq.271.2022.03.25.07.13.12; Fri, 25 Mar 2022 07:13: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=20210112 header.b=l6a9MUY1; 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 D487F68B23B; Fri, 25 Mar 2022 16:12:15 +0200 (EET) 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 03C0568B23B for ; Fri, 25 Mar 2022 16:12:13 +0200 (EET) Received: by mail-lf1-f42.google.com with SMTP id e16so13550584lfc.13 for ; Fri, 25 Mar 2022 07:12:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=C09XOhsNrXRvWLli6r3wbDdHapT6vS58Dy8xRNcf5Bc=; b=l6a9MUY1lUInR7JIpqHI/LFfX5NRA+sR/UEKohcj5OJU5twKoaYccO4lEN8/bC/Vt8 lznBPN3a1FuaJDNGMq8IHtIC5eAWx68myfbcr8rIIfVHIGXILxbY6A74oHe+N11lZIlN jrDWla9H96882rAybVAneXPOd82mcQ2/MDU5QOblWjahYzyKP5hHKrue3UBGzEACkDRc cC3lpXhPNN9Wd3Q2szpWKlxyjzRRWLyWEzygI8Du42R2OGEkkmcmLT/+pUUcAis2Ntxf 0LUMtUp82CRU9UmjdQU5kztFsV4WLG5lGUnF1+kCEXicHM5DyqgoVAkqZQt29767D3pz 06rw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=C09XOhsNrXRvWLli6r3wbDdHapT6vS58Dy8xRNcf5Bc=; b=TWK9kj2P6tKNehxSBeMHvAYrEHOhufgbpsOhswC/m04ikZ9rwa4D7L923RP6NEPaKe VQrmkpT33s67k0FF1ZohFuZe1emFbOE8VfYI/fUcc1KpqvPnX7Js+MaavMcefgINoOD7 l1RJ5wVGH3twvN64bPWlNVdZvr9ud5RwPgS7CYk7vLGAauR8mPHuTxNbreXRawruttO4 ASiHv7PQp9SvckLIJ2Pwy0P6DlajE2QKNykruVROcSdYmg6UZ4eHW6Hdg5x3Oe98dpnb l5PUpN0c/yCSsMrQmGBH6DRlgbSoK5aEpvN7v219/ZoQrp+yKu7tUFMuKKSlv+nqFMy8 6SwQ== X-Gm-Message-State: AOAM530Wipmbz5MZNZu0XaCSAxCf+2BSqKwRcgZ5d/WyWRTkMmeQC986 QPDqbX82+oKTewcnQETPvOCFAleNKeY= X-Received: by 2002:a05:6512:3718:b0:448:4bea:5409 with SMTP id z24-20020a056512371800b004484bea5409mr7867933lfr.639.1648217533069; Fri, 25 Mar 2022 07:12:13 -0700 (PDT) Received: from localhost.localdomain (deedock.humlab.lu.se. [130.235.135.183]) by smtp.gmail.com with ESMTPSA id n17-20020a19ef11000000b0044a37ab9754sm718889lfh.39.2022.03.25.07.12.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 25 Mar 2022 07:12:12 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Fri, 25 Mar 2022 15:10:29 +0100 Message-Id: <20220325141041.1748-11-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20220325141041.1748-1-dcnieho@gmail.com> References: <20220325141041.1748-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v4 10/22] 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: CcbfaRn3cg3Z Bumping avdevice major version (API removed, even if it cannot have been used by anyone) Signed-off-by: Diederick Niehorster --- libavdevice/avdevice.c | 2 +- libavdevice/avdevice.h | 28 +--------------------------- libavdevice/internal.h | 33 +++++++++++++++++++++++++++++++++ libavdevice/version.h | 2 +- libavdevice/version_major.h | 2 +- 5 files changed, 37 insertions(+), 30 deletions(-) diff --git a/libavdevice/avdevice.c b/libavdevice/avdevice.c index 24e14b84c9..db412985b2 100644 --- a/libavdevice/avdevice.c +++ b/libavdevice/avdevice.c @@ -34,7 +34,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 9724e7edf5..6d45c74616 100644 --- a/libavdevice/avdevice.h +++ b/libavdevice/avdevice.h @@ -416,33 +416,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 2c25804784..d789b3fd7b 100644 --- a/libavdevice/version.h +++ b/libavdevice/version.h @@ -30,7 +30,7 @@ #include "version_major.h" -#define LIBAVDEVICE_VERSION_MINOR 9 +#define LIBAVDEVICE_VERSION_MINOR 1 #define LIBAVDEVICE_VERSION_MICRO 100 #define LIBAVDEVICE_VERSION_INT AV_VERSION_INT(LIBAVDEVICE_VERSION_MAJOR, \ diff --git a/libavdevice/version_major.h b/libavdevice/version_major.h index d255ff6992..b32de7325d 100644 --- a/libavdevice/version_major.h +++ b/libavdevice/version_major.h @@ -25,7 +25,7 @@ * Libavdevice version macros */ -#define LIBAVDEVICE_VERSION_MAJOR 59 +#define LIBAVDEVICE_VERSION_MAJOR 60 /** * FF_API_* defines may be placed below to indicate public API that will be From patchwork Fri Mar 25 14:10:30 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Diederick C. Niehorster" X-Patchwork-Id: 34973 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:ab0:5fda:0:0:0:0:0 with SMTP id g26csp1376863uaj; Fri, 25 Mar 2022 07:13:26 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxkJH2o9yyrh1/mdguStua/Qi1V6JmYa6POSg9rHnBhdgnOdQ14THhmnicWqjsOdCGSvqru X-Received: by 2002:aa7:d7c1:0:b0:419:2f7e:178d with SMTP id e1-20020aa7d7c1000000b004192f7e178dmr13471549eds.136.1648217605868; Fri, 25 Mar 2022 07:13:25 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1648217605; cv=none; d=google.com; s=arc-20160816; b=C3EuVZBMgiKCawHbMI7aEWblgRsmuX4t/iCLYrT5h94oOnKK5RiGCdf553a1StOi1D Si01zrojXNg+7oVj4zNgyclXWb9F9sHEaZiVJEDD6Slkd9COZFeocWbGOYKKRtEhcj3c hO1iS96J3q7bZKc5ZAkhE7BZpuxG5pJI2MCSinN97ctPfF6qKjC6GH99wfLohFpb3ete DdAo3Mkvs9AtyAwausPhyMTguMshh4n29qrP+KNO4MN+0FBCWbDx/7MHuVUGSezzqvSF oXptQJ52+BZOXX8O8Aij3VP+i2A1IN8U3BWNtx17HJyzBcJDA/jnT1EpuMzOrWCq2Z7k Tyrg== 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=2A9pYbmgm0RCt3SMzrDK2Ugo0q/WIudAQ0Sr0wkSgKo=; b=MecWXuF+bytZzlPdvdHVwH8bqYz27uPvsi+IX0Crgd4GW/5gadMn721GbNJXYxXZQu aG0jBqSif/7r/1RTda0kyBdjAflMPAWVDhJloyJ2aLghYrOAuiAeuC1bBUn7PqTzVrm/ 5wYZeCk2jF0LUgThR+mLRGQslunwXNiW0qgvqUDjqBQUCfYw3Qw0W2ksD8MwLxiludWE vtacNsePCqX7rmr0qXlQSz8COubB1lAXYi9xw2S7xx9DPrZP1/tZVDmFgCerI+bX1ZAQ zm4QgG7cfdHaCtnJVOK8xwW8QvvbSmltZ8Yjmlrew5famMi7/x5gPstfDUFnMsvsvHc+ xztA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=gNLOjYPO; 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 u16-20020aa7d890000000b00418c2b5bea0si2798765edq.386.2022.03.25.07.13.25; Fri, 25 Mar 2022 07:13:25 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=gNLOjYPO; 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 E73D868B284; Fri, 25 Mar 2022 16:12:21 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lj1-f181.google.com (mail-lj1-f181.google.com [209.85.208.181]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id D099368B26E for ; Fri, 25 Mar 2022 16:12:20 +0200 (EET) Received: by mail-lj1-f181.google.com with SMTP id q5so10470117ljb.11 for ; Fri, 25 Mar 2022 07:12:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=e67rJjxL3/70KyO3YUb1luBz3oVKcQTD1Fo5/Lm7BoY=; b=gNLOjYPO4ynljmPWzagBFpIHok3mH6H0L9FkL6s4k9RnnegjebfMRO77uKMFwVILrx DxRJruFO7TQDjAeAJycmwe3GYF9Hu9BnaPiGM4sObbbH572Pob120LTTV6KcljJUMW7L Zxwaw9LAWGBJPALvMRHZsfC3R0ueKsxUAifGgCBmRZWRB7QXWe7JtYMTxCI6Im6ZWTmf vLkGzLeGz25LcAOyA9VEmbAS0zSO3wFUeY8VSZIAyfl9OijjCUKS9w40Syb5JCa1UpjG J58WLH+ac/uB8pD+fN9AH1Es8TtxO+UzgmHDA5oT5NiM2FsHRZEzNndE+TooYRR/8mXT hBMA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=e67rJjxL3/70KyO3YUb1luBz3oVKcQTD1Fo5/Lm7BoY=; b=P370d2o5yP4SsVlj5+mKTxRlupSk6ow22DmKL1c+1aK1dyCD960033h+x6rrsN+yeQ OzgcCvVcAN53pwSVtZZw9ErBmmRXuBbK05f/De78kNNscAvh1ndry55Tz24I+kFT8r+h +rTx6wNBKCY28yYjirOMOy3TnY02zkSZcu9NbPpzA3uZllrzQ8d18W4iB9wmcZ26I9I8 Ut7F0rM6JHXXofg4MJreBq0+xj536hk6GacmCT1dJNrE3LFKH9IwquU7F6VQJCj1SKUq ubNi/RlvNfTQsFn9WPH9lByL0fm9MyPqFS2SfGLzG6Ho7xOX0a4BUo5b/qGt95sD1ovJ q70Q== X-Gm-Message-State: AOAM531mAhErBvCew0Tfg48fWRI/rgET3mYvXF+8zr+48e91HaXZNlZp DRBZeGWM5VWko90Ce3sEcSaanzsdeqg= X-Received: by 2002:a05:651c:1024:b0:249:bab3:f3fa with SMTP id w4-20020a05651c102400b00249bab3f3famr1768719ljm.337.1648217539659; Fri, 25 Mar 2022 07:12:19 -0700 (PDT) Received: from localhost.localdomain (deedock.humlab.lu.se. [130.235.135.183]) by smtp.gmail.com with ESMTPSA id t5-20020ac25485000000b0044833ffc127sm717920lfk.185.2022.03.25.07.12.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 25 Mar 2022 07:12:19 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Fri, 25 Mar 2022 15:10:30 +0100 Message-Id: <20220325141041.1748-12-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20220325141041.1748-1-dcnieho@gmail.com> References: <20220325141041.1748-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v4 11/22] 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: 4OOygy0lGJ2f 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 8ffb10449b..ebffbb2f36 100644 --- a/libavutil/opt.c +++ b/libavutil/opt.c @@ -1979,9 +1979,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 461b5d3b6b..4e7d7433e9 100644 --- a/libavutil/opt.h +++ b/libavutil/opt.h @@ -316,6 +316,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 Fri Mar 25 14:10:31 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Diederick C. Niehorster" X-Patchwork-Id: 34974 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:ab0:5fda:0:0:0:0:0 with SMTP id g26csp1376884uaj; Fri, 25 Mar 2022 07:13:37 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxMys758D5MFpVrTaWlYCzKd2X+SzuN1vdg1FSI1NRv//xiRBfC1vkeAmigfKmjMOBbTFKt X-Received: by 2002:a05:6402:c81:b0:410:a329:e27a with SMTP id cm1-20020a0564020c8100b00410a329e27amr13326742edb.142.1648217617680; Fri, 25 Mar 2022 07:13:37 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1648217617; cv=none; d=google.com; s=arc-20160816; b=EdfUQBz+FKqqYsDCCsDqzkw1UALYBAoBFg8uvokgVJhfgxV2oCzP+4RhTIKFnc66/p T9bF18TSBtCP/307f/YblRK+9n4Bnz1JjnTBKpumsEzPrRLS6FRYknFJyfpuNCJiCOdb C/eBVkQbvc/Q1Qra2mrkLZct1xjAka8aRpNSMq973OV8pswcEJKePy9722eyVhSS3VE9 0I5EmjJTlbNpU4VcZN9/NaX7w2Ir/eS17WuxS9bEiDHGTbkafl3+Q5DsMQDBebKdTqjW Z8uZxvEaT0Cxl7ytwFuR+kftLXkC7ex4nTkIHThlT0ZznxIv0Am6CoQ/ng/6oawa+SLx ZvCQ== 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=DkNgvc6y/508EGEkHrThLvAiPQqUuHElzbAfTdB5RN4=; b=cCepKlGVLKHOGGuqDxMPxyiV7nsJ2TGAjBhV70zPv6ly85i6dXoTV4IUW1ie6rDyCw fMFZ6klJ/n8XXZ7J7l6bP6UCsGKJBIVzycYLtIWq+p01jMoBqINUWZIvWsaiSWLwmfVq 4YP/2FECcaAhlJUUm+sE12WbYtWCi34H5OwzpP0LniEgsNfoDsIIMxdfNqjgXnoHKmO1 ldD9Rl+c7+IHXYakRzro99zUx9XHl3wNXFD4tTUcuWS3CmlglIJD1o8IWWeC61h/VJbo 9fmOgYu5J3vVB1cKYndgxTVf9+NZ2ntea7UlMFPXvdzLh0EiOwjCjm/s1XvhmPFS0JBW 8G5w== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=UmjuEMM0; 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 k20-20020a1709062a5400b006df76385d31si2712265eje.465.2022.03.25.07.13.37; Fri, 25 Mar 2022 07:13:37 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=UmjuEMM0; 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 EBD6468B28B; Fri, 25 Mar 2022 16:12:33 +0200 (EET) 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 57B0568B246 for ; Fri, 25 Mar 2022 16:12:27 +0200 (EET) Received: by mail-lf1-f49.google.com with SMTP id a26so13574807lfg.10 for ; Fri, 25 Mar 2022 07:12:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=7FA+octZ7Nt5nuLnopYPpV/YR8czF8Mpn25MCIj23EI=; b=UmjuEMM0wjVHWHm3dMUlU7vDjVghv7KxicA2alPGSpEDSDf6wJw/sd5H5pSynNOzOS AlyCGunnWuuICM0N5f7f41zi0BApVEFyAN6f31mQChOPjObnBHL+zItv2nInwA9wD7O8 e/YLGqTMQReCAAibguUAeBUUQOmW3bejs5XRf3GzMvW1BKq7abFrRdeBz9UFMumwrcXv cAwAILxOLR0qQi5a/4HgYgWzhpzqxN+1jMc4/qBTRlLQOdOZ1IWzSnl+BBNk5GTickBD 0QpSdHYCHLVxfRYk2xI2oZk61QSJeq2t2la7lFjd6C/YUnfQ/ZVYTja+Z/foTuon3mcv hDjg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=7FA+octZ7Nt5nuLnopYPpV/YR8czF8Mpn25MCIj23EI=; b=lbSlVPTvww9FtClFO29pLGNN+7RSD7uenZVgSTAvR6CqGEAMyi8+xwF8TB4ercWDgR Xh+YpwW3xPS0B1oW1eWLfTQ+VR7QFRKxHz1OXtgiKkxqKFdkJI+OpkgdIPGsKO3M3NnU 5fN/pL3csaIbxaSpQgyhO7aNopWVW+AVeG6WC+9d6cMB4tbRKZbMK9F5Ylu0hKYVSMIt M2SoRSFUYZL1DG0msQUwJmpNtiVtstYIkYm2VT0OxqlVZUobm/Cl376Vp/idyPZ5ke5U K/qokJvmPnW7CzE/krTnzb1nbKROp7f/CfNbJcBmw+sTiz6VB5BPh/Ry4J8zPLZjrUwD e5Vw== X-Gm-Message-State: AOAM533TVwLY6fyL2L99NWCpQVnTAnVsi5Xn9B1ZGa+wwvlyub+u8mbK MWFg0vQBzI9xUVBbWMGSKFtZa+APUf4= X-Received: by 2002:a05:6512:318a:b0:44a:4dab:4cd2 with SMTP id i10-20020a056512318a00b0044a4dab4cd2mr8039439lfe.606.1648217546291; Fri, 25 Mar 2022 07:12:26 -0700 (PDT) Received: from localhost.localdomain (deedock.humlab.lu.se. [130.235.135.183]) by smtp.gmail.com with ESMTPSA id s25-20020a197719000000b0044a52a63b0csm719290lfc.33.2022.03.25.07.12.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 25 Mar 2022 07:12:25 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Fri, 25 Mar 2022 15:10:31 +0100 Message-Id: <20220325141041.1748-13-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20220325141041.1748-1-dcnieho@gmail.com> References: <20220325141041.1748-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v4 12/22] 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: si85Taj1PmFn Signed-off-by: Diederick Niehorster --- libavdevice/internal.h | 31 +++++++++++++++++++++++++++ libavdevice/utils.c | 48 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+) 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 From patchwork Fri Mar 25 14:10:32 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Diederick C. Niehorster" X-Patchwork-Id: 34961 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:ab0:5fda:0:0:0:0:0 with SMTP id g26csp1376916uaj; Fri, 25 Mar 2022 07:13:48 -0700 (PDT) X-Google-Smtp-Source: ABdhPJy2nWW1WKTYl+XdICly4COUtO0Gcjn0cQXGji2p2waKnCQnZcG+KGtUIvtb/1H0/7Fv03bi X-Received: by 2002:a17:906:c14c:b0:6e0:75db:8a9b with SMTP id dp12-20020a170906c14c00b006e075db8a9bmr10419152ejc.376.1648217628662; Fri, 25 Mar 2022 07:13:48 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1648217628; cv=none; d=google.com; s=arc-20160816; b=hUE2JGtRqys8HkFMHZxTURIorHPOrMTV9ZU9JXGt7kELLv/HVOl57I4uEkROXA8sV/ GlEYGRZWywaIvUCk2Eh8NfPZBkLUVT+I2BAM0zRdnPMLzGKScA4PM61x+tcymtES/Ejq HF07QfAWP5xChPYiewIvns6cVAbjmWvYSGTK6cLAVqf7A4xVu0w99i2JbhtMjQ+LkDkL /apsakpt2+PF9nWGUl+BUWnsaWN/oldHznNV5VwZTmpBMFTbkhEj16K5kLYWEZaDEZP9 eLwtZBaBayW87eVuBVJE7TzCnrkuZSbIg7zZdvVYWke3G/QFRJQcTr+Ddh/3svVObh43 JA3Q== 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=TLbbHTDSz0R9vSs+oJKHitabK/IsW4YvXP/pQ1PYkzw=; b=EOOCsb2e1W5BCOVd2hnM6M4bxa62gXiYOZsUQRzt6MpqJ2HOVPQlAy7Qt2wTF9xtD+ jOz3VixC8NEH4ocbDCaRjBjaLg6JLzOqEvwwIoJMS1nptoFnQIpJSdkWw+oalZz5wJej UyIyefqBUiY/hLowXgbwsHx6Y6+YsOhSkrofu2zme+QS9JpNWBZ1QQWXPDshNuhLs6Qs ScJqvxa+738vmaWq6Cf9hsNXNBmM7Wysxg9N+n7lehFVu7xPNb4EZx9Ks8Z92uz7qR1q 5Vg5Yr2q6FAjeunn2BMOSCkNVLvjzy1PcW7KlzALc5fvtIzV9+Kw2NBYgveG3duDOaVX P9fg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=VlUKDnVR; 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 s22-20020a508d16000000b00418c2b5be2esi2944469eds.272.2022.03.25.07.13.48; Fri, 25 Mar 2022 07:13:48 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=VlUKDnVR; 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 026B168B290; Fri, 25 Mar 2022 16:12:36 +0200 (EET) 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 F35C568B281 for ; Fri, 25 Mar 2022 16:12:34 +0200 (EET) Received: by mail-lj1-f173.google.com with SMTP id u3so10524787ljd.0 for ; Fri, 25 Mar 2022 07:12:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=hwoBhR7NeixusKzUXC9TCxI7eXMsIgi1bf84sm0xmMo=; b=VlUKDnVRqlFntFouey+dV1ccovIcgHVAIGnDZS+Lu4vDgetd1oEQIGn21VWGbI4sXR AEEKOLZkCNcF5I95rRcfG0g6wEvykju75QAk0b+prx51DZGxIlXzUjKEDmHHyvx64NLf o0bN7nPU+SgF6sQL+dVIFoeCT8vjHx2UlMe424UnHTHdxEj77jxPSFLBQrlddPg7I0LK JgYOJMo8v6/5jUWP/QEIuM8Lqlsz4Myojvtv0rXPyHE7yvdJJDFc3DkSKK4Z5uPYO1df dz/p5NwYlALErlAvGQeSDXGpTiyw7DS/oVTWyDWRf7ix8ZMhOEzIDicRvRS7WGAqURmU cXgA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=hwoBhR7NeixusKzUXC9TCxI7eXMsIgi1bf84sm0xmMo=; b=iDP/hSjxyCb4MHIw6RpuCTayrtzDYPLA6HNtTtAyAT6KCVi5sb51tUnn8o8zUYIZSV eM8e/d0jjs7ezhZA9VqxeQYKEQ2gM3YJ6FaukDSjt69q6rQIKvzNW0j9UL/J9dJzrBTb 1H9GB6C+i/uAlpS4XlONaNI2kgEIwvGMsHnEItkV0SldUAps0gzo1qer1s+4cZplWKKU V5pWXfvRlvjvafOxaZBGcwCWiiRGiAws9zTPjQmtlW3V73JDroC/UYPSET53w5uRVF1O FK83pAzQv4/UQavreuJiLzR4TVHzlO+hesQjUz9WjFfOd8bYWWq4LriaeL9TfsYcB7ps 8XEA== X-Gm-Message-State: AOAM533WkfPZ7Xa3bB3wL+syKx7CZR1Reo/GOMERPPbcN+XYUU3w182z 98GSkshtg86eu2Bk1mz9NIfQ8CnqXIE= X-Received: by 2002:a2e:7313:0:b0:249:84e3:a848 with SMTP id o19-20020a2e7313000000b0024984e3a848mr8440188ljc.320.1648217553732; Fri, 25 Mar 2022 07:12:33 -0700 (PDT) Received: from localhost.localdomain (deedock.humlab.lu.se. [130.235.135.183]) by smtp.gmail.com with ESMTPSA id y1-20020a0565123f0100b0044584339e5dsm718608lfa.190.2022.03.25.07.12.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 25 Mar 2022 07:12:33 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Fri, 25 Mar 2022 15:10:32 +0100 Message-Id: <20220325141041.1748-14-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20220325141041.1748-1-dcnieho@gmail.com> References: <20220325141041.1748-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v4 13/22] 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: ssJQld8MAltv 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 db412985b2..33061b4408 100644 --- a/libavdevice/avdevice.c +++ b/libavdevice/avdevice.c @@ -51,8 +51,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 6d45c74616..a815d65f12 100644 --- a/libavdevice/avdevice.h +++ b/libavdevice/avdevice.h @@ -360,7 +360,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. @@ -369,13 +369,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 d789b3fd7b..9853069a2d 100644 --- a/libavdevice/version.h +++ b/libavdevice/version.h @@ -31,7 +31,7 @@ #include "version_major.h" #define LIBAVDEVICE_VERSION_MINOR 1 -#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 Fri Mar 25 14:10:33 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Diederick C. Niehorster" X-Patchwork-Id: 34975 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:ab0:5fda:0:0:0:0:0 with SMTP id g26csp1376958uaj; Fri, 25 Mar 2022 07:14:00 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwLtMRB1zm79/QT2flgxZn7ZBw0+gIdZkXKwZtIfGDv7TMJ1E0uVy5Z6r8BvOuOLBfioXJJ X-Received: by 2002:a17:906:4cca:b0:6ce:6a06:bf7 with SMTP id q10-20020a1709064cca00b006ce6a060bf7mr12273832ejt.109.1648217640093; Fri, 25 Mar 2022 07:14:00 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1648217640; cv=none; d=google.com; s=arc-20160816; b=OEUcjGimI9KV9DrjCfK/IxcM61NI6eE3QhGJk14bzskDcWlC/2AefIslZnPm6xYgwY d28E6UlCpnfuzj4X3LpVBp1d6nk9/XK/CjWfT8X0h+WZcuXey4c2ZMgVKxA/xMY8gPcy BxLvDMiIAjBHIg9Gxu8st+D+cNZIRv+3tMVGV66lUrWonx9R+Hh0PxV4avINtny7r2j9 jZnzwz0tWvbK8hVux/yn3oAS3bDmu0K/RkOkaLj4jorCTrHEX0tTxEkr9ZzrFZuoChne A/KTShJdcrhaahLh9Ief6hhEEsADgxj06INwxaxO6AGbyRqNABIDnLmNrF/xG8UQ46bQ oEjA== 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=EwDYmawdN9Jz65CTscXn5KCeWiCryLTTS+aNYfg/6ck=; b=U2LXAn4HsJ91ZAAKb7Ri1sV2+tLEWNkLf6Yqk+hUmrdcRsPqyI4HG1kST9n0ykTmfM Ac+DEFjE8Do/A4hOpRBozKHClz7FEEsnGRbpaUmWd/N/vTASWGyFeZ5IfgqmZ8iDwFL2 I8EA7tvJzY8QXAyegz6oT+/xnTVAENDv8Fhf8AMsNqfu9qQedBvMidOdcOCLxJcN4/El /9iWqeGeSGzrMGuRjImxGMM5iS3+0blVOWTlCHms3sJNrwHEdIHzH7e8tmr2UyJqpVtM f3UbqYyzmOv7jbDu+ZFvjwfDNnO5UQh7lQAILD1TXN9wUs1DYxDomT/0pI/w9Kc8zOEv yoSA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=jFtQeWc3; 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 u16-20020a056402065000b0041962abfa3fsi2717998edx.387.2022.03.25.07.13.59; Fri, 25 Mar 2022 07:14: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=20210112 header.b=jFtQeWc3; 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 D84A968B299; Fri, 25 Mar 2022 16:12:42 +0200 (EET) 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 24F6068B28D for ; Fri, 25 Mar 2022 16:12:42 +0200 (EET) Received: by mail-lf1-f42.google.com with SMTP id a26so13575957lfg.10 for ; Fri, 25 Mar 2022 07:12:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=O1WcsWfmRIel9tElns9LMmnPpxj18tVvIKsI4HSqavQ=; b=jFtQeWc3WETRVCylsiw4tDRts4d3O/H1mYzWnfAvPbs/8A+FzGl2Ihyvs2iiKOY1sj OEKETacICLm8HkpROEuk2FjwoEPWLHxWemN6LQhRtz48M+/JNpQ4mVSRCeXZFp/gItvY Bm10rV6cj/Zii2H5DKTrTMcUOfw7X2F2sSBkMy0HueDVh6OPyy3Lv56u9txZrJZUz4bv AXYOSxy5LXRy6voHXX/2w/Q5V6OF3H5foIkBM/TRl7FmN4JY3zPQUwQN/vlol3Lir1Hd CQrKmk3Cc25qJGzSvR79X6YblEoTU3cheV832Pao+3FuH6Q125F4TXki32wI6NKMxhZ0 tWGQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=O1WcsWfmRIel9tElns9LMmnPpxj18tVvIKsI4HSqavQ=; b=ZtdC5U5AHTp9H8uHih/HWSHtIFQ/UV9uPxg+dxMTgmfzss3cYz2Zi7aDssI4SzZ7gU urQtrQ4RRNefhr5r3at+pIRkp24e8AGL4oqImqSujTWFtVFKyBNroV15lqSCv7PbxN8G niuoXk8q/TXE43Aapfbo7IenKObLPW/fRIuOKSjVNwtX9Yf1yM6P+NFlpgNLbnVN5GiI TuzN4/H5u93BTqFJd90ZDubAGDZUuWrTPr4gWjFfdQ8y4QvvX2ltTnR2GYkeCICM1J19 XgdGaR3CLDUeSlm6Vv4DWtZfaqT3kQ2+a0+CzA6FxgWoIt2gIqUK2YSGH2XSqsBXv6CX sRRw== X-Gm-Message-State: AOAM532eR/fXHJk5PHQ9tSU537AMHOxtmGQb0XwjmSRK8e4Hl8jo0iSB zg2btULdQxrlSNe17tQyF1uxNDOQPaM= X-Received: by 2002:a05:6512:e9e:b0:44a:10f4:a185 with SMTP id bi30-20020a0565120e9e00b0044a10f4a185mr7784486lfb.205.1648217560474; Fri, 25 Mar 2022 07:12:40 -0700 (PDT) Received: from localhost.localdomain (deedock.humlab.lu.se. [130.235.135.183]) by smtp.gmail.com with ESMTPSA id c25-20020a2e6819000000b00247de61d3fdsm700858lja.113.2022.03.25.07.12.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 25 Mar 2022 07:12:39 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Fri, 25 Mar 2022 15:10:33 +0100 Message-Id: <20220325141041.1748-15-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20220325141041.1748-1-dcnieho@gmail.com> References: <20220325141041.1748-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v4 14/22] 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: awKjJz811jen 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 | 80 ++++++++++++++++++++++++++++++++++++++++++ libavdevice/avdevice.h | 27 ++++++++++++++ libavdevice/version.h | 4 +-- 3 files changed, 109 insertions(+), 2 deletions(-) diff --git a/libavdevice/avdevice.c b/libavdevice/avdevice.c index 33061b4408..0a75504d9c 100644 --- a/libavdevice/avdevice.c +++ b/libavdevice/avdevice.c @@ -19,6 +19,9 @@ #include "libavutil/avassert.h" #include "libavutil/samplefmt.h" #include "libavutil/pixfmt.h" +#include "libavutil/pixdesc.h" +#include "libavutil/avutil.h" +#include "libavcodec/codec_id.h" #include "libavformat/version.h" #include "avdevice.h" #include "internal.h" @@ -141,6 +144,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 a815d65f12..5f9dfccc34 100644 --- a/libavdevice/avdevice.h +++ b/libavdevice/avdevice.h @@ -64,6 +64,7 @@ #include "libavutil/log.h" #include "libavutil/opt.h" #include "libavutil/dict.h" +#include "libavutil/bprint.h" #include "libavformat/avformat.h" /** @@ -418,6 +419,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. * @@ -438,6 +449,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 9853069a2d..5a62e5ec6f 100644 --- a/libavdevice/version.h +++ b/libavdevice/version.h @@ -30,8 +30,8 @@ #include "version_major.h" -#define LIBAVDEVICE_VERSION_MINOR 1 -#define LIBAVDEVICE_VERSION_MICRO 101 +#define LIBAVDEVICE_VERSION_MINOR 2 +#define LIBAVDEVICE_VERSION_MICRO 100 #define LIBAVDEVICE_VERSION_INT AV_VERSION_INT(LIBAVDEVICE_VERSION_MAJOR, \ LIBAVDEVICE_VERSION_MINOR, \ From patchwork Fri Mar 25 14:10:34 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Diederick C. Niehorster" X-Patchwork-Id: 34976 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:ab0:5fda:0:0:0:0:0 with SMTP id g26csp1376993uaj; Fri, 25 Mar 2022 07:14:11 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwSDaQSiBx6YPuWr93n/DgD1N5w9lcX7wfeQzYwdizFU+PL/THzzLK0/n06IiXwUkbXyPZd X-Received: by 2002:a17:907:94cd:b0:6d9:89e1:3036 with SMTP id dn13-20020a17090794cd00b006d989e13036mr11755785ejc.231.1648217651620; Fri, 25 Mar 2022 07:14:11 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1648217651; cv=none; d=google.com; s=arc-20160816; b=r4vNtmSJ4+aSHI+u9Q/4Nj8Cv1JUof6dFTTfzNoW7+ueVvh1qezUzzqjjjdxBt1uxt EPsd7TC1owwi5EBkBxrU2uoE8zxcYwXAY4ofx7yKWArBzl5J1oNYKOjHlxt4YzSKtqYf k9EEnKVfGUXyDI0/c4F/qetVYDKpfE42qwS4HjyLnsmp2/CwHeLZSzbcFyNajX8ClPMh CX2Fy/xtnB+NOOBGAwZdNSc3fFXxFCBw0t3FaEW/7YnZG50/s3Z+x+boO3GLTHWdDmm+ PG/RydyfjASzGWLhenbxLhoB0Ydl5aLo1P4bh/HvSe3WFa7NVzHSfghSDNUBQceUUfJP Wy2g== 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=oJwKKqTxhp5hCx8kUXi8h9mEgSTCo7lslq3HjbT7OCA=; b=vhgPLTzAP5gEBoTtYYMHWNyh89vAbwbdTOzYdCONKkaJCEay/OSFZUQ6QfJ0Brimwn xTXPcfz1Pn70ybgWlpTb70eu7VGHUozsOZaWg/Mimpyysv4iA+Akt7AcO7ayfWXjcrfQ OmeYYGDBCk3tKLrAYia2EwU0EFGYDgRgG8/ILNft8Mye95Uz79srBSsGWTq193TXx3g7 6xVYnYlk+eLZljXQMOyJjJlydzUFJU8HM9ZQjhIY/qlakv3nycQyQIt7d7ItkMuw9LFS MwZIeNsy65mWH8qgNMyDFIqnDNIUk4D1wEVGu2Gixc2fAszd/IVbkFAZEy0SaMvU0z88 ZJHQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=eTMTcElO; 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 r22-20020a170906351600b006df76385e31si2426405eja.721.2022.03.25.07.14.11; Fri, 25 Mar 2022 07:14: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=20210112 header.b=eTMTcElO; 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 DFE1768B2A8; Fri, 25 Mar 2022 16:12:54 +0200 (EET) 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 6E65568B2A4 for ; Fri, 25 Mar 2022 16:12:48 +0200 (EET) Received: by mail-lf1-f48.google.com with SMTP id 5so13621264lfp.1 for ; Fri, 25 Mar 2022 07:12:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=X9tilHYFSR8oj/oR0fxEXcXNQjGVqHXRBOg/E6sKVkg=; b=eTMTcElOiYO7EjHUkJEaoSOb6dkH7dZj+AhNR0UR+CrpzfKA0fF29PEDa693eSQfZY VZs0zQnIW5hPf/YXgBvmSNqL+0iqg6h0R+GDhU6jK6EoHMWjugCHmyoFRk/+BFYKIXNW yf4SBaGUiKdZ/MefQHtwzezg5hhTWa0ozA7x/hWSmO9+zA2rStE91DrhZIAwbI3RFEU/ xAB0jx/upqfED150bxV3o2pzYkGeJUr4X+EAusJIgGY0rwhQQaOgZ/udBfQ8GqknJ2Bc 7M9dO4zOF4A4qrx6YJrWxH2Gg6kj90edNJMpzrvGA1OnrGxsTjeyvJuC5feSvqTFOvLg 78gg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=X9tilHYFSR8oj/oR0fxEXcXNQjGVqHXRBOg/E6sKVkg=; b=ovCtCq50SR6fqmynH2Lvqo3GOLcGI0m0jMCZVoOwmx1a6Cp0ZQY4ZxVF5IntFfToNd eyNX8fsuNmrFoG5wm3ZrxMWpEXCC2LkxODcgCTgzOclFVLRgI4ftZ7oF7ExqnR4ngyKI obwtS59B0z0ewqqTOM64U+NwTFIcUbFt5HQilEs1L19OdvPLaj4xcVV29yvpHMdvJGsD UvgUvdXGSy0p6Pj3xWbTQtpvGYl6h/14Xi6erMmK/P7tuqVYnERz/QLJ2RPgHaJi5qK2 r4/5oTu6Bq72MI8N0WA5MFeaH6jUf6QF8jPVrUFqn8KW6eSD//zMPv0QcQcdF6E3SpIw Xjmw== X-Gm-Message-State: AOAM530zMtiMyi71jrPwOKQu+mU5tXi04Axnl/aDO9NcBT/eMxYIju/8 zFJrpnoYRbUyGgM2oQBvQ5OGNCN6OWk= X-Received: by 2002:a05:6512:4014:b0:44a:2b77:bed6 with SMTP id br20-20020a056512401400b0044a2b77bed6mr7645998lfb.381.1648217567464; Fri, 25 Mar 2022 07:12:47 -0700 (PDT) Received: from localhost.localdomain (deedock.humlab.lu.se. [130.235.135.183]) by smtp.gmail.com with ESMTPSA id w7-20020a194907000000b0044828c52479sm718758lfa.198.2022.03.25.07.12.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 25 Mar 2022 07:12:46 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Fri, 25 Mar 2022 15:10:34 +0100 Message-Id: <20220325141041.1748-16-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20220325141041.1748-1-dcnieho@gmail.com> References: <20220325141041.1748-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v4 15/22] 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: eSPh/miW6nuo 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 a780351170..d35224beb5 100644 --- a/libavdevice/dshow.c +++ b/libavdevice/dshow.c @@ -79,6 +79,26 @@ static enum AVPixelFormat dshow_pixfmt(DWORD biCompression, WORD biBitCount) return avpriv_pix_fmt_find(PIX_FMT_LIST_RAW, 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) @@ -1610,26 +1630,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 Fri Mar 25 14:10:35 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Diederick C. Niehorster" X-Patchwork-Id: 34977 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:ab0:5fda:0:0:0:0:0 with SMTP id g26csp1377041uaj; Fri, 25 Mar 2022 07:14:24 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzSjMYsgKKB8zlwU7+gHf5z2Uh3rZx24W7PC8D1yyLwb4/pTshaR+9q612TYwqmjIqvLun/ X-Received: by 2002:a17:906:3014:b0:6da:f381:4dfe with SMTP id 20-20020a170906301400b006daf3814dfemr11722904ejz.670.1648217664726; Fri, 25 Mar 2022 07:14:24 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1648217664; cv=none; d=google.com; s=arc-20160816; b=qdizP5WJ5Nyiv9aJASVvIMcJ0z+5V3YJtnAxbyVD3gIIQYLEHEBnazh3pFhY8HGHou ZmabF1pHA6O93fheHA/UIos9VNU4V8f8Ic0VdQiva53QHdd+LCLL7Ct6PWOA2uqTk+gd n4I4/TxUjd0Hsvr4pSkB3niqG64+v11sXRkVe7T5gLeQJ+Q5PsQPJSMJ8qmNJs2+tZ9Q GAeWmuPnXog3F/fNZpeHzWcqTyjc8pAYyC4fbbCJsNE8ZD7Qjmnlf2D5K6lqQHxOcCwv wA6iwJw9Uwx7+V8YIgvL2r4o8F5o7CaZWw0P0xkv8evGLd9owwAj38zNk2JUk876d/Z4 ZMpQ== 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=CClGl678/vkJZEzh0zBJsqU/ddMSJj3H8A68MKwD7ho=; b=njeYWs8Goy/kswRD2LlAduSG7ZpR/WwVLRLcwEEr9XhyMsbA/V5QsIvPpHTIoltwQD 5V2/4sFAOLD56JgeW3viG3sPCV2m+i6mE1XdeqHdipEaEXx+zc4qel5/juUNtytLKdW7 l+2EnKyVMqdG2YXCSvwDfq154HqnAWlDjr4tsASj4smv8n2HRjhubofCaO4nYL5iSyBO 5vwGJeTKkvMgeDptj/QOWUQ3rd9IICRPRXDzIixMrTT1ngEm76aprwbt9TelRqS5dEjB eiSQu+kGJRbzZqHt4XncCsuS2SOyZLWhfEhLwATcvMYAN/X/Fz4vgi8NFh6Ydno1MhBx 4ztw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=l5pR1FV2; 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 gf20-20020a170906e21400b006e09342363dsi2535243ejb.866.2022.03.25.07.14.24; Fri, 25 Mar 2022 07:14: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=20210112 header.b=l5pR1FV2; 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 DE37368B2B1; Fri, 25 Mar 2022 16:12:56 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lj1-f177.google.com (mail-lj1-f177.google.com [209.85.208.177]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 4ADF868B2AA for ; Fri, 25 Mar 2022 16:12:55 +0200 (EET) Received: by mail-lj1-f177.google.com with SMTP id q14so10453154ljc.12 for ; Fri, 25 Mar 2022 07:12:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=NK/QrJEeth1MSuzhPObWDUazu7iR/OBn1N+cSzfeM/U=; b=l5pR1FV2/pro4YAxwyBCkL3T3Qr+iFbNgw4V3mZ/NklJ/LtwAe7JMsId1rBR9lgUU4 ikOtPmRQXRMK976g5TdeOcV7Em26RkuY9B6xGBfJ8Toh7Uqyb3wJK9ZWgmD8M0c5AABC 1UP5q/c54prESP7pkqNA1HB04h7Gh1CVOIjd2Z9PblI4300KmOAwjQbAnzGxotIAYKxP DIoLl5iytzinR5NUDRdseSSj22vfxOI/6JY0jxE7f0GXKastngPZtr+8KQW7bjr3K1+R PESo8db2KLB9yp54frz2wjdsgQpVrJv3r34gQjgcKo4FKFJPkwoeN9OUM6T8bPWb28PC gr3A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=NK/QrJEeth1MSuzhPObWDUazu7iR/OBn1N+cSzfeM/U=; b=zAduQjVMChPxPphiHETr091xd43tWRyAlOmCUDMahsOYDQRwLGkHhvWY/M4fn7bK8V P/v0SBiiw3w+9FndGA7gOYTDtv4TPkHNPuFWiG2+D7Fkpy6kSGCaEgoChELB5SibLXvI 3T5U7hUVa+Xg6occD/LhYhWwxCZ52T84IlZj7hoaKuIt1C7wWruDu/kqCL8YjImyRqwK wwPLN1bIrGlHD1P63N6Oehd2wTA2Jkp9R4bo+JEXj/VK4heb76IZJ/9WRveTOwj30fg2 2gomxvwgz16bHTY6ULF2SlaBoaucmE7Y52qoeXsYcP0Ig7MaglJuIeTDY1jQgRBiyWf6 0/lg== X-Gm-Message-State: AOAM531Yl7tEbw0xDoTyq6peBvCqDkp34h+uNdO0NLK7XJnW37E3XMya asOcfPd3S5klbGVa/1a4/ZqH+wnZ3Ss= X-Received: by 2002:a2e:96c6:0:b0:249:863c:5b2a with SMTP id d6-20020a2e96c6000000b00249863c5b2amr8039956ljj.103.1648217574135; Fri, 25 Mar 2022 07:12:54 -0700 (PDT) Received: from localhost.localdomain (deedock.humlab.lu.se. [130.235.135.183]) by smtp.gmail.com with ESMTPSA id g27-20020a2eb5db000000b002498222c8dasm680975ljn.65.2022.03.25.07.12.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 25 Mar 2022 07:12:53 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Fri, 25 Mar 2022 15:10:35 +0100 Message-Id: <20220325141041.1748-17-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20220325141041.1748-1-dcnieho@gmail.com> References: <20220325141041.1748-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v4 16/22] 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: YXX8tyluxkHT 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 d35224beb5..0d5f731030 100644 --- a/libavdevice/dshow.c +++ b/libavdevice/dshow.c @@ -264,14 +264,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; @@ -289,25 +293,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]); @@ -316,10 +329,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) { @@ -328,6 +344,7 @@ dshow_read_close(AVFormatContext *s) av_free(pktl); pktl = next; } + ctx->pktl = NULL; CoUninitialize(); From patchwork Fri Mar 25 14:10:36 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Diederick C. Niehorster" X-Patchwork-Id: 34978 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:ab0:5fda:0:0:0:0:0 with SMTP id g26csp1377073uaj; Fri, 25 Mar 2022 07:14:38 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxlEjP8kX1cMUTwkDzM7EP5flc5OB76Mjy/vgO8itnC+rSOpSjZ7XTythuUycyXz0z01Ygc X-Received: by 2002:a17:907:6094:b0:6df:67b4:c788 with SMTP id ht20-20020a170907609400b006df67b4c788mr12313695ejc.155.1648217678008; Fri, 25 Mar 2022 07:14:38 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1648217678; cv=none; d=google.com; s=arc-20160816; b=XeRd/ydFoW6m3RCCWf0jd6xImHbHXJuo36c0OcMNQUGXrvQH17CKba05EO0FJHiocs cnZPlF9spO4k7fRMRa1/yQvsM6imh35dVIAB3FbrkH/6ztxeGLCq4yWuGiVTjnsy8qax pZmZNTeuoZE6+CwTIvAZiKzTutw+9YtBTTNAtxhDBFm+lViWrHJu30QjIlaZzLskE11w 34nSDeM/G1Ek2WrDY+KgTyA9z2JjfOafrW9umi0uONuhrTnhWpn+u5YbPW57ThdsJoit UFPXQAViYrrlqXbUAoM+sZZWhEYYvZ8AUINiLi28TCfNYxKL/uUZ8zmpLpe9jROdjfo+ bzvQ== 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=AIgIcBYbSqg/HP67JCl5B4FFV9SwHLIx2oWbU+BVI70=; b=B1ikI5y9vK/bbF9fW1yJPiauiF5ysGaVv7UpzZ/6BeT20WowxKuot9uEMsME7pnIBS mIrppBQJ5Tcy6Mw0qQ8PZygX8qQWeQSOan97ID4wnezHMKlN+RVpUmoklCdUPvYcWtz3 lb4aoTBj9auQLFJHkIao86cicQMCYe64oXP0+p0CnQUTfo6mlr9uTppaH9KxYU50jAgl gEiWTXCvhvRbCX2fBHKCDQqMfgOxsHKma1KY/WZ8Fthcrz1WU9dQTREEDlY2WEIrwaBN E670gWthcJIZqf8y68meTG9YkAi1URt9xx5vbGfr2kmCsi0WahGFXOVwQ1rq9wXH5uVN APOA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=JM8Jk4KZ; 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 y15-20020aa7c24f000000b00418c2b5be29si3075985edo.267.2022.03.25.07.14.37; Fri, 25 Mar 2022 07:14:37 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=JM8Jk4KZ; 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 D8D7B68B22C; Fri, 25 Mar 2022 16:13:03 +0200 (EET) 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 6A1EF68B22C for ; Fri, 25 Mar 2022 16:13:02 +0200 (EET) Received: by mail-lj1-f174.google.com with SMTP id c15so10471309ljr.9 for ; Fri, 25 Mar 2022 07:13:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=+Fb/1d9V5tLeAs1puH2cuoxf/r59RYHHFkdNV1Fq1u8=; b=JM8Jk4KZQlT0ijjmwPipLjq99BphngFlpwgKWoxlG+fJRw3ZKnZHPYtIDPIe/deBOk l5zZenMUkoRkMj2G6fIi+xbxPS14CDgFEtNAam+lZpmKiBGnv/s23IA5IjCJ4kiGVbQ1 3KNP+05n6P/8K93Mc0W3K+0UyD/u6U7Nvd1/ps2+P5hjovTjx77n7QYTkZ5/RNjzpybV gA/Wk+9uzvNQweZQytzYbjsdxCXX+QKVq7XI7v9nMTqO7qifn/hYsPxgAqgiXxKtqjY9 HM9ECTkMeLzQNuTwGjK9qbu8pG4MhcsTEgttxAUO1gleARhpHn6MJHH/3UaxWEWUX9XL W7Vw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=+Fb/1d9V5tLeAs1puH2cuoxf/r59RYHHFkdNV1Fq1u8=; b=vvVXngm7gm71V/jgVUqhnj53oa9aEYUb/oKtl4wjim+8NYeJuxCiOpyia5U65ANgXG Vs74aofMQYOVSd+bPsu0sprHlbcYzglM2bgMcFDpixKT/m/PUFTfcuvZRliU/ZMdBPc9 4OA200jL6f7m57sBvvrMthEbnrmyrbbQLoVdqeJ5hgrofPMHw5NDA6wHjvc1ZY9agqb+ US2/jRDG4Tt3LIUXuuFQ5Ier9AbohgcRDIUnl7QW90EAjjOm7sHAn9TUpm+a87Q0sDyj dyOb6JoeEMRvvNLtzXPaGNcO6Ne38DMqnIr8eMihpnaudgKhq7vEkWM29Q6xEfWamnzf 8v2A== X-Gm-Message-State: AOAM5320M8ECZDRHdrwaGoBYuaLfcq8xHTxzGS9KZaxCVqGl40GAy0qp 4PKgpnRNj3ti3+SsmsaWlVuG8ju4n3U= X-Received: by 2002:a2e:6e18:0:b0:247:e342:3442 with SMTP id j24-20020a2e6e18000000b00247e3423442mr8409669ljc.422.1648217580689; Fri, 25 Mar 2022 07:13:00 -0700 (PDT) Received: from localhost.localdomain (deedock.humlab.lu.se. [130.235.135.183]) by smtp.gmail.com with ESMTPSA id a4-20020a2eb164000000b0024988e1cfb6sm707246ljm.94.2022.03.25.07.12.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 25 Mar 2022 07:13:00 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Fri, 25 Mar 2022 15:10:36 +0100 Message-Id: <20220325141041.1748-18-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20220325141041.1748-1-dcnieho@gmail.com> References: <20220325141041.1748-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v4 17/22] 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: 0hdDAHPWx5ye 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 | 431 ++++++++++++++++++++++++++++++++++++++++-- libavdevice/version.h | 2 +- 2 files changed, 413 insertions(+), 20 deletions(-) diff --git a/libavdevice/dshow.c b/libavdevice/dshow.c index 0d5f731030..25c7f5a0e8 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" @@ -830,11 +831,15 @@ static void dshow_get_default_format(IPin *pin, IAMStreamConfig *config, enum ds * 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; @@ -878,7 +883,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) { // get default dshow_get_default_format(pin, config, devtype, &type); @@ -924,7 +929,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) @@ -960,7 +967,7 @@ dshow_cycle_formats(AVFormatContext *avctx, enum dshowDeviceType devtype, wait_for_better = 0; } - if (!pformat_set) { + if (!pformat_set && !ranges) { const char *chroma = av_chroma_location_name(fmt_info->chroma_loc); if (fmt_info->pix_fmt == AV_PIX_FMT_NONE) { const AVCodec *codec = avcodec_find_decoder(fmt_info->codec_id); @@ -1024,6 +1031,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 { WAVEFORMATEX *fx; AUDIO_STREAM_CONFIG_CAPS *acaps = caps; @@ -1035,7 +1096,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, @@ -1051,15 +1112,69 @@ dshow_cycle_formats(AVFormatContext *avctx, enum dshowDeviceType devtype, ) { goto next; } + + 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) { @@ -1070,6 +1185,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); @@ -1209,10 +1330,13 @@ end: * devtype, retrieve the first output pin and return the pointer to the * object found in *ppin. * If ppin is NULL, cycle through all pins listing audio/video capabilities. + * If ppin is not NULL and ranges is also not null, enumerate all formats + * supported by the selected pin. */ static int dshow_cycle_pins(AVFormatContext *avctx, enum dshowDeviceType devtype, - enum dshowSourceFilterType sourcetype, IBaseFilter *device_filter, IPin **ppin) + enum dshowSourceFilterType sourcetype, IBaseFilter *device_filter, + IPin **ppin, AVOptionRanges *ranges, enum AVDeviceCapabilitiesQueryType query_type) { struct dshow_ctx *ctx = avctx->priv_data; IEnumPins *pins = 0; @@ -1250,6 +1374,7 @@ dshow_cycle_pins(AVFormatContext *avctx, enum dshowDeviceType devtype, wchar_t *pin_id = NULL; char *pin_buf = NULL; char *desired_pin_name = devtype == VideoDevice ? ctx->video_pin_name : ctx->audio_pin_name; + int nb_ranges = ranges ? ranges->nb_ranges : 0; IPin_QueryPinInfo(pin, &info); IBaseFilter_Release(info.pFilter); @@ -1274,7 +1399,7 @@ dshow_cycle_pins(AVFormatContext *avctx, enum dshowDeviceType devtype, if (!ppin) { av_log(avctx, AV_LOG_INFO, " Pin \"%s\" (alternative pin name \"%s\")\n", name_buf, pin_buf); - dshow_cycle_formats(avctx, devtype, pin, NULL); + dshow_cycle_formats(avctx, devtype, pin, NULL, NULL, AV_DEV_CAP_QUERY_NONE); goto next; } @@ -1288,12 +1413,15 @@ dshow_cycle_pins(AVFormatContext *avctx, enum dshowDeviceType devtype, // will either try to find format matching options supplied by user // or try to open default format. Successful if returns with format_set==1 - dshow_cycle_formats(avctx, devtype, pin, &format_set); + // if ranges is non-NULL, will iterate over all formats and return info + // about all the valid ones. If any valid found, format_set==1, else + // format_set will be 0 + dshow_cycle_formats(avctx, devtype, pin, &format_set, ranges, query_type); if (!format_set) { goto next; } - if (devtype == AudioDevice && ctx->audio_buffer_size) { + if (devtype == AudioDevice && ctx->audio_buffer_size && !ranges) { if (dshow_set_audio_buffer_size(avctx, pin) < 0) { av_log(avctx, AV_LOG_ERROR, "unable to set audio buffer size %d to pin, using pin anyway...", ctx->audio_buffer_size); } @@ -1306,8 +1434,25 @@ dshow_cycle_pins(AVFormatContext *avctx, enum dshowDeviceType devtype, next: if (p) IKsPropertySet_Release(p); - if (device_pin != pin) + if (device_pin != pin) { IPin_Release(pin); + // remove any option ranges info we just added, wrong pin + if (ranges && nb_ranges>0) { + int nb_original_entries = nb_ranges * ranges->nb_components; + for (int i = nb_original_entries; i < ranges->nb_ranges * ranges->nb_components; i++) { + AVOptionRange *range = ranges->range[i]; + if (range) { + av_freep(&range->str); + av_freep(&ranges->range[i]); + } + } + if (av_reallocp_array(&ranges->range, nb_original_entries, sizeof(*ranges->range)) < 0) + ranges->nb_ranges = 0; + else + ranges->nb_ranges = nb_ranges; + } + device_pin = NULL; + } av_free(name_buf); av_free(pin_buf); if (pin_id) @@ -1339,10 +1484,12 @@ 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; @@ -1350,7 +1497,7 @@ dshow_list_device_options(AVFormatContext *avctx, ICreateDevEnum *devenum, 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, NULL)) < 0) + if ((r = dshow_cycle_pins(avctx, devtype, sourcetype, device_filter, ranges ? &device_pin : NULL, ranges, query_type)) < 0) return r; return 0; } @@ -1433,7 +1580,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; } @@ -1856,14 +2003,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; } @@ -2010,6 +2157,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[] = { @@ -2059,6 +2449,9 @@ const AVInputFormat ff_dshow_demuxer = { .read_close = dshow_read_close, .get_device_list= dshow_get_device_list, .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, }; diff --git a/libavdevice/version.h b/libavdevice/version.h index 5a62e5ec6f..9a9ccf1b40 100644 --- a/libavdevice/version.h +++ b/libavdevice/version.h @@ -31,7 +31,7 @@ #include "version_major.h" #define LIBAVDEVICE_VERSION_MINOR 2 -#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 Fri Mar 25 14:10:37 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Diederick C. Niehorster" X-Patchwork-Id: 34964 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:ab0:5fda:0:0:0:0:0 with SMTP id g26csp1377109uaj; Fri, 25 Mar 2022 07:14:50 -0700 (PDT) X-Google-Smtp-Source: ABdhPJw88BX0DUWEUFUY7AHc/DYpY/E1W3cfYe5P9wvKBKpz+nT5XI8jsKOkCGRctHHqHaYrKWfb X-Received: by 2002:a05:6402:1941:b0:413:2822:9c8 with SMTP id f1-20020a056402194100b00413282209c8mr13338817edz.13.1648217690529; Fri, 25 Mar 2022 07:14:50 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1648217690; cv=none; d=google.com; s=arc-20160816; b=ZMR5CI3T0UXQB3wcX8oZgvo1pZazvEg6Q6ufI2ROzCZzCQ/+ExkhFGwxInXnVY0dc/ gjn62B9nnaSahAduAC7zh/gFwfxPrKES6LmapIHtnYpwOHbapEoWLey6PXiE/YkBCfjL yflh14X+/irzhkO8i9u0Bd3chBi8afy72jgOSBMY5PKUNXoFflkqss8+FLEwUkwiWnE+ pe+6uxjQDH7AGzvODoEfAHdsruRqakIoN5xwv5FmRh0zUKm9iUuMMnYRDI+eG1KRjSj4 pTAJnPGM03UKHWkjv0hfMZpNqztP3oSeNhJD8YKx/Y3KUaRK9V8e32GenNCWIIy1M3SU q2hQ== 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=MIZXe/thDOwHZv44C0EODTJ+GP/lLSx5JQarcZ5TqcQ=; b=BNwqff5EGaQQpnrALDGjXPXVidAjniXl8Ppg4n3oLWQNlRF/t2A2VrvSPt+6DBrIoB GpYMpqcaJW6YTaBBz+9E9f+9FhhrbvmGCCF6J2Nkwo2lC496nKzaRkxNT5eRfeauDN5A +TekHAheaQ0y9pwpNgy/ZX2xGTU8Cre5bLpzJiBhc5LP9ksXdIq75kLVWEv/y6u8EstZ nHL5N0a0eB91rWQC5Fg5pXIfqOkphM88/z3H7DMyuzDu2uQXZJ40CFXurrtwh1I/EPWF eX50VSx/Cvcufc3HNyyQse8lzkiCgk3NBLirTvNw/XpXYVPH+JrsnA502b7Cf1VtPFtW rBVw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=Y5Cfnfre; 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 d6-20020a1709061f4600b006df76385c95si2453990ejk.309.2022.03.25.07.14.50; Fri, 25 Mar 2022 07:14: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=20210112 header.b=Y5Cfnfre; 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 E336768B2A6; Fri, 25 Mar 2022 16:13:09 +0200 (EET) 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 6782468B2A6 for ; Fri, 25 Mar 2022 16:13:08 +0200 (EET) Received: by mail-lf1-f53.google.com with SMTP id a26so13578242lfg.10 for ; Fri, 25 Mar 2022 07:13:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=DTG7CUILHEeE0pGMjxSBH8HNE15yQvmVQpX9iYaxfIw=; b=Y5CfnfreoKBjDWrtOGMWM34/xtxPNPKt+l2bJKxKsdYljSYPNkQ5qFFfxIOPdYVAMe 2ky9Kjtapeuv0GtRvhrkIi7vGJxNs+XqwZehZnHgHjE4JRmVHSFaA8dJCqBVL+4UOZ+I PARoKFc+EoAMCVLI5OoUhUWZXJr/iOK/xaAEPSCctYxTmWhQh1slv0OMcQHDfdmr8h72 KCVs7MHKwD/r+xDuFNXWIM0YDlYhG+GCJUniUvxs+3TM5j/4cHQEgI08g2Wh6D3ZZXWQ CUyhP7XwZPOyvlHRLs32e2iLNZiMzxgD5K8AkbVQfZEycw83k+r0DgGK2D7TUrh3qL3h Wdig== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=DTG7CUILHEeE0pGMjxSBH8HNE15yQvmVQpX9iYaxfIw=; b=iS1u7Y7pJvpQF4n2kKGZH1brRmvFYaCu0IbDFR/WqCxWeZvq2uGCfz66ECzexrUgJR b0k1vh8NvPouUc5D0qckQ9qvMTwLmn0f/pD2Hjyd+32DPJNshklpbmSurrwmioMiP/Jw 5cfJIqH8pfWWbPCaj3wkrcjCQnKS+TdOJ4Z8BlrXo2QbscO08HuffViUbBhPiQAk42py Ufq6MYZWa//0WDvtkmrpKBCUHwzBO9YGRJhgYuAYNusap9CodgxT/YM22UAk/u5aLYL5 yuyErcD5ykUyXeQVpgihhyZfCG4aE4a+08YotX+bnLNz7cODNylFIc9ct9XleCmxmAbV DHVg== X-Gm-Message-State: AOAM532ApFnX26VBodZ3FpIrZnIgDdh0Z7N6129xOaWsWXA4UglxHDsp caebPJSme1Y0urYg56kjWLM9aqA5n4s= X-Received: by 2002:ac2:5a49:0:b0:448:75c4:548b with SMTP id r9-20020ac25a49000000b0044875c4548bmr8033064lfn.54.1648217587205; Fri, 25 Mar 2022 07:13:07 -0700 (PDT) Received: from localhost.localdomain (deedock.humlab.lu.se. [130.235.135.183]) by smtp.gmail.com with ESMTPSA id f25-20020a193819000000b0044a59b380c0sm719095lfa.68.2022.03.25.07.13.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 25 Mar 2022 07:13:06 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Fri, 25 Mar 2022 15:10:37 +0100 Message-Id: <20220325141041.1748-19-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20220325141041.1748-1-dcnieho@gmail.com> References: <20220325141041.1748-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v4 18/22] 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: mUDMrY1rWNBL Signed-off-by: Diederick Niehorster --- libavdevice/dshow.c | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/libavdevice/dshow.c b/libavdevice/dshow.c index 25c7f5a0e8..c426cef905 100644 --- a/libavdevice/dshow.c +++ b/libavdevice/dshow.c @@ -933,6 +933,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; @@ -1558,7 +1559,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) { @@ -2441,17 +2443,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, - .get_device_list= dshow_get_device_list, - .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 Fri Mar 25 14:10:38 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Diederick C. Niehorster" X-Patchwork-Id: 34979 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:ab0:5fda:0:0:0:0:0 with SMTP id g26csp1377148uaj; Fri, 25 Mar 2022 07:15:02 -0700 (PDT) X-Google-Smtp-Source: ABdhPJy9T45HWexcyAKW2iKK5I1n3TAbAzVCASWIh1t3CAGKaLvC7lQFw6eIGTK5GXHGTNC8IEo4 X-Received: by 2002:a05:6402:454:b0:416:2db7:685b with SMTP id p20-20020a056402045400b004162db7685bmr13439891edw.43.1648217702258; Fri, 25 Mar 2022 07:15:02 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1648217702; cv=none; d=google.com; s=arc-20160816; b=IrN3AC4wISKYmVUX/QzVu0KOVx+oYxKR2D45T8ciHmq/9+DwNR7Zmvly007uGE2o3y 2zNfUO6HBmMxSFYDT287GuYeZpWKS31nUAH8fbvka47mNq+l/O1ylLCYzn1OhKxXR53r 5OzgYMYZp4yk3tEkIaLgijLcuU1h36+lh9c3nHGYjZ5mpbNwr2YrMWQmXCGngH8Ee699 pMJYwNS8EEJ9cFMphWyMwClXnWqR/FwJgQLx03LUHh2L753PZbrZWZjvWld3j6/7s9fa cestT7Kc4Aenaf9Tc68VUWuobOPrhjh383VDybw19d9ulXgI6Y61W2XCJmnitELumfVM ppfw== 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=QNKr3ad6Vr2YPY5WLtKgho+nMm/e+u3T+WtTpcAav0o=; b=qdS+7DIn4usTJ9dPcq/WTRsOE7zZFC3ym4+mY5pP2BloLpnUOrbWjdJe3odU1IIbsz C9G30pc86EeVedCP6yZINuANUndL69a0rYe8GmwGLVEhJkC3ZN/iSboNOnjanrssXBTo AZIr8cFg0IXr+U2PYUZwWiX2SeubeUTyuUhCwF9nxhqStCZWvU4+RuU+VMBIPUKKCsZ6 DJtxs3Mf07c9n9gdn5CQ5UUpxyMgJorHs37O1L64RRBG4/ZeV20EEGGoHwO7W6AaOfIe F04R0MR/m7TqP45ztXXSlB6Me8UI4r+IcgIItKw9WjS7Y0dGWLyChopAgriF4Z2OPXb9 3dVQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=h8olXqq3; 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 g16-20020a1709061e1000b006df76385f13si2648099ejj.947.2022.03.25.07.15.01; Fri, 25 Mar 2022 07:15:02 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=h8olXqq3; 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 D71A0680074; Fri, 25 Mar 2022 16:13:16 +0200 (EET) 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 2CAAE680074 for ; Fri, 25 Mar 2022 16:13:15 +0200 (EET) Received: by mail-lf1-f51.google.com with SMTP id p10so7747316lfa.12 for ; Fri, 25 Mar 2022 07:13:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=7k/XGJ22OYVL8WSwvqmnNwFWf9jjK02W9jsCwc14GBA=; b=h8olXqq3bG24lZWbWnQal8zstTisxGZAlURIqGaORmDJiyp/YMNlVCHU1KxddAD54F y6wkQ/C8fAOllIc0NB/yOblt0pRyO/1vAeDnbM+LCVGyqjaArM8SxQlEnFo+aKDRZ5u3 mSum7ywK8y2qnQRbPQuR7I22KdCiIaIUsqJO00bD3HQdf+7gKP0i5M+PmnU1WYH9yB0C W6pV1XXwwLiNv/llB5m2Qw63sguP1p3Um59ZhQI7kJ89KxHI5OUkcPIRXcc/B4/msUDb /jp70ifc44ZX6Te/vw/iQWUMK3rRikLNKBjgtEYqqpUxTeTX3K+tMNNBg2Oekn64NAPT KYNg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=7k/XGJ22OYVL8WSwvqmnNwFWf9jjK02W9jsCwc14GBA=; b=NvbIHB19eQBD2sRm48qG0whF9RBjG67yG8MUuzMWzp2TWPZ3C0cSMJq3DGZOyhJdOP dA2sCrBDND/DnEV+MP2S9Dq8oTY8lgeoHSnT9x1yiyZhUJGA28CSOB1huja0snMSLM3x zoqRiWB4auKHYwXbpW6yfDz7gYsHLPd6+NXjWb64LuTexHJrGJbUE77KyEN2NLBUBlQp H2gux/vkdByzy3FrTJMtT5zObKsuBDB/u2Qvwg3BwEeno06PCwdeRWF050ssi9UbD0fa Okplp/f9l1154/+oym11P9YauWLoGJY1MN5BsTXVUkaC1xLu2GZkZvlXvPihKxsIu5Cv fdBw== X-Gm-Message-State: AOAM531OdOQb14kFmF/Lh9ufoEVtXhyn+mrmjPCTwU2woddPJYSl8aJn YalOVpLv4If53eEyGBS5H2tnKaBGe+8= X-Received: by 2002:a05:6512:3b92:b0:448:1bf4:1cbd with SMTP id g18-20020a0565123b9200b004481bf41cbdmr8059927lfv.494.1648217594189; Fri, 25 Mar 2022 07:13:14 -0700 (PDT) Received: from localhost.localdomain (deedock.humlab.lu.se. [130.235.135.183]) by smtp.gmail.com with ESMTPSA id v25-20020a2e4819000000b00245f3318b8csm696305lja.31.2022.03.25.07.13.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 25 Mar 2022 07:13:13 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Fri, 25 Mar 2022 15:10:38 +0100 Message-Id: <20220325141041.1748-20-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20220325141041.1748-1-dcnieho@gmail.com> References: <20220325141041.1748-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v4 19/22] 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: 4i8ex8bLEfZK 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 Bump libavformat version. Signed-off-by: Diederick Niehorster --- libavformat/avformat.h | 29 +++++++++++++++-- libavformat/demux.c | 74 ++++++++++++++++++++++++++++++++++++++---- libavformat/version.h | 2 +- 3 files changed, 95 insertions(+), 10 deletions(-) diff --git a/libavformat/avformat.h b/libavformat/avformat.h index 027a914e13..004d81640f 100644 --- a/libavformat/avformat.h +++ b/libavformat/avformat.h @@ -2024,6 +2024,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. @@ -2119,9 +2139,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. @@ -2129,6 +2149,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/demux.c b/libavformat/demux.c index c1c9422ac0..b314477e47 100644 --- a/libavformat/demux.c +++ b/libavformat/demux.c @@ -217,6 +217,56 @@ FF_ENABLE_DEPRECATION_WARNINGS return 0; } + +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) { @@ -233,8 +283,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); @@ -245,7 +301,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; } @@ -288,12 +346,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); diff --git a/libavformat/version.h b/libavformat/version.h index 1ab39022c2..7cd09f7ef8 100644 --- a/libavformat/version.h +++ b/libavformat/version.h @@ -32,7 +32,7 @@ #include "version_major.h" -#define LIBAVFORMAT_VERSION_MINOR 23 +#define LIBAVFORMAT_VERSION_MINOR 24 #define LIBAVFORMAT_VERSION_MICRO 100 #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ From patchwork Fri Mar 25 14:10:39 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Diederick C. Niehorster" X-Patchwork-Id: 34980 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:ab0:5fda:0:0:0:0:0 with SMTP id g26csp1377191uaj; Fri, 25 Mar 2022 07:15:13 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxKFr3x+sC1uUHJaM6si0Vmxkk/JggB8y3fgybi8+v1hiPkNlo05S+4IvULaORIg5f+acZv X-Received: by 2002:a17:907:7fa5:b0:6e0:a25a:af6e with SMTP id qk37-20020a1709077fa500b006e0a25aaf6emr3500979ejc.359.1648217713693; Fri, 25 Mar 2022 07:15:13 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1648217713; cv=none; d=google.com; s=arc-20160816; b=Y+IgPEdXKODLjv0wIgLKBn56dGAAbbKU40U4vziB40be2pPxmA1x6q03weEkIcP9PR xYUFPyX2Bsh7QgSKSfL/DoC9ZMao+xwxP3d/L3yATG9Lpg5YIH1TQmgRN1Ocvw9/m+j2 VDM1ouL/ZSM16L0yBSJ6LIiQQp2FY0Gjhywr4m4KjNB2IV2Ev0bLEzH+Lfp2eqtypQlS UXNNogAPG3jnZzCyyReEIBpYpph63TWGptn6Zxlrjyj2U/SBg06RXD2mf0Er96ykBsIV ylh6UbTTG8NklqScByE6wlQkp9Gh9IRl+fKq5UGict0Gt1cLdtyrLjBYD3dEt7w2nMe1 fBkg== 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=fSgP8gZCJoH6q5OwWfRjSs+0fKjpxSmBWHJVPD+zXFo=; b=CdGSvXY8uymPAJ4Tns9bUMl+oaolfMx0Wpg0DHyW3feYtSpYT5DkLYI28Atma5X8Nz 8JfdH8uJKepJvgOFwp1sfrMEgRvTXeciFFsRTjwf7ABLCnphxdZ7o5Md5kVlSLPr6Epi Dj2GhHEDlLnZV08MwPcqOM3qBQJwP8ziBZL4Q/EdKvNq6vHEoj+aZiEBs9zerOjmYQXg ntqJMjey4XYogAvnky2+OxtuWL9z+5CHWIGGcwCnYG7gv4PvoKDNv/i7adlrf36P7p3r nXXD31buTI0zeHIIjSDrsAyKhzpbEnuSOAvjVvn8tN+Y8x6iWBwVQQFT5/CkTDPKIFfT fjQA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=pb9NgFRO; 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 qc27-20020a170906d8bb00b006df76385e3dsi2576899ejb.733.2022.03.25.07.15.13; Fri, 25 Mar 2022 07:15:13 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=pb9NgFRO; 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 E4FE268B264; Fri, 25 Mar 2022 16:13:27 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lj1-f180.google.com (mail-lj1-f180.google.com [209.85.208.180]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 7281468B245 for ; Fri, 25 Mar 2022 16:13:21 +0200 (EET) Received: by mail-lj1-f180.google.com with SMTP id g24so10473863lja.7 for ; Fri, 25 Mar 2022 07:13:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=NpUXTiee/6DLhbsDl+OQGi4IbeHNBO3np6mXlT0W4pE=; b=pb9NgFRO+OatKpyfefkbJ/bymYqNogdFrbuJ41HCFh3Qm7+9wOPdoVNqLoarI/0ZzU 1A60oE3njrfZEKmb2dmuxbqeAcIU7JoCxGKNCBkbTTPzRP4OKUzc3EI/qoKyWjpJNR3u KdbgD/7kvHpE1z3xe1Oj+4DeY0D8Z0d6lmGSx5XzO+VzKqdjfGjhY955i2FHsVo5XCoq mHxJ0yR5yavObYaBxaSpyagoye2aGjxZRBigPrA9r8iACXjVp0ztC4cVZolYWJEJKRt7 VY1IvetfEmw6+daGdLSvMBp3Ow4EupeFjzaQ7Uhztbs6PHx+F1mIZ4v5XIX5Cel8O9Ek tLAQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=NpUXTiee/6DLhbsDl+OQGi4IbeHNBO3np6mXlT0W4pE=; b=u2rED3hZKKZvONWRerrNwWFG9b86Nx2nF3ujGX0EGz3TEjDKFDzQuylFkE0a7Bl6eF MIaXcDY5OaVxUUsyxja21cG9RucLCKliqDC6FeyvHSpgO3nAm6zCnA6RQgoOhL4lLI9r mnEvkBn/tOzi0du4YVDpC4e0XlZCbIC7uwJWtXIGfJtuUTAH0NrEfEiVe6QUh9i3MZdN ATAcz8z3YeTUEBgnUXg78N67h3V3yZSoQ9lTV+Zd/WwFncu6jl8MPy8idwW0C+TIa81Q J3m71z+YbOVPQgCy+h8nMA4fJY4BOIXz22sZ8BBMApWe03jRi/G9f74f/LLQQDIROzVZ ROCA== X-Gm-Message-State: AOAM533I4vgJVrJ7Zu6utuolu6ohksha1Jycisd7F+2ZtCxlvvJi2E78 Vxcy7hkbFOYjlAdUsqGqd+k6umBQb4k= X-Received: by 2002:a05:651c:11ca:b0:247:f32e:10ba with SMTP id z10-20020a05651c11ca00b00247f32e10bamr8563229ljo.208.1648217600569; Fri, 25 Mar 2022 07:13:20 -0700 (PDT) Received: from localhost.localdomain (deedock.humlab.lu.se. [130.235.135.183]) by smtp.gmail.com with ESMTPSA id f38-20020a0565123b2600b0044a75d9de78sm178669lfv.163.2022.03.25.07.13.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 25 Mar 2022 07:13:20 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Fri, 25 Mar 2022 15:10:39 +0100 Message-Id: <20220325141041.1748-21-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20220325141041.1748-1-dcnieho@gmail.com> References: <20220325141041.1748-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v4 20/22] 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: MxUJG+/Tzxq2 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 a7953ffc16..5c361f91a0 100755 --- a/configure +++ b/configure @@ -1726,6 +1726,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 @@ -3751,6 +3752,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 5f9dfccc34..c29d8940a5 100644 --- a/libavdevice/avdevice.h +++ b/libavdevice/avdevice.h @@ -384,38 +384,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 Fri Mar 25 14:10:40 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Diederick C. Niehorster" X-Patchwork-Id: 34981 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:ab0:5fda:0:0:0:0:0 with SMTP id g26csp1377228uaj; Fri, 25 Mar 2022 07:15:25 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzTqKRjmLg2fss0n5a7CN8Z79Waj51oyxUEEoFc0SW/BVScBLl7wrxVPj2SxFQJMfAP3Sky X-Received: by 2002:a17:907:7254:b0:6db:ad8f:27b4 with SMTP id ds20-20020a170907725400b006dbad8f27b4mr11635455ejc.599.1648217725268; Fri, 25 Mar 2022 07:15:25 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1648217725; cv=none; d=google.com; s=arc-20160816; b=K2S68W18d97VlHIiT85nt5/z+dpN6rDJvl8IBRAH4O9KwyT1FTJVlAVjdsNFCg6kh1 NIIU3ILaUy7L6PM0KYMVI3SySrCikpKqD31VHYbyIiNYx2kO640LpZh3xj60e9Fq0lN1 0nIl9PISWh5LM9cv7triYYVDD6QmNhT6a5P5Q9G/GL6zz2YWQrbg4k2hpXoei3+ILnHz Zj+rBum2sq+yD+Vbu/5GGfbXa6y3MbVrdzW5U8r9AgQ910P68CufwJIGrfZkg9iuZ1Ay 4Oj7jjEr+GzTT5wCAeiXh+zHca3NqkFHu8AxC64Uu/anMJ0GFKodPdcl/YU+8qGk+IMO uhNg== 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=OHIqTcJ/CJUJoNKNtcCiSsBr3JshYA5+6nMk5aEDFdIDDxrzevyXflWpqv1Ghmu35r pGEr/AxzQk48L7KZKwR8ykvNmd97+eSua5VgEEXwH0hrKkjw8yZq8WXnkWAWmZGNH2bY DNkXRyawR27kwhBPV0aDVpSho3H8wPfOZRYPm4+G2iv/lbU3fZQVXeJhvYSe2VUD86qp 2E3kSFxklyVOXQi2ioMgkGUDFgXP0Xz6buOQBR/miAKBtN37TFRVOiatXtRQw60VVyLZ Q7tOSjewJBCE+/mqOU7ejdYN2cs5SCtK5FTLS5uI5IvaK/Xru4lnZm2eSz1jwP+Zewse msEw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=lIWquMMw; 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 eg56-20020a05640228b800b00418ec95d6e7si2551375edb.342.2022.03.25.07.15.24; Fri, 25 Mar 2022 07:15:25 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=lIWquMMw; 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 F004B68B2C8; Fri, 25 Mar 2022 16:13:29 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lj1-f172.google.com (mail-lj1-f172.google.com [209.85.208.172]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 9286B68B2BF for ; Fri, 25 Mar 2022 16:13:28 +0200 (EET) Received: by mail-lj1-f172.google.com with SMTP id bn33so10494500ljb.6 for ; Fri, 25 Mar 2022 07:13:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=qRgAhwEaIAPRZtmx9B1/sp/bKAQK+XSNSi8QFTYYZ28=; b=lIWquMMwLln0PLP9HJE20LWX2gosvaxZaJrRb+tPsPXXTzN/rbqwDBVcTNSQgknUck kBWFhxoJFH2T62qJd6Udk4OAliafHIxW/VcVPKEtUHQwN10AQ7qFAplFaiU8aAI+QW4V X3C7FhhWn5dinKIKWnCCrmd7TKmJC+w6PBZENvLs02YMuull2VndWjhGNQOZaJYz6uQL XyCdabjk8A/oYUefrdMoBzpeIfVRh6xGTiBCVbI0htSTz+spA1LqMvvc1MeIUGQzpQli p6TXCi7P3De2yrpsKF203SgVeStm9k6oAtdhL5/IpEUR+z0BaabOWuzkQG/LHlT+h4sS D2rA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; 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=D4FwxiGoeZjdWof5OG8j7DgFNL9IOw1uhYnr3SlPf1RzFidg0+UN5Ac6PWhjOsvsrY pxEgPqVdOyD3tMCQ8laLXwEAobZD+hGIiG1D2m2nxY71HsDw4prGF9j/eZ4kvYJNbTJx +5UriX435rjutu/TyPsZc8VkXu19lTEEubeeKBU+x08iAviU7osbQrjTbsnmncrTB5K4 tJOfb0W9vkjwk/oRyV7wBTiPUrr0YBxoYNkFMrqyNIHGsw8xWjCLDs7qbgNzgseU/sCi A7ohIkNzwH6ZuoBWVnJykQI2bhz1ccktk0PMH2xIWPRyo1x0xYeqdqlo4SntXp5nPjb5 /iIA== X-Gm-Message-State: AOAM530JBBPoGLa7kDLbFWtEgpsHx2HND5kwMOLZqhYYcgtvBJuxjyXA epQSoI/AykBNHTeBT6kL/SkJHUsj7e4= X-Received: by 2002:a2e:8496:0:b0:249:7dbc:d81b with SMTP id b22-20020a2e8496000000b002497dbcd81bmr8314655ljh.332.1648217606928; Fri, 25 Mar 2022 07:13:26 -0700 (PDT) Received: from localhost.localdomain (deedock.humlab.lu.se. [130.235.135.183]) by smtp.gmail.com with ESMTPSA id o25-20020ac24359000000b004441f889879sm719524lfl.216.2022.03.25.07.13.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 25 Mar 2022 07:13:26 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Fri, 25 Mar 2022 15:10:40 +0100 Message-Id: <20220325141041.1748-22-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20220325141041.1748-1-dcnieho@gmail.com> References: <20220325141041.1748-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v4 21/22] 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: X6ozQq7a/Moe 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 Fri Mar 25 14:10:41 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Diederick C. Niehorster" X-Patchwork-Id: 34982 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:ab0:5fda:0:0:0:0:0 with SMTP id g26csp1377270uaj; Fri, 25 Mar 2022 07:15:36 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxT7BnN/x3+vRUZNTZuS7ocieuw7trnJx5SRfgMryMpQ2H+fq0jnJI12BWIVGhGhpI2QCkX X-Received: by 2002:aa7:c157:0:b0:418:f8e3:4c87 with SMTP id r23-20020aa7c157000000b00418f8e34c87mr13272768edp.271.1648217736372; Fri, 25 Mar 2022 07:15:36 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1648217736; cv=none; d=google.com; s=arc-20160816; b=fowTjUEX8YdwojhVA79sQtNvhTh8Xlf10a49pma+RO9VBjI/89mioP4AiyGoFQw0gz OXEs0juTu6uun3XwLLSTlguZWGTQFUk4cXo9hfICMVRbcvhPmmCqfvcyOrGrG7c2OmF6 xBG8vkGkR2HHkGLiY6Lli8MmfUNLImgna6qT9CqXdEeAz4y5sbzZG0zkPoFiFnzNe/qm sZOH0Og52h8yFVo+0AFIz9+frI0BYqsfLiRI0RgpaXZDwuFKk/Dfzsphjh+EQ9GnpAkt oXfaloSo741OAGdnNNe6kZDSQXAIVKhUFSAav9DNuLMOxqOwjFTUMN72g6M1UtoaInxM NxtQ== 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=UHsKqZKvvXc+DDJ9zh3sAvU8KVDphNXE1XA7sWfle6E=; b=xhIjaUlCH9YDkIJPSY+gZh3+50Tgvv+0dSDAoWN3U6+27u8rr7ojSoElf5WYGisltW P1RGvAUIPj3WV2NYl4WDJrBvHRhJ2SGoxxQaBz5BS9O0o7MZLyOBujYnVF3HfbE1W0Q8 uc3KKGQanR7ujsDQqWMJHiKjQP9n0OxnxG72uuXnDwh8RXg760eAaUEUyexwIDiuwjDN UVXh7uNyXHpMuI+USQtVwxX1wgp5Msg5s/3OtYFSnCnL56LCT84WA8BTari2j/QuKWF+ 1/0sPsPYWyhctS6ZYaWbQhI2b7CXSJnw5gYv3MJTey4SZCzekr383owu2MVNdhgiduvd 3Xow== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=bwq8w2hu; 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 b13-20020aa7d48d000000b00418c2b5bd80si2862355edr.98.2022.03.25.07.15.36; Fri, 25 Mar 2022 07:15: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=20210112 header.b=bwq8w2hu; 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 EED3568B2CE; Fri, 25 Mar 2022 16:13:35 +0200 (EET) 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 984F368B2C6 for ; Fri, 25 Mar 2022 16:13:34 +0200 (EET) Received: by mail-lj1-f175.google.com with SMTP id g24so10474697lja.7 for ; Fri, 25 Mar 2022 07:13:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=MoX3WE6sSUEUEPxyFw4Zpli4hgB9ZCym87zfR3vTSy0=; b=bwq8w2hu3rlS8AqCUhdQ45E7Vndw1fnDbKmfYXcPZp0PCxOTdC0WK78dQ+1Dwb+eBU yGskiGf8mGUlAjnOdc/rhltnz9AyfKaYwG7l521B0XgKmHM4pF1NJRyMapM3WZdaRpgu kZIr89c+Go1O0Wqkk2BXYmbXb3JBu3TfbfBxBzDfTG6/YXa8cvGdAuStpI7e4idWsEtf 5QuBzO4bXGJuC0JS4GHJFVd8rJDyUIUyh8p3UopBu4mKZXqSUxSW8EA2nWMP/q6c6hhX NWH7RtUnL8xY9732kAyAP6b1KQBj4H7YMnOzSfaLi2BFwlhdMzo7NWiJM49iU9031COx yosg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=MoX3WE6sSUEUEPxyFw4Zpli4hgB9ZCym87zfR3vTSy0=; b=2AWcZ8ckQMoe8Wivdqvngi34fMBU16FDEVNmYlGY6HvhaI5nzOARryh7qfraGcrX3C RXEI7x55BPRb5ewdDh+QmRhSZEvljnp6Yi431CoHWvme+oTVGoIma54eTfTGjfBXCY3U qNzEG5xF6mwY+PugqScx4X7uqbBZ4/TPKckP8sqolelnLNxsl0CGcLV/98/wnKAFmkzX SxAQE8vZNhdwpqCPgNzXxc70fMdBahenlaTBZcIrXsAqxrXC4KKx5rfahdJxz5BJ1eDm fnMkHTfRkchIGJBGn2T5Tten4xItudfGdW/bGJU8dRCn4u5/kYwKNTM0JRSipBh7T4hQ qv5w== X-Gm-Message-State: AOAM532dXylOcrlOquKCWiJPRAK1EtdCx8lLMmW16c7LDyr8SPqpzNde qsCjzBt8qXCtjOWcB+bJ9x6qjY3my5A= X-Received: by 2002:a2e:9847:0:b0:238:eca:62fd with SMTP id e7-20020a2e9847000000b002380eca62fdmr8310519ljj.65.1648217613284; Fri, 25 Mar 2022 07:13:33 -0700 (PDT) Received: from localhost.localdomain (deedock.humlab.lu.se. [130.235.135.183]) by smtp.gmail.com with ESMTPSA id x40-20020a056512132800b004489691436esm720853lfu.146.2022.03.25.07.13.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 25 Mar 2022 07:13:32 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Fri, 25 Mar 2022 15:10:41 +0100 Message-Id: <20220325141041.1748-23-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20220325141041.1748-1-dcnieho@gmail.com> References: <20220325141041.1748-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v4 22/22] 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: CROaS9ZhS22F 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 c426cef905..216c888bed 100644 --- a/libavdevice/dshow.c +++ b/libavdevice/dshow.c @@ -849,7 +849,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 @@ -875,6 +875,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: @@ -1153,7 +1156,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. @@ -1494,12 +1497,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; } @@ -2319,7 +2329,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, @@ -2337,49 +2348,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; + } } } @@ -2395,9 +2408,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 94ba9896b7..a2c107b19c 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; }; /*****************************************************************************