Exemplo n.º 1
0
void render_video(void *hrender, AVFrame *video)
{
    RENDER  *render  = (RENDER*)hrender;
    AVFrame  picture = {0};
    BYTE    *bmpbuf;
    int      stride;

    if (  render->nRenderXPosCur  != render->nRenderXPosNew
       || render->nRenderYPosCur  != render->nRenderYPosNew
       || render->nRenderWidthCur != render->nRenderWidthNew
       || render->nRenderHeightCur!= render->nRenderHeightNew ) {
        render->nRenderXPosCur   = render->nRenderXPosNew;
        render->nRenderYPosCur   = render->nRenderYPosNew;
        render->nRenderWidthCur  = render->nRenderWidthNew;
        render->nRenderHeightCur = render->nRenderHeightNew;

        vdev_setrect(render->vdev, render->nRenderXPosCur, render->nRenderYPosCur,
            render->nRenderWidthCur, render->nRenderHeightCur);

        if (render->pSWSContext) sws_freeContext(render->pSWSContext);
        render->pSWSContext = sws_getContext(
            render->nVideoWidth, render->nVideoHeight, render->PixelFormat,
            render->nRenderWidthCur, render->nRenderHeightCur, (AVPixelFormat)vdev_pixfmt(render->vdev),
            SWS_BILINEAR, 0, 0, 0);
    }

    vdev_request(render->vdev, (void**)&bmpbuf, &stride);
    if (video->pts != -1) {
        picture.data[0]     = bmpbuf;
        picture.linesize[0] = stride;
        sws_scale(render->pSWSContext, video->data, video->linesize, 0, render->nVideoHeight, picture.data, picture.linesize);
    }
    vdev_post(render->vdev, video->pts);
}
Exemplo n.º 2
0
void render_video(void *hrender, AVFrame *video)
{
    RENDER  *render = (RENDER*)hrender;
    AVFrame  picture;

    // init picture
    memset(&picture, 0, sizeof(AVFrame));

    if (!render || !render->vdev) return;
    do {
        VDEV_COMMON_CTXT *vdev = (VDEV_COMMON_CTXT*)render->vdev;
        if (  render->render_xcur != render->render_xnew
           || render->render_ycur != render->render_ynew
           || render->render_wcur != render->render_wnew
           || render->render_hcur != render->render_hnew ) {
            render->render_xcur = render->render_xnew;
            render->render_ycur = render->render_ynew;
            render->render_wcur = render->render_wnew;
            render->render_hcur = render->render_hnew;

            // vdev set rect
            vdev_setrect(render->vdev, render->render_xcur, render->render_ycur,
                render->render_wcur, render->render_hcur);

            // we need recreate sws
            if (!render->sws_context) {
                sws_freeContext(render->sws_context);
            }
            render->sws_context = sws_getContext(
                render->video_width, render->video_height, render->pixel_fmt,
                vdev->sw, vdev->sh, (AVPixelFormat)vdev->pixfmt,
                SWS_FAST_BILINEAR, 0, 0, 0);
        }

        if (video->format == AV_PIX_FMT_DXVA2_VLD) {
            vdev_setparam(render->vdev, PARAM_VDEV_POST_SURFACE, video);
        } else {
            vdev_lock(render->vdev, picture.data, picture.linesize);
            if (picture.data[0] && video->pts != -1) {
                sws_scale(render->sws_context, video->data, video->linesize, 0, render->video_height, picture.data, picture.linesize);
            }
            vdev_unlock(render->vdev, video->pts);
        }

#if CONFIG_ENABLE_SNAPSHOT
        if (render->render_status & RENDER_SNAPSHOT) {
            int ret = take_snapshot(render->snapfile, render->snapwidth, render->snapheight, video);
            player_send_message(((VDEV_COMMON_CTXT*)render->vdev)->surface, MSG_TAKE_SNAPSHOT, 0);
            render->render_status &= ~RENDER_SNAPSHOT;
        }
#endif

        //++ seek step
        if (render->render_status & RENDER_SEEKSTEP) {
            render->render_status &= ~RENDER_SEEKSTEP;
            break;
        }
        //-- seek step
    } while (render->render_status & RENDER_PAUSE);
}