void ff_vdpau_mpeg_picture_complete(MpegEncContext *s, const uint8_t *buf, int buf_size, int slice_count) { struct vdpau_render_state *render, *last, *next; int i; if (!s->current_picture_ptr) return; render = (struct vdpau_render_state *)s->current_picture_ptr->f.data[0]; assert(render); /* fill VdpPictureInfoMPEG1Or2 struct */ render->info.mpeg.picture_structure = s->picture_structure; render->info.mpeg.picture_coding_type = s->pict_type; render->info.mpeg.intra_dc_precision = s->intra_dc_precision; render->info.mpeg.frame_pred_frame_dct = s->frame_pred_frame_dct; render->info.mpeg.concealment_motion_vectors = s->concealment_motion_vectors; render->info.mpeg.intra_vlc_format = s->intra_vlc_format; render->info.mpeg.alternate_scan = s->alternate_scan; render->info.mpeg.q_scale_type = s->q_scale_type; render->info.mpeg.top_field_first = s->top_field_first; render->info.mpeg.full_pel_forward_vector = s->full_pel[0]; // MPEG-1 only. Set 0 for MPEG-2 render->info.mpeg.full_pel_backward_vector = s->full_pel[1]; // MPEG-1 only. Set 0 for MPEG-2 render->info.mpeg.f_code[0][0] = s->mpeg_f_code[0][0]; // For MPEG-1 fill both horiz. & vert. render->info.mpeg.f_code[0][1] = s->mpeg_f_code[0][1]; render->info.mpeg.f_code[1][0] = s->mpeg_f_code[1][0]; render->info.mpeg.f_code[1][1] = s->mpeg_f_code[1][1]; for (i = 0; i < 64; ++i) { render->info.mpeg.intra_quantizer_matrix[i] = s->intra_matrix[i]; render->info.mpeg.non_intra_quantizer_matrix[i] = s->inter_matrix[i]; } render->info.mpeg.forward_reference = VDP_INVALID_HANDLE; render->info.mpeg.backward_reference = VDP_INVALID_HANDLE; switch(s->pict_type){ case AV_PICTURE_TYPE_B: next = (struct vdpau_render_state *)s->next_picture.f.data[0]; assert(next); render->info.mpeg.backward_reference = next->surface; // no return here, going to set forward prediction case AV_PICTURE_TYPE_P: last = (struct vdpau_render_state *)s->last_picture.f.data[0]; if (!last) // FIXME: Does this test make sense? last = render; // predict second field from the first render->info.mpeg.forward_reference = last->surface; } ff_vdpau_add_data_chunk(s->current_picture_ptr->f.data[0], buf, buf_size); render->info.mpeg.slice_count = slice_count; if (slice_count) ff_mpeg_draw_horiz_band(s, 0, s->avctx->height); render->bitstream_buffers_used = 0; }
void ff_vdpau_mpeg4_decode_picture(Mpeg4DecContext *ctx, const uint8_t *buf, int buf_size) { MpegEncContext *s = &ctx->m; struct vdpau_render_state *render, *last, *next; int i; if (!s->current_picture_ptr) return; render = (struct vdpau_render_state *)s->current_picture_ptr->f->data[0]; assert(render); /* fill VdpPictureInfoMPEG4Part2 struct */ render->info.mpeg4.trd[0] = s->pp_time; render->info.mpeg4.trb[0] = s->pb_time; render->info.mpeg4.trd[1] = s->pp_field_time >> 1; render->info.mpeg4.trb[1] = s->pb_field_time >> 1; render->info.mpeg4.vop_time_increment_resolution = s->avctx->time_base.den; render->info.mpeg4.vop_coding_type = 0; render->info.mpeg4.vop_fcode_forward = s->f_code; render->info.mpeg4.vop_fcode_backward = s->b_code; render->info.mpeg4.resync_marker_disable = !ctx->resync_marker; render->info.mpeg4.interlaced = !s->progressive_sequence; render->info.mpeg4.quant_type = s->mpeg_quant; render->info.mpeg4.quarter_sample = s->quarter_sample; render->info.mpeg4.short_video_header = s->avctx->codec->id == AV_CODEC_ID_H263; render->info.mpeg4.rounding_control = s->no_rounding; render->info.mpeg4.alternate_vertical_scan_flag = s->alternate_scan; render->info.mpeg4.top_field_first = s->top_field_first; for (i = 0; i < 64; ++i) { render->info.mpeg4.intra_quantizer_matrix[i] = s->intra_matrix[i]; render->info.mpeg4.non_intra_quantizer_matrix[i] = s->inter_matrix[i]; } render->info.mpeg4.forward_reference = VDP_INVALID_HANDLE; render->info.mpeg4.backward_reference = VDP_INVALID_HANDLE; switch (s->pict_type) { case AV_PICTURE_TYPE_B: next = (struct vdpau_render_state *)s->next_picture.f->data[0]; assert(next); render->info.mpeg4.backward_reference = next->surface; render->info.mpeg4.vop_coding_type = 2; // no break here, going to set forward prediction case AV_PICTURE_TYPE_P: last = (struct vdpau_render_state *)s->last_picture.f->data[0]; assert(last); render->info.mpeg4.forward_reference = last->surface; } ff_vdpau_add_data_chunk(s->current_picture_ptr->f->data[0], buf, buf_size); ff_mpeg_draw_horiz_band(s, 0, s->avctx->height); render->bitstream_buffers_used = 0; }
void ff_vdpau_vc1_decode_picture(MpegEncContext *s, const uint8_t *buf, int buf_size) { VC1Context *v = s->avctx->priv_data; struct vdpau_render_state *render, *last, *next; render = (struct vdpau_render_state *)s->current_picture.f.data[0]; assert(render); /* fill LvPictureInfoVC1 struct */ render->info.vc1.frame_coding_mode = v->fcm ? v->fcm + 1 : 0; render->info.vc1.postprocflag = v->postprocflag; render->info.vc1.pulldown = v->broadcast; render->info.vc1.interlace = v->interlace; render->info.vc1.tfcntrflag = v->tfcntrflag; render->info.vc1.finterpflag = v->finterpflag; render->info.vc1.psf = v->psf; render->info.vc1.dquant = v->dquant; render->info.vc1.panscan_flag = v->panscanflag; render->info.vc1.refdist_flag = v->refdist_flag; render->info.vc1.quantizer = v->quantizer_mode; render->info.vc1.extended_mv = v->extended_mv; render->info.vc1.extended_dmv = v->extended_dmv; render->info.vc1.overlap = v->overlap; render->info.vc1.vstransform = v->vstransform; render->info.vc1.loopfilter = v->s.loop_filter; render->info.vc1.fastuvmc = v->fastuvmc; render->info.vc1.range_mapy_flag = v->range_mapy_flag; render->info.vc1.range_mapy = v->range_mapy; render->info.vc1.range_mapuv_flag = v->range_mapuv_flag; render->info.vc1.range_mapuv = v->range_mapuv; /* Specific to simple/main profile only */ render->info.vc1.multires = v->multires; render->info.vc1.syncmarker = v->s.resync_marker; render->info.vc1.rangered = v->rangered | (v->rangeredfrm << 1); render->info.vc1.maxbframes = v->s.max_b_frames; render->info.vc1.deblockEnable = v->postprocflag & 1; render->info.vc1.pquant = v->pq; render->info.vc1.forward_reference = VDP_INVALID_HANDLE; render->info.vc1.backward_reference = VDP_INVALID_HANDLE; if (v->bi_type) render->info.vc1.picture_type = 4; else render->info.vc1.picture_type = s->pict_type - 1 + s->pict_type / 3; switch(s->pict_type){ case AV_PICTURE_TYPE_B: next = (struct vdpau_render_state *)s->next_picture.f.data[0]; assert(next); render->info.vc1.backward_reference = next->surface; // no break here, going to set forward prediction case AV_PICTURE_TYPE_P: last = (struct vdpau_render_state *)s->last_picture.f.data[0]; if (!last) // FIXME: Does this test make sense? last = render; // predict second field from the first render->info.vc1.forward_reference = last->surface; } ff_vdpau_add_data_chunk(s->current_picture_ptr->f.data[0], buf, buf_size); render->info.vc1.slice_count = 1; ff_mpeg_draw_horiz_band(s, 0, s->avctx->height); render->bitstream_buffers_used = 0; }