From 8bdc967ae91e4c924448b73d2dc91b160da9f029 Mon Sep 17 00:00:00 2001 From: jp9000 Date: Fri, 12 Sep 2014 01:27:57 -0700 Subject: [PATCH] win-dshow: Implement dynamic format change support This adds support for dynamic format changes on the fly. Format, resolution, sample rate, can all now be changed by the current directshow device on the fly. --- plugins/win-dshow/win-dshow.cpp | 38 +++++++++++++++++---------------- 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/plugins/win-dshow/win-dshow.cpp b/plugins/win-dshow/win-dshow.cpp index 295a00060..234e956a0 100644 --- a/plugins/win-dshow/win-dshow.cpp +++ b/plugins/win-dshow/win-dshow.cpp @@ -234,10 +234,17 @@ void DShowInput::OnVideoData(const VideoConfig &config, OnEncodedVideoData(AV_CODEC_ID_H264, data, size, startTime); return; } - const int cx = videoConfig.cx; - const int cy = videoConfig.cy; - frame.timestamp = (uint64_t)startTime * 100; + const int cx = config.cx; + const int cy = config.cy; + + frame.timestamp = (uint64_t)startTime * 100; + frame.width = config.cx; + frame.height = config.cy; + frame.format = ConvertVideoFormat(config.format); + frame.full_range = false; + frame.flip = (config.format == VideoFormat::XRGB || + config.format == VideoFormat::ARGB); if (videoConfig.format == VideoFormat::XRGB || videoConfig.format == VideoFormat::ARGB) { @@ -299,6 +306,8 @@ void DShowInput::OnAudioData(const AudioConfig &config, unsigned char *data, size_t size, long long startTime, long long endTime) { + size_t block_size; + if (config.format == AudioFormat::AAC) { OnEncodedAudioData(AV_CODEC_ID_AAC, data, size, startTime); return; @@ -310,12 +319,16 @@ void DShowInput::OnAudioData(const AudioConfig &config, return; } - size_t block_size = get_audio_bytes_per_channel(audio.format) * + audio.speakers = (enum speaker_layout)config.channels; + audio.format = ConvertAudioFormat(config.format); + audio.samples_per_sec = (uint32_t)config.sampleRate; + audio.data[0] = data; + + block_size = get_audio_bytes_per_channel(audio.format) * get_audio_channels(audio.speakers); - audio.data[0] = data; - audio.frames = (uint32_t)(size / block_size); - audio.timestamp = (uint64_t)startTime * 100; + audio.frames = (uint32_t)(size / block_size); + audio.timestamp = (uint64_t)startTime * 100; if (audio.format != AUDIO_FORMAT_UNKNOWN) obs_source_output_audio(source, &audio); @@ -651,17 +664,6 @@ void DShowInput::Update(obs_data_t settings) if (device.Start() != Result::Success) return; - frame.width = videoConfig.cx; - frame.height = videoConfig.cy; - frame.format = ConvertVideoFormat(videoConfig.format); - frame.full_range = false; - frame.flip = (videoConfig.format == VideoFormat::XRGB || - videoConfig.format == VideoFormat::ARGB); - - audio.speakers = (enum speaker_layout)audioConfig.channels; - audio.format = ConvertAudioFormat(audioConfig.format); - audio.samples_per_sec = (uint32_t)audioConfig.sampleRate; - enum video_colorspace cs = (videoConfig.format == VideoFormat::HDYC) ? VIDEO_CS_709 : VIDEO_CS_601;