* [FFmpeg-devel] [PATCH 0/4] avdevice/dshow fixups
@ 2022-01-01 16:39 Diederick Niehorster
2022-01-01 16:39 ` [FFmpeg-devel] [PATCH 1/4] avdevice/dshow: tv_tuner_audio_dialog cleanup missing Diederick Niehorster
` (3 more replies)
0 siblings, 4 replies; 5+ messages in thread
From: Diederick Niehorster @ 2022-01-01 16:39 UTC (permalink / raw)
To: ffmpeg-devel; +Cc: Diederick Niehorster
These four patches fix three small new issues i found looking through
the dshow code (needd cleanup not being done), and fix a regression
introduced by my recent patches due to which devices that seem to not
behave according to spec but worked fine before my patches could no
longer be used.
Diederick Niehorster (4):
avdevice/dshow: tv_tuner_audio_dialog cleanup missing
avdevice/dshow: proper cleanup of queried media types
avdevice/dshow: only set pin format if wanted
avdevice/dshow: ensure pin's default format is set
libavdevice/dshow.c | 93 ++++++++++++++++++++++--------------
libavdevice/dshow_crossbar.c | 4 ++
2 files changed, 61 insertions(+), 36 deletions(-)
--
2.28.0.windows.1
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 5+ messages in thread
* [FFmpeg-devel] [PATCH 1/4] avdevice/dshow: tv_tuner_audio_dialog cleanup missing
2022-01-01 16:39 [FFmpeg-devel] [PATCH 0/4] avdevice/dshow fixups Diederick Niehorster
@ 2022-01-01 16:39 ` Diederick Niehorster
2022-01-01 16:39 ` [FFmpeg-devel] [PATCH 2/4] avdevice/dshow: proper cleanup of queried media types Diederick Niehorster
` (2 subsequent siblings)
3 siblings, 0 replies; 5+ messages in thread
From: Diederick Niehorster @ 2022-01-01 16:39 UTC (permalink / raw)
To: ffmpeg-devel; +Cc: Diederick Niehorster
Cleanup was missing for when the show_analog_tv_tuner_audio_dialog is
true.
Signed-off-by: Diederick Niehorster <dcnieho@gmail.com>
---
libavdevice/dshow_crossbar.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/libavdevice/dshow_crossbar.c b/libavdevice/dshow_crossbar.c
index 2438683cde..961defe690 100644
--- a/libavdevice/dshow_crossbar.c
+++ b/libavdevice/dshow_crossbar.c
@@ -204,5 +204,9 @@ end:
IAMTVTuner_Release(tv_tuner_filter);
if (tv_tuner_base_filter)
IBaseFilter_Release(tv_tuner_base_filter);
+ if (tv_audio_filter)
+ IAMAudioInputMixer_Release(tv_audio_filter);
+ if (tv_audio_base_filter)
+ IBaseFilter_Release(tv_audio_base_filter);
return hr;
}
--
2.28.0.windows.1
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 5+ messages in thread
* [FFmpeg-devel] [PATCH 2/4] avdevice/dshow: proper cleanup of queried media types
2022-01-01 16:39 [FFmpeg-devel] [PATCH 0/4] avdevice/dshow fixups Diederick Niehorster
2022-01-01 16:39 ` [FFmpeg-devel] [PATCH 1/4] avdevice/dshow: tv_tuner_audio_dialog cleanup missing Diederick Niehorster
@ 2022-01-01 16:39 ` Diederick Niehorster
2022-01-01 16:39 ` [FFmpeg-devel] [PATCH 3/4] avdevice/dshow: only set pin format if wanted Diederick Niehorster
2022-01-01 16:39 ` [FFmpeg-devel] [PATCH 4/4] avdevice/dshow: ensure pin's default format is set Diederick Niehorster
3 siblings, 0 replies; 5+ messages in thread
From: Diederick Niehorster @ 2022-01-01 16:39 UTC (permalink / raw)
To: ffmpeg-devel; +Cc: Diederick Niehorster
Signed-off-by: Diederick Niehorster <dcnieho@gmail.com>
---
libavdevice/dshow.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/libavdevice/dshow.c b/libavdevice/dshow.c
index 30f1be1ead..4b6887881d 100644
--- a/libavdevice/dshow.c
+++ b/libavdevice/dshow.c
@@ -953,7 +953,7 @@ dshow_cycle_formats(AVFormatContext *avctx, enum dshowDeviceType devtype,
av_log(avctx, AV_LOG_INFO, "(%s)", chroma ? chroma : "unknown");
av_log(avctx, AV_LOG_INFO, "\n");
- continue;
+ goto next;
}
if (requested_video_codec_id != AV_CODEC_ID_RAWVIDEO) {
if (requested_video_codec_id != fmt_info->codec_id)
@@ -1038,6 +1038,7 @@ next:
if (type && type->pbFormat)
CoTaskMemFree(type->pbFormat);
CoTaskMemFree(type);
+ type = NULL;
}
// previously found a matching VIDEOINFOHEADER format and stored
// it for safe keeping. Searching further for a matching
--
2.28.0.windows.1
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 5+ messages in thread
* [FFmpeg-devel] [PATCH 3/4] avdevice/dshow: only set pin format if wanted
2022-01-01 16:39 [FFmpeg-devel] [PATCH 0/4] avdevice/dshow fixups Diederick Niehorster
2022-01-01 16:39 ` [FFmpeg-devel] [PATCH 1/4] avdevice/dshow: tv_tuner_audio_dialog cleanup missing Diederick Niehorster
2022-01-01 16:39 ` [FFmpeg-devel] [PATCH 2/4] avdevice/dshow: proper cleanup of queried media types Diederick Niehorster
@ 2022-01-01 16:39 ` Diederick Niehorster
2022-01-01 16:39 ` [FFmpeg-devel] [PATCH 4/4] avdevice/dshow: ensure pin's default format is set Diederick Niehorster
3 siblings, 0 replies; 5+ messages in thread
From: Diederick Niehorster @ 2022-01-01 16:39 UTC (permalink / raw)
To: ffmpeg-devel; +Cc: Diederick Niehorster
Signed-off-by: Diederick Niehorster <dcnieho@gmail.com>
---
libavdevice/dshow.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/libavdevice/dshow.c b/libavdevice/dshow.c
index 4b6887881d..f2d95fa470 100644
--- a/libavdevice/dshow.c
+++ b/libavdevice/dshow.c
@@ -1046,7 +1046,7 @@ next:
// format based on the VIDEOINFOHEADER format.
// NB: this never applies to an audio format because
// previous_match_type always NULL in that case
- if (!format_set && previous_match_type) {
+ if (pformat_set && !format_set && previous_match_type) {
if (IAMStreamConfig_SetFormat(config, previous_match_type) == S_OK)
format_set = 1;
}
--
2.28.0.windows.1
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 5+ messages in thread
* [FFmpeg-devel] [PATCH 4/4] avdevice/dshow: ensure pin's default format is set
2022-01-01 16:39 [FFmpeg-devel] [PATCH 0/4] avdevice/dshow fixups Diederick Niehorster
` (2 preceding siblings ...)
2022-01-01 16:39 ` [FFmpeg-devel] [PATCH 3/4] avdevice/dshow: only set pin format if wanted Diederick Niehorster
@ 2022-01-01 16:39 ` Diederick Niehorster
3 siblings, 0 replies; 5+ messages in thread
From: Diederick Niehorster @ 2022-01-01 16:39 UTC (permalink / raw)
To: ffmpeg-devel; +Cc: Diederick Niehorster
Fixes regression in a1c4929f: there apparently are devices out there
that expose a pin default format that has parameters outside the
capabilities of any of the formats exposed on the pin (sic?). The
VirtualCam plugin (v 2.0.5) of OBS-Studio (v 27.1.3) is such a device.
Now when a default format was found, but not selected when iterating all
formats, fall back to directly setting the default format.
Signed-off-by: Diederick Niehorster <dcnieho@gmail.com>
---
libavdevice/dshow.c | 88 +++++++++++++++++++++++++++------------------
1 file changed, 54 insertions(+), 34 deletions(-)
diff --git a/libavdevice/dshow.c b/libavdevice/dshow.c
index f2d95fa470..a435ae1807 100644
--- a/libavdevice/dshow.c
+++ b/libavdevice/dshow.c
@@ -758,6 +758,31 @@ static struct dshow_format_info *dshow_get_format_info(AM_MEDIA_TYPE *type)
return fmt_info;
}
+static void dshow_get_default_format(IPin *pin, IAMStreamConfig *config, enum dshowDeviceType devtype, AM_MEDIA_TYPE **type)
+{
+ HRESULT hr;
+
+ if ((hr = IAMStreamConfig_GetFormat(config, type)) != S_OK) {
+ if (hr == E_NOTIMPL || !IsEqualGUID(&(*type)->majortype, devtype == VideoDevice ? &MEDIATYPE_Video : &MEDIATYPE_Audio)) {
+ // default not available or of wrong type,
+ // fall back to iterating exposed formats
+ // until one of the right type is found
+ IEnumMediaTypes* types = NULL;
+ if (IPin_EnumMediaTypes(pin, &types) != S_OK)
+ return;
+ IEnumMediaTypes_Reset(types);
+ while (IEnumMediaTypes_Next(types, 1, type, NULL) == S_OK) {
+ if (IsEqualGUID(&(*type)->majortype, devtype == VideoDevice ? &MEDIATYPE_Video : &MEDIATYPE_Audio)) {
+ break;
+ }
+ CoTaskMemFree(*type);
+ *type = NULL;
+ }
+ IEnumMediaTypes_Release(types);
+ }
+ }
+}
+
/**
* Cycle through available formats available from the specified pin,
* try to set parameters specified through AVOptions, or the pin's
@@ -813,32 +838,11 @@ dshow_cycle_formats(AVFormatContext *avctx, enum dshowDeviceType devtype,
use_default = !dshow_should_set_format(avctx, devtype);
if (use_default && pformat_set)
{
- HRESULT hr;
-
// get default
- if ((hr = IAMStreamConfig_GetFormat(config, &type)) != S_OK) {
- if (hr == E_NOTIMPL || !IsEqualGUID(&type->majortype, devtype==VideoDevice ? &MEDIATYPE_Video : &MEDIATYPE_Audio)) {
- // default not available or of wrong type,
- // fall back to iterating exposed formats
- // until one of the right type is found
- IEnumMediaTypes *types = NULL;
- if (IPin_EnumMediaTypes(pin, &types) != S_OK)
- goto end;
- IEnumMediaTypes_Reset(types);
- while (IEnumMediaTypes_Next(types, 1, &type, NULL) == S_OK) {
- if (IsEqualGUID(&type->majortype, devtype==VideoDevice ? &MEDIATYPE_Video : &MEDIATYPE_Audio)) {
- break;
- }
- CoTaskMemFree(type);
- type = NULL;
- }
- IEnumMediaTypes_Release(types);
- }
-
- if (!type)
- // this pin does not expose any formats of the expected type
- goto end;
- }
+ dshow_get_default_format(pin, config, devtype, &type);
+ if (!type)
+ // this pin does not expose any formats of the expected type
+ goto end;
if (type) {
// interrogate default format, so we know what to search for below
@@ -1040,15 +1044,31 @@ next:
CoTaskMemFree(type);
type = NULL;
}
- // previously found a matching VIDEOINFOHEADER format and stored
- // it for safe keeping. Searching further for a matching
- // VIDEOINFOHEADER2 format yielded nothing. So set the pin's
- // format based on the VIDEOINFOHEADER format.
- // NB: this never applies to an audio format because
- // previous_match_type always NULL in that case
- if (pformat_set && !format_set && previous_match_type) {
- if (IAMStreamConfig_SetFormat(config, previous_match_type) == S_OK)
- format_set = 1;
+
+ // set the pin's format, if wanted
+ if (pformat_set && !format_set) {
+ if (previous_match_type) {
+ // previously found a matching VIDEOINFOHEADER format and stored
+ // it for safe keeping. Searching further for a matching
+ // VIDEOINFOHEADER2 format yielded nothing. So set the pin's
+ // format based on the VIDEOINFOHEADER format.
+ // NB: this never applies to an audio format because
+ // previous_match_type always NULL in that case
+ if (IAMStreamConfig_SetFormat(config, previous_match_type) == S_OK)
+ format_set = 1;
+ }
+ else if (use_default) {
+ // default format returned by device apparently was not contained
+ // in the capabilities of any of the formats returned by the device
+ // (sic?). Fall back to directly setting the default format
+ dshow_get_default_format(pin, config, devtype, &type);
+ if (IAMStreamConfig_SetFormat(config, type) == S_OK)
+ format_set = 1;
+ if (type && type->pbFormat)
+ CoTaskMemFree(type->pbFormat);
+ CoTaskMemFree(type);
+ type = NULL;
+ }
}
end:
--
2.28.0.windows.1
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2022-01-01 16:41 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-01-01 16:39 [FFmpeg-devel] [PATCH 0/4] avdevice/dshow fixups Diederick Niehorster
2022-01-01 16:39 ` [FFmpeg-devel] [PATCH 1/4] avdevice/dshow: tv_tuner_audio_dialog cleanup missing Diederick Niehorster
2022-01-01 16:39 ` [FFmpeg-devel] [PATCH 2/4] avdevice/dshow: proper cleanup of queried media types Diederick Niehorster
2022-01-01 16:39 ` [FFmpeg-devel] [PATCH 3/4] avdevice/dshow: only set pin format if wanted Diederick Niehorster
2022-01-01 16:39 ` [FFmpeg-devel] [PATCH 4/4] avdevice/dshow: ensure pin's default format is set Diederick Niehorster
Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
This inbox may be cloned and mirrored by anyone:
git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git
# If you have public-inbox 1.1+ installed, you may
# initialize and index your mirror using the following commands:
public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
ffmpegdev@gitmailbox.com
public-inbox-index ffmpegdev
Example config snippet for mirrors.
AGPL code for this site: git clone https://public-inbox.org/public-inbox.git