summaryrefslogtreecommitdiffstats
path: root/media/webm
diff options
context:
space:
mode:
authorvrk@google.com <vrk@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2012-06-14 20:59:38 +0000
committervrk@google.com <vrk@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2012-06-14 20:59:38 +0000
commitbd1ec999e09bc86c614b8a0cb95981e336f688d0 (patch)
tree438357e1101dbe76390d93912c8df0e37ae8ab5d /media/webm
parent6bc2ce62a92837f600e0f8e7fcd59daeba1e88e2 (diff)
downloadchromium_src-bd1ec999e09bc86c614b8a0cb95981e336f688d0.zip
chromium_src-bd1ec999e09bc86c614b8a0cb95981e336f688d0.tar.gz
chromium_src-bd1ec999e09bc86c614b8a0cb95981e336f688d0.tar.bz2
Notify SourceBufferStream of each cluster's start time as it gets parsed
Passes cluster start time information from WebMStreamParser to ChunkDemuxer to SourceBufferStream. SourceBufferStream can then use this information when fulfilling seeks. BUG=131438 TEST=media_unittests, go/vekbm Review URL: https://chromiumcodereview.appspot.com/10540122 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@142221 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media/webm')
-rw-r--r--media/webm/webm_stream_parser.cc31
-rw-r--r--media/webm/webm_stream_parser.h8
2 files changed, 36 insertions, 3 deletions
diff --git a/media/webm/webm_stream_parser.cc b/media/webm/webm_stream_parser.cc
index c8ca10e..b063a26 100644
--- a/media/webm/webm_stream_parser.cc
+++ b/media/webm/webm_stream_parser.cc
@@ -181,7 +181,8 @@ bool FFmpegConfigHelper::SetupStreamConfigs() {
}
WebMStreamParser::WebMStreamParser()
- : state_(kWaitingForInit) {
+ : state_(kWaitingForInit),
+ waiting_for_buffers_(false) {
}
WebMStreamParser::~WebMStreamParser() {}
@@ -190,13 +191,15 @@ void WebMStreamParser::Init(const InitCB& init_cb,
const NewConfigCB& config_cb,
const NewBuffersCB& audio_cb,
const NewBuffersCB& video_cb,
- const KeyNeededCB& key_needed_cb) {
+ const KeyNeededCB& key_needed_cb,
+ const NewMediaSegmentCB& new_segment_cb) {
DCHECK_EQ(state_, kWaitingForInit);
DCHECK(init_cb_.is_null());
DCHECK(!init_cb.is_null());
DCHECK(!config_cb.is_null());
DCHECK(!audio_cb.is_null() || !video_cb.is_null());
DCHECK(!key_needed_cb.is_null());
+ DCHECK(!new_segment_cb.is_null());
ChangeState(kParsingHeaders);
init_cb_ = init_cb;
@@ -204,6 +207,7 @@ void WebMStreamParser::Init(const InitCB& init_cb,
audio_cb_ = audio_cb;
video_cb_ = video_cb;
key_needed_cb_ = key_needed_cb;
+ new_segment_cb_ = new_segment_cb;
}
void WebMStreamParser::Flush() {
@@ -381,6 +385,9 @@ int WebMStreamParser::ParseCluster(const uint8* data, int size) {
if (result <= 0)
return result;
+ if (id == kWebMIdCluster)
+ waiting_for_buffers_ = true;
+
if (id == kWebMIdCues) {
if (size < (result + element_size)) {
// We don't have the whole element yet. Signal we need more data.
@@ -403,6 +410,26 @@ int WebMStreamParser::ParseCluster(const uint8* data, int size) {
const BufferQueue& audio_buffers = cluster_parser_->audio_buffers();
const BufferQueue& video_buffers = cluster_parser_->video_buffers();
+ if (waiting_for_buffers_) {
+ base::TimeDelta audio_start_timestamp = kInfiniteDuration();
+ base::TimeDelta video_start_timestamp = kInfiniteDuration();
+
+ if (!audio_buffers.empty())
+ audio_start_timestamp = audio_buffers.front()->GetTimestamp();
+ if (!video_buffers.empty())
+ video_start_timestamp = video_buffers.front()->GetTimestamp();
+
+ base::TimeDelta cluster_start_timestamp =
+ std::min(audio_start_timestamp, video_start_timestamp);
+
+ // If we haven't gotten any buffers yet, return early.
+ if (cluster_start_timestamp == kInfiniteDuration())
+ return bytes_parsed;
+
+ new_segment_cb_.Run(cluster_start_timestamp);
+ waiting_for_buffers_ = false;
+ }
+
if (!audio_buffers.empty() && !audio_cb_.Run(audio_buffers))
return -1;
diff --git a/media/webm/webm_stream_parser.h b/media/webm/webm_stream_parser.h
index 0d37992..003171e 100644
--- a/media/webm/webm_stream_parser.h
+++ b/media/webm/webm_stream_parser.h
@@ -25,7 +25,8 @@ class WebMStreamParser : public StreamParser {
virtual void Init(const InitCB& init_cb, const NewConfigCB& config_cb,
const NewBuffersCB& audio_cb,
const NewBuffersCB& video_cb,
- const KeyNeededCB& key_needed_cb) OVERRIDE;
+ const KeyNeededCB& key_needed_cb,
+ const NewMediaSegmentCB& new_segment_cb) OVERRIDE;
virtual void Flush() OVERRIDE;
virtual bool Parse(const uint8* buf, int size) OVERRIDE;
@@ -64,6 +65,11 @@ class WebMStreamParser : public StreamParser {
NewBuffersCB audio_cb_;
NewBuffersCB video_cb_;
KeyNeededCB key_needed_cb_;
+ NewMediaSegmentCB new_segment_cb_;
+
+ // True if a new cluster id has been seen, but no audio or video buffers have
+ // been parsed yet.
+ bool waiting_for_buffers_;
scoped_ptr<WebMClusterParser> cluster_parser_;
ByteQueue byte_queue_;