X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;ds=inline;f=libavcodec%2Flclenc.c;h=0fb303cca65e3a9482355080ca7fa22360484266;hb=30f8da29bf609d741bbebd33b2a5003c426ab919;hp=a90c1cf5886ccbb4091cc4b9c711f45805673688;hpb=d36beb3f6902b1217beda576aa18abf7eb72b03c;p=ffmpeg diff --git a/libavcodec/lclenc.c b/libavcodec/lclenc.c index a90c1cf5886..0fb303cca65 100644 --- a/libavcodec/lclenc.c +++ b/libavcodec/lclenc.c @@ -2,20 +2,20 @@ * LCL (LossLess Codec Library) Codec * Copyright (c) 2002-2004 Roberto Togni * - * This file is part of FFmpeg. + * This file is part of Libav. * - * FFmpeg is free software; you can redistribute it and/or + * Libav 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, + * Libav 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 + * License along with Libav; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ @@ -43,6 +43,8 @@ #include "avcodec.h" #include "lcl.h" +#include "libavutil/internal.h" +#include "libavutil/mem.h" #include @@ -68,18 +70,26 @@ typedef struct LclEncContext { * Encode a frame * */ -static int encode_frame(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data){ +static int encode_frame(AVCodecContext *avctx, AVPacket *pkt, + const AVFrame *pict, int *got_packet) +{ LclEncContext *c = avctx->priv_data; - AVFrame *pict = data; AVFrame * const p = &c->pic; - int i; + int i, ret; int zret; // Zlib return code + int max_size = deflateBound(&c->zstream, avctx->width * avctx->height * 3); + + if (!pkt->data && + (ret = av_new_packet(pkt, max_size)) < 0) { + av_log(avctx, AV_LOG_ERROR, "Error allocating packet of size %d.\n", max_size); + return ret; + } *p = *pict; - p->pict_type= FF_I_TYPE; + p->pict_type= AV_PICTURE_TYPE_I; p->key_frame= 1; - if(avctx->pix_fmt != PIX_FMT_BGR24){ + if(avctx->pix_fmt != AV_PIX_FMT_BGR24){ av_log(avctx, AV_LOG_ERROR, "Format not supported!\n"); return -1; } @@ -89,8 +99,8 @@ static int encode_frame(AVCodecContext *avctx, unsigned char *buf, int buf_size, av_log(avctx, AV_LOG_ERROR, "Deflate reset error: %d\n", zret); return -1; } - c->zstream.next_out = buf; - c->zstream.avail_out = buf_size; + c->zstream.next_out = pkt->data; + c->zstream.avail_out = pkt->size; for(i = avctx->height - 1; i >= 0; i--) { c->zstream.next_in = p->data[0]+p->linesize[0]*i; @@ -107,7 +117,11 @@ static int encode_frame(AVCodecContext *avctx, unsigned char *buf, int buf_size, return -1; } - return c->zstream.total_out; + pkt->size = c->zstream.total_out; + pkt->flags |= AV_PKT_FLAG_KEY; + *got_packet = 1; + + return 0; } /* @@ -171,13 +185,13 @@ static av_cold int encode_end(AVCodecContext *avctx) } AVCodec ff_zlib_encoder = { - "zlib", - AVMEDIA_TYPE_VIDEO, - CODEC_ID_ZLIB, - sizeof(LclEncContext), - encode_init, - encode_frame, - encode_end, - .pix_fmts = (const enum PixelFormat[]) { PIX_FMT_BGR24, PIX_FMT_NONE }, - .long_name = NULL_IF_CONFIG_SMALL("LCL (LossLess Codec Library) ZLIB"), + .name = "zlib", + .type = AVMEDIA_TYPE_VIDEO, + .id = AV_CODEC_ID_ZLIB, + .priv_data_size = sizeof(LclEncContext), + .init = encode_init, + .encode2 = encode_frame, + .close = encode_end, + .pix_fmts = (const enum AVPixelFormat[]) { AV_PIX_FMT_BGR24, AV_PIX_FMT_NONE }, + .long_name = NULL_IF_CONFIG_SMALL("LCL (LossLess Codec Library) ZLIB"), };