static void vid_dec_FrameDecoded(OMX_COMPONENTTYPE *comp, OMX_BUFFERHEADERTYPE* input, OMX_BUFFERHEADERTYPE* output) { vid_dec_PrivateType *priv = comp->pComponentPrivate; bool eos = !!(input->nFlags & OMX_BUFFERFLAG_EOS); if (!input->pInputPortPrivate) input->pInputPortPrivate = priv->Flush(priv); if (input->pInputPortPrivate) { if (output->pInputPortPrivate) { struct pipe_video_buffer *tmp = output->pOutputPortPrivate; output->pOutputPortPrivate = input->pInputPortPrivate; input->pInputPortPrivate = tmp; } else { vid_dec_FillOutput(priv, input->pInputPortPrivate, output); } output->nFilledLen = output->nAllocLen; } if (eos && input->pInputPortPrivate) vid_dec_FreeInputPortPrivate(input); else input->nFilledLen = 0; }
static void vid_dec_FrameDecoded(OMX_COMPONENTTYPE *comp, OMX_BUFFERHEADERTYPE* input, OMX_BUFFERHEADERTYPE* output) { vid_dec_PrivateType *priv = comp->pComponentPrivate; bool eos = !!(input->nFlags & OMX_BUFFERFLAG_EOS); OMX_TICKS timestamp; if (!input->pInputPortPrivate) { input->pInputPortPrivate = priv->Flush(priv, ×tamp); if (timestamp != OMX_VID_DEC_TIMESTAMP_INVALID) input->nTimeStamp = timestamp; } if (input->pInputPortPrivate) { if (output->pInputPortPrivate && !priv->disable_tunnel) { struct pipe_video_buffer *tmp, *vbuf, *new_vbuf; tmp = output->pOutputPortPrivate; vbuf = input->pInputPortPrivate; if (vbuf->interlaced) { /* re-allocate the progressive buffer */ omx_base_video_PortType *port; struct pipe_video_buffer templat = {}; struct u_rect src_rect, dst_rect; port = (omx_base_video_PortType *) priv->ports[OMX_BASE_FILTER_INPUTPORT_INDEX]; memset(&templat, 0, sizeof(templat)); templat.chroma_format = PIPE_VIDEO_CHROMA_FORMAT_420; templat.width = port->sPortParam.format.video.nFrameWidth; templat.height = port->sPortParam.format.video.nFrameHeight; templat.buffer_format = PIPE_FORMAT_NV12; templat.interlaced = false; new_vbuf = priv->pipe->create_video_buffer(priv->pipe, &templat); /* convert the interlaced to the progressive */ src_rect.x0 = dst_rect.x0 = 0; src_rect.x1 = dst_rect.x1 = templat.width; src_rect.y0 = dst_rect.y0 = 0; src_rect.y1 = dst_rect.y1 = templat.height; vl_compositor_yuv_deint_full(&priv->cstate, &priv->compositor, input->pInputPortPrivate, new_vbuf, &src_rect, &dst_rect, VL_COMPOSITOR_WEAVE); /* set the progrssive buffer for next round */ vbuf->destroy(vbuf); input->pInputPortPrivate = new_vbuf; } output->pOutputPortPrivate = input->pInputPortPrivate; input->pInputPortPrivate = tmp; } else { vid_dec_FillOutput(priv, input->pInputPortPrivate, output); } output->nFilledLen = output->nAllocLen; output->nTimeStamp = input->nTimeStamp; } if (eos && input->pInputPortPrivate) vid_dec_FreeInputPortPrivate(input); else input->nFilledLen = 0; }