| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "base/bind.h" | 5 #include "base/bind.h" |
| 6 #include "base/logging.h" | 6 #include "base/logging.h" |
| 7 #include "base/message_loop/message_loop.h" | 7 #include "base/message_loop/message_loop.h" |
| 8 #include "services/media/factory_service/media_demux_impl.h" | 8 #include "services/media/factory_service/media_demux_impl.h" |
| 9 #include "services/media/framework/parts/reader_cache.h" | 9 #include "services/media/framework/parts/reader_cache.h" |
| 10 #include "services/media/framework/util/callback_joiner.h" | 10 #include "services/media/framework/util/callback_joiner.h" |
| 11 #include "services/media/framework_mojo/mojo_reader.h" | 11 #include "services/media/framework_mojo/mojo_reader.h" |
| 12 #include "services/media/framework_mojo/mojo_type_conversions.h" | 12 #include "services/media/framework_mojo/mojo_type_conversions.h" |
| 13 | 13 |
| 14 namespace mojo { | 14 namespace mojo { |
| 15 namespace media { | 15 namespace media { |
| 16 | 16 |
| 17 // static | 17 // static |
| 18 std::shared_ptr<MediaDemuxImpl> MediaDemuxImpl::Create( | 18 std::shared_ptr<MediaDemuxImpl> MediaDemuxImpl::Create( |
| 19 InterfaceHandle<SeekingReader> reader, | 19 InterfaceHandle<SeekingReader> reader, |
| 20 InterfaceRequest<MediaDemux> request, | 20 InterfaceRequest<MediaDemux> request, |
| 21 MediaFactoryService* owner) { | 21 MediaFactoryService* owner) { |
| 22 return std::shared_ptr<MediaDemuxImpl>( | 22 return std::shared_ptr<MediaDemuxImpl>( |
| 23 new MediaDemuxImpl(reader.Pass(), request.Pass(), owner)); | 23 new MediaDemuxImpl(reader.Pass(), request.Pass(), owner)); |
| 24 } | 24 } |
| 25 | 25 |
| 26 MediaDemuxImpl::MediaDemuxImpl(InterfaceHandle<SeekingReader> reader, | 26 MediaDemuxImpl::MediaDemuxImpl(InterfaceHandle<SeekingReader> reader, |
| 27 InterfaceRequest<MediaDemux> request, | 27 InterfaceRequest<MediaDemux> request, |
| 28 MediaFactoryService* owner) | 28 MediaFactoryService* owner) |
| 29 : MediaFactoryService::Product(owner), binding_(this, request.Pass()) { | 29 : MediaFactoryService::Product<MediaDemux>(this, request.Pass(), owner) { |
| 30 DCHECK(reader); | 30 DCHECK(reader); |
| 31 | 31 |
| 32 task_runner_ = base::MessageLoop::current()->task_runner(); | 32 task_runner_ = base::MessageLoop::current()->task_runner(); |
| 33 DCHECK(task_runner_); | 33 DCHECK(task_runner_); |
| 34 | 34 |
| 35 metadata_publisher_.SetCallbackRunner( | 35 metadata_publisher_.SetCallbackRunner( |
| 36 [this](const GetMetadataCallback& callback, uint64_t version) { | 36 [this](const GetMetadataCallback& callback, uint64_t version) { |
| 37 callback.Run(version, demux_ ? MediaMetadata::From(demux_->metadata()) | 37 callback.Run(version, demux_ ? MediaMetadata::From(demux_->metadata()) |
| 38 : nullptr); | 38 : nullptr); |
| 39 }); | 39 }); |
| 40 | 40 |
| 41 // Go away when the client is no longer connected. | |
| 42 binding_.set_connection_error_handler([this]() { ReleaseFromOwner(); }); | |
| 43 | |
| 44 std::shared_ptr<Reader> reader_ptr = MojoReader::Create(reader.Pass()); | 41 std::shared_ptr<Reader> reader_ptr = MojoReader::Create(reader.Pass()); |
| 45 if (!reader_ptr) { | 42 if (!reader_ptr) { |
| 46 NOTREACHED() << "couldn't create reader"; | 43 NOTREACHED() << "couldn't create reader"; |
| 47 return; | 44 return; |
| 48 } | 45 } |
| 49 | 46 |
| 50 std::shared_ptr<ReaderCache> reader_cache_ptr = | 47 std::shared_ptr<ReaderCache> reader_cache_ptr = |
| 51 ReaderCache::Create(reader_ptr); | 48 ReaderCache::Create(reader_ptr); |
| 52 if (!reader_cache_ptr) { | 49 if (!reader_cache_ptr) { |
| 53 NOTREACHED() << "couldn't create reader cache"; | 50 NOTREACHED() << "couldn't create reader cache"; |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 94 MediaSourceStreamDescriptor::New(); | 91 MediaSourceStreamDescriptor::New(); |
| 95 result[i] = streams_[i]->media_type(); | 92 result[i] = streams_[i]->media_type(); |
| 96 } | 93 } |
| 97 | 94 |
| 98 callback.Run(result.Pass()); | 95 callback.Run(result.Pass()); |
| 99 }); | 96 }); |
| 100 } | 97 } |
| 101 | 98 |
| 102 void MediaDemuxImpl::GetProducer(uint32_t stream_index, | 99 void MediaDemuxImpl::GetProducer(uint32_t stream_index, |
| 103 InterfaceRequest<MediaProducer> producer) { | 100 InterfaceRequest<MediaProducer> producer) { |
| 104 DCHECK(init_complete_.occurred()); | 101 RCHECK(init_complete_.occurred()); |
| 105 | 102 |
| 106 if (stream_index >= streams_.size()) { | 103 if (stream_index >= streams_.size()) { |
| 107 return; | 104 return; |
| 108 } | 105 } |
| 109 | 106 |
| 110 streams_[stream_index]->GetProducer(producer.Pass()); | 107 streams_[stream_index]->GetProducer(producer.Pass()); |
| 111 } | 108 } |
| 112 | 109 |
| 113 void MediaDemuxImpl::GetMetadata(uint64_t version_last_seen, | 110 void MediaDemuxImpl::GetMetadata(uint64_t version_last_seen, |
| 114 const GetMetadataCallback& callback) { | 111 const GetMetadataCallback& callback) { |
| 115 metadata_publisher_.Get(version_last_seen, callback); | 112 metadata_publisher_.Get(version_last_seen, callback); |
| 116 } | 113 } |
| 117 | 114 |
| 118 void MediaDemuxImpl::Prime(const PrimeCallback& callback) { | 115 void MediaDemuxImpl::Prime(const PrimeCallback& callback) { |
| 119 DCHECK(init_complete_.occurred()); | 116 RCHECK(init_complete_.occurred()); |
| 120 | 117 |
| 121 std::shared_ptr<CallbackJoiner> callback_joiner = CallbackJoiner::Create(); | 118 std::shared_ptr<CallbackJoiner> callback_joiner = CallbackJoiner::Create(); |
| 122 | 119 |
| 123 for (std::unique_ptr<Stream>& stream : streams_) { | 120 for (std::unique_ptr<Stream>& stream : streams_) { |
| 124 stream->PrimeConnection(callback_joiner->NewCallback()); | 121 stream->PrimeConnection(callback_joiner->NewCallback()); |
| 125 } | 122 } |
| 126 | 123 |
| 127 callback_joiner->WhenJoined(callback); | 124 callback_joiner->WhenJoined(callback); |
| 128 } | 125 } |
| 129 | 126 |
| 130 void MediaDemuxImpl::Flush(const FlushCallback& callback) { | 127 void MediaDemuxImpl::Flush(const FlushCallback& callback) { |
| 131 DCHECK(init_complete_.occurred()); | 128 RCHECK(init_complete_.occurred()); |
| 132 | 129 |
| 133 graph_.FlushAllOutputs(demux_part_); | 130 graph_.FlushAllOutputs(demux_part_); |
| 134 | 131 |
| 135 std::shared_ptr<CallbackJoiner> callback_joiner = CallbackJoiner::Create(); | 132 std::shared_ptr<CallbackJoiner> callback_joiner = CallbackJoiner::Create(); |
| 136 | 133 |
| 137 for (std::unique_ptr<Stream>& stream : streams_) { | 134 for (std::unique_ptr<Stream>& stream : streams_) { |
| 138 stream->FlushConnection(callback_joiner->NewCallback()); | 135 stream->FlushConnection(callback_joiner->NewCallback()); |
| 139 } | 136 } |
| 140 | 137 |
| 141 callback_joiner->WhenJoined(callback); | 138 callback_joiner->WhenJoined(callback); |
| 142 } | 139 } |
| 143 | 140 |
| 144 void MediaDemuxImpl::Seek(int64_t position, const SeekCallback& callback) { | 141 void MediaDemuxImpl::Seek(int64_t position, const SeekCallback& callback) { |
| 145 DCHECK(init_complete_.occurred()); | 142 RCHECK(init_complete_.occurred()); |
| 146 | 143 |
| 147 demux_->Seek(position, [this, callback]() { | 144 demux_->Seek(position, [this, callback]() { |
| 148 task_runner_->PostTask(FROM_HERE, base::Bind(&RunSeekCallback, callback)); | 145 task_runner_->PostTask(FROM_HERE, base::Bind(&RunSeekCallback, callback)); |
| 149 }); | 146 }); |
| 150 } | 147 } |
| 151 | 148 |
| 152 // static | 149 // static |
| 153 void MediaDemuxImpl::RunSeekCallback(const SeekCallback& callback) { | 150 void MediaDemuxImpl::RunSeekCallback(const SeekCallback& callback) { |
| 154 callback.Run(); | 151 callback.Run(); |
| 155 } | 152 } |
| (...skipping 28 matching lines...) Expand all Loading... |
| 184 } | 181 } |
| 185 | 182 |
| 186 void MediaDemuxImpl::Stream::FlushConnection( | 183 void MediaDemuxImpl::Stream::FlushConnection( |
| 187 const MojoProducer::FlushConnectionCallback callback) { | 184 const MojoProducer::FlushConnectionCallback callback) { |
| 188 DCHECK(producer_); | 185 DCHECK(producer_); |
| 189 producer_->FlushConnection(callback); | 186 producer_->FlushConnection(callback); |
| 190 } | 187 } |
| 191 | 188 |
| 192 } // namespace media | 189 } // namespace media |
| 193 } // namespace mojo | 190 } // namespace mojo |
| OLD | NEW |