1868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
57dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "content/renderer/media/webmediasourceclient_impl.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/guid.h"
87dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "content/renderer/media/websourcebuffer_impl.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "media/filters/chunk_demuxer.h"
10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebCString.h"
11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebString.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using ::WebKit::WebString;
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using ::WebKit::WebMediaSourceClient;
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochnamespace content {
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define COMPILE_ASSERT_MATCHING_STATUS_ENUM(webkit_name, chromium_name) \
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  COMPILE_ASSERT(static_cast<int>(WebMediaSourceClient::webkit_name) == \
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 static_cast<int>(media::ChunkDemuxer::chromium_name),  \
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 mismatching_status_enums)
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)COMPILE_ASSERT_MATCHING_STATUS_ENUM(AddStatusOk, kOk);
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)COMPILE_ASSERT_MATCHING_STATUS_ENUM(AddStatusNotSupported, kNotSupported);
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)COMPILE_ASSERT_MATCHING_STATUS_ENUM(AddStatusReachedIdLimit, kReachedIdLimit);
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#undef COMPILE_ASSERT_MATCHING_STATUS_ENUM
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebMediaSourceClientImpl::WebMediaSourceClientImpl(
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    media::ChunkDemuxer* demuxer, media::LogCB log_cb)
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : demuxer_(demuxer),
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      log_cb_(log_cb) {
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(demuxer_);
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebMediaSourceClientImpl::~WebMediaSourceClientImpl() {}
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebMediaSourceClient::AddStatus WebMediaSourceClientImpl::addSourceBuffer(
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const WebKit::WebString& type,
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const WebKit::WebVector<WebKit::WebString>& codecs,
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WebKit::WebSourceBuffer** source_buffer) {
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string id = base::GenerateGUID();
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<std::string> new_codecs(codecs.size());
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < codecs.size(); ++i)
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    new_codecs[i] = codecs[i].utf8().data();
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebMediaSourceClient::AddStatus result =
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      static_cast<WebMediaSourceClient::AddStatus>(
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          demuxer_->AddId(id, type.utf8().data(), new_codecs));
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (result == WebMediaSourceClient::AddStatusOk)
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    *source_buffer = new WebSourceBufferImpl(id, demuxer_);
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return result;
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)double WebMediaSourceClientImpl::duration() {
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return demuxer_->GetDuration();
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebMediaSourceClientImpl::setDuration(double new_duration) {
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK_GE(new_duration, 0);
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  demuxer_->SetDuration(new_duration);
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
63ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// TODO(acolwell): Remove this once endOfStream() is removed from Blink.
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebMediaSourceClientImpl::endOfStream(
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WebMediaSourceClient::EndOfStreamStatus status) {
66ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  markEndOfStream(status);
67ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
68ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
69ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid WebMediaSourceClientImpl::markEndOfStream(
70ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    WebMediaSourceClient::EndOfStreamStatus status) {
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  media::PipelineStatus pipeline_status = media::PIPELINE_OK;
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  switch (status) {
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case WebMediaSourceClient::EndOfStreamStatusNoError:
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case WebMediaSourceClient::EndOfStreamStatusNetworkError:
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      pipeline_status = media::PIPELINE_ERROR_NETWORK;
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case WebMediaSourceClient::EndOfStreamStatusDecodeError:
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      pipeline_status = media::PIPELINE_ERROR_DECODE;
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    default:
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NOTIMPLEMENTED();
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
86ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  demuxer_->MarkEndOfStream(pipeline_status);
87ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
88ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
89ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid WebMediaSourceClientImpl::unmarkEndOfStream() {
90ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  demuxer_->UnmarkEndOfStream();
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}  // namespace content
94