static int LockSurface(picture_t *picture) { picture_sys_t *picsys = picture->p_sys; vout_display_sys_t *p_sys = picsys->sys; OMX_BUFFERHEADERTYPE *p_buffer; OMX_FIFO_GET(&p_sys->port.fifo, p_buffer); for (int i = 0; i < 3; i++) { picture->p[i].p_pixels = p_buffer->pBuffer; picture->p[i].i_pitch = p_sys->port.definition.format.video.nStride; picture->p[i].i_lines = p_sys->port.definition.format.video.nSliceHeight; if (i > 0) { picture->p[i].p_pixels = picture->p[i-1].p_pixels + picture->p[i-1].i_pitch*picture->p[i-1].i_lines; picture->p[i].i_pitch /= 2; picture->p[i].i_lines /= 2; } } p_buffer->nOffset = 0; p_buffer->nFlags = 0; p_buffer->nTimeStamp = ToOmxTicks(0); p_buffer->nFilledLen = 0; picsys->buf = p_buffer; return VLC_SUCCESS; }
static void Close(vlc_object_t *obj) { filter_t *filter = (filter_t*) obj; filter_sys_t *sys = filter->p_sys; unsigned int i, j; if (sys->omx_handle) { OMX_STATETYPE state; OMX_GetState(sys->omx_handle, &state); if (state == OMX_StateExecuting) { OMX_SendCommand(sys->omx_handle, OMX_CommandStateSet, OMX_StateIdle, 0); while (1) { OMX_U32 cmd, state; WaitForSpecificOmxEvent(&sys->event_queue, OMX_EventCmdComplete, &cmd, &state, 0); if (cmd == OMX_CommandStateSet && state == OMX_StateIdle) break; } } OMX_GetState(sys->omx_handle, &state); if (state == OMX_StateIdle) { OMX_SendCommand(sys->omx_handle, OMX_CommandStateSet, OMX_StateLoaded, 0); for (i = 0; i < sys->num_ports; i++) { OmxPort *port = &sys->ports[i]; for (j = 0; j < sys->ports[i].i_buffers; j++) { OMX_BUFFERHEADERTYPE *buffer; OMX_FIFO_GET(&port->fifo, buffer); OMX_FreeBuffer(sys->omx_handle, port->i_port_index, buffer); } } WaitForSpecificOmxEvent(&sys->event_queue, OMX_EventCmdComplete, 0, 0, 0); } for (i = 0; i < sys->num_ports; i++) free(sys->ports[i].pp_buffers); pf_free_handle(sys->omx_handle); DeinitOmxEventQueue(&sys->event_queue); } free(sys); DeinitOmxCore(); }
static void Close(vlc_object_t *p_this) { vout_display_t *vd = (vout_display_t *)p_this; vout_display_sys_t *p_sys = vd->sys; if (p_sys->omx_handle) { OMX_STATETYPE state; OMX_GetState(p_sys->omx_handle, &state); if (state == OMX_StateExecuting) { OMX_SendCommand(p_sys->omx_handle, OMX_CommandStateSet, OMX_StateIdle, 0); while (1) { OMX_U32 cmd, state; WaitForSpecificOmxEvent(&p_sys->event_queue, OMX_EventCmdComplete, &cmd, &state, 0); if (cmd == OMX_CommandStateSet && state == OMX_StateIdle) break; } } OMX_GetState(p_sys->omx_handle, &state); if (state == OMX_StateIdle) { OMX_SendCommand(p_sys->omx_handle, OMX_CommandStateSet, OMX_StateLoaded, 0); for (unsigned int i = 0; i < p_sys->port.i_buffers; i++) { OMX_BUFFERHEADERTYPE *p_buffer; OMX_FIFO_GET(&p_sys->port.fifo, p_buffer); OMX_FreeBuffer(p_sys->omx_handle, p_sys->port.i_port_index, p_buffer); } WaitForSpecificOmxEvent(&p_sys->event_queue, OMX_EventCmdComplete, 0, 0, 0); } free(p_sys->port.pp_buffers); pf_free_handle(p_sys->omx_handle); DeinitOmxEventQueue(&p_sys->event_queue); OMX_FIFO_DESTROY(&p_sys->port.fifo); } if (p_sys->pool) picture_pool_Release(p_sys->pool); free(p_sys); DeinitOmxCore(); }
static picture_t *Deinterlace(filter_t *filter, picture_t *src) { picture_t *p_pic = NULL, *p_next_pic = NULL; filter_sys_t *sys = filter->p_sys; OMX_BUFFERHEADERTYPE *omx_header; OMX_ERRORTYPE omx_error; msg_Dbg(filter, "> %s()", __func__); while (!p_pic) { OMX_FIFO_PEEK(&sys->out.fifo, omx_header); if (!omx_header) break; if (omx_header->nFilledLen) { p_pic = omx_header->pAppPrivate; if (!p_pic) { msg_Err(filter, "Indirect rendering not yet supported"); } omx_header->nFilledLen = 0; omx_header->pAppPrivate = 0; } /* get a new picture */ if (sys->out.b_direct && !omx_header->pAppPrivate) { p_next_pic = filter_NewPicture(filter); if (p_next_pic == NULL) break; OMX_FIFO_GET(&sys->out.fifo, omx_header); omx_header->pAppPrivate = p_next_pic; omx_header->pInputPortPrivate = omx_header->pBuffer; omx_header->pBuffer = p_next_pic->p[0].p_pixels; } else { msg_Err(filter, "Indirect rendering not yet supported"); } msg_Dbg(filter, "FillThisBuffer %p, %p", omx_header, omx_header->pBuffer); omx_error = OMX_FillThisBuffer(sys->omx_handle, omx_header); if (omx_error != OMX_ErrorNone) { msg_Warn(filter, "OMX_FillThisBuffer failed (%x: %s).", omx_error, ErrorToString(omx_error)); print_omx_debug_info(filter); } } /* input */ OMX_FIFO_GET_TIMEOUT(&sys->in.fifo, omx_header, 2000); if (omx_header) { if (sys->in.b_direct) { omx_header->pOutputPortPrivate = omx_header->pBuffer; omx_header->pBuffer = src->p[0].p_pixels; omx_header->pAppPrivate = src; } else { memcpy(omx_header->pBuffer, src->p[0].p_pixels, sys->in.definition.nBufferSize); msg_Err(filter, "Indirect rendering not yet supported"); } omx_header->nFlags = OMX_BUFFERFLAG_ENDOFFRAME; omx_header->nOffset = 0; omx_header->nFilledLen = sys->in.definition.nBufferSize; omx_header->nTimeStamp = ToOmxTicks(src->date); msg_Dbg(filter, "EmptyThisBuffer %p, %p, %i, %"PRId64, omx_header, omx_header->pBuffer, (int)omx_header->nFilledLen, FromOmxTicks(omx_header->nTimeStamp)); omx_error = OMX_EmptyThisBuffer(sys->omx_handle, omx_header); if (omx_error != OMX_ErrorNone) { msg_Warn(filter, "OMX_EmptyThisBuffer failed (%x: %s).", omx_error, ErrorToString(omx_error)); print_omx_debug_info(filter); } } msg_Dbg(filter, "< %s(): %p", __func__, p_pic); return p_pic; }