Commit b93cb838 authored by Michael Niedermayer's avatar Michael Niedermayer

lavc: add ff_init_buffer_info()

Fixes seeking per fileposition in ffplay.
Signed-off-by: 's avatarMichael Niedermayer <michaelni@gmx.at>
parent 5ec55d21
...@@ -55,4 +55,9 @@ int ff_match_2uint16(const uint16_t (*tab)[2], int size, int a, int b); ...@@ -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 @@ ...@@ -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) ...@@ -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){ ...@@ -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) ...@@ -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);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment