Home | History | Annotate | Download | only in media
      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/webmediasourceclient_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 
     13 using ::WebKit::WebString;
     14 using ::WebKit::WebMediaSourceClient;
     15 
     16 namespace content {
     17 
     18 #define COMPILE_ASSERT_MATCHING_STATUS_ENUM(webkit_name, chromium_name) \
     19   COMPILE_ASSERT(static_cast<int>(WebMediaSourceClient::webkit_name) == \
     20                  static_cast<int>(media::ChunkDemuxer::chromium_name),  \
     21                  mismatching_status_enums)
     22 COMPILE_ASSERT_MATCHING_STATUS_ENUM(AddStatusOk, kOk);
     23 COMPILE_ASSERT_MATCHING_STATUS_ENUM(AddStatusNotSupported, kNotSupported);
     24 COMPILE_ASSERT_MATCHING_STATUS_ENUM(AddStatusReachedIdLimit, kReachedIdLimit);
     25 #undef COMPILE_ASSERT_MATCHING_STATUS_ENUM
     26 
     27 WebMediaSourceClientImpl::WebMediaSourceClientImpl(
     28     media::ChunkDemuxer* demuxer, media::LogCB log_cb)
     29     : demuxer_(demuxer),
     30       log_cb_(log_cb) {
     31   DCHECK(demuxer_);
     32 }
     33 
     34 WebMediaSourceClientImpl::~WebMediaSourceClientImpl() {}
     35 
     36 WebMediaSourceClient::AddStatus WebMediaSourceClientImpl::addSourceBuffer(
     37     const WebKit::WebString& type,
     38     const WebKit::WebVector<WebKit::WebString>& codecs,
     39     WebKit::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   WebMediaSourceClient::AddStatus result =
     45       static_cast<WebMediaSourceClient::AddStatus>(
     46           demuxer_->AddId(id, type.utf8().data(), new_codecs));
     47 
     48   if (result == WebMediaSourceClient::AddStatusOk)
     49     *source_buffer = new WebSourceBufferImpl(id, demuxer_);
     50 
     51   return result;
     52 }
     53 
     54 double WebMediaSourceClientImpl::duration() {
     55   return demuxer_->GetDuration();
     56 }
     57 
     58 void WebMediaSourceClientImpl::setDuration(double new_duration) {
     59   DCHECK_GE(new_duration, 0);
     60   demuxer_->SetDuration(new_duration);
     61 }
     62 
     63 // TODO(acolwell): Remove this once endOfStream() is removed from Blink.
     64 void WebMediaSourceClientImpl::endOfStream(
     65     WebMediaSourceClient::EndOfStreamStatus status) {
     66   markEndOfStream(status);
     67 }
     68 
     69 void WebMediaSourceClientImpl::markEndOfStream(
     70     WebMediaSourceClient::EndOfStreamStatus status) {
     71   media::PipelineStatus pipeline_status = media::PIPELINE_OK;
     72 
     73   switch (status) {
     74     case WebMediaSourceClient::EndOfStreamStatusNoError:
     75       break;
     76     case WebMediaSourceClient::EndOfStreamStatusNetworkError:
     77       pipeline_status = media::PIPELINE_ERROR_NETWORK;
     78       break;
     79     case WebMediaSourceClient::EndOfStreamStatusDecodeError:
     80       pipeline_status = media::PIPELINE_ERROR_DECODE;
     81       break;
     82     default:
     83       NOTIMPLEMENTED();
     84   }
     85 
     86   demuxer_->MarkEndOfStream(pipeline_status);
     87 }
     88 
     89 void WebMediaSourceClientImpl::unmarkEndOfStream() {
     90   demuxer_->UnmarkEndOfStream();
     91 }
     92 
     93 }  // namespace content
     94