Mercurial > libavcodec.hg
annotate lclenc.c @ 9747:9db25052df0e libavcodec
Remove useless casts, extradata is already "uint8_t *"
author | reimar |
---|---|
date | Sun, 31 May 2009 08:51:30 +0000 |
parents | e8421cfcc381 |
children | 77920505b11d |
rev | line source |
---|---|
1743 | 1 /* |
2 * LCL (LossLess Codec Library) Codec | |
3 * Copyright (c) 2002-2004 Roberto Togni | |
4 * | |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3777
diff
changeset
|
5 * This file is part of FFmpeg. |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3777
diff
changeset
|
6 * |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3777
diff
changeset
|
7 * FFmpeg is free software; you can redistribute it and/or |
1743 | 8 * modify it under the terms of the GNU Lesser General Public |
9 * License as published by the Free Software Foundation; either | |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3777
diff
changeset
|
10 * version 2.1 of the License, or (at your option) any later version. |
1743 | 11 * |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3777
diff
changeset
|
12 * FFmpeg is distributed in the hope that it will be useful, |
1743 | 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. | |
16 * | |
17 * You should have received a copy of the GNU Lesser General Public | |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3777
diff
changeset
|
18 * License along with FFmpeg; if not, write to the Free Software |
3036
0b546eab515d
Update licensing information: The FSF changed postal address.
diego
parents:
2979
diff
changeset
|
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
1743 | 20 */ |
21 | |
22 /** | |
8718
e9d9d946f213
Use full internal pathname in doxygen @file directives.
diego
parents:
8673
diff
changeset
|
23 * @file libavcodec/lclenc.c |
1743 | 24 * LCL (LossLess Codec Library) Video Codec |
25 * Decoder for MSZH and ZLIB codecs | |
26 * Experimental encoder for ZLIB RGB24 | |
27 * | |
28 * Fourcc: MSZH, ZLIB | |
29 * | |
30 * Original Win32 dll: | |
31 * Ver2.23 By Kenji Oshima 2000.09.20 | |
32 * avimszh.dll, avizlib.dll | |
33 * | |
34 * A description of the decoding algorithm can be found here: | |
35 * http://www.pcisys.net/~melanson/codecs | |
36 * | |
37 * Supports: BGR24 (RGB 24bpp) | |
38 * | |
39 */ | |
40 | |
41 #include <stdio.h> | |
42 #include <stdlib.h> | |
43 | |
4962
f99e40a7155b
Remove redundant #inclusion of common.h, avcodec.h already #includes it.
diego
parents:
4827
diff
changeset
|
44 #include "avcodec.h" |
9411
4cb7c65fc775
Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
8718
diff
changeset
|
45 #include "put_bits.h" |
5294 | 46 #include "lcl.h" |
1743 | 47 |
48 #include <zlib.h> | |
49 | |
50 /* | |
51 * Decoder context | |
52 */ | |
5294 | 53 typedef struct LclEncContext { |
1743 | 54 |
9744 | 55 AVCodecContext *avctx; |
56 AVFrame pic; | |
1743 | 57 PutBitContext pb; |
58 | |
59 // Image type | |
60 int imgtype; | |
61 // Compression type | |
62 int compression; | |
63 // Flags | |
64 int flags; | |
65 // Decompressed data size | |
66 unsigned int decomp_size; | |
67 // Maximum compressed data size | |
68 unsigned int max_comp_size; | |
69 // Compression buffer | |
70 unsigned char* comp_buf; | |
71 z_stream zstream; | |
5294 | 72 } LclEncContext; |
1743 | 73 |
74 /* | |
75 * | |
76 * Encode a frame | |
77 * | |
78 */ | |
79 static int encode_frame(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data){ | |
5294 | 80 LclEncContext *c = avctx->priv_data; |
1743 | 81 AVFrame *pict = data; |
82 AVFrame * const p = &c->pic; | |
83 int i; | |
84 int zret; // Zlib return code | |
85 | |
86 *p = *pict; | |
87 p->pict_type= FF_I_TYPE; | |
88 p->key_frame= 1; | |
2967 | 89 |
1743 | 90 if(avctx->pix_fmt != PIX_FMT_BGR24){ |
91 av_log(avctx, AV_LOG_ERROR, "Format not supported!\n"); | |
92 return -1; | |
93 } | |
94 | |
9745 | 95 zret = deflateReset(&c->zstream); |
1743 | 96 if (zret != Z_OK) { |
97 av_log(avctx, AV_LOG_ERROR, "Deflate reset error: %d\n", zret); | |
98 return -1; | |
99 } | |
9746
e8421cfcc381
lclenc.c: compress directly into output buffer instead of using a pointless
reimar
parents:
9745
diff
changeset
|
100 c->zstream.next_out = buf; |
e8421cfcc381
lclenc.c: compress directly into output buffer instead of using a pointless
reimar
parents:
9745
diff
changeset
|
101 c->zstream.avail_out = buf_size; |
1743 | 102 |
2250
902caf560c43
Zlib encoder: fix image orientation (was flipped), 100l in deflate error
rtognimp
parents:
2248
diff
changeset
|
103 for(i = avctx->height - 1; i >= 0; i--) { |
902caf560c43
Zlib encoder: fix image orientation (was flipped), 100l in deflate error
rtognimp
parents:
2248
diff
changeset
|
104 c->zstream.next_in = p->data[0]+p->linesize[0]*i; |
902caf560c43
Zlib encoder: fix image orientation (was flipped), 100l in deflate error
rtognimp
parents:
2248
diff
changeset
|
105 c->zstream.avail_in = avctx->width*3; |
9745 | 106 zret = deflate(&c->zstream, Z_NO_FLUSH); |
2250
902caf560c43
Zlib encoder: fix image orientation (was flipped), 100l in deflate error
rtognimp
parents:
2248
diff
changeset
|
107 if (zret != Z_OK) { |
2979 | 108 av_log(avctx, AV_LOG_ERROR, "Deflate error: %d\n", zret); |
109 return -1; | |
2250
902caf560c43
Zlib encoder: fix image orientation (was flipped), 100l in deflate error
rtognimp
parents:
2248
diff
changeset
|
110 } |
902caf560c43
Zlib encoder: fix image orientation (was flipped), 100l in deflate error
rtognimp
parents:
2248
diff
changeset
|
111 } |
9745 | 112 zret = deflate(&c->zstream, Z_FINISH); |
2250
902caf560c43
Zlib encoder: fix image orientation (was flipped), 100l in deflate error
rtognimp
parents:
2248
diff
changeset
|
113 if (zret != Z_STREAM_END) { |
1743 | 114 av_log(avctx, AV_LOG_ERROR, "Deflate error: %d\n", zret); |
115 return -1; | |
116 } | |
117 | |
118 return c->zstream.total_out; | |
119 } | |
120 | |
121 /* | |
122 * | |
123 * Init lcl encoder | |
124 * | |
125 */ | |
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
5294
diff
changeset
|
126 static av_cold int encode_init(AVCodecContext *avctx) |
1743 | 127 { |
5294 | 128 LclEncContext *c = avctx->priv_data; |
1743 | 129 int zret; // Zlib return code |
130 | |
131 c->avctx= avctx; | |
2967 | 132 |
1743 | 133 assert(avctx->width && avctx->height); |
2967 | 134 |
1743 | 135 avctx->extradata= av_mallocz(8); |
136 avctx->coded_frame= &c->pic; | |
137 | |
138 // Will be user settable someday | |
139 c->compression = 6; | |
140 c->flags = 0; | |
141 | |
142 switch(avctx->pix_fmt){ | |
143 case PIX_FMT_BGR24: | |
144 c->imgtype = IMGTYPE_RGB24; | |
145 c->decomp_size = avctx->width * avctx->height * 3; | |
7823
4525dcd81357
Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents:
7068
diff
changeset
|
146 avctx->bits_per_coded_sample= 24; |
1743 | 147 break; |
148 default: | |
7068
6497251e2fde
Improve an lclenc.c error message in case of unsupported input pixel
stefano
parents:
7040
diff
changeset
|
149 av_log(avctx, AV_LOG_ERROR, "Input pixel format %s not supported\n", avcodec_get_pix_fmt_name(avctx->pix_fmt)); |
1743 | 150 return -1; |
151 } | |
152 | |
9747
9db25052df0e
Remove useless casts, extradata is already "uint8_t *"
reimar
parents:
9746
diff
changeset
|
153 avctx->extradata[0]= 4; |
9db25052df0e
Remove useless casts, extradata is already "uint8_t *"
reimar
parents:
9746
diff
changeset
|
154 avctx->extradata[1]= 0; |
9db25052df0e
Remove useless casts, extradata is already "uint8_t *"
reimar
parents:
9746
diff
changeset
|
155 avctx->extradata[2]= 0; |
9db25052df0e
Remove useless casts, extradata is already "uint8_t *"
reimar
parents:
9746
diff
changeset
|
156 avctx->extradata[3]= 0; |
9db25052df0e
Remove useless casts, extradata is already "uint8_t *"
reimar
parents:
9746
diff
changeset
|
157 avctx->extradata[4]= c->imgtype; |
9db25052df0e
Remove useless casts, extradata is already "uint8_t *"
reimar
parents:
9746
diff
changeset
|
158 avctx->extradata[5]= c->compression; |
9db25052df0e
Remove useless casts, extradata is already "uint8_t *"
reimar
parents:
9746
diff
changeset
|
159 avctx->extradata[6]= c->flags; |
9db25052df0e
Remove useless casts, extradata is already "uint8_t *"
reimar
parents:
9746
diff
changeset
|
160 avctx->extradata[7]= CODEC_ZLIB; |
1743 | 161 c->avctx->extradata_size= 8; |
2967 | 162 |
1743 | 163 c->zstream.zalloc = Z_NULL; |
164 c->zstream.zfree = Z_NULL; | |
165 c->zstream.opaque = Z_NULL; | |
9745 | 166 zret = deflateInit(&c->zstream, c->compression); |
1743 | 167 if (zret != Z_OK) { |
168 av_log(avctx, AV_LOG_ERROR, "Deflate init error: %d\n", zret); | |
169 return 1; | |
170 } | |
171 | |
172 return 0; | |
173 } | |
174 | |
175 /* | |
176 * | |
177 * Uninit lcl encoder | |
178 * | |
179 */ | |
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
5294
diff
changeset
|
180 static av_cold int encode_end(AVCodecContext *avctx) |
1743 | 181 { |
5294 | 182 LclEncContext *c = avctx->priv_data; |
1743 | 183 |
184 av_freep(&avctx->extradata); | |
2248
e4e1b4f31db6
segfault fix by (Kostya <cannonball at bw-team dot com>)
michael
parents:
1744
diff
changeset
|
185 av_freep(&c->comp_buf); |
9745 | 186 deflateEnd(&c->zstream); |
2967 | 187 |
1743 | 188 return 0; |
189 } | |
190 | |
191 AVCodec zlib_encoder = { | |
192 "zlib", | |
193 CODEC_TYPE_VIDEO, | |
194 CODEC_ID_ZLIB, | |
5294 | 195 sizeof(LclEncContext), |
1743 | 196 encode_init, |
197 encode_frame, | |
198 encode_end, | |
7040
e943e1409077
Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents:
6712
diff
changeset
|
199 .long_name = NULL_IF_CONFIG_SMALL("LCL (LossLess Codec Library) ZLIB"), |
1743 | 200 }; |