diff options
author | Anton Khirnov <anton@khirnov.net> | 2020-12-12 15:09:10 +0100 |
---|---|---|
committer | Anton Khirnov <anton@khirnov.net> | 2021-02-25 11:46:28 +0100 |
commit | 9e4225cf7f26b57e0054470127bcc032b6d29742 (patch) | |
tree | c13c00b8ca9669abd8a8d1d194e546c72184c990 /libavcodec/avrndec.c | |
parent | ae4f6379d6b52e480e4ad335e0a71292effdf839 (diff) |
Handle AVID MJPEG streams directly in the MJPEG decoder.
AVID streams - currently handled by the AVRN decoder - can be (depending
on extradata contents) either MJPEG or raw video. To decode the MJPEG
variant, the AVRN decoder currently instantiates a MJPEG decoder
internally and forwards decoded frames to the caller (possibly after
cropping them).
This is suboptimal, because the AVRN decoder does not forward all the
features of the internal MJPEG decoder, such as direct rendering.
Handling such forwarding in a full and generic manner would be quite
hard, so it is simpler to just handle those streams in the MJPEG decoder
directly.
The AVRN decoder, which now handles only the raw streams, can now be
marked as supporting direct rendering.
This also removes the last remaining internal use of the obsolete
decoding API.
Diffstat (limited to 'libavcodec/avrndec.c')
-rw-r--r-- | libavcodec/avrndec.c | 71 |
1 files changed, 1 insertions, 70 deletions
diff --git a/libavcodec/avrndec.c b/libavcodec/avrndec.c index 9380d86885..26cf6b752c 100644 --- a/libavcodec/avrndec.c +++ b/libavcodec/avrndec.c @@ -24,8 +24,6 @@ #include "libavutil/imgutils.h" typedef struct { - AVCodecContext *mjpeg_avctx; - int is_mjpeg; int interlace; int tff; } AVRnContext; @@ -35,42 +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) { - const 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); - if (!a->mjpeg_avctx) - return AVERROR(ENOMEM); - - 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 = avcodec_open2(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,15 +49,6 @@ static av_cold int init(AVCodecContext *avctx) return 0; } -static av_cold int end(AVCodecContext *avctx) -{ - AVRnContext *a = avctx->priv_data; - - avcodec_free_context(&a->mjpeg_avctx); - - return 0; -} - static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt) { @@ -105,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) { @@ -165,8 +96,8 @@ AVCodec ff_avrn_decoder = { .id = AV_CODEC_ID_AVRN, .priv_data_size = sizeof(AVRnContext), .init = init, - .close = end, .decode = decode_frame, .max_lowres = 3, + .capabilities = AV_CODEC_CAP_DR1, .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP, }; |