Hi, These days I've been working on improving the layout test passrate of our new Media Source Extensions GStreamer platform implementation (MediaPlayerPrivateGStreamerMSE), but I'm having problems with the selection of the right MediaPlayerPrivateInterface implementation for each use case.
As I understand it (please correct me if I'm wrong), under normal circumstances (no MEDIA_SOURCE enabled) MediaPlayer tries to find the best media engine (ie: MediaPlayerPrivateInterface implementation) available to play a content. It does so by asking each engine if they support (yes/no/ maybe) the particular mime type of the video. For the "maybe" case, the engine is instantiated, loading goes forward and the networkState is set to FormatError in case something goes wrong. In that case MediaPlayer tries the next available engine. Things work different for MSE. No matter what support the engine reports, all the engines are tried and the content loading is attempted. Setting FormatError in networkState is the only way in which an engine can reject being selected. Unfortunately, it's impossible for MediaPlayerPrivateGStreamerMSE to take that decision at loading time, because usually the load happens before the MediaSource has been configured with SourceBuffers (the ones specifying a mime type). Therefore, the MSE player private must always succeed blindly on loading if it wants to have any opportunity. This works fine for real world use cases. My issue is related to MockMediaPlayerMediaSource, the test engine which should take care of the "video/mock" content used in some layout tests. Our MSE player private gets selected and performs the loading (of an empty MediaSource). However, when a video/mock SourceBuffer is added, it's too late for the MSE player private to reject being in charge. Both MediaSource and SourceBuffer are already using the GStreamer-related subclasses as their MediaSourcePrivate and SourceBufferPrivate counterparts and they can't be hot- swapped with the Mock-related subclasses. Returning NotSupported in MediaSourceGStreamer::addSourceBuffer() only makes things worse. The JavaScript code triggering that call expects addSourceBuffer() to be handled by the mock engine and to succeed on the first attempt. The JS code isn't supposed to retry the call to addSourceBuffer(). I wonder what's the right way to manage the competitive selection between the platform player private and the mock player private to make real world use cases and test use cases work together. In particular, I wonder how it can successfully work in the Mac implementation. The MediaPlayerPrivateMediaSourceAVFObjC implementation declares that it doesn't support and empty mimetype (irrelevant here, as it'll always be tried by MediaPlayer when MEDIA_SOURCE is enabled). Then, on load, it doesn't check anything so apparently succeeds. I would be really grateful if Jer Noble or anybody else with knowledge on the matter could devote some minutes to shed some light about the right way to make the mock player private and the MSE player private live together. Thank you. -- Enrique Ocaña González _______________________________________________ webkit-dev mailing list webkit-dev@lists.webkit.org https://lists.webkit.org/mailman/listinfo/webkit-dev