Skip to content

Commit 9192b3b

Browse files
rbernonjulliard
authored andcommitted
winegstreamer: Create transforms from MFVIDEOFORMAT / WAVEFORMATEX.
Instead of going through a custom intermediate format.
1 parent 0906f69 commit 9192b3b

File tree

6 files changed

+168
-191
lines changed

6 files changed

+168
-191
lines changed

dlls/winegstreamer/gst_private.h

-2
Original file line numberDiff line numberDiff line change
@@ -81,8 +81,6 @@ char *wg_parser_stream_get_tag(wg_parser_stream_t stream, enum wg_parser_tag tag
8181
void wg_parser_stream_seek(wg_parser_stream_t stream, double rate,
8282
uint64_t start_pos, uint64_t stop_pos, DWORD start_flags, DWORD stop_flags);
8383

84-
wg_transform_t wg_transform_create(const struct wg_format *input_format,
85-
const struct wg_format *output_format, const struct wg_transform_attrs *attrs);
8684
HRESULT wg_transform_create_mf(IMFMediaType *input_type, IMFMediaType *output_type,
8785
const struct wg_transform_attrs *attrs, wg_transform_t *transform);
8886
HRESULT wg_transform_create_quartz(const AM_MEDIA_TYPE *input_format, const AM_MEDIA_TYPE *output_format,

dlls/winegstreamer/main.c

+72-61
Original file line numberDiff line numberDiff line change
@@ -435,55 +435,59 @@ void wg_parser_stream_seek(wg_parser_stream_t stream, double rate,
435435
WINE_UNIX_CALL(unix_wg_parser_stream_seek, &params);
436436
}
437437

438-
wg_transform_t wg_transform_create(const struct wg_format *input_format,
439-
const struct wg_format *output_format, const struct wg_transform_attrs *attrs)
438+
HRESULT wg_transform_create_mf(IMFMediaType *input_type, IMFMediaType *output_type,
439+
const struct wg_transform_attrs *attrs, wg_transform_t *transform)
440440
{
441441
struct wg_transform_create_params params =
442442
{
443-
.input_format = input_format,
444-
.output_format = output_format,
445-
.attrs = attrs,
443+
.attrs = *attrs,
446444
};
445+
NTSTATUS status;
446+
HRESULT hr;
447447

448-
TRACE("input_format %p, output_format %p.\n", input_format, output_format);
449-
450-
if (WINE_UNIX_CALL(unix_wg_transform_create, &params))
451-
return 0;
448+
TRACE("input_type %p, output_type %p.\n", input_type, output_type);
452449

453-
TRACE("Returning transform %#I64x.\n", params.transform);
454-
return params.transform;
455-
}
456-
457-
HRESULT wg_transform_create_mf(IMFMediaType *input_type, IMFMediaType *output_type,
458-
const struct wg_transform_attrs *attrs, wg_transform_t *transform)
459-
{
460-
struct wg_format input_format, output_format;
450+
if (FAILED(hr = wg_media_type_from_mf(input_type, &params.input_type)))
451+
return hr;
452+
if (FAILED(hr = wg_media_type_from_mf(output_type, &params.output_type)))
453+
{
454+
CoTaskMemFree(params.input_type.u.format);
455+
return hr;
456+
}
461457

462-
mf_media_type_to_wg_format(input_type, &input_format);
463-
if (input_format.major_type == WG_MAJOR_TYPE_UNKNOWN)
464-
return MF_E_INVALIDMEDIATYPE;
465-
mf_media_type_to_wg_format(output_type, &output_format);
466-
if (output_format.major_type == WG_MAJOR_TYPE_UNKNOWN)
467-
return MF_E_INVALIDMEDIATYPE;
458+
if ((status = WINE_UNIX_CALL(unix_wg_transform_create, &params)))
459+
{
460+
WARN("Failed to create transform, status %#lx\n", status);
461+
hr = HRESULT_FROM_NT(status);
462+
}
468463

469-
if (!(*transform = wg_transform_create(&input_format, &output_format, attrs)))
470-
return E_FAIL;
471-
return S_OK;
464+
CoTaskMemFree(params.output_type.u.format);
465+
CoTaskMemFree(params.input_type.u.format);
466+
*transform = params.transform;
467+
return hr;
472468
}
473469

474-
HRESULT wg_transform_create_quartz(const AM_MEDIA_TYPE *input_type, const AM_MEDIA_TYPE *output_type,
470+
HRESULT wg_transform_create_quartz(const AM_MEDIA_TYPE *input_format, const AM_MEDIA_TYPE *output_format,
475471
const struct wg_transform_attrs *attrs, wg_transform_t *transform)
476472
{
477-
struct wg_format input_format, output_format;
473+
IMFMediaType *input_type, *output_type;
474+
HRESULT hr;
478475

479-
if (!amt_to_wg_format(input_type, &input_format))
480-
return E_FAIL;
481-
if (!amt_to_wg_format(output_type, &output_format))
482-
return E_FAIL;
476+
TRACE("input_format %p, output_format %p.\n", input_format, output_format);
483477

484-
if (!(*transform = wg_transform_create(&input_format, &output_format, attrs)))
485-
return E_FAIL;
486-
return S_OK;
478+
/* through IMFMediaType to normalize representation to MFVIDEOFORMAT / WAVEFORMATEX */
479+
if (FAILED(hr = MFCreateMediaTypeFromRepresentation(AM_MEDIA_TYPE_REPRESENTATION, (void *)input_format, &input_type)))
480+
return 0;
481+
if (FAILED(hr = MFCreateMediaTypeFromRepresentation(AM_MEDIA_TYPE_REPRESENTATION, (void *)output_format, &output_type)))
482+
{
483+
IMFMediaType_Release(input_type);
484+
return 0;
485+
}
486+
487+
hr = wg_transform_create_mf(input_type, output_type, attrs, transform);
488+
IMFMediaType_Release(output_type);
489+
IMFMediaType_Release(input_type);
490+
return hr;
487491
}
488492

489493
void wg_transform_destroy(wg_transform_t transform)
@@ -773,54 +777,61 @@ HRESULT wg_muxer_finalize(wg_muxer_t muxer)
773777
return S_OK;
774778
}
775779

776-
HRESULT check_audio_transform_support(const WAVEFORMATEX *input, const WAVEFORMATEX *output)
780+
static HRESULT check_transform_support(const struct wg_media_type *input, const struct wg_media_type *output)
777781
{
778782
IMFMediaType *input_type, *output_type;
779783
struct wg_transform_attrs attrs = {0};
780784
wg_transform_t transform;
781785
HRESULT hr;
782786

783-
if (FAILED(hr = MFCreateMediaType(&input_type)))
787+
if (FAILED(hr = wg_media_type_to_mf(input, &input_type)))
784788
return hr;
785-
if (FAILED(hr = MFCreateMediaType(&output_type)))
789+
if (FAILED(hr = wg_media_type_to_mf(output, &output_type)))
786790
{
787791
IMFMediaType_Release(input_type);
788792
return hr;
789793
}
790794

791-
if (SUCCEEDED(hr = MFInitMediaTypeFromWaveFormatEx(input_type, input, sizeof(*input) + input->cbSize))
792-
&& SUCCEEDED(hr = MFInitMediaTypeFromWaveFormatEx(output_type, output, sizeof(*output) + output->cbSize))
793-
&& SUCCEEDED(hr = wg_transform_create_mf(input_type, output_type, &attrs, &transform)))
795+
if (SUCCEEDED(hr = wg_transform_create_mf(input_type, output_type, &attrs, &transform)))
794796
wg_transform_destroy(transform);
795797

796798
IMFMediaType_Release(output_type);
797799
IMFMediaType_Release(input_type);
798800
return hr;
799801
}
800802

801-
HRESULT check_video_transform_support(const MFVIDEOFORMAT *input, const MFVIDEOFORMAT *output)
803+
HRESULT check_audio_transform_support(const WAVEFORMATEX *input, const WAVEFORMATEX *output)
802804
{
803-
IMFMediaType *input_type, *output_type;
804-
struct wg_transform_attrs attrs = {0};
805-
wg_transform_t transform;
806-
HRESULT hr;
807-
808-
if (FAILED(hr = MFCreateMediaType(&input_type)))
809-
return hr;
810-
if (FAILED(hr = MFCreateMediaType(&output_type)))
805+
const struct wg_media_type input_type =
811806
{
812-
IMFMediaType_Release(input_type);
813-
return hr;
814-
}
815-
816-
if (SUCCEEDED(hr = MFInitMediaTypeFromMFVideoFormat(input_type, input, input->dwSize))
817-
&& SUCCEEDED(hr = MFInitMediaTypeFromMFVideoFormat(output_type, output, output->dwSize))
818-
&& SUCCEEDED(hr = wg_transform_create_mf(input_type, output_type, &attrs, &transform)))
819-
wg_transform_destroy(transform);
807+
.major = MFMediaType_Audio,
808+
.format_size = sizeof(*input) + input->cbSize,
809+
.u.audio = (WAVEFORMATEX *)input,
810+
};
811+
const struct wg_media_type output_type =
812+
{
813+
.major = MFMediaType_Audio,
814+
.format_size = sizeof(*output) + output->cbSize,
815+
.u.audio = (WAVEFORMATEX *)output,
816+
};
817+
return check_transform_support(&input_type, &output_type);
818+
}
820819

821-
IMFMediaType_Release(output_type);
822-
IMFMediaType_Release(input_type);
823-
return hr;
820+
HRESULT check_video_transform_support(const MFVIDEOFORMAT *input, const MFVIDEOFORMAT *output)
821+
{
822+
const struct wg_media_type input_type =
823+
{
824+
.major = MFMediaType_Video,
825+
.format_size = input->dwSize,
826+
.u.video = (MFVIDEOFORMAT *)input,
827+
};
828+
const struct wg_media_type output_type =
829+
{
830+
.major = MFMediaType_Video,
831+
.format_size = output->dwSize,
832+
.u.video = (MFVIDEOFORMAT *)output,
833+
};
834+
return check_transform_support(&input_type, &output_type);
824835
}
825836

826837
#define ALIGN(n, alignment) (((n) + (alignment) - 1) & ~((alignment) - 1))

dlls/winegstreamer/quartz_transform.c

+10-15
Original file line numberDiff line numberDiff line change
@@ -874,31 +874,26 @@ static const struct transform_ops mpeg_video_codec_transform_ops =
874874

875875
HRESULT mpeg_video_codec_create(IUnknown *outer, IUnknown **out)
876876
{
877-
static const struct wg_format output_format =
877+
const MFVIDEOFORMAT output_format =
878878
{
879-
.major_type = WG_MAJOR_TYPE_VIDEO,
880-
.u.video = {
881-
.format = WG_VIDEO_FORMAT_I420,
882-
/* size doesn't matter, this one is only used to check if the GStreamer plugin exists */
883-
},
879+
.dwSize = sizeof(MFVIDEOFORMAT),
880+
.videoInfo = {.dwWidth = 1920, .dwHeight = 1080},
881+
.guidFormat = MEDIASUBTYPE_NV12,
884882
};
885-
static const struct wg_format input_format =
883+
const MFVIDEOFORMAT input_format =
886884
{
887-
.major_type = WG_MAJOR_TYPE_VIDEO_MPEG1,
888-
.u.video = {},
885+
.dwSize = sizeof(MFVIDEOFORMAT),
886+
.videoInfo = {.dwWidth = 1920, .dwHeight = 1080},
887+
.guidFormat = MEDIASUBTYPE_MPEG1Payload,
889888
};
890-
struct wg_transform_attrs attrs = {0};
891-
wg_transform_t transform;
892889
struct transform *object;
893890
HRESULT hr;
894891

895-
transform = wg_transform_create(&input_format, &output_format, &attrs);
896-
if (!transform)
892+
if (FAILED(hr = check_video_transform_support(&input_format, &output_format)))
897893
{
898894
ERR_(winediag)("GStreamer doesn't support MPEG-1 video decoding, please install appropriate plugins.\n");
899-
return E_FAIL;
895+
return hr;
900896
}
901-
wg_transform_destroy(transform);
902897

903898
hr = transform_create(outer, &CLSID_CMpegVideoCodec, &mpeg_video_codec_transform_ops, &object);
904899
if (FAILED(hr))

dlls/winegstreamer/unixlib.h

+3-3
Original file line numberDiff line numberDiff line change
@@ -340,9 +340,9 @@ struct wg_transform_attrs
340340
struct wg_transform_create_params
341341
{
342342
wg_transform_t transform;
343-
const struct wg_format *input_format;
344-
const struct wg_format *output_format;
345-
const struct wg_transform_attrs *attrs;
343+
struct wg_media_type input_type;
344+
struct wg_media_type output_type;
345+
struct wg_transform_attrs attrs;
346346
};
347347

348348
struct wg_transform_push_data_params

dlls/winegstreamer/wg_parser.c

+16-6
Original file line numberDiff line numberDiff line change
@@ -2058,15 +2058,25 @@ NTSTATUS wow64_wg_transform_create(void *args)
20582058
struct
20592059
{
20602060
wg_transform_t transform;
2061-
PTR32 input_format;
2062-
PTR32 output_format;
2063-
PTR32 attrs;
2061+
struct wg_media_type32 input_type;
2062+
struct wg_media_type32 output_type;
2063+
struct wg_transform_attrs attrs;
20642064
} *params32 = args;
20652065
struct wg_transform_create_params params =
20662066
{
2067-
.input_format = ULongToPtr(params32->input_format),
2068-
.output_format = ULongToPtr(params32->output_format),
2069-
.attrs = ULongToPtr(params32->attrs),
2067+
.input_type =
2068+
{
2069+
.major = params32->input_type.major,
2070+
.format_size = params32->input_type.format_size,
2071+
.u.format = ULongToPtr(params32->input_type.format),
2072+
},
2073+
.output_type =
2074+
{
2075+
.major = params32->output_type.major,
2076+
.format_size = params32->output_type.format_size,
2077+
.u.format = ULongToPtr(params32->output_type.format),
2078+
},
2079+
.attrs = params32->attrs,
20702080
};
20712081
NTSTATUS ret;
20722082

0 commit comments

Comments
 (0)