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

Unified Diff: media/mojo/clients/mojo_demuxer.cc

Issue 2643743002: Mojify demuxers and allow running {Chunk/FFmpeg}Demuxer in a Utility Process (Closed)
Patch Set: Rebase and make sure to unbind mojom::DemuxerPtr on the bound thread during termination Created 3 years, 10 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
« no previous file with comments | « media/mojo/clients/mojo_demuxer.h ('k') | media/mojo/clients/mojo_demuxer_factory.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: media/mojo/clients/mojo_demuxer.cc
diff --git a/media/mojo/clients/mojo_demuxer.cc b/media/mojo/clients/mojo_demuxer.cc
new file mode 100644
index 0000000000000000000000000000000000000000..d2558305bd5fc092f6b6929ae4fd557681f1910a
--- /dev/null
+++ b/media/mojo/clients/mojo_demuxer.cc
@@ -0,0 +1,236 @@
+// Copyright (c) 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "media/mojo/clients/mojo_demuxer.h"
+
+#include "base/callback_helpers.h"
+#include "media/base/media_tracks.h"
+#include "media/mojo/clients/mojo_data_source_impl.h"
+#include "media/mojo/common/media_type_converters.h"
+
+using base::TimeDelta;
+
+namespace media {
+
+MojoDemuxer::MojoDemuxer(
+ int32_t remote_id,
+ Demuxer::LoadType load_type,
+ DataSource* data_source,
+ const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner,
+ mojom::DemuxerPtr mojo_demuxer,
+ const base::Closure& open_cb,
+ const Demuxer::EncryptedMediaInitDataCB& encrypted_media_init_data_cb,
+ const Demuxer::MediaTracksUpdatedCB& media_tracks_updated_cb)
+ : media_task_runner_(media_task_runner),
+ load_type_(load_type),
+ mojo_data_source_(nullptr),
+ data_source_(data_source),
+ open_cb_(open_cb),
+ encrypted_media_init_data_cb_(encrypted_media_init_data_cb),
+ media_tracks_updated_cb_(media_tracks_updated_cb),
+ remote_demuxer_info_(mojo_demuxer.PassInterface()),
+ client_binding_(this),
+ weak_factory_(this) {
+ DCHECK(!open_cb_.is_null());
+ DCHECK(remote_id_ != MediaResource::kInvalidRemoteId);
+ remote_id_ = remote_id;
+}
+
+MojoDemuxer::~MojoDemuxer() {
+ // Demuxer is always destroyed in the main thread.
+ CHECK(!media_task_runner_->BelongsToCurrentThread());
+ CHECK(!remote_demuxer_);
+ CHECK(!mojo_data_source_);
+}
+
+DemuxerStream* MojoDemuxer::GetStream(DemuxerStream::Type type) {
+ return nullptr;
+}
+
+MediaResource::Type MojoDemuxer::GetType() const {
+ return MediaResource::Type::REMOTE;
+}
+
+std::string MojoDemuxer::GetDisplayName() const {
+ return "MojoDemuxer";
+}
+
+void MojoDemuxer::Initialize(DemuxerHost* host,
+ const PipelineStatusCB& status_cb,
+ bool enable_text_tracks) {
+ CHECK(media_task_runner_->BelongsToCurrentThread());
+
+ host_ = host;
+ status_cb_ = status_cb;
+
+ // Bind |mojo_demuxer_| to the |media_task_runner_|.
+ if (!remote_demuxer_.is_bound())
+ remote_demuxer_.Bind(std::move(remote_demuxer_info_));
+
+ remote_demuxer_.set_connection_error_handler(
+ base::Bind(&MojoDemuxer::OnConnectionError, weak_factory_.GetWeakPtr()));
+
+ mojom::DemuxerClientAssociatedPtrInfo client_ptr_info;
+ client_binding_.Bind(&client_ptr_info, remote_demuxer_.associated_group());
+
+ mojom::DataSourcePtr data_source_ptr;
+ if (data_source_) {
+ mojo_data_source_.reset(
+ new MojoDataSourceImpl(data_source_, MakeRequest(&data_source_ptr)));
+ mojo_data_source_->set_connection_error_handler(base::Bind(
+ &MojoDemuxer::OnDataSourceConnectionError, weak_factory_.GetWeakPtr()));
+ }
+
+ remote_demuxer_->Initialize(
+ std::move(client_ptr_info), GetRemoteId(), load_type_,
+ std::move(data_source_ptr),
+ base::Bind(&MojoDemuxer::OnInitialized, weak_factory_.GetWeakPtr()));
+}
+
+void MojoDemuxer::OnDataSourceConnectionError() {
+ CHECK(media_task_runner_->BelongsToCurrentThread());
+
+ mojo_data_source_.reset();
+}
+
+void MojoDemuxer::OnInitialized(bool success) {
+ CHECK(media_task_runner_->BelongsToCurrentThread());
+
+ if (!success) {
+ media_task_runner_->PostTask(
+ FROM_HERE, base::Bind(status_cb_, DEMUXER_ERROR_COULD_NOT_OPEN));
+ return;
+ }
+
+ media_task_runner_->PostTask(FROM_HERE, base::Bind(status_cb_, PIPELINE_OK));
+ base::ResetAndReturn(&open_cb_).Run();
+}
+
+void MojoDemuxer::StartWaitingForSeek(base::TimeDelta seek_time) {
+ CHECK(!media_task_runner_->BelongsToCurrentThread());
+
+ remote_demuxer_->StartWaitingForSeek(seek_time);
+}
+
+void MojoDemuxer::CancelPendingSeek(base::TimeDelta seek_time) {
+ if (media_task_runner_->BelongsToCurrentThread())
+ remote_demuxer_->CancelPendingSeek(seek_time);
+ else {
+ base::Bind(&MojoDemuxer::CancelPendingSeek, weak_factory_.GetWeakPtr(),
+ seek_time);
+ }
+}
+
+void MojoDemuxer::Seek(base::TimeDelta time,
+ const PipelineStatusCB& status_cb) {
+ CHECK(media_task_runner_->BelongsToCurrentThread());
+
+ remote_demuxer_->Seek(
+ time,
+ base::Bind(&MojoDemuxer::OnSeek, weak_factory_.GetWeakPtr(), status_cb));
+}
+
+void MojoDemuxer::OnSeek(const PipelineStatusCB& status_cb,
+ PipelineStatus status) {
+ media_task_runner_->PostTask(FROM_HERE, base::Bind(status_cb, status));
+}
+
+void MojoDemuxer::Stop() {
+ CHECK(media_task_runner_->BelongsToCurrentThread());
+
+ remote_demuxer_->Stop();
+
+ // Unbind in the bound thread.
+ remote_demuxer_.reset();
+ mojo_data_source_.reset();
+}
+
+void MojoDemuxer::AbortPendingReads() {
+ CHECK(media_task_runner_->BelongsToCurrentThread());
+
+ remote_demuxer_->AbortPendingReads();
+}
+
+base::TimeDelta MojoDemuxer::GetStartTime() const {
+ CHECK(media_task_runner_->BelongsToCurrentThread());
+
+ base::TimeDelta start_time;
+ remote_demuxer_->GetStartTime(&start_time);
+
+ return start_time;
+}
+base::Time MojoDemuxer::GetTimelineOffset() const {
+ CHECK(media_task_runner_->BelongsToCurrentThread());
+
+ base::Time timeline_offset;
+ remote_demuxer_->GetTimelineOffset(&timeline_offset);
+
+ return timeline_offset;
+}
+
+int64_t MojoDemuxer::GetMemoryUsage() const {
+ CHECK(media_task_runner_->BelongsToCurrentThread());
+
+ int64_t memory_usage = 0;
+ remote_demuxer_->GetMemoryUsage(&memory_usage);
+
+ return memory_usage;
+}
+
+void MojoDemuxer::OnEnabledAudioTracksChanged(
+ const std::vector<MediaTrack::Id>& track_ids,
+ base::TimeDelta current_time) {
+ CHECK(media_task_runner_->BelongsToCurrentThread());
+ remote_demuxer_->OnEnabledAudioTracksChanged(track_ids, current_time);
+}
+void MojoDemuxer::OnSelectedVideoTrackChanged(
+ const std::vector<MediaTrack::Id>& track_ids,
+ base::TimeDelta current_time) {
+ CHECK(media_task_runner_->BelongsToCurrentThread());
+ remote_demuxer_->OnSelectedVideoTrackChanged(track_ids, current_time);
+}
+
+void MojoDemuxer::OnConnectionError() {
+ CHECK(media_task_runner_->BelongsToCurrentThread());
+
+ host_->OnDemuxerError(PIPELINE_ERROR_READ);
+}
+
+void MojoDemuxer::OnEncryptedMediaInitData(
+ EmeInitDataType init_data_type,
+ const std::vector<uint8_t>& init_data) {
+ CHECK(media_task_runner_->BelongsToCurrentThread());
+ encrypted_media_init_data_cb_.Run(init_data_type, init_data);
+}
+
+void MojoDemuxer::OnMediaTracksUpdated(mojom::MediaTracksPtr mojo_tracks) {
+ CHECK(media_task_runner_->BelongsToCurrentThread());
+
+ std::unique_ptr<MediaTracks> tracks(
+ mojo_tracks.To<std::unique_ptr<MediaTracks>>());
+
+ media_tracks_updated_cb_.Run(std::move(tracks));
+}
+
+void MojoDemuxer::OnBufferedTimeRangesChanged(
+ mojom::RangesTimeDeltaPtr mojo_ranges) {
+ CHECK(media_task_runner_->BelongsToCurrentThread());
+
+ Ranges<base::TimeDelta> ranges = mojo_ranges.To<Ranges<base::TimeDelta>>();
+ host_->OnBufferedTimeRangesChanged(ranges);
+}
+
+void MojoDemuxer::OnSetDuration(base::TimeDelta duration) {
+ CHECK(media_task_runner_->BelongsToCurrentThread());
+
+ host_->SetDuration(duration);
+}
+
+void MojoDemuxer::OnDemuxerError(PipelineStatus error) {
+ CHECK(media_task_runner_->BelongsToCurrentThread());
+
+ host_->OnDemuxerError(error);
+}
+
+} // namespace media
« no previous file with comments | « media/mojo/clients/mojo_demuxer.h ('k') | media/mojo/clients/mojo_demuxer_factory.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698