From patchwork Tue Jul 6 09:19:58 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Diederick C. Niehorster" X-Patchwork-Id: 28799 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a5d:965a:0:0:0:0:0 with SMTP id d26csp4920573ios; Tue, 6 Jul 2021 02:23:21 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyjqhuqs+u2Y+Afgnlvmp+sm0QdU6D6KIUe6MRqTCrKY95oJE5gI8tlOjVxxXNMACZBEl0n X-Received: by 2002:aa7:d283:: with SMTP id w3mr5856746edq.153.1625563400864; Tue, 06 Jul 2021 02:23:20 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1625563400; cv=none; d=google.com; s=arc-20160816; b=WOEE6Wj34iGeU//sAFG3BH+KvJyfxs6XqRBWYTKUzLWdZznAwmN4wOMkA90z348jxE pSyMsEjL51gGnIKbX3CRf6tuzI6djy9E5jApw89N1MroydYz9iI/N1Nzr5BZe1Zr2Mqg 3j8YKCUWVsdG9Ctaxy6tZpJyGeHtI2KSD+V+ReMLF2RLtE+aF4XIqxD8T1VSyH/uMJqH 8wm8gBDIp/bw4rUSWYZUebcrs3P3p+snfHL2u40Ups22k8IO+zPnSFRU7d99pG16hABq QOrl1xAlXMdhftUODhfsbRL0R6WLYuaKbX9JcL6dJrDwBmNv/LmA1QDBpsrlwsboRNes 61KA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to :message-id:date:to:from:dkim-signature:delivered-to; bh=FySGTxMkP21Tjlhqv2NelVxQTqXGSULmoR1p3AHIU8g=; b=UQ8c4zwozY/GU+70BsDyMrat/0ZJe4blo2jqTZ42aek3eev1PYlFmLti/KiYOIlp88 e2Xg+2NUReXMJOLB8PSvFUyT8BkVfBwgwKZ+LOceB6Q9WltWoMv2lzmAzzYZU1O65n8L sSAbjVERAiyR5RgxHoeurFDb4/oFy/PqwmjFwvd1Tz1hQFW/fD0ZvJsz5NTRQiJvcYYA 6fVagAKlN3ACZ3g849xcB+SjgZ4MVhzN+wLIFkSZCqvV+r4B7kPnSpMOP84NuCDSaEtZ /kKPpUljyLvw9ISH2W2MT4GdnxwmiIYrREdgyz86Gej4izGK4vSAZKPl5BRMsldKYe+0 WCxQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=KUNECxq0; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id d8si11376617edv.174.2021.07.06.02.23.20; Tue, 06 Jul 2021 02:23:20 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=KUNECxq0; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 7CE7368A77A; Tue, 6 Jul 2021 12:23:14 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lf1-f45.google.com (mail-lf1-f45.google.com [209.85.167.45]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 4814F6801D3 for ; Tue, 6 Jul 2021 12:23:13 +0300 (EEST) Received: by mail-lf1-f45.google.com with SMTP id f30so37189760lfj.1 for ; Tue, 06 Jul 2021 02:23:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=pBGbXpOrCB//XrgoYQHEzqRxwEnSAa2Q6fgsNfUlWv8=; b=KUNECxq0uBy4giLs839/P65a3U5+Zl7OPEmizKMQfUcuO674qYFtUxy0az2Ec/iZC4 UN+BKLahHCi+hSmig0wevTtVOY/WT9KeOfqZGS3iCbORwkWu8Vc4qw5VOUIgAbtlar8c bULTpmEHyEYS8Nd6jFh5YtYs2I3O70/fb/o5+Bn2ul2+CTIUEh94F/Wd97arObqroq6i kDq3zxtqloTd2KMRBuTH7Mo6ZJBUi07nLhCP0ASxdi6iHKJhhsAcTY7wNowSVzfTiJQ0 8wqVQUkbjzDkrTBf1xyT1JDxbnAjmdoNuUz+BlBapbYXKWx8tUTSJR7L19qnNWW6ftfh Nv/w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=pBGbXpOrCB//XrgoYQHEzqRxwEnSAa2Q6fgsNfUlWv8=; b=k+KHvtOu+rd0Kk9xUPsBk8v702G5LltM6i4ymnKVHFKykcY0NpxfZmMYpB4Ulqj7T+ kaX73zcJQ2U4H1vaq+cGUEoVQVcpNwsN24/DDijivCTRo6rDzk2s+v6WqJogJPIMhCJ7 ejPWyKrlNOS8xn3zSGYROnjC2qxV6QIE1aeK52uH7WKgNeC0H5zuPAjhhH56aEmhF2Dx jF5kgbGeNe29W7UjyM87ij9l9C9w7ng5qC8OrbGmIAgiznvMj1NJT9JAOcsCes+3CLCm a0rep8/tMvEcOpOCApRDzbVqoxOUD4MKkzUSu8LTGWHl4HaKR1PRqxyiEwJlp7LzbKyY Tl8Q== X-Gm-Message-State: AOAM53038dux4lL2CKx1ZVNxyJ4A9jmALuo7dm8OuNDBKG4H23yil5Kz NNEy+ZPHQs5MB72JBL24HfhhH/ejmRk= X-Received: by 2002:a19:4888:: with SMTP id v130mr7427912lfa.68.1625563392415; Tue, 06 Jul 2021 02:23:12 -0700 (PDT) Received: from localhost.localdomain (deedock.humlab.lu.se. [130.235.135.183]) by smtp.gmail.com with ESMTPSA id w29sm1447179lfu.160.2021.07.06.02.23.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 06 Jul 2021 02:23:11 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Tue, 6 Jul 2021 11:19:58 +0200 Message-Id: <20210706092020.1057-13-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20210706092020.1057-1-dcnieho@gmail.com> References: <20210706092020.1057-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v3 12/34] avdevice/dshow: implement control_message interface X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Cc: Diederick Niehorster Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: 2X/xUg0IFnPo This allows programmatic users of avdevice to start and stop the DirectShow Capture graph (i.e. receive frames or not). This is important because now the buffer fills up and starts dropping samples when enqueued packets are not read out immediately after the demuxer is opened. Signed-off-by: Diederick Niehorster --- libavdevice/dshow.c | 42 +++++++++++++++++++++++++++++++++++++ libavdevice/dshow_capture.h | 1 + 2 files changed, 43 insertions(+) diff --git a/libavdevice/dshow.c b/libavdevice/dshow.c index dae0ae5d70..3793923acf 100644 --- a/libavdevice/dshow.c +++ b/libavdevice/dshow.c @@ -1079,6 +1079,45 @@ error: return ret; } +static int dshow_control_message(AVFormatContext *avctx, int type, void *data, size_t data_size) +{ + struct dshow_ctx *ctx = avctx->priv_data; + int run_state = ctx->is_running; + HRESULT hr; + + switch (type) { + case AV_APP_TO_DEV_PAUSE: + run_state = 0; + break; + case AV_APP_TO_DEV_PLAY: + run_state = 1; + break; + case AV_APP_TO_DEV_TOGGLE_PAUSE: + run_state = !run_state; + break; + } + + // if play state change requested, apply + if (run_state != ctx->is_running) { + if (run_state) + hr = IMediaControl_Run(ctx->control); + else + hr = IMediaControl_Pause(ctx->control); + + if (hr == S_FALSE) { + OAFilterState pfs; + hr = IMediaControl_GetState(ctx->control, 0, &pfs); + } + if (hr != S_OK) { + av_log(avctx, AV_LOG_ERROR, "Could not run/pause graph\n"); + return AVERROR(EIO); + } + ctx->is_running = run_state; + } + + return 0; +} + static enum AVCodecID waveform_codec_id(enum AVSampleFormat sample_fmt) { switch (sample_fmt) { @@ -1317,6 +1356,7 @@ static int dshow_read_header(AVFormatContext *avctx) } } } + ctx->is_running = 0; if (ctx->device_name[VideoDevice]) { if ((r = dshow_open_device(avctx, devenum, VideoDevice, VideoSourceDevice)) < 0 || (r = dshow_add_device(avctx, VideoDevice)) < 0) { @@ -1390,6 +1430,7 @@ static int dshow_read_header(AVFormatContext *avctx) av_log(avctx, AV_LOG_ERROR, "Could not run graph (sometimes caused by a device already in use by other application)\n"); goto error; } + ctx->is_running = 1; ret = 0; @@ -1502,6 +1543,7 @@ const AVInputFormat ff_dshow_demuxer = { .read_packet = dshow_read_packet, .read_close = dshow_read_close, .get_device_list= dshow_get_device_list, + .control_message = dshow_control_message, .flags = AVFMT_NOFILE | AVFMT_NOBINSEARCH | AVFMT_NOGENSEARCH | AVFMT_NO_BYTE_SEEK, .priv_class = &dshow_class, }; diff --git a/libavdevice/dshow_capture.h b/libavdevice/dshow_capture.h index 5a2691518c..bb0f76a8f2 100644 --- a/libavdevice/dshow_capture.h +++ b/libavdevice/dshow_capture.h @@ -331,6 +331,7 @@ struct dshow_ctx { IMediaControl *control; IMediaEvent *media_event; + int is_running; enum AVPixelFormat pixel_format; enum AVCodecID video_codec_id;