diff options
author | Christophe Thommeret <hftom@free.fr> | 2008-12-10 11:34:41 +0000 |
---|---|---|
committer | Christophe Thommeret <hftom@free.fr> | 2008-12-10 11:34:41 +0000 |
commit | 1f3c3b344969262aac57cc18b1710c1ec496fd2a (patch) | |
tree | 4e3a6a46d6716c2b39069d29c68fbdd41dacc403 /src | |
parent | 7a50f9ae0c9f3c5c7c2872810506fbbe74aaa717 (diff) | |
download | xine-lib-1f3c3b344969262aac57cc18b1710c1ec496fd2a.tar.gz xine-lib-1f3c3b344969262aac57cc18b1710c1ec496fd2a.tar.bz2 |
Header-related bits.
Diffstat (limited to 'src')
-rw-r--r-- | src/libvdpau/vdpau_mpeg12.c | 27 |
1 files changed, 19 insertions, 8 deletions
diff --git a/src/libvdpau/vdpau_mpeg12.c b/src/libvdpau/vdpau_mpeg12.c index ab4312d59..a376e4904 100644 --- a/src/libvdpau/vdpau_mpeg12.c +++ b/src/libvdpau/vdpau_mpeg12.c @@ -232,12 +232,12 @@ static void sequence_header( sequence_t *sequence, uint8_t *buf, int len ) static void picture_header( sequence_t *sequence, uint8_t *buf, int len ) { - int i = get_bits( buf,10,3 ); + //int i = get_bits( buf,10,3 ); //printf( "!!!!!!!!!!!!!!! picture type : %d !!!!!!!!!!!!!!!!!!!!!!!!!!\n", i ); if ( /*i==B_FRAME ||*/ sequence->picture.state!=WANT_HEADER ) return; reset_picture( &sequence->picture ); - sequence->picture.vdp_infos.picture_coding_type = i; + sequence->picture.vdp_infos.picture_coding_type = get_bits( buf,10,3 ); sequence->picture.vdp_infos.forward_reference = VDP_INVALID_HANDLE; sequence->picture.vdp_infos.backward_reference = VDP_INVALID_HANDLE; sequence->picture.vdp_infos.full_pel_forward_vector = 0; @@ -392,21 +392,32 @@ static void decode_picture( vdpau_mpeg12_decoder_t *vd ) vdpau_accel_t *ref_accel; if ( pic->vdp_infos.picture_coding_type==P_FRAME ) { - if ( seq->backward_ref ) + if ( seq->backward_ref ) { ref_accel = (vdpau_accel_t*)seq->backward_ref->accel_data; - else - ref_accel = (vdpau_accel_t*)seq->forward_ref->accel_data; - pic->vdp_infos.forward_reference = ref_accel->surface; + pic->vdp_infos.forward_reference = ref_accel->surface; + } + else { + pic->state = WANT_HEADER; + return; + } } else if ( pic->vdp_infos.picture_coding_type==B_FRAME ) { if ( seq->forward_ref ) { ref_accel = (vdpau_accel_t*)seq->forward_ref->accel_data; pic->vdp_infos.forward_reference = ref_accel->surface; } + else { + pic->state = WANT_HEADER; + return; + } if ( seq->backward_ref ) { ref_accel = (vdpau_accel_t*)seq->backward_ref->accel_data; pic->vdp_infos.backward_reference = ref_accel->surface; } + else { + pic->state = WANT_HEADER; + return; + } } pic->vdp_infos.slice_count = pic->slices_count; @@ -461,8 +472,8 @@ static void decode_picture( vdpau_mpeg12_decoder_t *vd ) * This function receives a buffer of data from the demuxer layer and * figures out how to handle it based on its header flags. */ -static void vdpau_mpeg12_decode_data (video_decoder_t *this_gen, buf_element_t *buf) { - +static void vdpau_mpeg12_decode_data (video_decoder_t *this_gen, buf_element_t *buf) +{ vdpau_mpeg12_decoder_t *this = (vdpau_mpeg12_decoder_t *) this_gen; sequence_t *seq = (sequence_t*)&this->sequence; |