yading@10: /* yading@10: * aligned/packed access motion yading@10: * yading@10: * Copyright (c) 2001-2003 BERO 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: #include yading@10: #include yading@10: yading@10: #include "libavutil/attributes.h" yading@10: #include "libavcodec/h264chroma.h" yading@10: yading@10: #define H264_CHROMA_MC(OPNAME, OP)\ yading@10: static void OPNAME ## h264_chroma_mc2_sh4(uint8_t *dst/*align 8*/, uint8_t *src/*align 1*/, int stride, int h, int x, int y){\ yading@10: const int A=(8-x)*(8-y);\ yading@10: const int B=( x)*(8-y);\ yading@10: const int C=(8-x)*( y);\ yading@10: const int D=( x)*( y);\ yading@10: \ yading@10: assert(x<8 && y<8 && x>=0 && y>=0);\ yading@10: \ yading@10: do {\ yading@10: int t0,t1,t2,t3; \ yading@10: uint8_t *s0 = src; \ yading@10: uint8_t *s1 = src+stride; \ yading@10: t0 = *s0++; t2 = *s1++; \ yading@10: t1 = *s0++; t3 = *s1++; \ yading@10: OP(dst[0], (A*t0 + B*t1 + C*t2 + D*t3));\ yading@10: t0 = *s0++; t2 = *s1++; \ yading@10: OP(dst[1], (A*t1 + B*t0 + C*t3 + D*t2));\ yading@10: dst+= stride;\ yading@10: src+= stride;\ yading@10: }while(--h);\ yading@10: }\ yading@10: \ yading@10: static void OPNAME ## h264_chroma_mc4_sh4(uint8_t *dst/*align 8*/, uint8_t *src/*align 1*/, int stride, int h, int x, int y){\ yading@10: const int A=(8-x)*(8-y);\ yading@10: const int B=( x)*(8-y);\ yading@10: const int C=(8-x)*( y);\ yading@10: const int D=( x)*( y);\ yading@10: \ yading@10: assert(x<8 && y<8 && x>=0 && y>=0);\ yading@10: \ yading@10: do {\ yading@10: int t0,t1,t2,t3; \ yading@10: uint8_t *s0 = src; \ yading@10: uint8_t *s1 = src+stride; \ yading@10: t0 = *s0++; t2 = *s1++; \ yading@10: t1 = *s0++; t3 = *s1++; \ yading@10: OP(dst[0], (A*t0 + B*t1 + C*t2 + D*t3));\ yading@10: t0 = *s0++; t2 = *s1++; \ yading@10: OP(dst[1], (A*t1 + B*t0 + C*t3 + D*t2));\ yading@10: t1 = *s0++; t3 = *s1++; \ yading@10: OP(dst[2], (A*t0 + B*t1 + C*t2 + D*t3));\ yading@10: t0 = *s0++; t2 = *s1++; \ yading@10: OP(dst[3], (A*t1 + B*t0 + C*t3 + D*t2));\ yading@10: dst+= stride;\ yading@10: src+= stride;\ yading@10: }while(--h);\ yading@10: }\ yading@10: \ yading@10: static void OPNAME ## h264_chroma_mc8_sh4(uint8_t *dst/*align 8*/, uint8_t *src/*align 1*/, int stride, int h, int x, int y){\ yading@10: const int A=(8-x)*(8-y);\ yading@10: const int B=( x)*(8-y);\ yading@10: const int C=(8-x)*( y);\ yading@10: const int D=( x)*( y);\ yading@10: \ yading@10: assert(x<8 && y<8 && x>=0 && y>=0);\ yading@10: \ yading@10: do {\ yading@10: int t0,t1,t2,t3; \ yading@10: uint8_t *s0 = src; \ yading@10: uint8_t *s1 = src+stride; \ yading@10: t0 = *s0++; t2 = *s1++; \ yading@10: t1 = *s0++; t3 = *s1++; \ yading@10: OP(dst[0], (A*t0 + B*t1 + C*t2 + D*t3));\ yading@10: t0 = *s0++; t2 = *s1++; \ yading@10: OP(dst[1], (A*t1 + B*t0 + C*t3 + D*t2));\ yading@10: t1 = *s0++; t3 = *s1++; \ yading@10: OP(dst[2], (A*t0 + B*t1 + C*t2 + D*t3));\ yading@10: t0 = *s0++; t2 = *s1++; \ yading@10: OP(dst[3], (A*t1 + B*t0 + C*t3 + D*t2));\ yading@10: t1 = *s0++; t3 = *s1++; \ yading@10: OP(dst[4], (A*t0 + B*t1 + C*t2 + D*t3));\ yading@10: t0 = *s0++; t2 = *s1++; \ yading@10: OP(dst[5], (A*t1 + B*t0 + C*t3 + D*t2));\ yading@10: t1 = *s0++; t3 = *s1++; \ yading@10: OP(dst[6], (A*t0 + B*t1 + C*t2 + D*t3));\ yading@10: t0 = *s0++; t2 = *s1++; \ yading@10: OP(dst[7], (A*t1 + B*t0 + C*t3 + D*t2));\ yading@10: dst+= stride;\ yading@10: src+= stride;\ yading@10: }while(--h);\ yading@10: } yading@10: yading@10: #define op_avg(a, b) a = (((a)+(((b) + 32)>>6)+1)>>1) yading@10: #define op_put(a, b) a = (((b) + 32)>>6) yading@10: yading@10: H264_CHROMA_MC(put_ , op_put) yading@10: H264_CHROMA_MC(avg_ , op_avg) yading@10: #undef op_avg yading@10: #undef op_put yading@10: yading@10: av_cold void ff_h264chroma_init_sh4(H264ChromaContext *c, int bit_depth) yading@10: { yading@10: const int high_bit_depth = bit_depth > 8; yading@10: yading@10: if (!high_bit_depth) { yading@10: c->put_h264_chroma_pixels_tab[0]= put_h264_chroma_mc8_sh4; yading@10: c->put_h264_chroma_pixels_tab[1]= put_h264_chroma_mc4_sh4; yading@10: c->put_h264_chroma_pixels_tab[2]= put_h264_chroma_mc2_sh4; yading@10: c->avg_h264_chroma_pixels_tab[0]= avg_h264_chroma_mc8_sh4; yading@10: c->avg_h264_chroma_pixels_tab[1]= avg_h264_chroma_mc4_sh4; yading@10: c->avg_h264_chroma_pixels_tab[2]= avg_h264_chroma_mc2_sh4; yading@10: } yading@10: }