- From: Jean-Yves Avenard via GitHub <sysbot+gh@w3.org>
- Date: Fri, 29 Apr 2016 04:00:05 +0000
- To: public-html-media@w3.org
jyavenard has just created a new issue for https://github.com/w3c/media-source: == abort() shouldn't attempt to interrupt the current buffer append == Overview: I believe abort() shouldn't interrupt the Coded Frame Processing Algorithm; as abort() as it's currently described results in non deterministic behavior in regards to which frames may have actually been added to the source buffer. Rather than interrupt something that is really non-interruptible, it should only guarantee that the next call to appendBuffer or modification to timestampOffset or appendWindow will succeed. Detailed explanation: Per spec: "Aborts the current segment and resets the segment parser." Which then calls the Reset Parser State which defines: "If the append state equals PARSING_MEDIA_SEGMENT and the input buffer contains some complete coded frames, then run the coded frame processing algorithm until all of these complete coded frames have been processed." Now, let's look at the behavior on the append state value, which is defined in "Segment Parser Loop". In a typical MSE transaction, it would go from WAITING_FOR_SEGMENT to PARSING_INIT_SEGMENT to (WAITING_FOR_SEGMENT to PARSING_MEDIA_SEGMENT):repeat Now let's assume an appendBuffer is done with data containing "media_segment1 | media_segment2 | media_segment3" The Segment Parser Loop runs asynchronously and during the time of its execution will update the append state then run the coded frame processing algorithm for a single media segment, then set the append state to WAITING_FOR_SEGMENT and rinse and repeat. Now we have an abort() and the Reset Parser State step. Let's assume that at the exact time the Reset Parser State is run, the Segment Parser Loop had been interrupted after just having finished processing media_segment1. As such the append state is WAITING_FOR_SEGMENT. As the append state is not equal to PARSING_MEDIA_SEGMENT, none of the remaining frames of the input buffer will be processed (as the conditional is AND) As in step 7 of the Reset Parser State we have "Remove all bytes from the input buffer.", the source buffer following this abort contains only media_segment1. If however, the abort of the append buffer occurred when the middle of the media_segment1 was being processed, the append state now being PARSING_MEDIA_SEGMENT all remaining complete frames in the input buffer will be processed and the source buffer will now contain all frames of media_segment1, media_segment2 and media_segment3. The behavior of abort() is as such racy and non deterministic (and that's ignoring the fact that interrupting an asynchronous step is inherently impossible to achieve) I believe abort() should be made clearer to remove all ambiguities. abort should now be: 3: If the buffer append or stream append loop algorithms are running then run the following steps: 1. Set the aborting flag to true 2. Wait for the buffer append and stream append loop algorithms to complete. 4: If the updating attribute equals true, then run the following steps: 1.Set the updating attribute to false. 2.Queue a task to fire a simple event named abort at this SourceBuffer object. 3.Queue a task to fire a simple event named updateend at this SourceBuffer object. 5: Run the reset parser state algorithm." Step 1 of the Reset Parser State should be removed and add a last step (now 8) "8. if the aborting flag equals true then set the aborting flag to false" Buffer Append Algorithm now becomes: 2. If the segment parser loop algorithm in the previous step was aborted or if the aborting flag is set to true, then abort this algorithm. Stream Append Loop now becomes: 14. If the segment parser loop algorithm in the previous step was aborted or if the aborting flag is set to true, then abort this algorithm. Ultimately, the only reason for abort is to guarantee that the next operation relying on the updating attribute value will complete, and that any operations depending on the append state will also succeed (that is changing the mode attribute, and the timeStampOffset attribute) At least this is how I've seen all DASH players using it (including YouTube) Please view or discuss this issue at https://github.com/w3c/media-source/issues/71 using your GitHub account
Received on Friday, 29 April 2016 04:00:06 UTC