1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "media/blink/webmediasource_impl.h"
6 
7 #include "base/guid.h"
8 #include "media/base/mime_util.h"
9 #include "media/blink/websourcebuffer_impl.h"
10 #include "media/filters/chunk_demuxer.h"
11 #include "third_party/blink/public/platform/web_string.h"
12 
13 using ::blink::WebString;
14 using ::blink::WebMediaSource;
15 
16 namespace media {
17 
18 #define STATIC_ASSERT_MATCHING_STATUS_ENUM(webkit_name, chromium_name) \
19   static_assert(static_cast<int>(WebMediaSource::webkit_name) == \
20                 static_cast<int>(ChunkDemuxer::chromium_name),  \
21                 "mismatching status enum values: " #webkit_name)
22 STATIC_ASSERT_MATCHING_STATUS_ENUM(kAddStatusOk, kOk);
23 STATIC_ASSERT_MATCHING_STATUS_ENUM(kAddStatusNotSupported, kNotSupported);
24 STATIC_ASSERT_MATCHING_STATUS_ENUM(kAddStatusReachedIdLimit, kReachedIdLimit);
25 #undef STATIC_ASSERT_MATCHING_STATUS_ENUM
26 
WebMediaSourceImpl(ChunkDemuxer * demuxer)27 WebMediaSourceImpl::WebMediaSourceImpl(ChunkDemuxer* demuxer)
28     : demuxer_(demuxer) {
29   DCHECK(demuxer_);
30 }
31 
32 WebMediaSourceImpl::~WebMediaSourceImpl() = default;
33 
AddSourceBuffer(const blink::WebString & content_type,const blink::WebString & codecs,blink::WebSourceBuffer ** source_buffer)34 WebMediaSource::AddStatus WebMediaSourceImpl::AddSourceBuffer(
35     const blink::WebString& content_type,
36     const blink::WebString& codecs,
37     blink::WebSourceBuffer** source_buffer) {
38   std::string id = base::GenerateGUID();
39 
40   WebMediaSource::AddStatus result = static_cast<WebMediaSource::AddStatus>(
41       demuxer_->AddId(id, content_type.Utf8(), codecs.Utf8()));
42 
43   if (result == WebMediaSource::kAddStatusOk)
44     *source_buffer = new WebSourceBufferImpl(id, demuxer_);
45 
46   return result;
47 }
48 
Duration()49 double WebMediaSourceImpl::Duration() {
50   return demuxer_->GetDuration();
51 }
52 
SetDuration(double new_duration)53 void WebMediaSourceImpl::SetDuration(double new_duration) {
54   DCHECK_GE(new_duration, 0);
55   demuxer_->SetDuration(new_duration);
56 }
57 
MarkEndOfStream(WebMediaSource::EndOfStreamStatus status)58 void WebMediaSourceImpl::MarkEndOfStream(
59     WebMediaSource::EndOfStreamStatus status) {
60   PipelineStatus pipeline_status = PIPELINE_OK;
61 
62   switch (status) {
63     case WebMediaSource::kEndOfStreamStatusNoError:
64       break;
65     case WebMediaSource::kEndOfStreamStatusNetworkError:
66       pipeline_status = CHUNK_DEMUXER_ERROR_EOS_STATUS_NETWORK_ERROR;
67       break;
68     case WebMediaSource::kEndOfStreamStatusDecodeError:
69       pipeline_status = CHUNK_DEMUXER_ERROR_EOS_STATUS_DECODE_ERROR;
70       break;
71   }
72 
73   demuxer_->MarkEndOfStream(pipeline_status);
74 }
75 
UnmarkEndOfStream()76 void WebMediaSourceImpl::UnmarkEndOfStream() {
77   demuxer_->UnmarkEndOfStream();
78 }
79 
80 }  // namespace media
81