lavc/avconv: support changing frame sizes in codecs with frame mt.

Signed-off-by: Anton Khirnov <anton@khirnov.net>
pull/4/head
Ronald S. Bultje 13 years ago committed by Anton Khirnov
parent e20ad71ebb
commit bc1ef85520
  1. 11
      avconv.c
  2. 4
      libavcodec/pthread.c
  3. 9
      libavcodec/utils.c

@ -424,9 +424,8 @@ static void reset_options(OptionsContext *o)
init_opts(); init_opts();
} }
static int alloc_buffer(InputStream *ist, FrameBuffer **pbuf) static int alloc_buffer(InputStream *ist, AVCodecContext *s, FrameBuffer **pbuf)
{ {
AVCodecContext *s = ist->st->codec;
FrameBuffer *buf = av_mallocz(sizeof(*buf)); FrameBuffer *buf = av_mallocz(sizeof(*buf));
int i, ret; int i, ret;
const int pixel_size = av_pix_fmt_descriptors[s->pix_fmt].comp[0].step_minus1+1; const int pixel_size = av_pix_fmt_descriptors[s->pix_fmt].comp[0].step_minus1+1;
@ -502,7 +501,7 @@ static int codec_get_buffer(AVCodecContext *s, AVFrame *frame)
FrameBuffer *buf; FrameBuffer *buf;
int ret, i; int ret, i;
if (!ist->buffer_pool && (ret = alloc_buffer(ist, &ist->buffer_pool)) < 0) if (!ist->buffer_pool && (ret = alloc_buffer(ist, s, &ist->buffer_pool)) < 0)
return ret; return ret;
buf = ist->buffer_pool; buf = ist->buffer_pool;
@ -511,7 +510,7 @@ static int codec_get_buffer(AVCodecContext *s, AVFrame *frame)
if (buf->w != s->width || buf->h != s->height || buf->pix_fmt != s->pix_fmt) { if (buf->w != s->width || buf->h != s->height || buf->pix_fmt != s->pix_fmt) {
av_freep(&buf->base[0]); av_freep(&buf->base[0]);
av_free(buf); av_free(buf);
if ((ret = alloc_buffer(ist, &buf)) < 0) if ((ret = alloc_buffer(ist, s, &buf)) < 0)
return ret; return ret;
} }
buf->refcount++; buf->refcount++;
@ -520,6 +519,10 @@ static int codec_get_buffer(AVCodecContext *s, AVFrame *frame)
frame->type = FF_BUFFER_TYPE_USER; frame->type = FF_BUFFER_TYPE_USER;
frame->extended_data = frame->data; frame->extended_data = frame->data;
frame->pkt_pts = s->pkt ? s->pkt->pts : AV_NOPTS_VALUE; frame->pkt_pts = s->pkt ? s->pkt->pts : AV_NOPTS_VALUE;
frame->width = buf->w;
frame->height = buf->h;
frame->format = buf->pix_fmt;
frame->sample_aspect_ratio = s->sample_aspect_ratio;
for (i = 0; i < FF_ARRAY_ELEMS(buf->data); i++) { for (i = 0; i < FF_ARRAY_ELEMS(buf->data); i++) {
frame->base[i] = buf->base[i]; // XXX h264.c uses base though it shouldn't frame->base[i] = buf->base[i]; // XXX h264.c uses base though it shouldn't

@ -630,10 +630,6 @@ int ff_thread_decode_frame(AVCodecContext *avctx,
*picture = p->frame; *picture = p->frame;
*got_picture_ptr = p->got_frame; *got_picture_ptr = p->got_frame;
picture->pkt_dts = p->avpkt.dts; picture->pkt_dts = p->avpkt.dts;
picture->sample_aspect_ratio = avctx->sample_aspect_ratio;
picture->width = avctx->width;
picture->height = avctx->height;
picture->format = avctx->pix_fmt;
/* /*
* A later call with avkpt->size == 0 may loop over all threads, * A later call with avkpt->size == 0 may loop over all threads,

@ -392,11 +392,6 @@ static int video_get_buffer(AVCodecContext *s, AVFrame *pic)
buf = &avci->buffer[avci->buffer_count]; buf = &avci->buffer[avci->buffer_count];
if(buf->base[0] && (buf->width != w || buf->height != h || buf->pix_fmt != s->pix_fmt)){ if(buf->base[0] && (buf->width != w || buf->height != h || buf->pix_fmt != s->pix_fmt)){
if(s->active_thread_type&FF_THREAD_FRAME) {
av_log_missing_feature(s, "Width/height changing with frame threads is", 0);
return -1;
}
for (i = 0; i < AV_NUM_DATA_POINTERS; i++) { for (i = 0; i < AV_NUM_DATA_POINTERS; i++) {
av_freep(&buf->base[i]); av_freep(&buf->base[i]);
buf->data[i]= NULL; buf->data[i]= NULL;
@ -480,6 +475,10 @@ static int video_get_buffer(AVCodecContext *s, AVFrame *pic)
} }
pic->extended_data = pic->data; pic->extended_data = pic->data;
avci->buffer_count++; avci->buffer_count++;
pic->width = buf->width;
pic->height = buf->height;
pic->format = buf->pix_fmt;
pic->sample_aspect_ratio = s->sample_aspect_ratio;
if(s->pkt) pic->pkt_pts= s->pkt->pts; if(s->pkt) pic->pkt_pts= s->pkt->pts;
else pic->pkt_pts= AV_NOPTS_VALUE; else pic->pkt_pts= AV_NOPTS_VALUE;

Loading…
Cancel
Save