diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/libvdpau/dpb.c | 28 | ||||
-rw-r--r-- | src/libvdpau/dpb.h | 3 | ||||
-rw-r--r-- | src/libvdpau/vdpau_h264.c | 17 |
3 files changed, 38 insertions, 10 deletions
diff --git a/src/libvdpau/dpb.c b/src/libvdpau/dpb.c index d6a6c25df..8f79dc064 100644 --- a/src/libvdpau/dpb.c +++ b/src/libvdpau/dpb.c @@ -88,6 +88,7 @@ int dpb_remove_picture(struct dpb *dpb, uint32_t picnum) dpb->pictures = pic->next; free_decoded_picture(pic); + dpb->used--; return 0; } @@ -113,6 +114,7 @@ int dpb_remove_picture_by_ltpn(struct dpb *dpb, uint32_t longterm_picnum) dpb->pictures = pic->next; free_decoded_picture(pic); + dpb->used--; return 0; } @@ -138,6 +140,7 @@ int dpb_remove_picture_by_ltidx(struct dpb *dpb, uint32_t longterm_idx) dpb->pictures = pic->next; free_decoded_picture(pic); + dpb->used--; return 0; } @@ -163,7 +166,7 @@ int dpb_remove_ltidx_gt(struct dpb *dpb, uint32_t longterm_max) free_decoded_picture(pic); - + dpb->used--; /* don't increase last_pic to current pic * in case we delete current pic */ continue; @@ -175,10 +178,27 @@ int dpb_remove_ltidx_gt(struct dpb *dpb, uint32_t longterm_max) return 0; } -int dpb_add_picture(struct dpb *dpb, struct decoded_picture *pic) +int dpb_add_picture(struct dpb *dpb, struct decoded_picture *pic, uint32_t num_ref_frames) { + int i = 0; + struct decoded_picture *last_pic; + pic->next = dpb->pictures; dpb->pictures = pic; + dpb->used++; + + if(dpb->used > num_ref_frames) { + do { + i++; + if(i>num_ref_frames) { + last_pic->next = pic->next; + free_decoded_picture(pic); + pic = last_pic; + dpb->used--; + } else + last_pic = pic; + } while ((pic = pic->next) != NULL); + } return 0; } @@ -191,11 +211,13 @@ int dpb_flush(struct dpb *dpb) if (pic != NULL) do { //FIXME: free the picture - + free_decoded_picture(last_pic); last_pic = pic; } while ((pic = pic->next) != NULL); + free_decoded_picture(last_pic); dpb->pictures = NULL; + dpb->used = NULL; return 0; } diff --git a/src/libvdpau/dpb.h b/src/libvdpau/dpb.h index 857f2fa5f..ace624e32 100644 --- a/src/libvdpau/dpb.h +++ b/src/libvdpau/dpb.h @@ -23,6 +23,7 @@ struct decoded_picture { /* Decoded Picture Buffer */ struct dpb { struct decoded_picture *pictures; + uint32_t used; }; struct decoded_picture* init_decoded_picture(struct nal_unit *src_nal, @@ -36,7 +37,7 @@ int dpb_remove_picture(struct dpb *dpb, uint32_t picnum); int dpb_remove_picture_by_ltpn(struct dpb *dpb, uint32_t longterm_picnum); int dpb_remove_picture_by_ltidx(struct dpb *dpb, uint32_t longterm_idx); int dpb_remove_ltidx_gt(struct dpb *dpb, uint32_t longterm_max); -int dpb_add_picture(struct dpb *dpb, struct decoded_picture *pic); +int dpb_add_picture(struct dpb *dpb, struct decoded_picture *pic, uint32_t num_ref_frames); int dpb_flush(struct dpb *dpb); void fill_vdpau_reference_list(struct dpb *dpb, VdpReferenceFrameH264 *reflist); diff --git a/src/libvdpau/vdpau_h264.c b/src/libvdpau/vdpau_h264.c index b53e77551..112496168 100644 --- a/src/libvdpau/vdpau_h264.c +++ b/src/libvdpau/vdpau_h264.c @@ -140,19 +140,21 @@ static inline void dump_pictureinfo_h264(VdpPictureInfoH264 *pic) printf("\n"); } printf("\n"); - } + }*/ + int i; for(i = 0; i < 16; i++) { + if(pic->referenceFrames[i].surface != VDP_INVALID_HANDLE) { printf("-------------------\n"); - printf("Reference Frame %d:\n", i); + printf("Reference Frame %d:\n", i); printf("frame_idx: %d\n", pic->referenceFrames[i].frame_idx); printf("field_order_cnt[0]: %d\n", pic->referenceFrames[i].field_order_cnt[0]); printf("field_order_cnt[1]: %d\n", pic->referenceFrames[i].field_order_cnt[0]); printf("is_long_term: %d\n", pic->referenceFrames[i].is_long_term); printf("top_is_reference: %d\n", pic->referenceFrames[i].top_is_reference); printf("bottom_is_reference: %d\n", pic->referenceFrames[i].bottom_is_reference); - printf("-------------------\n"); - }*/ + } + } /*memcpy(pic.scaling_lists_4x4, pps->scaling_lists_4x4, 6*16); memcpy(pic.scaling_lists_8x8, pps->scaling_lists_8x8, 2*64); memcpy(pic.referenceFrames, this->reference_frames, sizeof(this->reference_frames));*/ @@ -301,7 +303,7 @@ static void vdpau_h264_decode_data (video_decoder_t *this_gen, if(!this->decoder_started) this->decoder_started = 1; - //dump_pictureinfo_h264(&pic); + dump_pictureinfo_h264(&pic); /*int i; printf("Decode data: \n"); @@ -319,10 +321,13 @@ static void vdpau_h264_decode_data (video_decoder_t *this_gen, if(img == NULL) { + printf("Acquire image: "); + fflush(stdout); img = this->stream->video_out->get_frame (this->stream->video_out, this->width, this->height, this->ratio, XINE_IMGFMT_VDPAU, VO_BOTH_FIELDS); + printf("OK\n"); this->vdpau_accel = (vdpau_accel_t*)img->accel_data; } @@ -354,7 +359,7 @@ static void vdpau_h264_decode_data (video_decoder_t *this_gen, if(pic.is_reference) { struct decoded_picture *pic = init_decoded_picture(this->nal_parser->current_nal, surface, img); - dpb_add_picture(&(this->nal_parser->dpb), pic); + dpb_add_picture(&(this->nal_parser->dpb), pic, sps->num_ref_frames); } else { img->free(img); } |