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 */ 347