Imported Debian version 2.5.3~trusty1
[deb_ffmpeg.git] / ffmpeg / libavcodec / ivi_dsp.h
CommitLineData
2ba45a60
DM
1/*
2 * DSP functions for Indeo Video Interactive codecs (Indeo4 and Indeo5)
3 *
4 * Copyright (c) 2009-2011 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 * DSP functions (inverse transforms, motion compensations, wavelet recompostion)
26 * for Indeo Video Interactive codecs.
27 */
28
29#ifndef AVCODEC_IVI_DSP_H
30#define AVCODEC_IVI_DSP_H
31
32#include "avcodec.h"
33#include "ivi_common.h"
34
35/**
36 * 5/3 wavelet recomposition filter for Indeo5
37 *
38 * @param[in] plane pointer to the descriptor of the plane being processed
39 * @param[out] dst pointer to the destination buffer
40 * @param[in] dst_pitch pitch of the destination buffer
41 */
42void ff_ivi_recompose53(const IVIPlaneDesc *plane, uint8_t *dst,
43 const int dst_pitch);
44
45/**
46 * Haar wavelet recomposition filter for Indeo 4
47 *
48 * @param[in] plane pointer to the descriptor of the plane being processed
49 * @param[out] dst pointer to the destination buffer
50 * @param[in] dst_pitch pitch of the destination buffer
51 */
52void ff_ivi_recompose_haar(const IVIPlaneDesc *plane, uint8_t *dst,
53 const int dst_pitch);
54
55/**
56 * two-dimensional inverse Haar 8x8 transform for Indeo 4
57 *
58 * @param[in] in pointer to the vector of transform coefficients
59 * @param[out] out pointer to the output buffer (frame)
60 * @param[in] pitch pitch to move to the next y line
61 * @param[in] flags pointer to the array of column flags:
62 * != 0 - non_empty column, 0 - empty one
63 * (this array must be filled by caller)
64 */
65void ff_ivi_inverse_haar_8x8(const int32_t *in, int16_t *out, uint32_t pitch,
66 const uint8_t *flags);
67void ff_ivi_inverse_haar_8x1(const int32_t *in, int16_t *out, uint32_t pitch,
68 const uint8_t *flags);
69void ff_ivi_inverse_haar_1x8(const int32_t *in, int16_t *out, uint32_t pitch,
70 const uint8_t *flags);
71
72/**
73 * one-dimensional inverse 8-point Haar transform on rows for Indeo 4
74 *
75 * @param[in] in pointer to the vector of transform coefficients
76 * @param[out] out pointer to the output buffer (frame)
77 * @param[in] pitch pitch to move to the next y line
78 * @param[in] flags pointer to the array of column flags:
79 * != 0 - non_empty column, 0 - empty one
80 * (this array must be filled by caller)
81 */
82void ff_ivi_row_haar8(const int32_t *in, int16_t *out, uint32_t pitch,
83 const uint8_t *flags);
84
85/**
86 * one-dimensional inverse 8-point Haar transform on columns for Indeo 4
87 *
88 * @param[in] in pointer to the vector of transform coefficients
89 * @param[out] out pointer to the output buffer (frame)
90 * @param[in] pitch pitch to move to the next y line
91 * @param[in] flags pointer to the array of column flags:
92 * != 0 - non_empty column, 0 - empty one
93 * (this array must be filled by caller)
94 */
95void ff_ivi_col_haar8(const int32_t *in, int16_t *out, uint32_t pitch,
96 const uint8_t *flags);
97
98/**
99 * two-dimensional inverse Haar 4x4 transform for Indeo 4
100 *
101 * @param[in] in pointer to the vector of transform coefficients
102 * @param[out] out pointer to the output buffer (frame)
103 * @param[in] pitch pitch to move to the next y line
104 * @param[in] flags pointer to the array of column flags:
105 * != 0 - non_empty column, 0 - empty one
106 * (this array must be filled by caller)
107 */
108void ff_ivi_inverse_haar_4x4(const int32_t *in, int16_t *out, uint32_t pitch,
109 const uint8_t *flags);
110
111/**
112 * one-dimensional inverse 4-point Haar transform on rows for Indeo 4
113 *
114 * @param[in] in pointer to the vector of transform coefficients
115 * @param[out] out pointer to the output buffer (frame)
116 * @param[in] pitch pitch to move to the next y line
117 * @param[in] flags pointer to the array of column flags:
118 * != 0 - non_empty column, 0 - empty one
119 * (this array must be filled by caller)
120 */
121void ff_ivi_row_haar4(const int32_t *in, int16_t *out, uint32_t pitch,
122 const uint8_t *flags);
123
124/**
125 * one-dimensional inverse 4-point Haar transform on columns for Indeo 4
126 *
127 * @param[in] in pointer to the vector of transform coefficients
128 * @param[out] out pointer to the output buffer (frame)
129 * @param[in] pitch pitch to move to the next y line
130 * @param[in] flags pointer to the array of column flags:
131 * != 0 - non_empty column, 0 - empty one
132 * (this array must be filled by caller)
133 */
134void ff_ivi_col_haar4(const int32_t *in, int16_t *out, uint32_t pitch,
135 const uint8_t *flags);
136
137/**
138 * DC-only two-dimensional inverse Haar transform for Indeo 4.
139 * Performing the inverse transform in this case is equivalent to
140 * spreading DC_coeff >> 3 over the whole block.
141 *
142 * @param[in] in pointer to the dc coefficient
143 * @param[out] out pointer to the output buffer (frame)
144 * @param[in] pitch pitch to move to the next y line
145 * @param[in] blk_size transform block size
146 */
147void ff_ivi_dc_haar_2d(const int32_t *in, int16_t *out, uint32_t pitch,
148 int blk_size);
149
150/**
151 * two-dimensional inverse slant 8x8 transform
152 *
153 * @param[in] in pointer to the vector of transform coefficients
154 * @param[out] out pointer to the output buffer (frame)
155 * @param[in] pitch pitch to move to the next y line
156 * @param[in] flags pointer to the array of column flags:
157 * != 0 - non_empty column, 0 - empty one
158 * (this array must be filled by caller)
159 */
160void ff_ivi_inverse_slant_8x8(const int32_t *in, int16_t *out, uint32_t pitch,
161 const uint8_t *flags);
162
163/**
164 * two-dimensional inverse slant 4x4 transform
165 *
166 * @param[in] in pointer to the vector of transform coefficients
167 * @param[out] out pointer to the output buffer (frame)
168 * @param[in] pitch pitch to move to the next y line
169 * @param[in] flags pointer to the array of column flags:
170 * != 0 - non_empty column, 0 - empty one
171 * (this array must be filled by caller)
172 */
173void ff_ivi_inverse_slant_4x4(const int32_t *in, int16_t *out, uint32_t pitch,
174 const uint8_t *flags);
175
176/**
177 * DC-only two-dimensional inverse slant transform.
178 * Performing the inverse slant transform in this case is equivalent to
179 * spreading (DC_coeff + 1)/2 over the whole block.
180 * It works much faster than performing the slant transform on a vector of zeroes.
181 *
182 * @param[in] in pointer to the dc coefficient
183 * @param[out] out pointer to the output buffer (frame)
184 * @param[in] pitch pitch to move to the next y line
185 * @param[in] blk_size transform block size
186 */
187void ff_ivi_dc_slant_2d(const int32_t *in, int16_t *out, uint32_t pitch, int blk_size);
188
189/**
190 * inverse 1D row slant transform
191 *
192 * @param[in] in pointer to the vector of transform coefficients
193 * @param[out] out pointer to the output buffer (frame)
194 * @param[in] pitch pitch to move to the next y line
195 * @param[in] flags pointer to the array of column flags (unused here)
196 */
197void ff_ivi_row_slant8(const int32_t *in, int16_t *out, uint32_t pitch,
198 const uint8_t *flags);
199
200/**
201 * inverse 1D column slant transform
202 *
203 * @param[in] in pointer to the vector of transform coefficients
204 * @param[out] out pointer to the output buffer (frame)
205 * @param[in] pitch pitch to move to the next y line
206 * @param[in] flags pointer to the array of column flags:
207 * != 0 - non_empty column, 0 - empty one
208 * (this array must be filled by caller)
209 */
210void ff_ivi_col_slant8(const int32_t *in, int16_t *out, uint32_t pitch,
211 const uint8_t *flags);
212
213/**
214 * inverse 1D row slant transform
215 *
216 * @param[in] in pointer to the vector of transform coefficients
217 * @param[out] out pointer to the output buffer (frame)
218 * @param[in] pitch pitch to move to the next y line
219 * @param[in] flags pointer to the array of column flags (unused here)
220 */
221void ff_ivi_row_slant4(const int32_t *in, int16_t *out, uint32_t pitch,
222 const uint8_t *flags);
223
224/**
225 * inverse 1D column slant transform
226 *
227 * @param[in] in pointer to the vector of transform coefficients
228 * @param[out] out pointer to the output buffer (frame)
229 * @param[in] pitch pitch to move to the next y line
230 * @param[in] flags pointer to the array of column flags:
231 * != 0 - non_empty column, 0 - empty one
232 * (this array must be filled by caller)
233 */
234void ff_ivi_col_slant4(const int32_t *in, int16_t *out, uint32_t pitch,
235 const uint8_t *flags);
236
237/**
238 * DC-only inverse row slant transform
239 */
240void ff_ivi_dc_row_slant(const int32_t *in, int16_t *out, uint32_t pitch, int blk_size);
241
242/**
243 * DC-only inverse column slant transform
244 */
245void ff_ivi_dc_col_slant(const int32_t *in, int16_t *out, uint32_t pitch, int blk_size);
246
247/**
248 * Copy the pixels into the frame buffer.
249 */
250void ff_ivi_put_pixels_8x8(const int32_t *in, int16_t *out, uint32_t pitch, const uint8_t *flags);
251
252/**
253 * Copy the DC coefficient into the first pixel of the block and
254 * zero all others.
255 */
256void ff_ivi_put_dc_pixel_8x8(const int32_t *in, int16_t *out, uint32_t pitch, int blk_size);
257
258/**
259 * 8x8 block motion compensation with adding delta
260 *
261 * @param[in,out] buf pointer to the block in the current frame buffer containing delta
262 * @param[in] ref_buf pointer to the corresponding block in the reference frame
263 * @param[in] pitch pitch for moving to the next y line
264 * @param[in] mc_type interpolation type
265 */
266void ff_ivi_mc_8x8_delta(int16_t *buf, const int16_t *ref_buf, uint32_t pitch, int mc_type);
267
268/**
269 * 4x4 block motion compensation with adding delta
270 *
271 * @param[in,out] buf pointer to the block in the current frame buffer containing delta
272 * @param[in] ref_buf pointer to the corresponding block in the reference frame
273 * @param[in] pitch pitch for moving to the next y line
274 * @param[in] mc_type interpolation type
275 */
276void ff_ivi_mc_4x4_delta(int16_t *buf, const int16_t *ref_buf, uint32_t pitch, int mc_type);
277
278/**
279 * motion compensation without adding delta
280 *
281 * @param[in,out] buf pointer to the block in the current frame receiving the result
282 * @param[in] ref_buf pointer to the corresponding block in the reference frame
283 * @param[in] pitch pitch for moving to the next y line
284 * @param[in] mc_type interpolation type
285 */
286void ff_ivi_mc_8x8_no_delta(int16_t *buf, const int16_t *ref_buf, uint32_t pitch, int mc_type);
287
288/**
289 * 4x4 block motion compensation without adding delta
290 *
291 * @param[in,out] buf pointer to the block in the current frame receiving the result
292 * @param[in] ref_buf pointer to the corresponding block in the reference frame
293 * @param[in] pitch pitch for moving to the next y line
294 * @param[in] mc_type interpolation type
295 */
296void ff_ivi_mc_4x4_no_delta(int16_t *buf, const int16_t *ref_buf, uint32_t pitch, int mc_type);
297
298/**
299 * 8x8 block motion compensation with adding delta
300 *
301 * @param[in,out] buf pointer to the block in the current frame buffer containing delta
302 * @param[in] ref_buf pointer to the corresponding block in the backward reference frame
303 * @param[in] ref_buf2 pointer to the corresponding block in the forward reference frame
304 * @param[in] pitch pitch for moving to the next y line
305 * @param[in] mc_type interpolation type for backward reference
306 * @param[in] mc_type2 interpolation type for forward reference
307 */
308void ff_ivi_mc_avg_8x8_delta(int16_t *buf, const int16_t *ref_buf, const int16_t *ref_buf2, uint32_t pitch, int mc_type, int mc_type2);
309
310/**
311 * 4x4 block motion compensation with adding delta
312 *
313 * @param[in,out] buf pointer to the block in the current frame buffer containing delta
314 * @param[in] ref_buf pointer to the corresponding block in the backward reference frame
315 * @param[in] ref_buf2 pointer to the corresponding block in the forward reference frame
316 * @param[in] pitch pitch for moving to the next y line
317 * @param[in] mc_type interpolation type for backward reference
318 * @param[in] mc_type2 interpolation type for forward reference
319 */
320void ff_ivi_mc_avg_4x4_delta(int16_t *buf, const int16_t *ref_buf, const int16_t *ref_buf2, uint32_t pitch, int mc_type, int mc_type2);
321
322/**
323 * motion compensation without adding delta for B-frames
324 *
325 * @param[in,out] buf pointer to the block in the current frame receiving the result
326 * @param[in] ref_buf pointer to the corresponding block in the backward reference frame
327 * @param[in] ref_buf2 pointer to the corresponding block in the forward reference frame
328 * @param[in] pitch pitch for moving to the next y line
329 * @param[in] mc_type interpolation type for backward reference
330 * @param[in] mc_type2 interpolation type for forward reference
331 */
332void ff_ivi_mc_avg_8x8_no_delta(int16_t *buf, const int16_t *ref_buf, const int16_t *ref_buf2, uint32_t pitch, int mc_type, int mc_type2);
333
334/**
335 * 4x4 block motion compensation without adding delta for B-frames
336 *
337 * @param[in,out] buf pointer to the block in the current frame receiving the result
338 * @param[in] ref_buf pointer to the corresponding block in the backward reference frame
339 * @param[in] ref_buf2 pointer to the corresponding block in the forward reference frame
340 * @param[in] pitch pitch for moving to the next y line
341 * @param[in] mc_type interpolation type for backward reference
342 * @param[in] mc_type2 interpolation type for forward reference
343 */
344void ff_ivi_mc_avg_4x4_no_delta(int16_t *buf, const int16_t *ref_buf, const int16_t *ref_buf2, uint32_t pitch, int mc_type, int mc_type2);
345
346#endif /* AVCODEC_IVI_DSP_H */