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

Side by Side 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « content/common/gpu/media/omx_video_decode_accelerator.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/common/gpu/media/omx_video_decode_accelerator.h" 5 #include "content/common/gpu/media/omx_video_decode_accelerator.h"
6 6
7 #include "base/stl_util-inl.h" 7 #include "base/stl_util-inl.h"
8 #include "base/string_util.h" 8 #include "base/string_util.h"
9 #include "content/common/gpu/gpu_channel.h" 9 #include "content/common/gpu/gpu_channel.h"
10 #include "content/common/gpu/media/gles2_texture_to_egl_image_translator.h" 10 #include "content/common/gpu/media/gles2_texture_to_egl_image_translator.h"
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
139 memset(param, 0, sizeof(T)); 139 memset(param, 0, sizeof(T));
140 param->nVersion.nVersion = 0x00000101; 140 param->nVersion.nVersion = 0x00000101;
141 param->nSize = sizeof(T); 141 param->nSize = sizeof(T);
142 } 142 }
143 143
144 bool OmxVideoDecodeAccelerator::Initialize(const std::vector<uint32>& config) { 144 bool OmxVideoDecodeAccelerator::Initialize(const std::vector<uint32>& config) {
145 // Extract the required info from the configs. 145 // Extract the required info from the configs.
146 // For now consider only what we care about. 146 // For now consider only what we care about.
147 std::vector<uint32> matched_configs; 147 std::vector<uint32> matched_configs;
148 GetConfigs(config, &matched_configs); 148 GetConfigs(config, &matched_configs);
149 if (config != matched_configs) 149 if (config != matched_configs) {
150 StopOnError(VIDEODECODERERROR_INVALIDINPUT);
150 return false; 151 return false;
152 }
151 client_state_ = OMX_StateLoaded; 153 client_state_ = OMX_StateLoaded;
152 if (!CreateComponent()) { 154 if (!CreateComponent()) {
153 StopOnError(); 155 StopOnError(VIDEODECODERERROR_UNINITIALIZED);
154 return false; 156 return false;
155 } 157 }
156 158
157 // Transition component to Idle state 159 // Transition component to Idle state
158 DCHECK(!on_state_event_func_); 160 DCHECK(!on_state_event_func_);
159 on_state_event_func_ = 161 on_state_event_func_ =
160 &OmxVideoDecodeAccelerator::OnStateChangeLoadedToIdle; 162 &OmxVideoDecodeAccelerator::OnStateChangeLoadedToIdle;
161 if (!TransitionToState(OMX_StateIdle)) { 163 if (!TransitionToState(OMX_StateIdle)) {
162 LOG(ERROR) << "TransitionToState(OMX_StateIdle) error"; 164 LOG(ERROR) << "TransitionToState(OMX_StateIdle) error";
163 StopOnError(); 165 StopOnError(VIDEODECODERERROR_UNINITIALIZED);
164 return false; 166 return false;
165 } 167 }
166 168
167 if (!AllocateInputBuffers()) { 169 if (!AllocateInputBuffers()) {
168 LOG(ERROR) << "OMX_AllocateBuffer() Input buffer error"; 170 LOG(ERROR) << "OMX_AllocateBuffer() Input buffer error";
169 StopOnError(); 171 StopOnError(VIDEODECODERERROR_MEMFAILURE);
170 return false; 172 return false;
171 } 173 }
172 174
173 return true; 175 return true;
174 } 176 }
175 177
176 bool OmxVideoDecodeAccelerator::CreateComponent() { 178 bool OmxVideoDecodeAccelerator::CreateComponent() {
177 OMX_CALLBACKTYPE omx_accelerator_callbacks = { 179 OMX_CALLBACKTYPE omx_accelerator_callbacks = {
178 &OmxVideoDecodeAccelerator::EventHandler, 180 &OmxVideoDecodeAccelerator::EventHandler,
179 &OmxVideoDecodeAccelerator::EmptyBufferCallback, 181 &OmxVideoDecodeAccelerator::EmptyBufferCallback,
180 &OmxVideoDecodeAccelerator::FillBufferCallback 182 &OmxVideoDecodeAccelerator::FillBufferCallback
181 }; 183 };
182 OMX_ERRORTYPE result = OMX_ErrorNone; 184 OMX_ERRORTYPE result = OMX_ErrorNone;
183 185
184 // Set the role and get all components of this role. 186 // Set the role and get all components of this role.
185 // TODO(vhiremath@nvidia.com) Get this role_name from the configs 187 // TODO(vhiremath@nvidia.com) Get this role_name from the configs
186 // For now hard coding to avc. 188 // For now hard coding to avc.
187 const char* role_name = "video_decoder.avc"; 189 const char* role_name = "video_decoder.avc";
188 OMX_U32 num_roles = 0; 190 OMX_U32 num_roles = 0;
189 // Get all the components with this role. 191 // Get all the components with this role.
190 result = (*omx_get_components_of_role)( 192 result = (*omx_get_components_of_role)(
191 const_cast<OMX_STRING>(role_name), &num_roles, 0); 193 const_cast<OMX_STRING>(role_name), &num_roles, 0);
192 if (result != OMX_ErrorNone || num_roles == 0) { 194 if (result != OMX_ErrorNone || num_roles == 0) {
193 LOG(ERROR) << "Unsupported Role: " << role_name << ", " << result; 195 LOG(ERROR) << "Unsupported Role: " << role_name << ", " << result;
194 StopOnError(); 196 StopOnError(VIDEODECODERERROR_UNSUPPORTED);
195 return false; 197 return false;
196 } 198 }
197 199
198 // We haven't seen HW that needs more yet, but there is no reason not to 200 // We haven't seen HW that needs more yet, but there is no reason not to
199 // raise. 201 // raise.
200 const OMX_U32 kMaxRolePerComponent = 3; 202 const OMX_U32 kMaxRolePerComponent = 3;
201 CHECK_LT(num_roles, kMaxRolePerComponent); 203 CHECK_LT(num_roles, kMaxRolePerComponent);
202 204
203 scoped_array<scoped_array<OMX_U8> > component_names( 205 scoped_array<scoped_array<OMX_U8> > component_names(
204 new scoped_array<OMX_U8>[num_roles]); 206 new scoped_array<OMX_U8>[num_roles]);
205 for (size_t i = 0; i < num_roles; ++i) 207 for (size_t i = 0; i < num_roles; ++i)
206 component_names[i].reset(new OMX_U8[OMX_MAX_STRINGNAME_SIZE]); 208 component_names[i].reset(new OMX_U8[OMX_MAX_STRINGNAME_SIZE]);
207 result = (*omx_get_components_of_role)( 209 result = (*omx_get_components_of_role)(
208 const_cast<OMX_STRING>(role_name), 210 const_cast<OMX_STRING>(role_name),
209 &num_roles, reinterpret_cast<OMX_U8**>(component_names.get())); 211 &num_roles, reinterpret_cast<OMX_U8**>(component_names.get()));
210 212
211 // Use first component only. Copy the name of the first component so that we 213 // Use first component only. Copy the name of the first component so that we
212 // could free the memory. 214 // could free the memory.
213 std::string component_name; 215 std::string component_name;
214 if (result == OMX_ErrorNone) 216 if (result == OMX_ErrorNone)
215 component_name = reinterpret_cast<char*>(component_names[0].get()); 217 component_name = reinterpret_cast<char*>(component_names[0].get());
216 218
217 if (result != OMX_ErrorNone || num_roles == 0) { 219 if (result != OMX_ErrorNone || num_roles == 0) {
218 LOG(ERROR) << "Unsupported Role: " << component_name.c_str(); 220 LOG(ERROR) << "Unsupported Role: " << component_name.c_str();
219 StopOnError(); 221 StopOnError(VIDEODECODERERROR_UNSUPPORTED);
220 return false; 222 return false;
221 } 223 }
222 224
223 // Get the handle to the component. After OMX_GetHandle(), the component is 225 // Get the handle to the component. After OMX_GetHandle(), the component is
224 // in loaded state. 226 // in loaded state.
225 OMX_STRING component = const_cast<OMX_STRING>(component_name.c_str()); 227 OMX_STRING component = const_cast<OMX_STRING>(component_name.c_str());
226 result = omx_gethandle(&component_handle_, component, this, 228 result = omx_gethandle(&component_handle_, component, this,
227 &omx_accelerator_callbacks); 229 &omx_accelerator_callbacks);
228 if (result != OMX_ErrorNone) { 230 if (result != OMX_ErrorNone) {
229 LOG(ERROR) << "Failed to Load the component: " << component; 231 LOG(ERROR) << "Failed to Load the component: " << component;
230 StopOnError(); 232 StopOnError(VIDEODECODERERROR_INSUFFICIENT_RESOURCES);
231 return false; 233 return false;
232 } 234 }
233 235
234 // Get the port information. This will obtain information about the number of 236 // Get the port information. This will obtain information about the number of
235 // ports and index of the first port. 237 // ports and index of the first port.
236 OMX_PORT_PARAM_TYPE port_param; 238 OMX_PORT_PARAM_TYPE port_param;
237 InitParam(*this, &port_param); 239 InitParam(*this, &port_param);
238 result = OMX_GetParameter(component_handle_, OMX_IndexParamVideoInit, 240 result = OMX_GetParameter(component_handle_, OMX_IndexParamVideoInit,
239 &port_param); 241 &port_param);
240 if ((result != OMX_ErrorNone) || (port_param.nPorts != 2)) { 242 if ((result != OMX_ErrorNone) || (port_param.nPorts != 2)) {
241 LOG(ERROR) << "Failed to get Port Param: " 243 LOG(ERROR) << "Failed to get Port Param: "
242 << result << ", " << port_param.nPorts; 244 << result << ", " << port_param.nPorts;
243 StopOnError(); 245 StopOnError(VIDEODECODERERROR_INSUFFICIENT_RESOURCES);
244 return false; 246 return false;
245 } 247 }
246 input_port_ = port_param.nStartPortNumber; 248 input_port_ = port_param.nStartPortNumber;
247 output_port_ = input_port_ + 1; 249 output_port_ = input_port_ + 1;
248 250
249 // Set role for the component because components can have multiple roles. 251 // Set role for the component because components can have multiple roles.
250 OMX_PARAM_COMPONENTROLETYPE role_type; 252 OMX_PARAM_COMPONENTROLETYPE role_type;
251 InitParam(*this, &role_type); 253 InitParam(*this, &role_type);
252 base::strlcpy(reinterpret_cast<char*>(role_type.cRole), 254 base::strlcpy(reinterpret_cast<char*>(role_type.cRole),
253 role_name, 255 role_name,
254 OMX_MAX_STRINGNAME_SIZE); 256 OMX_MAX_STRINGNAME_SIZE);
255 257
256 result = OMX_SetParameter(component_handle_, 258 result = OMX_SetParameter(component_handle_,
257 OMX_IndexParamStandardComponentRole, 259 OMX_IndexParamStandardComponentRole,
258 &role_type); 260 &role_type);
259 if (result != OMX_ErrorNone) { 261 if (result != OMX_ErrorNone) {
260 LOG(ERROR) << "Failed to Set Role"; 262 LOG(ERROR) << "Failed to Set Role";
261 StopOnError(); 263 StopOnError(VIDEODECODERERROR_INVALIDINPUT);
262 return false; 264 return false;
263 } 265 }
264 266
265 // Populate input-buffer-related members based on input port data. 267 // Populate input-buffer-related members based on input port data.
266 OMX_PARAM_PORTDEFINITIONTYPE port_format; 268 OMX_PARAM_PORTDEFINITIONTYPE port_format;
267 InitParam(*this, &port_format); 269 InitParam(*this, &port_format);
268 port_format.nPortIndex = input_port_; 270 port_format.nPortIndex = input_port_;
269 result = OMX_GetParameter(component_handle_, 271 result = OMX_GetParameter(component_handle_,
270 OMX_IndexParamPortDefinition, 272 OMX_IndexParamPortDefinition,
271 &port_format); 273 &port_format);
272 if (result != OMX_ErrorNone) { 274 if (result != OMX_ErrorNone) {
273 LOG(ERROR) << "GetParameter(OMX_IndexParamPortDefinition) failed"; 275 LOG(ERROR) << "GetParameter(OMX_IndexParamPortDefinition) failed";
274 StopOnError(); 276 StopOnError(VIDEODECODERERROR_INVALIDINPUT);
275 return false; 277 return false;
276 } 278 }
277 if (OMX_DirInput != port_format.eDir) { 279 if (OMX_DirInput != port_format.eDir) {
278 LOG(ERROR) << "Expected input port"; 280 LOG(ERROR) << "Expected input port";
279 StopOnError(); 281 StopOnError(VIDEODECODERERROR_INVALIDINPUT);
280 return false; 282 return false;
281 } 283 }
282 input_buffer_count_ = port_format.nBufferCountActual; 284 input_buffer_count_ = port_format.nBufferCountActual;
283 input_buffer_size_ = port_format.nBufferSize; 285 input_buffer_size_ = port_format.nBufferSize;
284 286
285 // Verify output port conforms to our expectations. 287 // Verify output port conforms to our expectations.
286 InitParam(*this, &port_format); 288 InitParam(*this, &port_format);
287 port_format.nPortIndex = output_port_; 289 port_format.nPortIndex = output_port_;
288 result = OMX_GetParameter(component_handle_, 290 result = OMX_GetParameter(component_handle_,
289 OMX_IndexParamPortDefinition, 291 OMX_IndexParamPortDefinition,
290 &port_format); 292 &port_format);
291 if (result != OMX_ErrorNone) { 293 if (result != OMX_ErrorNone) {
292 LOG(ERROR) << "GetParameter(OMX_IndexParamPortDefinition) failed"; 294 LOG(ERROR) << "GetParameter(OMX_IndexParamPortDefinition) failed";
293 StopOnError(); 295 StopOnError(VIDEODECODERERROR_INVALIDINPUT);
294 return false; 296 return false;
295 } 297 }
296 if (OMX_DirOutput != port_format.eDir) { 298 if (OMX_DirOutput != port_format.eDir) {
297 LOG(ERROR) << "Expect Output Port"; 299 LOG(ERROR) << "Expect Output Port";
298 StopOnError(); 300 StopOnError(VIDEODECODERERROR_INVALIDINPUT);
299 return false; 301 return false;
300 } 302 }
301 303
302 // Set output port parameters. 304 // Set output port parameters.
303 port_format.nBufferCountActual = kNumPictureBuffers; 305 port_format.nBufferCountActual = kNumPictureBuffers;
304 port_format.nBufferCountMin = kNumPictureBuffers; 306 port_format.nBufferCountMin = kNumPictureBuffers;
305 // Force an OMX_EventPortSettingsChanged event to be sent once we know the 307 // Force an OMX_EventPortSettingsChanged event to be sent once we know the
306 // stream's real dimensions (which can only happen once some Decode() work has 308 // stream's real dimensions (which can only happen once some Decode() work has
307 // been done). 309 // been done).
308 port_format.format.video.nFrameWidth = -1; 310 port_format.format.video.nFrameWidth = -1;
309 port_format.format.video.nFrameHeight = -1; 311 port_format.format.video.nFrameHeight = -1;
310 result = OMX_SetParameter(component_handle_, 312 result = OMX_SetParameter(component_handle_,
311 OMX_IndexParamPortDefinition, 313 OMX_IndexParamPortDefinition,
312 &port_format); 314 &port_format);
313 if (result != OMX_ErrorNone) { 315 if (result != OMX_ErrorNone) {
314 LOG(ERROR) << "SetParameter(OMX_IndexParamPortDefinition) failed"; 316 LOG(ERROR) << "SetParameter(OMX_IndexParamPortDefinition) failed";
315 StopOnError(); 317 StopOnError(VIDEODECODERERROR_INVALIDINPUT);
316 return false; 318 return false;
317 } 319 }
318 320
319 // Fill the component with fake output buffers. This seems to be required for 321 // Fill the component with fake output buffers. This seems to be required for
320 // the component to move from Loaded to Idle. How bogus. 322 // the component to move from Loaded to Idle. How bogus.
321 for (int i = 0; i < kNumPictureBuffers; ++i) { 323 for (int i = 0; i < kNumPictureBuffers; ++i) {
322 OMX_BUFFERHEADERTYPE* buffer; 324 OMX_BUFFERHEADERTYPE* buffer;
323 result = OMX_UseBuffer(component_handle_, &buffer, output_port_, 325 result = OMX_UseBuffer(component_handle_, &buffer, output_port_,
324 NULL, 0, reinterpret_cast<OMX_U8*>(0x1)); 326 NULL, 0, reinterpret_cast<OMX_U8*>(0x1));
325 if (result != OMX_ErrorNone) { 327 if (result != OMX_ErrorNone) {
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
365 // Abuse the header's nTimeStamp field to propagate the bitstream buffer ID to 367 // Abuse the header's nTimeStamp field to propagate the bitstream buffer ID to
366 // the output buffer's nTimeStamp field, so we can report it back to the 368 // the output buffer's nTimeStamp field, so we can report it back to the
367 // client in PictureReady(). 369 // client in PictureReady().
368 omx_buffer->nTimeStamp = bitstream_buffer.id(); 370 omx_buffer->nTimeStamp = bitstream_buffer.id();
369 371
370 // Give this buffer to OMX. 372 // Give this buffer to OMX.
371 OMX_ERRORTYPE result = OMX_ErrorNone; 373 OMX_ERRORTYPE result = OMX_ErrorNone;
372 result = OMX_EmptyThisBuffer(component_handle_, omx_buffer); 374 result = OMX_EmptyThisBuffer(component_handle_, omx_buffer);
373 if (result != OMX_ErrorNone) { 375 if (result != OMX_ErrorNone) {
374 LOG(ERROR) << "OMX_EmptyThisBuffer() failed with result " << result; 376 LOG(ERROR) << "OMX_EmptyThisBuffer() failed with result " << result;
375 StopOnError(); 377 StopOnError(VIDEODECODERERROR_INVALIDINPUT);
376 return; 378 return;
377 } 379 }
378 input_buffers_at_component_++; 380 input_buffers_at_component_++;
379 } 381 }
380 382
381 void OmxVideoDecodeAccelerator::AssignGLESBuffers( 383 void OmxVideoDecodeAccelerator::AssignGLESBuffers(
382 const std::vector<media::GLESBuffer>& buffers) { 384 const std::vector<media::GLESBuffer>& buffers) {
383 if (!CanFillBuffer()) { 385 if (!CanFillBuffer()) {
384 StopOnError(); 386 StopOnError(VIDEODECODERERROR_UNINITIALIZED);
385 return; 387 return;
386 } 388 }
387 CHECK_EQ(output_buffers_at_component_, 0); 389 CHECK_EQ(output_buffers_at_component_, 0);
388 CHECK_EQ(fake_output_buffers_.size(), 0U); 390 CHECK_EQ(fake_output_buffers_.size(), 0U);
389 CHECK_EQ(pictures_.size(), 0U); 391 CHECK_EQ(pictures_.size(), 0U);
390 392
391 CHECK_EQ(message_loop_, MessageLoop::current()); 393 CHECK_EQ(message_loop_, MessageLoop::current());
392 for (size_t i = 0; i < buffers.size(); ++i) { 394 for (size_t i = 0; i < buffers.size(); ++i) {
393 CHECK(pictures_.insert(std::make_pair( 395 CHECK(pictures_.insert(std::make_pair(
394 buffers[i].id(), OutputPicture(buffers[i], NULL))).second); 396 buffers[i].id(), OutputPicture(buffers[i], NULL))).second);
395 } 397 }
396 398
397 if (pictures_.size() < kNumPictureBuffers) 399 if (pictures_.size() < kNumPictureBuffers)
398 return; // get all the buffers first. 400 return; // get all the buffers first.
399 DCHECK_EQ(pictures_.size(), kNumPictureBuffers); 401 DCHECK_EQ(pictures_.size(), kNumPictureBuffers);
400 402
401 if (!AllocateOutputBuffers()) { 403 if (!AllocateOutputBuffers()) {
402 LOG(ERROR) << "OMX_AllocateBuffer() Output buffer error"; 404 LOG(ERROR) << "OMX_AllocateBuffer() Output buffer error";
403 StopOnError(); 405 StopOnError(VIDEODECODERERROR_MEMFAILURE);
404 return; 406 return;
405 } 407 }
406 408
407 DCHECK(!on_port_enable_event_func_); 409 DCHECK(!on_port_enable_event_func_);
408 on_port_enable_event_func_ = 410 on_port_enable_event_func_ =
409 &OmxVideoDecodeAccelerator::PortEnabledAfterSettingsChange; 411 &OmxVideoDecodeAccelerator::PortEnabledAfterSettingsChange;
410 ChangePort(OMX_CommandPortEnable, output_port_); 412 ChangePort(OMX_CommandPortEnable, output_port_);
411 } 413 }
412 414
413 void OmxVideoDecodeAccelerator::AssignSysmemBuffers( 415 void OmxVideoDecodeAccelerator::AssignSysmemBuffers(
(...skipping 13 matching lines...) Expand all
427 LOG(DFATAL) << "Missing picture buffer id: " << picture_buffer_id; 429 LOG(DFATAL) << "Missing picture buffer id: " << picture_buffer_id;
428 return; 430 return;
429 } 431 }
430 OutputPicture& output_picture = it->second; 432 OutputPicture& output_picture = it->second;
431 433
432 ++output_buffers_at_component_; 434 ++output_buffers_at_component_;
433 OMX_ERRORTYPE result = 435 OMX_ERRORTYPE result =
434 OMX_FillThisBuffer(component_handle_, output_picture.omx_buffer_header); 436 OMX_FillThisBuffer(component_handle_, output_picture.omx_buffer_header);
435 if (result != OMX_ErrorNone) { 437 if (result != OMX_ErrorNone) {
436 LOG(ERROR) << "OMX_FillThisBuffer() failed with result " << result; 438 LOG(ERROR) << "OMX_FillThisBuffer() failed with result " << result;
437 StopOnError(); 439 StopOnError(VIDEODECODERERROR_INVALIDINPUT);
438 return; 440 return;
439 } 441 }
440 } 442 }
441 443
442 void OmxVideoDecodeAccelerator::Flush() { 444 void OmxVideoDecodeAccelerator::Flush() {
443 OMX_STATETYPE il_state; 445 OMX_STATETYPE il_state;
444 OMX_GetState(component_handle_, &il_state); 446 OMX_GetState(component_handle_, &il_state);
445 DCHECK_EQ(il_state, OMX_StateExecuting); 447 DCHECK_EQ(il_state, OMX_StateExecuting);
446 // Decode the pending data first. Then flush I/O ports. 448 // Decode the pending data first. Then flush I/O ports.
447 if (il_state != OMX_StateExecuting) { 449 if (il_state != OMX_StateExecuting) {
448 client_->NotifyFlushDone(); 450 client_->NotifyFlushDone();
449 return; 451 return;
450 } 452 }
451 on_buffer_flag_event_func_ = &OmxVideoDecodeAccelerator::FlushBegin; 453 on_buffer_flag_event_func_ = &OmxVideoDecodeAccelerator::FlushBegin;
452 454
453 OMX_BUFFERHEADERTYPE* omx_buffer = free_input_buffers_.front(); 455 OMX_BUFFERHEADERTYPE* omx_buffer = free_input_buffers_.front();
454 free_input_buffers_.pop(); 456 free_input_buffers_.pop();
455 457
456 omx_buffer->nFilledLen = 0; 458 omx_buffer->nFilledLen = 0;
457 omx_buffer->nAllocLen = omx_buffer->nFilledLen; 459 omx_buffer->nAllocLen = omx_buffer->nFilledLen;
458 omx_buffer->nFlags |= OMX_BUFFERFLAG_EOS; 460 omx_buffer->nFlags |= OMX_BUFFERFLAG_EOS;
459 omx_buffer->nTimeStamp = 0; 461 omx_buffer->nTimeStamp = 0;
460 // Give this buffer to OMX. 462 // Give this buffer to OMX.
461 OMX_ERRORTYPE result = OMX_ErrorNone; 463 OMX_ERRORTYPE result = OMX_ErrorNone;
462 result = OMX_EmptyThisBuffer(component_handle_, omx_buffer); 464 result = OMX_EmptyThisBuffer(component_handle_, omx_buffer);
463 if (result != OMX_ErrorNone) { 465 if (result != OMX_ErrorNone) {
464 LOG(ERROR) << "OMX_EmptyThisBuffer() failed with result " << result; 466 LOG(ERROR) << "OMX_EmptyThisBuffer() failed with result " << result;
465 StopOnError(); 467 StopOnError(VIDEODECODERERROR_INVALIDINPUT);
466 return; 468 return;
467 } 469 }
468 input_buffers_at_component_++; 470 input_buffers_at_component_++;
469 } 471 }
470 472
471 void OmxVideoDecodeAccelerator::FlushBegin() { 473 void OmxVideoDecodeAccelerator::FlushBegin() {
472 VLOG(1) << "Starting actual flush for EOS"; 474 VLOG(1) << "Starting actual flush for EOS";
473 DCHECK(!on_state_event_func_); 475 DCHECK(!on_state_event_func_);
474 on_state_event_func_ = &OmxVideoDecodeAccelerator::PauseFromExecuting; 476 on_state_event_func_ = &OmxVideoDecodeAccelerator::PauseFromExecuting;
475 TransitionToState(OMX_StatePause); 477 TransitionToState(OMX_StatePause);
476 } 478 }
477 479
478 void OmxVideoDecodeAccelerator::PauseFromExecuting(OMX_STATETYPE ignored) { 480 void OmxVideoDecodeAccelerator::PauseFromExecuting(OMX_STATETYPE ignored) {
479 on_state_event_func_ = NULL; 481 on_state_event_func_ = NULL;
480 FlushIOPorts(); 482 FlushIOPorts();
481 } 483 }
482 484
483 void OmxVideoDecodeAccelerator::FlushIOPorts() { 485 void OmxVideoDecodeAccelerator::FlushIOPorts() {
484 // TODO(vhiremath@nvidia.com) review again for trick modes. 486 // TODO(vhiremath@nvidia.com) review again for trick modes.
485 VLOG(1) << "FlushIOPorts"; 487 VLOG(1) << "FlushIOPorts";
486 488
487 // Flush input port first. 489 // Flush input port first.
488 DCHECK(!on_flush_event_func_); 490 DCHECK(!on_flush_event_func_);
489 on_flush_event_func_ = &OmxVideoDecodeAccelerator::InputPortFlushDone; 491 on_flush_event_func_ = &OmxVideoDecodeAccelerator::InputPortFlushDone;
490 OMX_ERRORTYPE result = OMX_SendCommand(component_handle_, 492 OMX_ERRORTYPE result = OMX_SendCommand(component_handle_,
491 OMX_CommandFlush, 493 OMX_CommandFlush,
492 input_port_, 0); 494 input_port_, 0);
493 if (result != OMX_ErrorNone) { 495 if (result != OMX_ErrorNone) {
494 LOG(ERROR) << "OMX_SendCommand(OMX_CommandFlush) failed"; 496 LOG(ERROR) << "OMX_SendCommand(OMX_CommandFlush) failed";
495 StopOnError(); 497 StopOnError(VIDEODECODERERROR_INVALIDINPUT);
496 return; 498 return;
497 } 499 }
498 } 500 }
499 501
500 void OmxVideoDecodeAccelerator::InputPortFlushDone(int port) { 502 void OmxVideoDecodeAccelerator::InputPortFlushDone(int port) {
501 DCHECK_EQ(port, input_port_); 503 DCHECK_EQ(port, input_port_);
502 VLOG(1) << "Input Port has been flushed"; 504 VLOG(1) << "Input Port has been flushed";
503 DCHECK_EQ(input_buffers_at_component_, 0); 505 DCHECK_EQ(input_buffers_at_component_, 0);
504 // Flush output port next. 506 // Flush output port next.
505 DCHECK(!on_flush_event_func_); 507 DCHECK(!on_flush_event_func_);
506 on_flush_event_func_ = &OmxVideoDecodeAccelerator::OutputPortFlushDone; 508 on_flush_event_func_ = &OmxVideoDecodeAccelerator::OutputPortFlushDone;
507 if (OMX_ErrorNone != 509 if (OMX_ErrorNone !=
508 OMX_SendCommand(component_handle_, 510 OMX_SendCommand(component_handle_,
509 OMX_CommandFlush, 511 OMX_CommandFlush,
510 output_port_, 0)) { 512 output_port_, 0)) {
511 LOG(ERROR) << "OMX_SendCommand(OMX_CommandFlush) failed"; 513 LOG(ERROR) << "OMX_SendCommand(OMX_CommandFlush) failed";
512 StopOnError(); 514 StopOnError(VIDEODECODERERROR_INVALIDINPUT);
513 return; 515 return;
514 } 516 }
515 } 517 }
516 518
517 void OmxVideoDecodeAccelerator::OutputPortFlushDone(int port) { 519 void OmxVideoDecodeAccelerator::OutputPortFlushDone(int port) {
518 DCHECK_EQ(port, output_port_); 520 DCHECK_EQ(port, output_port_);
519 521
520 VLOG(1) << "Output Port has been flushed"; 522 VLOG(1) << "Output Port has been flushed";
521 DCHECK_EQ(output_buffers_at_component_, 0); 523 DCHECK_EQ(output_buffers_at_component_, 0);
522 client_state_ = OMX_StatePause; 524 client_state_ = OMX_StatePause;
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
557 // Request filling of our fake buffers to trigger decode processing. In 559 // Request filling of our fake buffers to trigger decode processing. In
558 // reality as soon as any data is decoded these will get dismissed due to 560 // reality as soon as any data is decoded these will get dismissed due to
559 // dimension mismatch. 561 // dimension mismatch.
560 for (std::set<OMX_BUFFERHEADERTYPE*>::iterator it = 562 for (std::set<OMX_BUFFERHEADERTYPE*>::iterator it =
561 fake_output_buffers_.begin(); 563 fake_output_buffers_.begin();
562 it != fake_output_buffers_.end(); ++it) { 564 it != fake_output_buffers_.end(); ++it) {
563 OMX_BUFFERHEADERTYPE* buffer = *it; 565 OMX_BUFFERHEADERTYPE* buffer = *it;
564 OMX_ERRORTYPE result = OMX_FillThisBuffer(component_handle_, buffer); 566 OMX_ERRORTYPE result = OMX_FillThisBuffer(component_handle_, buffer);
565 if (result != OMX_ErrorNone) { 567 if (result != OMX_ErrorNone) {
566 LOG(ERROR) << "OMX_FillThisBuffer() failed with: " << result; 568 LOG(ERROR) << "OMX_FillThisBuffer() failed with: " << result;
567 StopOnError(); 569 StopOnError(VIDEODECODERERROR_INVALIDINPUT);
568 return; 570 return;
569 } 571 }
570 ++output_buffers_at_component_; 572 ++output_buffers_at_component_;
571 } 573 }
572 574
573 message_loop_->PostTask( 575 message_loop_->PostTask(
574 FROM_HERE, 576 FROM_HERE,
575 base::Bind(&Client::NotifyInitializeDone, base::Unretained(client_))); 577 base::Bind(&Client::NotifyInitializeDone, base::Unretained(client_)));
576 } 578 }
577 579
578 // Send state transition command to component. 580 // Send state transition command to component.
579 bool OmxVideoDecodeAccelerator::TransitionToState(OMX_STATETYPE new_state) { 581 bool OmxVideoDecodeAccelerator::TransitionToState(OMX_STATETYPE new_state) {
580 DCHECK(on_state_event_func_); 582 DCHECK(on_state_event_func_);
581 OMX_ERRORTYPE result = OMX_SendCommand( 583 OMX_ERRORTYPE result = OMX_SendCommand(
582 component_handle_, OMX_CommandStateSet, new_state, 0); 584 component_handle_, OMX_CommandStateSet, new_state, 0);
583 if (result != OMX_ErrorNone) { 585 if (result != OMX_ErrorNone) {
584 LOG(ERROR) << "SendCommand(OMX_CommandStateSet) failed"; 586 LOG(ERROR) << "SendCommand(OMX_CommandStateSet) failed";
585 StopOnError(); 587 StopOnError(VIDEODECODERERROR_INVALIDINPUT);
586 return false; 588 return false;
587 } 589 }
590 client_state_ = new_state;
588 return true; 591 return true;
589 } 592 }
590 593
591 void OmxVideoDecodeAccelerator::ShutDownOMXFromExecuting() { 594 void OmxVideoDecodeAccelerator::ShutDownOMXFromExecuting() {
592 VLOG(1) << "Deinit from Executing"; 595 VLOG(1) << "Deinit from Executing";
593 DCHECK(!on_state_event_func_); 596 DCHECK(!on_state_event_func_);
594 on_state_event_func_ = 597 on_state_event_func_ =
595 &OmxVideoDecodeAccelerator::OnStateChangeExecutingToIdle; 598 &OmxVideoDecodeAccelerator::OnStateChangeExecutingToIdle;
596 TransitionToState(OMX_StateIdle); 599 TransitionToState(OMX_StateIdle);
597 } 600 }
(...skipping 26 matching lines...) Expand all
624 if (result != OMX_ErrorNone) 627 if (result != OMX_ErrorNone)
625 LOG(ERROR) << "OMX_FreeHandle() error. Error code: " << result; 628 LOG(ERROR) << "OMX_FreeHandle() error. Error code: " << result;
626 component_handle_ = NULL; 629 component_handle_ = NULL;
627 } 630 }
628 client_state_ = OMX_StateLoaded; 631 client_state_ = OMX_StateLoaded;
629 (*omx_deinit)(); 632 (*omx_deinit)();
630 VLOG(1) << "OMX Deinit Clean exit done"; 633 VLOG(1) << "OMX Deinit Clean exit done";
631 client_->NotifyAbortDone(); 634 client_->NotifyAbortDone();
632 } 635 }
633 636
634 void OmxVideoDecodeAccelerator::StopOnError() { 637 void OmxVideoDecodeAccelerator::StopOnError(
638 media::VideoDecodeAccelerator::Error error) {
639 if (client_)
640 client_->NotifyError(error);
641 if (client_state_ == OMX_StateInvalid)
642 return;
643
644 client_state_ = OMX_StateInvalid;
645 if (!component_handle_)
646 return;
647
635 OMX_STATETYPE il_state; 648 OMX_STATETYPE il_state;
636 OMX_GetState(component_handle_, &il_state); 649 OMX_GetState(component_handle_, &il_state);
637 client_state_ = OMX_StateInvalid;
638 switch (il_state) { 650 switch (il_state) {
639 case OMX_StateExecuting: 651 case OMX_StateExecuting:
640 ShutDownOMXFromExecuting(); 652 ShutDownOMXFromExecuting();
641 return; 653 return;
642 case OMX_StateIdle: 654 case OMX_StateIdle:
643 OnStateChangeExecutingToIdle(OMX_StateIdle); 655 OnStateChangeExecutingToIdle(OMX_StateIdle);
644 return; 656 return;
645 case OMX_StateLoaded: 657 case OMX_StateLoaded:
646 OnStateChangeIdleToLoaded(OMX_StateLoaded); 658 OnStateChangeIdleToLoaded(OMX_StateLoaded);
647 return; 659 return;
648 default: 660 default:
649 // LOG unexpected state or just ignore? 661 LOG(ERROR) << "Invalid state: "
662 << il_state << " received in StopOnError()";
650 return; 663 return;
651 } 664 }
652 } 665 }
653 666
654 bool OmxVideoDecodeAccelerator::AllocateInputBuffers() { 667 bool OmxVideoDecodeAccelerator::AllocateInputBuffers() {
655 for (int i = 0; i < input_buffer_count_; ++i) { 668 for (int i = 0; i < input_buffer_count_; ++i) {
656 OMX_BUFFERHEADERTYPE* buffer; 669 OMX_BUFFERHEADERTYPE* buffer;
657 // While registering the buffer header we use fake buffer information 670 // While registering the buffer header we use fake buffer information
658 // (length 0, at memory address 0x1) to fake out the "safety" check in 671 // (length 0, at memory address 0x1) to fake out the "safety" check in
659 // OMX_UseBuffer. When it comes time to actually use this header in Decode 672 // OMX_UseBuffer. When it comes time to actually use this header in Decode
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
706 void OmxVideoDecodeAccelerator::FreeInputBuffers() { 719 void OmxVideoDecodeAccelerator::FreeInputBuffers() {
707 // Calls to OMX to free buffers. 720 // Calls to OMX to free buffers.
708 OMX_ERRORTYPE result; 721 OMX_ERRORTYPE result;
709 OMX_BUFFERHEADERTYPE* omx_buffer; 722 OMX_BUFFERHEADERTYPE* omx_buffer;
710 while (!free_input_buffers_.empty()) { 723 while (!free_input_buffers_.empty()) {
711 omx_buffer = free_input_buffers_.front(); 724 omx_buffer = free_input_buffers_.front();
712 free_input_buffers_.pop(); 725 free_input_buffers_.pop();
713 result = OMX_FreeBuffer(component_handle_, input_port_, omx_buffer); 726 result = OMX_FreeBuffer(component_handle_, input_port_, omx_buffer);
714 if (result != OMX_ErrorNone) { 727 if (result != OMX_ErrorNone) {
715 LOG(ERROR) << "OMX_FreeBuffer failed with: " << result; 728 LOG(ERROR) << "OMX_FreeBuffer failed with: " << result;
716 StopOnError(); 729 StopOnError(VIDEODECODERERROR_INVALIDINPUT);
717 return; 730 return;
718 } 731 }
719 } 732 }
720 VLOG(1) << "Input buffers freed."; 733 VLOG(1) << "Input buffers freed.";
721 } 734 }
722 735
723 void OmxVideoDecodeAccelerator::FreeOutputBuffers() { 736 void OmxVideoDecodeAccelerator::FreeOutputBuffers() {
724 // Calls to OMX to free buffers. 737 // Calls to OMX to free buffers.
725 OMX_ERRORTYPE result; 738 OMX_ERRORTYPE result;
726 for (OutputPictureById::iterator it = pictures_.begin(); 739 for (OutputPictureById::iterator it = pictures_.begin();
727 it != pictures_.end(); ++it) { 740 it != pictures_.end(); ++it) {
728 OMX_BUFFERHEADERTYPE* omx_buffer = it->second.omx_buffer_header; 741 OMX_BUFFERHEADERTYPE* omx_buffer = it->second.omx_buffer_header;
729 CHECK(omx_buffer); 742 CHECK(omx_buffer);
730 delete reinterpret_cast<media::Picture*>(omx_buffer->pAppPrivate); 743 delete reinterpret_cast<media::Picture*>(omx_buffer->pAppPrivate);
731 result = OMX_FreeBuffer(component_handle_, output_port_, omx_buffer); 744 result = OMX_FreeBuffer(component_handle_, output_port_, omx_buffer);
732 if (result != OMX_ErrorNone) { 745 if (result != OMX_ErrorNone) {
733 LOG(ERROR) << "OMX_FreeBuffer failed with: " << result; 746 LOG(ERROR) << "OMX_FreeBuffer failed with: " << result;
734 StopOnError(); 747 StopOnError(VIDEODECODERERROR_INVALIDINPUT);
735 return; 748 return;
736 } 749 }
737 client_->DismissPictureBuffer(it->first); 750 client_->DismissPictureBuffer(it->first);
738 } 751 }
739 pictures_.clear(); 752 pictures_.clear();
740 } 753 }
741 754
742 void OmxVideoDecodeAccelerator::OnIndexParamPortDefinitionChanged(int port) { 755 void OmxVideoDecodeAccelerator::OnIndexParamPortDefinitionChanged(int port) {
743 DCHECK_EQ(port, output_port_); 756 DCHECK_EQ(port, output_port_);
744 DCHECK(!on_port_disable_event_func_); 757 DCHECK(!on_port_disable_event_func_);
(...skipping 29 matching lines...) Expand all
774 static_cast<int32>(kNumPictureBuffers), 787 static_cast<int32>(kNumPictureBuffers),
775 gfx::Size(vformat.nFrameWidth, vformat.nFrameHeight), 788 gfx::Size(vformat.nFrameWidth, vformat.nFrameHeight),
776 PICTUREBUFFER_MEMORYTYPE_GL_TEXTURE)); 789 PICTUREBUFFER_MEMORYTYPE_GL_TEXTURE));
777 } 790 }
778 791
779 void OmxVideoDecodeAccelerator::PortEnabledAfterSettingsChange(int port) { 792 void OmxVideoDecodeAccelerator::PortEnabledAfterSettingsChange(int port) {
780 DCHECK_EQ(port, output_port_); 793 DCHECK_EQ(port, output_port_);
781 794
782 if (!CanFillBuffer()) { 795 if (!CanFillBuffer()) {
783 LOG(ERROR) << "Can't FillBuffer on port-enabled"; 796 LOG(ERROR) << "Can't FillBuffer on port-enabled";
784 StopOnError(); 797 StopOnError(VIDEODECODERERROR_INSUFFICIENT_RESOURCES);
785 return; 798 return;
786 } 799 }
787 800
788 // Ask the decoder to fill the output buffers. 801 // Ask the decoder to fill the output buffers.
789 for (OutputPictureById::iterator it = pictures_.begin(); 802 for (OutputPictureById::iterator it = pictures_.begin();
790 it != pictures_.end(); ++it) { 803 it != pictures_.end(); ++it) {
791 OMX_BUFFERHEADERTYPE* omx_buffer = it->second.omx_buffer_header; 804 OMX_BUFFERHEADERTYPE* omx_buffer = it->second.omx_buffer_header;
792 DCHECK(omx_buffer); 805 DCHECK(omx_buffer);
793 // Clear EOS flag. 806 // Clear EOS flag.
794 omx_buffer->nFlags &= ~OMX_BUFFERFLAG_EOS; 807 omx_buffer->nFlags &= ~OMX_BUFFERFLAG_EOS;
795 omx_buffer->nOutputPortIndex = output_port_; 808 omx_buffer->nOutputPortIndex = output_port_;
796 ++output_buffers_at_component_; 809 ++output_buffers_at_component_;
797 OMX_ERRORTYPE result = OMX_FillThisBuffer(component_handle_, omx_buffer); 810 OMX_ERRORTYPE result = OMX_FillThisBuffer(component_handle_, omx_buffer);
798 if (result != OMX_ErrorNone) { 811 if (result != OMX_ErrorNone) {
799 LOG(ERROR) << "OMX_FillThisBuffer() failed with result " << result; 812 LOG(ERROR) << "OMX_FillThisBuffer() failed with result " << result;
800 StopOnError(); 813 StopOnError(VIDEODECODERERROR_INSUFFICIENT_BUFFERS);
801 return; 814 return;
802 } 815 }
803 } 816 }
804 } 817 }
805 818
806 void OmxVideoDecodeAccelerator::FillBufferDoneTask( 819 void OmxVideoDecodeAccelerator::FillBufferDoneTask(
807 OMX_BUFFERHEADERTYPE* buffer) { 820 OMX_BUFFERHEADERTYPE* buffer) {
808 CHECK_EQ(message_loop_, MessageLoop::current()); 821 CHECK_EQ(message_loop_, MessageLoop::current());
809 DCHECK_GT(output_buffers_at_component_, 0); 822 DCHECK_GT(output_buffers_at_component_, 0);
810 --output_buffers_at_component_; 823 --output_buffers_at_component_;
811 824
812 if (fake_output_buffers_.size() && fake_output_buffers_.count(buffer)) { 825 if (fake_output_buffers_.size() && fake_output_buffers_.count(buffer)) {
813 CHECK_EQ(fake_output_buffers_.erase(buffer), 1U); 826 CHECK_EQ(fake_output_buffers_.erase(buffer), 1U);
814 OMX_ERRORTYPE result = 827 OMX_ERRORTYPE result =
815 OMX_FreeBuffer(component_handle_, output_port_, buffer); 828 OMX_FreeBuffer(component_handle_, output_port_, buffer);
816 if (result != OMX_ErrorNone) { 829 if (result != OMX_ErrorNone) {
817 LOG(ERROR) << "OMX_FreeBuffer failed with: " << result; 830 LOG(ERROR) << "OMX_FreeBuffer failed with: " << result;
818 StopOnError(); 831 StopOnError(VIDEODECODERERROR_INVALIDINPUT);
819 return; 832 return;
820 } 833 }
821 return; 834 return;
822 } 835 }
823 CHECK(!fake_output_buffers_.size()); 836 CHECK(!fake_output_buffers_.size());
824 837
825 // During the transition from Paused to Idle (e.g. during Flush()) all 838 // During the transition from Paused to Idle (e.g. during Flush()) all
826 // pictures are sent back through here. Avoid giving them to the client. 839 // pictures are sent back through here. Avoid giving them to the client.
827 // TODO(fischman): this is a hokey way to detect this condition. The state 840 // TODO(fischman): this is a hokey way to detect this condition. The state
828 // transitions in this class need to be rethought, and this implemented more 841 // transitions in this class need to be rethought, and this implemented more
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
901 (this->*func)(data2); 914 (this->*func)(data2);
902 } 915 }
903 break; 916 break;
904 default: 917 default:
905 LOG(ERROR) << "Unknown command completed\n" << data1; 918 LOG(ERROR) << "Unknown command completed\n" << data1;
906 break; 919 break;
907 } 920 }
908 break; 921 break;
909 } 922 }
910 case OMX_EventError: 923 case OMX_EventError:
911 if (static_cast<OMX_ERRORTYPE>(data1) == OMX_ErrorInvalidState) 924 StopOnError(VIDEODECODERERROR_HARDWARE);
912 StopOnError();
913 break; 925 break;
914 case OMX_EventPortSettingsChanged: 926 case OMX_EventPortSettingsChanged:
915 if (data2 == OMX_IndexParamPortDefinition) { 927 if (data2 == OMX_IndexParamPortDefinition) {
916 OnIndexParamPortDefinitionChanged(static_cast<int>(data1)); 928 OnIndexParamPortDefinitionChanged(static_cast<int>(data1));
917 } else if (data1 == static_cast<OMX_U32>(output_port_) && 929 } else if (data1 == static_cast<OMX_U32>(output_port_) &&
918 data2 == OMX_IndexConfigCommonOutputCrop) { 930 data2 == OMX_IndexConfigCommonOutputCrop) {
919 // TODO(vjain): Handle video crop rect. 931 // TODO(vjain): Handle video crop rect.
920 } else { 932 } else {
921 LOG(ERROR) << "Unexpected EventPortSettingsChanged [data1:" 933 LOG(ERROR) << "Unexpected EventPortSettingsChanged [data1:"
922 << data1 << " data2:" << data2 << "]"; 934 << data1 << " data2:" << data2 << "]";
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
999 bool OmxVideoDecodeAccelerator::CanFillBuffer() { 1011 bool OmxVideoDecodeAccelerator::CanFillBuffer() {
1000 // Make sure component is in the executing state and end-of-stream 1012 // Make sure component is in the executing state and end-of-stream
1001 // has not been reached. 1013 // has not been reached.
1002 OMX_ERRORTYPE result; 1014 OMX_ERRORTYPE result;
1003 OMX_STATETYPE il_state; 1015 OMX_STATETYPE il_state;
1004 if (client_state_ == OMX_StateLoaded) 1016 if (client_state_ == OMX_StateLoaded)
1005 return false; 1017 return false;
1006 result = OMX_GetState(component_handle_, &il_state); 1018 result = OMX_GetState(component_handle_, &il_state);
1007 if (result != OMX_ErrorNone) { 1019 if (result != OMX_ErrorNone) {
1008 LOG(ERROR) << "OMX_GetState failed"; 1020 LOG(ERROR) << "OMX_GetState failed";
1009 StopOnError(); 1021 StopOnError(VIDEODECODERERROR_INVALIDINPUT);
1010 return false; 1022 return false;
1011 } 1023 }
1012 return (il_state == OMX_StateExecuting); 1024 return (il_state == OMX_StateExecuting);
1013 } 1025 }
1014 1026
1015 // Send command to disable/enable port. 1027 // Send command to disable/enable port.
1016 void OmxVideoDecodeAccelerator::ChangePort( 1028 void OmxVideoDecodeAccelerator::ChangePort(
1017 OMX_COMMANDTYPE cmd, int port_index) { 1029 OMX_COMMANDTYPE cmd, int port_index) {
1018 OMX_ERRORTYPE result = OMX_SendCommand(component_handle_, 1030 OMX_ERRORTYPE result = OMX_SendCommand(component_handle_,
1019 cmd, port_index, 0); 1031 cmd, port_index, 0);
1020 if (result != OMX_ErrorNone) { 1032 if (result != OMX_ErrorNone) {
1021 LOG(ERROR) << "SendCommand() failed" << cmd << ":" << result; 1033 LOG(ERROR) << "SendCommand() failed" << cmd << ":" << result;
1022 StopOnError(); 1034 StopOnError(VIDEODECODERERROR_INVALIDINPUT);
1023 return; 1035 return;
1024 } 1036 }
1025 } 1037 }
1026 1038
1027 DISABLE_RUNNABLE_METHOD_REFCOUNT(OmxVideoDecodeAccelerator); 1039 DISABLE_RUNNABLE_METHOD_REFCOUNT(OmxVideoDecodeAccelerator);
OLDNEW
« 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