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 <algorithm> | 5 #include <algorithm> |
6 | 6 |
7 #include <CoreVideo/CoreVideo.h> | 7 #include <CoreVideo/CoreVideo.h> |
8 #include <OpenGL/CGLIOSurface.h> | 8 #include <OpenGL/CGLIOSurface.h> |
9 #include <OpenGL/gl.h> | 9 #include <OpenGL/gl.h> |
10 | 10 |
(...skipping 614 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
625 } | 625 } |
626 } | 626 } |
627 | 627 |
628 // This method may be called on any VideoToolbox thread. | 628 // This method may be called on any VideoToolbox thread. |
629 void VTVideoDecodeAccelerator::Output( | 629 void VTVideoDecodeAccelerator::Output( |
630 void* source_frame_refcon, | 630 void* source_frame_refcon, |
631 OSStatus status, | 631 OSStatus status, |
632 CVImageBufferRef image_buffer) { | 632 CVImageBufferRef image_buffer) { |
633 if (status) { | 633 if (status) { |
634 NOTIFY_STATUS("Decoding", status); | 634 NOTIFY_STATUS("Decoding", status); |
635 } else if (CFGetTypeID(image_buffer) != CVPixelBufferGetTypeID()) { | 635 } else if (!image_buffer || |
DaleCurtis
2015/02/04 22:38:52
Needs a comment if this is unexpected.
| |
636 (CFGetTypeID(image_buffer) != CVPixelBufferGetTypeID())) { | |
636 DLOG(ERROR) << "Decoded frame is not a CVPixelBuffer"; | 637 DLOG(ERROR) << "Decoded frame is not a CVPixelBuffer"; |
637 NotifyError(PLATFORM_FAILURE); | 638 NotifyError(PLATFORM_FAILURE); |
638 } else { | 639 } else { |
639 Frame* frame = reinterpret_cast<Frame*>(source_frame_refcon); | 640 Frame* frame = reinterpret_cast<Frame*>(source_frame_refcon); |
640 frame->image.reset(image_buffer, base::scoped_policy::RETAIN); | 641 frame->image.reset(image_buffer, base::scoped_policy::RETAIN); |
641 gpu_task_runner_->PostTask(FROM_HERE, base::Bind( | 642 gpu_task_runner_->PostTask(FROM_HERE, base::Bind( |
642 &VTVideoDecodeAccelerator::DecodeDone, weak_this_, frame)); | 643 &VTVideoDecodeAccelerator::DecodeDone, weak_this_, frame)); |
643 } | 644 } |
644 } | 645 } |
645 | 646 |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
708 } else { | 709 } else { |
709 client_->DismissPictureBuffer(picture_id); | 710 client_->DismissPictureBuffer(picture_id); |
710 } | 711 } |
711 } | 712 } |
712 | 713 |
713 void VTVideoDecodeAccelerator::ProcessWorkQueues() { | 714 void VTVideoDecodeAccelerator::ProcessWorkQueues() { |
714 DCHECK(gpu_thread_checker_.CalledOnValidThread()); | 715 DCHECK(gpu_thread_checker_.CalledOnValidThread()); |
715 switch (state_) { | 716 switch (state_) { |
716 case STATE_DECODING: | 717 case STATE_DECODING: |
717 // TODO(sandersd): Batch where possible. | 718 // TODO(sandersd): Batch where possible. |
718 while (ProcessReorderQueue() || ProcessTaskQueue()); | 719 while (state_ == STATE_DECODING) { |
720 if (!ProcessReorderQueue() && !ProcessTaskQueue()) | |
721 break; | |
722 } | |
719 return; | 723 return; |
720 | 724 |
721 case STATE_ERROR: | 725 case STATE_ERROR: |
722 // Do nothing until Destroy() is called. | 726 // Do nothing until Destroy() is called. |
723 return; | 727 return; |
724 | 728 |
725 case STATE_DESTROYING: | 729 case STATE_DESTROYING: |
726 // Drop tasks until we are ready to destruct. | 730 // Drop tasks until we are ready to destruct. |
727 while (!task_queue_.empty()) { | 731 while (!task_queue_.empty()) { |
728 if (task_queue_.front().type == TASK_DESTROY) { | 732 if (task_queue_.front().type == TASK_DESTROY) { |
(...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
941 assigned_bitstream_ids_.clear(); | 945 assigned_bitstream_ids_.clear(); |
942 state_ = STATE_DESTROYING; | 946 state_ = STATE_DESTROYING; |
943 QueueFlush(TASK_DESTROY); | 947 QueueFlush(TASK_DESTROY); |
944 } | 948 } |
945 | 949 |
946 bool VTVideoDecodeAccelerator::CanDecodeOnIOThread() { | 950 bool VTVideoDecodeAccelerator::CanDecodeOnIOThread() { |
947 return false; | 951 return false; |
948 } | 952 } |
949 | 953 |
950 } // namespace content | 954 } // namespace content |
OLD | NEW |