summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorChristophe Thommeret <hftom@free.fr>2009-02-04 17:49:39 +0000
committerChristophe Thommeret <hftom@free.fr>2009-02-04 17:49:39 +0000
commit409cc2850fc6cf5b5d5b2322feb10699743a8962 (patch)
tree9b326795e1c7fc41f09de30befbd09f14915a5a1 /src
parent07b831a6cfaea761f309fb82b4e81a877ed564d3 (diff)
downloadxine-lib-409cc2850fc6cf5b5d5b2322feb10699743a8962.tar.gz
xine-lib-409cc2850fc6cf5b5d5b2322feb10699743a8962.tar.bz2
Skipped frames.
Diffstat (limited to 'src')
-rw-r--r--src/libvdpau/vdpau_vc1.c56
1 files changed, 30 insertions, 26 deletions
diff --git a/src/libvdpau/vdpau_vc1.c b/src/libvdpau/vdpau_vc1.c
index 391eba04d..22a03d1ff 100644
--- a/src/libvdpau/vdpau_vc1.c
+++ b/src/libvdpau/vdpau_vc1.c
@@ -65,6 +65,7 @@ typedef struct {
VdpPictureInfoVC1 vdp_infos;
int hrd_param_flag;
int hrd_num_leaky_buckets;
+ int skipped;
} picture_t;
@@ -121,29 +122,9 @@ typedef struct vdpau_vc1_decoder_s {
-static void reset_picture( picture_t *pic )
-{
- lprintf( "reset_picture\n" );
- /*pic->vdp_infos.picture_structure = 0;
- pic->vdp_infos2.intra_dc_precision = pic->vdp_infos.intra_dc_precision = 0;
- pic->vdp_infos2.frame_pred_frame_dct = pic->vdp_infos.frame_pred_frame_dct = 1;
- pic->vdp_infos2.concealment_motion_vectors = pic->vdp_infos.concealment_motion_vectors = 0;
- pic->vdp_infos2.intra_vlc_format = pic->vdp_infos.intra_vlc_format = 0;
- pic->vdp_infos2.alternate_scan = pic->vdp_infos.alternate_scan = 0;
- pic->vdp_infos2.q_scale_type = pic->vdp_infos.q_scale_type = 0;
- pic->vdp_infos2.top_field_first = pic->vdp_infos.top_field_first = 0;
- pic->slices_count = 0;
- pic->slices_count2 = 0;
- pic->slices_pos = 0;
- pic->slices_pos_top = 0;
- pic->state = WANT_HEADER;*/
-}
-
-
-
static void init_picture( picture_t *pic )
{
- reset_picture( pic );
+ memset( pic, 0, sizeof( picture_t ) );
}
@@ -401,9 +382,9 @@ static void picture_header( vdpau_vc1_decoder_t *this_gen, uint8_t *buf, int len
else
off += 3;
}
- if ( info->picture_type==I_FRAME || info->picture_type==BI_FRAME )
+ /*if ( info->picture_type==I_FRAME || info->picture_type==BI_FRAME )
off += 7;
- tmp = get_bits(buf,off,5);
+ tmp = get_bits(buf,off,5);*/
}
@@ -428,8 +409,10 @@ static void picture_header_advanced( vdpau_vc1_decoder_t *this_gen, uint8_t *buf
else {
if ( !get_bits(buf,off++,1) )
info->picture_type = BI_FRAME;
- else
- info->picture_type = P_FRAME; // TODO: skipped frame
+ else {
+ info->picture_type = P_FRAME;
+ pic->skipped = 1;
+ }
}
}
}
@@ -458,6 +441,19 @@ static void parse_header( vdpau_vc1_decoder_t *this_gen, uint8_t *buf, int len )
+static void duplicate_image( vdpau_vc1_decoder_t *vd, vdpau_accel_t *accel, vo_frame_t *dst )
+{
+ sequence_t *seq = (sequence_t*)&vd->sequence;
+ picture_t *pic = (picture_t*)&seq->picture;
+
+ if ( !seq->backward_ref ) // Should not happen!
+ return;
+
+ dst->proc_duplicate_frame_data( dst, seq->backward_ref );
+}
+
+
+
static void decode_render( vdpau_vc1_decoder_t *vd, vdpau_accel_t *accel )
{
sequence_t *seq = (sequence_t*)&vd->sequence;
@@ -502,11 +498,16 @@ static void decode_picture( vdpau_vc1_decoder_t *vd )
picture_t *pic = (picture_t*)&seq->picture;
vdpau_accel_t *ref_accel;
+ pic->skipped = 0;
+
if ( seq->profile==VDP_DECODER_PROFILE_VC1_ADVANCED )
picture_header_advanced( vd, seq->buf, seq->bufpos );
else
picture_header( vd, seq->buf, seq->bufpos );
+ if ( seq->bufpos<2 )
+ pic->skipped = 1;
+
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 );
@@ -553,7 +554,10 @@ static void decode_picture( vdpau_vc1_decoder_t *vd )
vd->decoder = VDP_INVALID_HANDLE;
}
- decode_render( vd, accel );
+ if ( pic->skipped )
+ duplicate_image( vd, accel, img );
+ else
+ decode_render( vd, accel );
img->pts = seq->seq_pts;
img->bad_frame = 0;