FFmpeg
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
Examples
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
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 FFmpeg.
6
*
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.
11
*
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.
16
*
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
20
*/
21
22
/**
23
* @file
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
44
#include "
libavutil/avassert.h
"
45
#include "
avcodec.h
"
46
#include "
internal.h
"
47
#include "
lcl.h
"
48
#include "
libavutil/internal.h
"
49
#include "
libavutil/mem.h
"
50
51
#include <zlib.h>
52
53
/*
54
* Decoder context
55
*/
56
typedef
struct
LclEncContext
{
57
58
AVCodecContext
*
avctx
;
59
AVFrame
pic
;
60
61
// Image type
62
int
imgtype
;
63
// Compression type
64
int
compression
;
65
// Flags
66
int
flags
;
67
z_stream
zstream
;
68
}
LclEncContext
;
69
70
/*
71
*
72
* Encode a frame
73
*
74
*/
75
static
int
encode_frame
(
AVCodecContext
*avctx,
AVPacket
*
pkt
,
76
const
AVFrame
*pict,
int
*got_packet)
77
{
78
LclEncContext
*
c
= avctx->
priv_data
;
79
AVFrame
*
const
p = &c->
pic
;
80
int
i,
ret
;
81
int
zret;
// Zlib return code
82
int
max_size = deflateBound(&c->
zstream
, avctx->
width
* avctx->
height
* 3);
83
84
if
((ret =
ff_alloc_packet2
(avctx, pkt, max_size)) < 0)
85
return
ret
;
86
87
*p = *pict;
88
p->
pict_type
=
AV_PICTURE_TYPE_I
;
89
p->
key_frame
= 1;
90
91
if
(avctx->
pix_fmt
!=
AV_PIX_FMT_BGR24
){
92
av_log
(avctx,
AV_LOG_ERROR
,
"Format not supported!\n"
);
93
return
-1;
94
}
95
96
zret = deflateReset(&c->
zstream
);
97
if
(zret != Z_OK) {
98
av_log
(avctx,
AV_LOG_ERROR
,
"Deflate reset error: %d\n"
, zret);
99
return
-1;
100
}
101
c->
zstream
.next_out = pkt->
data
;
102
c->
zstream
.avail_out = pkt->
size
;
103
104
for
(i = avctx->
height
- 1; i >= 0; i--) {
105
c->
zstream
.next_in = p->
data
[0]+p->
linesize
[0]*i;
106
c->
zstream
.avail_in = avctx->
width
*3;
107
zret = deflate(&c->
zstream
, Z_NO_FLUSH);
108
if
(zret != Z_OK) {
109
av_log
(avctx,
AV_LOG_ERROR
,
"Deflate error: %d\n"
, zret);
110
return
-1;
111
}
112
}
113
zret = deflate(&c->
zstream
, Z_FINISH);
114
if
(zret != Z_STREAM_END) {
115
av_log
(avctx,
AV_LOG_ERROR
,
"Deflate error: %d\n"
, zret);
116
return
-1;
117
}
118
119
pkt->
size
= c->
zstream
.total_out;
120
pkt->
flags
|=
AV_PKT_FLAG_KEY
;
121
*got_packet = 1;
122
123
return
0;
124
}
125
126
/*
127
*
128
* Init lcl encoder
129
*
130
*/
131
static
av_cold
int
encode_init
(
AVCodecContext
*avctx)
132
{
133
LclEncContext
*
c
= avctx->
priv_data
;
134
int
zret;
// Zlib return code
135
136
c->
avctx
= avctx;
137
138
av_assert0
(avctx->
width
&& avctx->
height
);
139
140
avctx->
extradata
=
av_mallocz
(8);
141
avctx->
coded_frame
= &c->
pic
;
142
143
c->
compression
= avctx->
compression_level
==
FF_COMPRESSION_DEFAULT
?
144
COMP_ZLIB_NORMAL
:
145
av_clip(avctx->
compression_level
, 0, 9);
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
};
Generated on Wed Jul 10 2013 23:48:00 for FFmpeg by
1.8.2