int ff_spatial_idwt_init2(DWTContext *d, uint8_t *buffer, int width, int height, int stride, enum dwt_type type, int decomposition_count, uint8_t *temp, int bit_depth) { int ret = 0; if (bit_depth == 8) ret = ff_spatial_idwt_init2_8bit(d, buffer, width, height, stride, type, decomposition_count, temp); else if (bit_depth == 10) ret = ff_spatial_idwt_init2_10bit(d, buffer, width, height, stride, type, decomposition_count, temp); else if (bit_depth == 12) ret = ff_spatial_idwt_init2_12bit(d, buffer, width, height, stride, type, decomposition_count, temp); else av_log(NULL, AV_LOG_WARNING, "Unsupported bit depth = %i\n", bit_depth); if (ret) { av_log(NULL, AV_LOG_ERROR, "Unknown wavelet type %d\n", type); return AVERROR_INVALIDDATA; } if (bit_depth == 8 && HAVE_MMX) ff_spatial_idwt_init_mmx(d, type); return 0; }
int ff_spatial_idwt_init2(DWTContext *d, IDWTELEM *buffer, int width, int height, int stride, enum dwt_type type, int decomposition_count, IDWTELEM *temp) { int level; d->buffer = buffer; d->width = width; d->height = height; d->stride = stride; d->decomposition_count = decomposition_count; d->temp = temp + 8; for(level=decomposition_count-1; level>=0; level--){ int hl = height >> level; int stride_l = stride << level; switch(type){ case DWT_DIRAC_DD9_7: spatial_compose_dd97i_init(d->cs+level, buffer, hl, stride_l); break; case DWT_DIRAC_LEGALL5_3: spatial_compose53i_init2(d->cs+level, buffer, hl, stride_l); break; case DWT_DIRAC_DD13_7: spatial_compose_dd137i_init(d->cs+level, buffer, hl, stride_l); break; case DWT_DIRAC_HAAR0: case DWT_DIRAC_HAAR1: d->cs[level].y = 1; break; case DWT_DIRAC_DAUB9_7: spatial_compose97i_init2(d->cs+level, buffer, hl, stride_l); break; default: d->cs[level].y = 0; break; } } switch (type) { case DWT_DIRAC_DD9_7: d->spatial_compose = spatial_compose_dd97i_dy; d->vertical_compose_l0 = (void*)vertical_compose53iL0; d->vertical_compose_h0 = (void*)vertical_compose_dd97iH0; d->horizontal_compose = horizontal_compose_dd97i; d->support = 7; break; case DWT_DIRAC_LEGALL5_3: d->spatial_compose = spatial_compose_dirac53i_dy; d->vertical_compose_l0 = (void*)vertical_compose53iL0; d->vertical_compose_h0 = (void*)vertical_compose_dirac53iH0; d->horizontal_compose = horizontal_compose_dirac53i; d->support = 3; break; case DWT_DIRAC_DD13_7: d->spatial_compose = spatial_compose_dd137i_dy; d->vertical_compose_l0 = (void*)vertical_compose_dd137iL0; d->vertical_compose_h0 = (void*)vertical_compose_dd97iH0; d->horizontal_compose = horizontal_compose_dd137i; d->support = 7; break; case DWT_DIRAC_HAAR0: case DWT_DIRAC_HAAR1: d->spatial_compose = spatial_compose_haari_dy; d->vertical_compose = (void*)vertical_compose_haar; if (type == DWT_DIRAC_HAAR0) d->horizontal_compose = horizontal_compose_haar0i; else d->horizontal_compose = horizontal_compose_haar1i; d->support = 1; break; case DWT_DIRAC_FIDELITY: d->spatial_compose = spatial_compose_fidelity; d->vertical_compose_l0 = (void*)vertical_compose_fidelityiL0; d->vertical_compose_h0 = (void*)vertical_compose_fidelityiH0; d->horizontal_compose = horizontal_compose_fidelityi; d->support = 0; // not really used break; case DWT_DIRAC_DAUB9_7: d->spatial_compose = spatial_compose_daub97i_dy; d->vertical_compose_l0 = (void*)vertical_compose_daub97iL0; d->vertical_compose_h0 = (void*)vertical_compose_daub97iH0; d->vertical_compose_l1 = (void*)vertical_compose_daub97iL1; d->vertical_compose_h1 = (void*)vertical_compose_daub97iH1; d->horizontal_compose = horizontal_compose_daub97i; d->support = 5; break; default: av_log(NULL, AV_LOG_ERROR, "Unknown wavelet type %d\n", type); return -1; } if (HAVE_MMX) ff_spatial_idwt_init_mmx(d, type); return 0; }