From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winegstreamer/mfplat.c | 2 ++ dlls/winegstreamer/quartz_parser.c | 4 +++ dlls/winegstreamer/unixlib.h | 15 ++++++++ dlls/winegstreamer/wg_format.c | 56 ++++++++++++++++++++++++++++++ dlls/winegstreamer/wg_parser.c | 2 ++ dlls/winegstreamer/wg_transform.c | 4 +++ dlls/winegstreamer/wm_reader.c | 8 +++++ 7 files changed, 91 insertions(+)
diff --git a/dlls/winegstreamer/mfplat.c b/dlls/winegstreamer/mfplat.c index e6d9fb9fd2c..38c719bd062 100644 --- a/dlls/winegstreamer/mfplat.c +++ b/dlls/winegstreamer/mfplat.c @@ -570,6 +570,8 @@ IMFMediaType *mf_media_type_from_wg_format(const struct wg_format *format) FIXME("Format %u not implemented!\n", format->major_type); /* fallthrough */ case WG_MAJOR_TYPE_UNKNOWN: + case WG_MAJOR_TYPE_UNKNOWN_AUDIO: + case WG_MAJOR_TYPE_UNKNOWN_VIDEO: return NULL;
case WG_MAJOR_TYPE_AUDIO: diff --git a/dlls/winegstreamer/quartz_parser.c b/dlls/winegstreamer/quartz_parser.c index 44e13d05c2a..c664c9bd87b 100644 --- a/dlls/winegstreamer/quartz_parser.c +++ b/dlls/winegstreamer/quartz_parser.c @@ -463,6 +463,8 @@ unsigned int wg_format_get_max_size(const struct wg_format *format) return 0;
case WG_MAJOR_TYPE_UNKNOWN: + case WG_MAJOR_TYPE_UNKNOWN_AUDIO: + case WG_MAJOR_TYPE_UNKNOWN_VIDEO: FIXME("Cannot guess maximum sample size for unknown format.\n"); return 0; } @@ -721,6 +723,8 @@ bool amt_from_wg_format(AM_MEDIA_TYPE *mt, const struct wg_format *format, bool FIXME("Format %u not implemented!\n", format->major_type); /* fallthrough */ case WG_MAJOR_TYPE_UNKNOWN: + case WG_MAJOR_TYPE_UNKNOWN_AUDIO: + case WG_MAJOR_TYPE_UNKNOWN_VIDEO: return false;
case WG_MAJOR_TYPE_AUDIO: diff --git a/dlls/winegstreamer/unixlib.h b/dlls/winegstreamer/unixlib.h index 4ec9fce515e..b9b9b7c9dbe 100644 --- a/dlls/winegstreamer/unixlib.h +++ b/dlls/winegstreamer/unixlib.h @@ -33,6 +33,8 @@ typedef UINT32 wg_major_type; enum wg_major_type { WG_MAJOR_TYPE_UNKNOWN = 0, + WG_MAJOR_TYPE_UNKNOWN_AUDIO, + WG_MAJOR_TYPE_UNKNOWN_VIDEO, WG_MAJOR_TYPE_AUDIO, WG_MAJOR_TYPE_AUDIO_MPEG1, WG_MAJOR_TYPE_AUDIO_MPEG4, @@ -95,6 +97,19 @@ struct wg_format
union { + struct + { + uint32_t channels; + uint32_t rate; + char caps[512]; + } unknown_audio; + struct + { + int32_t width, height; + uint32_t fps_n, fps_d; + char caps[512]; + } unknown_video; + struct { wg_audio_format format; diff --git a/dlls/winegstreamer/wg_format.c b/dlls/winegstreamer/wg_format.c index f7fe3cc92ab..7551e6bf1ef 100644 --- a/dlls/winegstreamer/wg_format.c +++ b/dlls/winegstreamer/wg_format.c @@ -265,6 +265,25 @@ static void wg_format_from_caps_audio_wma(struct wg_format *format, const GstCap gst_buffer_unmap(codec_data, &map); }
+static void wg_format_from_caps_unknown_audio(struct wg_format *format, const GstCaps *caps, + const GstAudioInfo *info) +{ + gchar *str; + gint len; + + format->major_type = WG_MAJOR_TYPE_UNKNOWN_AUDIO; + format->u.unknown_audio.rate = info->rate; + format->u.unknown_audio.channels = info->channels; + + str = gst_caps_to_string(caps); + len = strlen(str) + 1; + if (len >= ARRAY_SIZE(format->u.unknown_audio.caps)) + GST_FIXME("wg_format.unknown_audio.caps buffer is too small, need %u bytes", len); + else + memcpy(format->u.unknown_audio.caps, str, len); + g_free(str); +} + static void wg_format_from_caps_video_cinepak(struct wg_format *format, const GstCaps *caps) { const GstStructure *structure = gst_caps_get_structure(caps, 0); @@ -390,6 +409,27 @@ static void wg_format_from_caps_video_mpeg1(struct wg_format *format, const GstC format->u.video_mpeg1.fps_d = fps_d; }
+static void wg_format_from_caps_unknown_video(struct wg_format *format, const GstCaps *caps, + const GstVideoInfo *info) +{ + gchar *str; + gint len; + + format->major_type = WG_MAJOR_TYPE_UNKNOWN_VIDEO; + format->u.unknown_video.width = info->width; + format->u.unknown_video.height = info->height; + format->u.unknown_video.fps_n = info->fps_n; + format->u.unknown_video.fps_d = info->fps_d; + + str = gst_caps_to_string(caps); + len = strlen(str) + 1; + if (len >= ARRAY_SIZE(format->u.unknown_video.caps)) + GST_FIXME("wg_format.unknown_video.caps buffer is too small, need %u bytes", len); + else + memcpy(format->u.unknown_video.caps, str, len); + g_free(str); +} + void wg_format_from_caps(struct wg_format *format, const GstCaps *caps) { const GstStructure *structure = gst_caps_get_structure(caps, 0); @@ -408,6 +448,11 @@ void wg_format_from_caps(struct wg_format *format, const GstCaps *caps) wg_format_from_caps_audio_mpeg1(format, caps); else if (!strcmp(name, "audio/x-wma")) wg_format_from_caps_audio_wma(format, caps); + else + { + GST_FIXME("Using fallback for unknown audio caps %" GST_PTR_FORMAT ".", caps); + wg_format_from_caps_unknown_audio(format, caps, &audio_info); + } } else if (g_str_has_prefix(name, "video/") && gst_video_info_from_caps(&video_info, caps)) { @@ -419,6 +464,11 @@ void wg_format_from_caps(struct wg_format *format, const GstCaps *caps) wg_format_from_caps_video_wmv(format, caps); else if (!strcmp(name, "video/mpeg") && gst_structure_get_boolean(structure, "parsed", &parsed) && parsed) wg_format_from_caps_video_mpeg1(format, caps); + else + { + GST_FIXME("Using fallback for unknown video caps %" GST_PTR_FORMAT ".", caps); + wg_format_from_caps_unknown_video(format, caps, &video_info); + } } else { @@ -847,6 +897,10 @@ GstCaps *wg_format_to_caps(const struct wg_format *format) { case WG_MAJOR_TYPE_UNKNOWN: return gst_caps_new_any(); + case WG_MAJOR_TYPE_UNKNOWN_AUDIO: + return gst_caps_from_string(format->u.unknown_audio.caps); + case WG_MAJOR_TYPE_UNKNOWN_VIDEO: + return gst_caps_from_string(format->u.unknown_video.caps); case WG_MAJOR_TYPE_AUDIO: return wg_format_to_caps_audio(format); case WG_MAJOR_TYPE_AUDIO_MPEG1: @@ -888,6 +942,8 @@ bool wg_format_compare(const struct wg_format *a, const struct wg_format *b) GST_FIXME("Format %u not implemented!", a->major_type); /* fallthrough */ case WG_MAJOR_TYPE_UNKNOWN: + case WG_MAJOR_TYPE_UNKNOWN_AUDIO: + case WG_MAJOR_TYPE_UNKNOWN_VIDEO: return false;
case WG_MAJOR_TYPE_AUDIO: diff --git a/dlls/winegstreamer/wg_parser.c b/dlls/winegstreamer/wg_parser.c index b0a344d5186..9339d9ed8f0 100644 --- a/dlls/winegstreamer/wg_parser.c +++ b/dlls/winegstreamer/wg_parser.c @@ -133,6 +133,8 @@ static struct wg_parser_stream *get_stream(wg_parser_stream_t stream) static bool format_is_compressed(struct wg_format *format) { return format->major_type != WG_MAJOR_TYPE_UNKNOWN + && format->major_type != WG_MAJOR_TYPE_UNKNOWN_AUDIO + && format->major_type != WG_MAJOR_TYPE_UNKNOWN_VIDEO && format->major_type != WG_MAJOR_TYPE_VIDEO && format->major_type != WG_MAJOR_TYPE_AUDIO; } diff --git a/dlls/winegstreamer/wg_transform.c b/dlls/winegstreamer/wg_transform.c index 516b28e82e2..aac2903ba8a 100644 --- a/dlls/winegstreamer/wg_transform.c +++ b/dlls/winegstreamer/wg_transform.c @@ -400,6 +400,8 @@ NTSTATUS wg_transform_create(void *args)
switch (input_format.major_type) { + case WG_MAJOR_TYPE_UNKNOWN_AUDIO: + case WG_MAJOR_TYPE_UNKNOWN_VIDEO: case WG_MAJOR_TYPE_VIDEO_H264: case WG_MAJOR_TYPE_AUDIO_MPEG1: case WG_MAJOR_TYPE_AUDIO_MPEG4: @@ -465,6 +467,8 @@ NTSTATUS wg_transform_create(void *args) break;
case WG_MAJOR_TYPE_UNKNOWN: + case WG_MAJOR_TYPE_UNKNOWN_AUDIO: + case WG_MAJOR_TYPE_UNKNOWN_VIDEO: case WG_MAJOR_TYPE_AUDIO_MPEG1: case WG_MAJOR_TYPE_AUDIO_MPEG4: case WG_MAJOR_TYPE_AUDIO_WMA: diff --git a/dlls/winegstreamer/wm_reader.c b/dlls/winegstreamer/wm_reader.c index e3a2bfc343b..5557803afbf 100644 --- a/dlls/winegstreamer/wm_reader.c +++ b/dlls/winegstreamer/wm_reader.c @@ -1661,6 +1661,10 @@ static const char *get_major_type_string(enum wg_major_type type) return "mpeg1-video"; case WG_MAJOR_TYPE_UNKNOWN: return "unknown"; + case WG_MAJOR_TYPE_UNKNOWN_AUDIO: + return "unknown-audio"; + case WG_MAJOR_TYPE_UNKNOWN_VIDEO: + return "unknown-video"; } assert(0); return NULL; @@ -2033,6 +2037,8 @@ static HRESULT WINAPI reader_GetOutputFormat(IWMSyncReader2 *iface, FIXME("Format %u not implemented!\n", format.major_type); break; case WG_MAJOR_TYPE_UNKNOWN: + case WG_MAJOR_TYPE_UNKNOWN_AUDIO: + case WG_MAJOR_TYPE_UNKNOWN_VIDEO: break; }
@@ -2077,6 +2083,8 @@ static HRESULT WINAPI reader_GetOutputFormatCount(IWMSyncReader2 *iface, DWORD o /* fallthrough */ case WG_MAJOR_TYPE_AUDIO: case WG_MAJOR_TYPE_UNKNOWN: + case WG_MAJOR_TYPE_UNKNOWN_AUDIO: + case WG_MAJOR_TYPE_UNKNOWN_VIDEO: *count = 1; break; }