From 07b831a6cfaea761f309fb82b4e81a877ed564d3 Mon Sep 17 00:00:00 2001 From: Christophe Thommeret Date: Wed, 4 Feb 2009 00:41:00 +0000 Subject: Initial advanced_profile support. --- src/libvdpau/vdpau_vc1.c | 36 ++++++++++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/libvdpau/vdpau_vc1.c b/src/libvdpau/vdpau_vc1.c index baad30df3..391eba04d 100644 --- a/src/libvdpau/vdpau_vc1.c +++ b/src/libvdpau/vdpau_vc1.c @@ -366,9 +366,9 @@ static void picture_header( vdpau_vc1_decoder_t *this_gen, uint8_t *buf, int len sequence_t *sequence = (sequence_t*)&this_gen->sequence; picture_t *pic = (picture_t*)&sequence->picture; VdpPictureInfoVC1 *info = &(sequence->picture.vdp_infos); + int tmp; int off=2; - int tmp; if ( info->finterpflag ) ++off; @@ -408,6 +408,35 @@ static void picture_header( vdpau_vc1_decoder_t *this_gen, uint8_t *buf, int len +static void picture_header_advanced( vdpau_vc1_decoder_t *this_gen, uint8_t *buf, int len ) +{ + sequence_t *sequence = (sequence_t*)&this_gen->sequence; + picture_t *pic = (picture_t*)&sequence->picture; + VdpPictureInfoVC1 *info = &(sequence->picture.vdp_infos); + int off=0; + + if ( info->interlace ) + return; // not yet supported + if ( !get_bits(buf,off++,1) ) + info->picture_type = P_FRAME; + else { + if ( !get_bits(buf,off++,1) ) + info->picture_type = B_FRAME; + else { + if ( !get_bits(buf,off++,1) ) + info->picture_type = I_FRAME; + else { + if ( !get_bits(buf,off++,1) ) + info->picture_type = BI_FRAME; + else + info->picture_type = P_FRAME; // TODO: skipped frame + } + } + } +} + + + static void parse_header( vdpau_vc1_decoder_t *this_gen, uint8_t *buf, int len ) { sequence_t *sequence = (sequence_t*)&this_gen->sequence; @@ -473,7 +502,10 @@ static void decode_picture( vdpau_vc1_decoder_t *vd ) picture_t *pic = (picture_t*)&seq->picture; vdpau_accel_t *ref_accel; - picture_header( vd, seq->buf, seq->bufpos ); + if ( seq->profile==VDP_DECODER_PROFILE_VC1_ADVANCED ) + picture_header_advanced( vd, seq->buf, seq->bufpos ); + else + picture_header( vd, seq->buf, seq->bufpos ); VdpPictureInfoVC1 *info = &(seq->picture.vdp_infos); printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d\n\n", info->slice_count, info->picture_type, info->frame_coding_mode, info->postprocflag, info->pulldown, info->interlace, info->tfcntrflag, info->finterpflag, info->psf, info->dquant, info->panscan_flag, info->refdist_flag, info->quantizer, info->extended_mv, info->extended_dmv, info->overlap, info->vstransform, info->loopfilter, info->fastuvmc, info->range_mapy_flag, info->range_mapy, info->range_mapuv_flag, info->range_mapuv, info->multires, info->syncmarker, info->rangered, info->maxbframes, info->deblockEnable, info->pquant ); -- cgit v1.2.3