From patchwork Fri Jun 5 12:02:39 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Sinitsyn X-Patchwork-Id: 20158 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id CE012449967 for ; Fri, 5 Jun 2020 15:09:43 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id A69C568AFEC; Fri, 5 Jun 2020 15:09:43 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-ed1-f68.google.com (mail-ed1-f68.google.com [209.85.208.68]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 488A068AFBB for ; Fri, 5 Jun 2020 15:09:37 +0300 (EEST) Received: by mail-ed1-f68.google.com with SMTP id c35so7281661edf.5 for ; Fri, 05 Jun 2020 05:09:37 -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:mime-version :content-transfer-encoding; bh=NdtaCiWk5g8j6tYMHRaw0k0NoiNRSyLyA51W8PsAENM=; b=Kg9yCIokxX7FsJfwTxl0L3iW8V+9XHIAlTrMIGM6ykaIkQhVn0S7nr1dg7Sridg/KR bqagPS7Yv7++urT0KMIyWR0x7dnkn+V/ukceIrL3ZAdlAgQy01BX1E9EBpbteVKsfROP hO97au+zgdTEeBTo9gyQJyqusNPUaFLAUvtpYYAQNEGxIzELRLdVlmkXio1sTb9nQRc/ qvLH12yyHbefZfxtg4cx+6Lu7cJb3K55penfs5horTddy/kiVof9Hkc1so776Rgoya5Y /dNN0YujXtHEHr6eAg8ykMoH/UBKM2do0Lf7mDDKMk5ehEyzU7dCblf1+5PetynSuDMx Yv0w== 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:mime-version :content-transfer-encoding; bh=NdtaCiWk5g8j6tYMHRaw0k0NoiNRSyLyA51W8PsAENM=; b=sIC7XaTl25uNwkJbZmsHCROiZs9mroCNZelXW7SQtmguOfVR5qVd7KnvgFoRyW+LjP 8YqW21HjeaakKg5vNnSGRSE9II6ZpJQmk3k7MU4yQ7FSTfbU0HRnMo3ZdQ4k43UeeZHV veuVPTk6C5dQA4jqTU6BQ24UM7MXlH0zt6yAECnO4qwquhF/OjFenZOIKmYMkhZ8/iTB u7lHahEqJjvhjJaLdDPxS8xUxgLH8p01wLlsJ/UbRK5gJ32bLwHVbTnwtZrLbWEcCqiZ cN8zd0sI/vuZrlBjegT0DhefZnbpDphiEDNxg1MoHF+gpetxbi1m+uyLKjy4ORxEboUK YFkA== X-Gm-Message-State: AOAM533+WiBwt8czLczXkxjpwChA8LTt1/fVYo+ntlME86jDow6F/JVB MQLvhJyMJYYfaEbuaoNtrtUScRgr X-Google-Smtp-Source: ABdhPJzH0vcHSqPAP9klbs1tclTm9yAHaM4rrZtwJV8aDt+3lQHDew504YX0KhvLdlVamfoy1EAB9w== X-Received: by 2002:a05:651c:1130:: with SMTP id e16mr4666391ljo.10.1591358598271; Fri, 05 Jun 2020 05:03:18 -0700 (PDT) Received: from localhost.localdomain ([109.87.208.100]) by smtp.gmail.com with ESMTPSA id w20sm674730lji.7.2020.06.05.05.03.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Jun 2020 05:03:17 -0700 (PDT) From: Dmitry Sinitsyn X-Google-Original-From: Dmitry Sinitsyn To: ffmpeg-devel@ffmpeg.org Date: Fri, 5 Jun 2020 15:02:39 +0300 Message-Id: <20200605120239.268-1-user@Daewoo> X-Mailer: git-send-email 2.27.0 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] add ability to bypass custom video pts generation and use capture filter provided pts X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 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: Dmitry Sinitsyn Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" From: Dmitry Sinitsyn Hello, This patch is about #8620 issue. I do not know why initial developer thought that "PTS from video devices is unreliable" but nowadays my experience makes me sure that we should use sample stream start time as PTS for all types of streams. But I do not want to break something. So I propose new parameter to control this behavior with old-style way as default --- libavdevice/dshow.c | 1 + libavdevice/dshow_capture.h | 1 + libavdevice/dshow_pin.c | 8 ++++---- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/libavdevice/dshow.c b/libavdevice/dshow.c index d7f5bd7069..1251fe604f 100644 --- a/libavdevice/dshow.c +++ b/libavdevice/dshow.c @@ -1317,6 +1317,7 @@ static const AVOption options[] = { { "audio_device_save", "save audio capture filter device (and properties) to file", OFFSET(audio_filter_save_file), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, DEC }, { "video_device_load", "load video capture filter device (and properties) from file", OFFSET(video_filter_load_file), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, DEC }, { "video_device_save", "save video capture filter device (and properties) to file", OFFSET(video_filter_save_file), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, DEC }, + { "gen_video_pts", "generate own pts for video stream", OFFSET(gen_video_pts), AV_OPT_TYPE_BOOL, {.i64 = 1}, 0, 1, DEC }, { NULL }, }; diff --git a/libavdevice/dshow_capture.h b/libavdevice/dshow_capture.h index 475d62ba99..1298ebc041 100644 --- a/libavdevice/dshow_capture.h +++ b/libavdevice/dshow_capture.h @@ -311,6 +311,7 @@ struct dshow_ctx { char *audio_filter_save_file; char *video_filter_load_file; char *video_filter_save_file; + int gen_video_pts; IBaseFilter *device_filter[2]; IPin *device_pin[2]; diff --git a/libavdevice/dshow_pin.c b/libavdevice/dshow_pin.c index 53b1c9150d..c77b3ae2b5 100644 --- a/libavdevice/dshow_pin.c +++ b/libavdevice/dshow_pin.c @@ -333,10 +333,13 @@ libAVMemInputPin_Receive(libAVMemInputPin *this, IMediaSample *sample) if (!sample) return E_POINTER; + priv_data = pin->filter->priv_data; + s = priv_data; + ctx = s->priv_data; IMediaSample_GetTime(sample, &orig_curtime, &dummy); orig_curtime += pin->filter->start_time; IReferenceClock_GetTime(clock, &graphtime); - if (devtype == VideoDevice) { + if (ctx->gen_video_pts && devtype == VideoDevice) { /* PTS from video devices is unreliable. */ IReferenceClock_GetTime(clock, &curtime); } else { @@ -354,9 +357,6 @@ libAVMemInputPin_Receive(libAVMemInputPin *this, IMediaSample *sample) buf_size = IMediaSample_GetActualDataLength(sample); IMediaSample_GetPointer(sample, &buf); - priv_data = pin->filter->priv_data; - s = priv_data; - ctx = s->priv_data; index = pin->filter->stream_index; av_log(NULL, AV_LOG_VERBOSE, "dshow passing through packet of type %s size %8d "