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