[PATCH v2 4/8] winegstreamer: Wrap IMFSample in WMA decoder ProcessOutput.
Rémi Bernon
rbernon at codeweavers.com
Wed Feb 23 08:46:35 CST 2022
Using a new wg_sample struct.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=51931
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=52391
Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
dlls/winegstreamer/gst_private.h | 3 ++
dlls/winegstreamer/mfplat.c | 48 ++++++++++++++++++++++++++++++++
dlls/winegstreamer/unixlib.h | 6 ++++
dlls/winegstreamer/wma_decoder.c | 13 ++++++++-
4 files changed, 69 insertions(+), 1 deletion(-)
diff --git a/dlls/winegstreamer/gst_private.h b/dlls/winegstreamer/gst_private.h
index a63daaf04b9..7ad3434fd1d 100644
--- a/dlls/winegstreamer/gst_private.h
+++ b/dlls/winegstreamer/gst_private.h
@@ -119,6 +119,9 @@ extern HRESULT mfplat_DllRegisterServer(void);
IMFMediaType *mf_media_type_from_wg_format(const struct wg_format *format);
void mf_media_type_to_wg_format(IMFMediaType *type, struct wg_format *format);
+HRESULT mf_create_wg_sample(IMFSample *sample, struct wg_sample **out);
+void mf_destroy_wg_sample(struct wg_sample *wg_sample);
+
HRESULT winegstreamer_stream_handler_create(REFIID riid, void **obj);
HRESULT audio_converter_create(REFIID riid, void **ret);
diff --git a/dlls/winegstreamer/mfplat.c b/dlls/winegstreamer/mfplat.c
index 9b3fc429d32..c457a4ee79a 100644
--- a/dlls/winegstreamer/mfplat.c
+++ b/dlls/winegstreamer/mfplat.c
@@ -827,3 +827,51 @@ void mf_media_type_to_wg_format(IMFMediaType *type, struct wg_format *format)
else
FIXME("Unrecognized major type %s.\n", debugstr_guid(&major_type));
}
+
+struct mf_sample
+{
+ IMFSample *sample;
+ IMFMediaBuffer *media_buffer;
+ struct wg_sample wg_sample;
+};
+
+HRESULT mf_create_wg_sample(IMFSample *sample, struct wg_sample **out)
+{
+ DWORD current_length, max_length;
+ struct mf_sample *mf_sample;
+ BYTE *buffer;
+ HRESULT hr;
+
+ if (!(mf_sample = calloc(1, sizeof(*mf_sample))))
+ return E_OUTOFMEMORY;
+ if (FAILED(hr = IMFSample_ConvertToContiguousBuffer(sample, &mf_sample->media_buffer)))
+ goto out_free_sample;
+ if (FAILED(hr = IMFMediaBuffer_Lock(mf_sample->media_buffer, &buffer, &max_length, ¤t_length)))
+ goto out_release_buffer;
+
+ IMFSample_AddRef((mf_sample->sample = sample));
+ mf_sample->wg_sample.size = current_length;
+ mf_sample->wg_sample.max_size = max_length;
+
+ TRACE("Created mf_sample %p for sample %p.\n", mf_sample, sample);
+ *out = &mf_sample->wg_sample;
+ return S_OK;
+
+out_release_buffer:
+ IMFMediaBuffer_Release(mf_sample->media_buffer);
+out_free_sample:
+ free(mf_sample);
+ return hr;
+}
+
+void mf_destroy_wg_sample(struct wg_sample *wg_sample)
+{
+ struct mf_sample *mf_sample = CONTAINING_RECORD(wg_sample, struct mf_sample, wg_sample);
+
+ IMFMediaBuffer_Unlock(mf_sample->media_buffer);
+ IMFMediaBuffer_SetCurrentLength(mf_sample->media_buffer, wg_sample->size);
+ IMFMediaBuffer_Release(mf_sample->media_buffer);
+
+ IMFSample_Release(mf_sample->sample);
+ free(mf_sample);
+}
diff --git a/dlls/winegstreamer/unixlib.h b/dlls/winegstreamer/unixlib.h
index 4adbb694766..5bcad297fa9 100644
--- a/dlls/winegstreamer/unixlib.h
+++ b/dlls/winegstreamer/unixlib.h
@@ -103,6 +103,12 @@ struct wg_format
} u;
};
+struct wg_sample
+{
+ UINT32 max_size;
+ UINT32 size;
+};
+
enum wg_parser_event_type
{
WG_PARSER_EVENT_NONE = 0,
diff --git a/dlls/winegstreamer/wma_decoder.c b/dlls/winegstreamer/wma_decoder.c
index fef10b9c920..ffd05520f8c 100644
--- a/dlls/winegstreamer/wma_decoder.c
+++ b/dlls/winegstreamer/wma_decoder.c
@@ -529,6 +529,7 @@ static HRESULT WINAPI transform_ProcessOutput(IMFTransform *iface, DWORD flags,
{
struct wma_decoder *decoder = impl_from_IMFTransform(iface);
MFT_OUTPUT_STREAM_INFO info;
+ struct wg_sample *wg_sample;
HRESULT hr;
FIXME("iface %p, flags %#lx, count %lu, samples %p, status %p stub!\n", iface, flags, count, samples, status);
@@ -550,7 +551,17 @@ static HRESULT WINAPI transform_ProcessOutput(IMFTransform *iface, DWORD flags,
return MF_E_TRANSFORM_NEED_MORE_INPUT;
}
- return E_NOTIMPL;
+ if (FAILED(hr = mf_create_wg_sample(samples[0].pSample, &wg_sample)))
+ return hr;
+
+ wg_sample->size = 0;
+ if (wg_sample->max_size < info.cbSize)
+ hr = MF_E_BUFFERTOOSMALL;
+ else
+ hr = E_NOTIMPL;
+
+ mf_destroy_wg_sample(wg_sample);
+ return hr;
}
static const IMFTransformVtbl transform_vtbl =
--
2.34.1
More information about the wine-devel
mailing list