- From: Aymeric Vitte <vitteaymeric@gmail.com>
- Date: Thu, 17 Apr 2014 19:46:26 +0200
- To: "public-html-media@w3.org" <public-html-media@w3.org>
Insisting on this one, I spent quite a lot of time on this and it's
still not working perfectly, maybe other implementations don't have the
problem because they are not using a so small size of chunks and/or
chunks are never delayed so the events chaining never stops.
//on each chunk received do:
append_buffer.push(chunk);
//handle1
if ((!source.updating)&&(append_buffer.length===1)) {
source.appendBuffer(append_buffer.shift());
}
if (first_chunk) {
source.addEventListener('updateend',function() {
//handle2
if (append_buffer.length) {
source.appendBuffer(append_buffer.shift());
};
});
};
This should work but it does not with Chrome, append_buffer reaches a
size of 0, the last chunk is being appended, a new chunk is coming,
updateend fires --> handle1 and handle2 can execute at the same time and
append wrongly the same chunk.
It's not supposed to be possible but this is what is happening, maybe
related to concurrent access.
A workaround is to maintain the events chaining by appending chunks of
size 0 using a timeout, it's working most of the time but sometimes
appending a chunk of size 0 fails too, for unknown reasons, on Chrome
chrome:media-internals only says 'decode error'.
Specs issue or Chrome issue, I don't know, I still don't get the
rationale for 'updating' and why appendBuffer does not queue the chunks
by itself.
Regards
Aymeric
Le 02/04/2014 22:46, Aymeric Vitte a écrit :
> The usual code is something like:
>
> if (!source.updating) {
> source.appendBuffer(append_buffer.shift());
> }
> if (first_chunk) {
> source.addEventListener('updateend',function() {
> if (append_buffer.length) {
> source.appendBuffer(append_buffer.shift());
> };
> });
> };
>
> The use case is: chunks of 498 B and bandwidth rate of 1 Mbps, and
> this does not work at all, at least with Chrome, it might be a Chrome
> issue and/or a spec issue.
>
> Because between two 'updateend' events, the 'updating' property can
> become false, therefore you can append a chunk at the wrong place, if
> your remove the first part of the code (or replace it by if
> (first_chunk) {source.append...}) then the buffer chaining can stop if
> for some reasons the chunks are delayed.
>
> With streams the problem will disappear, without streams there is a
> workaround, but as I mentionned in a previous post I don't find this
> behavior normal.
>
> Regards
>
> Aymeric
>
--
Peersm : http://www.peersm.com
node-Tor : https://www.github.com/Ayms/node-Tor
GitHub : https://www.github.com/Ayms
Received on Thursday, 17 April 2014 17:46:56 UTC