[PATCH v3] winegstreamer: Also wait for EOS events when retrieving duration.

Zebediah Figura z.figura12 at gmail.com
Sat Jun 13 10:34:22 CDT 2020


From: Akihiro Sagawa <sagawa.aki at gmail.com>

The mpegaudioparse element will not send a duration-changed message if no
Xing or VBRI headers are present.

Signed-off-by: Akihiro Sagawa <sagawa.aki at gmail.com>
Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
v3: Make the commit message a bit more accurate.

 dlls/quartz/tests/mpegsplit.c |   8 ++++----
 dlls/quartz/tests/rsrc.rc     |   2 +-
 dlls/quartz/tests/test.mp3    | Bin 2349 -> 2157 bytes
 dlls/winegstreamer/gstdemux.c |  13 ++++++++++---
 4 files changed, 15 insertions(+), 8 deletions(-)

diff --git a/dlls/quartz/tests/mpegsplit.c b/dlls/quartz/tests/mpegsplit.c
index 9bfd7e3bb19..e407fe44eeb 100644
--- a/dlls/quartz/tests/mpegsplit.c
+++ b/dlls/quartz/tests/mpegsplit.c
@@ -523,13 +523,13 @@ static void test_media_types(void)
 {
     MPEG1WAVEFORMAT expect_wfx =
     {
-        {WAVE_FORMAT_MPEG, 1, 48000, 8000, 192, 0, sizeof(MPEG1WAVEFORMAT) - sizeof(WAVEFORMATEX)},
-        ACM_MPEG_LAYER3, 64000, ACM_MPEG_SINGLECHANNEL, 0, 1, ACM_MPEG_PROTECTIONBIT | ACM_MPEG_ID_MPEG1, 0, 0
+        {WAVE_FORMAT_MPEG, 1, 48000, 4000, 96, 0, sizeof(MPEG1WAVEFORMAT) - sizeof(WAVEFORMATEX)},
+        ACM_MPEG_LAYER3, 32000, ACM_MPEG_SINGLECHANNEL, 4096, 1, ACM_MPEG_ORIGINALHOME | ACM_MPEG_PROTECTIONBIT | ACM_MPEG_ID_MPEG1, 0, 0
     };
     static const MPEGLAYER3WAVEFORMAT expect_mp3_wfx =
     {
-        {WAVE_FORMAT_MPEGLAYER3, 1, 48000, 8000, 1, 0, sizeof(MPEGLAYER3WAVEFORMAT) - sizeof(WAVEFORMATEX)},
-        MPEGLAYER3_ID_MPEG, 0, 192, 1, 0
+        {WAVE_FORMAT_MPEGLAYER3, 1, 48000, 4000, 1, 0, sizeof(MPEGLAYER3WAVEFORMAT) - sizeof(WAVEFORMATEX)},
+        MPEGLAYER3_ID_MPEG, 0, 96, 1, 0
     };
 
     const WCHAR *filename = load_resource(L"test.mp3");
diff --git a/dlls/quartz/tests/rsrc.rc b/dlls/quartz/tests/rsrc.rc
index 753415cf8de..d28c2bd6edc 100644
--- a/dlls/quartz/tests/rsrc.rc
+++ b/dlls/quartz/tests/rsrc.rc
@@ -28,7 +28,7 @@ test.avi RCDATA "test.avi"
 /* @makedep: test.mpg */
 test.mpg RCDATA "test.mpg"
 
-/* ffmpeg -f lavfi -i "sine=frequency=500" -t 0.5 -ar 48000 -b:a 32k -f mp3 -acodec mp3 test.mp3 */
+/* ffmpeg -f lavfi -i "sine=frequency=500" -t 0.5 -ar 48000 -b:a 32k -f mp3 -acodec mp3 -write_xing 0 test.mp3 */
 /* @makedep: test.mp3 */
 test.mp3 RCDATA "test.mp3"
 
diff --git a/dlls/quartz/tests/test.mp3 b/dlls/quartz/tests/test.mp3
index 78d8dd2af62027147a3f169a8306b601ab37c3b6..b35e6b77d1315fa5b742085226ecd0cefbdf4896 100644
GIT binary patch
literal 2157
zcmbuAeN+=?7RKLX5(p&H2n1OJb`rG$i5L}K^lZ07AQ&;x5DB4_j|8k%v<H?(#iW5r
z11(jlcm!8bF<AKug&<1HN0orkMRvQoDux0Uad8cTpe~_^eC$l(viraD$IN at qJ?D4c
zd!OgIvo&lz3E<E2sGU0n*!LX(Ad&Lm?hV0#>ox_h<?-xQ$7}wzXFC8S5<?!PM0qE3
zD{gF*06?hTgaG2Mn|(yA#(meh_1_OsnBtk<`rBi-w5$oTnY3<M%;}fyt$B;Ccd_c}
zz4y}%^ZFUG+m!038R51z#L{(sPib{{GQjx|AZ5H8;QJ8x9fo#YWrm4v|AD7-O?Hk7
z;>}S{I>S@~kh+J#G#{|FeLOZbE!gc}7xU- at L&Fv>ME>bT1MSr!uas`vwAOEA!g^(J
zNxAO0##$RBU-o7GGMw*>LNiPnwQm=q*C#0tf6{r0x!3pad-|uXvS$&QGv<pPEPzO=
z0v1a<y*<k+!d*v4#gvanEVj5N+2sxWRozEf!ibKMZ22jtHDV2y#<}x~wAw|(`CR_!
zSDa5nNq|YO>I*|q2R~B#{(#R7Dr{C%G}RtCg_uh>W-Ds0hXncenr5PH(aq<I>L1+C
zHrAT|qzGC<xg?>vKw2*%<7Q{n(G4lnvwti&Fj9^n2q8p)^B1GgRVD)r at KGI<bUDM?
zN#{-p*r-CdL=fUFU&WHG-u^@rIKi3EJmS&gM!N3zPZ5Zc<bC7h at +@-dcS9ch%`dWy
zkMH(em=y{E`PiUW13`Cr-!F<2i9dAWd~X0fWUeyw5*4Ukd5>w8uvEvFfApxu%eJPx
z`KdC;2%G7-|KCU`|GaUox~M8~dhGVqm9;Pd5%8$H+uoanHul}1$%{iG{C8I;#!qWM
zu;6 at O6l!34Q2!c^Xrbh_>Y;ow1vV=c|LtPwy~R1{=?v+;u|vO(^ILwimITn92+?f;
zA40@}Zc1x>LC=}&^$9Il3&XYqW5)>?^$=b@$1ct1`HOM>3N-X at Oa|vK;fNZt>#N~X
zICZb-*M_Ud8B;%0YCo_^>S#ol14;&0r;GR$Lu!kBp2_DpRf#)lo>BQS1*!mb!GdjY
zQo(>gM?Ub<Rmv`^*JfVWf%7?N=yRqAKL5`gd{aEfp!XsWZ)HpUoJhLr1r at Yob`{+7
z(X<elv7dbc;jLICImS7OwLH=>SFM^{)vd0FOGu!oW5BLE&R?gq&j<65N}p7U=?lfS
z at oKiWuTdYe*wlZXx2<bJ5OO!}Kl1RP59e;a81m^d&0+%Vs2Md5W4GV9g;KeTCOvDd
zg)yH+gzbzrneJ-8-jaaxH>1#mV?L?+q!NtZq>|CikuZ2;BZmM~+(wyp0q(MhE}%;3
zd4!;YQ?iwD=g-qDX)WC~#qHCkry&9%kvu>#acK!flQB4-4?+!?|1o_tF#l^l$@P|(
zzN92frkWl-c$&ClR`eYopz$$+!wN;hS$?p*94<5 at pOMX9k?k9{^*74y2odsGI}p1+
z&$R7QfFZIlW$L<7`~C>d->QRtblm at -V?LG$E4}N(=UB2j{8g$Lx;);UA+F!h_&{^b
zb$;MmaUZ4LOxqt@!bWcG&EJk5NodZQ^K4XA_G${%r{iKv5*h?GAUVlW*UHBEks$Q6
zBfp>PlUUe(Xi2_AZ~p3vwph1^eR$jOv~OjhvBl0z{8%c;w6F}y`<r%Z8*0k9iPDt&
zUj at ok`3P at 0?6t*_<pU&T+_^9DD39a(7+t8@!B2P02U8~8Hd3mRQ2_aZ<F1>z?wrZ5
zUCVmA`p2&ITBGlkkKgteeE|^{18gw~4c_if72%AVJw^1N4^d}hZJPtOf8SjdbrI()
z^q4>0sJ+=htygwn^Z!2WXdE#2)Q{E*O+CXTNs#9Ezx3!*rPEml%c5HeEEtIw^8Gy_
zBGQXTZ)sq6Ry3A{xv|C+B$sUZpA=iq;QZYvG=%Z-{RY|nNtWouF}IFRXXcGyQYg%i
zh9s-w*r~VIe`*qXV)0k4Y?|CRmy<RAk1~|N|E|KWd{GIPbLX{3h#}9Ogv##nM!E3>
z&fgC(f4brOGuOf28|HB_SOSib34U#oK$@=y-8`{Y<ZG7Yh7%0#B49mbd2&Yv1$BaV
zxO==2xb!)^qA5qg<nefEth~aYQ>M``NJ-o$&WahFpN2x`m~MD}-}q+<7!%zfJhxiv
zirL2(wY;beaGzNkplT+bW`w>v_>rU_(n-?!GjmPCHT58Z#M0%&3!eS)FO8xQv0y#^
zgETHYI6ni0-st-ol)O?sl)F%U`vcBLb?rPyzP`~vCjJPM-yXX_!1;RMoUxDJcm)Nz
OoI!mtOjxMC{oy|-dh)yg

literal 2349
zcmb7_dsGuw8o+Nd0Yab%kpL211E`?kG4iV5Yk-7;KpQIo1%VJyIHnYi<s}c9 at Mu{)
zx=;-$76lYxv4m#?K}(8K5xNDX7+zI$wT73~<>6T{uycv_Y<JJ;IsX2bxpVHFU%vb0
z`|fyi94G){;lFPmm$<J20Pzh^JnZCb>xkNJMYpcZsxQln{__8NR1dvBKO9Spi1&aI
z0NMbs2)00+2r$SV0zO1Qa0HS-fJ5>KB#=@_HGvEwC+LO at 5R5@42<9Nm1n`%MAR~w%
zol*Gkjt%by+Mvkye)+qnxA)~m!`lE*bQyvE;W&Cax9XNN4**h)3kJxMcSp#?ob`IG
z?`Otv78R_mOaHgWH|tfTIFjyHg`0NNqY)ml4Y at HKXW2JZyT_JE9^b9o+D at mx%y;@%
zB|oa7#xnx?$zo2t*_L%<fR%=X52Qxtg1#N7m=>Ys?}#qxoYrFLkie&O4oi0}@V@<9
z&;(WXz(9nX3^v~r6ofVJuP751pPfq!RqZ^#I#^Wcj!^*V$YY}x(#aDsM$oS*ruZ`T
zdPX?dF+|8e7Tu-ISVSK%N*iNEz*^DPR}(MWk$BR at k~Tp7d!#Ncs5 at IA{poh!m!j(_
zb15lGh9%#W&o{N}VD})#GDU;D<EC9b%{^>L)qH3T^y}bADN~<K__MQw70Jr3`$eaJ
zO=ZVn+`sbdqPga{z{|+rg7$RE&i&NrmEBjPYFcHMXP?Yg3oy4Yc{a%_E0|Tpiq=jW
zox at l7bB`9;;jVM{TlEp>H^3=YOa}XoCzgo_4-omu!-874J}hD3f;E*boiuO{PTl{j
zYrAsN`&x7R!%#Wd0 at U#G3Nd+w%pDDk5=MJCjowU=_A9tfX0(C5AoxS6fmf*sT~n3~
z{YE5 at Sth-w#}kW(@ke(FuiModTFP>X4elzAU-R0wg+^)EGZ{@vpgzL|Ee)6A*3281
z1xqpldV>?<l}RBEB<yRK;9Pvm<G-ZonvQh#IV5h5ZVafEE<^u1qJEegONY$`;;hJc
zrk8Ig{o3le{&JSM;C_KXCy;u6R(B-kGL79UwEB3yj{J{|dowYwRoh8e!}W^KfsU2u
z9fUGp^+tDoQ+C3SwV_v=REEoZelnHvbujds17wQ1#z(OMOG6 at OnV7G|XQVH(kIK=5
zqLcEd!MxSOw-aL8RE|pf8p)^z`M^d-6KGwTKd`q&cTuOWrn`N)rd3+$(PS$*OQRHY
zk8((X)R{5CgNM*>1t^r?<8NYed~L<&>wUPzvh<`SD at ol&X^A$ylVx+zyZ}Qtd~n7f
z=V*w~$|qK|PN7=w{3zpoKowUCB7_ZP=2&kk{W8lUxmJ;5+yCIqR#$!Kw}JVwC>?ee
zBqG9dMEz6`Y}41V9^OAjeoh at 66I@WN7hkx|yU^dIYR=e`t~YZv4s-jz(rVtaR69S>
zTB6t28jFx at n!QZ{zrz{&9dP6ZQ%`3&8>D5e<Y$|SW%J+Uy~4trM*hUYZ%dN?$x3cA
zjZ!~4=}X$Tl9?DL-dk6r9W#w5)h_JZytq_?mwHDwGy{z at 77^mily3NbwC5c3yW)sa
zU7zV{|7d&l^v?K<flpCjJRD~`nf=KN&2-r`S>yN=SNr%MwvnU%KOLgpM%#<YE7$5y
z90bsh;mAvM{@=#`L+5uVD0!-L^*(NU{lcESUfwhQtt4Lh6<+GI?x!X>W7|j8h{g~1
zi2s(>SMualn?gmKRW19KVg at B~jB113EhejE5^B!zDL*Rod*a9#)0j=vPZF}yzYp7r
z=0eUTw(dGroeMyjmrj)WV3-^dxP=rA=FwH(eiSg$-mgr$exweQ3<-?p;TDnUY6F^T
zFf_;YS=d11^gw^vFY(atha>q!{)zK}h#%I^`4Qgs4$Ifbt`TJ&DXh(~>A=x*fr{hv
z_EwU+3*+}#nETy7lvAR4_O(}u7AdL)hV)|lI8O8NH@{Jb+KIN%p`Q<k{2Q}xZNl&@
zVI)(@>$tg{e%Y)@dMIV?Sdpl_gj!xLi7C#s`vgHAw!SFT%=_n^{bG)B#-*!9ZH*Q7
z39Rn?D}mx%)(1bUwd_OUoRqyn<vyuD^ao`kPu2cZL^zc4G*@qXK<|l(@xEzO{#h!e
z;1`SE+eO_OMVqrEuTp2yz55?kx^sBuRPsQ_W<!LG4Y`>FT80PFM>?PFzf-%QC0c_1
zaKHg?>jx1si1T^5qD!v_9${P{&$q7fWZWGr*6&f++rjOOKR8vL|8eePjEovmE@@*e
zXuPin($|S5kpj$2G;wbfDGv_2=!H0TfmPPfe^^Xe%hUyrgt$0MXhP&C$^>Ioyku=?
z%@HtB6pb at GDRC^Uoyw#Lt)FWN-WY=yzPCs(m5Tc3xtDImzWI!n-L9EeVk^I*!CML`
z{CT6H+ZlTY&mKi>Xbbd<0L4+=zeN5^i2mj28)Y-(m7O0Nr^$TX{J0LbE-toCE1&cC
zy+D7g_?D7s*h8HEr?Q at rZ=f3QEBTZ4(EkOlg^S#;H{w8?^Em4Qi}WY!-*@Ui<!$R8

diff --git a/dlls/winegstreamer/gstdemux.c b/dlls/winegstreamer/gstdemux.c
index e7d8a0b98c6..b9c91245f82 100644
--- a/dlls/winegstreamer/gstdemux.c
+++ b/dlls/winegstreamer/gstdemux.c
@@ -79,7 +79,7 @@ struct gstdemux_source
     GstPad *their_src, *post_sink, *post_src, *my_sink;
     GstElement *flip;
     AM_MEDIA_TYPE mt;
-    HANDLE caps_event;
+    HANDLE caps_event, eos_event;
     GstSegment *segment;
     SourceSeeking seek;
 };
@@ -699,6 +699,8 @@ static gboolean event_sink(GstPad *pad, GstObject *parent, GstEvent *event)
         case GST_EVENT_EOS:
             if (pin->pin.pin.peer)
                 IPin_EndOfStream(pin->pin.pin.peer);
+            else
+                SetEvent(pin->eos_event);
             return TRUE;
         case GST_EVENT_FLUSH_START:
             if (impl_from_strmbase_filter(pin->pin.pin.filter)->ignore_flush) {
@@ -2129,6 +2131,7 @@ static void free_source_pin(struct gstdemux_source *pin)
     }
     gst_object_unref(pin->my_sink);
     CloseHandle(pin->caps_event);
+    CloseHandle(pin->eos_event);
     FreeMediaType(&pin->mt);
     gst_segment_free(pin->segment);
 
@@ -2161,6 +2164,7 @@ static struct gstdemux_source *create_pin(struct gstdemux *filter, const WCHAR *
 
     strmbase_source_init(&pin->pin, &filter->filter, name, &source_ops);
     pin->caps_event = CreateEventW(NULL, FALSE, FALSE, NULL);
+    pin->eos_event = CreateEventW(NULL, FALSE, FALSE, NULL);
     pin->segment = gst_segment_new();
     gst_segment_init(pin->segment, GST_FORMAT_TIME);
     pin->IQualityControl_iface.lpVtbl = &GSTOutPin_QualityControl_Vtbl;
@@ -2561,7 +2565,8 @@ static BOOL mpeg_splitter_init_gst(struct gstdemux *filter)
     static const WCHAR source_name[] = {'A','u','d','i','o',0};
     struct gstdemux_source *pin;
     GstElement *element;
-    HANDLE events[2];
+    HANDLE events[3];
+    DWORD res;
     int ret;
 
     if (!(element = gst_element_factory_make("mpegaudioparse", NULL)))
@@ -2600,7 +2605,9 @@ static BOOL mpeg_splitter_init_gst(struct gstdemux *filter)
 
     events[0] = filter->duration_event;
     events[1] = filter->error_event;
-    if (WaitForMultipleObjects(2, events, FALSE, INFINITE))
+    events[2] = pin->eos_event;
+    res = WaitForMultipleObjects(3, events, FALSE, INFINITE);
+    if (res == 1)
         return FALSE;
 
     pin->seek.llDuration = pin->seek.llStop = query_duration(pin->their_src);
-- 
2.27.0




More information about the wine-devel mailing list