// Limit of platform player's audio buffer in bytes
const media::player_buffer_size_t kPlayerAudioBufferSize = 768 * 1024;
+// The delay time before retrying ReadBuffer.
+// Wait until there is space in the buffer.
+const base::TimeDelta kBufferQueueReadDelay = base::Milliseconds(100);
+
espp_buffer_size_t GetMaxAudioBufferSize() {
return kPlayerAudioBufferSize;
}
weak_factory_.GetWeakPtr(), type));
}
+void MediaPlayerESPlusPlayer::PostReadBuffer(DemuxerStream::Type type) {
+ task_runner_->PostDelayedTask(
+ FROM_HERE,
+ base::BindOnce(&MediaPlayerESPlusPlayer::ReadBuffer,
+ weak_factory_.GetWeakPtr(), type),
+ kBufferQueueReadDelay);
+}
+
void MediaPlayerESPlusPlayer::OnBufferReady(
DemuxerStream::Type type,
DemuxerStream::Status status,
scoped_refptr<DecoderBuffer> buffer) {
+ bool should_delay_read = false;
switch (status) {
case DemuxerStream::kAborted:
case DemuxerStream::kError:
GetBufferQueue(type).clear();
break;
case DemuxerStream::kNeedBuffer:
+ should_delay_read = true;
break;
case DemuxerStream::kConfigChanged:
// Clear pending buffer of older config
}
SetReadRequested(type, false);
- ReadBuffer(type);
+ if (should_delay_read)
+ PostReadBuffer(type);
+ else
+ ReadBuffer(type);
}
bool MediaPlayerESPlusPlayer::ReadFromBufferQueue(DemuxerStream::Type type) {
else
status = SubmitEsPacket(type, buffer);
- if (status == ESPLUSPLAYER_SUBMIT_STATUS_NOT_PREPARED ||
- status == ESPLUSPLAYER_SUBMIT_STATUS_OUT_OF_MEMORY ||
- status == ESPLUSPLAYER_SUBMIT_STATUS_FULL) {
+ if (status == ESPLUSPLAYER_SUBMIT_STATUS_FULL) {
+ // If buffer is full, try again after a while.
+ PostReadBuffer(type);
return false;
}
+ if (status == ESPLUSPLAYER_SUBMIT_STATUS_NOT_PREPARED ||
+ status == ESPLUSPLAYER_SUBMIT_STATUS_OUT_OF_MEMORY)
+ return false;
+
UpdateBufferedDtsDifference();
GetBufferQueue(type).pop_front();
return true;