summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristophe Thommeret <hftom@free.fr>2009-02-04 00:41:00 +0000
committerChristophe Thommeret <hftom@free.fr>2009-02-04 00:41:00 +0000
commit07b831a6cfaea761f309fb82b4e81a877ed564d3 (patch)
treee398d2ba5baee8834e276c0236390090330995ae
parent9839d82d6edce0192c8de2588d5bac62f1f13a57 (diff)
downloadxine-lib-07b831a6cfaea761f309fb82b4e81a877ed564d3.tar.gz
xine-lib-07b831a6cfaea761f309fb82b4e81a877ed564d3.tar.bz2
Initial advanced_profile support.
-rw-r--r--src/libvdpau/vdpau_vc1.c36
1 files changed, 34 insertions, 2 deletions
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 );