From: Rémi Bernon rbernon@codeweavers.com
Signed-off-by: Rémi Bernon rbernon@codeweavers.com --- dlls/winegstreamer/wg_sample.c | 64 +++++++++++++++++++++++++--------- 1 file changed, 47 insertions(+), 17 deletions(-)
diff --git a/dlls/winegstreamer/wg_sample.c b/dlls/winegstreamer/wg_sample.c index b7fd9a002a5..017ec706f50 100644 --- a/dlls/winegstreamer/wg_sample.c +++ b/dlls/winegstreamer/wg_sample.c @@ -34,10 +34,22 @@ struct wg_sample_queue
struct sample { - IMFSample *sample; - IMFMediaBuffer *media_buffer; struct wg_sample wg_sample; struct list entry; + + enum wg_sample_type + { + WG_SAMPLE_TYPE_MF = 1, + } type; + + union + { + struct + { + IMFSample *sample; + IMFMediaBuffer *buffer; + } mf; + } u; };
HRESULT wg_sample_create_mf(IMFSample *mf_sample, struct wg_sample **out) @@ -49,23 +61,24 @@ HRESULT wg_sample_create_mf(IMFSample *mf_sample, struct wg_sample **out)
if (!(sample = calloc(1, sizeof(*sample)))) return E_OUTOFMEMORY; - if (FAILED(hr = IMFSample_ConvertToContiguousBuffer(mf_sample, &sample->media_buffer))) + if (FAILED(hr = IMFSample_ConvertToContiguousBuffer(mf_sample, &sample->u.mf.buffer))) goto fail; - if (FAILED(hr = IMFMediaBuffer_Lock(sample->media_buffer, &buffer, &max_length, ¤t_length))) + if (FAILED(hr = IMFMediaBuffer_Lock(sample->u.mf.buffer, &buffer, &max_length, ¤t_length))) goto fail;
- IMFSample_AddRef((sample->sample = mf_sample)); + IMFSample_AddRef((sample->u.mf.sample = mf_sample)); sample->wg_sample.data = buffer; sample->wg_sample.size = current_length; sample->wg_sample.max_size = max_length; + sample->type = WG_SAMPLE_TYPE_MF;
*out = &sample->wg_sample; TRACE("Created wg_sample %p for MF sample %p.\n", *out, mf_sample); return S_OK;
fail: - if (sample->media_buffer) - IMFMediaBuffer_Release(sample->media_buffer); + if (sample->u.mf.buffer) + IMFMediaBuffer_Release(sample->u.mf.buffer); free(sample); return hr; } @@ -80,9 +93,20 @@ void wg_sample_release(struct wg_sample *wg_sample) return; }
- IMFMediaBuffer_Unlock(sample->media_buffer); - IMFMediaBuffer_Release(sample->media_buffer); - IMFSample_Release(sample->sample); + switch (sample->type) + { + case WG_SAMPLE_TYPE_MF: + TRACE("wg_sample %p\n", wg_sample); + + IMFMediaBuffer_Unlock(sample->u.mf.buffer); + IMFMediaBuffer_Release(sample->u.mf.buffer); + IMFSample_Release(sample->u.mf.sample); + break; + + default: + FIXME("Unknown wg_sample %p, type %u\n", wg_sample, sample->type); + break; + }
free(sample); } @@ -161,17 +185,20 @@ HRESULT wg_transform_push_mf(struct wg_transform *transform, struct wg_sample *w UINT32 value; HRESULT hr;
- if (SUCCEEDED(IMFSample_GetSampleTime(sample->sample, &time))) + if (sample->type != WG_SAMPLE_TYPE_MF) + return E_INVALIDARG; + + if (SUCCEEDED(IMFSample_GetSampleTime(sample->u.mf.sample, &time))) { sample->wg_sample.flags |= WG_SAMPLE_FLAG_HAS_PTS; sample->wg_sample.pts = time; } - if (SUCCEEDED(IMFSample_GetSampleDuration(sample->sample, &duration))) + if (SUCCEEDED(IMFSample_GetSampleDuration(sample->u.mf.sample, &duration))) { sample->wg_sample.flags |= WG_SAMPLE_FLAG_HAS_DURATION; sample->wg_sample.duration = duration; } - if (SUCCEEDED(IMFSample_GetUINT32(sample->sample, &MFSampleExtension_CleanPoint, &value)) && value) + if (SUCCEEDED(IMFSample_GetUINT32(sample->u.mf.sample, &MFSampleExtension_CleanPoint, &value)) && value) sample->wg_sample.flags |= WG_SAMPLE_FLAG_SYNC_POINT;
wg_sample_queue_begin_append(queue, wg_sample); @@ -187,17 +214,20 @@ HRESULT wg_transform_read_mf(struct wg_transform *transform, struct wg_sample *w struct sample *sample = CONTAINING_RECORD(wg_sample, struct sample, wg_sample); HRESULT hr;
+ if (sample->type != WG_SAMPLE_TYPE_MF) + return E_INVALIDARG; + if (FAILED(hr = wg_transform_read_data(transform, wg_sample, format))) return hr;
- IMFMediaBuffer_SetCurrentLength(sample->media_buffer, wg_sample->size); + IMFMediaBuffer_SetCurrentLength(sample->u.mf.buffer, wg_sample->size);
if (wg_sample->flags & WG_SAMPLE_FLAG_HAS_PTS) - IMFSample_SetSampleTime(sample->sample, wg_sample->pts); + IMFSample_SetSampleTime(sample->u.mf.sample, wg_sample->pts); if (wg_sample->flags & WG_SAMPLE_FLAG_HAS_DURATION) - IMFSample_SetSampleDuration(sample->sample, wg_sample->duration); + IMFSample_SetSampleDuration(sample->u.mf.sample, wg_sample->duration); if (wg_sample->flags & WG_SAMPLE_FLAG_SYNC_POINT) - IMFSample_SetUINT32(sample->sample, &MFSampleExtension_CleanPoint, 1); + IMFSample_SetUINT32(sample->u.mf.sample, &MFSampleExtension_CleanPoint, 1);
return S_OK; }