[PATCH 01/16] winegstreamer: Introduce GstCaps -> IMFMediaType converter.
Derek Lesho
dlesho at codeweavers.com
Wed Mar 25 19:12:26 CDT 2020
Signed-off-by: Derek Lesho <dlesho at codeweavers.com>
---
dlls/winegstreamer/gst_private.h | 3 ++
dlls/winegstreamer/mfplat.c | 81 ++++++++++++++++++++++++++++++++
2 files changed, 84 insertions(+)
diff --git a/dlls/winegstreamer/gst_private.h b/dlls/winegstreamer/gst_private.h
index e6fb841fc8..7d693ced9a 100644
--- a/dlls/winegstreamer/gst_private.h
+++ b/dlls/winegstreamer/gst_private.h
@@ -36,6 +36,7 @@
#include "winuser.h"
#include "dshow.h"
#include "strmif.h"
+#include "mfobjects.h"
#include "wine/heap.h"
#include "wine/strmbase.h"
@@ -54,4 +55,6 @@ void start_dispatch_thread(void) DECLSPEC_HIDDEN;
extern HRESULT mfplat_get_class_object(REFCLSID rclsid, REFIID riid, void **obj) DECLSPEC_HIDDEN;
+IMFMediaType* media_type_from_caps(GstCaps *caps);
+
#endif /* __GST_PRIVATE_INCLUDED__ */
diff --git a/dlls/winegstreamer/mfplat.c b/dlls/winegstreamer/mfplat.c
index 55b9b08876..4af50624e0 100644
--- a/dlls/winegstreamer/mfplat.c
+++ b/dlls/winegstreamer/mfplat.c
@@ -16,6 +16,11 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "config.h"
+#include <gst/gst.h>
+
+#include "gst_private.h"
+
#include <stdarg.h>
#include "gst_private.h"
@@ -433,3 +438,79 @@ HRESULT mfplat_get_class_object(REFCLSID rclsid, REFIID riid, void **obj)
return CLASS_E_CLASSNOTAVAILABLE;
}
+
+/* IMPORTANT: caps will be modified to represent the exact type needed for the format */
+IMFMediaType* media_type_from_caps(GstCaps *caps)
+{
+ IMFMediaType *media_type;
+ GstStructure *info;
+ const char *mime_type;
+ gchar *human_readable;
+
+ human_readable = gst_caps_to_string(caps);
+ TRACE("caps = %s\n", human_readable);
+ g_free(human_readable);
+
+ if (FAILED(MFCreateMediaType(&media_type)))
+ {
+ return NULL;
+ }
+
+ info = gst_caps_get_structure(caps, 0);
+ mime_type = gst_structure_get_name(info);
+
+ if (!(strncmp(mime_type, "video", 5)))
+ {
+ gint width, height, framerate_num, framerate_den;
+
+ IMFMediaType_SetGUID(media_type, &MF_MT_MAJOR_TYPE, &MFMediaType_Video);
+
+ if (gst_structure_get_int(info, "width", &width) && gst_structure_get_int(info, "height", &height))
+ {
+ IMFMediaType_SetUINT64(media_type, &MF_MT_FRAME_SIZE, ((UINT64)width << 32) | height);
+ }
+ if (gst_structure_get_fraction(info, "framerate", &framerate_num, &framerate_den))
+ {
+ IMFMediaType_SetUINT64(media_type, &MF_MT_FRAME_RATE, ((UINT64)framerate_num << 32) | framerate_den);
+ }
+
+ if (!(strcmp(mime_type, "video/x-raw")))
+ {
+ const char *fourcc = gst_structure_get_string(info, "stream-format");
+ IMFMediaType_SetUINT32(media_type, &MF_MT_COMPRESSED, FALSE);
+ if (fourcc && (strlen(fourcc) == 4))
+ {
+ GUID fourcc_subtype = MFVideoFormat_Base;
+ fourcc_subtype.Data1 = MAKEFOURCC(
+ toupper(fourcc[0]), toupper(fourcc[1]), toupper(fourcc[2]), toupper(fourcc[3]));
+ IMFMediaType_SetGUID(media_type, &MF_MT_SUBTYPE, &fourcc_subtype);
+ }
+ else
+ ERR("uncompressed video has no stream-format\n");
+ }
+ else
+ ERR("Unrecognized video format %s\n", mime_type);
+ }
+ else if (!(strncmp(mime_type, "audio", 5)))
+ {
+ IMFMediaType_SetGUID(media_type, &MF_MT_MAJOR_TYPE, &MFMediaType_Audio);
+
+ if (!(strcmp(mime_type, "audio/x-raw")))
+ {
+ IMFMediaType_SetGUID(media_type, &MF_MT_SUBTYPE, &MFAudioFormat_Float);
+
+ gst_caps_set_simple(caps, "format", G_TYPE_STRING, "F32LE", NULL);
+ }
+ else
+ ERR("Unrecognized audio format %s\n", mime_type);
+ }
+ else
+ {
+ goto fail;
+ }
+
+ return media_type;
+ fail:
+ IMFMediaType_Release(media_type);
+ return NULL;
+}
--
2.25.1
More information about the wine-devel
mailing list