winegstreamer: Add format field to wmv wg_format.

Wrong plugins will be selected for WMV decoder
if we don't set format field.
This commit is contained in:
Ziqing Hui 2023-02-02 16:13:48 +08:00 committed by Alexandre Julliard
parent 7bc693eef5
commit 93716f5a21
3 changed files with 55 additions and 6 deletions

View file

@ -763,11 +763,17 @@ static bool amt_to_wg_format_video_wmv(const AM_MEDIA_TYPE *mt, struct wg_format
format->u.video_wmv.fps_d = video_format->AvgTimePerFrame;
if (IsEqualGUID(&mt->subtype, &MEDIASUBTYPE_WMV1))
format->u.video_wmv.version = 1;
format->u.video_wmv.format = WG_WMV_VIDEO_FORMAT_WMV1;
else if (IsEqualGUID(&mt->subtype, &MEDIASUBTYPE_WMV2))
format->u.video_wmv.version = 2;
format->u.video_wmv.format = WG_WMV_VIDEO_FORMAT_WMV2;
else if (IsEqualGUID(&mt->subtype, &MEDIASUBTYPE_WMV3))
format->u.video_wmv.format = WG_WMV_VIDEO_FORMAT_WMV3;
else if (IsEqualGUID(&mt->subtype, &MEDIASUBTYPE_WMVA))
format->u.video_wmv.format = WG_WMV_VIDEO_FORMAT_WMVA;
else if (IsEqualGUID(&mt->subtype, &MEDIASUBTYPE_WVC1))
format->u.video_wmv.format = WG_WMV_VIDEO_FORMAT_WVC1;
else
format->u.video_wmv.version = 3;
format->u.video_wmv.format = WG_WMV_VIDEO_FORMAT_UNKNOWN;
return true;
}

View file

@ -130,9 +130,17 @@ struct wg_format
} video_h264;
struct
{
enum wg_wmv_video_format
{
WG_WMV_VIDEO_FORMAT_UNKNOWN,
WG_WMV_VIDEO_FORMAT_WMV1,
WG_WMV_VIDEO_FORMAT_WMV2,
WG_WMV_VIDEO_FORMAT_WMV3,
WG_WMV_VIDEO_FORMAT_WMVA,
WG_WMV_VIDEO_FORMAT_WVC1,
} format;
int32_t width, height;
uint32_t fps_n, fps_d;
uint32_t version;
} video_wmv;
struct
{

View file

@ -556,19 +556,54 @@ static GstCaps *wg_format_to_caps_video_h264(const struct wg_format *format)
static GstCaps *wg_format_to_caps_video_wmv(const struct wg_format *format)
{
unsigned int wmv_version;
const char *wmv_format;
GstCaps *caps;
if (!(caps = gst_caps_new_empty_simple("video/x-wmv")))
return NULL;
switch (format->u.video_wmv.format)
{
case WG_WMV_VIDEO_FORMAT_WMV1:
wmv_format = "WMV1";
wmv_version = 1;
break;
case WG_WMV_VIDEO_FORMAT_WMV2:
wmv_format = "WMV2";
wmv_version = 2;
break;
case WG_WMV_VIDEO_FORMAT_WMV3:
wmv_format = "WMV3";
wmv_version = 3;
break;
case WG_WMV_VIDEO_FORMAT_WMVA:
wmv_format = "WMVA";
wmv_version = 3;
break;
case WG_WMV_VIDEO_FORMAT_WVC1:
wmv_format = "WVC1";
wmv_version = 3;
break;
default:
GST_WARNING("Unknown WMV format %u.", format->u.video_wmv.format);
/* fallthrough */
case WG_WMV_VIDEO_FORMAT_UNKNOWN:
wmv_format = NULL;
wmv_version = 0;
break;
}
if (wmv_format)
gst_caps_set_simple(caps, "format", G_TYPE_STRING, wmv_format, NULL);
if (wmv_version)
gst_caps_set_simple(caps, "wmvversion", G_TYPE_INT, wmv_version, NULL);
if (format->u.video_wmv.width)
gst_caps_set_simple(caps, "width", G_TYPE_INT, format->u.video_wmv.width, NULL);
if (format->u.video_wmv.height)
gst_caps_set_simple(caps, "height", G_TYPE_INT, format->u.video_wmv.height, NULL);
if (format->u.video_wmv.fps_d || format->u.video_wmv.fps_n)
gst_caps_set_simple(caps, "framerate", GST_TYPE_FRACTION, format->u.video_wmv.fps_n, format->u.video_wmv.fps_d, NULL);
if (format->u.video_wmv.version)
gst_caps_set_simple(caps, "wmvversion", G_TYPE_INT, format->u.video_wmv.version, NULL);
return caps;
}