annotate ffmpeg/libavcodec/dirac_dwt.c @ 13:844d341cf643 tip

Back up before ISMIR
author Yading Song <yading.song@eecs.qmul.ac.uk>
date Thu, 31 Oct 2013 13:17:06 +0000
parents 6840f77b83aa
children
rev   line source
yading@10 1 /*
yading@10 2 * Copyright (C) 2004-2010 Michael Niedermayer <michaelni@gmx.at>
yading@10 3 * Copyright (C) 2008 David Conrad
yading@10 4 *
yading@10 5 * This file is part of FFmpeg.
yading@10 6 *
yading@10 7 * FFmpeg is free software; you can redistribute it and/or
yading@10 8 * modify it under the terms of the GNU Lesser General Public
yading@10 9 * License as published by the Free Software Foundation; either
yading@10 10 * version 2.1 of the License, or (at your option) any later version.
yading@10 11 *
yading@10 12 * FFmpeg is distributed in the hope that it will be useful,
yading@10 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
yading@10 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
yading@10 15 * Lesser General Public License for more details.
yading@10 16 *
yading@10 17 * You should have received a copy of the GNU Lesser General Public
yading@10 18 * License along with FFmpeg; if not, write to the Free Software
yading@10 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
yading@10 20 */
yading@10 21
yading@10 22 #include "libavutil/attributes.h"
yading@10 23 #include "libavutil/avassert.h"
yading@10 24 #include "libavutil/common.h"
yading@10 25 #include "dsputil.h"
yading@10 26 #include "dirac_dwt.h"
yading@10 27 #include "libavcodec/x86/dirac_dwt.h"
yading@10 28
yading@10 29
yading@10 30 static inline int mirror(int v, int m)
yading@10 31 {
yading@10 32 while ((unsigned)v > (unsigned)m) {
yading@10 33 v = -v;
yading@10 34 if (v < 0)
yading@10 35 v += 2 * m;
yading@10 36 }
yading@10 37 return v;
yading@10 38 }
yading@10 39
yading@10 40 static void vertical_compose53iL0(IDWTELEM *b0, IDWTELEM *b1, IDWTELEM *b2,
yading@10 41 int width)
yading@10 42 {
yading@10 43 int i;
yading@10 44
yading@10 45 for (i = 0; i < width; i++)
yading@10 46 b1[i] -= (b0[i] + b2[i] + 2) >> 2;
yading@10 47 }
yading@10 48
yading@10 49
yading@10 50 static av_always_inline
yading@10 51 void interleave(IDWTELEM *dst, IDWTELEM *src0, IDWTELEM *src1, int w2, int add, int shift)
yading@10 52 {
yading@10 53 int i;
yading@10 54 for (i = 0; i < w2; i++) {
yading@10 55 dst[2*i ] = (src0[i] + add) >> shift;
yading@10 56 dst[2*i+1] = (src1[i] + add) >> shift;
yading@10 57 }
yading@10 58 }
yading@10 59
yading@10 60 static void horizontal_compose_dirac53i(IDWTELEM *b, IDWTELEM *temp, int w)
yading@10 61 {
yading@10 62 const int w2 = w >> 1;
yading@10 63 int x;
yading@10 64
yading@10 65 temp[0] = COMPOSE_53iL0(b[w2], b[0], b[w2]);
yading@10 66 for (x = 1; x < w2; x++) {
yading@10 67 temp[x ] = COMPOSE_53iL0 (b[x+w2-1], b[x ], b[x+w2]);
yading@10 68 temp[x+w2-1] = COMPOSE_DIRAC53iH0(temp[x-1], b[x+w2-1], temp[x]);
yading@10 69 }
yading@10 70 temp[w-1] = COMPOSE_DIRAC53iH0(temp[w2-1], b[w-1], temp[w2-1]);
yading@10 71
yading@10 72 interleave(b, temp, temp+w2, w2, 1, 1);
yading@10 73 }
yading@10 74
yading@10 75 static void horizontal_compose_dd97i(IDWTELEM *b, IDWTELEM *tmp, int w)
yading@10 76 {
yading@10 77 const int w2 = w >> 1;
yading@10 78 int x;
yading@10 79
yading@10 80 tmp[0] = COMPOSE_53iL0(b[w2], b[0], b[w2]);
yading@10 81 for (x = 1; x < w2; x++)
yading@10 82 tmp[x] = COMPOSE_53iL0(b[x+w2-1], b[x], b[x+w2]);
yading@10 83
yading@10 84 // extend the edges
yading@10 85 tmp[-1] = tmp[0];
yading@10 86 tmp[w2+1] = tmp[w2] = tmp[w2-1];
yading@10 87
yading@10 88 for (x = 0; x < w2; x++) {
yading@10 89 b[2*x ] = (tmp[x] + 1)>>1;
yading@10 90 b[2*x+1] = (COMPOSE_DD97iH0(tmp[x-1], tmp[x], b[x+w2], tmp[x+1], tmp[x+2]) + 1)>>1;
yading@10 91 }
yading@10 92 }
yading@10 93
yading@10 94 static void horizontal_compose_dd137i(IDWTELEM *b, IDWTELEM *tmp, int w)
yading@10 95 {
yading@10 96 const int w2 = w >> 1;
yading@10 97 int x;
yading@10 98
yading@10 99 tmp[0] = COMPOSE_DD137iL0(b[w2], b[w2], b[0], b[w2 ], b[w2+1]);
yading@10 100 tmp[1] = COMPOSE_DD137iL0(b[w2], b[w2], b[1], b[w2+1], b[w2+2]);
yading@10 101 for (x = 2; x < w2-1; x++)
yading@10 102 tmp[x] = COMPOSE_DD137iL0(b[x+w2-2], b[x+w2-1], b[x], b[x+w2], b[x+w2+1]);
yading@10 103 tmp[w2-1] = COMPOSE_DD137iL0(b[w-3], b[w-2], b[w2-1], b[w-1], b[w-1]);
yading@10 104
yading@10 105 // extend the edges
yading@10 106 tmp[-1] = tmp[0];
yading@10 107 tmp[w2+1] = tmp[w2] = tmp[w2-1];
yading@10 108
yading@10 109 for (x = 0; x < w2; x++) {
yading@10 110 b[2*x ] = (tmp[x] + 1)>>1;
yading@10 111 b[2*x+1] = (COMPOSE_DD97iH0(tmp[x-1], tmp[x], b[x+w2], tmp[x+1], tmp[x+2]) + 1)>>1;
yading@10 112 }
yading@10 113 }
yading@10 114
yading@10 115 static av_always_inline
yading@10 116 void horizontal_compose_haari(IDWTELEM *b, IDWTELEM *temp, int w, int shift)
yading@10 117 {
yading@10 118 const int w2 = w >> 1;
yading@10 119 int x;
yading@10 120
yading@10 121 for (x = 0; x < w2; x++) {
yading@10 122 temp[x ] = COMPOSE_HAARiL0(b[x ], b[x+w2]);
yading@10 123 temp[x+w2] = COMPOSE_HAARiH0(b[x+w2], temp[x]);
yading@10 124 }
yading@10 125
yading@10 126 interleave(b, temp, temp+w2, w2, shift, shift);
yading@10 127 }
yading@10 128
yading@10 129 static void horizontal_compose_haar0i(IDWTELEM *b, IDWTELEM *temp, int w)
yading@10 130 {
yading@10 131 horizontal_compose_haari(b, temp, w, 0);
yading@10 132 }
yading@10 133
yading@10 134 static void horizontal_compose_haar1i(IDWTELEM *b, IDWTELEM *temp, int w)
yading@10 135 {
yading@10 136 horizontal_compose_haari(b, temp, w, 1);
yading@10 137 }
yading@10 138
yading@10 139 static void horizontal_compose_fidelityi(IDWTELEM *b, IDWTELEM *tmp, int w)
yading@10 140 {
yading@10 141 const int w2 = w >> 1;
yading@10 142 int i, x;
yading@10 143 IDWTELEM v[8];
yading@10 144
yading@10 145 for (x = 0; x < w2; x++) {
yading@10 146 for (i = 0; i < 8; i++)
yading@10 147 v[i] = b[av_clip(x-3+i, 0, w2-1)];
yading@10 148 tmp[x] = COMPOSE_FIDELITYiH0(v[0], v[1], v[2], v[3], b[x+w2], v[4], v[5], v[6], v[7]);
yading@10 149 }
yading@10 150
yading@10 151 for (x = 0; x < w2; x++) {
yading@10 152 for (i = 0; i < 8; i++)
yading@10 153 v[i] = tmp[av_clip(x-4+i, 0, w2-1)];
yading@10 154 tmp[x+w2] = COMPOSE_FIDELITYiL0(v[0], v[1], v[2], v[3], b[x], v[4], v[5], v[6], v[7]);
yading@10 155 }
yading@10 156
yading@10 157 interleave(b, tmp+w2, tmp, w2, 0, 0);
yading@10 158 }
yading@10 159
yading@10 160 static void horizontal_compose_daub97i(IDWTELEM *b, IDWTELEM *temp, int w)
yading@10 161 {
yading@10 162 const int w2 = w >> 1;
yading@10 163 int x, b0, b1, b2;
yading@10 164
yading@10 165 temp[0] = COMPOSE_DAUB97iL1(b[w2], b[0], b[w2]);
yading@10 166 for (x = 1; x < w2; x++) {
yading@10 167 temp[x ] = COMPOSE_DAUB97iL1(b[x+w2-1], b[x ], b[x+w2]);
yading@10 168 temp[x+w2-1] = COMPOSE_DAUB97iH1(temp[x-1], b[x+w2-1], temp[x]);
yading@10 169 }
yading@10 170 temp[w-1] = COMPOSE_DAUB97iH1(temp[w2-1], b[w-1], temp[w2-1]);
yading@10 171
yading@10 172 // second stage combined with interleave and shift
yading@10 173 b0 = b2 = COMPOSE_DAUB97iL0(temp[w2], temp[0], temp[w2]);
yading@10 174 b[0] = (b0 + 1) >> 1;
yading@10 175 for (x = 1; x < w2; x++) {
yading@10 176 b2 = COMPOSE_DAUB97iL0(temp[x+w2-1], temp[x ], temp[x+w2]);
yading@10 177 b1 = COMPOSE_DAUB97iH0( b0, temp[x+w2-1], b2 );
yading@10 178 b[2*x-1] = (b1 + 1) >> 1;
yading@10 179 b[2*x ] = (b2 + 1) >> 1;
yading@10 180 b0 = b2;
yading@10 181 }
yading@10 182 b[w-1] = (COMPOSE_DAUB97iH0(b2, temp[w-1], b2) + 1) >> 1;
yading@10 183 }
yading@10 184
yading@10 185 static void vertical_compose_dirac53iH0(IDWTELEM *b0, IDWTELEM *b1, IDWTELEM *b2, int width)
yading@10 186 {
yading@10 187 int i;
yading@10 188
yading@10 189 for(i=0; i<width; i++){
yading@10 190 b1[i] = COMPOSE_DIRAC53iH0(b0[i], b1[i], b2[i]);
yading@10 191 }
yading@10 192 }
yading@10 193
yading@10 194 static void vertical_compose_dd97iH0(IDWTELEM *b0, IDWTELEM *b1, IDWTELEM *b2,
yading@10 195 IDWTELEM *b3, IDWTELEM *b4, int width)
yading@10 196 {
yading@10 197 int i;
yading@10 198
yading@10 199 for(i=0; i<width; i++){
yading@10 200 b2[i] = COMPOSE_DD97iH0(b0[i], b1[i], b2[i], b3[i], b4[i]);
yading@10 201 }
yading@10 202 }
yading@10 203
yading@10 204 static void vertical_compose_dd137iL0(IDWTELEM *b0, IDWTELEM *b1, IDWTELEM *b2,
yading@10 205 IDWTELEM *b3, IDWTELEM *b4, int width)
yading@10 206 {
yading@10 207 int i;
yading@10 208
yading@10 209 for(i=0; i<width; i++){
yading@10 210 b2[i] = COMPOSE_DD137iL0(b0[i], b1[i], b2[i], b3[i], b4[i]);
yading@10 211 }
yading@10 212 }
yading@10 213
yading@10 214 static void vertical_compose_haar(IDWTELEM *b0, IDWTELEM *b1, int width)
yading@10 215 {
yading@10 216 int i;
yading@10 217
yading@10 218 for (i = 0; i < width; i++) {
yading@10 219 b0[i] = COMPOSE_HAARiL0(b0[i], b1[i]);
yading@10 220 b1[i] = COMPOSE_HAARiH0(b1[i], b0[i]);
yading@10 221 }
yading@10 222 }
yading@10 223
yading@10 224 static void vertical_compose_fidelityiH0(IDWTELEM *dst, IDWTELEM *b[8], int width)
yading@10 225 {
yading@10 226 int i;
yading@10 227
yading@10 228 for(i=0; i<width; i++){
yading@10 229 dst[i] = COMPOSE_FIDELITYiH0(b[0][i], b[1][i], b[2][i], b[3][i], dst[i], b[4][i], b[5][i], b[6][i], b[7][i]);
yading@10 230 }
yading@10 231 }
yading@10 232
yading@10 233 static void vertical_compose_fidelityiL0(IDWTELEM *dst, IDWTELEM *b[8], int width)
yading@10 234 {
yading@10 235 int i;
yading@10 236
yading@10 237 for(i=0; i<width; i++){
yading@10 238 dst[i] = COMPOSE_FIDELITYiL0(b[0][i], b[1][i], b[2][i], b[3][i], dst[i], b[4][i], b[5][i], b[6][i], b[7][i]);
yading@10 239 }
yading@10 240 }
yading@10 241
yading@10 242 static void vertical_compose_daub97iH0(IDWTELEM *b0, IDWTELEM *b1, IDWTELEM *b2, int width)
yading@10 243 {
yading@10 244 int i;
yading@10 245
yading@10 246 for(i=0; i<width; i++){
yading@10 247 b1[i] = COMPOSE_DAUB97iH0(b0[i], b1[i], b2[i]);
yading@10 248 }
yading@10 249 }
yading@10 250
yading@10 251 static void vertical_compose_daub97iH1(IDWTELEM *b0, IDWTELEM *b1, IDWTELEM *b2, int width)
yading@10 252 {
yading@10 253 int i;
yading@10 254
yading@10 255 for(i=0; i<width; i++){
yading@10 256 b1[i] = COMPOSE_DAUB97iH1(b0[i], b1[i], b2[i]);
yading@10 257 }
yading@10 258 }
yading@10 259
yading@10 260 static void vertical_compose_daub97iL0(IDWTELEM *b0, IDWTELEM *b1, IDWTELEM *b2, int width)
yading@10 261 {
yading@10 262 int i;
yading@10 263
yading@10 264 for(i=0; i<width; i++){
yading@10 265 b1[i] = COMPOSE_DAUB97iL0(b0[i], b1[i], b2[i]);
yading@10 266 }
yading@10 267 }
yading@10 268
yading@10 269 static void vertical_compose_daub97iL1(IDWTELEM *b0, IDWTELEM *b1, IDWTELEM *b2, int width)
yading@10 270 {
yading@10 271 int i;
yading@10 272
yading@10 273 for(i=0; i<width; i++){
yading@10 274 b1[i] = COMPOSE_DAUB97iL1(b0[i], b1[i], b2[i]);
yading@10 275 }
yading@10 276 }
yading@10 277
yading@10 278
yading@10 279 static void spatial_compose_dd97i_dy(DWTContext *d, int level, int width, int height, int stride)
yading@10 280 {
yading@10 281 vertical_compose_3tap vertical_compose_l0 = (void*)d->vertical_compose_l0;
yading@10 282 vertical_compose_5tap vertical_compose_h0 = (void*)d->vertical_compose_h0;
yading@10 283 DWTCompose *cs = d->cs + level;
yading@10 284
yading@10 285 int i, y = cs->y;
yading@10 286 IDWTELEM *b[8];
yading@10 287 for (i = 0; i < 6; i++)
yading@10 288 b[i] = cs->b[i];
yading@10 289 b[6] = d->buffer + av_clip(y+5, 0, height-2)*stride;
yading@10 290 b[7] = d->buffer + av_clip(y+6, 1, height-1)*stride;
yading@10 291
yading@10 292 if(y+5<(unsigned)height) vertical_compose_l0( b[5], b[6], b[7], width);
yading@10 293 if(y+1<(unsigned)height) vertical_compose_h0(b[0], b[2], b[3], b[4], b[6], width);
yading@10 294
yading@10 295 if(y-1<(unsigned)height) d->horizontal_compose(b[0], d->temp, width);
yading@10 296 if(y+0<(unsigned)height) d->horizontal_compose(b[1], d->temp, width);
yading@10 297
yading@10 298 for (i = 0; i < 6; i++)
yading@10 299 cs->b[i] = b[i+2];
yading@10 300 cs->y += 2;
yading@10 301 }
yading@10 302
yading@10 303 static void spatial_compose_dirac53i_dy(DWTContext *d, int level, int width, int height, int stride)
yading@10 304 {
yading@10 305 vertical_compose_3tap vertical_compose_l0 = (void*)d->vertical_compose_l0;
yading@10 306 vertical_compose_3tap vertical_compose_h0 = (void*)d->vertical_compose_h0;
yading@10 307 DWTCompose *cs = d->cs + level;
yading@10 308
yading@10 309 int y= cs->y;
yading@10 310 IDWTELEM *b[4] = { cs->b[0], cs->b[1] };
yading@10 311 b[2] = d->buffer + mirror(y+1, height-1)*stride;
yading@10 312 b[3] = d->buffer + mirror(y+2, height-1)*stride;
yading@10 313
yading@10 314 if(y+1<(unsigned)height) vertical_compose_l0(b[1], b[2], b[3], width);
yading@10 315 if(y+0<(unsigned)height) vertical_compose_h0(b[0], b[1], b[2], width);
yading@10 316
yading@10 317 if(y-1<(unsigned)height) d->horizontal_compose(b[0], d->temp, width);
yading@10 318 if(y+0<(unsigned)height) d->horizontal_compose(b[1], d->temp, width);
yading@10 319
yading@10 320 cs->b[0] = b[2];
yading@10 321 cs->b[1] = b[3];
yading@10 322 cs->y += 2;
yading@10 323 }
yading@10 324
yading@10 325
yading@10 326 static void spatial_compose_dd137i_dy(DWTContext *d, int level, int width, int height, int stride)
yading@10 327 {
yading@10 328 vertical_compose_5tap vertical_compose_l0 = (void*)d->vertical_compose_l0;
yading@10 329 vertical_compose_5tap vertical_compose_h0 = (void*)d->vertical_compose_h0;
yading@10 330 DWTCompose *cs = d->cs + level;
yading@10 331
yading@10 332 int i, y = cs->y;
yading@10 333 IDWTELEM *b[10];
yading@10 334 for (i = 0; i < 8; i++)
yading@10 335 b[i] = cs->b[i];
yading@10 336 b[8] = d->buffer + av_clip(y+7, 0, height-2)*stride;
yading@10 337 b[9] = d->buffer + av_clip(y+8, 1, height-1)*stride;
yading@10 338
yading@10 339 if(y+5<(unsigned)height) vertical_compose_l0(b[3], b[5], b[6], b[7], b[9], width);
yading@10 340 if(y+1<(unsigned)height) vertical_compose_h0(b[0], b[2], b[3], b[4], b[6], width);
yading@10 341
yading@10 342 if(y-1<(unsigned)height) d->horizontal_compose(b[0], d->temp, width);
yading@10 343 if(y+0<(unsigned)height) d->horizontal_compose(b[1], d->temp, width);
yading@10 344
yading@10 345 for (i = 0; i < 8; i++)
yading@10 346 cs->b[i] = b[i+2];
yading@10 347 cs->y += 2;
yading@10 348 }
yading@10 349
yading@10 350 // haar makes the assumption that height is even (always true for dirac)
yading@10 351 static void spatial_compose_haari_dy(DWTContext *d, int level, int width, int height, int stride)
yading@10 352 {
yading@10 353 vertical_compose_2tap vertical_compose = (void*)d->vertical_compose;
yading@10 354 int y = d->cs[level].y;
yading@10 355 IDWTELEM *b0 = d->buffer + (y-1)*stride;
yading@10 356 IDWTELEM *b1 = d->buffer + (y )*stride;
yading@10 357
yading@10 358 vertical_compose(b0, b1, width);
yading@10 359 d->horizontal_compose(b0, d->temp, width);
yading@10 360 d->horizontal_compose(b1, d->temp, width);
yading@10 361
yading@10 362 d->cs[level].y += 2;
yading@10 363 }
yading@10 364
yading@10 365 // Don't do sliced idwt for fidelity; the 9 tap filter makes it a bit annoying
yading@10 366 // Fortunately, this filter isn't used in practice.
yading@10 367 static void spatial_compose_fidelity(DWTContext *d, int level, int width, int height, int stride)
yading@10 368 {
yading@10 369 vertical_compose_9tap vertical_compose_l0 = (void*)d->vertical_compose_l0;
yading@10 370 vertical_compose_9tap vertical_compose_h0 = (void*)d->vertical_compose_h0;
yading@10 371 int i, y;
yading@10 372 IDWTELEM *b[8];
yading@10 373
yading@10 374 for (y = 1; y < height; y += 2) {
yading@10 375 for (i = 0; i < 8; i++)
yading@10 376 b[i] = d->buffer + av_clip((y-7 + 2*i), 0, height-2)*stride;
yading@10 377 vertical_compose_h0(d->buffer + y*stride, b, width);
yading@10 378 }
yading@10 379
yading@10 380 for (y = 0; y < height; y += 2) {
yading@10 381 for (i = 0; i < 8; i++)
yading@10 382 b[i] = d->buffer + av_clip((y-7 + 2*i), 1, height-1)*stride;
yading@10 383 vertical_compose_l0(d->buffer + y*stride, b, width);
yading@10 384 }
yading@10 385
yading@10 386 for (y = 0; y < height; y++)
yading@10 387 d->horizontal_compose(d->buffer + y*stride, d->temp, width);
yading@10 388
yading@10 389 d->cs[level].y = height+1;
yading@10 390 }
yading@10 391
yading@10 392 static void spatial_compose_daub97i_dy(DWTContext *d, int level, int width, int height, int stride)
yading@10 393 {
yading@10 394 vertical_compose_3tap vertical_compose_l0 = (void*)d->vertical_compose_l0;
yading@10 395 vertical_compose_3tap vertical_compose_h0 = (void*)d->vertical_compose_h0;
yading@10 396 vertical_compose_3tap vertical_compose_l1 = (void*)d->vertical_compose_l1;
yading@10 397 vertical_compose_3tap vertical_compose_h1 = (void*)d->vertical_compose_h1;
yading@10 398 DWTCompose *cs = d->cs + level;
yading@10 399
yading@10 400 int i, y = cs->y;
yading@10 401 IDWTELEM *b[6];
yading@10 402 for (i = 0; i < 4; i++)
yading@10 403 b[i] = cs->b[i];
yading@10 404 b[4] = d->buffer + mirror(y+3, height-1)*stride;
yading@10 405 b[5] = d->buffer + mirror(y+4, height-1)*stride;
yading@10 406
yading@10 407 if(y+3<(unsigned)height) vertical_compose_l1(b[3], b[4], b[5], width);
yading@10 408 if(y+2<(unsigned)height) vertical_compose_h1(b[2], b[3], b[4], width);
yading@10 409 if(y+1<(unsigned)height) vertical_compose_l0(b[1], b[2], b[3], width);
yading@10 410 if(y+0<(unsigned)height) vertical_compose_h0(b[0], b[1], b[2], width);
yading@10 411
yading@10 412 if(y-1<(unsigned)height) d->horizontal_compose(b[0], d->temp, width);
yading@10 413 if(y+0<(unsigned)height) d->horizontal_compose(b[1], d->temp, width);
yading@10 414
yading@10 415 for (i = 0; i < 4; i++)
yading@10 416 cs->b[i] = b[i+2];
yading@10 417 cs->y += 2;
yading@10 418 }
yading@10 419
yading@10 420
yading@10 421 static void spatial_compose97i_init2(DWTCompose *cs, IDWTELEM *buffer, int height, int stride)
yading@10 422 {
yading@10 423 cs->b[0] = buffer + mirror(-3-1, height-1)*stride;
yading@10 424 cs->b[1] = buffer + mirror(-3 , height-1)*stride;
yading@10 425 cs->b[2] = buffer + mirror(-3+1, height-1)*stride;
yading@10 426 cs->b[3] = buffer + mirror(-3+2, height-1)*stride;
yading@10 427 cs->y = -3;
yading@10 428 }
yading@10 429
yading@10 430 static void spatial_compose53i_init2(DWTCompose *cs, IDWTELEM *buffer, int height, int stride)
yading@10 431 {
yading@10 432 cs->b[0] = buffer + mirror(-1-1, height-1)*stride;
yading@10 433 cs->b[1] = buffer + mirror(-1 , height-1)*stride;
yading@10 434 cs->y = -1;
yading@10 435 }
yading@10 436
yading@10 437 static void spatial_compose_dd97i_init(DWTCompose *cs, IDWTELEM *buffer, int height, int stride)
yading@10 438 {
yading@10 439 cs->b[0] = buffer + av_clip(-5-1, 0, height-2)*stride;
yading@10 440 cs->b[1] = buffer + av_clip(-5 , 1, height-1)*stride;
yading@10 441 cs->b[2] = buffer + av_clip(-5+1, 0, height-2)*stride;
yading@10 442 cs->b[3] = buffer + av_clip(-5+2, 1, height-1)*stride;
yading@10 443 cs->b[4] = buffer + av_clip(-5+3, 0, height-2)*stride;
yading@10 444 cs->b[5] = buffer + av_clip(-5+4, 1, height-1)*stride;
yading@10 445 cs->y = -5;
yading@10 446 }
yading@10 447
yading@10 448 static void spatial_compose_dd137i_init(DWTCompose *cs, IDWTELEM *buffer, int height, int stride)
yading@10 449 {
yading@10 450 cs->b[0] = buffer + av_clip(-5-1, 0, height-2)*stride;
yading@10 451 cs->b[1] = buffer + av_clip(-5 , 1, height-1)*stride;
yading@10 452 cs->b[2] = buffer + av_clip(-5+1, 0, height-2)*stride;
yading@10 453 cs->b[3] = buffer + av_clip(-5+2, 1, height-1)*stride;
yading@10 454 cs->b[4] = buffer + av_clip(-5+3, 0, height-2)*stride;
yading@10 455 cs->b[5] = buffer + av_clip(-5+4, 1, height-1)*stride;
yading@10 456 cs->b[6] = buffer + av_clip(-5+5, 0, height-2)*stride;
yading@10 457 cs->b[7] = buffer + av_clip(-5+6, 1, height-1)*stride;
yading@10 458 cs->y = -5;
yading@10 459 }
yading@10 460
yading@10 461 int ff_spatial_idwt_init2(DWTContext *d, IDWTELEM *buffer, int width, int height,
yading@10 462 int stride, enum dwt_type type, int decomposition_count,
yading@10 463 IDWTELEM *temp)
yading@10 464 {
yading@10 465 int level;
yading@10 466
yading@10 467 d->buffer = buffer;
yading@10 468 d->width = width;
yading@10 469 d->height = height;
yading@10 470 d->stride = stride;
yading@10 471 d->decomposition_count = decomposition_count;
yading@10 472 d->temp = temp + 8;
yading@10 473
yading@10 474 for(level=decomposition_count-1; level>=0; level--){
yading@10 475 int hl = height >> level;
yading@10 476 int stride_l = stride << level;
yading@10 477
yading@10 478 switch(type){
yading@10 479 case DWT_DIRAC_DD9_7:
yading@10 480 spatial_compose_dd97i_init(d->cs+level, buffer, hl, stride_l);
yading@10 481 break;
yading@10 482 case DWT_DIRAC_LEGALL5_3:
yading@10 483 spatial_compose53i_init2(d->cs+level, buffer, hl, stride_l);
yading@10 484 break;
yading@10 485 case DWT_DIRAC_DD13_7:
yading@10 486 spatial_compose_dd137i_init(d->cs+level, buffer, hl, stride_l);
yading@10 487 break;
yading@10 488 case DWT_DIRAC_HAAR0:
yading@10 489 case DWT_DIRAC_HAAR1:
yading@10 490 d->cs[level].y = 1;
yading@10 491 break;
yading@10 492 case DWT_DIRAC_DAUB9_7:
yading@10 493 spatial_compose97i_init2(d->cs+level, buffer, hl, stride_l);
yading@10 494 break;
yading@10 495 default:
yading@10 496 d->cs[level].y = 0;
yading@10 497 break;
yading@10 498 }
yading@10 499 }
yading@10 500
yading@10 501 switch (type) {
yading@10 502 case DWT_DIRAC_DD9_7:
yading@10 503 d->spatial_compose = spatial_compose_dd97i_dy;
yading@10 504 d->vertical_compose_l0 = (void*)vertical_compose53iL0;
yading@10 505 d->vertical_compose_h0 = (void*)vertical_compose_dd97iH0;
yading@10 506 d->horizontal_compose = horizontal_compose_dd97i;
yading@10 507 d->support = 7;
yading@10 508 break;
yading@10 509 case DWT_DIRAC_LEGALL5_3:
yading@10 510 d->spatial_compose = spatial_compose_dirac53i_dy;
yading@10 511 d->vertical_compose_l0 = (void*)vertical_compose53iL0;
yading@10 512 d->vertical_compose_h0 = (void*)vertical_compose_dirac53iH0;
yading@10 513 d->horizontal_compose = horizontal_compose_dirac53i;
yading@10 514 d->support = 3;
yading@10 515 break;
yading@10 516 case DWT_DIRAC_DD13_7:
yading@10 517 d->spatial_compose = spatial_compose_dd137i_dy;
yading@10 518 d->vertical_compose_l0 = (void*)vertical_compose_dd137iL0;
yading@10 519 d->vertical_compose_h0 = (void*)vertical_compose_dd97iH0;
yading@10 520 d->horizontal_compose = horizontal_compose_dd137i;
yading@10 521 d->support = 7;
yading@10 522 break;
yading@10 523 case DWT_DIRAC_HAAR0:
yading@10 524 case DWT_DIRAC_HAAR1:
yading@10 525 d->spatial_compose = spatial_compose_haari_dy;
yading@10 526 d->vertical_compose = (void*)vertical_compose_haar;
yading@10 527 if (type == DWT_DIRAC_HAAR0)
yading@10 528 d->horizontal_compose = horizontal_compose_haar0i;
yading@10 529 else
yading@10 530 d->horizontal_compose = horizontal_compose_haar1i;
yading@10 531 d->support = 1;
yading@10 532 break;
yading@10 533 case DWT_DIRAC_FIDELITY:
yading@10 534 d->spatial_compose = spatial_compose_fidelity;
yading@10 535 d->vertical_compose_l0 = (void*)vertical_compose_fidelityiL0;
yading@10 536 d->vertical_compose_h0 = (void*)vertical_compose_fidelityiH0;
yading@10 537 d->horizontal_compose = horizontal_compose_fidelityi;
yading@10 538 break;
yading@10 539 case DWT_DIRAC_DAUB9_7:
yading@10 540 d->spatial_compose = spatial_compose_daub97i_dy;
yading@10 541 d->vertical_compose_l0 = (void*)vertical_compose_daub97iL0;
yading@10 542 d->vertical_compose_h0 = (void*)vertical_compose_daub97iH0;
yading@10 543 d->vertical_compose_l1 = (void*)vertical_compose_daub97iL1;
yading@10 544 d->vertical_compose_h1 = (void*)vertical_compose_daub97iH1;
yading@10 545 d->horizontal_compose = horizontal_compose_daub97i;
yading@10 546 d->support = 5;
yading@10 547 break;
yading@10 548 default:
yading@10 549 av_log(NULL, AV_LOG_ERROR, "Unknown wavelet type %d\n", type);
yading@10 550 return -1;
yading@10 551 }
yading@10 552
yading@10 553 if (HAVE_MMX) ff_spatial_idwt_init_mmx(d, type);
yading@10 554
yading@10 555 return 0;
yading@10 556 }
yading@10 557
yading@10 558 void ff_spatial_idwt_slice2(DWTContext *d, int y)
yading@10 559 {
yading@10 560 int level, support = d->support;
yading@10 561
yading@10 562 for (level = d->decomposition_count-1; level >= 0; level--) {
yading@10 563 int wl = d->width >> level;
yading@10 564 int hl = d->height >> level;
yading@10 565 int stride_l = d->stride << level;
yading@10 566
yading@10 567 while (d->cs[level].y <= FFMIN((y>>level)+support, hl))
yading@10 568 d->spatial_compose(d, level, wl, hl, stride_l);
yading@10 569 }
yading@10 570 }
yading@10 571
yading@10 572 int ff_spatial_idwt2(IDWTELEM *buffer, int width, int height, int stride,
yading@10 573 enum dwt_type type, int decomposition_count, IDWTELEM *temp)
yading@10 574 {
yading@10 575 DWTContext d;
yading@10 576 int y;
yading@10 577
yading@10 578 if (ff_spatial_idwt_init2(&d, buffer, width, height, stride, type, decomposition_count, temp))
yading@10 579 return -1;
yading@10 580
yading@10 581 for (y = 0; y < d.height; y += 4)
yading@10 582 ff_spatial_idwt_slice2(&d, y);
yading@10 583
yading@10 584 return 0;
yading@10 585 }