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