Mercurial > libavcodec.hg
annotate lclenc.c @ 9744:bcd71ae6ea74 libavcodec
Cosmetics: fix indentation in lclenc.c
| author | reimar |
|---|---|
| date | Sun, 31 May 2009 08:38:51 +0000 |
| parents | f36c5b72c4e3 |
| children | 2b2cf4039589 |
| 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 init_put_bits(&c->pb, buf, buf_size); | |
| 2967 | 87 |
| 1743 | 88 *p = *pict; |
| 89 p->pict_type= FF_I_TYPE; | |
| 90 p->key_frame= 1; | |
| 2967 | 91 |
| 1743 | 92 if(avctx->pix_fmt != PIX_FMT_BGR24){ |
| 93 av_log(avctx, AV_LOG_ERROR, "Format not supported!\n"); | |
| 94 return -1; | |
| 95 } | |
| 96 | |
| 97 zret = deflateReset(&(c->zstream)); | |
| 98 if (zret != Z_OK) { | |
| 99 av_log(avctx, AV_LOG_ERROR, "Deflate reset error: %d\n", zret); | |
| 100 return -1; | |
| 101 } | |
| 102 c->zstream.next_out = c->comp_buf; | |
| 103 c->zstream.avail_out = c->max_comp_size; | |
| 104 | |
|
2250
902caf560c43
Zlib encoder: fix image orientation (was flipped), 100l in deflate error
rtognimp
parents:
2248
diff
changeset
|
105 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
|
106 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
|
107 c->zstream.avail_in = avctx->width*3; |
|
902caf560c43
Zlib encoder: fix image orientation (was flipped), 100l in deflate error
rtognimp
parents:
2248
diff
changeset
|
108 zret = deflate(&(c->zstream), Z_NO_FLUSH); |
|
902caf560c43
Zlib encoder: fix image orientation (was flipped), 100l in deflate error
rtognimp
parents:
2248
diff
changeset
|
109 if (zret != Z_OK) { |
| 2979 | 110 av_log(avctx, AV_LOG_ERROR, "Deflate error: %d\n", zret); |
| 111 return -1; | |
|
2250
902caf560c43
Zlib encoder: fix image orientation (was flipped), 100l in deflate error
rtognimp
parents:
2248
diff
changeset
|
112 } |
|
902caf560c43
Zlib encoder: fix image orientation (was flipped), 100l in deflate error
rtognimp
parents:
2248
diff
changeset
|
113 } |
| 1743 | 114 zret = deflate(&(c->zstream), Z_FINISH); |
|
2250
902caf560c43
Zlib encoder: fix image orientation (was flipped), 100l in deflate error
rtognimp
parents:
2248
diff
changeset
|
115 if (zret != Z_STREAM_END) { |
| 1743 | 116 av_log(avctx, AV_LOG_ERROR, "Deflate error: %d\n", zret); |
| 117 return -1; | |
| 118 } | |
| 119 | |
| 120 for (i = 0; i < c->zstream.total_out; i++) | |
| 121 put_bits(&c->pb, 8, c->comp_buf[i]); | |
| 122 flush_put_bits(&c->pb); | |
| 123 | |
| 124 return c->zstream.total_out; | |
| 125 } | |
| 126 | |
| 127 /* | |
| 128 * | |
| 129 * Init lcl encoder | |
| 130 * | |
| 131 */ | |
|
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
5294
diff
changeset
|
132 static av_cold int encode_init(AVCodecContext *avctx) |
| 1743 | 133 { |
| 5294 | 134 LclEncContext *c = avctx->priv_data; |
| 1743 | 135 int zret; // Zlib return code |
| 136 | |
| 137 c->avctx= avctx; | |
| 2967 | 138 |
| 1743 | 139 assert(avctx->width && avctx->height); |
| 2967 | 140 |
| 1743 | 141 avctx->extradata= av_mallocz(8); |
| 142 avctx->coded_frame= &c->pic; | |
| 143 | |
| 144 // Will be user settable someday | |
| 145 c->compression = 6; | |
| 146 c->flags = 0; | |
| 147 | |
| 148 switch(avctx->pix_fmt){ | |
| 149 case PIX_FMT_BGR24: | |
| 150 c->imgtype = IMGTYPE_RGB24; | |
| 151 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
|
152 avctx->bits_per_coded_sample= 24; |
| 1743 | 153 break; |
| 154 default: | |
|
7068
6497251e2fde
Improve an lclenc.c error message in case of unsupported input pixel
stefano
parents:
7040
diff
changeset
|
155 av_log(avctx, AV_LOG_ERROR, "Input pixel format %s not supported\n", avcodec_get_pix_fmt_name(avctx->pix_fmt)); |
| 1743 | 156 return -1; |
| 157 } | |
| 158 | |
| 159 ((uint8_t*)avctx->extradata)[0]= 4; | |
| 160 ((uint8_t*)avctx->extradata)[1]= 0; | |
| 161 ((uint8_t*)avctx->extradata)[2]= 0; | |
| 162 ((uint8_t*)avctx->extradata)[3]= 0; | |
| 163 ((uint8_t*)avctx->extradata)[4]= c->imgtype; | |
| 164 ((uint8_t*)avctx->extradata)[5]= c->compression; | |
| 165 ((uint8_t*)avctx->extradata)[6]= c->flags; | |
|
2250
902caf560c43
Zlib encoder: fix image orientation (was flipped), 100l in deflate error
rtognimp
parents:
2248
diff
changeset
|
166 ((uint8_t*)avctx->extradata)[7]= CODEC_ZLIB; |
| 1743 | 167 c->avctx->extradata_size= 8; |
| 2967 | 168 |
| 1743 | 169 c->zstream.zalloc = Z_NULL; |
| 170 c->zstream.zfree = Z_NULL; | |
| 171 c->zstream.opaque = Z_NULL; | |
| 172 zret = deflateInit(&(c->zstream), c->compression); | |
| 173 if (zret != Z_OK) { | |
| 174 av_log(avctx, AV_LOG_ERROR, "Deflate init error: %d\n", zret); | |
| 175 return 1; | |
| 176 } | |
| 177 | |
| 9744 | 178 /* Conservative upper bound taken from zlib v1.2.1 source */ |
| 179 c->max_comp_size = c->decomp_size + ((c->decomp_size + 7) >> 3) + | |
| 180 ((c->decomp_size + 63) >> 6) + 11; | |
| 1743 | 181 if ((c->comp_buf = av_malloc(c->max_comp_size)) == NULL) { |
| 182 av_log(avctx, AV_LOG_ERROR, "Can't allocate compression buffer.\n"); | |
| 183 return 1; | |
| 184 } | |
| 185 | |
| 186 return 0; | |
| 187 } | |
| 188 | |
| 189 /* | |
| 190 * | |
| 191 * Uninit lcl encoder | |
| 192 * | |
| 193 */ | |
|
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
5294
diff
changeset
|
194 static av_cold int encode_end(AVCodecContext *avctx) |
| 1743 | 195 { |
| 5294 | 196 LclEncContext *c = avctx->priv_data; |
| 1743 | 197 |
| 198 av_freep(&avctx->extradata); | |
|
2248
e4e1b4f31db6
segfault fix by (Kostya <cannonball at bw-team dot com>)
michael
parents:
1744
diff
changeset
|
199 av_freep(&c->comp_buf); |
| 1743 | 200 deflateEnd(&(c->zstream)); |
| 2967 | 201 |
| 1743 | 202 return 0; |
| 203 } | |
| 204 | |
| 205 AVCodec zlib_encoder = { | |
| 206 "zlib", | |
| 207 CODEC_TYPE_VIDEO, | |
| 208 CODEC_ID_ZLIB, | |
| 5294 | 209 sizeof(LclEncContext), |
| 1743 | 210 encode_init, |
| 211 encode_frame, | |
| 212 encode_end, | |
|
7040
e943e1409077
Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents:
6712
diff
changeset
|
213 .long_name = NULL_IF_CONFIG_SMALL("LCL (LossLess Codec Library) ZLIB"), |
| 1743 | 214 }; |
