Title: [294795] releases/WebKitGTK/webkit-2.36
Revision
294795
Author
ape...@igalia.com
Date
2022-05-25 06:45:35 -0700 (Wed, 25 May 2022)

Log Message

Merge r294791 - [MSE][GStreamer] Support Google Dynamic Ad Insertion (DAI)
https://bugs.webkit.org/show_bug.cgi?id=216039
<rdar://problem/68638316>

Patch by Philippe Normand <ph...@igalia.com> on 2022-05-25
Reviewed by Alicia Boya Garcia.

The "simple DAI" demo was not working as expected because the new source pad of the demuxer in the append
pipeline was sinking buffers to a "black hole". That was happening because the second time the
no-more-pads signal was emitted, the previous source pad was still linked to a track, and there was
no code to unlink/relink demuxer pads. This is now handled...

The specific "simple DAI" demo generates 2 AAC streams, with different tkhd track-id fields, we had
no layout test reproducing this use-case, so this patch provides one.

Test: media-source/media-source-audio-track-id-switch.html

* LayoutTests/media/media-source/content/test-48kHz-new-track-id.m4a: Added.
* LayoutTests/media/media-source/content/test-48khz-new-track-id-manifest.json: Added.
* LayoutTests/media/media-source/media-source-audio-track-id-switch-expected.txt: Added.
* LayoutTests/media/media-source/media-source-audio-track-id-switch.html: Added.
* Source/WebCore/platform/graphics/gstreamer/mse/AppendPipeline.cpp:
(WebCore::AppendPipeline::handleErrorSyncMessage):
(WebCore::AppendPipeline::didReceiveInitializationSegment):
(WebCore::createOptionalParserForFormat):
(WebCore::AppendPipeline::recycleTrackForPad):
(WebCore::AppendPipeline::linkPadWithTrack):
(WebCore::AppendPipeline::tryMatchPadToExistingTrack): Deleted.
* Source/WebCore/platform/graphics/gstreamer/mse/AppendPipeline.h:
(WebCore::AppendPipeline::Track::isLinked const):

Canonical link: https://commits.webkit.org/250950@main

Modified Paths

Added Paths

Diff

Added: releases/WebKitGTK/webkit-2.36/LayoutTests/media/media-source/content/test-48kHz-new-track-id.m4a (0 => 294795)


