Main Page
Related Pages
Modules
Data Structures
Files
Examples
File List
Globals
libavcodec
lclenc.c
Go to the documentation of this file.
1
/*
2
* LCL (LossLess Codec Library) Codec
3
* Copyright (c) 2002-2004 Roberto Togni
4
*
5
* This file is part of Libav.
6
*
7
* Libav 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.
11
*
12
* Libav 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.
16
*
17
* You should have received a copy of the GNU Lesser General Public
18
* License along with Libav; if not, write to the Free Software
19
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20
*/
21
41
#include <stdio.h>
42
#include <stdlib.h>
43
44
#include "
avcodec.h
"
45
#include "
lcl.h
"
46
#include "
libavutil/internal.h
"
47
#include "
libavutil/mem.h
"
48
49
#include <zlib.h>
50
51
/*
52
* Decoder context
53
*/
54
typedef
struct
LclEncContext
{
55
56
AVCodecContext
*
avctx
;
57
AVFrame
pic
;
58
59
// Image type
60
int
imgtype
;
61
// Compression type
62
int
compression
;
63
// Flags
64
int
flags
;
65
z_stream
zstream
;
66
}
LclEncContext
;
67
68
/*
69
*
70
* Encode a frame
71
*
72
*/
73
static
int
encode_frame
(
AVCodecContext
*avctx,
AVPacket
*pkt,
74
const
AVFrame
*pict,
int
*got_packet)
75
{
76
LclEncContext
*c = avctx->
priv_data
;
77
AVFrame
*
const
p = &c->
pic
;
78
int
i, ret;
79
int
zret;
// Zlib return code
80
int
max_size = deflateBound(&c->
zstream
, avctx->
width
* avctx->
height
* 3);
81
82
if
(!pkt->
data
&&
83
(ret =
av_new_packet
(pkt, max_size)) < 0) {
84
av_log
(avctx,
AV_LOG_ERROR
,
"Error allocating packet of size %d.\n"
, max_size);
85
return
ret;
86
}
87
88
*p = *pict;
89
p->
pict_type
=
AV_PICTURE_TYPE_I
;
90
p->
key_frame
= 1;
91
92
if
(avctx->
pix_fmt
!=
AV_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 = pkt->
data
;
103
c->
zstream
.avail_out = pkt->
size
;
104
105
for
(i = avctx->
height
- 1; i >= 0; i--) {
106
c->
zstream
.next_in = p->
data
[0]+p->
linesize
[0]*i;
107
c->
zstream
.avail_in = avctx->
width
*3;
108
zret = deflate(&c->
zstream
, Z_NO_FLUSH);
109
if
(zret != Z_OK) {
110
av_log
(avctx,
AV_LOG_ERROR
,
"Deflate error: %d\n"
, zret);
111
return
-1;
112
}
113
}
114
zret = deflate(&c->
zstream
, Z_FINISH);
115
if
(zret != Z_STREAM_END) {
116
av_log
(avctx,
AV_LOG_ERROR
,
"Deflate error: %d\n"
, zret);
117
return
-1;
118
}
119
120
pkt->
size
= c->
zstream
.total_out;
121
pkt->
flags
|=
AV_PKT_FLAG_KEY
;
122
*got_packet = 1;
123
124
return
0;
125
}
126
127
/*
128
*
129
* Init lcl encoder
130
*
131
*/
132
static
av_cold
int
encode_init
(
AVCodecContext
*avctx)
133
{
134
LclEncContext
*c = avctx->
priv_data
;
135
int
zret;
// Zlib return code
136
137
c->
avctx
= avctx;
138
139
assert(avctx->
width
&& avctx->
height
);
140
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
c->
imgtype
=
IMGTYPE_RGB24
;
148
avctx->
bits_per_coded_sample
= 24;
149
150
avctx->
extradata
[0]= 4;
151
avctx->
extradata
[1]= 0;
152
avctx->
extradata
[2]= 0;
153
avctx->
extradata
[3]= 0;
154
avctx->
extradata
[4]= c->
imgtype
;
155
avctx->
extradata
[5]= c->
compression
;
156
avctx->
extradata
[6]= c->
flags
;
157
avctx->
extradata
[7]=
CODEC_ZLIB
;
158
c->
avctx
->
extradata_size
= 8;
159
160
c->
zstream
.zalloc = Z_NULL;
161
c->
zstream
.zfree = Z_NULL;
162
c->
zstream
.opaque = Z_NULL;
163
zret = deflateInit(&c->
zstream
, c->
compression
);
164
if
(zret != Z_OK) {
165
av_log
(avctx,
AV_LOG_ERROR
,
"Deflate init error: %d\n"
, zret);
166
return
1;
167
}
168
169
return
0;
170
}
171
172
/*
173
*
174
* Uninit lcl encoder
175
*
176
*/
177
static
av_cold
int
encode_end
(
AVCodecContext
*avctx)
178
{
179
LclEncContext
*c = avctx->
priv_data
;
180
181
av_freep
(&avctx->
extradata
);
182
deflateEnd(&c->
zstream
);
183
184
return
0;
185
}
186
187
AVCodec
ff_zlib_encoder
= {
188
.
name
=
"zlib"
,
189
.type =
AVMEDIA_TYPE_VIDEO
,
190
.id =
AV_CODEC_ID_ZLIB
,
191
.priv_data_size =
sizeof
(
LclEncContext
),
192
.
init
=
encode_init
,
193
.encode2 =
encode_frame
,
194
.
close
=
encode_end
,
195
.pix_fmts = (
const
enum
AVPixelFormat
[]) {
AV_PIX_FMT_BGR24
,
AV_PIX_FMT_NONE
},
196
.long_name =
NULL_IF_CONFIG_SMALL
(
"LCL (LossLess Codec Library) ZLIB"
),
197
};