summaryrefslogtreecommitdiffstats
path: root/media/blink/webmediasource_impl.cc
diff options
context:
space:
mode:
Diffstat (limited to 'media/blink/webmediasource_impl.cc')
-rw-r--r--media/blink/webmediasource_impl.cc86
1 files changed, 86 insertions, 0 deletions
diff --git a/media/blink/webmediasource_impl.cc b/media/blink/webmediasource_impl.cc
new file mode 100644
index 0000000..aecad6f
--- /dev/null
+++ b/media/blink/webmediasource_impl.cc
@@ -0,0 +1,86 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "media/blink/webmediasource_impl.h"
+
+#include "base/guid.h"
+#include "media/blink/websourcebuffer_impl.h"
+#include "media/filters/chunk_demuxer.h"
+#include "third_party/WebKit/public/platform/WebCString.h"
+#include "third_party/WebKit/public/platform/WebString.h"
+
+using ::blink::WebString;
+using ::blink::WebMediaSource;
+
+namespace media {
+
+#define COMPILE_ASSERT_MATCHING_STATUS_ENUM(webkit_name, chromium_name) \
+ COMPILE_ASSERT(static_cast<int>(WebMediaSource::webkit_name) == \
+ static_cast<int>(ChunkDemuxer::chromium_name), \
+ mismatching_status_enums)
+COMPILE_ASSERT_MATCHING_STATUS_ENUM(AddStatusOk, kOk);
+COMPILE_ASSERT_MATCHING_STATUS_ENUM(AddStatusNotSupported, kNotSupported);
+COMPILE_ASSERT_MATCHING_STATUS_ENUM(AddStatusReachedIdLimit, kReachedIdLimit);
+#undef COMPILE_ASSERT_MATCHING_STATUS_ENUM
+
+WebMediaSourceImpl::WebMediaSourceImpl(
+ ChunkDemuxer* demuxer, LogCB log_cb)
+ : demuxer_(demuxer),
+ log_cb_(log_cb) {
+ DCHECK(demuxer_);
+}
+
+WebMediaSourceImpl::~WebMediaSourceImpl() {}
+
+WebMediaSource::AddStatus WebMediaSourceImpl::addSourceBuffer(
+ const blink::WebString& type,
+ const blink::WebVector<blink::WebString>& codecs,
+ blink::WebSourceBuffer** source_buffer) {
+ std::string id = base::GenerateGUID();
+ std::vector<std::string> new_codecs(codecs.size());
+ for (size_t i = 0; i < codecs.size(); ++i)
+ new_codecs[i] = codecs[i].utf8().data();
+
+ WebMediaSource::AddStatus result =
+ static_cast<WebMediaSource::AddStatus>(
+ demuxer_->AddId(id, type.utf8().data(), new_codecs));
+
+ if (result == WebMediaSource::AddStatusOk)
+ *source_buffer = new WebSourceBufferImpl(id, demuxer_);
+
+ return result;
+}
+
+double WebMediaSourceImpl::duration() {
+ return demuxer_->GetDuration();
+}
+
+void WebMediaSourceImpl::setDuration(double new_duration) {
+ DCHECK_GE(new_duration, 0);
+ demuxer_->SetDuration(new_duration);
+}
+
+void WebMediaSourceImpl::markEndOfStream(
+ WebMediaSource::EndOfStreamStatus status) {
+ PipelineStatus pipeline_status = PIPELINE_OK;
+
+ switch (status) {
+ case WebMediaSource::EndOfStreamStatusNoError:
+ break;
+ case WebMediaSource::EndOfStreamStatusNetworkError:
+ pipeline_status = PIPELINE_ERROR_NETWORK;
+ break;
+ case WebMediaSource::EndOfStreamStatusDecodeError:
+ pipeline_status = PIPELINE_ERROR_DECODE;
+ break;
+ }
+
+ demuxer_->MarkEndOfStream(pipeline_status);
+}
+
+void WebMediaSourceImpl::unmarkEndOfStream() {
+ demuxer_->UnmarkEndOfStream();
+}
+
+} // namespace media