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 "content/common/gpu/media/omx_video_decode_accelerator.h" | 5 #include "content/common/gpu/media/omx_video_decode_accelerator.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/debug/trace_event.h" | 8 #include "base/debug/trace_event.h" |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "base/stl_util.h" | 10 #include "base/stl_util.h" |
(...skipping 372 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
383 return; | 383 return; |
384 if (!SendCommandToPort(OMX_CommandPortEnable, output_port_)) | 384 if (!SendCommandToPort(OMX_CommandPortEnable, output_port_)) |
385 return; | 385 return; |
386 } | 386 } |
387 | 387 |
388 void OmxVideoDecodeAccelerator::ReusePictureBuffer(int32 picture_buffer_id) { | 388 void OmxVideoDecodeAccelerator::ReusePictureBuffer(int32 picture_buffer_id) { |
389 TRACE_EVENT1("Video Decoder", "OVDA::ReusePictureBuffer", | 389 TRACE_EVENT1("Video Decoder", "OVDA::ReusePictureBuffer", |
390 "Picture id", picture_buffer_id); | 390 "Picture id", picture_buffer_id); |
391 DCHECK_EQ(message_loop_, MessageLoop::current()); | 391 DCHECK_EQ(message_loop_, MessageLoop::current()); |
392 | 392 |
| 393 // During port-flushing, do not call OMX FillThisBuffer. |
| 394 if (current_state_change_ == RESETTING) { |
| 395 queued_picture_buffer_ids_.push_back(picture_buffer_id); |
| 396 return; |
| 397 } |
| 398 |
393 RETURN_ON_FAILURE(CanFillBuffer(), "Can't fill buffer", ILLEGAL_STATE,); | 399 RETURN_ON_FAILURE(CanFillBuffer(), "Can't fill buffer", ILLEGAL_STATE,); |
394 | 400 |
395 OutputPictureById::iterator it = pictures_.find(picture_buffer_id); | 401 OutputPictureById::iterator it = pictures_.find(picture_buffer_id); |
396 RETURN_ON_FAILURE(it != pictures_.end(), | 402 RETURN_ON_FAILURE(it != pictures_.end(), |
397 "Missing picture buffer id: " << picture_buffer_id, | 403 "Missing picture buffer id: " << picture_buffer_id, |
398 INVALID_ARGUMENT,); | 404 INVALID_ARGUMENT,); |
399 OutputPicture& output_picture = it->second; | 405 OutputPicture& output_picture = it->second; |
400 | 406 |
401 ++output_buffers_at_component_; | 407 ++output_buffers_at_component_; |
402 OMX_ERRORTYPE result = | 408 OMX_ERRORTYPE result = |
(...skipping 385 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
788 client_->ProvidePictureBuffers( | 794 client_->ProvidePictureBuffers( |
789 kNumPictureBuffers, | 795 kNumPictureBuffers, |
790 gfx::Size(vformat.nFrameWidth, vformat.nFrameHeight), | 796 gfx::Size(vformat.nFrameWidth, vformat.nFrameHeight), |
791 GL_TEXTURE_2D); | 797 GL_TEXTURE_2D); |
792 } | 798 } |
793 } | 799 } |
794 | 800 |
795 void OmxVideoDecodeAccelerator::OnOutputPortEnabled() { | 801 void OmxVideoDecodeAccelerator::OnOutputPortEnabled() { |
796 DCHECK_EQ(message_loop_, MessageLoop::current()); | 802 DCHECK_EQ(message_loop_, MessageLoop::current()); |
797 | 803 |
| 804 if (current_state_change_ == RESETTING) { |
| 805 for (OutputPictureById::iterator it = pictures_.begin(); |
| 806 it != pictures_.end(); ++it) { |
| 807 queued_picture_buffer_ids_.push_back(it->first); |
| 808 } |
| 809 return; |
| 810 } |
| 811 |
798 if (!CanFillBuffer()) { | 812 if (!CanFillBuffer()) { |
799 StopOnError(ILLEGAL_STATE); | 813 StopOnError(ILLEGAL_STATE); |
800 return; | 814 return; |
801 } | 815 } |
802 | 816 |
803 // Provide output buffers to decoder. | 817 // Provide output buffers to decoder. |
804 for (OutputPictureById::iterator it = pictures_.begin(); | 818 for (OutputPictureById::iterator it = pictures_.begin(); |
805 it != pictures_.end(); ++it) { | 819 it != pictures_.end(); ++it) { |
806 OMX_BUFFERHEADERTYPE* omx_buffer = it->second.omx_buffer_header; | 820 OMX_BUFFERHEADERTYPE* omx_buffer = it->second.omx_buffer_header; |
807 DCHECK(omx_buffer); | 821 DCHECK(omx_buffer); |
(...skipping 308 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1116 decoder->message_loop_->PostTask(FROM_HERE, base::Bind( | 1130 decoder->message_loop_->PostTask(FROM_HERE, base::Bind( |
1117 &OmxVideoDecodeAccelerator::FillBufferDoneTask, decoder->weak_this(), | 1131 &OmxVideoDecodeAccelerator::FillBufferDoneTask, decoder->weak_this(), |
1118 buffer)); | 1132 buffer)); |
1119 return OMX_ErrorNone; | 1133 return OMX_ErrorNone; |
1120 } | 1134 } |
1121 | 1135 |
1122 bool OmxVideoDecodeAccelerator::CanFillBuffer() { | 1136 bool OmxVideoDecodeAccelerator::CanFillBuffer() { |
1123 DCHECK_EQ(message_loop_, MessageLoop::current()); | 1137 DCHECK_EQ(message_loop_, MessageLoop::current()); |
1124 const CurrentStateChange csc = current_state_change_; | 1138 const CurrentStateChange csc = current_state_change_; |
1125 const OMX_STATETYPE cs = client_state_; | 1139 const OMX_STATETYPE cs = client_state_; |
1126 return (csc != DESTROYING && csc != ERRORING) && | 1140 return (csc != DESTROYING && csc != ERRORING && csc != RESETTING) && |
1127 (cs == OMX_StateIdle || cs == OMX_StateExecuting || cs == OMX_StatePause); | 1141 (cs == OMX_StateIdle || cs == OMX_StateExecuting || cs == OMX_StatePause); |
1128 } | 1142 } |
1129 | 1143 |
1130 bool OmxVideoDecodeAccelerator::SendCommandToPort( | 1144 bool OmxVideoDecodeAccelerator::SendCommandToPort( |
1131 OMX_COMMANDTYPE cmd, int port_index) { | 1145 OMX_COMMANDTYPE cmd, int port_index) { |
1132 DCHECK_EQ(message_loop_, MessageLoop::current()); | 1146 DCHECK_EQ(message_loop_, MessageLoop::current()); |
1133 OMX_ERRORTYPE result = OMX_SendCommand(component_handle_, | 1147 OMX_ERRORTYPE result = OMX_SendCommand(component_handle_, |
1134 cmd, port_index, 0); | 1148 cmd, port_index, 0); |
1135 RETURN_ON_OMX_FAILURE(result, "SendCommand() failed" << cmd, | 1149 RETURN_ON_OMX_FAILURE(result, "SendCommand() failed" << cmd, |
1136 PLATFORM_FAILURE, false); | 1150 PLATFORM_FAILURE, false); |
1137 return true; | 1151 return true; |
1138 } | 1152 } |
OLD | NEW |