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)
45 #include "bitstream.h"
55 typedef struct LclEncContext
{
57 AVCodecContext
*avctx
;
67 // Decompressed data size
68 unsigned int decomp_size
;
69 // Maximum compressed data size
70 unsigned int max_comp_size
;
72 unsigned char* comp_buf
;
83 static int encode_frame(AVCodecContext
*avctx
, unsigned char *buf
, int buf_size
, void *data
){
84 LclEncContext
*c
= avctx
->priv_data
;
86 AVFrame
* const p
= &c
->pic
;
88 int zret
; // Zlib return code
91 av_log(avctx
, AV_LOG_ERROR
, "Zlib support not compiled in.\n");
95 init_put_bits(&c
->pb
, buf
, buf_size
);
98 p
->pict_type
= FF_I_TYPE
;
101 if(avctx
->pix_fmt
!= PIX_FMT_BGR24
){
102 av_log(avctx
, AV_LOG_ERROR
, "Format not supported!\n");
106 zret
= deflateReset(&(c
->zstream
));
108 av_log(avctx
, AV_LOG_ERROR
, "Deflate reset error: %d\n", zret
);
111 c
->zstream
.next_out
= c
->comp_buf
;
112 c
->zstream
.avail_out
= c
->max_comp_size
;
114 for(i
= avctx
->height
- 1; i
>= 0; i
--) {
115 c
->zstream
.next_in
= p
->data
[0]+p
->linesize
[0]*i
;
116 c
->zstream
.avail_in
= avctx
->width
*3;
117 zret
= deflate(&(c
->zstream
), Z_NO_FLUSH
);
119 av_log(avctx
, AV_LOG_ERROR
, "Deflate error: %d\n", zret
);
123 zret
= deflate(&(c
->zstream
), Z_FINISH
);
124 if (zret
!= Z_STREAM_END
) {
125 av_log(avctx
, AV_LOG_ERROR
, "Deflate error: %d\n", zret
);
129 for (i
= 0; i
< c
->zstream
.total_out
; i
++)
130 put_bits(&c
->pb
, 8, c
->comp_buf
[i
]);
131 flush_put_bits(&c
->pb
);
133 return c
->zstream
.total_out
;
142 static av_cold
int encode_init(AVCodecContext
*avctx
)
144 LclEncContext
*c
= avctx
->priv_data
;
145 int zret
; // Zlib return code
148 av_log(avctx
, AV_LOG_ERROR
, "Zlib support not compiled.\n");
154 assert(avctx
->width
&& avctx
->height
);
156 avctx
->extradata
= av_mallocz(8);
157 avctx
->coded_frame
= &c
->pic
;
159 // Will be user settable someday
163 switch(avctx
->pix_fmt
){
165 c
->imgtype
= IMGTYPE_RGB24
;
166 c
->decomp_size
= avctx
->width
* avctx
->height
* 3;
167 avctx
->bits_per_coded_sample
= 24;
170 av_log(avctx
, AV_LOG_ERROR
, "Input pixel format %s not supported\n", avcodec_get_pix_fmt_name(avctx
->pix_fmt
));
174 ((uint8_t*)avctx
->extradata
)[0]= 4;
175 ((uint8_t*)avctx
->extradata
)[1]= 0;
176 ((uint8_t*)avctx
->extradata
)[2]= 0;
177 ((uint8_t*)avctx
->extradata
)[3]= 0;
178 ((uint8_t*)avctx
->extradata
)[4]= c
->imgtype
;
179 ((uint8_t*)avctx
->extradata
)[5]= c
->compression
;
180 ((uint8_t*)avctx
->extradata
)[6]= c
->flags
;
181 ((uint8_t*)avctx
->extradata
)[7]= CODEC_ZLIB
;
182 c
->avctx
->extradata_size
= 8;
184 c
->zstream
.zalloc
= Z_NULL
;
185 c
->zstream
.zfree
= Z_NULL
;
186 c
->zstream
.opaque
= Z_NULL
;
187 zret
= deflateInit(&(c
->zstream
), c
->compression
);
189 av_log(avctx
, AV_LOG_ERROR
, "Deflate init error: %d\n", zret
);
193 /* Conservative upper bound taken from zlib v1.2.1 source */
194 c
->max_comp_size
= c
->decomp_size
+ ((c
->decomp_size
+ 7) >> 3) +
195 ((c
->decomp_size
+ 63) >> 6) + 11;
196 if ((c
->comp_buf
= av_malloc(c
->max_comp_size
)) == NULL
) {
197 av_log(avctx
, AV_LOG_ERROR
, "Can't allocate compression buffer.\n");
210 static av_cold
int encode_end(AVCodecContext
*avctx
)
212 LclEncContext
*c
= avctx
->priv_data
;
214 av_freep(&avctx
->extradata
);
215 av_freep(&c
->comp_buf
);
217 deflateEnd(&(c
->zstream
));
223 AVCodec zlib_encoder
= {
227 sizeof(LclEncContext
),
231 .long_name
= NULL_IF_CONFIG_SMALL("LCL (LossLess Codec Library) ZLIB"),