mirror of
git://source.winehq.org/git/wine.git
synced 2024-10-31 19:49:50 +00:00
winegstreamer: Create wg_sample from IMFSample within wg_transform_push_mf.
This commit is contained in:
parent
77a4b4b439
commit
71da6a7152
7 changed files with 20 additions and 44 deletions
|
@ -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,
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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,
|
||||||
|
|
Loading…
Reference in a new issue