summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/libvdpau/dpb.c28
-rw-r--r--src/libvdpau/dpb.h3
-rw-r--r--src/libvdpau/vdpau_h264.c17
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);
}