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 "content/renderer/media/webmediasource_impl.h"
6
7#include "base/guid.h"
8#include "content/renderer/media/websourcebuffer_impl.h"
9#include "media/filters/chunk_demuxer.h"
10#include "third_party/WebKit/public/platform/WebCString.h"
11#include "third_party/WebKit/public/platform/WebString.h"
12
13using ::blink::WebString;
14using ::blink::WebMediaSource;
15
16namespace content {
17
18#define COMPILE_ASSERT_MATCHING_STATUS_ENUM(webkit_name, chromium_name) \
19  COMPILE_ASSERT(static_cast<int>(WebMediaSource::webkit_name) == \
20                 static_cast<int>(media::ChunkDemuxer::chromium_name),  \
21                 mismatching_status_enums)
22COMPILE_ASSERT_MATCHING_STATUS_ENUM(AddStatusOk, kOk);
23COMPILE_ASSERT_MATCHING_STATUS_ENUM(AddStatusNotSupported, kNotSupported);
24COMPILE_ASSERT_MATCHING_STATUS_ENUM(AddStatusReachedIdLimit, kReachedIdLimit);
25#undef COMPILE_ASSERT_MATCHING_STATUS_ENUM
26
27WebMediaSourceImpl::WebMediaSourceImpl(
28    media::ChunkDemuxer* demuxer, media::LogCB log_cb)
29    : demuxer_(demuxer),
30      log_cb_(log_cb) {
31  DCHECK(demuxer_);
32}
33
34WebMediaSourceImpl::~WebMediaSourceImpl() {}
35
36WebMediaSource::AddStatus WebMediaSourceImpl::addSourceBuffer(
37    const blink::WebString& type,
38    const blink::WebVector<blink::WebString>& codecs,
39    blink::WebSourceBuffer** source_buffer) {
40  std::string id = base::GenerateGUID();
41  std::vector<std::string> new_codecs(codecs.size());
42  for (size_t i = 0; i < codecs.size(); ++i)
43    new_codecs[i] = codecs[i].utf8().data();
44  WebMediaSource::AddStatus result =
45      static_cast<WebMediaSource::AddStatus>(
46          demuxer_->AddId(id, type.utf8().data(), new_codecs));
47
48  if (result == WebMediaSource::AddStatusOk)
49    *source_buffer = new WebSourceBufferImpl(id, demuxer_);
50
51  return result;
52}
53
54double WebMediaSourceImpl::duration() {
55  return demuxer_->GetDuration();
56}
57
58void WebMediaSourceImpl::setDuration(double new_duration) {
59  DCHECK_GE(new_duration, 0);
60  demuxer_->SetDuration(new_duration);
61}
62
63void WebMediaSourceImpl::markEndOfStream(
64    WebMediaSource::EndOfStreamStatus status) {
65  media::PipelineStatus pipeline_status = media::PIPELINE_OK;
66
67  switch (status) {
68    case WebMediaSource::EndOfStreamStatusNoError:
69      break;
70    case WebMediaSource::EndOfStreamStatusNetworkError:
71      pipeline_status = media::PIPELINE_ERROR_NETWORK;
72      break;
73    case WebMediaSource::EndOfStreamStatusDecodeError:
74      pipeline_status = media::PIPELINE_ERROR_DECODE;
75      break;
76    default:
77      NOTIMPLEMENTED();
78  }
79
80  demuxer_->MarkEndOfStream(pipeline_status);
81}
82
83void WebMediaSourceImpl::unmarkEndOfStream() {
84  demuxer_->UnmarkEndOfStream();
85}
86
87}  // namespace content
88