Пример #1
0
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;
}
Пример #2
0
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;
}