OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "decoder_selector.h" | 5 #include "decoder_selector.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/callback_helpers.h" | 8 #include "base/callback_helpers.h" |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "base/single_thread_task_runner.h" | 10 #include "base/single_thread_task_runner.h" |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
55 const SetDecryptorReadyCB& set_decryptor_ready_cb) | 55 const SetDecryptorReadyCB& set_decryptor_ready_cb) |
56 : task_runner_(task_runner), | 56 : task_runner_(task_runner), |
57 decoders_(decoders.Pass()), | 57 decoders_(decoders.Pass()), |
58 set_decryptor_ready_cb_(set_decryptor_ready_cb), | 58 set_decryptor_ready_cb_(set_decryptor_ready_cb), |
59 input_stream_(NULL), | 59 input_stream_(NULL), |
60 weak_ptr_factory_(this) {} | 60 weak_ptr_factory_(this) {} |
61 | 61 |
62 template <DemuxerStream::Type StreamType> | 62 template <DemuxerStream::Type StreamType> |
63 DecoderSelector<StreamType>::~DecoderSelector() { | 63 DecoderSelector<StreamType>::~DecoderSelector() { |
64 DVLOG(2) << __FUNCTION__; | 64 DVLOG(2) << __FUNCTION__; |
65 DCHECK(select_decoder_cb_.is_null()); | 65 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 66 |
| 67 if (!select_decoder_cb_.is_null()) |
| 68 ReturnNullDecoder(); |
| 69 |
| 70 decoder_.reset(); |
| 71 decrypted_stream_.reset(); |
66 } | 72 } |
67 | 73 |
68 template <DemuxerStream::Type StreamType> | 74 template <DemuxerStream::Type StreamType> |
69 void DecoderSelector<StreamType>::SelectDecoder( | 75 void DecoderSelector<StreamType>::SelectDecoder( |
70 DemuxerStream* stream, | 76 DemuxerStream* stream, |
71 bool low_delay, | 77 bool low_delay, |
72 const SelectDecoderCB& select_decoder_cb, | 78 const SelectDecoderCB& select_decoder_cb, |
73 const typename Decoder::OutputCB& output_cb) { | 79 const typename Decoder::OutputCB& output_cb) { |
74 DVLOG(2) << __FUNCTION__; | 80 DVLOG(2) << __FUNCTION__; |
75 DCHECK(task_runner_->BelongsToCurrentThread()); | 81 DCHECK(task_runner_->BelongsToCurrentThread()); |
(...skipping 29 matching lines...) Expand all Loading... |
105 DecoderStreamTraits<StreamType>::Initialize( | 111 DecoderStreamTraits<StreamType>::Initialize( |
106 decoder_.get(), | 112 decoder_.get(), |
107 StreamTraits::GetDecoderConfig(*input_stream_), | 113 StreamTraits::GetDecoderConfig(*input_stream_), |
108 low_delay_, | 114 low_delay_, |
109 base::Bind(&DecoderSelector<StreamType>::DecryptingDecoderInitDone, | 115 base::Bind(&DecoderSelector<StreamType>::DecryptingDecoderInitDone, |
110 weak_ptr_factory_.GetWeakPtr()), | 116 weak_ptr_factory_.GetWeakPtr()), |
111 output_cb_); | 117 output_cb_); |
112 } | 118 } |
113 | 119 |
114 template <DemuxerStream::Type StreamType> | 120 template <DemuxerStream::Type StreamType> |
115 void DecoderSelector<StreamType>::Abort() { | |
116 DVLOG(2) << __FUNCTION__; | |
117 DCHECK(task_runner_->BelongsToCurrentThread()); | |
118 | |
119 // Invalidate all weak pointers so that pending callbacks won't fire. | |
120 weak_ptr_factory_.InvalidateWeakPtrs(); | |
121 | |
122 decoder_.reset(); | |
123 decrypted_stream_.reset(); | |
124 | |
125 if (!select_decoder_cb_.is_null()) | |
126 ReturnNullDecoder(); | |
127 } | |
128 | |
129 template <DemuxerStream::Type StreamType> | |
130 void DecoderSelector<StreamType>::DecryptingDecoderInitDone( | 121 void DecoderSelector<StreamType>::DecryptingDecoderInitDone( |
131 PipelineStatus status) { | 122 PipelineStatus status) { |
132 DVLOG(2) << __FUNCTION__; | 123 DVLOG(2) << __FUNCTION__; |
133 DCHECK(task_runner_->BelongsToCurrentThread()); | 124 DCHECK(task_runner_->BelongsToCurrentThread()); |
134 | 125 |
135 if (status == PIPELINE_OK) { | 126 if (status == PIPELINE_OK) { |
136 base::ResetAndReturn(&select_decoder_cb_) | 127 base::ResetAndReturn(&select_decoder_cb_) |
137 .Run(decoder_.Pass(), scoped_ptr<DecryptingDemuxerStream>()); | 128 .Run(decoder_.Pass(), scoped_ptr<DecryptingDemuxerStream>()); |
138 return; | 129 return; |
139 } | 130 } |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
214 | 205 |
215 // These forward declarations tell the compiler that we will use | 206 // These forward declarations tell the compiler that we will use |
216 // DecoderSelector with these arguments, allowing us to keep these definitions | 207 // DecoderSelector with these arguments, allowing us to keep these definitions |
217 // in our .cc without causing linker errors. This also means if anyone tries to | 208 // in our .cc without causing linker errors. This also means if anyone tries to |
218 // instantiate a DecoderSelector with anything but these two specializations | 209 // instantiate a DecoderSelector with anything but these two specializations |
219 // they'll most likely get linker errors. | 210 // they'll most likely get linker errors. |
220 template class DecoderSelector<DemuxerStream::AUDIO>; | 211 template class DecoderSelector<DemuxerStream::AUDIO>; |
221 template class DecoderSelector<DemuxerStream::VIDEO>; | 212 template class DecoderSelector<DemuxerStream::VIDEO>; |
222 | 213 |
223 } // namespace media | 214 } // namespace media |
OLD | NEW |