From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winegstreamer/mfplat.c | 16 ++------ dlls/winegstreamer/quartz_parser.c | 65 ++++++++---------------------- dlls/winegstreamer/unixlib.h | 63 ++++++++++++++++++----------- dlls/winegstreamer/wg_format.c | 45 ++++----------------- 4 files changed, 66 insertions(+), 123 deletions(-)
diff --git a/dlls/winegstreamer/mfplat.c b/dlls/winegstreamer/mfplat.c index 7e83d570f06..634d3721788 100644 --- a/dlls/winegstreamer/mfplat.c +++ b/dlls/winegstreamer/mfplat.c @@ -371,19 +371,9 @@ static const struct } video_formats[] = { - {&MFVideoFormat_ARGB32, WG_VIDEO_FORMAT_BGRA}, - {&MFVideoFormat_RGB32, WG_VIDEO_FORMAT_BGRx}, - {&MFVideoFormat_RGB24, WG_VIDEO_FORMAT_BGR}, - {&MFVideoFormat_RGB555, WG_VIDEO_FORMAT_RGB15}, - {&MFVideoFormat_RGB565, WG_VIDEO_FORMAT_RGB16}, - {&MFVideoFormat_AYUV, WG_VIDEO_FORMAT_AYUV}, - {&MFVideoFormat_I420, WG_VIDEO_FORMAT_I420}, - {&MFVideoFormat_IYUV, WG_VIDEO_FORMAT_I420}, - {&MFVideoFormat_NV12, WG_VIDEO_FORMAT_NV12}, - {&MFVideoFormat_UYVY, WG_VIDEO_FORMAT_UYVY}, - {&MFVideoFormat_YUY2, WG_VIDEO_FORMAT_YUY2}, - {&MFVideoFormat_YV12, WG_VIDEO_FORMAT_YV12}, - {&MFVideoFormat_YVYU, WG_VIDEO_FORMAT_YVYU}, +#define X(x, g, d, t) {&MFVideoFormat_ ## g, WG_VIDEO_FORMAT_ ## x}, + FOR_EACH_WG_VIDEO_FORMAT(X) +#undef X };
static const struct diff --git a/dlls/winegstreamer/quartz_parser.c b/dlls/winegstreamer/quartz_parser.c index 55e5988e880..3816895387f 100644 --- a/dlls/winegstreamer/quartz_parser.c +++ b/dlls/winegstreamer/quartz_parser.c @@ -377,19 +377,10 @@ static const GUID *wg_video_format_get_mediasubtype(enum wg_video_format format) { switch (format) { +#define X(x, g, d, t) case WG_VIDEO_FORMAT_ ## x: return &MEDIASUBTYPE_ ## g; + FOR_EACH_WG_VIDEO_FORMAT(X) +#undef X case WG_VIDEO_FORMAT_UNKNOWN: return &GUID_NULL; - case WG_VIDEO_FORMAT_BGRA: return &MEDIASUBTYPE_ARGB32; - case WG_VIDEO_FORMAT_BGRx: return &MEDIASUBTYPE_RGB32; - case WG_VIDEO_FORMAT_BGR: return &MEDIASUBTYPE_RGB24; - case WG_VIDEO_FORMAT_RGB15: return &MEDIASUBTYPE_RGB555; - case WG_VIDEO_FORMAT_RGB16: return &MEDIASUBTYPE_RGB565; - case WG_VIDEO_FORMAT_AYUV: return &MEDIASUBTYPE_AYUV; - case WG_VIDEO_FORMAT_I420: return &MEDIASUBTYPE_I420; - case WG_VIDEO_FORMAT_NV12: return &MEDIASUBTYPE_NV12; - case WG_VIDEO_FORMAT_UYVY: return &MEDIASUBTYPE_UYVY; - case WG_VIDEO_FORMAT_YUY2: return &MEDIASUBTYPE_YUY2; - case WG_VIDEO_FORMAT_YV12: return &MEDIASUBTYPE_YV12; - case WG_VIDEO_FORMAT_YVYU: return &MEDIASUBTYPE_YVYU; }
assert(0); @@ -400,19 +391,14 @@ static DWORD wg_video_format_get_compression(enum wg_video_format format) { switch (format) { +#define X_RGB(g) BI_RGB +#define X_YUV(g) MEDIASUBTYPE_ ## g.Data1 +#define X(x, g, d, t) case WG_VIDEO_FORMAT_ ## x: return X_ ## t(g); + FOR_EACH_WG_VIDEO_FORMAT(X) +#undef X +#undef X_YUV +#undef X_RGB case WG_VIDEO_FORMAT_UNKNOWN: return 0; - case WG_VIDEO_FORMAT_BGRA: return BI_RGB; - case WG_VIDEO_FORMAT_BGRx: return BI_RGB; - case WG_VIDEO_FORMAT_BGR: return BI_RGB; - case WG_VIDEO_FORMAT_RGB15: return BI_RGB; - case WG_VIDEO_FORMAT_RGB16: return BI_BITFIELDS; - case WG_VIDEO_FORMAT_AYUV: return mmioFOURCC('A','Y','U','V'); - case WG_VIDEO_FORMAT_I420: return mmioFOURCC('I','4','2','0'); - case WG_VIDEO_FORMAT_NV12: return mmioFOURCC('N','V','1','2'); - case WG_VIDEO_FORMAT_UYVY: return mmioFOURCC('U','Y','V','Y'); - case WG_VIDEO_FORMAT_YUY2: return mmioFOURCC('Y','U','Y','2'); - case WG_VIDEO_FORMAT_YV12: return mmioFOURCC('Y','V','1','2'); - case WG_VIDEO_FORMAT_YVYU: return mmioFOURCC('Y','V','Y','U'); }
assert(0); @@ -423,19 +409,10 @@ static WORD wg_video_format_get_depth(enum wg_video_format format) { switch (format) { +#define X(x, g, d, t) case WG_VIDEO_FORMAT_ ## x: return d; + FOR_EACH_WG_VIDEO_FORMAT(X) +#undef X case WG_VIDEO_FORMAT_UNKNOWN: return 0; - case WG_VIDEO_FORMAT_BGRA: return 32; - case WG_VIDEO_FORMAT_BGRx: return 32; - case WG_VIDEO_FORMAT_BGR: return 24; - case WG_VIDEO_FORMAT_RGB15: return 16; - case WG_VIDEO_FORMAT_RGB16: return 16; - case WG_VIDEO_FORMAT_AYUV: return 32; - case WG_VIDEO_FORMAT_I420: return 12; - case WG_VIDEO_FORMAT_NV12: return 12; - case WG_VIDEO_FORMAT_UYVY: return 16; - case WG_VIDEO_FORMAT_YUY2: return 16; - case WG_VIDEO_FORMAT_YV12: return 12; - case WG_VIDEO_FORMAT_YVYU: return 16; }
assert(0); @@ -484,6 +461,7 @@ static bool amt_from_wg_format_video(AM_MEDIA_TYPE *mt, const struct wg_format * if (format->u.video.format == WG_VIDEO_FORMAT_RGB16) { mt->cbFormat = offsetof(VIDEOINFO, dwBitMasks[3]); + video_format->bmiHeader.biCompression = BI_BITFIELDS; video_format->dwBitMasks[iRED] = 0xf800; video_format->dwBitMasks[iGREEN] = 0x07e0; video_format->dwBitMasks[iBLUE] = 0x001f; @@ -674,18 +652,9 @@ static bool amt_to_wg_format_video(const AM_MEDIA_TYPE *mt, struct wg_format *fo } format_map[] = { - {&MEDIASUBTYPE_ARGB32, WG_VIDEO_FORMAT_BGRA}, - {&MEDIASUBTYPE_RGB32, WG_VIDEO_FORMAT_BGRx}, - {&MEDIASUBTYPE_RGB24, WG_VIDEO_FORMAT_BGR}, - {&MEDIASUBTYPE_RGB555, WG_VIDEO_FORMAT_RGB15}, - {&MEDIASUBTYPE_RGB565, WG_VIDEO_FORMAT_RGB16}, - {&MEDIASUBTYPE_AYUV, WG_VIDEO_FORMAT_AYUV}, - {&MEDIASUBTYPE_I420, WG_VIDEO_FORMAT_I420}, - {&MEDIASUBTYPE_NV12, WG_VIDEO_FORMAT_NV12}, - {&MEDIASUBTYPE_UYVY, WG_VIDEO_FORMAT_UYVY}, - {&MEDIASUBTYPE_YUY2, WG_VIDEO_FORMAT_YUY2}, - {&MEDIASUBTYPE_YV12, WG_VIDEO_FORMAT_YV12}, - {&MEDIASUBTYPE_YVYU, WG_VIDEO_FORMAT_YVYU}, +#define X(x, g, d, t) {&MEDIASUBTYPE_ ## g, WG_VIDEO_FORMAT_ ## x}, + FOR_EACH_WG_VIDEO_FORMAT(X) +#undef X };
const VIDEOINFOHEADER *video_format = (const VIDEOINFOHEADER *)mt->pbFormat; diff --git a/dlls/winegstreamer/unixlib.h b/dlls/winegstreamer/unixlib.h index 9ec992368b9..f91fb986322 100644 --- a/dlls/winegstreamer/unixlib.h +++ b/dlls/winegstreamer/unixlib.h @@ -30,6 +30,37 @@
#include "wine/unixlib.h"
+/* List all supported raw video formats, with their metadata. + * + * Each element should be X(wg, guid, depth, type), with: + * wg: suffix of the GStreamer constant, and enum wg_video_format value. + * guid: suffix of the corresponding MEDIASUBTYPE / MFVideoFormat guid. + * depth: the number of bits of each video sample. + * type: whether the video format is RGB or YUV. + * + */ +#define FOR_EACH_WG_VIDEO_FORMAT(F) \ + F(BGRA, ARGB32, 32, RGB) \ + F(BGRx, RGB32, 32, RGB) \ + F(BGR, RGB24, 24, RGB) \ + F(RGB15, RGB555, 16, RGB) \ + F(RGB16, RGB565, 16, RGB) \ + F(AYUV, AYUV, 32, YUV) \ + F(I420, I420, 12, YUV) \ + F(NV12, NV12, 12, YUV) \ + F(UYVY, UYVY, 16, YUV) \ + F(YUY2, YUY2, 16, YUV) \ + F(YV12, YV12, 12, YUV) \ + F(YVYU, YVYU, 16, YUV) \ + +enum wg_video_format +{ + WG_VIDEO_FORMAT_UNKNOWN = 0, +#define X(x, g, d, t) WG_VIDEO_FORMAT_ ## x, + FOR_EACH_WG_VIDEO_FORMAT(X) +#undef X +}; + struct wg_format { enum wg_major_type @@ -45,30 +76,6 @@ struct wg_format
union { - struct - { - enum wg_video_format - { - WG_VIDEO_FORMAT_UNKNOWN, - - WG_VIDEO_FORMAT_BGRA, - WG_VIDEO_FORMAT_BGRx, - WG_VIDEO_FORMAT_BGR, - WG_VIDEO_FORMAT_RGB15, - WG_VIDEO_FORMAT_RGB16, - - WG_VIDEO_FORMAT_AYUV, - WG_VIDEO_FORMAT_I420, - WG_VIDEO_FORMAT_NV12, - WG_VIDEO_FORMAT_UYVY, - WG_VIDEO_FORMAT_YUY2, - WG_VIDEO_FORMAT_YV12, - WG_VIDEO_FORMAT_YVYU, - } format; - int32_t width, height; - uint32_t fps_n, fps_d; - RECT padding; - } video; struct { enum wg_audio_format @@ -104,6 +111,14 @@ struct wg_format uint32_t codec_data_len; unsigned char codec_data[64]; } audio_wma; + + struct + { + enum wg_video_format format; + int32_t width, height; + uint32_t fps_n, fps_d; + RECT padding; + } video; struct { uint32_t width; diff --git a/dlls/winegstreamer/wg_format.c b/dlls/winegstreamer/wg_format.c index b67c820dd71..50c5d1ba256 100644 --- a/dlls/winegstreamer/wg_format.c +++ b/dlls/winegstreamer/wg_format.c @@ -138,32 +138,10 @@ static enum wg_video_format wg_video_format_from_gst(GstVideoFormat format) { switch (format) { - case GST_VIDEO_FORMAT_BGRA: - return WG_VIDEO_FORMAT_BGRA; - case GST_VIDEO_FORMAT_BGRx: - return WG_VIDEO_FORMAT_BGRx; - case GST_VIDEO_FORMAT_BGR: - return WG_VIDEO_FORMAT_BGR; - case GST_VIDEO_FORMAT_RGB15: - return WG_VIDEO_FORMAT_RGB15; - case GST_VIDEO_FORMAT_RGB16: - return WG_VIDEO_FORMAT_RGB16; - case GST_VIDEO_FORMAT_AYUV: - return WG_VIDEO_FORMAT_AYUV; - case GST_VIDEO_FORMAT_I420: - return WG_VIDEO_FORMAT_I420; - case GST_VIDEO_FORMAT_NV12: - return WG_VIDEO_FORMAT_NV12; - case GST_VIDEO_FORMAT_UYVY: - return WG_VIDEO_FORMAT_UYVY; - case GST_VIDEO_FORMAT_YUY2: - return WG_VIDEO_FORMAT_YUY2; - case GST_VIDEO_FORMAT_YV12: - return WG_VIDEO_FORMAT_YV12; - case GST_VIDEO_FORMAT_YVYU: - return WG_VIDEO_FORMAT_YVYU; - default: - return WG_VIDEO_FORMAT_UNKNOWN; +#define X(x, g, d, t) case GST_VIDEO_FORMAT_ ## x: return WG_VIDEO_FORMAT_ ## x; + FOR_EACH_WG_VIDEO_FORMAT(X) +#undef X + default: return WG_VIDEO_FORMAT_UNKNOWN; } }
@@ -364,18 +342,9 @@ static GstVideoFormat wg_video_format_to_gst(enum wg_video_format format) { switch (format) { - case WG_VIDEO_FORMAT_BGRA: return GST_VIDEO_FORMAT_BGRA; - case WG_VIDEO_FORMAT_BGRx: return GST_VIDEO_FORMAT_BGRx; - case WG_VIDEO_FORMAT_BGR: return GST_VIDEO_FORMAT_BGR; - case WG_VIDEO_FORMAT_RGB15: return GST_VIDEO_FORMAT_RGB15; - case WG_VIDEO_FORMAT_RGB16: return GST_VIDEO_FORMAT_RGB16; - case WG_VIDEO_FORMAT_AYUV: return GST_VIDEO_FORMAT_AYUV; - case WG_VIDEO_FORMAT_I420: return GST_VIDEO_FORMAT_I420; - case WG_VIDEO_FORMAT_NV12: return GST_VIDEO_FORMAT_NV12; - case WG_VIDEO_FORMAT_UYVY: return GST_VIDEO_FORMAT_UYVY; - case WG_VIDEO_FORMAT_YUY2: return GST_VIDEO_FORMAT_YUY2; - case WG_VIDEO_FORMAT_YV12: return GST_VIDEO_FORMAT_YV12; - case WG_VIDEO_FORMAT_YVYU: return GST_VIDEO_FORMAT_YVYU; +#define X(x, g, d, t) case WG_VIDEO_FORMAT_ ## x: return GST_VIDEO_FORMAT_ ## x; + FOR_EACH_WG_VIDEO_FORMAT(X) +#undef X default: return GST_VIDEO_FORMAT_UNKNOWN; } }