// 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/base/mime_util.h" #include "media/blink/websourcebuffer_impl.h" #include "media/filters/chunk_demuxer.h" #include "third_party/blink/public/platform/web_string.h" using ::blink::WebString; using ::blink::WebMediaSource; namespace media { #define STATIC_ASSERT_MATCHING_STATUS_ENUM(webkit_name, chromium_name) \ static_assert(static_cast(WebMediaSource::webkit_name) == \ static_cast(ChunkDemuxer::chromium_name), \ "mismatching status enum values: " #webkit_name) STATIC_ASSERT_MATCHING_STATUS_ENUM(kAddStatusOk, kOk); STATIC_ASSERT_MATCHING_STATUS_ENUM(kAddStatusNotSupported, kNotSupported); STATIC_ASSERT_MATCHING_STATUS_ENUM(kAddStatusReachedIdLimit, kReachedIdLimit); #undef STATIC_ASSERT_MATCHING_STATUS_ENUM WebMediaSourceImpl::WebMediaSourceImpl(ChunkDemuxer* demuxer) : demuxer_(demuxer) { DCHECK(demuxer_); } WebMediaSourceImpl::~WebMediaSourceImpl() = default; WebMediaSource::AddStatus WebMediaSourceImpl::AddSourceBuffer( const blink::WebString& content_type, const blink::WebString& codecs, blink::WebSourceBuffer** source_buffer) { std::string id = base::GenerateGUID(); WebMediaSource::AddStatus result = static_cast( demuxer_->AddId(id, content_type.Utf8(), codecs.Utf8())); if (result == WebMediaSource::kAddStatusOk) *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::kEndOfStreamStatusNoError: break; case WebMediaSource::kEndOfStreamStatusNetworkError: pipeline_status = CHUNK_DEMUXER_ERROR_EOS_STATUS_NETWORK_ERROR; break; case WebMediaSource::kEndOfStreamStatusDecodeError: pipeline_status = CHUNK_DEMUXER_ERROR_EOS_STATUS_DECODE_ERROR; break; } demuxer_->MarkEndOfStream(pipeline_status); } void WebMediaSourceImpl::UnmarkEndOfStream() { demuxer_->UnmarkEndOfStream(); } } // namespace media