yading@10: /* yading@10: * DSP utils 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: * DSP utils yading@10: */ yading@10: yading@10: #include "bit_depth_template.c" yading@10: yading@10: #if BIT_DEPTH == 8 yading@10: /* draw the edges of width 'w' of an image of size width, height */ yading@10: //FIXME check that this is ok for mpeg4 interlaced yading@10: static void FUNCC(draw_edges)(uint8_t *p_buf, int p_wrap, int width, int height, int w, int h, int sides) yading@10: { yading@10: pixel *buf = (pixel*)p_buf; yading@10: int wrap = p_wrap / sizeof(pixel); yading@10: pixel *ptr, *last_line; yading@10: int i; yading@10: yading@10: /* left and right */ yading@10: ptr = buf; yading@10: for(i=0;i>2)\ yading@10: + ((b&0xFCFCFCFCUL)>>2);\ yading@10: l1= (c&0x03030303UL)\ yading@10: + (d&0x03030303UL);\ yading@10: h1= ((c&0xFCFCFCFCUL)>>2)\ yading@10: + ((d&0xFCFCFCFCUL)>>2);\ yading@10: OP(*((uint32_t*)&dst[i*dst_stride]), h0+h1+(((l0+l1)>>2)&0x0F0F0F0FUL));\ yading@10: a= AV_RN32(&src1[i*src_stride1+4]);\ yading@10: b= AV_RN32(&src2[i*src_stride2+4]);\ yading@10: c= AV_RN32(&src3[i*src_stride3+4]);\ yading@10: d= AV_RN32(&src4[i*src_stride4+4]);\ 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: l1= (c&0x03030303UL)\ yading@10: + (d&0x03030303UL);\ yading@10: h1= ((c&0xFCFCFCFCUL)>>2)\ yading@10: + ((d&0xFCFCFCFCUL)>>2);\ yading@10: OP(*((uint32_t*)&dst[i*dst_stride+4]), h0+h1+(((l0+l1)>>2)&0x0F0F0F0FUL));\ yading@10: }\ yading@10: }\ yading@10: \ yading@10: static inline void FUNC(OPNAME ## _no_rnd_pixels8_l4)(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, const uint8_t *src3, const uint8_t *src4,\ yading@10: int dst_stride, int src_stride1, int src_stride2,int src_stride3,int src_stride4, int h){\ yading@10: /* FIXME HIGH BIT DEPTH*/\ yading@10: int i;\ yading@10: for(i=0; i>2)\ yading@10: + ((b&0xFCFCFCFCUL)>>2);\ yading@10: l1= (c&0x03030303UL)\ yading@10: + (d&0x03030303UL);\ yading@10: h1= ((c&0xFCFCFCFCUL)>>2)\ yading@10: + ((d&0xFCFCFCFCUL)>>2);\ yading@10: OP(*((uint32_t*)&dst[i*dst_stride]), h0+h1+(((l0+l1)>>2)&0x0F0F0F0FUL));\ yading@10: a= AV_RN32(&src1[i*src_stride1+4]);\ yading@10: b= AV_RN32(&src2[i*src_stride2+4]);\ yading@10: c= AV_RN32(&src3[i*src_stride3+4]);\ yading@10: d= AV_RN32(&src4[i*src_stride4+4]);\ 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: l1= (c&0x03030303UL)\ yading@10: + (d&0x03030303UL);\ yading@10: h1= ((c&0xFCFCFCFCUL)>>2)\ yading@10: + ((d&0xFCFCFCFCUL)>>2);\ yading@10: OP(*((uint32_t*)&dst[i*dst_stride+4]), h0+h1+(((l0+l1)>>2)&0x0F0F0F0FUL));\ yading@10: }\ yading@10: }\ yading@10: static inline void FUNC(OPNAME ## _pixels16_l4)(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, const uint8_t *src3, const uint8_t *src4,\ yading@10: int dst_stride, int src_stride1, int src_stride2,int src_stride3,int src_stride4, int h){\ yading@10: FUNC(OPNAME ## _pixels8_l4)(dst , src1 , src2 , src3 , src4 , dst_stride, src_stride1, src_stride2, src_stride3, src_stride4, h);\ yading@10: FUNC(OPNAME ## _pixels8_l4)(dst+8*sizeof(pixel), src1+8*sizeof(pixel), src2+8*sizeof(pixel), src3+8*sizeof(pixel), src4+8*sizeof(pixel), dst_stride, src_stride1, src_stride2, src_stride3, src_stride4, h);\ yading@10: }\ yading@10: static inline void FUNC(OPNAME ## _no_rnd_pixels16_l4)(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, const uint8_t *src3, const uint8_t *src4,\ yading@10: int dst_stride, int src_stride1, int src_stride2,int src_stride3,int src_stride4, int h){\ yading@10: FUNC(OPNAME ## _no_rnd_pixels8_l4)(dst , src1 , src2 , src3 , src4 , dst_stride, src_stride1, src_stride2, src_stride3, src_stride4, h);\ yading@10: FUNC(OPNAME ## _no_rnd_pixels8_l4)(dst+8*sizeof(pixel), src1+8*sizeof(pixel), src2+8*sizeof(pixel), src3+8*sizeof(pixel), src4+8*sizeof(pixel), dst_stride, src_stride1, src_stride2, src_stride3, src_stride4, h);\ 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: CALL_2X_PIXELS(FUNCC(OPNAME ## _pixels16_xy2), FUNCC(OPNAME ## _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