static void vdpau_decode(struct media_codec *mc, struct video_decoder *vd, struct media_queue *mq, struct media_buf *mb, int reqsize) { media_codec_t *cw = mb->mb_cw; AVCodecContext *ctx = cw->ctx; vdpau_codec_t *vc = mc->opaque; media_pipe_t *mp = vd->vd_mp; vdpau_video_surface_t *vvs; int got_pic = 0; AVFrame *frame = vd->vd_frame; ctx->skip_frame = mb->mb_skip == 1 ? AVDISCARD_NONREF : AVDISCARD_NONE; vc->vc_mb = mb; AVPacket avpkt; av_init_packet(&avpkt); avpkt.data = mb->mb_data; avpkt.size = mb->mb_size; avcodec_decode_video2(ctx, frame, &got_pic, &avpkt); if(mp->mp_stats) mp_set_mq_meta(mq, cw->ctx->codec, cw->ctx); if(!got_pic || mb->mb_skip == 1) return; vvs = frame->opaque; video_deliver_frame_avctx(vd, vd->vd_mp, mq, ctx, frame, &vvs->vvs_mb, 0); }
static void vd_decode_video(video_decoder_t *vd, media_queue_t *mq, media_buf_t *mb) { int got_pic = 0; media_pipe_t *mp = vd->vd_mp; media_codec_t *cw = mb->mb_cw; AVCodecContext *ctx = cw->codec_ctx; AVFrame *frame = vd->vd_frame; int t; if(vd->vd_do_flush) { AVPacket avpkt; av_init_packet(&avpkt); avpkt.data = NULL; avpkt.size = 0; do { avcodec_decode_video2(ctx, frame, &got_pic, &avpkt); } while(got_pic); vd->vd_do_flush = 0; vd->vd_prevpts = AV_NOPTS_VALUE; vd->vd_nextpts = AV_NOPTS_VALUE; vd->vd_estimated_duration = 0; avcodec_flush_buffers(ctx); vd->vd_compensate_thres = 5; } vd->vd_reorder[vd->vd_reorder_ptr] = *mb; ctx->reordered_opaque = vd->vd_reorder_ptr; vd->vd_reorder_ptr = (vd->vd_reorder_ptr + 1) & VIDEO_DECODER_REORDER_MASK; /* * If we are seeking, drop any non-reference frames */ ctx->skip_frame = mb->mb_skip == 1 ? AVDISCARD_NONREF : AVDISCARD_DEFAULT; avgtime_start(&vd->vd_decode_time); AVPacket avpkt; av_init_packet(&avpkt); avpkt.data = mb->mb_data; avpkt.size = mb->mb_size; avcodec_decode_video2(ctx, frame, &got_pic, &avpkt); t = avgtime_stop(&vd->vd_decode_time, mq->mq_prop_decode_avg, mq->mq_prop_decode_peak); if(mp->mp_stats) mp_set_mq_meta(mq, cw->codec, cw->codec_ctx); mb = &vd->vd_reorder[frame->reordered_opaque]; if(got_pic == 0 || mb->mb_skip == 1) return; video_deliver_frame_avctx(vd, mp, mq, ctx, frame, mb, t); }
static void vdpau_decode(struct media_codec *mc, struct video_decoder *vd, struct media_queue *mq, struct media_buf *mb, int reqsize) { media_codec_t *cw = mb->mb_cw; AVCodecContext *ctx = cw->codec_ctx; vdpau_codec_t *vc = mc->opaque; media_pipe_t *mp = vd->vd_mp; vdpau_video_surface_t *vvs; int got_pic = 0; AVFrame *frame = vd->vd_frame; if(vd->vd_do_flush) { AVPacket avpkt; av_init_packet(&avpkt); avpkt.data = NULL; avpkt.size = 0; do { avcodec_decode_video2(ctx, frame, &got_pic, &avpkt); } while(got_pic); vd->vd_do_flush = 0; vd->vd_prevpts = AV_NOPTS_VALUE; vd->vd_nextpts = AV_NOPTS_VALUE; vd->vd_estimated_duration = 0; avcodec_flush_buffers(ctx); vd->vd_compensate_thres = 5; } ctx->skip_frame = mb->mb_skip == 1 ? AVDISCARD_NONREF : AVDISCARD_NONE; vc->vc_mb = mb; AVPacket avpkt; av_init_packet(&avpkt); avpkt.data = mb->mb_data; avpkt.size = mb->mb_size; avcodec_decode_video2(ctx, frame, &got_pic, &avpkt); if(mp->mp_stats) mp_set_mq_meta(mq, cw->codec, cw->codec_ctx); if(!got_pic || mb->mb_skip == 1) return; vd->vd_skip = 0; vvs = frame->opaque; video_deliver_frame_avctx(vd, vd->vd_mp, mq, ctx, frame, &vvs->vvs_mb, 0); return; }
static void libav_decode_video(struct media_codec *mc, struct video_decoder *vd, struct media_queue *mq, struct media_buf *mb, int reqsize) { int got_pic = 0; media_pipe_t *mp = vd->vd_mp; AVCodecContext *ctx = mc->ctx; AVFrame *frame = vd->vd_frame; int t; vd->vd_reorder[vd->vd_reorder_ptr] = mb->mb_meta; ctx->reordered_opaque = vd->vd_reorder_ptr; vd->vd_reorder_ptr = (vd->vd_reorder_ptr + 1) & VIDEO_DECODER_REORDER_MASK; /* * If we are seeking, drop any non-reference frames */ ctx->skip_frame = mb->mb_skip == 1 ? AVDISCARD_NONREF : AVDISCARD_DEFAULT; avgtime_start(&vd->vd_decode_time); AVPacket avpkt; av_init_packet(&avpkt); avpkt.data = mb->mb_data; avpkt.size = mb->mb_size; avcodec_decode_video2(ctx, frame, &got_pic, &avpkt); t = avgtime_stop(&vd->vd_decode_time, mq->mq_prop_decode_avg, mq->mq_prop_decode_peak); if(mp->mp_stats) mp_set_mq_meta(mq, ctx->codec, ctx); const media_buf_meta_t *mbm = &vd->vd_reorder[frame->reordered_opaque]; if(got_pic == 0 || mbm->mbm_skip == 1) return; video_deliver_frame_avctx(vd, mp, mq, ctx, frame, mbm, t); }