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/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 
     13 using ::blink::WebString;
     14 using ::blink::WebMediaSource;
     15 
     16 namespace 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)
     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 WebMediaSourceImpl::WebMediaSourceImpl(
     28     media::ChunkDemuxer* demuxer, media::LogCB log_cb)
     29     : demuxer_(demuxer),
     30       log_cb_(log_cb) {
     31   DCHECK(demuxer_);
     32 }
     33 
     34 WebMediaSourceImpl::~WebMediaSourceImpl() {}
     35 
     36 WebMediaSource::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 
     54 double WebMediaSourceImpl::duration() {
     55   return demuxer_->GetDuration();
     56 }
     57 
     58 void WebMediaSourceImpl::setDuration(double new_duration) {
     59   DCHECK_GE(new_duration, 0);
     60   demuxer_->SetDuration(new_duration);
     61 }
     62 
     63 void 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 
     83 void WebMediaSourceImpl::unmarkEndOfStream() {
     84   demuxer_->UnmarkEndOfStream();
     85 }
     86 
     87 }  // namespace content
     88