From b93cb8383fec0aa95b735fcd97eff03425e79bc1 Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Fri, 7 Oct 2011 02:11:06 +0200 Subject: [PATCH] lavc: add ff_init_buffer_info() Fixes seeking per fileposition in ffplay. Signed-off-by: Michael Niedermayer --- libavcodec/internal.h | 5 +++++ libavcodec/pthread.c | 3 +++ libavcodec/utils.c | 19 +++++++++++++++++++ 3 files changed, 27 insertions(+) diff --git a/libavcodec/internal.h b/libavcodec/internal.h index 75d7f37716..68f49b5f1e 100644 --- a/libavcodec/internal.h +++ b/libavcodec/internal.h @@ -55,4 +55,9 @@ int ff_match_2uint16(const uint16_t (*tab)[2], int size, int a, int b); unsigned int ff_toupper4(unsigned int x); +/** + * does needed setup of pkt_pts/pos and such for (re)get_buffer(); + */ +void ff_init_buffer_info(AVCodecContext *s, AVFrame *pic); + #endif /* AVCODEC_INTERNAL_H */ diff --git a/libavcodec/pthread.c b/libavcodec/pthread.c index 08104914ee..454e51f555 100644 --- a/libavcodec/pthread.c +++ b/libavcodec/pthread.c @@ -32,6 +32,7 @@ #include #include "avcodec.h" +#include "internal.h" #include "thread.h" typedef int (action_func)(AVCodecContext *c, void *arg); @@ -787,6 +788,8 @@ int ff_thread_get_buffer(AVCodecContext *avctx, AVFrame *f) f->owner = avctx; + ff_init_buffer_info(avctx, f); + if (!(avctx->active_thread_type&FF_THREAD_FRAME)) { f->thread_opaque = NULL; return avctx->get_buffer(avctx, f); diff --git a/libavcodec/utils.c b/libavcodec/utils.c index 8af4c338fd..f28b024c25 100644 --- a/libavcodec/utils.c +++ b/libavcodec/utils.c @@ -238,6 +238,22 @@ void avcodec_align_dimensions(AVCodecContext *s, int *width, int *height){ *width=FFALIGN(*width, align); } +void ff_init_buffer_info(AVCodecContext *s, AVFrame *pic) +{ + if (s->pkt) { + pic->pkt_pts = s->pkt->pts; + pic->pkt_pos = s->pkt->pos; + } else { + pic->pkt_pts = AV_NOPTS_VALUE; + pic->pkt_pos = -1; + } + pic->reordered_opaque= s->reordered_opaque; + pic->sample_aspect_ratio = s->sample_aspect_ratio; + pic->width = s->width; + pic->height = s->height; + pic->format = s->pix_fmt; +} + int avcodec_default_get_buffer(AVCodecContext *s, AVFrame *pic){ int i; int w= s->width; @@ -1357,6 +1373,9 @@ unsigned int ff_toupper4(unsigned int x) int ff_thread_get_buffer(AVCodecContext *avctx, AVFrame *f) { f->owner = avctx; + + ff_init_buffer_info(avctx, f); + return avctx->get_buffer(avctx, f); }