Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1487)

Unified Diff: content/common/gpu/media/omx_video_decode_accelerator.cc

Issue 7308005: Update OVDA to handle error condition. (Closed) Base URL: http://src.chromium.org/svn/trunk/src/
Patch Set: '' Created 9 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « content/common/gpu/media/omx_video_decode_accelerator.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/common/gpu/media/omx_video_decode_accelerator.cc
===================================================================
--- content/common/gpu/media/omx_video_decode_accelerator.cc (revision 91497)
+++ content/common/gpu/media/omx_video_decode_accelerator.cc (working copy)
@@ -146,11 +146,13 @@
// For now consider only what we care about.
std::vector<uint32> matched_configs;
GetConfigs(config, &matched_configs);
- if (config != matched_configs)
+ if (config != matched_configs) {
+ StopOnError(VIDEODECODERERROR_INVALIDINPUT);
return false;
+ }
client_state_ = OMX_StateLoaded;
if (!CreateComponent()) {
- StopOnError();
+ StopOnError(VIDEODECODERERROR_UNINITIALIZED);
return false;
}
@@ -160,13 +162,13 @@
&OmxVideoDecodeAccelerator::OnStateChangeLoadedToIdle;
if (!TransitionToState(OMX_StateIdle)) {
LOG(ERROR) << "TransitionToState(OMX_StateIdle) error";
- StopOnError();
+ StopOnError(VIDEODECODERERROR_UNINITIALIZED);
return false;
}
if (!AllocateInputBuffers()) {
LOG(ERROR) << "OMX_AllocateBuffer() Input buffer error";
- StopOnError();
+ StopOnError(VIDEODECODERERROR_MEMFAILURE);
return false;
}
@@ -191,7 +193,7 @@
const_cast<OMX_STRING>(role_name), &num_roles, 0);
if (result != OMX_ErrorNone || num_roles == 0) {
LOG(ERROR) << "Unsupported Role: " << role_name << ", " << result;
- StopOnError();
+ StopOnError(VIDEODECODERERROR_UNSUPPORTED);
return false;
}
@@ -216,7 +218,7 @@
if (result != OMX_ErrorNone || num_roles == 0) {
LOG(ERROR) << "Unsupported Role: " << component_name.c_str();
- StopOnError();
+ StopOnError(VIDEODECODERERROR_UNSUPPORTED);
return false;
}
@@ -227,7 +229,7 @@
&omx_accelerator_callbacks);
if (result != OMX_ErrorNone) {
LOG(ERROR) << "Failed to Load the component: " << component;
- StopOnError();
+ StopOnError(VIDEODECODERERROR_INSUFFICIENT_RESOURCES);
return false;
}
@@ -240,7 +242,7 @@
if ((result != OMX_ErrorNone) || (port_param.nPorts != 2)) {
LOG(ERROR) << "Failed to get Port Param: "
<< result << ", " << port_param.nPorts;
- StopOnError();
+ StopOnError(VIDEODECODERERROR_INSUFFICIENT_RESOURCES);
return false;
}
input_port_ = port_param.nStartPortNumber;
@@ -258,7 +260,7 @@
&role_type);
if (result != OMX_ErrorNone) {
LOG(ERROR) << "Failed to Set Role";
- StopOnError();
+ StopOnError(VIDEODECODERERROR_INVALIDINPUT);
return false;
}
@@ -271,12 +273,12 @@
&port_format);
if (result != OMX_ErrorNone) {
LOG(ERROR) << "GetParameter(OMX_IndexParamPortDefinition) failed";
- StopOnError();
+ StopOnError(VIDEODECODERERROR_INVALIDINPUT);
return false;
}
if (OMX_DirInput != port_format.eDir) {
LOG(ERROR) << "Expected input port";
- StopOnError();
+ StopOnError(VIDEODECODERERROR_INVALIDINPUT);
return false;
}
input_buffer_count_ = port_format.nBufferCountActual;
@@ -290,12 +292,12 @@
&port_format);
if (result != OMX_ErrorNone) {
LOG(ERROR) << "GetParameter(OMX_IndexParamPortDefinition) failed";
- StopOnError();
+ StopOnError(VIDEODECODERERROR_INVALIDINPUT);
return false;
}
if (OMX_DirOutput != port_format.eDir) {
LOG(ERROR) << "Expect Output Port";
- StopOnError();
+ StopOnError(VIDEODECODERERROR_INVALIDINPUT);
return false;
}
@@ -312,7 +314,7 @@
&port_format);
if (result != OMX_ErrorNone) {
LOG(ERROR) << "SetParameter(OMX_IndexParamPortDefinition) failed";
- StopOnError();
+ StopOnError(VIDEODECODERERROR_INVALIDINPUT);
return false;
}
@@ -372,7 +374,7 @@
result = OMX_EmptyThisBuffer(component_handle_, omx_buffer);
if (result != OMX_ErrorNone) {
LOG(ERROR) << "OMX_EmptyThisBuffer() failed with result " << result;
- StopOnError();
+ StopOnError(VIDEODECODERERROR_INVALIDINPUT);
return;
}
input_buffers_at_component_++;
@@ -381,7 +383,7 @@
void OmxVideoDecodeAccelerator::AssignGLESBuffers(
const std::vector<media::GLESBuffer>& buffers) {
if (!CanFillBuffer()) {
- StopOnError();
+ StopOnError(VIDEODECODERERROR_UNINITIALIZED);
return;
}
CHECK_EQ(output_buffers_at_component_, 0);
@@ -400,7 +402,7 @@
if (!AllocateOutputBuffers()) {
LOG(ERROR) << "OMX_AllocateBuffer() Output buffer error";
- StopOnError();
+ StopOnError(VIDEODECODERERROR_MEMFAILURE);
return;
}
@@ -434,7 +436,7 @@
OMX_FillThisBuffer(component_handle_, output_picture.omx_buffer_header);
if (result != OMX_ErrorNone) {
LOG(ERROR) << "OMX_FillThisBuffer() failed with result " << result;
- StopOnError();
+ StopOnError(VIDEODECODERERROR_INVALIDINPUT);
return;
}
}
@@ -462,7 +464,7 @@
result = OMX_EmptyThisBuffer(component_handle_, omx_buffer);
if (result != OMX_ErrorNone) {
LOG(ERROR) << "OMX_EmptyThisBuffer() failed with result " << result;
- StopOnError();
+ StopOnError(VIDEODECODERERROR_INVALIDINPUT);
return;
}
input_buffers_at_component_++;
@@ -492,7 +494,7 @@
input_port_, 0);
if (result != OMX_ErrorNone) {
LOG(ERROR) << "OMX_SendCommand(OMX_CommandFlush) failed";
- StopOnError();
+ StopOnError(VIDEODECODERERROR_INVALIDINPUT);
return;
}
}
@@ -509,7 +511,7 @@
OMX_CommandFlush,
output_port_, 0)) {
LOG(ERROR) << "OMX_SendCommand(OMX_CommandFlush) failed";
- StopOnError();
+ StopOnError(VIDEODECODERERROR_INVALIDINPUT);
return;
}
}
@@ -564,7 +566,7 @@
OMX_ERRORTYPE result = OMX_FillThisBuffer(component_handle_, buffer);
if (result != OMX_ErrorNone) {
LOG(ERROR) << "OMX_FillThisBuffer() failed with: " << result;
- StopOnError();
+ StopOnError(VIDEODECODERERROR_INVALIDINPUT);
return;
}
++output_buffers_at_component_;
@@ -582,9 +584,10 @@
component_handle_, OMX_CommandStateSet, new_state, 0);
if (result != OMX_ErrorNone) {
LOG(ERROR) << "SendCommand(OMX_CommandStateSet) failed";
- StopOnError();
+ StopOnError(VIDEODECODERERROR_INVALIDINPUT);
return false;
}
+ client_state_ = new_state;
return true;
}
@@ -631,10 +634,19 @@
client_->NotifyAbortDone();
}
-void OmxVideoDecodeAccelerator::StopOnError() {
+void OmxVideoDecodeAccelerator::StopOnError(
+ media::VideoDecodeAccelerator::Error error) {
+ if (client_)
+ client_->NotifyError(error);
+ if (client_state_ == OMX_StateInvalid)
+ return;
+
+ client_state_ = OMX_StateInvalid;
+ if (!component_handle_)
+ return;
+
OMX_STATETYPE il_state;
OMX_GetState(component_handle_, &il_state);
- client_state_ = OMX_StateInvalid;
switch (il_state) {
case OMX_StateExecuting:
ShutDownOMXFromExecuting();
@@ -646,7 +658,8 @@
OnStateChangeIdleToLoaded(OMX_StateLoaded);
return;
default:
- // LOG unexpected state or just ignore?
+ LOG(ERROR) << "Invalid state: "
+ << il_state << " received in StopOnError()";
return;
}
}
@@ -713,7 +726,7 @@
result = OMX_FreeBuffer(component_handle_, input_port_, omx_buffer);
if (result != OMX_ErrorNone) {
LOG(ERROR) << "OMX_FreeBuffer failed with: " << result;
- StopOnError();
+ StopOnError(VIDEODECODERERROR_INVALIDINPUT);
return;
}
}
@@ -731,7 +744,7 @@
result = OMX_FreeBuffer(component_handle_, output_port_, omx_buffer);
if (result != OMX_ErrorNone) {
LOG(ERROR) << "OMX_FreeBuffer failed with: " << result;
- StopOnError();
+ StopOnError(VIDEODECODERERROR_INVALIDINPUT);
return;
}
client_->DismissPictureBuffer(it->first);
@@ -781,7 +794,7 @@
if (!CanFillBuffer()) {
LOG(ERROR) << "Can't FillBuffer on port-enabled";
- StopOnError();
+ StopOnError(VIDEODECODERERROR_INSUFFICIENT_RESOURCES);
return;
}
@@ -797,7 +810,7 @@
OMX_ERRORTYPE result = OMX_FillThisBuffer(component_handle_, omx_buffer);
if (result != OMX_ErrorNone) {
LOG(ERROR) << "OMX_FillThisBuffer() failed with result " << result;
- StopOnError();
+ StopOnError(VIDEODECODERERROR_INSUFFICIENT_BUFFERS);
return;
}
}
@@ -815,7 +828,7 @@
OMX_FreeBuffer(component_handle_, output_port_, buffer);
if (result != OMX_ErrorNone) {
LOG(ERROR) << "OMX_FreeBuffer failed with: " << result;
- StopOnError();
+ StopOnError(VIDEODECODERERROR_INVALIDINPUT);
return;
}
return;
@@ -908,8 +921,7 @@
break;
}
case OMX_EventError:
- if (static_cast<OMX_ERRORTYPE>(data1) == OMX_ErrorInvalidState)
- StopOnError();
+ StopOnError(VIDEODECODERERROR_HARDWARE);
break;
case OMX_EventPortSettingsChanged:
if (data2 == OMX_IndexParamPortDefinition) {
@@ -1006,7 +1018,7 @@
result = OMX_GetState(component_handle_, &il_state);
if (result != OMX_ErrorNone) {
LOG(ERROR) << "OMX_GetState failed";
- StopOnError();
+ StopOnError(VIDEODECODERERROR_INVALIDINPUT);
return false;
}
return (il_state == OMX_StateExecuting);
@@ -1019,7 +1031,7 @@
cmd, port_index, 0);
if (result != OMX_ErrorNone) {
LOG(ERROR) << "SendCommand() failed" << cmd << ":" << result;
- StopOnError();
+ StopOnError(VIDEODECODERERROR_INVALIDINPUT);
return;
}
}
« no previous file with comments | « content/common/gpu/media/omx_video_decode_accelerator.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698