Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(69)

Unified Diff: webkit/renderer/media/android/media_source_delegate.cc

Issue 14247018: Implement WebRTC in Chrome for TV (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: build fix Created 7 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: webkit/renderer/media/android/media_source_delegate.cc
diff --git a/webkit/renderer/media/android/media_source_delegate.cc b/webkit/renderer/media/android/media_source_delegate.cc
index 707752158cbd9b39c7261778b00a849e5e1f8dad..6bf718333a6e6485dc9674f194a83109c121f3d6 100644
--- a/webkit/renderer/media/android/media_source_delegate.cc
+++ b/webkit/renderer/media/android/media_source_delegate.cc
@@ -27,9 +27,9 @@ using WebKit::WebString;
namespace {
-// The size of the access unit to transfer in an IPC.
+// The size of the access unit to transfer in an IPC in case of MediaSource.
// 16: approximately 250ms of content in 60 fps movies.
-const size_t kAccessUnitSize = 16;
+const size_t kAccessUnitSizeForMediaSource = 16;
const uint8 kVorbisPadding[] = { 0xff, 0xff, 0xff, 0xff };
@@ -66,19 +66,22 @@ MediaSourceDelegate::MediaSourceDelegate(WebMediaPlayerProxyAndroid* proxy,
proxy_(proxy),
player_id_(player_id),
media_log_(media_log),
+ demuxer_(NULL),
audio_params_(new MediaPlayerHostMsg_ReadFromDemuxerAck_Params),
video_params_(new MediaPlayerHostMsg_ReadFromDemuxerAck_Params),
- seeking_(false) {
+ seeking_(false),
+ access_unit_size_(0) {
}
MediaSourceDelegate::~MediaSourceDelegate() {
DVLOG(1) << "MediaSourceDelegate::~MediaSourceDelegate() : " << player_id_;
DCHECK(!chunk_demuxer_);
+ DCHECK(!demuxer_);
}
void MediaSourceDelegate::Destroy() {
DVLOG(1) << "MediaSourceDelegate::Destroy() : " << player_id_;
- if (!chunk_demuxer_) {
+ if (!demuxer_) {
delete this;
return;
}
@@ -87,11 +90,13 @@ void MediaSourceDelegate::Destroy() {
media_source_.reset();
proxy_ = NULL;
- chunk_demuxer_->Stop(
- BIND_TO_RENDER_LOOP(&MediaSourceDelegate::OnDemuxerStopDone));
+ demuxer_ = NULL;
+ if (chunk_demuxer_)
+ chunk_demuxer_->Stop(
+ BIND_TO_RENDER_LOOP(&MediaSourceDelegate::OnDemuxerStopDone));
}
-void MediaSourceDelegate::Initialize(
+void MediaSourceDelegate::InitializeMediaSource(
WebKit::WebMediaSource* media_source,
const media::NeedKeyCB& need_key_cb,
const UpdateNetworkStateCB& update_network_state_cb) {
@@ -108,8 +113,26 @@ void MediaSourceDelegate::Initialize(
base::Bind(&LogMediaSourceError, media_log_)));
chunk_demuxer_->Initialize(this,
BIND_TO_RENDER_LOOP(&MediaSourceDelegate::OnDemuxerInitDone));
+ demuxer_ = chunk_demuxer_.get();
+ access_unit_size_ = kAccessUnitSizeForMediaSource;
}
+#if defined(GOOGLE_TV)
+void MediaSourceDelegate::InitializeMediaStream(
+ media::Demuxer* demuxer,
+ const UpdateNetworkStateCB& update_network_state_cb) {
+ DCHECK(demuxer);
+ demuxer_ = demuxer;
+ update_network_state_cb_ = update_network_state_cb;
+
+ demuxer_->Initialize(this,
+ BIND_TO_RENDER_LOOP(&MediaSourceDelegate::OnDemuxerInitDone));
+ // When playing Media Stream, don't wait to accumulate multiple packets per
+ // IPC communication.
+ access_unit_size_ = 1;
+}
+#endif
+
const WebKit::WebTimeRanges& MediaSourceDelegate::Buffered() {
buffered_web_time_ranges_ =
ConvertToWebTimeRanges(buffered_time_ranges_);
@@ -136,11 +159,10 @@ void MediaSourceDelegate::Seek(base::TimeDelta time) {
DVLOG(1) << "MediaSourceDelegate::Seek(" << time.InSecondsF() << ") : "
<< player_id_;
seeking_ = true;
- DCHECK(chunk_demuxer_);
- if (!chunk_demuxer_)
- return;
- chunk_demuxer_->StartWaitingForSeek();
- chunk_demuxer_->Seek(time,
+ DCHECK(demuxer_);
+ if (chunk_demuxer_)
+ chunk_demuxer_->StartWaitingForSeek();
+ demuxer_->Seek(time,
BIND_TO_RENDER_LOOP(&MediaSourceDelegate::OnDemuxerError));
}
@@ -175,11 +197,13 @@ void MediaSourceDelegate::OnReadFromDemuxer(media::DemuxerStream::Type type,
seeking_ = false;
DCHECK(type == DemuxerStream::AUDIO || type == DemuxerStream::VIDEO);
+ // The access unit size should have been initialized properly at this stage.
+ DCHECK_GT(access_unit_size_, 0u);
MediaPlayerHostMsg_ReadFromDemuxerAck_Params* params =
type == DemuxerStream::AUDIO ? audio_params_.get() : video_params_.get();
params->type = type;
- params->access_units.resize(kAccessUnitSize);
- DemuxerStream* stream = chunk_demuxer_->GetStream(type);
+ params->access_units.resize(access_unit_size_);
+ DemuxerStream* stream = demuxer_->GetStream(type);
DCHECK(stream != NULL);
ReadFromDemuxerStream(stream, params, 0);
}
@@ -311,7 +335,7 @@ void MediaSourceDelegate::OnDemuxerStopDone() {
void MediaSourceDelegate::NotifyDemuxerReady(const std::string& key_system) {
MediaPlayerHostMsg_DemuxerReady_Params params;
- DemuxerStream* audio_stream = chunk_demuxer_->GetStream(DemuxerStream::AUDIO);
+ DemuxerStream* audio_stream = demuxer_->GetStream(DemuxerStream::AUDIO);
if (audio_stream) {
const media::AudioDecoderConfig& config =
audio_stream->audio_decoder_config();
@@ -323,7 +347,7 @@ void MediaSourceDelegate::NotifyDemuxerReady(const std::string& key_system) {
params.audio_extra_data = std::vector<uint8>(
config.extra_data(), config.extra_data() + config.extra_data_size());
}
- DemuxerStream* video_stream = chunk_demuxer_->GetStream(DemuxerStream::VIDEO);
+ DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO);
if (video_stream) {
const media::VideoDecoderConfig& config =
video_stream->video_decoder_config();
@@ -333,11 +357,7 @@ void MediaSourceDelegate::NotifyDemuxerReady(const std::string& key_system) {
params.video_extra_data = std::vector<uint8>(
config.extra_data(), config.extra_data() + config.extra_data_size());
}
- double duration_ms = chunk_demuxer_->GetDuration() * 1000;
- DCHECK(duration_ms >= 0);
- if (duration_ms > std::numeric_limits<int>::max())
- duration_ms = std::numeric_limits<int>::max();
- params.duration_ms = duration_ms;
+ params.duration_ms = GetDurationMs();
params.key_system = key_system;
bool ready_to_send = (!params.is_audio_encrypted &&
@@ -346,6 +366,19 @@ void MediaSourceDelegate::NotifyDemuxerReady(const std::string& key_system) {
proxy_->DemuxerReady(player_id_, params);
}
+int MediaSourceDelegate::GetDurationMs() {
+ if (!chunk_demuxer_)
+ return -1;
+
+ double duration_ms = chunk_demuxer_->GetDuration() * 1000;
+ if (duration_ms > std::numeric_limits<int>::max()) {
+ LOG(WARNING) << "Duration from ChunkDemuxer is too large; probably "
+ "something has gone wrong.";
+ return std::numeric_limits<int>::max();
+ }
+ return duration_ms;
+}
+
void MediaSourceDelegate::OnDemuxerOpened() {
if (!media_source_)
return;
« no previous file with comments | « webkit/renderer/media/android/media_source_delegate.h ('k') | webkit/renderer/media/android/webmediaplayer_android.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698