OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/filters/gpu_video_decoder.h" | 5 #include "media/filters/gpu_video_decoder.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/message_loop.h" | 8 #include "base/message_loop.h" |
9 #include "base/stl_util.h" | 9 #include "base/stl_util.h" |
10 #include "media/base/demuxer_stream.h" | 10 #include "media/base/demuxer_stream.h" |
(...skipping 30 matching lines...) Expand all Loading... |
41 GpuVideoDecoder::BufferTimeData::~BufferTimeData() {} | 41 GpuVideoDecoder::BufferTimeData::~BufferTimeData() {} |
42 | 42 |
43 GpuVideoDecoder::GpuVideoDecoder( | 43 GpuVideoDecoder::GpuVideoDecoder( |
44 MessageLoop* message_loop, | 44 MessageLoop* message_loop, |
45 const scoped_refptr<Factories>& factories) | 45 const scoped_refptr<Factories>& factories) |
46 : gvd_loop_proxy_(message_loop->message_loop_proxy()), | 46 : gvd_loop_proxy_(message_loop->message_loop_proxy()), |
47 render_loop_proxy_(base::MessageLoopProxy::current()), | 47 render_loop_proxy_(base::MessageLoopProxy::current()), |
48 factories_(factories), | 48 factories_(factories), |
49 state_(kNormal), | 49 state_(kNormal), |
50 demuxer_read_in_progress_(false), | 50 demuxer_read_in_progress_(false), |
| 51 decoder_texture_target_(0), |
51 next_picture_buffer_id_(0), | 52 next_picture_buffer_id_(0), |
52 next_bitstream_buffer_id_(0), | 53 next_bitstream_buffer_id_(0), |
53 shutting_down_(false) { | 54 shutting_down_(false) { |
54 DCHECK(gvd_loop_proxy_ && factories_); | 55 DCHECK(gvd_loop_proxy_ && factories_); |
55 } | 56 } |
56 | 57 |
57 GpuVideoDecoder::~GpuVideoDecoder() { | 58 GpuVideoDecoder::~GpuVideoDecoder() { |
58 DCHECK(!vda_); // Stop should have been already called. | 59 DCHECK(!vda_); // Stop should have been already called. |
59 DCHECK(pending_read_cb_.is_null()); | 60 DCHECK(pending_read_cb_.is_null()); |
60 for (size_t i = 0; i < available_shm_segments_.size(); ++i) { | 61 for (size_t i = 0; i < available_shm_segments_.size(); ++i) { |
(...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
319 | 320 |
320 void GpuVideoDecoder::ProvidePictureBuffers(uint32 count, | 321 void GpuVideoDecoder::ProvidePictureBuffers(uint32 count, |
321 const gfx::Size& size) { | 322 const gfx::Size& size) { |
322 if (!gvd_loop_proxy_->BelongsToCurrentThread()) { | 323 if (!gvd_loop_proxy_->BelongsToCurrentThread()) { |
323 gvd_loop_proxy_->PostTask(FROM_HERE, base::Bind( | 324 gvd_loop_proxy_->PostTask(FROM_HERE, base::Bind( |
324 &GpuVideoDecoder::ProvidePictureBuffers, this, count, size)); | 325 &GpuVideoDecoder::ProvidePictureBuffers, this, count, size)); |
325 return; | 326 return; |
326 } | 327 } |
327 | 328 |
328 std::vector<uint32> texture_ids; | 329 std::vector<uint32> texture_ids; |
329 if (!factories_->CreateTextures(count, size, &texture_ids)) { | 330 if (!factories_->CreateTextures( |
| 331 count, size, &texture_ids, &decoder_texture_target_)) { |
330 NotifyError(VideoDecodeAccelerator::PLATFORM_FAILURE); | 332 NotifyError(VideoDecodeAccelerator::PLATFORM_FAILURE); |
331 return; | 333 return; |
332 } | 334 } |
333 | 335 |
334 if (!vda_) | 336 if (!vda_) |
335 return; | 337 return; |
336 | 338 |
337 std::vector<PictureBuffer> picture_buffers; | 339 std::vector<PictureBuffer> picture_buffers; |
338 for (size_t i = 0; i < texture_ids.size(); ++i) { | 340 for (size_t i = 0; i < texture_ids.size(); ++i) { |
339 picture_buffers.push_back(PictureBuffer( | 341 picture_buffers.push_back(PictureBuffer( |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
375 NotifyError(VideoDecodeAccelerator::PLATFORM_FAILURE); | 377 NotifyError(VideoDecodeAccelerator::PLATFORM_FAILURE); |
376 return; | 378 return; |
377 } | 379 } |
378 const PictureBuffer& pb = it->second; | 380 const PictureBuffer& pb = it->second; |
379 | 381 |
380 // Update frame's timestamp. | 382 // Update frame's timestamp. |
381 base::TimeDelta timestamp; | 383 base::TimeDelta timestamp; |
382 base::TimeDelta duration; | 384 base::TimeDelta duration; |
383 GetBufferTimeData(picture.bitstream_buffer_id(), ×tamp, &duration); | 385 GetBufferTimeData(picture.bitstream_buffer_id(), ×tamp, &duration); |
384 | 386 |
| 387 DCHECK(decoder_texture_target_); |
385 scoped_refptr<VideoFrame> frame(VideoFrame::WrapNativeTexture( | 388 scoped_refptr<VideoFrame> frame(VideoFrame::WrapNativeTexture( |
386 pb.texture_id(), pb.size().width(), | 389 pb.texture_id(), decoder_texture_target_, pb.size().width(), |
387 pb.size().height(), timestamp, duration, | 390 pb.size().height(), timestamp, duration, |
388 base::Bind(&GpuVideoDecoder::ReusePictureBuffer, this, | 391 base::Bind(&GpuVideoDecoder::ReusePictureBuffer, this, |
389 picture.picture_buffer_id()))); | 392 picture.picture_buffer_id()))); |
390 | 393 |
391 EnqueueFrameAndTriggerFrameDelivery(frame); | 394 EnqueueFrameAndTriggerFrameDelivery(frame); |
392 } | 395 } |
393 | 396 |
394 void GpuVideoDecoder::EnqueueFrameAndTriggerFrameDelivery( | 397 void GpuVideoDecoder::EnqueueFrameAndTriggerFrameDelivery( |
395 const scoped_refptr<VideoFrame>& frame) { | 398 const scoped_refptr<VideoFrame>& frame) { |
396 DCHECK(gvd_loop_proxy_->BelongsToCurrentThread()); | 399 DCHECK(gvd_loop_proxy_->BelongsToCurrentThread()); |
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
526 &GpuVideoDecoder::NotifyError, this, error)); | 529 &GpuVideoDecoder::NotifyError, this, error)); |
527 return; | 530 return; |
528 } | 531 } |
529 vda_ = NULL; | 532 vda_ = NULL; |
530 DLOG(ERROR) << "VDA Error: " << error; | 533 DLOG(ERROR) << "VDA Error: " << error; |
531 if (host()) | 534 if (host()) |
532 host()->SetError(PIPELINE_ERROR_DECODE); | 535 host()->SetError(PIPELINE_ERROR_DECODE); |
533 } | 536 } |
534 | 537 |
535 } // namespace media | 538 } // namespace media |
OLD | NEW |