diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2013-03-12 16:40:42 +0400 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2013-03-12 17:16:02 +0400 |
commit | 32fdfdfbdac64c57b12910521af1379a24d01f73 (patch) | |
tree | 865ec201a41ac45d0ce0c58b3d7ea9a438d20d08 /cmdutils.c | |
parent | 3c1326411d6ffd2f30c0d6e8cc32d34b5ed5a518 (diff) | |
parent | 354468fc12dcf93e7fb4af552e18906771913273 (diff) |
Merge commit '354468fc12dcf93e7fb4af552e18906771913273'
* commit '354468fc12dcf93e7fb4af552e18906771913273':
avplay: switch to new refcounted frames API
avconv: convert to new refcounted AVFrame API
Conflicts:
cmdutils.c
ffmpeg.c
ffmpeg.h
ffplay.c
Merged-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'cmdutils.c')
-rw-r--r-- | cmdutils.c | 141 |
1 files changed, 0 insertions, 141 deletions
diff --git a/cmdutils.c b/cmdutils.c index 3a094f0b6a..9bbb837148 100644 --- a/cmdutils.c +++ b/cmdutils.c @@ -1826,144 +1826,3 @@ void *grow_array(void *array, int elem_size, int *size, int new_size) } return array; } - -static int alloc_buffer(FrameBuffer **pool, AVCodecContext *s, FrameBuffer **pbuf) -{ - const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(s->pix_fmt); - FrameBuffer *buf; - int i, ret; - int pixel_size; - int h_chroma_shift, v_chroma_shift; - int edge = 32; // XXX should be avcodec_get_edge_width(), but that fails on svq1 - int w = s->width, h = s->height; - - if (!desc) - return AVERROR(EINVAL); - pixel_size = desc->comp[0].step_minus1 + 1; - - buf = av_mallocz(sizeof(*buf)); - if (!buf) - return AVERROR(ENOMEM); - - avcodec_align_dimensions(s, &w, &h); - - if (!(s->flags & CODEC_FLAG_EMU_EDGE)) { - w += 2*edge; - h += 2*edge; - } - - if ((ret = av_image_alloc(buf->base, buf->linesize, w, h, - s->pix_fmt, 32)) < 0) { - av_freep(&buf); - av_log(s, AV_LOG_ERROR, "alloc_buffer: av_image_alloc() failed\n"); - return ret; - } - - avcodec_get_chroma_sub_sample(s->pix_fmt, &h_chroma_shift, &v_chroma_shift); - for (i = 0; i < FF_ARRAY_ELEMS(buf->data); i++) { - const int h_shift = i==0 ? 0 : h_chroma_shift; - const int v_shift = i==0 ? 0 : v_chroma_shift; - if ((s->flags & CODEC_FLAG_EMU_EDGE) || !buf->linesize[i] || !buf->base[i]) - buf->data[i] = buf->base[i]; - else - buf->data[i] = buf->base[i] + - FFALIGN((buf->linesize[i]*edge >> v_shift) + - (pixel_size*edge >> h_shift), 32); - } - buf->w = s->width; - buf->h = s->height; - buf->pix_fmt = s->pix_fmt; - buf->pool = pool; - - *pbuf = buf; - return 0; -} - -int codec_get_buffer(AVCodecContext *s, AVFrame *frame) -{ - FrameBuffer **pool = s->opaque; - FrameBuffer *buf; - int ret, i; - - if(av_image_check_size(s->width, s->height, 0, s) || s->pix_fmt<0) { - av_log(s, AV_LOG_ERROR, "codec_get_buffer: image parameters invalid\n"); - return -1; - } - - if (!*pool && (ret = alloc_buffer(pool, s, pool)) < 0) - return ret; - - buf = *pool; - *pool = buf->next; - buf->next = NULL; - if (buf->w != s->width || buf->h != s->height || buf->pix_fmt != s->pix_fmt) { - av_freep(&buf->base[0]); - av_free(buf); - if ((ret = alloc_buffer(pool, s, &buf)) < 0) - return ret; - } - av_assert0(!buf->refcount); - buf->refcount++; - - frame->opaque = buf; - frame->type = FF_BUFFER_TYPE_USER; - frame->extended_data = frame->data; - - 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->data[i] = buf->data[i]; - frame->linesize[i] = buf->linesize[i]; - } - - return 0; -} - -static void unref_buffer(FrameBuffer *buf) -{ - FrameBuffer **pool = buf->pool; - - av_assert0(buf->refcount > 0); - buf->refcount--; - if (!buf->refcount) { - FrameBuffer *tmp; - for(tmp= *pool; tmp; tmp= tmp->next) - av_assert1(tmp != buf); - - buf->next = *pool; - *pool = buf; - } -} - -void codec_release_buffer(AVCodecContext *s, AVFrame *frame) -{ - FrameBuffer *buf = frame->opaque; - int i; - - if(frame->type!=FF_BUFFER_TYPE_USER) { - avcodec_default_release_buffer(s, frame); - return; - } - - for (i = 0; i < FF_ARRAY_ELEMS(frame->data); i++) - frame->data[i] = NULL; - - unref_buffer(buf); -} - -void filter_release_buffer(AVFilterBuffer *fb) -{ - FrameBuffer *buf = fb->priv; - av_free(fb); - unref_buffer(buf); -} - -void free_buffer_pool(FrameBuffer **pool) -{ - FrameBuffer *buf = *pool; - while (buf) { - *pool = buf->next; - av_freep(&buf->base[0]); - av_free(buf); - buf = *pool; - } -} |