OLD | NEW |
---|---|
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 "content/gpu/omx_video_decode_accelerator.h" | 5 #include "content/gpu/omx_video_decode_accelerator.h" |
6 | 6 |
7 #include "content/common/gpu/gpu_channel.h" | 7 #include "content/common/gpu/gpu_channel.h" |
8 #include "content/common/gpu_messages.h" | 8 #include "content/common/gpu_messages.h" |
9 #include "content/gpu/gles2_texture_to_egl_image_translator.h" | 9 #include "content/gpu/gles2_texture_to_egl_image_translator.h" |
10 #include "media/base/bitstream_buffer.h" | 10 #include "media/base/bitstream_buffer.h" |
(...skipping 276 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
287 std::vector<PictureBuffer*> picture_buffers) { | 287 std::vector<PictureBuffer*> picture_buffers) { |
288 // NOTE: this is only partially-implemented as it only inspects the first | 288 // NOTE: this is only partially-implemented as it only inspects the first |
289 // picture buffer passed in each AssignPictureBuffer call, and never unsets | 289 // picture buffer passed in each AssignPictureBuffer call, and never unsets |
290 // uses_egl_image_ once set. | 290 // uses_egl_image_ once set. |
291 if (PictureBuffer::PICTUREBUFFER_MEMORYTYPE_GL_TEXTURE == | 291 if (PictureBuffer::PICTUREBUFFER_MEMORYTYPE_GL_TEXTURE == |
292 picture_buffers[0]->GetMemoryType()) { | 292 picture_buffers[0]->GetMemoryType()) { |
293 uses_egl_image_ = true; | 293 uses_egl_image_ = true; |
294 } | 294 } |
295 | 295 |
296 assigned_picture_buffers_.insert( | 296 assigned_picture_buffers_.insert( |
297 assigned_picture_buffers_.begin(), | 297 assigned_picture_buffers_.end(), |
vhiremath
2011/05/19 13:38:00
Newer picture buffers should be inserted in the en
| |
298 picture_buffers.begin(), | 298 picture_buffers.begin(), |
299 picture_buffers.end()); | 299 picture_buffers.end()); |
300 | 300 |
301 if (assigned_picture_buffers_.size() < kNumPictureBuffers) | 301 if (assigned_picture_buffers_.size() < kNumPictureBuffers) |
302 return; // get all the buffers first. | 302 return; // get all the buffers first. |
303 | 303 |
304 // Obtain the information about the output port. | 304 // Obtain the information about the output port. |
305 OMX_PARAM_PORTDEFINITIONTYPE port_format; | 305 OMX_PARAM_PORTDEFINITIONTYPE port_format; |
306 InitParam(*this, &port_format); | 306 InitParam(*this, &port_format); |
307 port_format.nPortIndex = output_port_; | 307 port_format.nPortIndex = output_port_; |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
389 OMX_GetState(component_handle_, &il_state); | 389 OMX_GetState(component_handle_, &il_state); |
390 DCHECK_EQ(il_state, OMX_StateExecuting); | 390 DCHECK_EQ(il_state, OMX_StateExecuting); |
391 if (il_state != OMX_StateExecuting) { | 391 if (il_state != OMX_StateExecuting) { |
392 callback.Run(); | 392 callback.Run(); |
393 return false; | 393 return false; |
394 } | 394 } |
395 on_buffer_flag_event_func_ = &OmxVideoDecodeAccelerator::FlushBegin; | 395 on_buffer_flag_event_func_ = &OmxVideoDecodeAccelerator::FlushBegin; |
396 flush_done_callback_ = callback; | 396 flush_done_callback_ = callback; |
397 | 397 |
398 OMX_BUFFERHEADERTYPE* omx_buffer = free_input_buffers_.front(); | 398 OMX_BUFFERHEADERTYPE* omx_buffer = free_input_buffers_.front(); |
399 free_input_buffers_.pop(); | |
399 omx_buffer->nFilledLen = 0; | 400 omx_buffer->nFilledLen = 0; |
400 omx_buffer->nAllocLen = omx_buffer->nFilledLen; | 401 omx_buffer->nAllocLen = omx_buffer->nFilledLen; |
401 omx_buffer->nFlags |= OMX_BUFFERFLAG_EOS; | 402 omx_buffer->nFlags |= OMX_BUFFERFLAG_EOS; |
402 omx_buffer->nTimeStamp = 0; | 403 omx_buffer->nTimeStamp = 0; |
403 // Give this buffer to OMX. | 404 // Give this buffer to OMX. |
404 OMX_ERRORTYPE result = OMX_ErrorNone; | 405 OMX_ERRORTYPE result = OMX_ErrorNone; |
405 result = OMX_EmptyThisBuffer(component_handle_, omx_buffer); | 406 result = OMX_EmptyThisBuffer(component_handle_, omx_buffer); |
406 if (result != OMX_ErrorNone) { | 407 if (result != OMX_ErrorNone) { |
407 LOG(ERROR) << "OMX_EmptyThisBuffer() failed with result " << result; | 408 LOG(ERROR) << "OMX_EmptyThisBuffer() failed with result " << result; |
408 StopOnError(); | 409 StopOnError(); |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
522 DCHECK_EQ(state, OMX_StateExecuting); | 523 DCHECK_EQ(state, OMX_StateExecuting); |
523 | 524 |
524 VLOG(1) << "Deinit from Executing"; | 525 VLOG(1) << "Deinit from Executing"; |
525 on_state_event_func_ = | 526 on_state_event_func_ = |
526 &OmxVideoDecodeAccelerator::OnStateChangeExecutingToIdle; | 527 &OmxVideoDecodeAccelerator::OnStateChangeExecutingToIdle; |
527 TransitionToState(OMX_StateIdle); | 528 TransitionToState(OMX_StateIdle); |
528 for (int i = 0; i < output_buffer_count_; ++i) { | 529 for (int i = 0; i < output_buffer_count_; ++i) { |
529 OutputPicture output_picture = output_pictures_[i]; | 530 OutputPicture output_picture = output_pictures_[i]; |
530 client_->DismissPictureBuffer(output_picture.first); | 531 client_->DismissPictureBuffer(output_picture.first); |
531 } | 532 } |
532 output_pictures_.clear(); | |
533 } | 533 } |
534 | 534 |
535 void OmxVideoDecodeAccelerator::OnStateChangeExecutingToIdle( | 535 void OmxVideoDecodeAccelerator::OnStateChangeExecutingToIdle( |
536 OMX_STATETYPE state) { | 536 OMX_STATETYPE state) { |
537 DCHECK_EQ(state, OMX_StateIdle); | 537 DCHECK_EQ(state, OMX_StateIdle); |
538 | 538 |
539 VLOG(1) << "Deinit from Idle"; | 539 VLOG(1) << "Deinit from Idle"; |
540 on_state_event_func_ = | 540 on_state_event_func_ = |
541 &OmxVideoDecodeAccelerator::OnStateChangeIdleToLoaded; | 541 &OmxVideoDecodeAccelerator::OnStateChangeIdleToLoaded; |
542 TransitionToState(OMX_StateLoaded); | 542 TransitionToState(OMX_StateLoaded); |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
662 buffer->pAppPrivate = picture; | 662 buffer->pAppPrivate = picture; |
663 } | 663 } |
664 } | 664 } |
665 return true; | 665 return true; |
666 } | 666 } |
667 | 667 |
668 void OmxVideoDecodeAccelerator::FreeInputBuffers() { | 668 void OmxVideoDecodeAccelerator::FreeInputBuffers() { |
669 // Calls to OMX to free buffers. | 669 // Calls to OMX to free buffers. |
670 OMX_ERRORTYPE result; | 670 OMX_ERRORTYPE result; |
671 OMX_BUFFERHEADERTYPE* omx_buffer; | 671 OMX_BUFFERHEADERTYPE* omx_buffer; |
672 for (int i = 0; i < input_buffer_count_; ++i) { | 672 while (!free_input_buffers_.empty()) { |
673 omx_buffer = free_input_buffers_.front(); | 673 omx_buffer = free_input_buffers_.front(); |
674 free_input_buffers_.pop(); | 674 free_input_buffers_.pop(); |
675 result = OMX_FreeBuffer(component_handle_, input_port_, omx_buffer); | 675 result = OMX_FreeBuffer(component_handle_, input_port_, omx_buffer); |
676 if (result != OMX_ErrorNone) { | 676 if (result != OMX_ErrorNone) { |
677 LOG(ERROR) << "SendCommand(OMX_CommandPortDisable) failed"; | 677 LOG(ERROR) << "SendCommand(OMX_CommandPortDisable) failed"; |
678 StopOnError(); | 678 StopOnError(); |
679 return; | 679 return; |
680 } | 680 } |
681 } | 681 } |
682 } | 682 } |
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
848 return (client_state_ != OMX_StateInvalid && | 848 return (client_state_ != OMX_StateInvalid && |
849 client_state_ != OMX_StatePause && | 849 client_state_ != OMX_StatePause && |
850 client_state_ != OMX_StateLoaded); | 850 client_state_ != OMX_StateLoaded); |
851 } | 851 } |
852 | 852 |
853 bool OmxVideoDecodeAccelerator::CanFillBuffer() { | 853 bool OmxVideoDecodeAccelerator::CanFillBuffer() { |
854 // Make sure component is in the executing state and end-of-stream | 854 // Make sure component is in the executing state and end-of-stream |
855 // has not been reached. | 855 // has not been reached. |
856 OMX_ERRORTYPE result; | 856 OMX_ERRORTYPE result; |
857 OMX_STATETYPE il_state; | 857 OMX_STATETYPE il_state; |
858 if (client_state_ == OMX_StateLoaded) | |
859 return false; | |
vhiremath
2011/05/19 13:38:00
This check is useful in case we get ReusePictureBu
| |
858 result = OMX_GetState(component_handle_, &il_state); | 860 result = OMX_GetState(component_handle_, &il_state); |
859 if (result != OMX_ErrorNone) { | 861 if (result != OMX_ErrorNone) { |
860 LOG(ERROR) << "SendCommand(OMX_CommandPortDisable) failed"; | 862 LOG(ERROR) << "SendCommand(OMX_CommandPortDisable) failed"; |
861 StopOnError(); | 863 StopOnError(); |
862 return false; | 864 return false; |
863 } | 865 } |
864 return (il_state == OMX_StateExecuting); | 866 return (il_state == OMX_StateExecuting); |
865 } | 867 } |
866 | 868 |
867 // Send command to disable/enable port. | 869 // Send command to disable/enable port. |
868 void OmxVideoDecodeAccelerator::ChangePort( | 870 void OmxVideoDecodeAccelerator::ChangePort( |
869 OMX_COMMANDTYPE cmd, int port_index) { | 871 OMX_COMMANDTYPE cmd, int port_index) { |
870 OMX_ERRORTYPE result = OMX_SendCommand(component_handle_, | 872 OMX_ERRORTYPE result = OMX_SendCommand(component_handle_, |
871 cmd, port_index, 0); | 873 cmd, port_index, 0); |
872 if (result != OMX_ErrorNone) { | 874 if (result != OMX_ErrorNone) { |
873 LOG(ERROR) << "SendCommand(OMX_CommandPortDisable) failed"; | 875 LOG(ERROR) << "SendCommand(OMX_CommandPortDisable) failed"; |
874 StopOnError(); | 876 StopOnError(); |
875 return; | 877 return; |
876 } | 878 } |
877 } | 879 } |
878 | 880 |
879 DISABLE_RUNNABLE_METHOD_REFCOUNT(OmxVideoDecodeAccelerator); | 881 DISABLE_RUNNABLE_METHOD_REFCOUNT(OmxVideoDecodeAccelerator); |
880 | 882 |
OLD | NEW |