This behaviour is expected by games such as Borderlands 3.
-- v3: mfplay/tests: Add tests for MF_SD_LANGUAGE.
From: Shaun Ren sren@codeweavers.com
Some gstreamer plugins, such as asfdemux, generate multiple tag events. --- dlls/winegstreamer/wg_parser.c | 82 ++++++++++++++++++++-------------- 1 file changed, 48 insertions(+), 34 deletions(-)
diff --git a/dlls/winegstreamer/wg_parser.c b/dlls/winegstreamer/wg_parser.c index d2db1f039e4..281013162aa 100644 --- a/dlls/winegstreamer/wg_parser.c +++ b/dlls/winegstreamer/wg_parser.c @@ -1276,47 +1276,61 @@ static gboolean src_event_cb(GstPad *pad, GstObject *parent, GstEvent *event) static void query_tags(struct wg_parser_stream *stream) { const gchar *struct_name; - GstTagList *tag_list; GstEvent *tag_event; - guint i, tag_count; - const GValue *val; - GstSample *sample; - GstBuffer *buf; - gsize size; + guint i, j;
- if (!(tag_event = gst_pad_get_sticky_event(stream->their_src, GST_EVENT_TAG, 0))) - return; - - gst_event_parse_tag(tag_event, &tag_list); - gst_tag_list_get_string(tag_list, "language-code", &stream->tags[WG_PARSER_TAG_LANGUAGE]); + stream->tags[WG_PARSER_TAG_NAME] = NULL; + stream->tags[WG_PARSER_TAG_LANGUAGE] = NULL;
- /* Extract stream name from Quick Time demuxer private tag where it puts unrecognized chunks. */ - tag_count = gst_tag_list_get_tag_size(tag_list, "private-qt-tag"); - for (i = 0; i < tag_count; ++i) + i = 0; + while ((tag_event = gst_pad_get_sticky_event(stream->their_src, GST_EVENT_TAG, i++))) { - if (!(val = gst_tag_list_get_value_index(tag_list, "private-qt-tag", i))) - continue; - if (!GST_VALUE_HOLDS_SAMPLE(val) || !(sample = gst_value_get_sample(val))) - continue; - struct_name = gst_structure_get_name(gst_sample_get_info(sample)); - if (!struct_name || strcmp(struct_name, "application/x-gst-qt-name-tag")) - continue; - if (!(buf = gst_sample_get_buffer(sample))) - continue; - if ((size = gst_buffer_get_size(buf)) < 8) - continue; - size -= 8; - if (!(stream->tags[WG_PARSER_TAG_NAME] = g_malloc(size + 1))) - continue; - if (gst_buffer_extract(buf, 8, stream->tags[WG_PARSER_TAG_NAME], size) != size) + GstTagList *tag_list; + + gst_event_parse_tag(tag_event, &tag_list); + + if (!stream->tags[WG_PARSER_TAG_NAME]) + { + /* Extract stream name from Quick Time demuxer private tag where it puts unrecognized chunks. */ + const GValue *val; + GstSample *sample; + GstBuffer *buf; + gsize size; + guint tag_count = gst_tag_list_get_tag_size(tag_list, "private-qt-tag"); + + for (j = 0; j < tag_count; ++j) + { + if (!(val = gst_tag_list_get_value_index(tag_list, "private-qt-tag", j))) + continue; + if (!GST_VALUE_HOLDS_SAMPLE(val) || !(sample = gst_value_get_sample(val))) + continue; + struct_name = gst_structure_get_name(gst_sample_get_info(sample)); + if (!struct_name || strcmp(struct_name, "application/x-gst-qt-name-tag")) + continue; + if (!(buf = gst_sample_get_buffer(sample))) + continue; + if ((size = gst_buffer_get_size(buf)) < 8) + continue; + size -= 8; + if (!(stream->tags[WG_PARSER_TAG_NAME] = g_malloc(size + 1))) + continue; + if (gst_buffer_extract(buf, 8, stream->tags[WG_PARSER_TAG_NAME], size) != size) + { + g_free(stream->tags[WG_PARSER_TAG_NAME]); + stream->tags[WG_PARSER_TAG_NAME] = NULL; + continue; + } + stream->tags[WG_PARSER_TAG_NAME][size] = 0; + } + } + + if (!stream->tags[WG_PARSER_TAG_LANGUAGE]) { - g_free(stream->tags[WG_PARSER_TAG_NAME]); - stream->tags[WG_PARSER_TAG_NAME] = NULL; - continue; + gst_tag_list_get_string(tag_list, GST_TAG_LANGUAGE_CODE, &stream->tags[WG_PARSER_TAG_LANGUAGE]); } - stream->tags[WG_PARSER_TAG_NAME][size] = 0; + + gst_event_unref(tag_event); } - gst_event_unref(tag_event); }
static NTSTATUS wg_parser_connect(void *args)
From: Shaun Ren sren@codeweavers.com
--- configure | 14 +++++++------- configure.ac | 2 +- dlls/winegstreamer/wg_parser.c | 16 +++++++++++++++- 3 files changed, 23 insertions(+), 9 deletions(-)
diff --git a/configure b/configure index 0067b7f008c..27d2da51eab 100755 --- a/configure +++ b/configure @@ -2562,10 +2562,10 @@ Some influential environment variables: PULSE_LIBS Linker flags for libpulse, overriding pkg-config GSTREAMER_CFLAGS C compiler flags for gstreamer-1.0 gstreamer-video-1.0 - gstreamer-audio-1.0, overriding pkg-config + gstreamer-audio-1.0 gstreamer-tag-1.0, overriding pkg-config GSTREAMER_LIBS Linker flags for gstreamer-1.0 gstreamer-video-1.0 - gstreamer-audio-1.0, overriding pkg-config + gstreamer-audio-1.0 gstreamer-tag-1.0, overriding pkg-config UDEV_CFLAGS C compiler flags for libudev, overriding pkg-config UDEV_LIBS Linker flags for libudev, overriding pkg-config UNWIND_CFLAGS @@ -16984,7 +16984,7 @@ if ${GSTREAMER_CFLAGS:+false} : then : if test ${PKG_CONFIG+y} then : - GSTREAMER_CFLAGS=`$PKG_CONFIG --cflags gstreamer-1.0 gstreamer-video-1.0 gstreamer-audio-1.0 2>conftest.err` + GSTREAMER_CFLAGS=`$PKG_CONFIG --cflags gstreamer-1.0 gstreamer-video-1.0 gstreamer-audio-1.0 gstreamer-tag-1.0 2>conftest.err` fi fi
@@ -16992,15 +16992,15 @@ if ${GSTREAMER_LIBS:+false} : then : if test ${PKG_CONFIG+y} then : - GSTREAMER_LIBS=`$PKG_CONFIG --libs gstreamer-1.0 gstreamer-video-1.0 gstreamer-audio-1.0 2>/dev/null` + GSTREAMER_LIBS=`$PKG_CONFIG --libs gstreamer-1.0 gstreamer-video-1.0 gstreamer-audio-1.0 gstreamer-tag-1.0 2>/dev/null` fi fi
-printf "%s\n" "$as_me:${as_lineno-$LINENO}: gstreamer-1.0 gstreamer-video-1.0 gstreamer-audio-1.0 cflags: $GSTREAMER_CFLAGS" >&5 -printf "%s\n" "$as_me:${as_lineno-$LINENO}: gstreamer-1.0 gstreamer-video-1.0 gstreamer-audio-1.0 libs: $GSTREAMER_LIBS" >&5 +printf "%s\n" "$as_me:${as_lineno-$LINENO}: gstreamer-1.0 gstreamer-video-1.0 gstreamer-audio-1.0 gstreamer-tag-1.0 cflags: $GSTREAMER_CFLAGS" >&5 +printf "%s\n" "$as_me:${as_lineno-$LINENO}: gstreamer-1.0 gstreamer-video-1.0 gstreamer-audio-1.0 gstreamer-tag-1.0 libs: $GSTREAMER_LIBS" >&5 if test -s conftest.err; then - printf %s "$as_me:${as_lineno-$LINENO}: gstreamer-1.0 gstreamer-video-1.0 gstreamer-audio-1.0 errors: " >&5 + printf %s "$as_me:${as_lineno-$LINENO}: gstreamer-1.0 gstreamer-video-1.0 gstreamer-audio-1.0 gstreamer-tag-1.0 errors: " >&5 cat conftest.err >&5 fi rm -f conftest.err diff --git a/configure.ac b/configure.ac index d40c6f600af..3d579c1ff43 100644 --- a/configure.ac +++ b/configure.ac @@ -1572,7 +1572,7 @@ WINE_NOTICE_WITH(pulse, [test -z "$PULSE_LIBS"], dnl **** Check for gstreamer **** if test "x$with_gstreamer" != "xno" then - WINE_PACKAGE_FLAGS(GSTREAMER,[gstreamer-1.0 gstreamer-video-1.0 gstreamer-audio-1.0],,,, + WINE_PACKAGE_FLAGS(GSTREAMER,[gstreamer-1.0 gstreamer-video-1.0 gstreamer-audio-1.0 gstreamer-tag-1.0],,,, [AC_CHECK_HEADER([gst/gst.h], [AC_MSG_CHECKING([whether gint64 defined by gst/gst.h is indeed 64-bit]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <gst/gst.h>]], diff --git a/dlls/winegstreamer/wg_parser.c b/dlls/winegstreamer/wg_parser.c index 281013162aa..7dd1a495f55 100644 --- a/dlls/winegstreamer/wg_parser.c +++ b/dlls/winegstreamer/wg_parser.c @@ -33,6 +33,7 @@ #include <gst/gst.h> #include <gst/video/video.h> #include <gst/audio/audio.h> +#include <gst/tag/tag.h>
#include "ntstatus.h" #define WIN32_NO_STATUS @@ -1326,7 +1327,20 @@ static void query_tags(struct wg_parser_stream *stream)
if (!stream->tags[WG_PARSER_TAG_LANGUAGE]) { - gst_tag_list_get_string(tag_list, GST_TAG_LANGUAGE_CODE, &stream->tags[WG_PARSER_TAG_LANGUAGE]); + gchar *lang_code = NULL; + + gst_tag_list_get_string(tag_list, GST_TAG_LANGUAGE_CODE, &lang_code); + if (lang_code) + { + /* FIXME: don't convert to ISO 639-1 if the media is ASF. */ + const gchar *lang_code_iso_639_1 = gst_tag_get_language_code_iso_639_1(lang_code); + if (lang_code_iso_639_1) + stream->tags[WG_PARSER_TAG_LANGUAGE] = g_strdup(lang_code_iso_639_1); + else + stream->tags[WG_PARSER_TAG_LANGUAGE] = NULL; + + g_free(lang_code); + } }
gst_event_unref(tag_event);
From: Shaun Ren sren@codeweavers.com
--- dlls/mfplay/tests/mfplay.c | 70 +++++++++++++++++++++++++++++++ dlls/mfplay/tests/resource.rc | 27 ++++++++++++ dlls/mfplay/tests/test-ang.mp4 | Bin 0 -> 860 bytes dlls/mfplay/tests/test-ang.wma | Bin 0 -> 3867 bytes dlls/mfplay/tests/test-en-US.mp4 | Bin 0 -> 866 bytes dlls/mfplay/tests/test-en-US.wma | Bin 0 -> 3871 bytes dlls/mfplay/tests/test-en.wma | Bin 0 -> 3865 bytes dlls/mfplay/tests/test-eng.mp4 | Bin 0 -> 860 bytes dlls/mfplay/tests/test-eng.wma | Bin 0 -> 3867 bytes dlls/mfplay/tests/test-und.mp4 | Bin 0 -> 860 bytes dlls/mfplay/tests/test-und.wma | Bin 0 -> 3867 bytes 11 files changed, 97 insertions(+) create mode 100644 dlls/mfplay/tests/test-ang.mp4 create mode 100644 dlls/mfplay/tests/test-ang.wma create mode 100644 dlls/mfplay/tests/test-en-US.mp4 create mode 100644 dlls/mfplay/tests/test-en-US.wma create mode 100644 dlls/mfplay/tests/test-en.wma create mode 100644 dlls/mfplay/tests/test-eng.mp4 create mode 100644 dlls/mfplay/tests/test-eng.wma create mode 100644 dlls/mfplay/tests/test-und.mp4 create mode 100644 dlls/mfplay/tests/test-und.wma
diff --git a/dlls/mfplay/tests/mfplay.c b/dlls/mfplay/tests/mfplay.c index 6cecd3bbdd9..ba7c325e7c5 100644 --- a/dlls/mfplay/tests/mfplay.c +++ b/dlls/mfplay/tests/mfplay.c @@ -437,6 +437,75 @@ static void test_media_item(void) IMFPMediaPlayer_Release(player); }
+#define check_media_language(player, resource_name, expected_lang) \ + _check_media_language(__LINE__, FALSE, player, resource_name, expected_lang) +#define todo_check_media_language(player, resource_name, expected_lang) \ + _check_media_language(__LINE__, TRUE, player, resource_name, expected_lang) +static void _check_media_language(unsigned line, BOOL todo, IMFPMediaPlayer *player, + const WCHAR *resource_name, const WCHAR *expected_lang) +{ + WCHAR *filename; + IMFPMediaItem *item; + PROPVARIANT propvar; + const WCHAR *lang = NULL; + HRESULT hr; + + filename = load_resource(resource_name); + + hr = IMFPMediaPlayer_CreateMediaItemFromURL(player, filename, TRUE, 123, &item); + ok_(__FILE__, line)(hr == S_OK || broken(hr == MF_E_UNSUPPORTED_BYTESTREAM_TYPE) /* win8 - win10 1507 */, + "Unexpected hr %#lx.\n", hr); + if (hr != S_OK) + { + DeleteFileW(filename); + return; + } + + hr = IMFPMediaItem_GetStreamAttribute(item, 0, &MF_SD_LANGUAGE, &propvar); + ok_(__FILE__, line)(hr == S_OK || hr == MF_E_ATTRIBUTENOTFOUND, "Unexpected hr %#lx.\n", hr); + + if (hr == S_OK) + { + ok_(__FILE__, line)(propvar.vt == VT_LPWSTR, "Unexpected vt %u.\n", propvar.vt); + if (propvar.vt == VT_LPWSTR) + lang = propvar.pwszVal; + } + + todo_wine_if(todo) + { + if (expected_lang) + ok_(__FILE__, line)(lang && !wcscmp(lang, expected_lang), "Unexpected value %s.\n", debugstr_w(lang)); + else + ok_(__FILE__, line)(!lang, "Unexpected value %s.\n", debugstr_w(lang)); + } + + PropVariantClear(&propvar); + IMFPMediaItem_Release(item); + DeleteFileW(filename); +} + +static void test_media_language(void) +{ + IMFPMediaPlayer *player; + HRESULT hr; + + hr = MFPCreateMediaPlayer(NULL, FALSE, 0, NULL, NULL, &player); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + check_media_language(player, L"test-eng.mp4", L"en"); + check_media_language(player, L"test-ang.mp4", NULL); + check_media_language(player, L"test-und.mp4", NULL); + check_media_language(player, L"test-en-US.mp4", L"en"); + + check_media_language(player, L"test-en.wma", L"en"); + todo_check_media_language(player, L"test-eng.wma", L"eng"); + todo_check_media_language(player, L"test-ang.wma", L"ang"); + todo_check_media_language(player, L"test-und.wma", L"und"); + todo_check_media_language(player, L"test-en-US.wma", L"en-US"); + + IMFPMediaPlayer_Release(player); +} + static void test_video_control(void) { MFVideoNormalizedRect rect; @@ -599,6 +668,7 @@ START_TEST(mfplay) test_create_player(); test_shutdown(); test_media_item(); + test_media_language(); test_video_control(); test_duration(); test_playback_rate(); diff --git a/dlls/mfplay/tests/resource.rc b/dlls/mfplay/tests/resource.rc index 38c4a5f9e01..bccf60db9ed 100644 --- a/dlls/mfplay/tests/resource.rc +++ b/dlls/mfplay/tests/resource.rc @@ -20,3 +20,30 @@
/* @makedep: test.mp4 */ test.mp4 RCDATA test.mp4 + +/* @makedep: test-eng.mp4 */ +test-eng.mp4 RCDATA test-eng.mp4 + +/* @makedep: test-ang.mp4 */ +test-ang.mp4 RCDATA test-ang.mp4 + +/* @makedep: test-und.mp4 */ +test-und.mp4 RCDATA test-und.mp4 + +/* @makedep: test-en-US.mp4 */ +test-en-US.mp4 RCDATA test-en-US.mp4 + +/* @makedep: test-en.wma */ +test-en.wma RCDATA test-en.wma + +/* @makedep: test-eng.wma */ +test-eng.wma RCDATA test-eng.wma + +/* @makedep: test-ang.wma */ +test-ang.wma RCDATA test-ang.wma + +/* @makedep: test-und.wma */ +test-und.wma RCDATA test-und.wma + +/* @makedep: test-en-US.wma */ +test-en-US.wma RCDATA test-en-US.wma diff --git a/dlls/mfplay/tests/test-ang.mp4 b/dlls/mfplay/tests/test-ang.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..864e5347eab75ecbf2c49d22c1cdff8b0da6db61 GIT binary patch literal 860 zcmZuw%}T>S5S}Eh^&rxNqDaIDEqG9A>mT0Y&4V|=gLp~1sTQ+M$ZiXIkRE*%A3=No z-@=>VThwnhiA{?`x8FD4%+Aj4W{Jq{>!)O(Vo78ZBSuFi$8927?x$f0+?68GUp8F@ z<KD^n;nCS)yVWAQ<*!<sUX94vka0XlVkE~80$4KV2aX_%_&2jT2l9gN&ocjGHk!TA zY4C{PoqjZHI;F&-TDcd?h()AGUhw@w&#(~+tw7x{QaTUu4AiaUJzMWm3<7AL6pMS` z@ri0)_0!Beco0!)82(f|8Wx=K8osy;h9U|%#}aZd?1R*moGaQ8neK`-<Tx8Qv@%K~ zFXPsp(%lIBMQK$W0Ot&GtK29X`<dBPXTq(*PD3Sl!{kgRlP1zCzzu($CHj~^msKd$ z_1BwkS^~3h6|~mXX?{Fe4m3|`b9A8iu*`}$GJ}o>bkSXp1sHe3BhNFjXAb1XI=8?D z)|BqWxz2O;F}BowBG^geh<9%4Os8P3>fR^7B2r$ZI}$oT=vIaXIc>LmNx0ZFND{92 dX9t7qOK867nA_OK%itnhnBPYq@1tYh$1gSCZi)Z^
literal 0 HcmV?d00001
diff --git a/dlls/mfplay/tests/test-ang.wma b/dlls/mfplay/tests/test-ang.wma new file mode 100644 index 0000000000000000000000000000000000000000..ab15ca3c5af3d94aa347bc475055e69d6288fc36 GIT binary patch literal 3867 zcmXp|+f>?@c3yDVO@>trN#}AhnHa!;6-Y8NExfb3$9?5_!M-O92Y3{MQ!^lv7^EaW zRH(u3>b;F~85yD61HEq`%no6&hzt)z0%S=8kPX5IVi_2=GVhPq1KIN!V$Vvbe!)wZ zSMLIeKZA&~F;oL(R=PRYJb3@ddy}T6-95*cR%NJaMh1>VhCGIJAoujrXCg(%jGUWi zuFMQ#i;jwbDnX|}mP6eJb_k3OQU`J*%p)*;4ofavVt;%|aQX*^1t;TH1f)PE7#TDe z!Wn!S^ch@%E=Xp`XGmel1iK}eA(f#72qC;;uzDE=ABIGRGKMq;QwB>0Jq9BNb0BHR zU;u;+3=`S!Y~POL=_05d4)Zd9_(q=>T=AEoAwI@MJK*f${r!pO1-mx^qi)M11*kFx z86blLh#_uI1V)B~JOjfHZeUO|2rzJgl|kef4*-RLOoyP0ZL)?J1Q#y>`ij}(8_ZXZ zXyPDUObp^cpMrdo0`z4$LotH_(BG+G|0V+2jtr$>c0Q0D#$W-qjfo+V(F`r2ZGt8R zumU6kWCsW^GBz<V2*zFjyVrrC36iEb4gjS<sptSh!+!?`<^z617BGTy8rVZI!@@(L hSQ`bSAut*OqaiRF0;3@?8UmvsFd71*Auv=!007Z|2G;-p
literal 0 HcmV?d00001
diff --git a/dlls/mfplay/tests/test-en-US.mp4 b/dlls/mfplay/tests/test-en-US.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..e023fd5af4077cbccaaf2dfb4a1525cd8ef485be GIT binary patch literal 866 zcmZuwv2N5r5FOhIp+G1?cM?L5aHP<nTyzOUh|XOo=pqn8H1_S@<rJ@NdG}6&iZZ`K zM^8aXlW#~WB>p12x3+Uf#FKYt=FRNP?5<Zt;;H*w&uwKyLZQSsGWE+t5xGBYw1(U@ zDsxw%yv>%A<JSi-UL72c#}bayhr#1yOC;JcRkcK5VU}kKat+ZR7)k=+x57UL=sR}0 ziu|7zqS+JIWan^xa_7Eg#K7zC`<D=Xw)I{DPxc-L6L;*?leg2JR?fnTbzxn{as~2k zbZdj3M$I#DiBYS)w|zWKMYfXRFTZkhri#XEm~6Eud!6zWwtAD5s?dxHKA3qqg|cnU zDk<ze)$*}wH2nk{da!7Uq}7Aiy1aniSZDhKU`&o%WupY`7NKlYVXMG%Z51~xQH*J0 zkPd0ckFQ|N=H~F?{cpJ!;P_>byQVvm)(bAN&L0<4{7k+Ij>*d?fkbC^LIPk199^9E zeW9ZRc@}4afpwFr<GE%Z<B6Tsibhiv+^x@Za|125`K*TQJ?m8->7ty`r_0g1Q!4pF vxeW57(O#0<UB4<^Z<EzEYusWqZ~up9-(1DUcJMx!gr)dOrg$Ys{+0X%9oKNt
literal 0 HcmV?d00001
diff --git a/dlls/mfplay/tests/test-en-US.wma b/dlls/mfplay/tests/test-en-US.wma new file mode 100644 index 0000000000000000000000000000000000000000..61939c4deb51bb5c5f0a7e072c07bc991c1ee015 GIT binary patch literal 3871 zcmXp|+f>?@c3yDVO@>trN#}BMnHa!;6-Y8NExfb3$9?5_!M-O92Y3{MQ!^lv7^EaW zRH(u3>b;F~85yD61HEq`%no6&hzt)z0%S=8kPX5IVi_2=GVhPq1KIN!V$WKre!)wZ zSMLIeKZA&~G1LQPR=PRYJb3@ddy}T6-95*cR&}UqMh2c#hCBvchERrJpwQ{1&qRuj z896u4T$vff79AA<RfbN18~}A6*fB6RNFB(bFwemBIV`zwiT&{<!Ra3u7MzS*5s(6v zU}Vr>2xstR&}VQ3x+0k&pCN@I6Ua&jx+ayO1PCF#Vz7D{1|Nn*hBAgU22%!020aEN z26G^3$Y2133=9+5?`+?W<nbb?9S-v{fA~h97hLg|p&>rTMLXc^;r;!I=LNer0i$or zBL%231{olO1BfARPXtDYgFFMn4sKv@GYBwnft5kz7!Lr2fJ}#=i*2%o7X%kC0s4yB z;~UIZj%eZ_T}%w(K%atqlLGW*IYTjn0?^;7VE-lp*^UgQV0J!`9mZe*wvCA)k<kn- zv2B7T2e1Mp0%QjWFfukVFbKw80K3<Lp$U?%I1T`%Kq=_}L&JXu2Id2PLl!WCa~s%0 mF~h<`pjaCPqaiRF0;3@?8UmvsFd71*Aut*OqaiR<LjV95X$M^Z
literal 0 HcmV?d00001
diff --git a/dlls/mfplay/tests/test-en.wma b/dlls/mfplay/tests/test-en.wma new file mode 100644 index 0000000000000000000000000000000000000000..b3a9187785ea364f2e68771366b6bdca25bc308e GIT binary patch literal 3865 zcmXp|+f>?@c3yDVO@>trN#}CXnHa!;6-Y8NExfb3$9?5_!M-O92Y3{MQ!^lv7^EaW zRH(u3>b;F~85yD61HEq`%no6&hzt)z0%S=8kPX5IVi_2=GVhPq1KIN!V$X7@e!)wZ zSMLIeKZA&~F;oI&R=PRYJb3@ddy}T6-95*cRz;|4Mh3Q2hCCqW^wMV{MaPVsn`f@f z3}TCpihwFWr$AOiT?Tdrj15u;aw5zdFntb7E?i=Nd`WQn2ZjYF<5mQuKqVL%G#J7e zd>Ql^T!Ho{GvqU*Fk}K*=?uXPsSG7R2;mij)ypvWFeEaRF{Ck=GFUR`F&HtJ14%;$ z10ZBzn8<!-`*tKR7eVcCn3ws(H~PHbioXmE@i8vi0cQ{I?@v50*u4oDaa$fKK$S7b z02v%W3~_rRFe)7685nkO0|S~tfPo9F3?j#P04M}xIs{#8lQp~`xOfTBSIi#YV7_uh z69?&HVh{)V6y%!}pfAfAiWwAu{!Rt^HxbBoWGDr*^MULz1`DulObm&PW@yQ56Eq=! z6(A8HJ3xSuv5A2}F!lo2y$%dbkQBvn04N1YLkAcd{yQ)*AMhKpfDxR}z#fVj79Ik{ g+9((efzc2c4S~@R7!85Z5Eu=C(GVC7fuR}#09U96Y5)KL
literal 0 HcmV?d00001
diff --git a/dlls/mfplay/tests/test-eng.mp4 b/dlls/mfplay/tests/test-eng.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..7be1ad4e0e3a69125666572beb243ecec56e8493 GIT binary patch literal 860 zcmZuw%}T>S5S}FU=OEI9MUjXpwBSKY{l{CpdGIE95HD#r{lRP#vfF|lq(@)HM-U&t zx9}$T7W&O5v1xJW_WS0W+1c6MED^aq{g@0@EQxGl#5j`4$srM~_R=r})};var%l(v zq<ebNIzDe5w%cU4{dH^0TOo2bWgJhC7|F>%088e4!x3Z=|7JGlKwj|uS>}JtMzfbX z4IU7@*AHe*r<7P!EB9g<v4|AO3%+0I88$+p6{s6VO6MV-fx4BvXX{OhVF1mOVsY=g zKGBL-`!F*P1|mug!=H-Bqk=Quz!z7+NJJs$SV9g*J&>xBb442>(_N8<9B1Q(*2Zb% zW!&0Rx)XsvE3JwH;G7X|l^bPaKQo)EOt@9pS*QeWn4IZ!+C*9fxarqeqW39uxddgY z_Hz40%U~9+f;Kuj&5tL`f#xY~jt&$bmRS);X3+6~F1qWo0OM|W<as9c#DUyc=N7oY zhSJ?Q*Llu9#<uDwf}J#uc;}|h&kvZZI{gG#M9Qml#zF@O-O11(r`5}sgo{msB;ksG db}-DogyyS`xs4sX3@*Zj`F-^8K90=$_ytu@Zkhl9
literal 0 HcmV?d00001
diff --git a/dlls/mfplay/tests/test-eng.wma b/dlls/mfplay/tests/test-eng.wma new file mode 100644 index 0000000000000000000000000000000000000000..730516354e380b6dd6f6750b5311c5ddaaca1921 GIT binary patch literal 3867 zcmXp|+f>?@c3yDVO@>trN#}AhnHa!;6-Y8NExfb3$9?5_!M-O92Y3{MQ!^lv7^EaW zRH(u3>b;F~85yD61HEq`%no6&hzt)z0%S=8kPX5IVi_2=GVhPq1KIN!V$Vvbe!)wZ zSMLIeKZA&~F;oL(R=PRYJb3@ddy}T6-95*cR%NJaMh1>lhCGIJAoujrXCg(%jGUWi zuFMQ#i;jwbDnX|}mP6eJb_k3OQU`J*%p)*;4ofavVt;%|aQX*^1t;TH1f)PE7#TDe z!Wn!S^ch@%E=Xp`XGmel1iK}eA(f#72qC;;uzDE=ABIGRGKMq;QwB>0Jq9BNb0BHR zU;u;+3=`S!Y~POL=_05d4)Zd9_(q=>T=AEoAwI@MJK*f${r!pO1-mx^qi)M11*kFx z86blLh#_uI1V)B~JOjfHZeUO|2rzJgl|kef4*-RLOoyP0ZL)?J1Q#y>`ij}(8_ZXZ zXyPDUObp^cpMrdo0`z4$LotH_(BG+G|0V+2jtr$>c0Q0D#$W-qjfo+V(F`r2ZGt8R zumU6kWCsW^GBz<V2*zFjyVrrC36iEb4gjS<sptSh!+!?`<^z617BGTy8rVZI!@@(L hSQ`bSAut*OqaiRF0;3@?8UmvsFd71*Auv=!000WV2HOAt
literal 0 HcmV?d00001
diff --git a/dlls/mfplay/tests/test-und.mp4 b/dlls/mfplay/tests/test-und.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..302afb13c726c969f8a6c6ef8d60e511a0abe4e3 GIT binary patch literal 860 zcmZuwJx{|h5WOTo84&6~1wugt2_yzUEuUfw8v`4H0kI@?S}Niuirq>uppN_%egb0U zcd#MxFUmV7p=rgb?tAy{d_LPT5xE`xl=f62iELuTIF#vei-;CGSrh@cqzLqvO;^FN zeR6(qbav2cHpy=K%hsA#BXU+{k_?d;%i)6nR?PW<Bgi8DO>D}6JmdS5%>S5;W-oLW zJR*3nAI+LhC9$kl?Zq-;87Y%ze81Fl+>V4+pl%c^U4(cB>dqBCTklfz0%)ETvwPq4 ziE7@>r<u9`AmYq0{HbKnFFE5id~q4{MI3RCC1kJP0jVoFRdieAx+}7X<80i}(jbey zoLjp}hcWnz(yBZF>V;xluOubF-<=gj<E3MoRF8$r+7CJ4l-YuKEp@=wk$3&O@1R zyxxA(0+@xXpp{T(#qs1h&^)Eh(ShQ_GArW93_2drMR#o$VB8IlBG1I0IZznu+yWO^ zQM#QJI?vg|SXbRtu#+V*@7&ZGkHK6Oc2i&(sjd<Zgbon8laWDA+p1m?E;b9&lq>$( celPzLcHVTtZEWCWa1k!d@1ukFacJJhFU>7(*8l(j
literal 0 HcmV?d00001
diff --git a/dlls/mfplay/tests/test-und.wma b/dlls/mfplay/tests/test-und.wma new file mode 100644 index 0000000000000000000000000000000000000000..54243cee77f47153e28360c435798562e1787451 GIT binary patch literal 3867 zcmXp|+f>?@c3yDVO@>trN#}AhnHa!;6-Y8NExfb3$9?5_!M-O92Y3{MQ!^lv7^EaW zRH(u3>b;F~85yD61HEq`%no6&hzt)z0%S=8kPX5IVi_2=GVhPq1KIN!V$Vvbe!)wZ zSMLIeKZA&~F;oL(R=PRYJb3@ddy}T6-95*cR%NJaMh1>jhCGH8AoujrXCg(%jGUWi zuFMQ#i;jwbDnX|}mP6eJb_k3OQU`J*%p)*;4ofavVt;%|aQX*^1t;TH1c2-U0Y(N5 zhHwU727LxspbL^2@`0|%1hUc@f*Dd7N`Mf;D+a5UVenx{WGG`uV=!f~WYA+UVlW4i zh71Nk$iOg>{m%C7NS-bN>tSGUn3ws(H~PHbioXmE@i8vi0cQ{I?@v50*u4oDbz2@O zK$S7b02v%W3~_rRFfttE85nkO1B04DfPo9F3?j#P04M}xIs{#8lQp~`xOfTBSIi#Y zV7_uh69?&HVh{)V6y%!}pfAfAiWwAu{!Rt^HxbBoWGDr*^MULz1`DulObm&PW@rg* z6ErD+6(A8HJ3xSuv5A2}F!lo2y$%dbkTk_{04N1YMF$uf{yQ)*AMhKpfDxS2z#fVj k79Ik{+9((efzc2c4S~@R7!85Z5Eu=C(GVC7fuR}#0K}&T=l}o!
literal 0 HcmV?d00001
Zebediah Figura (@zfigura) commented about dlls/winegstreamer/wg_parser.c:
if (!stream->tags[WG_PARSER_TAG_LANGUAGE]) {
gst_tag_list_get_string(tag_list, GST_TAG_LANGUAGE_CODE, &stream->tags[WG_PARSER_TAG_LANGUAGE]);
gchar *lang_code = NULL;
gst_tag_list_get_string(tag_list, GST_TAG_LANGUAGE_CODE, &lang_code);
if (lang_code)
{
/* FIXME: don't convert to ISO 639-1 if the media is ASF. */
const gchar *lang_code_iso_639_1 = gst_tag_get_language_code_iso_639_1(lang_code);
if (lang_code_iso_639_1)
stream->tags[WG_PARSER_TAG_LANGUAGE] = g_strdup(lang_code_iso_639_1);
else
stream->tags[WG_PARSER_TAG_LANGUAGE] = NULL;
This makes me nervous, because this is potentially introducing a regression.
On the other hand, I don't think there's a known application that depends on MF_SD_LANGUAGE in the first place, so this is probably fine.
This merge request was approved by Zebediah Figura.