diff options
Diffstat (limited to 'src/libvdpau/dpb.c')
-rw-r--r-- | src/libvdpau/dpb.c | 34 |
1 files changed, 25 insertions, 9 deletions
diff --git a/src/libvdpau/dpb.c b/src/libvdpau/dpb.c index 00dd1a580..bbcfe4a9d 100644 --- a/src/libvdpau/dpb.c +++ b/src/libvdpau/dpb.c @@ -47,7 +47,7 @@ struct decoded_picture* dpb_get_next_out_picture(struct dpb *dpb) if (pic != NULL) do { - if (pic->img->pts < outpic->img->pts) + if (pic->nal->top_field_order_cnt < outpic->nal->top_field_order_cnt) outpic = pic; } while ((pic = pic->next) != NULL); @@ -97,6 +97,22 @@ struct decoded_picture* dpb_get_picture_by_ltidx(struct dpb *dpb, return NULL; } +int dpb_set_unused_ref_picture_a(struct dpb *dpb, struct decoded_picture *refpic) +{ + struct decoded_picture *pic = dpb->pictures; + if (pic != NULL) + do { + if (pic == refpic) { + pic->used_for_reference = 0; + if(!pic->delayed_output) + dpb_remove_picture(dpb, pic); + return 0; + } + } while ((pic = pic->next) != NULL); + + return -1; +} + int dpb_set_unused_ref_picture(struct dpb *dpb, uint32_t picnum) { struct decoded_picture *pic = dpb->pictures; @@ -256,14 +272,14 @@ int dpb_flush(struct dpb *dpb) if (pic != NULL) do { - dpb->pictures = pic->next; - free_decoded_picture(pic); - pic = dpb->pictures; - dpb->used--; - } while (dpb->pictures != NULL); - - dpb->pictures = NULL; - dpb->used = 0; + struct decoded_picture *next_pic = pic->next; + dpb_set_unused_ref_picture_a(dpb, pic); + pic = next_pic; + } while (pic != NULL); + + printf("Flushed, used: %d\n", dpb->used); + //dpb->pictures = NULL; + //dpb->used = 0; return 0; } |