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
ivi_common.h
Go to the documentation of this file.
1
/*
2
* common functions for Indeo Video Interactive codecs (Indeo4 and Indeo5)
3
*
4
* Copyright (c) 2009 Maxim Poliakovski
5
*
6
* This file is part of FFmpeg.
7
*
8
* FFmpeg is free software; you can redistribute it and/or
9
* modify it under the terms of the GNU Lesser General Public
10
* License as published by the Free Software Foundation; either
11
* version 2.1 of the License, or (at your option) any later version.
12
*
13
* FFmpeg is distributed in the hope that it will be useful,
14
* but WITHOUT ANY WARRANTY; without even the implied warranty of
15
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16
* Lesser General Public License for more details.
17
*
18
* You should have received a copy of the GNU Lesser General Public
19
* License along with FFmpeg; if not, write to the Free Software
20
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21
*/
22
23
/**
24
* @file
25
* This file contains structures and macros shared by both Indeo4 and
26
* Indeo5 decoders.
27
*/
28
29
#ifndef AVCODEC_IVI_COMMON_H
30
#define AVCODEC_IVI_COMMON_H
31
32
#include "
avcodec.h
"
33
#include "
get_bits.h
"
34
#include <stdint.h>
35
36
/**
37
* Indeo 4 frame types.
38
*/
39
enum
{
40
IVI4_FRAMETYPE_INTRA
= 0,
41
IVI4_FRAMETYPE_INTRA1
= 1,
///< intra frame with slightly different bitstream coding
42
IVI4_FRAMETYPE_INTER
= 2,
///< non-droppable P-frame
43
IVI4_FRAMETYPE_BIDIR
= 3,
///< bidirectional frame
44
IVI4_FRAMETYPE_INTER_NOREF
= 4,
///< droppable P-frame
45
IVI4_FRAMETYPE_NULL_FIRST
= 5,
///< empty frame with no data
46
IVI4_FRAMETYPE_NULL_LAST
= 6
///< empty frame with no data
47
};
48
49
#define IVI_VLC_BITS 13
///< max number of bits of the ivi's huffman codes
50
#define IVI4_STREAM_ANALYSER 0
51
#define IVI5_IS_PROTECTED 0x20
52
53
/**
54
* huffman codebook descriptor
55
*/
56
typedef
struct
IVIHuffDesc
{
57
int32_t
num_rows
;
58
uint8_t
xbits
[16];
59
}
IVIHuffDesc
;
60
61
/**
62
* macroblock/block huffman table descriptor
63
*/
64
typedef
struct
IVIHuffTab
{
65
int32_t
tab_sel
;
/// index of one of the predefined tables
66
/// or "7" for custom one
67
VLC
*
tab
;
/// pointer to the table associated with tab_sel
68
69
/// the following are used only when tab_sel == 7
70
IVIHuffDesc
cust_desc
;
/// custom Huffman codebook descriptor
71
VLC
cust_tab
;
/// vlc table for custom codebook
72
}
IVIHuffTab
;
73
74
enum
{
75
IVI_MB_HUFF
= 0,
/// Huffman table is used for coding macroblocks
76
IVI_BLK_HUFF
= 1
/// Huffman table is used for coding blocks
77
};
78
79
80
/**
81
* Common scan patterns (defined in ivi_common.c)
82
*/
83
extern
const
uint8_t
ff_ivi_vertical_scan_8x8
[64];
84
extern
const
uint8_t
ff_ivi_horizontal_scan_8x8
[64];
85
extern
const
uint8_t
ff_ivi_direct_scan_4x4
[16];
86
87
88
/**
89
* Declare inverse transform function types
90
*/
91
typedef
void
(
InvTransformPtr
)(
const
int32_t
*
in
, int16_t *
out
, uint32_t pitch,
const
uint8_t
*
flags
);
92
typedef
void
(
DCTransformPtr
) (
const
int32_t
*
in
, int16_t *
out
, uint32_t pitch,
int
blk_size);
93
94
95
/**
96
* run-value (RLE) table descriptor
97
*/
98
typedef
struct
RVMapDesc
{
99
uint8_t
eob_sym
;
///< end of block symbol
100
uint8_t
esc_sym
;
///< escape symbol
101
uint8_t
runtab
[256];
102
int8_t
valtab
[256];
103
}
RVMapDesc
;
104
105
extern
const
RVMapDesc
ff_ivi_rvmap_tabs
[9];
106
107
108
/**
109
* information for Indeo macroblock (16x16, 8x8 or 4x4)
110
*/
111
typedef
struct
IVIMbInfo
{
112
int16_t
xpos
;
113
int16_t
ypos
;
114
uint32_t
buf_offs
;
///< address in the output buffer for this mb
115
uint8_t
type
;
///< macroblock type: 0 - INTRA, 1 - INTER
116
uint8_t
cbp
;
///< coded block pattern
117
int8_t
q_delta
;
///< quant delta
118
int8_t
mv_x
;
///< motion vector (x component)
119
int8_t
mv_y
;
///< motion vector (y component)
120
int8_t
b_mv_x
;
///< second motion vector (x component)
121
int8_t
b_mv_y
;
///< second motion vector (y component)
122
}
IVIMbInfo
;
123
124
125
/**
126
* information for Indeo tile
127
*/
128
typedef
struct
IVITile
{
129
int
xpos
;
130
int
ypos
;
131
int
width
;
132
int
height
;
133
int
mb_size
;
134
int
is_empty
;
///< = 1 if this tile doesn't contain any data
135
int
data_size
;
///< size of the data in bytes
136
int
num_MBs
;
///< number of macroblocks in this tile
137
IVIMbInfo
*
mbs
;
///< array of macroblock descriptors
138
IVIMbInfo
*
ref_mbs
;
///< ptr to the macroblock descriptors of the reference tile
139
}
IVITile
;
140
141
142
/**
143
* information for Indeo wavelet band
144
*/
145
typedef
struct
IVIBandDesc
{
146
int
plane
;
///< plane number this band belongs to
147
int
band_num
;
///< band number
148
int
width
;
149
int
height
;
150
int
aheight
;
///< aligned band height
151
const
uint8_t
*
data_ptr
;
///< ptr to the first byte of the band data
152
int
data_size
;
///< size of the band data
153
int16_t *
buf
;
///< pointer to the output buffer for this band
154
int16_t *
ref_buf
;
///< pointer to the reference frame buffer (for motion compensation)
155
int16_t *
b_ref_buf
;
///< pointer to the second reference frame buffer (for motion compensation)
156
int16_t *
bufs
[4];
///< array of pointers to the band buffers
157
int
pitch
;
///< pitch associated with the buffers above
158
int
is_empty
;
///< = 1 if this band doesn't contain any data
159
int
mb_size
;
///< macroblock size
160
int
blk_size
;
///< block size
161
int
is_halfpel
;
///< precision of the motion compensation: 0 - fullpel, 1 - halfpel
162
int
inherit_mv
;
///< tells if motion vector is inherited from reference macroblock
163
int
inherit_qdelta
;
///< tells if quantiser delta is inherited from reference macroblock
164
int
qdelta_present
;
///< tells if Qdelta signal is present in the bitstream (Indeo5 only)
165
int
quant_mat
;
///< dequant matrix index
166
int
glob_quant
;
///< quant base for this band
167
const
uint8_t
*
scan
;
///< ptr to the scan pattern
168
int
scan_size
;
///< size of the scantable
169
170
IVIHuffTab
blk_vlc
;
///< vlc table for decoding block data
171
172
int
num_corr
;
///< number of correction entries
173
uint8_t
corr
[61*2];
///< rvmap correction pairs
174
int
rvmap_sel
;
///< rvmap table selector
175
RVMapDesc
*
rv_map
;
///< ptr to the RLE table for this band
176
int
num_tiles
;
///< number of tiles in this band
177
IVITile
*
tiles
;
///< array of tile descriptors
178
InvTransformPtr
*
inv_transform
;
179
int
transform_size
;
180
DCTransformPtr
*
dc_transform
;
181
int
is_2d_trans
;
///< 1 indicates that the two-dimensional inverse transform is used
182
int32_t
checksum
;
///< for debug purposes
183
int
checksum_present
;
184
int
bufsize
;
///< band buffer size in bytes
185
const
uint16_t *
intra_base
;
///< quantization matrix for intra blocks
186
const
uint16_t *
inter_base
;
///< quantization matrix for inter blocks
187
const
uint8_t
*
intra_scale
;
///< quantization coefficient for intra blocks
188
const
uint8_t
*
inter_scale
;
///< quantization coefficient for inter blocks
189
}
IVIBandDesc
;
190
191
192
/**
193
* color plane (luma or chroma) information
194
*/
195
typedef
struct
IVIPlaneDesc
{
196
uint16_t
width
;
197
uint16_t
height
;
198
uint8_t
num_bands
;
///< number of bands this plane subdivided into
199
IVIBandDesc
*
bands
;
///< array of band descriptors
200
}
IVIPlaneDesc
;
201
202
203
typedef
struct
IVIPicConfig
{
204
uint16_t
pic_width
;
205
uint16_t
pic_height
;
206
uint16_t
chroma_width
;
207
uint16_t
chroma_height
;
208
uint16_t
tile_width
;
209
uint16_t
tile_height
;
210
uint8_t
luma_bands
;
211
uint8_t
chroma_bands
;
212
}
IVIPicConfig
;
213
214
typedef
struct
IVI45DecContext
{
215
GetBitContext
gb
;
216
RVMapDesc
rvmap_tabs
[9];
///< local corrected copy of the static rvmap tables
217
218
uint32_t
frame_num
;
219
int
frame_type
;
220
int
prev_frame_type
;
///< frame type of the previous frame
221
uint32_t
data_size
;
///< size of the frame data in bytes from picture header
222
int
is_scalable
;
223
int
transp_status
;
///< transparency mode status: 1 - enabled
224
const
uint8_t
*
frame_data
;
///< input frame data pointer
225
int
inter_scal
;
///< signals a sequence of scalable inter frames
226
uint32_t
frame_size
;
///< frame size in bytes
227
uint32_t
pic_hdr_size
;
///< picture header size in bytes
228
uint8_t
frame_flags
;
229
uint16_t
checksum
;
///< frame checksum
230
231
IVIPicConfig
pic_conf
;
232
IVIPlaneDesc
planes
[3];
///< color planes
233
234
int
buf_switch
;
///< used to switch between three buffers
235
int
dst_buf
;
///< buffer index for the currently decoded frame
236
int
ref_buf
;
///< inter frame reference buffer index
237
int
ref2_buf
;
///< temporal storage for switching buffers
238
int
b_ref_buf
;
///< second reference frame buffer index
239
240
IVIHuffTab
mb_vlc
;
///< current macroblock table descriptor
241
IVIHuffTab
blk_vlc
;
///< current block table descriptor
242
243
uint8_t
rvmap_sel
;
244
uint8_t
in_imf
;
245
uint8_t
in_q
;
///< flag for explicitly stored quantiser delta
246
uint8_t
pic_glob_quant
;
247
uint8_t
unknown1
;
248
249
uint16_t
gop_hdr_size
;
250
uint8_t
gop_flags
;
251
uint32_t
lock_word
;
252
253
#if IVI4_STREAM_ANALYSER
254
uint8_t
has_b_frames;
255
uint8_t
has_transp;
256
uint8_t
uses_tiling;
257
uint8_t
uses_haar;
258
uint8_t
uses_fullpel;
259
#endif
260
261
int (*
decode_pic_hdr
) (
struct
IVI45DecContext
*ctx,
AVCodecContext
*avctx);
262
int (*
decode_band_hdr
) (
struct
IVI45DecContext
*ctx,
IVIBandDesc
*
band
,
AVCodecContext
*avctx);
263
int (*
decode_mb_info
) (
struct
IVI45DecContext
*ctx,
IVIBandDesc
*
band
,
IVITile
*tile,
AVCodecContext
*avctx);
264
void
(*
switch_buffers
) (
struct
IVI45DecContext
*ctx);
265
int (*
is_nonnull_frame
)(
struct
IVI45DecContext
*ctx);
266
267
int
gop_invalid
;
268
int
buf_invalid
[4];
269
270
int
is_indeo4
;
271
272
AVFrame
*
p_frame
;
273
int
got_p_frame
;
274
}
IVI45DecContext
;
275
276
/** compare some properties of two pictures */
277
static
inline
int
ivi_pic_config_cmp
(
IVIPicConfig
*str1,
IVIPicConfig
*str2)
278
{
279
return
str1->
pic_width
!= str2->
pic_width
|| str1->
pic_height
!= str2->
pic_height
||
280
str1->
chroma_width
!= str2->
chroma_width
|| str1->
chroma_height
!= str2->
chroma_height
||
281
str1->
tile_width
!= str2->
tile_width
|| str1->
tile_height
!= str2->
tile_height
||
282
str1->
luma_bands
!= str2->
luma_bands
|| str1->
chroma_bands
!= str2->
chroma_bands
;
283
}
284
285
/** calculate number of tiles in a stride */
286
#define IVI_NUM_TILES(stride, tile_size) (((stride) + (tile_size) - 1) / (tile_size))
287
288
/** calculate number of macroblocks in a tile */
289
#define IVI_MBs_PER_TILE(tile_width, tile_height, mb_size) \
290
((((tile_width) + (mb_size) - 1) / (mb_size)) * (((tile_height) + (mb_size) - 1) / (mb_size)))
291
292
/** convert unsigned values into signed ones (the sign is in the LSB) */
293
#define IVI_TOSIGNED(val) (-(((val) >> 1) ^ -((val) & 1)))
294
295
/** scale motion vector */
296
static
inline
int
ivi_scale_mv
(
int
mv
,
int
mv_scale
)
297
{
298
return
(mv + (mv > 0) + (mv_scale - 1)) >>
mv_scale
;
299
}
300
301
/**
302
* Initialize static codes used for macroblock and block decoding.
303
*/
304
void
ff_ivi_init_static_vlc
(
void
);
305
306
/**
307
* Decode a huffman codebook descriptor from the bitstream
308
* and select specified huffman table.
309
*
310
* @param[in,out] gb the GetBit context
311
* @param[in] desc_coded flag signalling if table descriptor was coded
312
* @param[in] which_tab codebook purpose (IVI_MB_HUFF or IVI_BLK_HUFF)
313
* @param[out] huff_tab pointer to the descriptor of the selected table
314
* @param[in] avctx AVCodecContext pointer
315
* @return zero on success, negative value otherwise
316
*/
317
int
ff_ivi_dec_huff_desc
(
GetBitContext
*
gb
,
int
desc_coded,
int
which_tab,
318
IVIHuffTab
*huff_tab,
AVCodecContext
*avctx);
319
320
/**
321
* Initialize planes (prepares descriptors, allocates buffers etc).
322
*
323
* @param[in,out] planes pointer to the array of the plane descriptors
324
* @param[in] cfg pointer to the ivi_pic_config structure describing picture layout
325
* @param[in] is_indeo4 flag signalling if it is Indeo 4 or not
326
* @return result code: 0 - OK
327
*/
328
int
ff_ivi_init_planes
(
IVIPlaneDesc
*
planes
,
const
IVIPicConfig
*cfg,
329
int
is_indeo4
);
330
331
/**
332
* Initialize tile and macroblock descriptors.
333
*
334
* @param[in,out] planes pointer to the array of the plane descriptors
335
* @param[in] tile_width tile width
336
* @param[in] tile_height tile height
337
* @return result code: 0 - OK
338
*/
339
int
ff_ivi_init_tiles
(
IVIPlaneDesc
*
planes
,
int
tile_width,
int
tile_height);
340
341
int
ff_ivi_decode_frame
(
AVCodecContext
*avctx,
void
*
data
,
int
*got_frame,
342
AVPacket
*avpkt);
343
int
ff_ivi_decode_close
(
AVCodecContext
*avctx);
344
345
#endif
/* AVCODEC_IVI_COMMON_H */
Generated on Sun Jul 20 2014 23:05:49 for FFmpeg by
1.8.2