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, \