Ejemplo n.º 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;
}
Ejemplo n.º 2
0
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();
}
Ejemplo n.º 3
0
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();
}
Ejemplo n.º 4
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;
}