--- releases/WebKitGTK/webkit-2.36/LayoutTests/media/media-source/content/test-48kHz-new-track-id.m4a	                        (rev 0)
+++ releases/WebKitGTK/webkit-2.36/LayoutTests/media/media-source/content/test-48kHz-new-track-id.m4a	2022-05-25 13:45:35 UTC (rev 294795)
@@ -0,0 +1,93 @@
+ ftypM4A M4A mp42isomiso5Pmoovlmvhd\xE8':@\xFF\xFF\xFF\xFF\xA4trak\tkhd':@@mdia mdhd\xBB\x80\xC75hdlrsounBento4 Sound Handler\xE3minfsmhd$dinfdrefurl \xA7stbl[stsdKmp4a\xBB\x80'esds@qq\x90stszstscsttsstco8mve
 xmehd': trex\xD0moofmfhd\xB8traftfhdtfdt\x8Ctrun/\xD8\xBB\xA9\xD8
 Lmdat! @h!M\xEFG\x87\xD7̣@_\xF4\x9F\xE7\xEF\xC7[\xD1\xB4ՁDG\xA9\x88\xF5 A'\xB8\x8C8)X\x92\xADZj\x98\xC0\x83K\x957\xADZ\xE1\e\xDA\xE4.\xED\xC5\xE8\xC7K\xF8\x9D\x9C(Œto\x89\xE6\xECӅ
+0\xA5\x8A0\xA5\x9DR\xF9\xB7[e\xDB(Q\x8A0Q\x8A,Q\x85/\x92vV\xA9\xC7B\x98)\x82\x8C)b\x8C(\xDF\xC2\xFEU\xF9OǾ;\xF0\xD8\xE5Xͱ\xCB\xA2~׽w\xCBx(&\xFF\xDB\xFF\xB7\xFFh\xE0\xEC\xEC\xEC\x808|!ց\x80C\xFA\xB0(\x88\xF5 Q\xA4"\xE0!M\xFFEA\xB4\x98W\xF6\xFB\xF9\xFB[ԁ@z\x90(\x8FR\xF1\xEB@\xA2A\xFDh\xA7V\xBC
+\xE1\xE9\xB9\xD3{\xE4ۑ\x8E\x86\y]z_\xA9Xq[\xCCI<\xC2Jp\x94\xE3\x89)\xCDe;\xD1e]\xD4\xE1@(\xFFa\xDE\xC1\xC9\xC1\xD0A\x92\x81\xF4EQQ~\xF9~٥\x8F=njQEQ~\xF9~\xDEy瞊(\x91E\xD11/<\xF3\xD4A\xF3ԁ@z\x90(\x8FR\xF1\xEB@\xA2A\xFDh\xA7V\xBC
+\xE1\xEE!M\xC7F[bT%\xF3Il\xD3\x9F\xEB?\x8F=p\xFD\xBF\xFAO\xE7\xF9\xF3֕\xEF\x9F\xFAg/\xAF\xA3\xAE\x87\xA9\x88\xF5 Q.\xAC
+"=:\x90z\x92\x9F1BX\xA0,Q8\xEC+\x97\x99\\xB9\xD4n\x986X\xB7\x95%K\xBC\xF7;\xCF<\xF7\xD1\xE7\x9Ey\xEEw\xB9\xF9\xFC\xDE\xFA<\xF2C\xCC{\x9D\xE0C~\xEC\xA6\xC7)\x92Tc\xC4\xF2xd/\xB7\xDD\xBD=c\xBE\xDBy<2\x8FʁП\x90\xF1s\xFF\xF7\xB6_\xF9\x98\x8C\x9B}\xACo\xF0 -\x9B\x80\xE9ÕA\xCD0\xDC\x8F\xFCh\xC0)\xA8M5\xF3SAEATL\xE9C\xE0\xF8>\x9E\xA4
+#ԁD\xBA\xB0(\x88\xF4\xEAA\xEAJ|!\xC0!`@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h\xD0moofmfhd\xB8traftfhdtfdt\xBC\x8Ctrun/\xD8\xE4U\xBA
 mdat! @h!M\xCFK\x87\xD7\xD4" l\xB3L$\xFB\xF5\xE7S\x8B߾\xFD\xDE?]y\xF8\x9A\xF2\xA4u\xA0P\xFE\xAC
+"=XDz\xB0(\x90\xF5`Q!4kب\xDB\xC4`\x98\x91\xC0F\xC9,Wi,`]\xA4\xB1\x83\xF8_\xF0_䝕\xF4\xDFB\xEB^\xB2\xF6^\xE6\xE5\xDEv\xE7^*\xF4}/7\xA5\xD1\xE9<\xFBϼ\xFCQE3\x99Q\xCA\xC1a\xF6\x88W<\xD8^\xB1\xF6\xB5\xE5yq\xAB\xB6jk\xA4\xA8&\xA5\xEE\xCC+wT\xDD\xD9&\xFF\x8D\xA9\xBE\x92v\xEC\xD3\xBBv\xEC\xCB	*\x94\xE7\xFCo\xA3jo\xA4\x84\x84\x95	\xBAr\xA2\xC1\x81\x81\x82Bj\xDF\xE7\xE7\xC1\xF2:\xD0(V\xAC
+"=XHz\xB0(\x90\xB8!MN\xFF\xFF\xFF\xE0\xFF\xFC嘉Aي\x94\x98\xA8\xC2YC+\xAAG\xEB\xAF\xC3\[\xFF\xE2\xFB\x9Dy\xD4\xD5\xF0\xFF\xFB]\xFE\xFFW\xFA\xBA\xFD\xDF\xDB\xFD\xBC\xFDk\x8C\xFB\xB9z\xB0(\x90\xF5`Q!\xEA\xC0\xA2CӁ\xAB\x89V\xB4
+?ՁD\x85\x9E\xC9S7\xA6F|H\xEF_{\xAA\x9Ai\xA6\x98\xE4\xD3Z\xB5\xE4\x90\xD3ô\x9EM\xB8:\xD1$\xBFeGvUZIZ\x92DA						*T\xA8\x9F?%n\xB8'\x91\x8F0`\xABa\xB2R_d\x90\xCA\xB698\xF4\xA7r\xB17B\xCB^\xA5\xA6\xFA\x9BR\xA92\xD8+J\xB5\x9DUE0Zƚ\xD5$STһq\xC1\xBA𦻌\x8Fdl1\xC3\xBC)\xAC\x8C\x8Fdggfvrgo'\x9B\xBB\xAF|\xDD\xDD}\xD8\xE1k\x91\xF91\xC31\xC31\xAD\xB5\xE1Mx\xD6\xE6F'\\xD5\xCC\xF4\x832$K\xBB\xD06\xCD\xE0|\xC1\xF0\xAC
+$=XHz\xB0(\x90\xF4\xE0_\xEA\xC0\xA2CՁD\x87\xAD\x81\xF5`Q!p!M/O]j\xA1`v\xA25>kۯ\xA5\xEBZ\xFF\xFE_\x8F宸\xD7\xFF\xF5\xBE\x9E~\xFA\xCF:6\xF5`Q!\xEA\xC0\xA2C֨\xFC\xC7\xFAҟ\x8F\xF87\x916"bJԕ\xA9+Z]\x9D\x9D\x9D\x9D\x9D\x9D\x9D\x9D\x9D\x9D\x9E\xFFէķ\xC0Mu<\xF3\xCF<\xF3\xF3sO?4\xF2\x92\xA2O\x87'\xE1\x96\xED\xCDN\xF8\xA4\x86}\xC5\xF0?1ݔ\xF4,V*\xAE\xF4T\xCC>\xF9.\xE9r)\xD54\xEE\xE7G]҂\xC0BA\x8AHk\xA8ǯ\xE8\xC0\x83\xE0\xF8>z\xB0(\x90\xF5`Q!\xEBT~c\xFDiO\xC7\xFC!`@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h\xD0moofmfhd\xB8traftfhdtfdtx\x8Ctrun/\xD8\xFB\xC
 8\x9A
 mmdat! @h!M\xBFE\x87\xD7ij@_\xF4\xDF\xFB\xFC|q%x\xC4\xEB@\xC0!\xFDXDz\x90(\x8FR\xEA@\xA0=HDJ\xA526\xAB\xB4\xC6M0f\x97Rˈ\xEC\xD6-\xB7+\x9D\x88\xB0\x83\x98#\xB9\xBDj\xD7Z\xE3.\xD7!|)K\xE1JY\x86\xCE\xC8ʧ\x95O</x_\xF1;8Q\x85\xE8ˋ\^=%\x9C\xC4\xFBQ\x85\xE9\xE1FU<tc\xA7\x8A-r\xF2\x8B\xB1C\xFB\xAF\xF1aFaFc\xA7\x8E\x8Ct\xB1K\YE\xFF\xC9\xFE\xFD\xFC/\xE8X\xE5\x8Dc\x969c\x969D\xC4ħ\xF8_ʿ)\xF8\xF7\xC7~\xA2\xA1\x8B\xB69c\x94LL\xD7}{\xC0\xF8/\xE0\x80\x80\xFB\xF6\xFF\xED\xB3\xB3\xB3\xB2\xE1\xF0|\x9Dh?\xAB\x88\
 x8FR\xEA@\x82=H\xA9\x88\xB8!M\xFFEA\xB4̐W\xFA\xF3\xFE\x9F\x8F:\xB7\xA9\xF8\xF5\xA0Q \xFE\xB4?Ӂ\xAB\x88\x8F^\xF0\xFE\xA4
+#ԁD\x84ۑ\x8E\x86\y]z_\xAD׫\x95\xF4\x95)\x84IMN\xEE2w\x86ew\xCA\xEEA\x9CvI\x95̛YE\xDA\xC8.\xD61t0\x8B\xE7 \xCD\xC0\x98)Ғı\x9CY\xE5IJ\x92\xA4\xB1\x9CY\xE5yK@\xA4\xB4
+g:\xC6p\xB1d)^FW\xDAe{\x99EQ~\xF9~\xDEy\xE7\x9Ey\xEF7\xA2(\xA2\xBA&%\xE7\x9Ey\xE7\xBCޡ\x9E\xA4\xE3ցD\x83\xFA\xD0 \xFFN\xAC
+"=x\xC3\xFA\x90(\x8FRp!M_C\xDBl\xDD&\xE0|\xFF]}=\\xFD؟w\xB5u\xA8z\xB0(\x88\xF4\xEAA\xEAJ| Sۥ\xEBj\x80\x9A\x87\xAE\xBF\xBE\xEF\xBFu5\xD3]/K\xB113\x99O+\x88\x91\xD1w]\x8F\x91"4]\x933\x81\xC1[\xB7\xCAVY\xCAl\x9A,\xFF0\xB5;\xD3\xC9ێ1`\xAF\x82FLa&8\xE2K-ё\xD7\xE4\x90q\xC43\x88ī\xEDs\x835\x88\xC7\x9E\xBC\xE8\xC3\xE0\xF8>z\xB0(\x88\xF4\xEAA\xEAJ| p!`@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h\xC8moofmfhd\xB0traftfhdtfdt4\x84trun.\xD0>\x89\x82
 
 Smdat! @h!M?G\xD7\xD4" l\xC3j\x84H#\xE9\xF4\x9D3\xDF?\xFD\x9F\x8E\xBE:\xD5鋭\x80\x87\xF5`Q\xEA\xC0\xA2#ՁD\x87\xAB\x89V\xAC
+$"X}A\x8B\xCCH\xE3b\x80B7䒘\xE20\x8EIb"\xD2@.\xD2X\xC1\xFC/\x83x/\x8BrNʬCE\xDA{\x9B\x97zˊx\xABL\xE9\xAFG\xD2\xF3z]\x93ϼ\xFB\xCF\xC5Qxu\ggJ\xD1$#\xB1\xA5\xD2䣆\xE5\xC0$\xD0_M\xECҰ/<ҰC\xC6\xF6,\xE9H\xC7"\xD6t\xA4o\xBD\x8B:\x92%\xBD\x8B:\xFBh\xABi\xAE\x81\xC3k\xA5\xE6\x92g\xF2uᎺ鮁A\xF2c\x864\xD6\xCF3\xB3\xF7c\x864\xD7Mh(8c\x864\xBB;;>\xE1M5\xD3Z
+\xE1M.\xCE\xCE\xCE\xCEÆ8c]4\xD7Ml\xEC((8c\x865\xD2T$Iʓj```\x90\x90\x9BV\xB0``bC\xDB\xFC\xEF\xE3\x9C\xC7\xF3\xF7{a\xC3\xE0\xF8>]h?\xAB\x88\x8FV\xAC
+$=XHz\xB0(\x90\xF5`Q!p!M$\x80\xFF\xFF\xFF\xFF3n2v\xE1\xA3	r@Vb\xA4f\x9CT@\xAC\xC6f+\xD7\|uz\xBD\xFF\xF5~\xF7\xF7\xD2\xEF\xFF\xE2^kO\xFF\xB2\xFD|\xF9\xF34\xFD\xE7\xD7_{\xE3˗\xFF\xDA}u\xFB\xF5\xC4\xAC
+$=8\xFA\xB0(\x90\xF5`Q!\xEB@\xA0C\xFDXHz\xB0(\x90\xF5`Q!TH&j\x9D%\x9B\x9D\xBC,\x9B\xAA;+\x9ATiQ\xA4\x8D*4\x99\xA5E\xA6ZD$$&\xA31,\xBD>&\xB1\x9A\xE2\x98\xF31\xE6U\xB0\xD9\x81\x81\x90$Z\xF6.<\xC4\xD4D'f\xA1V\x9E\x92\xF1+IS\xB0\xD7\xA7s\x8D\xB2ɩ\x9C\xCBYTi2\xCBL\xB5I\x94\x91					\xD5!! \xC0̄\x89;\x90\x95\x89\xBF\xBD\x8E+\x9DĴ,\xE4K\x83\xFD^7\xFA\xBCnMz\xF5\x97\xA8U4&
+\xA2	919\xAA\xECq\x9AU\xD3\xCD_UO5\x9B;*\x8C֙*\x95\x99e\xA6Z\xA5E\xA6jj\xAAZ\xE1d\xE5T\xB2\xD3-2\xD5*4\xA8\xB4\xC805\x90\x90\x9A\xE6w\x8E\x84\x94\xDBt%\xC1\x86<=\xEC8,l\xA4\xCAݮ\xBAk\xA5鵝\x9Cɚ?\xEF\xF8>\xFF\x83\xE0\xF8ՁD\x87\xA7\xFFV\xAC
+$=h\xAB\x89V\xAC
+$.!M?O۬\xC8\xAA\x8DE\xCF\xC7S\xF9t\xD6\xF7\xFF\x88\xF3֫\xAD^a\xEBT~c\xFDiO\xC7\xFC\x84\xA9b\xEA3\xD0*8\xF6\xBF.\xA2(x\xCA\xCC\xED\xE6%\xD8\xACO\x8Bc0W@\x97"\xC8A@a\xB0H
+$\xD1C\xE4v\x9E\xE2^X\x905Wz}\xF2]\xDAws\xA3\xAE\xE5\xFC\xCBn\xBA)!\xACK\xBF\xA0/\xC3\xE0\xF8>z\xD5\x98\xFFZS\xF1\xFF\xC0!`@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h\xD0moofmfhd\xB8traftfhdtfdt\xEC\x8Ctrun/\xD8B%I
 \xC1mdat! @h!@\xFE4\x81\xC0!M\xFFC_2\x8C\x82\xE3\x9F\xF7\xFCy\xEB\xE9\xEB@\xC0!\xFDXDz\x90(\x8FR\xEA@\xA0=HG\xA9\xF8\xF5\xA
 0Q \xF1-&\x88\x8E\xC3Sl񵳱\xA9\x9C\xD5\xC7Pܔ٪\xD5)\xBC[\xF0\x82\xCE\xCDR9R\x90
+\x91\x8A\xBEʔ\xC2$\xA6\x8C\xA6\xEA\xB5\xCC]\xAE\x92\xEDu¬\xBEe\xDA\xCA.\xD6AdXl|E\x93\xCE͓͕\xF3E\xED\x83\xEE\xE4N+\xB8+)\x96O8U\x95W\xBC/T>\xA8|\x8BLI\xC0Ig\xA52Q\x96S<\xE1ZU<\xD9V:y\xE1Yr\xF5EuŪ\Y\x8C\x92A\x80\x9A\xCE"T\xC9Q,\xA6Jy´\xB2\xAC\xAAx\xE9\xE5S\xC7W\xAE^\xB8\xB3\x8B\xD7\xF1\xBE\xD7<HQ\x85Q\x85\xE8ŒQeQeQeE\x94_\xF0\xBF\x95~S\xF1\xEF\x8E\xFC69EC3lr\xC7(\x98\x98&&JH\xAE\xFA\xF7\x81\xF0^\xC1\xFFo\xFEݐQ\xCFZ\xEA\xC0\xA2#ԁDz\x90 \x8FR\xEA@\xA2=Hǭ\x89\xB8!M\xFDC[\x86\x88-\xF6\x88\xFBz\xFF\xAFh\xFC\xFF^߯\xBA\x99\xE3\xB4?Ӂ\xAB\x88\x8F^\xF0\xFE\xA4
+#ԁD\xBA\xB0(\x88\xF4\xEAA0\\xF3\x8C\xF7\xD6r7\xF3\xCDۖ\xE6\xDE772\xA0\x9F\xF0H$\xFCb\x84\xA7\x93z\x9D\xF3\w4\xA5:\xE6T\xA5\xAD+\xB9ic\xCBE\xAB\x8Du\xA6+\x96.\xB2~Ѽ\x86\xEE%\xEFa\xBA\x93\x95Fcu+\xD0ND2!\xC1\xA4q'\xB0^E6\xA1M\xEC0\xA1\xF4\x98!\xB2\x93)\xAA)#\xA0\xC0\xF5\xBE-\xDF\xEF\xD2B~\x93\xAA@\xE5\xBBv\xEDۥJ\x89\xBAt\x86g$C\x86Be\xDD\xB2t'Y8\xF2ɪ]\x87$\x84
+\xD3"HA\x87'\x9E\x93&\x86m\xED\x95\xA1?!\xAB\xE0\xFFsjW\xE6R&\xB7=\xA2\xFF+^Z\x9D\x83\xE7\xAD\xF4\xE0A\xEA\xC0\xA2#ׁ@|?\xA9\x88\xF5 Q.\xAC
+"=:\x90\!MK۬Ȉ\xF9\xB4\xF6\xFA\xE9\xA5\xF6\xF5%>\xE7\xF4\xBF"Dh"\x82x.R\xB0\xD0\xDD\xF8\xA3s\xB8\x9A̔\x95\x88\xF7q\xADV\xB6m\x8D~I|$\x87\xF1\xB8\xB7\x83\xE7\xA9)\xF0\x80p!`@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h\xD0moofmfhd\xB8traftfhdtfdt\xA8\x8Ctrun/\xD8\xF4s\xA3
 mdat! @h!M\xFD:\xD7\xF1\xF7\xEB\xEF\xAE,\xF5\xEB\xE5
 ց@CĿ\x81_\xF3\xED!\xFEi_\xF2&\xFE߂R_j\xBE \xFEߖ\xE2_\x9C\xBDD\x83O\xE6ؗ\xEA\xD7\xF1G\xF8*\xFEk\x89~\xB3\xC4\x83w\xE6D\x97\xEC\xD3\xF1NG\xF4\x81\xF7ԗ\xE6\xEB1\xE0\x8F\xF8\xE8%\xFBk\xFC&\xFD^\xFD\xC0%\xFA'\xFA\x92G\xF6\x97\xF7T\x97\xEB3\xEA\xB1\xD2?ϒ_\x9D\x8F\x95d/\xDF\xC9~G\xFE\xFCm\xFB\x88\x97\xE2k\xD4D
+\x9Ew%\xF8\xF2\xA1\xBE\x9E%\xF6\xD7\xC1d~\xCD\xF5b_\yy\xA8\xFCd\x97\xD2\xDDI\xC4%\xE2ґ\xF1\x89\xF8t<' \x9FI+8	\xE9
+C@ry\xD4\xCD(\x9Ee\x842\x8C'\x86D\xA8+\x86\xFC^\xA2\xC8\xB4
+\xE0!M\xFFKܩ\x885\xFE:\xF8\xE3Pz\xB0(\x88\xF5`Q\xEA\xC0\xA2CՁD\x87\xAB\x89V\xAC
+$=8\xD2s\x88\xC5\xC1\xFC9-K\xF2	\x88g\xA7TO\xB7p\x96\x98\x89h\xA5d\x90\xD3ô\x9EM\xB8:\x8CIJ\xF4\xF4C~[\xE2\x81\x85\xB5\x9B\xB2\xB8_\x93(\xE4-\xFC\xED\xF6\xB7F֣|\x8Fl\x{11D77A}\xAC\x87|n\xB6\xE9+\x975\xC52\xD5+\xBB\xAAߙ\xE2\xED\xFD\x94ox\xF3\xE2vwog\xDAmћP\xE5Խ\x87\x8FfV\xDEN\xEB\xAC\xED[\xF6F}\xA6e\x85\xA2yЭ4Ͼ\xABظ\xEEu\xBFf8j\xED\xEAW\xA2\xF5m\xA7ڷܖF=\xA2\xB3j\xEB\xD3\xCD3\xEB\xF2\x9E\xC3dz\x9CVŅ\xAFWa\x96\xAE'\xAA\xEDY\xCE+\x82\xC8䫪\xCCC\xD3LU)Tg9\xC5Yg\xAB\xD22O+\x89(\x9CN*v{+e\x92\x91,\xC0\xA5E$RD\xA6J%\xA7\xB6\xB9Y5Tj\xA9Q\xA5E\xA4JxA\xB2j\xAAj\xA8\xD2ʹ\xA5F\x95\x80\xEA;\x9A\xB6vv\xA9\x9D\x9F\xBB1\xC3p\xA6\xBA]
+\x82A\xEE\xC7p\xC7\xD8\xE1Mh \x81\xF3ՁDG\xAB\x88\x8FV\xAC
+$=XHz\xB0(\x90\xF5`Q!\xE9\xC0\xBE\xE0!M\x92\xFF\xFC\xFF\xFF\xFF\xFF\xE6,\xD6f\xD5R`\xEC\xD6h
+\xCCf`\xEEVb$?\x9E=\xB5\xC2\xF3\xFF\xEC\xBF\xCC\xFDS.\xFF\xFE\xE5/\xE5\xC3X\xFF\xFBo\xE7\xCF\xD5|C\xFF\xEE>\xA7Z\xE3\x8Ff|\xBDXHz\xB0(\x90\xF5\xA0P!\xFE\xAC
+$=XHz\xB0(\x90\xF5\xAA?1\xFE\xB4\xA7\xE3\xFE\xEDR\xF1\xDAJ'6\xCFM]\x8A3\xEB:\xF7b\xCEx\w\xCEl1\xD5\xE9\xD8歫\xD2/Lg[5m^\x91\x92cݎ\xF5\xF7c_v8c%8\xF7c^5\xBB;;R\xEC\xEC\xF3\xB9	X\x9B\x85\xA4\xFC\xBC\x85}\xE3A\x91;\xA7n\x9D\xA1<\xF3\xCEs\xCF5\xE3,b\xEBa\x93\x9F'\x9A\xAE\xC7嶮\xAD\x89}U<\xD7Z଱\xAA\x94\x9A\x92\x91dūe&\xA4\xA4[1\xC3\xAFp\xC3)y\xBA\xF0\xC7kvvsgggtpgg7\xE3\xA1%6\xDD]\x87\xEB\xAA\xD5\xD8a\x82,l\xA4\xCAݮ\xBAk\xA5鵝\x9CɪC\xCE)Sy\xB1\x82\xB7\xE8+\xF7\xEA0\x99\x8F.\xB6AV\xF1,*"\xC3+A\xB0U\xC2<\xC09!\xCBH\xB0\xCD\xCCP\xDC1b\xE3\xCC\xACf=J\xF7\xBFW\xEC(\x8FE\xBA\x8D\xF6\x92\xDDv\xA9\xD0*\xCBᆵ̥Q\x8F_\xD1z\xC1\xF0|\xEA\xC0\xA2CՁD\x87\xAD\x81\xF5`Q!\xEA\xC0\xA2CՁD\x87\xADQ\xF9\x8F\xF5\xA5?\xF7!`@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!
 @h!@h!@h!@h!@h!@
 h!@h!@h!@h!@h!@h\xD0moofmfhd\xB8traftfhdtfdtd\x8Ctrun/\xD8R\xD5o\xA6mdat! @h!M\xFB7\x87\xD7\xEB\x97\xF4\xDF\xFC\xFD\xFA\xE2+\xC7\xCF\xCAZ\xEA\xC0\xA2"%\xFB\xBE\xFD\xCC\xFE\x9F\xC0Ȏ\xF7\x80\x92\xE3\xFCԗ\
 x9A\xFC\x8AC懰\x88âK{\xF9\x9F'\xE3?c\x92Ꜩ\x9F\xE3\x8F&JIH\xFE\xBF/$\xBF#v\xC8\xF6.&K\x81\xE7\x88\xFE?\xFE\xFC\x92\xFB\x87\xF3\xAC\x8Fޒ\xD3f\xC8\xFEk\xFF	d\xBFY\x88\xFD\xE2\xF9\x82K\xEAĒ<O\x80\x92\xD3j\xE8r\x84\xB1xB?\x8D\xA6d\xBF/\x88\xFD\xC7\xF8\xAEK\xEB\xC0R:mA,\xD6d\x8EKK\x89#\xF5\xFB\xDF侕\xFB
 \x8F\xCE\xEFC\x92\xF9_\xE5\xB28\x9B\xA4\xA6\xE1H\xE3j\x8F\\x8F\xC7\xEF\xF8\xA3\xE1?;i/\x80\xDDT\x8F\xBA9\xF1/hrB5*\x9F@\x8C\x82\x92B4\x90Hp\x88\xFA|K\xCD[">Z\xD2\xF2fD\x8F\x8E\xB1\xBC[p\x8B\xD4I)"\xC1I\xD1%U\x92H\xF0D`\\xED\xDC\xD6[Ygc+\xEB\xB6\xEF\x92tyDt4\xB9_|\xB8\xE9\x9D\xD4h6L\x8A\xA0΢\x99Qa\xB2\x89\x99\xFE\xF3\x87\xB2@\x8C>\x90:\xD00V!M\xFF;\xDF\x98\xA1\xFF\xB6~\xFF\xBF\xB6\xA9\x9E\xA4
+#ԁz\x90(R\xEA@\xBE=hH?\xAD\xF4\xE0A\x97$\x95\xBA\xC4eD%rQ\xCD%mdaf\xB3R\xB0\x9DB\xD1':.@8ԧfe\xDBd\x91\xB9\xCC\xC2I\xEAD\x92)F\x84у\x98	\x9F\x85\xDB\xCD\xD0\xF2\x811\xF7,\xF0L\xB3\xFB\xFD\xE5E\xF8?7K~\xD4\xD2\xF7\x85\xB5=e\xE0\xDC\xDFww\xBB̗a\x96K\x9F\x8Ac\xACE\xC9S(\xF8\xAAY&\xF6\xA1	\xFA2\xA0\xF6\x9D\x97\xFB\x8C\xD7\xF7\xCC\xC7f\x8FҬTQA\x97K\xD5\xD4)yʀ)̃\xE7|_6@\xF5\xB2(\xDC\xDE\xFCV=}\xDC{\x95\x90&T\xD0C\xF2޲\x96S+\xAByZ\xB0<\xBE.\xA6\xE8J\xE2\xE7M\xA6@\xC1\xC0\xC5\xF9k "ep|1\xFD\xE7һ\xA7\x9B\xAC\xD2VB\xF9_\x8E\xF6\x9Ev䝅\xE6<\xA5\xB0s\x96\xF8\xDE\xFF\x8D\x92\xFA\xC3w\xE7\xDF\xD2;\xCFfa\xC6z#)\xED\xBBV\xDBb\xF32\xE8<6\x83\xADVkZ\\xFBMi\xAB\xD5^a\xE9!\xF2\x89\xFBD~B~\xBF\x8Dm;M"\xBBm\xC7cq՚\xD5,s\xEBe/ϯЫ\x9A\xAF\xBAђ\xFCA\xF7E\xA9^\xB5{F\xEA\x90\xAEc7\x86e3\xC3½S\xDB\xE6\xED\xC7T\xD2L\xF3H\xD2MSH\xD2M#*+\x8B:\xA2\x81\xC3\\xD0l\xDD~7\\xDDQ\xBCqwT\xB8\xAB%d\xA7\x8A\x9E\xA4
+#ԁz\x90(R\xEA@\xBE=hH?\xAD\xF4\xE0Ap!M\xF1A[\xA8\x88%\xF8D+\xBA\xE5\x88\xF9\xFE\xAF\xF1\xF5\xEDx\xFE\xBF\xDB?\xDF\xEF\xED\xAA\xC7??\xEB7\xBF\xE6\xFA֮\xFBz\xB0(\x88\xF5\xE0P\xEA@\xA2=HK\xAB\x88\x8FN\xA4\xA4\xA7\xC2_Rx7Ur.\x92\x9FG\xDBը\xFE\xE9\x84\x9F\xACnJ{)\xC5w\xB4oN\xBB6\x{11BBEC}\xB0\x89\xEAi\x88\xFEi\x9DI+ai/(\xAF\xEE\x94kǪyUv\xC8\xCE\xD9\x80\xBF\xC1@\xE1\x9Er\xF7\x86y\xA7?\xEB\xB0:h\x9BRy߲4O,\x88=\xF4َ\xE0\x92\xA6J\xF4\xF2\xC9,\x93\xCB#"\xEE\xF3P\x9Fڕ\xFAO!\xFAN\xB9#\x95۷r	\xBBL$\xA9R\xA1!$39" \xFE\\x983\xC4,\x83\x9D	ĖN<\xB2t\xAF\xD8\xC7':\xA9	8j"	S\xABy\xBC\x9C\xEA\xD60\xFF\xF3 \x884@\xBFGm\x93g\xA7\xE9,\x8E,\xD7\xF3\xDFk\xB9\x8C\xA7\xEB}X\xFE\x99""L3푓\xED6R\xB2\xC5Eߊ7;\x89\xAC\xC9Iq\xA73q6[4\xF5\x88w\x9D\xA64\x8B4\xF5\x89,\x8ER\xA4Lq\x99\xF0\xC0Nx>\x83\xE0\xF9\xEA\xC0\xA2#ׁ@|?\xA9\x88\xF5 Q.\xAC
+"=:\x90z\x92\x9F	\xC0!`@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h\xD0moofmfhd\xB8traftfhdtfdt \x8Ctrun/\xD8pu\x9A
 \x8Fmdat! @h!M\xF7D\x87\xD7\xE8\x97\xC7\xD7_q*\xBCz\xFC\xA0\xEB@\xA0!\xFDXDz\xB0(\x88\x89p\x8E\x8EC\xCF>S$ntG\xB2\xFAl\x9D\x9Ca/\x91<\xF4\x8F\xA8z!.[\xAA!\x85\xDF\xDDu\xC9\xF7y\xD8,\x8F\x95{	.\xE1Ȱm1a0=ݫ\x8D#\xE5\xDE\
 xDAK\xC2\xDC\xEC\x94\xF9\xE2l\xED6=\xC6\xF0_6%ָ\x99!a\x88\x8A\xB9,@\xC8\xD7\xF4\xB2^\xE5${'%\xD2w\x84\x99\x8B"\xBB\xE4\x8FT\x89\xE5\x92\xC40\x8D\xC4\xA0b2LG\xC5\xDC̗\x83\xB8\xE1\xED\xC2Iv+\xC1'\xE1\xC1\xB4I\xD5\xA6y+\x8D#Q\xA4\xA7\x8C\x94\x91\xED;\xA2]gVG\xA4\xE7\xC9s\xBC\xA9&\xCF"\xB9$\x8F\x89\xA1\x92\x90\xB21RJ\xB4\xA4x\xD6\x97\xB8G\x84U%\xC0g\xDDI%\xB3\x8AHl"\x923\xAA3\xB0\xF2	\xB0"\x918\xECcݡ$L\xA1#\xA1Y,ڈ\xE6JK*{\x91\xA9\xB1\xDF~\xADG\xF7/\xB0\xF8\x97\xC8\xFD\xBA\x85\xBB{\x8Bl\xD9v+\x85\x81C\xBE\t\xB6\xC8$\xEDj\x92`Ηs\xA4f\x9D\xE9\xBD\xF5\x9B\xD3o8^c
+b\x85dQ\xE1K\xB1F+Po\x83\xE4h?\xAB\x88\x8FV!M\xFBKڬ\xC5;\xB5O\xAFomyV\xFF\xF8\xEF\xF5׷\xB6\xA4\xEC\xF5`Q!\xEA\xC0\xA2CՁD\x87\xAB\x89V\x9C\xFDXHz\xB0(\x90\xB2	\x88g\xA7TO\xB7p\x96\x98\x89h\xA5d\x90\xD3ô\x9EM\xB8:\x8CIJ\xF4\xFD\x96\xA5\x9B\xBE^\xE0\x95A\xD7\xCE^\xB7pw\xDCveC\xA1\xC2u\xDCw]Ǩ\xFDZ\xED[_T\xFDB\xF2\xAE\xC7\xB4\xE2\xAD\xD47r\xB6\x9CV\xBA\xDC\xC6ӊ\xB2\xC9a\xA8^\x98\xC3J\x96\xE3i\xC5N\xCFa\xAB\xB2O*\xCCa\xE3\xD9\xCE+b\xC2׫\xB0\xCBW\xD5v\xAC\xE7\xC1drU\xD5f"\xCB=#$\xF4\xF2ɉD\x94M\x96zFJ\xBD#%"\x81\xE4\xEB\xEEǻk\xA6\xBAkaaa\xF2u\xF7c\x86=}\xD8\xE1\x8Dh\xA8\xC0\xC0\xC1!5-Z\xC1\x81\x81\x82BB]܉\xCEC\xA8J$+D\xF4[\xCFh枹\xC7\ň\xE5ً\xA7b\xAE\xA8\x93\xB7\xAA\xEDX\x99\xEEU\xC0䬻N*\xCB=\xC1dl\xD6Y\xD9\xE9\xD6i)\xCD[)e%"ً& \xC0\xC0ڤ$$\x90\x91"nC\xE0\xF9\xEA\xC0\xA2CՁD\x87\xAB\x89V\xAC
+$=8\xFA\xB0(\x90\xF5`Q!p!MJ\x80\xFF\xFF\xFF\xFF\xF8#\xAFRd\xF5F \xADW$A^\xA7i\xF8\xFCy\xF6\xE2\xDB\xFD\xDE?z\xD7\xAB\xDF\xFF\xB3\xCF\xC7_Q\xDF\xFF\xDC\xFAO\xC7S\x89\xE5\xF6z\xD0(\xFFV\xAC
+$=XHz\xD5\x98\xFFZS\xF1\xFF^P\x97k\xE7\x84\xDCM\x89\x9D\xC7\xE9\x988\xFDӿ\xF3\xC7O\xEA\xCC\xCF^l\xFA\xA6M\xA7\xBE\x83Mʛo{\xDE\xF2W>]\x957\xD9
+<~Ynn\xBB\x89\x8A\xD0$\xE5\xE2@\xD4k}8\x90\x85\xFE]k\x85q\x96}\xCD4\xD53\xE3,\xFBsS\xBCgj\xCAq^U\xCAx\xF7:٫k5\x96JFvy\xABf\xAD\xB2VY\xEA씋V\xCD[z\x9E\xAE\xC9H\xC95\x92\x97gn\xBC)š\xE7\9.lj\x8463\xC0\xEF\xA9T\xE09\xFD5\xFCT\xD5'\x98'\x98&,\xA6\x9A1\x91\x85f\xC9\xEAC\xCE)S\xB8;@\xACC\xDB\xFE\x80џ~\xA3	\x98\xF2\xEBe.\x9E#\xF7C\xEF4+i[\xC47\x8D\xC2\xC6+\x8F<\xCCuJ\xBA\x8B\xBC\xA0/\xD9mr&\xB1>-\x8C\xC1Ye\xB7r\xAB\xECU\xFEh@\xC2\xD4鹃\xE8t%\xD0\xDD}\xD0{)\xB1\xDF\xD7\xDD\xFB~\xC8\x91\xEAb?\xB2\xFEה\xA9\x8B\xFE\x83\xE0\xFB\xFE\xB4
+?ՁD\x87\xAB\x89V\xB5G\xE6?֔\xFC\xC7!`@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h\xD0moofmfhd	\xB8traftfhdtfdt\xDC\x8Ctrun/\xD8\x80\xC1^
 \xAFmdat! @h!M\xEF<\xD7\xE4\x90/\xFC?\xDF\xEB\xCFEx\xDAh?\xAB\x88\x8FR\xEA@\x82"_\xFE-\x91\xF9i\xF2,\x8Cy\xA8\xD8#!*\x93\xC8ŀJ\xACRSd\x90\xCDX\x9BI\x9AO$\x83\xC3ᤅ\xA1'g(J;\xF1\xFFg\xC
 7V\xBC\xA8\xBF\xE6\xE2>"\xECd\xBA\xA7 #\xF8\xA4d\xEE>*\xB2Am\xC4Ip\x9DQ\x8B\xF8\xC4P8\xEAc\xED\x9Cȗ@\xE1\xA4yȗ	ϑAI7h?$Eb\xC7óC\xF8\xA21\x8F\x97f\x9E\xA6\xCB\xC5\xC9t\x8EG\x99k\xC9r\xF9\x8C\x90\xFD\x9F\xC1(0!\xFFg\xF7D\,	x	l\xE2\x91\xE292\Gs|\x96\xBE\xC7\xCC\xF4\x97\xB0\xEB\xEFI\xEDn\xC1\xD8\xD5(\xAA`~'҈\xE9\xE9\xD0L#\x9A\x8CK)\x8E=\xE4\xB1kػA\xBE\xB1\xCCK\xAAg\xAD#yM\xAF\xEFa\xE4\xAEm\xE6\xEDS\xAA\x88\xDE!+b#`uk6\x9DMF+t\xC9M\x97t,\xED\x87:X\xA6ja\x83H0\xE9t\xB41hRZ\xC3\xE1k\x88\xEAǍRЯ\xB4\xAF&\x9E\xF7\xE6\xFB\xE7\xE4\xFFT\xFA\xBF\xC9=\xAE\xF2\x8C"\xAEq\\xCEI\xC6q\xCA.\xA1\xF0|\x87Z\xEA\xC0\xA2#ԁDz\x90 \x8B\x80!M\xFF;ۥj\x8C$A?\x8F\x9B\xFFO\xE7UU\xE1\xEA@\xA0=HG\xA9\xF8\xF5\xA0Q \xFE\xB4?Ӂ\xAB\x88\x8F^\xF0\xF1\xCD%mdaf\xB3R\xB0\x9DB\xD1':.@8ԧfeܝ\x980\xA4\x8D&M\xC5̣%\x85ᒠ\x89\xE19\xF5\x98"x/D\x90\x89\xDD\xF8S\x93N\xBF\xCÀ\xA2s\xBE\x89ی'\xEA\xF4\xF8\xE2g\xFB/\xF8\xF7wJ\xDE<
 ;\
 xDD\xF57\x8C\xB5\xE1\xEC\xE6K\xC0\xC7d\xBA\xC9p\xB2\\xA4\xF4\xF9-j$z\xAA\xED\xBA\xA2\xFAE\xF1\x86\xDAh<\xF9\xED\xEBQ\xABk\xF9\xE5?\xB1\xED\xF9ĝ\xB2eM?-\xEB)e2\xB0\xFA\xB7\x95\xAB\xCB\xE2\xE0n\x804\xAE.t\xDAd_\x90\xE6\xB2&W\xC0s\xCB\xF3&\x8B\x9F	]\x83\xA1?\x9F\xDAyےv\x98\xF2\x96\xC1\xCE[\xE3{\xFE6K\xEB+ߜ/H\xEF=\x99\x85\xFC茧̙o\xB8\xFA#j\xE9j\xFFA֫5\xAD.}\xA6\xB4\xD5ꊯ0\xF4\x90\xF9D\xFD\xA2?!?_\xA8I\xC1_\xE1\xAAu\xEA\kY\xD3gZ\xD7E\x8DD\xBB\xDCd\xC6x\xFCE\xC5.)lOby+\xE0\xA7B\x98\xA5Ѕ\xD0FE\xCATpI\x9EiI\xAAiI\xA4eA\xA0`QgTP8k\x9A/\x91J\xF7\xC6\xE4\xAEb\xE2\P\x80
+$	\x84\xD8]\xDC\xF1A\xF3ԁ@z\x90(\x8FR\xF1\xEB@\xA2A\xFDh\xA7V\xBC
+\xE1\xEE!M\xC7?ܨ\x88\xF8\xC4+\xF5L|\xFE\xF3\xF9\xEB\xDB\xD9\xE2\xFE\xDF\xF8\xAF\xFA\xF9\xFDj\xEA\xB7\xF9\xFE\xF3\x9B\xFCi\xE7\x8C뗩\x88\xF5 Q.\xAC
+"=:\x90z\x92\x9F]@\xADY\x90\x83\x82\xB3'&\xB3N\xAE\xFA$\x95&\xF4(\xEA\xB5\xE7D\x8E<i\xA3\x80\x90\xD8
+\xFFM+\xE4\xD9\xE7\xECZ\xF7\x82\x81\xC3<\xFA\xEC\x9Af\xC2Ԟw\xEC\x8D\xCE\xCDm\xB7Twm\x87+\x85\xE5[\xC5ez\xD3\xC9%\xA2\x9D\x82c^\x9Dd\xF2t\xAE\xA9	*T$$\xA8\x93\x9BhM\xD1%p!\xDF;9uC!\x90\x99wD2\x88\x99O\x92'\x8Aɓ\xB3\x88\xBB\x94OI\xB3!\x9A\xE3$0\xC2!\x9C\xD2[\xF6\xA5𓹆\xC0\x92M\xAA!:\xFE\x84\xB9>\xDF\xC9Ë\xF5-\x86AO\xF4x\x86.\xEB&A\xD2̾\xE1Ha\x8E\x9B\xC8\xCF1\xA2\xDD9Q\xC8оG5\xB1#\x85\xB0F)\x88\x90\xC3׸q#-\xF5\xDBf\xA9\x8C\xA3/\xBD+\xE3{W\xBCs\x8F\x9Dw\xC59뾋YY\x9Db\xBD\xCA\xDB\xCA\xABqx\xC5X\x9F\x98\xCE\xD8\+2\xC1\xF0|\xF5 Q\xA4
+%ՁDG\xA7RRS\xE1!`@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h\xD0moofmfhd
+\xB8traftfhdtfdt\x98\x8Ctrun/\xD8\x82\x89y\x94mdat! @h!M\xCFA\xD7\xDD 7\xCD$ \x95\xE7\xAC\xFDѝ\xFA\xFF\xFB_\xC7^|\xEA\xCF\xEB@\xA0!\xFDXDz\xB0(\x88\xF5`Q!\xEA\xC0\xA2B%\xE5?w\x90\xFBS\xF5(\x8F\x90\xB8\xB9.\x92#̶ķ\xB9R<\xDBxK\x88\xE8\x88\xC6Q'\x94\x8F+
 \xDCc\x88\xEA0D\xB3\x96H䨒\xC5K#\x83\x8AJ\xEC8$\xAD\xB4\x8Du\xA6r4Jh\xC8\xCA"\xED\x8DgD\xA0UA&eD\xACyt\xD2\xD1|\xE7\xBBw_\xAF\xCD9\xBC\xA5\xEB\xAC^\xB0\xB9؄S7?\x92×\xEE\xA40\x93\x8BPκ\x91\xE88{\xD3\x83\xD5R\x90\xEF\x99\xD8|\x8B-\x9F\xFC\xA4Wpm\xE2{\xADD.ѡ\x87դN<|,\x95\xD6W\x9A\x
 BD~\xE3\xDC[\xCB<\xF7wL\xEA\xEC7\x97\xB8\xA7CY$@\xF5~֫`x\xCF3n\x9E\xA2r\x95\x83\xB2\xB2\xED\x950\xFF\xA7\xF0_]\xF3\xAF\xE6]\xFD\xAFtU\xCBaM\xB8V1E~\xDB\xEB^s\xC6\xDCͯu\xF6\x89\xC9ak\xD5\xD9*\xEB+3Y\xE8_U\xEC\\xA7\x8Fp;W\xB0\xE4\xB26j\xCF,\x98\xB2b\xDA钕Fr8\xACM\x9A\xCB=^\x91\x92\x91\xA2R$$\xA8HL?\xCBjmM\xF0\x91!0!\xF0|#\xAD\x80\x87\xF5`Q\xEA\xC0\xA2#ՁD\x87\xAB\x89\x80!MN\xFF\xFF\xFF\xE0\xFF\xFC\xBD\xE6bAڬ\xCC\x9AȂY\xAD+&~\xFF\xF8\xFF\xD3\xF6\xFF}\xBC\xCBS\xFF\xC7\xFD\xFA\xF8\xF2?\xFA\xFE\x9F?i\xE5\xDBՁD\x87\xAB\x89V\x9C\xFDXHz\xB0(\x90\xF5\xA0P!\xFE\xAC
+$+LD\xB4R\xB4ڥ\xE6\xFC\xCEt\x83\xCA\xEA\xBA=}6tj\xD1$\xD2L,,,(\x88\xAA1Í$!;\xDCN5<\xC4.\xBBZ\xC9H\xED\xB8\xEC\xEA\xCB:\xD9\xE9\x8Eӊ\x9D\x9E\xC3Wd\x9Ed[5d\xF4œ\xAD\x98\x9Adő\x9C1\xC3\xE9ƺk\xA6\xB7ggfvvwggf&#|\x87D\x97>\xD8?\x81\xEEx;\xC1c\x8C\xCA\xEC\xEA\x98,\x80\xC0Ĕ\x96D\x84!͢\x922yml\xFF0\x96\xEFED\x8E\x80\xE7W\x92\x9B\xFE\xE5\xCD\xC5\xFA\xCCո\x96\x97\xECmk:\x9Df\x92\xE3M\xDAI\xE4q#UN\xC75m^\x91zb\x9CGhF\xB6Ri\xABf\xA6\xA4\x9A\xB2b\xED\xD2(5l\xA4\xD3-2U&ZEjZ\x99i\x91d\xD5T\xD5M\xA5\x95\x93UF\x95RZ\x83MUKL\xB4\xCBL\xB4\xCAT\x99I\x91
+\x96\xA9\x96\x99h)2$K\xBB\xD06\xCD\xC0|\xC1\xF0\xAC
+$=XHz\xB0(\x90\xF4\xE0_\xEA\xC0\xA2CՁD\x87\xAD\x81\xF5`Q!p!M/D_T\x90\x81\xBEi!~A+\xEB\xBF\xAFo\xB7\xFF^}\xBE\xF7\xD4\xC7\xCF\xFF\xDA\xFDt\xFD\xFA\xCD^\x9Fg\xAB\x89V\xB5G\xE6?֔\xFC\xC0Kщ\xFB\xA3Ԥ\xAF\xCB"b\x93\x8B\xFEo\xA8\x92r\xA8I	@L\xAC/\xEE\xFC\x97\xC2\xF7\xE5`\xFFw\xEA\xDF#\x90\x81\xF5_\xB7|\xADzn\xD5\xC0\xE7Y\xCEJw+e\x92\x9D\x92j&\x9A\xE7\9.lj֯\x95u\xB6L\xEF
+RU\xA6\xF91\xBA\xAB\xA2΢\x94\x81Z\xA6\xA2=jJ\x88S\xE8\xEB`\xFD\x9Fv\x9E\xF5\xC0\xF1[\x8EK\x99dh\xA8d\xB90\xEB\xC4%\x8C\x8F0\xA2\xFC$XV%b\x9AK\x8FhɬD-\xB7\xFAS\x8C鲈\xF1\xF9\x88\xB8~[ڤ᠀\xE5J\xEE\xC0/\xA8\x84gMĤcI\xCBf@IS\xB1	\xFD\xB8\xC6\xCF\xA8\xAB\xA5a\xE5\xB0l΂ǂj$(D\xC08\xC8,\xA2\xFD\xB9\xCF)IQ\xB4K)*\x87VG\xEA\xC8)\xBD\xF7\xF1\xDF\xED\xFEP\x88 \xD6\x93Ai*\xD6hu~\xE0\xE6lZ\xDC>A\x95M֙s\xC8T\xC5\xBD5uԸ\xB9$\xBC>\x83\xE0\xF9\xEA\xC0\xA2CՁD\x87\xADQ\xF9\x8F\xF5\xA5?\xF0p!`@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@h!@hxmoofmfhd`traftfhdtfdtT4trun\x80d
 \x88]Wmdat! @h!M\xBF@\x87\xD7ۑ _\xF8\x9F\xE7\xEB\xE3\x83}\xFES\xAD\x87\xF5`Q\xEA@\xA2=HG
 \xA9\x80\xF5 Q.\xCE\xC8\xF5~\x95\xF9\xDC\xEC\xC8\xE3\xE0z\xED\x8Ci\xA0\x81\xAD{k\xF8\xC43\xF5\x81g\xE9\x82\xD4N+\xBF\x8A\xA8\xC0L\x8E\xFBԯ\x92V\x97\xF3J\xD2ށZ\xD7\xD1<\xDA\xDA'\x928\xFBĭL۳\x90\xB8\xA6\x92\xE8ڻ\xC86\xD24\xA3\x92\x8A\xDAe\xD50\xBA\xB1̅V\xBE\xAA\xD7\xD1\x9D\xF2XJDl\xC8%B\x8D\xB6\xA7\x986\xDD¦wZ\xEA\xACs!j\xCA5n\xDB\xDA=}\xC3\xCF%zA\xF0\x89Ru\xB3=E`\xD4\xCC\xC5\x87j\x9Cud\xCCULm+R1\xB3\x85\xB4Fj\x89I9\xC4%.\x96'K\xA5\xA9e46\xE9u8\K'\x9C-\xA3\xAA\xD8\xF6\xEB5\x962\xABQGiLuH\xEA%\x94\xC9O!<\xE1ZYZYV:\x98\xE8\xC7O<uz\xFC\xB7\xA8\xB9G\x81r\xAFG
+0\xA60\xA3
+0\xA6
+0\xA3
+1CeC\xEC}\x97\xB5\xED\xFB^ڀ\x91$5jը!\xC3\xE0\xF9:\xD00V\xA4
+#ԁz\x90(Rp!M\xFF=^\xA4\xC57\xFA\xEF\xF5\xFD\xFC\xEA\xAB\xA4\xE3ցD\x83\xFA\xD0 \xFFN\xAC
+"=x\xC3\xFA\x90(\x8FRP#\xC0\xE1\xF6a7\xA7\xD1	\xAAt2c\x93o#\x9F\x9D\x97:\xD3$GeZ\xA4\x91\x89kL\xCF\xC2\xED\x82f\xE8y@\x98\xFB\x96x&k\x8C\xAF\xE3	i\xF9\xF9\xA7$\xF0j\x87\xC8\xD4Wl\xBD\xECn\xB9U\xE0]C%\xCA%\xC0\x83%\x94L\x91Ǎ!tp\xA0\xBD\xFA\xD2\xCB\xF6/\xBA'\xBE0\x9B\xF7\x85\xFC\xD5\xEF\xA5|\xB3M\xF6f\x9B\xFB\xC6\xCF\xFC\xE6\xC7\xF3\x8C\xFFϙ\x9F\x964\xBF-f_d\xE5|\xD9I\xF9g;ޔ\x9F\xEF>/Fa\x80\xF3\xBDys\xFAf\xFF\xC3&\xFE<\xFE{\x83\x90\xFDcr\xE9J7ոn\xB2\xA5y\xA6_\xE3U\xF5\x8D.\xD1W\xEF\x9Coc\xF0B\xBF\xB0[\xEB\x94{\x86\xAB\x82\xD3\xF3\xAC\xD72\xC0\xF4\xAD\xF7b\xCCaa\xE5t\xBE\\xE3w\xC5r+\xD2=\xA4f\x9Ak\xD2vP/Zy$\xB4S\xB0Lj\xE23
+UO$\xF2\xE5,\xEB=\xF7Ys]e\xB6=\x85}w\xD7{뮚滯\xBB\xF1\xB5%cF\L\xB0,Zz\xA2U\x90]\xA1"Nm\xA1"e\xC3\xE7\xA9\xF8\xF5\xA0Q \xFE\xB4?Ӂ\xAB\x88\x8F^\xF0\xFE\xA4
+#ԁD\x9C!M_9\xDFP\x85_\xA6C\xE7\xFA\xF9\xFA\xFA\xF3\xC63\xBF\xB3\xF3\xDB_\x8Dqz\xD3\xD7\xCBՁDG\xA7RRS\xE1\x96&G	\xC1-\xE5gТ`x\x89D%&\xD9\xC5$YYդ\x93H\x8A!\xE4\xE6\xE7U<"!q 0\x88	o\xF4\xBCe\xDA=\xAD\xAEx\xCBp\xDC\xD7-\xD6Oͩk6U\xE4!(\x80C\x81\xEEHhRF\xA6\xF8\x8F9\xEA\x84\xF0\xD2{?\x92\xA4v\xFCp\x8F_\xF0\xC9\x80\xBCT\x86\xB6)\xF6\xA2<k4NMs(\x91\xCFc.Ʉ\xF09,|\xE2U\xA7=2p䐁ZdI0\xC9jqd\x90h!\x93\xEA8\xFC\xAENL\xFA\xC8$h\xD2#e\x84\x9F\x93\xA4 \x88>]HR+Y,%Y\3\xAA\x88ОL?\xF3'W縙\xC4#66 \x94IģI%F7\xD1\xE0
+!\x84\xCF\x98\xC4N4Ov"\x89Dp\x88\xC8]\x82R(\x92\x93"\x8E!L\x84Ƭ~"SZ\xA0\x8A\xA1\x9B*\xEDO\xD0w\x9C*!ڒ\x83I\xC5\xFF\xE5\xF7\xEE\xAA\xDD?]\xFD\xAC{cބ8|\xCFV\x9DH=IO\x84
\ No newline at end of file

Added: releases/WebKitGTK/webkit-2.36/LayoutTests/media/media-source/content/test-48khz-new-track-id-manifest.json (0 => 294795)


--- releases/WebKitGTK/webkit-2.36/LayoutTests/media/media-source/content/test-48khz-new-track-id-manifest.json	                        (rev 0)
+++ releases/WebKitGTK/webkit-2.36/LayoutTests/media/media-source/content/test-48khz-new-track-id-manifest.json	2022-05-25 13:45:35 UTC (rev 294795)
@@ -0,0 +1,19 @@
+{
+	"url": "content/test-48kHz-new-track-id.m4a",
+	"type": "audio/mp4; codecs=\"mp4a.40.2\"",
+	"init": { "offset": 0, "size": 624 },
+	"duration": 10.0906,
+	"media": [ 
+		{ "offset": 624,   "size": 1308, "timestamp": 0, "duration": 1.0027},
+		{ "offset": 1932,  "size": 1491, "timestamp": 1.0027, "duration": 1.0027},
+		{ "offset": 3423,  "size": 1341, "timestamp": 2.0053, "duration": 1.0027},
+		{ "offset": 4764,  "size": 1563, "timestamp": 3.008, "duration": 0.9813},
+		{ "offset": 6327,  "size": 1425, "timestamp": 3.9893, "duration": 1.0027},
+		{ "offset": 7752,  "size": 1770, "timestamp": 4.992, "duration": 1.0027},
+		{ "offset": 9522,  "size": 1910, "timestamp": 5.9947, "duration": 1.0027},
+		{ "offset": 11432, "size": 1887, "timestamp": 6.9973, "duration": 1.0027},
+		{ "offset": 13319, "size": 1919, "timestamp": 8, "duration": 1.0027},
+		{ "offset": 15238, "size": 1892, "timestamp": 9.0027, "duration": 1.0027},
+		{ "offset": 17130, "size": 1231, "timestamp": 10.0053, "duration": 0.0853}
+	]
+}

Added: releases/WebKitGTK/webkit-2.36/LayoutTests/media/media-source/media-source-audio-track-id-switch-expected.txt (0 => 294795)


--- releases/WebKitGTK/webkit-2.36/LayoutTests/media/media-source/media-source-audio-track-id-switch-expected.txt	                        (rev 0)
+++ releases/WebKitGTK/webkit-2.36/LayoutTests/media/media-source/media-source-audio-track-id-switch-expected.txt	2022-05-25 13:45:35 UTC (rev 294795)
@@ -0,0 +1,12 @@
+
+RUN(audio.src = ""
+EVENT(sourceopen)
+RUN(source.duration = loader.duration())
+RUN(sourceBuffer = source.addSourceBuffer(loader.type()))
+RUN(sourceBuffer.appendBuffer(loader.initSegment()))
+EVENT(updateend)
+Switching to a similar audio stream but with different mp4 track ID.
+RUN(sourceBuffer.appendBuffer(loader.initSegment()))
+EVENT(updateend)
+END OF TEST
+

Added: releases/WebKitGTK/webkit-2.36/LayoutTests/media/media-source/media-source-audio-track-id-switch.html (0 => 294795)


--- releases/WebKitGTK/webkit-2.36/LayoutTests/media/media-source/media-source-audio-track-id-switch.html	                        (rev 0)
+++ releases/WebKitGTK/webkit-2.36/LayoutTests/media/media-source/media-source-audio-track-id-switch.html	2022-05-25 13:45:35 UTC (rev 294795)
@@ -0,0 +1,55 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>media-source-audio-track-id-switch</title>
+    <script src=""
+    <script src=""
+    <script>
+    var loader;
+    var source;
+    var sourceBuffer;
+    var audio;
+
+    function runTest() {
+        audio = document.getElementsByTagName('audio')[0];
+
+        loader = new MediaSourceLoader('content/test-48khz-manifest.json');
+        loader._onload_ = mediaDataLoaded;
+        loader._onerror_ = mediaDataLoadingFailed;
+    }
+
+    function mediaDataLoadingFailed() {
+        failTest('Media data loading failed');
+    }
+
+    function mediaDataLoaded() {
+        source = new MediaSource();
+        waitForEvent('sourceopen', sourceOpen, false, false, source);
+        run('audio.src = ""
+    }
+
+    function sourceOpen() {
+        run('source.duration = loader.duration()');
+        run('sourceBuffer = source.addSourceBuffer(loader.type())');
+        sourceBuffer.addEventListener('error', mediaDataLoadingFailed);
+        waitForEventOn(sourceBuffer, 'updateend', sourceInitialized, false, true);
+        run('sourceBuffer.appendBuffer(loader.initSegment())');
+    }
+
+    function sourceInitialized() {
+        consoleWrite('Switching to a similar audio stream but with different mp4 track ID.')
+        loader = new MediaSourceLoader('content/test-48khz-new-track-id-manifest.json');
+        loader._onload_ = newTrackMediaDataLoaded;
+        loader._onerror_ = mediaDataLoadingFailed;
+    }
+
+    function newTrackMediaDataLoaded() {
+        waitForEventOn(sourceBuffer, 'updateend', endTest, false, true);
+        run('sourceBuffer.appendBuffer(loader.initSegment())');
+    }
+    </script>
+</head>
+<body _onload_="runTest()">
+    <audio controls/>
+</body>
+</html>

Modified: releases/WebKitGTK/webkit-2.36/Source/WebCore/platform/graphics/gstreamer/mse/AppendPipeline.cpp (294794 => 294795)


--- releases/WebKitGTK/webkit-2.36/Source/WebCore/platform/graphics/gstreamer/mse/AppendPipeline.cpp	2022-05-25 13:32:59 UTC (rev 294794)
+++ releases/WebKitGTK/webkit-2.36/Source/WebCore/platform/graphics/gstreamer/mse/AppendPipeline.cpp	2022-05-25 13:45:35 UTC (rev 294795)
@@ -261,6 +261,7 @@
     ASSERT(!isMainThread());
     GST_WARNING_OBJECT(m_pipeline.get(), "Demuxing error: %" GST_PTR_FORMAT, message);
     handleErrorConditionFromStreamingThread();
+    GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS(GST_BIN(m_pipeline.get()), GST_DEBUG_GRAPH_SHOW_ALL, "demuxing-error");
 }
 
 GstPadProbeReturn AppendPipeline::appsrcEndOfAppendCheckerProbe(GstPadProbeInfo* padProbeInfo)
@@ -451,23 +452,50 @@
             trackIndex++;
         }
     } else {
-        // Link pads to existing Track objects that don't have a linked pad yet.
-        unsigned countPads = 0;
+        // Since we don't rely on the demuxer pad-added signal and this pipeline is not
+        // stream-aware, we need to account for stream topology changes ourselves.
+        unsigned videoPadsCount = 0;
+        unsigned audioPadsCount = 0;
+        unsigned textPadsCount = 0;
+        for (auto pad : GstIteratorAdaptor<GstPad>(GUniquePtr<GstIterator>(gst_element_iterate_src_pads(m_demux.get())))) {
+            if (gst_pad_is_linked(pad))
+                continue;
+            auto [parsedCaps, streamType, presentationSize] = parseDemuxerSrcPadCaps(adoptGRef(gst_pad_get_current_caps(pad)).get());
+            if (streamType == StreamType::Audio)
+                audioPadsCount++;
+            else if (streamType == StreamType::Video)
+                videoPadsCount++;
+            else if (streamType == StreamType::Text)
+                textPadsCount++;
+        }
+
+        unsigned videoTracksCount = 0;
+        unsigned audioTracksCount = 0;
+        unsigned textTracksCount = 0;
+        for (const auto& track : m_tracks) {
+            if (track->streamType == StreamType::Audio)
+                audioTracksCount++;
+            else if (track->streamType == StreamType::Video)
+                videoTracksCount++;
+            else if (track->streamType == StreamType::Text)
+                textTracksCount++;
+        }
+
+        if (videoPadsCount < videoTracksCount || audioPadsCount < audioTracksCount || textPadsCount < textTracksCount) {
+            GST_WARNING_OBJECT(pipeline(), "New demuxed stream topology doesn't match the existing tracks topology");
+            m_sourceBufferPrivate.appendParsingFailed();
+            return;
+        }
+
+        // Link pads to existing Track objects that don't have a linked pad yet. Existing linked
+        // tracks are recycled if their stream type matches the new demuxer source pads.
         for (GstPad* pad : GstIteratorAdaptor<GstPad>(GUniquePtr<GstIterator>(gst_element_iterate_src_pads(m_demux.get())))) {
-            countPads++;
-            Track* track = tryMatchPadToExistingTrack(pad);
-            if (!track) {
+            if (!recycleTrackForPad(pad)) {
                 GST_WARNING_OBJECT(pipeline(), "Can't match pad to existing tracks in the AppendPipeline: %" GST_PTR_FORMAT, pad);
                 m_sourceBufferPrivate.appendParsingFailed();
                 return;
             }
-            linkPadWithTrack(pad, *track);
         }
-        if (countPads != m_tracks.size()) {
-            GST_WARNING_OBJECT(pipeline(), "Number of pads (%u) doesn't match number of tracks (%zu).", countPads, m_tracks.size());
-            m_sourceBufferPrivate.appendParsingFailed();
-            return;
-        }
     }
 
     for (std::unique_ptr<Track>& track : m_tracks) {
@@ -640,8 +668,8 @@
 {
     GstStructure* structure = gst_caps_get_structure(caps, 0);
     const char* mediaType = gst_structure_get_name(structure);
-    GUniquePtr<char> parserName(g_strdup_printf("%s_parser", trackId.string().utf8().data()));
-    const gchar* elementClass = "identity";
+    auto parserName = makeString(trackId, "_parser"_s);
+    const char* elementClass = "identity";
 
     if (!g_strcmp0(mediaType, "audio/x-opus"))
         elementClass = "opusparse";
@@ -658,13 +686,12 @@
         case 4:
             elementClass = "aacparse";
             break;
-        default: {
-            GUniquePtr<char> capsString(gst_caps_to_string(caps));
-            GST_WARNING("Unsupported audio mpeg caps: %s", capsString.get());
+        default:
+            GST_WARNING("Unsupported audio mpeg caps: %" GST_PTR_FORMAT, caps);
         }
-        }
     }
-    return GRefPtr<GstElement>(makeGStreamerElement(elementClass, parserName.get()));
+    GST_DEBUG("Creating %s parser for stream with caps %" GST_PTR_FORMAT, elementClass, caps);
+    return GRefPtr<GstElement>(makeGStreamerElement(elementClass, parserName.ascii().data()));
 }
 
 AtomString AppendPipeline::generateTrackId(StreamType streamType, int padIndex)
@@ -723,7 +750,7 @@
     return { CreateTrackResult::TrackCreated, &track };
 }
 
-AppendPipeline::Track* AppendPipeline::tryMatchPadToExistingTrack(GstPad *demuxerSrcPad)
+bool AppendPipeline::recycleTrackForPad(GstPad* demuxerSrcPad)
 {
     ASSERT(isMainThread());
     ASSERT(m_hasReceivedFirstInitializationSegment);
@@ -730,11 +757,13 @@
     AtomString trackId = GST_PAD_NAME(demuxerSrcPad);
     auto [parsedCaps, streamType, presentationSize] = parseDemuxerSrcPadCaps(adoptGRef(gst_pad_get_current_caps(demuxerSrcPad)).get());
 
+    GST_DEBUG_OBJECT(demuxerSrcPad, "Caps: %" GST_PTR_FORMAT, parsedCaps.get());
+
     // Try to find a matching pre-existing track. Ideally, tracks should be matched by track ID, but matching by type
     // is provided as a fallback -- which will be used, since we don't have a way to fetch those from GStreamer at the moment.
     Track* matchingTrack = nullptr;
     for (std::unique_ptr<Track>& track : m_tracks) {
-        if (track->streamType != streamType || gst_pad_is_linked(track->entryPad.get()))
+        if (track->streamType != streamType)
             continue;
         matchingTrack = &*track;
         if (track->trackId == trackId)
@@ -746,12 +775,38 @@
         GST_WARNING_OBJECT(pipeline(), "Couldn't find a matching pre-existing track for pad '%s' with parsed caps %" GST_PTR_FORMAT
             " on non-first initialization segment, will be connected to a black hole probe.", GST_PAD_NAME(demuxerSrcPad), parsedCaps.get());
         gst_pad_add_probe(demuxerSrcPad, GST_PAD_PROBE_TYPE_BUFFER, reinterpret_cast<GstPadProbeCallback>(appendPipelineDemuxerBlackHolePadProbe), nullptr, nullptr);
+        return false;
     }
-    return matchingTrack;
+
+    if (!matchingTrack->isLinked())
+        linkPadWithTrack(demuxerSrcPad, *matchingTrack);
+    else {
+        // Unlink from old track and link to new track, by 1. stopping parser/sink, 2. unlinking
+        // demuxer from track, 3. restarting parser/sink.
+        if (matchingTrack->parser)
+            gst_element_set_state(matchingTrack->parser.get(), GST_STATE_NULL);
+        gst_element_set_state(matchingTrack->appsink.get(), GST_STATE_NULL);
+
+        auto peer = adoptGRef(gst_pad_get_peer(matchingTrack->entryPad.get()));
+        if (peer.get() != demuxerSrcPad) {
+            GST_DEBUG_OBJECT(peer.get(), "Unlinking from track %s", matchingTrack->trackId.string().ascii().data());
+            gst_pad_unlink(peer.get(), matchingTrack->entryPad.get());
+            linkPadWithTrack(demuxerSrcPad, *matchingTrack);
+            matchingTrack->caps = WTFMove(parsedCaps);
+            matchingTrack->presentationSize = presentationSize;
+        } else
+            GST_DEBUG_OBJECT(pipeline(), "%s track pads match, nothing to re-link", matchingTrack->trackId.string().ascii().data());
+
+        gst_element_set_state(matchingTrack->appsink.get(), GST_STATE_PLAYING);
+        if (matchingTrack->parser)
+            gst_element_set_state(matchingTrack->parser.get(), GST_STATE_PLAYING);
+    }
+    return true;
 }
 
 void AppendPipeline::linkPadWithTrack(GstPad* demuxerSrcPad, Track& track)
 {
+    GST_DEBUG_OBJECT(demuxerSrcPad, "Linking to track %s", track.trackId.string().ascii().data());
     GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS(GST_BIN(m_pipeline.get()), GST_DEBUG_GRAPH_SHOW_ALL, "append-pipeline-before-link");
     ASSERT(!GST_PAD_IS_LINKED(track.entryPad.get()));
     gst_pad_link(demuxerSrcPad, track.entryPad.get());

Modified: releases/WebKitGTK/webkit-2.36/Source/WebCore/platform/graphics/gstreamer/mse/AppendPipeline.h (294794 => 294795)


--- releases/WebKitGTK/webkit-2.36/Source/WebCore/platform/graphics/gstreamer/mse/AppendPipeline.h	2022-05-25 13:32:59 UTC (rev 294794)
+++ releases/WebKitGTK/webkit-2.36/Source/WebCore/platform/graphics/gstreamer/mse/AppendPipeline.h	2022-05-25 13:45:35 UTC (rev 294795)
@@ -98,6 +98,7 @@
 #endif
 
         void initializeElements(AppendPipeline*, GstBin*);
+        bool isLinked() const { return gst_pad_is_linked(entryPad.get()); }
     };
 
     void handleErrorSyncMessage(GstMessage*);
@@ -124,7 +125,8 @@
     static AtomString generateTrackId(StreamType, int padIndex);
     enum class CreateTrackResult { TrackCreated, TrackIgnored, AppendParsingFailed };
     std::pair<CreateTrackResult, AppendPipeline::Track*> tryCreateTrackFromPad(GstPad* demuxerSrcPad, int padIndex);
-    AppendPipeline::Track* tryMatchPadToExistingTrack(GstPad* demuxerSrcPad);
+
+    bool recycleTrackForPad(GstPad*);
     void linkPadWithTrack(GstPad* demuxerSrcPad, Track&);
 
     void consumeAppsinksAvailableSamples();
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to