]> git.sesse.net Git - ffmpeg/blobdiff - libavcodec/avrndec.c
avcodec: Constify AVCodecs
[ffmpeg] / libavcodec / avrndec.c
index 104ff2d9048ee12f0f1d0467bbd27b59bd43717f..70e34c617dd37fe804d99e59a6c8ee710f5a4a58 100644 (file)
 
 #include "avcodec.h"
 #include "internal.h"
-#include "mjpeg.h"
-#include "mjpegdec.h"
 #include "libavutil/imgutils.h"
 
 typedef struct {
-    AVCodecContext *mjpeg_avctx;
-    int is_mjpeg;
     int interlace;
     int tff;
 } AVRnContext;
@@ -37,40 +33,6 @@ static av_cold int init(AVCodecContext *avctx)
     AVRnContext *a = avctx->priv_data;
     int ret;
 
-    // Support "Resolution 1:1" for Avid AVI Codec
-    a->is_mjpeg = avctx->extradata_size < 31 || memcmp(&avctx->extradata[28], "1:1", 3);
-
-    if(!a->is_mjpeg && avctx->lowres) {
-        av_log(avctx, AV_LOG_ERROR, "lowres is not possible with rawvideo\n");
-        return AVERROR(EINVAL);
-    }
-
-    if(a->is_mjpeg) {
-        AVCodec *codec = avcodec_find_decoder(AV_CODEC_ID_MJPEG);
-        AVDictionary *thread_opt = NULL;
-        if (!codec) {
-            av_log(avctx, AV_LOG_ERROR, "MJPEG codec not found\n");
-            return AVERROR_DECODER_NOT_FOUND;
-        }
-
-        a->mjpeg_avctx = avcodec_alloc_context3(codec);
-
-        av_dict_set(&thread_opt, "threads", "1", 0); // Is this needed ?
-        a->mjpeg_avctx->refcounted_frames = 1;
-        a->mjpeg_avctx->flags = avctx->flags;
-        a->mjpeg_avctx->idct_algo = avctx->idct_algo;
-        a->mjpeg_avctx->lowres = avctx->lowres;
-        a->mjpeg_avctx->width = avctx->width;
-        a->mjpeg_avctx->height = avctx->height;
-
-        if ((ret = ff_codec_open2_recursive(a->mjpeg_avctx, codec, &thread_opt)) < 0) {
-            av_log(avctx, AV_LOG_ERROR, "MJPEG codec failed to open\n");
-        }
-        av_dict_free(&thread_opt);
-
-        return ret;
-    }
-
     if ((ret = av_image_check_size(avctx->width, avctx->height, 0, avctx)) < 0)
         return ret;
 
@@ -87,16 +49,6 @@ static av_cold int init(AVCodecContext *avctx)
     return 0;
 }
 
-static av_cold int end(AVCodecContext *avctx)
-{
-    AVRnContext *a = avctx->priv_data;
-
-    avcodec_close(a->mjpeg_avctx);
-    av_freep(&a->mjpeg_avctx);
-
-    return 0;
-}
-
 static int decode_frame(AVCodecContext *avctx, void *data,
                         int *got_frame, AVPacket *avpkt)
 {
@@ -106,28 +58,6 @@ static int decode_frame(AVCodecContext *avctx, void *data,
     int buf_size       = avpkt->size;
     int y, ret, true_height;
 
-    if(a->is_mjpeg) {
-        ret = avcodec_decode_video2(a->mjpeg_avctx, data, got_frame, avpkt);
-
-        if (ret >= 0 && *got_frame && avctx->width <= p->width && avctx->height <= p->height) {
-            int shift = p->height - avctx->height;
-            int subsample_h, subsample_v;
-
-            av_pix_fmt_get_chroma_sub_sample(p->format, &subsample_h, &subsample_v);
-
-            p->data[0] += p->linesize[0] * shift;
-            if (p->data[2]) {
-                p->data[1] += p->linesize[1] * (shift>>subsample_v);
-                p->data[2] += p->linesize[2] * (shift>>subsample_v);
-            }
-
-            p->width  = avctx->width;
-            p->height = avctx->height;
-        }
-        avctx->pix_fmt = a->mjpeg_avctx->pix_fmt;
-        return ret;
-    }
-
     true_height    = buf_size / (2*avctx->width);
 
     if(buf_size < 2*avctx->width * avctx->height) {
@@ -159,15 +89,14 @@ static int decode_frame(AVCodecContext *avctx, void *data,
     return buf_size;
 }
 
-AVCodec ff_avrn_decoder = {
+const AVCodec ff_avrn_decoder = {
     .name           = "avrn",
     .long_name      = NULL_IF_CONFIG_SMALL("Avid AVI Codec"),
     .type           = AVMEDIA_TYPE_VIDEO,
     .id             = AV_CODEC_ID_AVRN,
     .priv_data_size = sizeof(AVRnContext),
     .init           = init,
-    .close          = end,
     .decode         = decode_frame,
-    .max_lowres     = 3,
-    .caps_internal  = FF_CODEC_CAP_INIT_THREADSAFE,
+    .capabilities   = AV_CODEC_CAP_DR1,
+    .caps_internal  = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP,
 };