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); }
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); }