yading@10: /* yading@10: * Half-pel DSP functions. yading@10: * Copyright (c) 2000, 2001 Fabrice Bellard yading@10: * Copyright (c) 2002-2004 Michael Niedermayer yading@10: * yading@10: * gmc & q-pel & 32/64 bit based MC by Michael Niedermayer yading@10: * yading@10: * This file is part of FFmpeg. yading@10: * yading@10: * FFmpeg is free software; you can redistribute it and/or yading@10: * modify it under the terms of the GNU Lesser General Public yading@10: * License as published by the Free Software Foundation; either yading@10: * version 2.1 of the License, or (at your option) any later version. yading@10: * yading@10: * FFmpeg is distributed in the hope that it will be useful, yading@10: * but WITHOUT ANY WARRANTY; without even the implied warranty of yading@10: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU yading@10: * Lesser General Public License for more details. yading@10: * yading@10: * You should have received a copy of the GNU Lesser General Public yading@10: * License along with FFmpeg; if not, write to the Free Software yading@10: * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA yading@10: */ yading@10: yading@10: /** yading@10: * @file yading@10: * Half-pel DSP functions. yading@10: */ yading@10: yading@10: #include "bit_depth_template.c" yading@10: yading@10: #include "hpel_template.c" yading@10: yading@10: #define PIXOP2(OPNAME, OP) \ yading@10: static inline void FUNC(OPNAME ## _no_rnd_pixels8_l2)(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, int dst_stride, \ yading@10: int src_stride1, int src_stride2, int h){\ yading@10: int i;\ yading@10: for(i=0; i>= sizeof(pixel)-1;\ yading@10: a0= pixels[0];\ yading@10: b0= pixels[1] + 2;\ yading@10: a0 += b0;\ yading@10: b0 += pixels[2];\ yading@10: \ yading@10: pixels+=line_size;\ yading@10: for(i=0; i>2; /* FIXME non put */\ yading@10: block[1]= (b1+b0)>>2;\ yading@10: \ yading@10: pixels+=line_size;\ yading@10: block +=line_size;\ yading@10: \ yading@10: a0= pixels[0];\ yading@10: b0= pixels[1] + 2;\ yading@10: a0 += b0;\ yading@10: b0 += pixels[2];\ yading@10: \ yading@10: block[0]= (a1+a0)>>2;\ yading@10: block[1]= (b1+b0)>>2;\ yading@10: pixels+=line_size;\ yading@10: block +=line_size;\ yading@10: }\ yading@10: }\ yading@10: \ yading@10: static inline void FUNCC(OPNAME ## _pixels4_xy2)(uint8_t *block, const uint8_t *pixels, ptrdiff_t line_size, int h)\ yading@10: {\ yading@10: /* FIXME HIGH BIT DEPTH */\ yading@10: int i;\ yading@10: const uint32_t a= AV_RN32(pixels );\ yading@10: const uint32_t b= AV_RN32(pixels+1);\ yading@10: uint32_t l0= (a&0x03030303UL)\ yading@10: + (b&0x03030303UL)\ yading@10: + 0x02020202UL;\ yading@10: uint32_t h0= ((a&0xFCFCFCFCUL)>>2)\ yading@10: + ((b&0xFCFCFCFCUL)>>2);\ yading@10: uint32_t l1,h1;\ yading@10: \ yading@10: pixels+=line_size;\ yading@10: for(i=0; i>2)\ yading@10: + ((b&0xFCFCFCFCUL)>>2);\ yading@10: OP(*((uint32_t*)block), h0+h1+(((l0+l1)>>2)&0x0F0F0F0FUL));\ yading@10: pixels+=line_size;\ yading@10: block +=line_size;\ yading@10: a= AV_RN32(pixels );\ yading@10: b= AV_RN32(pixels+1);\ yading@10: l0= (a&0x03030303UL)\ yading@10: + (b&0x03030303UL)\ yading@10: + 0x02020202UL;\ yading@10: h0= ((a&0xFCFCFCFCUL)>>2)\ yading@10: + ((b&0xFCFCFCFCUL)>>2);\ yading@10: OP(*((uint32_t*)block), h0+h1+(((l0+l1)>>2)&0x0F0F0F0FUL));\ yading@10: pixels+=line_size;\ yading@10: block +=line_size;\ yading@10: }\ yading@10: }\ yading@10: \ yading@10: static inline void FUNCC(OPNAME ## _pixels8_xy2)(uint8_t *block, const uint8_t *pixels, ptrdiff_t line_size, int h)\ yading@10: {\ yading@10: /* FIXME HIGH BIT DEPTH */\ yading@10: int j;\ yading@10: for(j=0; j<2; j++){\ yading@10: int i;\ yading@10: const uint32_t a= AV_RN32(pixels );\ yading@10: const uint32_t b= AV_RN32(pixels+1);\ yading@10: uint32_t l0= (a&0x03030303UL)\ yading@10: + (b&0x03030303UL)\ yading@10: + 0x02020202UL;\ yading@10: uint32_t h0= ((a&0xFCFCFCFCUL)>>2)\ yading@10: + ((b&0xFCFCFCFCUL)>>2);\ yading@10: uint32_t l1,h1;\ yading@10: \ yading@10: pixels+=line_size;\ yading@10: for(i=0; i>2)\ yading@10: + ((b&0xFCFCFCFCUL)>>2);\ yading@10: OP(*((uint32_t*)block), h0+h1+(((l0+l1)>>2)&0x0F0F0F0FUL));\ yading@10: pixels+=line_size;\ yading@10: block +=line_size;\ yading@10: a= AV_RN32(pixels );\ yading@10: b= AV_RN32(pixels+1);\ yading@10: l0= (a&0x03030303UL)\ yading@10: + (b&0x03030303UL)\ yading@10: + 0x02020202UL;\ yading@10: h0= ((a&0xFCFCFCFCUL)>>2)\ yading@10: + ((b&0xFCFCFCFCUL)>>2);\ yading@10: OP(*((uint32_t*)block), h0+h1+(((l0+l1)>>2)&0x0F0F0F0FUL));\ yading@10: pixels+=line_size;\ yading@10: block +=line_size;\ yading@10: }\ yading@10: pixels+=4-line_size*(h+1);\ yading@10: block +=4-line_size*h;\ yading@10: }\ yading@10: }\ yading@10: \ yading@10: static inline void FUNCC(OPNAME ## _no_rnd_pixels8_xy2)(uint8_t *block, const uint8_t *pixels, ptrdiff_t line_size, int h)\ yading@10: {\ yading@10: /* FIXME HIGH BIT DEPTH */\ yading@10: int j;\ yading@10: for(j=0; j<2; j++){\ yading@10: int i;\ yading@10: const uint32_t a= AV_RN32(pixels );\ yading@10: const uint32_t b= AV_RN32(pixels+1);\ yading@10: uint32_t l0= (a&0x03030303UL)\ yading@10: + (b&0x03030303UL)\ yading@10: + 0x01010101UL;\ yading@10: uint32_t h0= ((a&0xFCFCFCFCUL)>>2)\ yading@10: + ((b&0xFCFCFCFCUL)>>2);\ yading@10: uint32_t l1,h1;\ yading@10: \ yading@10: pixels+=line_size;\ yading@10: for(i=0; i>2)\ yading@10: + ((b&0xFCFCFCFCUL)>>2);\ yading@10: OP(*((uint32_t*)block), h0+h1+(((l0+l1)>>2)&0x0F0F0F0FUL));\ yading@10: pixels+=line_size;\ yading@10: block +=line_size;\ yading@10: a= AV_RN32(pixels );\ yading@10: b= AV_RN32(pixels+1);\ yading@10: l0= (a&0x03030303UL)\ yading@10: + (b&0x03030303UL)\ yading@10: + 0x01010101UL;\ yading@10: h0= ((a&0xFCFCFCFCUL)>>2)\ yading@10: + ((b&0xFCFCFCFCUL)>>2);\ yading@10: OP(*((uint32_t*)block), h0+h1+(((l0+l1)>>2)&0x0F0F0F0FUL));\ yading@10: pixels+=line_size;\ yading@10: block +=line_size;\ yading@10: }\ yading@10: pixels+=4-line_size*(h+1);\ yading@10: block +=4-line_size*h;\ yading@10: }\ yading@10: }\ yading@10: \ yading@10: CALL_2X_PIXELS(FUNCC(OPNAME ## _pixels16_x2) , FUNCC(OPNAME ## _pixels8_x2) , 8*sizeof(pixel))\ yading@10: CALL_2X_PIXELS(FUNCC(OPNAME ## _pixels16_y2) , FUNCC(OPNAME ## _pixels8_y2) , 8*sizeof(pixel))\ yading@10: CALL_2X_PIXELS(FUNCC(OPNAME ## _pixels16_xy2), FUNCC(OPNAME ## _pixels8_xy2), 8*sizeof(pixel))\ yading@10: av_unused CALL_2X_PIXELS(FUNCC(OPNAME ## _no_rnd_pixels16) , FUNCC(OPNAME ## _pixels8) , 8*sizeof(pixel))\ yading@10: CALL_2X_PIXELS(FUNCC(OPNAME ## _no_rnd_pixels16_x2) , FUNCC(OPNAME ## _no_rnd_pixels8_x2) , 8*sizeof(pixel))\ yading@10: CALL_2X_PIXELS(FUNCC(OPNAME ## _no_rnd_pixels16_y2) , FUNCC(OPNAME ## _no_rnd_pixels8_y2) , 8*sizeof(pixel))\ yading@10: CALL_2X_PIXELS(FUNCC(OPNAME ## _no_rnd_pixels16_xy2), FUNCC(OPNAME ## _no_rnd_pixels8_xy2), 8*sizeof(pixel))\ yading@10: yading@10: #define op_avg(a, b) a = rnd_avg_pixel4(a, b) yading@10: #define op_put(a, b) a = b yading@10: #if BIT_DEPTH == 8 yading@10: #define put_no_rnd_pixels8_8_c put_pixels8_8_c yading@10: PIXOP2(avg, op_avg) yading@10: PIXOP2(put, op_put) yading@10: #endif yading@10: #undef op_avg yading@10: #undef op_put