2 * LCL (LossLess Codec Library) Codec
3 * Copyright (c) 2002-2004 Roberto Togni
5 * This file is part of FFmpeg.
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23 * @file libavcodec/lclenc.c
24 * LCL (LossLess Codec Library) Video Codec
25 * Decoder for MSZH and ZLIB codecs
26 * Experimental encoder for ZLIB RGB24
31 * Ver2.23 By Kenji Oshima 2000.09.20
32 * avimszh.dll, avizlib.dll
34 * A description of the decoding algorithm can be found here:
35 * http://www.pcisys.net/~melanson/codecs
37 * Supports: BGR24 (RGB 24bpp)
52 typedef struct LclEncContext
{
54 AVCodecContext
*avctx
;
71 static int encode_frame(AVCodecContext
*avctx
, unsigned char *buf
, int buf_size
, void *data
){
72 LclEncContext
*c
= avctx
->priv_data
;
74 AVFrame
* const p
= &c
->pic
;
76 int zret
; // Zlib return code
79 p
->pict_type
= FF_I_TYPE
;
82 if(avctx
->pix_fmt
!= PIX_FMT_BGR24
){
83 av_log(avctx
, AV_LOG_ERROR
, "Format not supported!\n");
87 zret
= deflateReset(&c
->zstream
);
89 av_log(avctx
, AV_LOG_ERROR
, "Deflate reset error: %d\n", zret
);
92 c
->zstream
.next_out
= buf
;
93 c
->zstream
.avail_out
= buf_size
;
95 for(i
= avctx
->height
- 1; i
>= 0; i
--) {
96 c
->zstream
.next_in
= p
->data
[0]+p
->linesize
[0]*i
;
97 c
->zstream
.avail_in
= avctx
->width
*3;
98 zret
= deflate(&c
->zstream
, Z_NO_FLUSH
);
100 av_log(avctx
, AV_LOG_ERROR
, "Deflate error: %d\n", zret
);
104 zret
= deflate(&c
->zstream
, Z_FINISH
);
105 if (zret
!= Z_STREAM_END
) {
106 av_log(avctx
, AV_LOG_ERROR
, "Deflate error: %d\n", zret
);
110 return c
->zstream
.total_out
;
118 static av_cold
int encode_init(AVCodecContext
*avctx
)
120 LclEncContext
*c
= avctx
->priv_data
;
121 int zret
; // Zlib return code
125 assert(avctx
->width
&& avctx
->height
);
127 avctx
->extradata
= av_mallocz(8);
128 avctx
->coded_frame
= &c
->pic
;
130 // Will be user settable someday
134 switch(avctx
->pix_fmt
){
136 c
->imgtype
= IMGTYPE_RGB24
;
137 avctx
->bits_per_coded_sample
= 24;
140 av_log(avctx
, AV_LOG_ERROR
, "Input pixel format %s not supported\n", avcodec_get_pix_fmt_name(avctx
->pix_fmt
));
144 avctx
->extradata
[0]= 4;
145 avctx
->extradata
[1]= 0;
146 avctx
->extradata
[2]= 0;
147 avctx
->extradata
[3]= 0;
148 avctx
->extradata
[4]= c
->imgtype
;
149 avctx
->extradata
[5]= c
->compression
;
150 avctx
->extradata
[6]= c
->flags
;
151 avctx
->extradata
[7]= CODEC_ZLIB
;
152 c
->avctx
->extradata_size
= 8;
154 c
->zstream
.zalloc
= Z_NULL
;
155 c
->zstream
.zfree
= Z_NULL
;
156 c
->zstream
.opaque
= Z_NULL
;
157 zret
= deflateInit(&c
->zstream
, c
->compression
);
159 av_log(avctx
, AV_LOG_ERROR
, "Deflate init error: %d\n", zret
);
171 static av_cold
int encode_end(AVCodecContext
*avctx
)
173 LclEncContext
*c
= avctx
->priv_data
;
175 av_freep(&avctx
->extradata
);
176 deflateEnd(&c
->zstream
);
181 AVCodec zlib_encoder
= {
185 sizeof(LclEncContext
),
189 .long_name
= NULL_IF_CONFIG_SMALL("LCL (LossLess Codec Library) ZLIB"),