1/* 2 * Copyright (C) 2004 Michael Niedermayer <michaelni@gmx.at> 3 * Copyright (C) 2006 Robert Edele <yartrebo@earthlink.net> 4 * 5 * This file is part of FFmpeg. 6 * 7 * FFmpeg is free software; you can redistribute it and/or 8 * modify it under the terms of the GNU Lesser General Public 9 * License as published by the Free Software Foundation; either 10 * version 2.1 of the License, or (at your option) any later version. 11 * 12 * FFmpeg is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15 * Lesser General Public License for more details. 16 * 17 * You should have received a copy of the GNU Lesser General Public 18 * License along with FFmpeg; if not, write to the Free Software 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 20 */ 21 22#ifndef AVCODEC_SNOW_H 23#define AVCODEC_SNOW_H 24 25#include "dsputil.h" 26#include "dwt.h" 27 28#define MID_STATE 128 29 30#define MAX_PLANES 4 31#define QSHIFT 5 32#define QROOT (1<<QSHIFT) 33#define LOSSLESS_QLOG -128 34#define FRAC_BITS 4 35#define MAX_REF_FRAMES 8 36 37#define LOG2_OBMC_MAX 8 38#define OBMC_MAX (1<<(LOG2_OBMC_MAX)) 39 40/* C bits used by mmx/sse2/altivec */ 41 42static av_always_inline void snow_interleave_line_header(int * i, int width, IDWTELEM * low, IDWTELEM * high){ 43 (*i) = (width) - 2; 44 45 if (width & 1){ 46 low[(*i)+1] = low[((*i)+1)>>1]; 47 (*i)--; 48 } 49} 50 51static av_always_inline void snow_interleave_line_footer(int * i, IDWTELEM * low, IDWTELEM * high){ 52 for (; (*i)>=0; (*i)-=2){ 53 low[(*i)+1] = high[(*i)>>1]; 54 low[*i] = low[(*i)>>1]; 55 } 56} 57 58static av_always_inline void snow_horizontal_compose_lift_lead_out(int i, IDWTELEM * dst, IDWTELEM * src, IDWTELEM * ref, int width, int w, int lift_high, int mul, int add, int shift){ 59 for(; i<w; i++){ 60 dst[i] = src[i] - ((mul * (ref[i] + ref[i + 1]) + add) >> shift); 61 } 62 63 if((width^lift_high)&1){ 64 dst[w] = src[w] - ((mul * 2 * ref[w] + add) >> shift); 65 } 66} 67 68static av_always_inline void snow_horizontal_compose_liftS_lead_out(int i, IDWTELEM * dst, IDWTELEM * src, IDWTELEM * ref, int width, int w){ 69 for(; i<w; i++){ 70 dst[i] = src[i] + ((ref[i] + ref[(i+1)]+W_BO + 4 * src[i]) >> W_BS); 71 } 72 73 if(width&1){ 74 dst[w] = src[w] + ((2 * ref[w] + W_BO + 4 * src[w]) >> W_BS); 75 } 76} 77 78#endif /* AVCODEC_SNOW_H */ 79