summaryrefslogtreecommitdiffstats
path: root/video/decode/lavc_dr1.c
diff options
context:
space:
mode:
Diffstat (limited to 'video/decode/lavc_dr1.c')
-rw-r--r--video/decode/lavc_dr1.c297
1 files changed, 0 insertions, 297 deletions
diff --git a/video/decode/lavc_dr1.c b/video/decode/lavc_dr1.c
deleted file mode 100644
index f730a6c231..0000000000
--- a/video/decode/lavc_dr1.c
+++ /dev/null
@@ -1,297 +0,0 @@
-/*
- * Various utilities for command line tools
- * Copyright (c) 2000-2003 Fabrice Bellard
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with FFmpeg; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-
-/*
- * NOTE: this file is for compatibility with older versions of
- * libavcodec, before AVFrame reference counting was introduced.
- * It is not compiled if libavcodec is new enough.
- */
-
-#include <string.h>
-#include <stdlib.h>
-#include <errno.h>
-#include <math.h>
-#include <pthread.h>
-
-#include <libavcodec/avcodec.h>
-#include <libavutil/avassert.h>
-#include <libavutil/mathematics.h>
-#include <libavutil/imgutils.h>
-#include <libavutil/pixdesc.h>
-#include <libavutil/common.h>
-
-#include "config.h"
-
-#include "lavc.h"
-#include "video/decode/dec_video.h"
-
-static pthread_mutex_t pool_mutex = PTHREAD_MUTEX_INITIALIZER;
-#define pool_lock() pthread_mutex_lock(&pool_mutex)
-#define pool_unlock() pthread_mutex_unlock(&pool_mutex)
-
-typedef struct FramePool {
- struct FrameBuffer *list;
- // used to deal with frames that live past the time the pool should live
- int dead;
- int refcount; // number of allocated buffers (not in list)
-} FramePool;
-
-typedef struct FrameBuffer {
- uint8_t *base[4];
- uint8_t *data[4];
- int linesize[4];
-
- int h, w;
- int pix_fmt;
-
- int used_by_decoder, needed_by_decoder;
- int refcount;
- struct FramePool *pool;
- struct FrameBuffer *next;
-} FrameBuffer;
-
-
-static int alloc_buffer(FramePool *pool, AVCodecContext *s)
-{
- const AVPixFmtDescriptor *desc = &av_pix_fmt_descriptors[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;
- }
- /* XXX this shouldn't be needed, but some tests break without this line
- * those decoders are buggy and need to be fixed.
- * the following tests fail:
- * cdgraphics, ansi, aasc, fraps-v1, qtrle-1bit
- */
- memset(buf->base[0], 128, 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;
-
- buf->next = pool->list;
- pool->list = buf;
- return 0;
-}
-
-int mp_codec_get_buffer(AVCodecContext *s, AVFrame *frame)
-{
- struct dec_video *vd = s->opaque;
- struct lavc_ctx *ctx = vd->priv;
-
- if (!ctx->dr1_buffer_pool) {
- ctx->dr1_buffer_pool = av_mallocz(sizeof(*ctx->dr1_buffer_pool));
- if (!ctx->dr1_buffer_pool)
- return AVERROR(ENOMEM);
- }
-
- FramePool *pool = ctx->dr1_buffer_pool;
- 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;
- }
-
- pool_lock();
-
- if (!pool->list && (ret = alloc_buffer(pool, s)) < 0) {
- pool_unlock();
- return ret;
- }
-
- buf = pool->list;
- if (buf->w != s->width || buf->h != s->height || buf->pix_fmt != s->pix_fmt) {
- pool->list = buf->next;
- av_freep(&buf->base[0]);
- av_free(buf);
- if ((ret = alloc_buffer(pool, s)) < 0) {
- pool_unlock();
- return ret;
- }
- buf = pool->list;
- }
- av_assert0(!buf->refcount);
- buf->refcount++;
-
- pool->list = buf->next;
- pool->refcount++;
-
- pool_unlock();
-
- frame->opaque = buf;
- frame->type = FF_BUFFER_TYPE_USER;
- frame->extended_data = frame->data;
-
- buf->used_by_decoder = buf->needed_by_decoder = 1;
- if (frame->buffer_hints & FF_BUFFER_HINTS_VALID) {
- buf->needed_by_decoder =
- (frame->buffer_hints & FF_BUFFER_HINTS_PRESERVE) ||
- (frame->buffer_hints & FF_BUFFER_HINTS_REUSABLE);
- } else {
- buf->needed_by_decoder = !!frame->reference;
- }
-
- 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;
-}
-
-void mp_buffer_ref(struct FrameBuffer *buf)
-{
- pool_lock();
- buf->refcount++;
- pool_unlock();
-}
-
-bool mp_buffer_check(struct FrameBuffer *buf)
-{
- pool_lock();
- bool ok = buf->refcount > 0;
- if (ok)
- buf->refcount++;
- pool_unlock();
- return ok;
-}
-
-void mp_buffer_unref(struct FrameBuffer *buf)
-{
- FramePool *pool = buf->pool;
- bool pool_dead;
-
- pool_lock();
-
- av_assert0(pool->refcount > 0);
- av_assert0(buf->refcount > 0);
- buf->refcount--;
- if (!buf->refcount) {
- FrameBuffer *tmp;
- for(tmp= pool->list; tmp; tmp= tmp->next)
- av_assert1(tmp != buf);
-
- buf->next = pool->list;
- pool->list = buf;
- pool->refcount--;
- }
-
- pool_dead = pool->dead && pool->refcount == 0;
- pool_unlock();
-
- if (pool_dead)
- mp_buffer_pool_free(&pool);
-}
-
-bool mp_buffer_is_unique(struct FrameBuffer *buf)
-{
- int refcount;
- pool_lock();
- refcount = buf->refcount;
- // Decoder has a reference, but doesn't want to use it. (ffmpeg has no good
- // way of transferring frame ownership to the user.)
- if (buf->used_by_decoder && !buf->needed_by_decoder)
- refcount--;
- pool_unlock();
- return refcount == 1;
-}
-
-void mp_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;
- }
-
- buf->used_by_decoder = buf->needed_by_decoder = 0;
-
- for (i = 0; i < FF_ARRAY_ELEMS(frame->data); i++)
- frame->data[i] = NULL;
-
- mp_buffer_unref(buf);
-}
-
-void mp_buffer_pool_free(struct FramePool **p_pool)
-{
- struct FramePool *pool = *p_pool;
- if (!pool)
- return;
-
- pool_lock();
-
- while (pool->list) {
- FrameBuffer *buf = pool->list;
- pool->list = buf->next;
- av_assert0(buf->refcount == 0);
- av_freep(&buf->base[0]);
- av_free(buf);
- }
- pool->dead = 1;
- if (pool->refcount == 0)
- av_free(pool);
-
- pool_unlock();
-
- *p_pool = NULL;
-}