X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fzerocodec.c;h=89c869cc5f2ef3a12f067c7ce104333d145fed1c;hb=7f596368a404363d72b1be6d16c51420a71bc523;hp=c6a9ba94a2d55f7fba64d8e80c859078c29f371a;hpb=716d413c13981da15323c7a3821860536eefdbbb;p=ffmpeg diff --git a/libavcodec/zerocodec.c b/libavcodec/zerocodec.c index c6a9ba94a2d..89c869cc5f2 100644 --- a/libavcodec/zerocodec.c +++ b/libavcodec/zerocodec.c @@ -19,26 +19,24 @@ #include #include "avcodec.h" +#include "internal.h" #include "libavutil/common.h" -typedef struct { - AVFrame previous_frame; +typedef struct ZeroCodecContext { + AVFrame *previous_frame; z_stream zstream; - int size; } ZeroCodecContext; static int zerocodec_decode_frame(AVCodecContext *avctx, void *data, - int *data_size, AVPacket *avpkt) + int *got_frame, AVPacket *avpkt) { ZeroCodecContext *zc = avctx->priv_data; - AVFrame *pic = avctx->coded_frame; - AVFrame *prev_pic = &zc->previous_frame; + AVFrame *pic = data; + AVFrame *prev_pic = zc->previous_frame; z_stream *zstream = &zc->zstream; uint8_t *prev = prev_pic->data[0]; uint8_t *dst; - int i, j, zret; - - pic->reference = 3; + int i, j, zret, ret; if (avpkt->flags & AV_PKT_FLAG_KEY) { pic->key_frame = 1; @@ -48,6 +46,9 @@ static int zerocodec_decode_frame(AVCodecContext *avctx, void *data, av_log(avctx, AV_LOG_ERROR, "Missing reference frame.\n"); return AVERROR_INVALIDDATA; } + + prev += (avctx->height - 1) * prev_pic->linesize[0]; + pic->key_frame = 0; pic->pict_type = AV_PICTURE_TYPE_P; } @@ -58,7 +59,7 @@ static int zerocodec_decode_frame(AVCodecContext *avctx, void *data, return AVERROR_INVALIDDATA; } - if (avctx->get_buffer(avctx, pic) < 0) { + if (ff_get_buffer(avctx, pic, AV_GET_BUFFER_FLAG_REF) < 0) { av_log(avctx, AV_LOG_ERROR, "Could not allocate buffer.\n"); return AVERROR(ENOMEM); } @@ -66,7 +67,7 @@ static int zerocodec_decode_frame(AVCodecContext *avctx, void *data, zstream->next_in = avpkt->data; zstream->avail_in = avpkt->size; - dst = pic->data[0]; + dst = pic->data[0] + (avctx->height - 1) * pic->linesize[0]; /** * ZeroCodec has very simple interframe compression. If a value @@ -79,7 +80,6 @@ static int zerocodec_decode_frame(AVCodecContext *avctx, void *data, zret = inflate(zstream, Z_SYNC_FLUSH); if (zret != Z_OK && zret != Z_STREAM_END) { - avctx->release_buffer(avctx, pic); av_log(avctx, AV_LOG_ERROR, "Inflate failed with return code: %d.\n", zret); return AVERROR_INVALIDDATA; @@ -89,20 +89,15 @@ static int zerocodec_decode_frame(AVCodecContext *avctx, void *data, for (j = 0; j < avctx->width << 1; j++) dst[j] += prev[j] & -!dst[j]; - prev += prev_pic->linesize[0]; - dst += pic->linesize[0]; + prev -= prev_pic->linesize[0]; + dst -= pic->linesize[0]; } - /* Release the previous buffer if need be */ - if (prev_pic->data[0]) - avctx->release_buffer(avctx, prev_pic); + av_frame_unref(zc->previous_frame); + if ((ret = av_frame_ref(zc->previous_frame, pic)) < 0) + return ret; - *data_size = sizeof(AVFrame); - *(AVFrame *)data = *pic; - - /* Store the previous frame for use later. - * FFSWAP ensures that e.g. pic->data is NULLed. */ - FFSWAP(AVFrame, *pic, *prev_pic); + *got_frame = 1; return avpkt->size; } @@ -110,15 +105,10 @@ static int zerocodec_decode_frame(AVCodecContext *avctx, void *data, static av_cold int zerocodec_decode_close(AVCodecContext *avctx) { ZeroCodecContext *zc = avctx->priv_data; - AVFrame *prev_pic = &zc->previous_frame; - - inflateEnd(&zc->zstream); - /* Release last frame */ - if (prev_pic->data[0]) - avctx->release_buffer(avctx, prev_pic); + av_frame_free(&zc->previous_frame); - av_freep(&avctx->coded_frame); + inflateEnd(&zc->zstream); return 0; } @@ -132,9 +122,6 @@ static av_cold int zerocodec_decode_init(AVCodecContext *avctx) avctx->pix_fmt = AV_PIX_FMT_UYVY422; avctx->bits_per_raw_sample = 8; - zc->size = avpicture_get_size(avctx->pix_fmt, - avctx->width, avctx->height); - zstream->zalloc = Z_NULL; zstream->zfree = Z_NULL; zstream->opaque = Z_NULL; @@ -145,9 +132,8 @@ static av_cold int zerocodec_decode_init(AVCodecContext *avctx) return AVERROR(ENOMEM); } - avctx->coded_frame = avcodec_alloc_frame(); - if (!avctx->coded_frame) { - av_log(avctx, AV_LOG_ERROR, "Could not allocate frame buffer.\n"); + zc->previous_frame = av_frame_alloc(); + if (!zc->previous_frame) { zerocodec_decode_close(avctx); return AVERROR(ENOMEM); } @@ -158,11 +144,11 @@ static av_cold int zerocodec_decode_init(AVCodecContext *avctx) AVCodec ff_zerocodec_decoder = { .type = AVMEDIA_TYPE_VIDEO, .name = "zerocodec", + .long_name = NULL_IF_CONFIG_SMALL("ZeroCodec Lossless Video"), .id = AV_CODEC_ID_ZEROCODEC, .priv_data_size = sizeof(ZeroCodecContext), .init = zerocodec_decode_init, .decode = zerocodec_decode_frame, .close = zerocodec_decode_close, .capabilities = CODEC_CAP_DR1, - .long_name = NULL_IF_CONFIG_SMALL("ZeroCodec Lossless Video"), };