winegstreamer: Create wg_sample from IMFSample within wg_transform_push_mf.

This commit is contained in:
Rémi Bernon 2022-09-14 22:11:17 +02:00 committed by Alexandre Julliard
parent 77a4b4b439
commit 71da6a7152
7 changed files with 20 additions and 44 deletions

View file

@ -544,19 +544,13 @@ static HRESULT WINAPI transform_ProcessMessage(IMFTransform *iface, MFT_MESSAGE_
static HRESULT WINAPI transform_ProcessInput(IMFTransform *iface, DWORD id, IMFSample *sample, DWORD flags) static HRESULT WINAPI transform_ProcessInput(IMFTransform *iface, DWORD id, IMFSample *sample, DWORD flags)
{ {
struct color_convert *impl = impl_from_IMFTransform(iface); struct color_convert *impl = impl_from_IMFTransform(iface);
struct wg_sample *wg_sample;
HRESULT hr;
TRACE("iface %p, id %#lx, sample %p, flags %#lx.\n", iface, id, sample, flags); TRACE("iface %p, id %#lx, sample %p, flags %#lx.\n", iface, id, sample, flags);
if (!impl->wg_transform) if (!impl->wg_transform)
return MF_E_TRANSFORM_TYPE_NOT_SET; return MF_E_TRANSFORM_TYPE_NOT_SET;
if (FAILED(hr = wg_sample_create_mf(sample, &wg_sample))) return wg_transform_push_mf(impl->wg_transform, sample, impl->wg_sample_queue);
return hr;
return wg_transform_push_mf(impl->wg_transform, wg_sample,
impl->wg_sample_queue);
} }
static HRESULT WINAPI transform_ProcessOutput(IMFTransform *iface, DWORD flags, DWORD count, static HRESULT WINAPI transform_ProcessOutput(IMFTransform *iface, DWORD flags, DWORD count,

View file

@ -130,7 +130,7 @@ HRESULT wg_sample_create_mf(IMFSample *sample, struct wg_sample **out);
HRESULT wg_sample_create_quartz(IMediaSample *sample, struct wg_sample **out); HRESULT wg_sample_create_quartz(IMediaSample *sample, struct wg_sample **out);
void wg_sample_release(struct wg_sample *wg_sample); void wg_sample_release(struct wg_sample *wg_sample);
HRESULT wg_transform_push_mf(struct wg_transform *transform, struct wg_sample *sample, HRESULT wg_transform_push_mf(struct wg_transform *transform, IMFSample *sample,
struct wg_sample_queue *queue); struct wg_sample_queue *queue);
HRESULT wg_transform_push_quartz(struct wg_transform *transform, struct wg_sample *sample, HRESULT wg_transform_push_quartz(struct wg_transform *transform, struct wg_sample *sample,
struct wg_sample_queue *queue); struct wg_sample_queue *queue);

View file

@ -585,18 +585,13 @@ static HRESULT WINAPI transform_ProcessMessage(IMFTransform *iface, MFT_MESSAGE_
static HRESULT WINAPI transform_ProcessInput(IMFTransform *iface, DWORD id, IMFSample *sample, DWORD flags) static HRESULT WINAPI transform_ProcessInput(IMFTransform *iface, DWORD id, IMFSample *sample, DWORD flags)
{ {
struct h264_decoder *decoder = impl_from_IMFTransform(iface); struct h264_decoder *decoder = impl_from_IMFTransform(iface);
struct wg_sample *wg_sample;
HRESULT hr;
TRACE("iface %p, id %#lx, sample %p, flags %#lx.\n", iface, id, sample, flags); TRACE("iface %p, id %#lx, sample %p, flags %#lx.\n", iface, id, sample, flags);
if (!decoder->wg_transform) if (!decoder->wg_transform)
return MF_E_TRANSFORM_TYPE_NOT_SET; return MF_E_TRANSFORM_TYPE_NOT_SET;
if (FAILED(hr = wg_sample_create_mf(sample, &wg_sample))) return wg_transform_push_mf(decoder->wg_transform, sample, decoder->wg_sample_queue);
return hr;
return wg_transform_push_mf(decoder->wg_transform, wg_sample, decoder->wg_sample_queue);
} }
static HRESULT WINAPI transform_ProcessOutput(IMFTransform *iface, DWORD flags, DWORD count, static HRESULT WINAPI transform_ProcessOutput(IMFTransform *iface, DWORD flags, DWORD count,

View file

@ -513,19 +513,13 @@ static HRESULT WINAPI transform_ProcessMessage(IMFTransform *iface, MFT_MESSAGE_
static HRESULT WINAPI transform_ProcessInput(IMFTransform *iface, DWORD id, IMFSample *sample, DWORD flags) static HRESULT WINAPI transform_ProcessInput(IMFTransform *iface, DWORD id, IMFSample *sample, DWORD flags)
{ {
struct resampler *impl = impl_from_IMFTransform(iface); struct resampler *impl = impl_from_IMFTransform(iface);
struct wg_sample *wg_sample;
HRESULT hr;
TRACE("iface %p, id %#lx, sample %p, flags %#lx.\n", iface, id, sample, flags); TRACE("iface %p, id %#lx, sample %p, flags %#lx.\n", iface, id, sample, flags);
if (!impl->wg_transform) if (!impl->wg_transform)
return MF_E_TRANSFORM_TYPE_NOT_SET; return MF_E_TRANSFORM_TYPE_NOT_SET;
if (FAILED(hr = wg_sample_create_mf(sample, &wg_sample))) return wg_transform_push_mf(impl->wg_transform, sample, impl->wg_sample_queue);
return hr;
return wg_transform_push_mf(impl->wg_transform, wg_sample,
impl->wg_sample_queue);
} }
static HRESULT WINAPI transform_ProcessOutput(IMFTransform *iface, DWORD flags, DWORD count, static HRESULT WINAPI transform_ProcessOutput(IMFTransform *iface, DWORD flags, DWORD count,

View file

@ -521,19 +521,13 @@ static HRESULT WINAPI video_processor_ProcessMessage(IMFTransform *iface, MFT_ME
static HRESULT WINAPI video_processor_ProcessInput(IMFTransform *iface, DWORD id, IMFSample *sample, DWORD flags) static HRESULT WINAPI video_processor_ProcessInput(IMFTransform *iface, DWORD id, IMFSample *sample, DWORD flags)
{ {
struct video_processor *impl = impl_from_IMFTransform(iface); struct video_processor *impl = impl_from_IMFTransform(iface);
struct wg_sample *wg_sample;
HRESULT hr;
TRACE("iface %p, id %#lx, sample %p, flags %#lx.\n", iface, id, sample, flags); TRACE("iface %p, id %#lx, sample %p, flags %#lx.\n", iface, id, sample, flags);
if (!impl->wg_transform) if (!impl->wg_transform)
return MF_E_TRANSFORM_TYPE_NOT_SET; return MF_E_TRANSFORM_TYPE_NOT_SET;
if (FAILED(hr = wg_sample_create_mf(sample, &wg_sample))) return wg_transform_push_mf(impl->wg_transform, sample, impl->wg_sample_queue);
return hr;
return wg_transform_push_mf(impl->wg_transform, wg_sample,
impl->wg_sample_queue);
} }
static HRESULT WINAPI video_processor_ProcessOutput(IMFTransform *iface, DWORD flags, DWORD count, static HRESULT WINAPI video_processor_ProcessOutput(IMFTransform *iface, DWORD flags, DWORD count,

View file

@ -252,28 +252,31 @@ HRESULT wg_transform_push_data(struct wg_transform *transform, struct wg_sample
HRESULT wg_transform_read_data(struct wg_transform *transform, struct wg_sample *sample, HRESULT wg_transform_read_data(struct wg_transform *transform, struct wg_sample *sample,
struct wg_format *format); struct wg_format *format);
HRESULT wg_transform_push_mf(struct wg_transform *transform, struct wg_sample *wg_sample, HRESULT wg_transform_push_mf(struct wg_transform *transform, IMFSample *sample,
struct wg_sample_queue *queue) struct wg_sample_queue *queue)
{ {
struct sample *sample = unsafe_mf_from_wg_sample(wg_sample); struct wg_sample *wg_sample;
LONGLONG time, duration; LONGLONG time, duration;
UINT32 value; UINT32 value;
HRESULT hr; HRESULT hr;
TRACE_(mfplat)("transform %p, wg_sample %p, queue %p.\n", transform, wg_sample, queue); TRACE_(mfplat)("transform %p, sample %p, queue %p.\n", transform, sample, queue);
if (SUCCEEDED(IMFSample_GetSampleTime(sample->u.mf.sample, &time))) if (FAILED(hr = wg_sample_create_mf(sample, &wg_sample)))
return hr;
if (SUCCEEDED(IMFSample_GetSampleTime(sample, &time)))
{ {
sample->wg_sample.flags |= WG_SAMPLE_FLAG_HAS_PTS; wg_sample->flags |= WG_SAMPLE_FLAG_HAS_PTS;
sample->wg_sample.pts = time; wg_sample->pts = time;
} }
if (SUCCEEDED(IMFSample_GetSampleDuration(sample->u.mf.sample, &duration))) if (SUCCEEDED(IMFSample_GetSampleDuration(sample, &duration)))
{ {
sample->wg_sample.flags |= WG_SAMPLE_FLAG_HAS_DURATION; wg_sample->flags |= WG_SAMPLE_FLAG_HAS_DURATION;
sample->wg_sample.duration = duration; wg_sample->duration = duration;
} }
if (SUCCEEDED(IMFSample_GetUINT32(sample->u.mf.sample, &MFSampleExtension_CleanPoint, &value)) && value) if (SUCCEEDED(IMFSample_GetUINT32(sample, &MFSampleExtension_CleanPoint, &value)) && value)
sample->wg_sample.flags |= WG_SAMPLE_FLAG_SYNC_POINT; wg_sample->flags |= WG_SAMPLE_FLAG_SYNC_POINT;
wg_sample_queue_begin_append(queue, wg_sample); wg_sample_queue_begin_append(queue, wg_sample);
hr = wg_transform_push_data(transform, wg_sample); hr = wg_transform_push_data(transform, wg_sample);

View file

@ -529,7 +529,6 @@ static HRESULT WINAPI transform_ProcessMessage(IMFTransform *iface, MFT_MESSAGE_
static HRESULT WINAPI transform_ProcessInput(IMFTransform *iface, DWORD id, IMFSample *sample, DWORD flags) static HRESULT WINAPI transform_ProcessInput(IMFTransform *iface, DWORD id, IMFSample *sample, DWORD flags)
{ {
struct wma_decoder *decoder = impl_from_IMFTransform(iface); struct wma_decoder *decoder = impl_from_IMFTransform(iface);
struct wg_sample *wg_sample;
MFT_INPUT_STREAM_INFO info; MFT_INPUT_STREAM_INFO info;
DWORD total_length; DWORD total_length;
HRESULT hr; HRESULT hr;
@ -547,10 +546,7 @@ static HRESULT WINAPI transform_ProcessInput(IMFTransform *iface, DWORD id, IMFS
if (total_length % info.cbSize) if (total_length % info.cbSize)
return S_OK; return S_OK;
if (FAILED(hr = wg_sample_create_mf(sample, &wg_sample))) return wg_transform_push_mf(decoder->wg_transform, sample, decoder->wg_sample_queue);
return hr;
return wg_transform_push_mf(decoder->wg_transform, wg_sample, decoder->wg_sample_queue);
} }
static HRESULT WINAPI transform_ProcessOutput(IMFTransform *iface, DWORD flags, DWORD count, static HRESULT WINAPI transform_ProcessOutput(IMFTransform *iface, DWORD flags, DWORD count,