OLD | NEW |
1 /* | 1 /* |
2 * common functions for Indeo Video Interactive codecs (Indeo4 and Indeo5) | 2 * common functions for Indeo Video Interactive codecs (Indeo4 and Indeo5) |
3 * | 3 * |
4 * Copyright (c) 2009 Maxim Poliakovski | 4 * Copyright (c) 2009 Maxim Poliakovski |
5 * | 5 * |
6 * This file is part of FFmpeg. | 6 * This file is part of FFmpeg. |
7 * | 7 * |
8 * FFmpeg is free software; you can redistribute it and/or | 8 * FFmpeg is free software; you can redistribute it and/or |
9 * modify it under the terms of the GNU Lesser General Public | 9 * modify it under the terms of the GNU Lesser General Public |
10 * License as published by the Free Software Foundation; either | 10 * License as published by the Free Software Foundation; either |
(...skipping 27 matching lines...) Expand all Loading... |
38 #define IVI_VLC_BITS 13 ///< max number of bits of the ivi's huffman codes | 38 #define IVI_VLC_BITS 13 ///< max number of bits of the ivi's huffman codes |
39 | 39 |
40 /** | 40 /** |
41 * huffman codebook descriptor | 41 * huffman codebook descriptor |
42 */ | 42 */ |
43 typedef struct { | 43 typedef struct { |
44 int32_t num_rows; | 44 int32_t num_rows; |
45 uint8_t xbits[16]; | 45 uint8_t xbits[16]; |
46 } IVIHuffDesc; | 46 } IVIHuffDesc; |
47 | 47 |
48 extern const IVIHuffDesc ff_ivi_mb_huff_desc[8]; ///< static macroblock huffman
tables | 48 /** |
49 extern const IVIHuffDesc ff_ivi_blk_huff_desc[8]; ///< static block huffman tabl
es | 49 * macroblock/block huffman table descriptor |
| 50 */ |
| 51 typedef struct { |
| 52 int32_t tab_sel; /// index of one of the predefined tables |
| 53 /// or "7" for custom one |
| 54 VLC *tab; /// pointer to the table associated with tab_sel |
| 55 |
| 56 //! the following are used only when tab_sel == 7 |
| 57 IVIHuffDesc cust_desc; /// custom Huffman codebook descriptor |
| 58 VLC cust_tab; /// vlc table for custom codebook |
| 59 } IVIHuffTab; |
| 60 |
| 61 enum { |
| 62 IVI_MB_HUFF = 0, /// Huffman table is used for coding macroblocks |
| 63 IVI_BLK_HUFF = 1 /// Huffman table is used for coding blocks |
| 64 }; |
| 65 |
| 66 extern VLC ff_ivi_mb_vlc_tabs [8]; ///< static macroblock Huffman tables |
| 67 extern VLC ff_ivi_blk_vlc_tabs[8]; ///< static block Huffman tables |
50 | 68 |
51 | 69 |
52 /** | 70 /** |
53 * run-value (RLE) table descriptor | 71 * run-value (RLE) table descriptor |
54 */ | 72 */ |
55 typedef struct { | 73 typedef struct { |
56 uint8_t eob_sym; ///< end of block symbol | 74 uint8_t eob_sym; ///< end of block symbol |
57 uint8_t esc_sym; ///< escape symbol | 75 uint8_t esc_sym; ///< escape symbol |
58 uint8_t runtab[256]; | 76 uint8_t runtab[256]; |
59 int8_t valtab[256]; | 77 int8_t valtab[256]; |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
111 int mb_size; ///< macroblock size | 129 int mb_size; ///< macroblock size |
112 int blk_size; ///< block size | 130 int blk_size; ///< block size |
113 int is_halfpel; ///< precision of the motion compensation: 0
- fullpel, 1 - halfpel | 131 int is_halfpel; ///< precision of the motion compensation: 0
- fullpel, 1 - halfpel |
114 int inherit_mv; ///< tells if motion vector is inherited fro
m reference macroblock | 132 int inherit_mv; ///< tells if motion vector is inherited fro
m reference macroblock |
115 int inherit_qdelta; ///< tells if quantiser delta is inherited f
rom reference macroblock | 133 int inherit_qdelta; ///< tells if quantiser delta is inherited f
rom reference macroblock |
116 int qdelta_present; ///< tells if Qdelta signal is present in th
e bitstream (Indeo5 only) | 134 int qdelta_present; ///< tells if Qdelta signal is present in th
e bitstream (Indeo5 only) |
117 int quant_mat; ///< dequant matrix index | 135 int quant_mat; ///< dequant matrix index |
118 int glob_quant; ///< quant base for this band | 136 int glob_quant; ///< quant base for this band |
119 const uint8_t *scan; ///< ptr to the scan pattern | 137 const uint8_t *scan; ///< ptr to the scan pattern |
120 | 138 |
121 int huff_sel; ///< huffman table for this band | 139 IVIHuffTab blk_vlc; ///< vlc table for decoding block data |
122 IVIHuffDesc huff_desc; ///< table descriptor associated with the se
lector above | |
123 VLC *blk_vlc; ///< ptr to the vlc table for decoding block
data | |
124 VLC blk_vlc_cust; ///< custom block vlc table | |
125 | 140 |
126 uint16_t *dequant_intra; ///< ptr to dequant tables for intra blocks | 141 uint16_t *dequant_intra; ///< ptr to dequant tables for intra blocks |
127 uint16_t *dequant_inter; ///< ptr dequant tables for inter blocks | 142 uint16_t *dequant_inter; ///< ptr dequant tables for inter blocks |
128 int num_corr; ///< number of correction entries | 143 int num_corr; ///< number of correction entries |
129 uint8_t corr[61*2]; ///< rvmap correction pairs | 144 uint8_t corr[61*2]; ///< rvmap correction pairs |
130 int rvmap_sel; ///< rvmap table selector | 145 int rvmap_sel; ///< rvmap table selector |
131 RVMapDesc *rv_map; ///< ptr to the RLE table for this band | 146 RVMapDesc *rv_map; ///< ptr to the RLE table for this band |
132 int num_tiles; ///< number of tiles in this band | 147 int num_tiles; ///< number of tiles in this band |
133 IVITile *tiles; ///< array of tile descriptors | 148 IVITile *tiles; ///< array of tile descriptors |
134 void (*inv_transform)(const int32_t *in, int16_t *out, uint32_t pitch, const
uint8_t *flags); ///< inverse transform function pointer | 149 void (*inv_transform)(const int32_t *in, int16_t *out, uint32_t pitch, const
uint8_t *flags); ///< inverse transform function pointer |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
176 } | 191 } |
177 | 192 |
178 /** calculate number of tiles in a stride */ | 193 /** calculate number of tiles in a stride */ |
179 #define IVI_NUM_TILES(stride, tile_size) (((stride) + (tile_size) - 1) / (tile_s
ize)) | 194 #define IVI_NUM_TILES(stride, tile_size) (((stride) + (tile_size) - 1) / (tile_s
ize)) |
180 | 195 |
181 /** calculate number of macroblocks in a tile */ | 196 /** calculate number of macroblocks in a tile */ |
182 #define IVI_MBs_PER_TILE(tile_width, tile_height, mb_size) \ | 197 #define IVI_MBs_PER_TILE(tile_width, tile_height, mb_size) \ |
183 ((((tile_width) + (mb_size) - 1) / (mb_size)) * (((tile_height) + (mb_size)
- 1) / (mb_size))) | 198 ((((tile_width) + (mb_size) - 1) / (mb_size)) * (((tile_height) + (mb_size)
- 1) / (mb_size))) |
184 | 199 |
185 /** convert unsigned values into signed ones (the sign is in the LSB) */ | 200 /** convert unsigned values into signed ones (the sign is in the LSB) */ |
186 /* TODO: find a way to calculate this without the conditional using bit magic */ | |
187 #define IVI_TOSIGNED(val) (-(((val) >> 1) ^ -((val) & 1))) | 201 #define IVI_TOSIGNED(val) (-(((val) >> 1) ^ -((val) & 1))) |
188 | 202 |
189 /** scales motion vector */ | 203 /** scales motion vector */ |
190 static inline int ivi_scale_mv(int mv, int mv_scale) | 204 static inline int ivi_scale_mv(int mv, int mv_scale) |
191 { | 205 { |
192 return (mv + (mv > 0) + (mv_scale - 1)) >> mv_scale; | 206 return (mv + (mv > 0) + (mv_scale - 1)) >> mv_scale; |
193 } | 207 } |
194 | 208 |
195 /** | 209 /** |
196 * Generates a huffman codebook from the given descriptor | 210 * Generates a huffman codebook from the given descriptor |
197 * and converts it into the FFmpeg VLC table. | 211 * and converts it into the FFmpeg VLC table. |
198 * | 212 * |
199 * @param cb [in] pointer to codebook descriptor | 213 * @param cb [in] pointer to codebook descriptor |
200 * @param vlc [out] where to place the generated VLC table | 214 * @param vlc [out] where to place the generated VLC table |
201 * @param flag [in] flag: 1 - for static or 0 for dynamic tables | 215 * @param flag [in] flag: 1 - for static or 0 for dynamic tables |
202 * @return result code: 0 - OK, -1 = error (invalid codebook descriptor) | 216 * @return result code: 0 - OK, -1 = error (invalid codebook descriptor) |
203 */ | 217 */ |
204 int ff_ivi_create_huff_from_desc(const IVIHuffDesc *cb, VLC *vlc, int flag); | 218 int ff_ivi_create_huff_from_desc(const IVIHuffDesc *cb, VLC *vlc, int flag); |
205 | 219 |
206 /** | 220 /** |
207 * Decodes a huffman codebook descriptor from the bitstream. | 221 * Initializes static codes used for macroblock and block decoding. |
| 222 */ |
| 223 void ff_ivi_init_static_vlc(void); |
| 224 |
| 225 /** |
| 226 * Decodes a huffman codebook descriptor from the bitstream |
| 227 * and selects specified huffman table. |
208 * | 228 * |
209 * @param gb [in,out] the GetBit context | 229 * @param gb [in,out] the GetBit context |
210 * @param desc [out] ptr to descriptor to be filled with data | 230 * @param desc_coded [in] flag signalling if table descriptor was coded |
211 * @return selector indicating huffman table: | 231 * @param which_tab [in] codebook purpose (IVI_MB_HUFF or IVI_BLK_HUFF) |
212 * (0...6 - predefined, 7 - custom one supplied with the bitstream) | 232 * @param huff_tab [out] pointer to the descriptor of the selected table |
| 233 * @param avctx [in] AVCodecContext pointer |
| 234 * @return zero on success, negative value otherwise |
213 */ | 235 */ |
214 int ff_ivi_dec_huff_desc(GetBitContext *gb, IVIHuffDesc *desc); | 236 int ff_ivi_dec_huff_desc(GetBitContext *gb, int desc_coded, int which_tab, |
| 237 IVIHuffTab *huff_tab, AVCodecContext *avctx); |
215 | 238 |
216 /** | 239 /** |
217 * Compares two huffman codebook descriptors. | 240 * Compares two huffman codebook descriptors. |
218 * | 241 * |
219 * @param desc1 [in] ptr to the 1st descriptor to compare | 242 * @param desc1 [in] ptr to the 1st descriptor to compare |
220 * @param desc2 [in] ptr to the 2nd descriptor to compare | 243 * @param desc2 [in] ptr to the 2nd descriptor to compare |
221 * @return comparison result: 0 - equal, 1 - not equal | 244 * @return comparison result: 0 - equal, 1 - not equal |
222 */ | 245 */ |
223 int ff_ivi_huff_desc_cmp(const IVIHuffDesc *desc1, const IVIHuffDesc *desc2); | 246 int ff_ivi_huff_desc_cmp(const IVIHuffDesc *desc1, const IVIHuffDesc *desc2); |
224 | 247 |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
310 */ | 333 */ |
311 uint16_t ivi_calc_band_checksum (IVIBandDesc *band); | 334 uint16_t ivi_calc_band_checksum (IVIBandDesc *band); |
312 | 335 |
313 /** | 336 /** |
314 * Verifies that band data lies in range. | 337 * Verifies that band data lies in range. |
315 */ | 338 */ |
316 int ivi_check_band (IVIBandDesc *band, const uint8_t *ref, int pitch); | 339 int ivi_check_band (IVIBandDesc *band, const uint8_t *ref, int pitch); |
317 #endif | 340 #endif |
318 | 341 |
319 #endif /* AVCODEC_IVI_COMMON_H */ | 342 #endif /* AVCODEC_IVI_COMMON_H */ |
OLD | NEW |