winegstreamer: Support MFVideoFormat_ABGR32 output in the video processor.

This commit is contained in:
Rémi Bernon 2024-05-10 17:12:17 +02:00 committed by Alexandre Julliard
parent cc57b05d47
commit f131faaa5a
7 changed files with 24 additions and 7 deletions

View file

@ -773,9 +773,9 @@ static void check_mft_set_output_type_required_(int line, IMFTransform *transfor
ok_(__FILE__, line)(!ref, "Release returned %lu\n", ref);
}
#define check_mft_set_output_type(a, b, c) check_mft_set_output_type_(__LINE__, a, b, c, FALSE, FALSE)
#define check_mft_set_output_type(a, b, c) check_mft_set_output_type_(__LINE__, a, b, c, FALSE)
static void check_mft_set_output_type_(int line, IMFTransform *transform, const struct attribute_desc *attributes,
HRESULT expect_hr, BOOL todo_test, BOOL todo)
HRESULT expect_hr, BOOL todo)
{
IMFMediaType *media_type;
HRESULT hr;
@ -785,7 +785,6 @@ static void check_mft_set_output_type_(int line, IMFTransform *transform, const
init_media_type(media_type, attributes, -1);
hr = IMFTransform_SetOutputType(transform, 0, media_type, MFT_SET_TYPE_TEST_ONLY);
todo_wine_if(todo_test)
ok_(__FILE__, line)(hr == expect_hr, "SetOutputType returned %#lx.\n", hr);
hr = IMFTransform_SetOutputType(transform, 0, media_type, 0);
todo_wine_if(todo)
@ -7942,6 +7941,7 @@ static void test_video_processor(void)
for (; k < ARRAY_SIZE(expect_available_outputs); k++)
if (IsEqualGUID(&expect_available_outputs[k], &guid))
break;
todo_wine_if(IsEqualGUID(&guid, &MFVideoFormat_ABGR32)) /* enumerated on purpose on Wine */
ok(k < ARRAY_SIZE(expect_available_outputs), "got subtype %s\n", debugstr_guid(&guid));
ret = IMFMediaType_Release(media_type);
@ -7962,7 +7962,7 @@ static void test_video_processor(void)
hr = IMFMediaType_SetGUID(media_type, &MF_MT_SUBTYPE, &MFVideoFormat_ABGR32);
ok(hr == S_OK, "got %#lx\n", hr);
hr = IMFTransform_SetOutputType(transform, 0, media_type, 0);
ok(hr == MF_E_INVALIDMEDIATYPE, "got %#lx\n", hr);
todo_wine ok(hr == MF_E_INVALIDMEDIATYPE, "got %#lx\n", hr);
IMFMediaType_Release(media_type);
/* MFVideoFormat_RGB32 output format works */
@ -9292,7 +9292,7 @@ static void test_video_processor_with_dxgi_manager(void)
hr = IMFMediaType_SetUINT64(type, &MF_MT_FRAME_SIZE, (UINT64)96 << 32 | 96);
ok(hr == S_OK, "got %#lx\n", hr);
hr = IMFTransform_SetOutputType(transform, 0, type, 0);
todo_wine ok(hr == S_OK, "got %#lx\n", hr);
ok(hr == S_OK, "got %#lx\n", hr);
IMFMediaType_Release(type);
@ -9445,7 +9445,7 @@ static void test_video_processor_with_dxgi_manager(void)
/* check RGB32 output aperture cropping with D3D buffers */
check_mft_set_input_type(transform, nv12_with_aperture);
check_mft_set_output_type_(__LINE__, transform, rgb32_no_aperture, S_OK, FALSE, TRUE);
check_mft_set_output_type_(__LINE__, transform, rgb32_no_aperture, S_OK, TRUE);
load_resource(L"nv12frame.bmp", &nv12frame_data, &nv12frame_data_len);
/* skip BMP header and RGB data from the dump */
@ -9513,7 +9513,7 @@ skip_rgb32:
/* check ABGR32 output with D3D buffers */
check_mft_set_input_type(transform, nv12_with_aperture);
check_mft_set_output_type_(__LINE__, transform, abgr32_no_aperture, S_OK, TRUE, TRUE);
check_mft_set_output_type_(__LINE__, transform, abgr32_no_aperture, S_OK, TRUE);
load_resource(L"nv12frame.bmp", &nv12frame_data, &nv12frame_data_len);
/* skip BMP header and RGB data from the dump */

View file

@ -699,6 +699,7 @@ unsigned int wg_format_get_stride(const struct wg_format *format)
case WG_VIDEO_FORMAT_BGRA:
case WG_VIDEO_FORMAT_BGRx:
case WG_VIDEO_FORMAT_RGBA:
return width * 4;
case WG_VIDEO_FORMAT_BGR:
@ -734,6 +735,7 @@ bool wg_video_format_is_rgb(enum wg_video_format format)
case WG_VIDEO_FORMAT_BGR:
case WG_VIDEO_FORMAT_RGB15:
case WG_VIDEO_FORMAT_RGB16:
case WG_VIDEO_FORMAT_RGBA:
return true;
default:

View file

@ -41,6 +41,7 @@ DEFINE_GUID(DMOVideoFormat_RGB8,D3DFMT_P8,0x524f,0x11ce,0x9f,0x53,0x00,0x20,0xaf
DEFINE_MEDIATYPE_GUID(MFAudioFormat_RAW_AAC,WAVE_FORMAT_RAW_AAC1);
DEFINE_MEDIATYPE_GUID(MFVideoFormat_VC1S,MAKEFOURCC('V','C','1','S'));
DEFINE_MEDIATYPE_GUID(MFVideoFormat_IV50,MAKEFOURCC('I','V','5','0'));
DEFINE_MEDIATYPE_GUID(MFVideoFormat_ABGR32,D3DFMT_A8B8G8R8);
DEFINE_GUID(MEDIASUBTYPE_WMV_Unknown, 0x7ce12ca9,0xbfbf,0x43d9,0x9d,0x00,0x82,0xb8,0xed,0x54,0x31,0x6b);
struct class_factory
@ -442,6 +443,7 @@ video_formats[] =
{&MFVideoFormat_RGB24, WG_VIDEO_FORMAT_BGR},
{&MFVideoFormat_RGB555, WG_VIDEO_FORMAT_RGB15},
{&MFVideoFormat_RGB565, WG_VIDEO_FORMAT_RGB16},
{&MFVideoFormat_ABGR32, WG_VIDEO_FORMAT_RGBA},
{&MFVideoFormat_AYUV, WG_VIDEO_FORMAT_AYUV},
{&MFVideoFormat_I420, WG_VIDEO_FORMAT_I420},
{&MFVideoFormat_IYUV, WG_VIDEO_FORMAT_I420},

View file

@ -27,6 +27,7 @@
#include <limits.h>
#include "dvdmedia.h"
#include "d3d9types.h"
#include "mmreg.h"
#include "ks.h"
#include "wmcodecdsp.h"
@ -39,6 +40,7 @@ static const GUID MEDIASUBTYPE_CVID = {mmioFOURCC('c','v','i','d'), 0x0000, 0x00
static const GUID MEDIASUBTYPE_VC1S = {mmioFOURCC('V','C','1','S'), 0x0000, 0x0010, {0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}};
static const GUID MEDIASUBTYPE_MP3 = {WAVE_FORMAT_MPEGLAYER3, 0x0000, 0x0010, {0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}};
static const GUID MEDIASUBTYPE_WMV_Unknown = {0x7ce12ca9, 0xbfbf, 0x43d9, {0x9d, 0x00, 0x82, 0xb8, 0xed, 0x54, 0x31, 0x6b}};
DEFINE_GUID(MEDIASUBTYPE_ABGR32,D3DFMT_A8B8G8R8,0x524f,0x11ce,0x9f,0x53,0x00,0x20,0xaf,0x0b,0xa7,0x70);
struct parser
{
@ -349,6 +351,7 @@ static unsigned int wg_format_get_max_size_video_raw(enum wg_video_format format
case WG_VIDEO_FORMAT_BGRA:
case WG_VIDEO_FORMAT_BGRx:
case WG_VIDEO_FORMAT_AYUV:
case WG_VIDEO_FORMAT_RGBA:
return width * height * 4;
case WG_VIDEO_FORMAT_BGR:
@ -478,6 +481,7 @@ static const GUID *wg_video_format_get_mediasubtype(enum wg_video_format format)
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_RGBA: return &MEDIASUBTYPE_ABGR32;
case WG_VIDEO_FORMAT_AYUV: return &MEDIASUBTYPE_AYUV;
case WG_VIDEO_FORMAT_I420: return &MEDIASUBTYPE_I420;
case WG_VIDEO_FORMAT_NV12: return &MEDIASUBTYPE_NV12;
@ -506,6 +510,7 @@ static DWORD wg_video_format_get_compression(enum wg_video_format format)
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_RGBA: return BI_RGB;
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');
@ -529,6 +534,7 @@ static WORD wg_video_format_get_depth(enum wg_video_format format)
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_RGBA: return 32;
case WG_VIDEO_FORMAT_AYUV: return 32;
case WG_VIDEO_FORMAT_I420: return 12;
case WG_VIDEO_FORMAT_NV12: return 12;

View file

@ -68,6 +68,7 @@ enum wg_video_format
WG_VIDEO_FORMAT_BGR,
WG_VIDEO_FORMAT_RGB15,
WG_VIDEO_FORMAT_RGB16,
WG_VIDEO_FORMAT_RGBA,
WG_VIDEO_FORMAT_AYUV,
WG_VIDEO_FORMAT_I420,

View file

@ -28,6 +28,8 @@
WINE_DEFAULT_DEBUG_CHANNEL(mfplat);
WINE_DECLARE_DEBUG_CHANNEL(winediag);
extern GUID MFVideoFormat_ABGR32;
static const GUID *const input_types[] =
{
&MFVideoFormat_IYUV,
@ -66,6 +68,7 @@ static const GUID *const output_types[] =
&MFVideoFormat_AYUV,
&MFVideoFormat_RGB555,
&MFVideoFormat_RGB565,
&MFVideoFormat_ABGR32,
};
struct video_processor

View file

@ -145,6 +145,8 @@ static enum wg_video_format wg_video_format_from_gst(GstVideoFormat format)
return WG_VIDEO_FORMAT_RGB15;
case GST_VIDEO_FORMAT_RGB16:
return WG_VIDEO_FORMAT_RGB16;
case GST_VIDEO_FORMAT_RGBA:
return WG_VIDEO_FORMAT_RGBA;
case GST_VIDEO_FORMAT_AYUV:
return WG_VIDEO_FORMAT_AYUV;
case GST_VIDEO_FORMAT_I420:
@ -568,6 +570,7 @@ static GstVideoFormat wg_video_format_to_gst(enum wg_video_format format)
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_RGBA: return GST_VIDEO_FORMAT_RGBA;
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;