From patchwork Fri Jun 11 20:30:43 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Diederick C. Niehorster" X-Patchwork-Id: 28224 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a5e:c91a:0:0:0:0:0 with SMTP id z26csp764168iol; Fri, 11 Jun 2021 13:35:15 -0700 (PDT) X-Google-Smtp-Source: ABdhPJx9OAa9w2OQsJtq+xVLJgWmU6fonEWgffSB2W4l45EugBzk+ds4HyVpHL6LHgyhl2h75/g5 X-Received: by 2002:a17:906:f849:: with SMTP id ks9mr5016519ejb.402.1623443714850; Fri, 11 Jun 2021 13:35:14 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1623443714; cv=none; d=google.com; s=arc-20160816; b=OzAs+sRx2/Qg7OOAMmY/N6Fq9a/9zXDijtYhuTV+bTgD3RewCThlnozE9XodHrGZa0 hS0rychZK8EFzLlQ1WscHP76+7fBqMeX5UFTkl/H63piwb+xlWHmPOXyDJgBCN7ybUdU 8PMr+act0Rj1HKjJ0nFkEZYaBk1Sd4jDqAkn3jLn4CMKo0H99uIwBY3uc2weuvRCAp+Z tyE3bKzR7xAzA20de2K+u5lMHGSWlFdedHuJEgOjSBgRlSHjtBlEKPXyZtPx+Gzsnrmr v3wJQk1eySimQLdD+R6ZL2cu7jAyZc/ZTZlbTvpT+0dPu0w8dEVg6STE5gSXsHUkIikK FkWg== 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=zp7QA6B+4ZZuAbtARPFtbfOpL69b8RtnQdtvRqQv5+E=; b=PMb6PxPGCB6LWqXanaKu5BbjHQnh/PBpU8G0Q0qXbKCWj+NBPFADTTILJptSyG7frA tAlFCx3M5R1Wj2nNv3glAKO385hLhLDCMMXk8TGfiDWkmTZ7jfexhzzSDo6AdKFT/+ry jaaeyf+81cg9NFcau30Sa3BrmOy5eiea4A0ztlNW03GJGZBpZYXdYlg/FIOEb7OqMU4X BPyRNnez+aaSiEYxdL2n9Dk9pHsemJWqqCDwp+iVbf/YiPS6fOMKqTZQsxMgp7fk7DML bPjMSi3pdWaNM9mC6hbBWGte2O1DlnkZXMRa3vSl4PAD+kT+1fJERyuTp70kY0PoGoBJ Tj8A== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=OCR00puM; 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 k9si5966903edx.45.2021.06.11.13.35.06; Fri, 11 Jun 2021 13:35:14 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=OCR00puM; 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 4EF8B689247; Fri, 11 Jun 2021 23:35:04 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lj1-f176.google.com (mail-lj1-f176.google.com [209.85.208.176]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 430CB6880FC for ; Fri, 11 Jun 2021 23:35:02 +0300 (EEST) Received: by mail-lj1-f176.google.com with SMTP id n17so11324008ljg.2 for ; Fri, 11 Jun 2021 13:35:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=O2S1HiLuI+qoKwalxeviirb50hmX4gtDZ2Hsn1yydlY=; b=OCR00puM6Byxxa2q9s+AWx7MnW6LT1LMhI3BKru3WeEciFlKZaDmEaJxZglgLMUZGA TeNgP17JjA2eS/wrsP82y+Shp6qvmRuxEJZRshmYHAZRLMOZlpLnagIjHcQnKhmcNh/J 2uV4tILknXUplJfgn0lqkN0oZyUd8whHNQ8XWLO6dHkVNBNjzD2HvdINnWPkDeHmNaLn dj9o+uLKhC85YRgU3bEpZTm/2eY648JBCK7IvcSOYzqjWZG5UhbW8RjWfZk4yZ5q2EIK qCfFr03rQgoH3WOw/lr4Ah6tLNP8oUEAHVdNzJAw5PR5WRxFDjG9b63jHPUrOyCuwmTO b47g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=O2S1HiLuI+qoKwalxeviirb50hmX4gtDZ2Hsn1yydlY=; b=gRLRdy5bDF6C+x3jXVEN+IIsFmxlGHxvXFIQv1Xxh/eV9BBu2ULdKYL0Aj+Ybe+tZi lzCI+4ViXkenyKvK8keXiUE89UDGqGPAt6GwF3v0Mr/VB8xXR9V2LcLRetZJSfJq/U5q Pu20peJTN4kAmoyh+t/rUeZITg/WYHsCq3CyHHQxrSQrH9xWuB3BLjckFw3JneOqYE7E qI98Kxo9rzVOPK4n+GetbWFykp7rEZZAnKPr2opFDwRogo0JgaoMo9r1wtbmR9F5A9Cm 6Wgr1njm0Dz2TnfGplaVrCV6i1rnghakWp6SbDS7+Vt4At68HzRHAjbpWcDgz3ESgvqz xOyw== X-Gm-Message-State: AOAM532DeQr/yoi+dhHPX8QcFqd7MQJP7l2ea4odDBm3LL04Vt+ySUP7 i22RByCD5zUIHa6SWPjBP9O/gHgwB7TSpA== X-Received: by 2002:a2e:a4c2:: with SMTP id p2mr4398843ljm.365.1623443701364; Fri, 11 Jun 2021 13:35:01 -0700 (PDT) Received: from localhost.localdomain ([196.196.203.214]) by smtp.gmail.com with ESMTPSA id u8sm685993lft.223.2021.06.11.13.35.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 11 Jun 2021 13:35:00 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Fri, 11 Jun 2021 22:30:43 +0200 Message-Id: <20210611203104.1692-13-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20210611203104.1692-1-dcnieho@gmail.com> References: <20210611203104.1692-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2 12/33] 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: rIMeBVNbAyX6 This allows programmatic users of avdevice to start and stop the DirectShow Capture graph (i.e. receive frames or not). This is important because now the buffer fills up and starts dropping samples when enqueued packets are not read out immediately after the demuxer is opened. Signed-off-by: Diederick Niehorster --- libavdevice/dshow.c | 42 +++++++++++++++++++++++++++++++++++++ libavdevice/dshow_capture.h | 1 + 2 files changed, 43 insertions(+) diff --git a/libavdevice/dshow.c b/libavdevice/dshow.c index 3e41f4f99f..9f041e90f8 100644 --- a/libavdevice/dshow.c +++ b/libavdevice/dshow.c @@ -1079,6 +1079,45 @@ error: return ret; } +static int dshow_control_message(AVFormatContext *avctx, int type, void *data, size_t data_size) +{ + struct dshow_ctx *ctx = avctx->priv_data; + int run_state = ctx->is_running; + HRESULT hr; + + switch (type) { + case AV_APP_TO_DEV_PAUSE: + run_state = 0; + break; + case AV_APP_TO_DEV_PLAY: + run_state = 1; + break; + case AV_APP_TO_DEV_TOGGLE_PAUSE: + run_state = !run_state; + break; + } + + // if play state change requested, apply + if (run_state != ctx->is_running) { + if (run_state) + hr = IMediaControl_Run(ctx->control); + else + hr = IMediaControl_Pause(ctx->control); + + if (hr == S_FALSE) { + OAFilterState pfs; + hr = IMediaControl_GetState(ctx->control, 0, &pfs); + } + if (hr != S_OK) { + av_log(avctx, AV_LOG_ERROR, "Could not run/pause graph\n"); + return AVERROR(EIO); + } + ctx->is_running = run_state; + } + + return 0; +} + static enum AVCodecID waveform_codec_id(enum AVSampleFormat sample_fmt) { switch (sample_fmt) { @@ -1317,6 +1356,7 @@ static int dshow_read_header(AVFormatContext *avctx) } } } + ctx->is_running = 0; if (ctx->device_name[VideoDevice]) { if ((r = dshow_open_device(avctx, devenum, VideoDevice, VideoSourceDevice)) < 0 || (r = dshow_add_device(avctx, VideoDevice)) < 0) { @@ -1390,6 +1430,7 @@ static int dshow_read_header(AVFormatContext *avctx) av_log(avctx, AV_LOG_ERROR, "Could not run graph (sometimes caused by a device already in use by other application)\n"); goto error; } + ctx->is_running = 1; ret = 0; @@ -1502,6 +1543,7 @@ const AVInputFormat ff_dshow_demuxer = { .read_packet = dshow_read_packet, .read_close = dshow_read_close, .get_device_list= dshow_get_device_list, + .control_message = dshow_control_message, .flags = AVFMT_NOFILE | AVFMT_NOBINSEARCH | AVFMT_NOGENSEARCH | AVFMT_NO_BYTE_SEEK, .priv_class = &dshow_class, }; diff --git a/libavdevice/dshow_capture.h b/libavdevice/dshow_capture.h index 5a2691518c..bb0f76a8f2 100644 --- a/libavdevice/dshow_capture.h +++ b/libavdevice/dshow_capture.h @@ -331,6 +331,7 @@ struct dshow_ctx { IMediaControl *control; IMediaEvent *media_event; + int is_running; enum AVPixelFormat pixel_format; enum AVCodecID video_codec_id;