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 |