Fixes seeking per fileposition in ffplay. Signed-off-by: Michael Niedermayer <michaelni@gmx.at>tags/n0.9
| @@ -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); | 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 */ | #endif /* AVCODEC_INTERNAL_H */ | ||||
| @@ -32,6 +32,7 @@ | |||||
| #include <pthread.h> | #include <pthread.h> | ||||
| #include "avcodec.h" | #include "avcodec.h" | ||||
| #include "internal.h" | |||||
| #include "thread.h" | #include "thread.h" | ||||
| typedef int (action_func)(AVCodecContext *c, void *arg); | typedef int (action_func)(AVCodecContext *c, void *arg); | ||||
| @@ -787,6 +788,8 @@ int ff_thread_get_buffer(AVCodecContext *avctx, AVFrame *f) | |||||
| f->owner = avctx; | f->owner = avctx; | ||||
| ff_init_buffer_info(avctx, f); | |||||
| if (!(avctx->active_thread_type&FF_THREAD_FRAME)) { | if (!(avctx->active_thread_type&FF_THREAD_FRAME)) { | ||||
| f->thread_opaque = NULL; | f->thread_opaque = NULL; | ||||
| return avctx->get_buffer(avctx, f); | return avctx->get_buffer(avctx, f); | ||||
| @@ -238,6 +238,22 @@ void avcodec_align_dimensions(AVCodecContext *s, int *width, int *height){ | |||||
| *width=FFALIGN(*width, align); | *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 avcodec_default_get_buffer(AVCodecContext *s, AVFrame *pic){ | ||||
| int i; | int i; | ||||
| int w= s->width; | int w= s->width; | ||||
| @@ -1357,6 +1373,9 @@ unsigned int ff_toupper4(unsigned int x) | |||||
| int ff_thread_get_buffer(AVCodecContext *avctx, AVFrame *f) | int ff_thread_get_buffer(AVCodecContext *avctx, AVFrame *f) | ||||
| { | { | ||||
| f->owner = avctx; | f->owner = avctx; | ||||
| ff_init_buffer_info(avctx, f); | |||||
| return avctx->get_buffer(avctx, f); | return avctx->get_buffer(avctx, f); | ||||
| } | } | ||||