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 "media/gpu/avda_codec_allocator.h" | 5 #include "media/gpu/avda_codec_allocator.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 | 8 |
9 #include <memory> | 9 #include <memory> |
10 | 10 |
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
135 } | 135 } |
136 } | 136 } |
137 | 137 |
138 // Return the task runner for tasks of type |type|. | 138 // Return the task runner for tasks of type |type|. |
139 scoped_refptr<base::SingleThreadTaskRunner> AVDACodecAllocator::TaskRunnerFor( | 139 scoped_refptr<base::SingleThreadTaskRunner> AVDACodecAllocator::TaskRunnerFor( |
140 TaskType task_type) { | 140 TaskType task_type) { |
141 DCHECK(thread_checker_.CalledOnValidThread()); | 141 DCHECK(thread_checker_.CalledOnValidThread()); |
142 return threads_[task_type]->thread.task_runner(); | 142 return threads_[task_type]->thread.task_runner(); |
143 } | 143 } |
144 | 144 |
145 bool AVDACodecAllocator::AllocateSurface(AVDACodecAllocatorClient* client, | 145 bool AVDACodecAllocator::AllocateSurface(AVDASurfaceAllocatorClient* client, |
146 int surface_id) { | 146 int surface_id) { |
147 DVLOG(1) << __func__ << ": " << surface_id; | 147 DVLOG(1) << __func__ << ": " << surface_id; |
148 DCHECK(thread_checker_.CalledOnValidThread()); | 148 DCHECK(thread_checker_.CalledOnValidThread()); |
149 | 149 |
150 if (surface_id == SurfaceManager::kNoSurfaceID) | 150 if (surface_id == SurfaceManager::kNoSurfaceID) |
151 return true; | 151 return true; |
152 | 152 |
153 // If it's not owned or being released, |client| now owns it. | 153 // If it's not owned or being released, |client| now owns it. |
154 if (!surface_owners_.count(surface_id) && | 154 if (!surface_owners_.count(surface_id) && |
155 !pending_codec_releases_.count(surface_id)) { | 155 !pending_codec_releases_.count(surface_id)) { |
156 surface_owners_[surface_id].owner = client; | 156 surface_owners_[surface_id].owner = client; |
157 return true; | 157 return true; |
158 } | 158 } |
159 | 159 |
160 // Otherwise |client| replaces the previous waiter (if any). | 160 // Otherwise |client| replaces the previous waiter (if any). |
161 OwnerRecord& record = surface_owners_[surface_id]; | 161 OwnerRecord& record = surface_owners_[surface_id]; |
162 if (record.waiter) | 162 if (record.waiter) |
163 record.waiter->OnSurfaceAvailable(false); | 163 record.waiter->OnSurfaceAvailable(false); |
164 record.waiter = client; | 164 record.waiter = client; |
165 return false; | 165 return false; |
166 } | 166 } |
167 | 167 |
168 void AVDACodecAllocator::DeallocateSurface(AVDACodecAllocatorClient* client, | 168 void AVDACodecAllocator::DeallocateSurface(AVDASurfaceAllocatorClient* client, |
169 int surface_id) { | 169 int surface_id) { |
170 DCHECK(thread_checker_.CalledOnValidThread()); | 170 DCHECK(thread_checker_.CalledOnValidThread()); |
171 if (surface_id == SurfaceManager::kNoSurfaceID || | 171 if (surface_id == SurfaceManager::kNoSurfaceID || |
172 !surface_owners_.count(surface_id)) { | 172 !surface_owners_.count(surface_id)) { |
173 return; | 173 return; |
174 } | 174 } |
175 | 175 |
176 OwnerRecord& record = surface_owners_[surface_id]; | 176 OwnerRecord& record = surface_owners_[surface_id]; |
177 if (record.owner == client) | 177 if (record.owner == client) |
178 record.owner = nullptr; | 178 record.owner = nullptr; |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
247 codec_config->media_crypto ? codec_config->media_crypto->obj() : nullptr; | 247 codec_config->media_crypto ? codec_config->media_crypto->obj() : nullptr; |
248 | 248 |
249 // |needs_protected_surface| implies encrypted stream. | 249 // |needs_protected_surface| implies encrypted stream. |
250 DCHECK(!codec_config->needs_protected_surface || media_crypto); | 250 DCHECK(!codec_config->needs_protected_surface || media_crypto); |
251 | 251 |
252 const bool require_software_codec = codec_config->task_type == SW_CODEC; | 252 const bool require_software_codec = codec_config->task_type == SW_CODEC; |
253 std::unique_ptr<MediaCodecBridge> codec( | 253 std::unique_ptr<MediaCodecBridge> codec( |
254 MediaCodecBridgeImpl::CreateVideoDecoder( | 254 MediaCodecBridgeImpl::CreateVideoDecoder( |
255 codec_config->codec, codec_config->needs_protected_surface, | 255 codec_config->codec, codec_config->needs_protected_surface, |
256 codec_config->initial_expected_coded_size, | 256 codec_config->initial_expected_coded_size, |
257 codec_config->surface_bundle->surface.j_surface().obj(), media_crypto, | 257 codec_config->surface_bundle->j_surface().obj(), media_crypto, |
258 codec_config->csd0, codec_config->csd1, true, | 258 codec_config->csd0, codec_config->csd1, true, |
259 require_software_codec)); | 259 require_software_codec)); |
260 | 260 |
261 return codec; | 261 return codec; |
262 } | 262 } |
263 | 263 |
264 void AVDACodecAllocator::CreateMediaCodecAsync( | 264 void AVDACodecAllocator::CreateMediaCodecAsync( |
265 base::WeakPtr<AVDACodecAllocatorClient> client, | 265 base::WeakPtr<AVDACodecAllocatorClient> client, |
266 scoped_refptr<CodecConfig> codec_config) { | 266 scoped_refptr<CodecConfig> codec_config) { |
267 // Allocate the codec on the appropriate thread, and reply to this one with | 267 // Allocate the codec on the appropriate thread, and reply to this one with |
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
399 void AVDACodecAllocator::StopThreadTask(size_t index) { | 399 void AVDACodecAllocator::StopThreadTask(size_t index) { |
400 threads_[index]->thread.Stop(); | 400 threads_[index]->thread.Stop(); |
401 // Signal the stop event after both threads are stopped. | 401 // Signal the stop event after both threads are stopped. |
402 if (stop_event_for_testing_ && !threads_[AUTO_CODEC]->thread.IsRunning() && | 402 if (stop_event_for_testing_ && !threads_[AUTO_CODEC]->thread.IsRunning() && |
403 !threads_[SW_CODEC]->thread.IsRunning()) { | 403 !threads_[SW_CODEC]->thread.IsRunning()) { |
404 stop_event_for_testing_->Signal(); | 404 stop_event_for_testing_->Signal(); |
405 } | 405 } |
406 } | 406 } |
407 | 407 |
408 } // namespace media | 408 } // namespace media |
OLD | NEW |