1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * H.26L/H.264/AVC/JVT/14496-10/... encoder/decoder 3cabdff1aSopenharmony_ci * Copyright (c) 2003-2011 Michael Niedermayer <michaelni@gmx.at> 4cabdff1aSopenharmony_ci * 5cabdff1aSopenharmony_ci * This file is part of FFmpeg. 6cabdff1aSopenharmony_ci * 7cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 8cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 9cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 10cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 11cabdff1aSopenharmony_ci * 12cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 13cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 14cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15cabdff1aSopenharmony_ci * Lesser General Public License for more details. 16cabdff1aSopenharmony_ci * 17cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 18cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 19cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 20cabdff1aSopenharmony_ci */ 21cabdff1aSopenharmony_ci 22cabdff1aSopenharmony_ci/** 23cabdff1aSopenharmony_ci * @file 24cabdff1aSopenharmony_ci * H.264 / AVC / MPEG-4 part10 DSP functions. 25cabdff1aSopenharmony_ci * @author Michael Niedermayer <michaelni@gmx.at> 26cabdff1aSopenharmony_ci */ 27cabdff1aSopenharmony_ci 28cabdff1aSopenharmony_ci#include "bit_depth_template.c" 29cabdff1aSopenharmony_ci 30cabdff1aSopenharmony_ci#define op_scale1(x) block[x] = av_clip_pixel( (block[x]*weight + offset) >> log2_denom ) 31cabdff1aSopenharmony_ci#define op_scale2(x) dst[x] = av_clip_pixel( (src[x]*weights + dst[x]*weightd + offset) >> (log2_denom+1)) 32cabdff1aSopenharmony_ci#define H264_WEIGHT(W) \ 33cabdff1aSopenharmony_cistatic void FUNCC(weight_h264_pixels ## W)(uint8_t *_block, ptrdiff_t stride, int height, \ 34cabdff1aSopenharmony_ci int log2_denom, int weight, int offset) \ 35cabdff1aSopenharmony_ci{ \ 36cabdff1aSopenharmony_ci int y; \ 37cabdff1aSopenharmony_ci pixel *block = (pixel*)_block; \ 38cabdff1aSopenharmony_ci stride >>= sizeof(pixel)-1; \ 39cabdff1aSopenharmony_ci offset = (unsigned)offset << (log2_denom + (BIT_DEPTH-8)); \ 40cabdff1aSopenharmony_ci if(log2_denom) offset += 1<<(log2_denom-1); \ 41cabdff1aSopenharmony_ci for (y = 0; y < height; y++, block += stride) { \ 42cabdff1aSopenharmony_ci op_scale1(0); \ 43cabdff1aSopenharmony_ci op_scale1(1); \ 44cabdff1aSopenharmony_ci if(W==2) continue; \ 45cabdff1aSopenharmony_ci op_scale1(2); \ 46cabdff1aSopenharmony_ci op_scale1(3); \ 47cabdff1aSopenharmony_ci if(W==4) continue; \ 48cabdff1aSopenharmony_ci op_scale1(4); \ 49cabdff1aSopenharmony_ci op_scale1(5); \ 50cabdff1aSopenharmony_ci op_scale1(6); \ 51cabdff1aSopenharmony_ci op_scale1(7); \ 52cabdff1aSopenharmony_ci if(W==8) continue; \ 53cabdff1aSopenharmony_ci op_scale1(8); \ 54cabdff1aSopenharmony_ci op_scale1(9); \ 55cabdff1aSopenharmony_ci op_scale1(10); \ 56cabdff1aSopenharmony_ci op_scale1(11); \ 57cabdff1aSopenharmony_ci op_scale1(12); \ 58cabdff1aSopenharmony_ci op_scale1(13); \ 59cabdff1aSopenharmony_ci op_scale1(14); \ 60cabdff1aSopenharmony_ci op_scale1(15); \ 61cabdff1aSopenharmony_ci } \ 62cabdff1aSopenharmony_ci} \ 63cabdff1aSopenharmony_cistatic void FUNCC(biweight_h264_pixels ## W)(uint8_t *_dst, uint8_t *_src, ptrdiff_t stride, int height, \ 64cabdff1aSopenharmony_ci int log2_denom, int weightd, int weights, int offset) \ 65cabdff1aSopenharmony_ci{ \ 66cabdff1aSopenharmony_ci int y; \ 67cabdff1aSopenharmony_ci pixel *dst = (pixel*)_dst; \ 68cabdff1aSopenharmony_ci pixel *src = (pixel*)_src; \ 69cabdff1aSopenharmony_ci stride >>= sizeof(pixel)-1; \ 70cabdff1aSopenharmony_ci offset = (unsigned)offset << (BIT_DEPTH-8); \ 71cabdff1aSopenharmony_ci offset = (unsigned)((offset + 1) | 1) << log2_denom; \ 72cabdff1aSopenharmony_ci for (y = 0; y < height; y++, dst += stride, src += stride) { \ 73cabdff1aSopenharmony_ci op_scale2(0); \ 74cabdff1aSopenharmony_ci op_scale2(1); \ 75cabdff1aSopenharmony_ci if(W==2) continue; \ 76cabdff1aSopenharmony_ci op_scale2(2); \ 77cabdff1aSopenharmony_ci op_scale2(3); \ 78cabdff1aSopenharmony_ci if(W==4) continue; \ 79cabdff1aSopenharmony_ci op_scale2(4); \ 80cabdff1aSopenharmony_ci op_scale2(5); \ 81cabdff1aSopenharmony_ci op_scale2(6); \ 82cabdff1aSopenharmony_ci op_scale2(7); \ 83cabdff1aSopenharmony_ci if(W==8) continue; \ 84cabdff1aSopenharmony_ci op_scale2(8); \ 85cabdff1aSopenharmony_ci op_scale2(9); \ 86cabdff1aSopenharmony_ci op_scale2(10); \ 87cabdff1aSopenharmony_ci op_scale2(11); \ 88cabdff1aSopenharmony_ci op_scale2(12); \ 89cabdff1aSopenharmony_ci op_scale2(13); \ 90cabdff1aSopenharmony_ci op_scale2(14); \ 91cabdff1aSopenharmony_ci op_scale2(15); \ 92cabdff1aSopenharmony_ci } \ 93cabdff1aSopenharmony_ci} 94cabdff1aSopenharmony_ci 95cabdff1aSopenharmony_ciH264_WEIGHT(16) 96cabdff1aSopenharmony_ciH264_WEIGHT(8) 97cabdff1aSopenharmony_ciH264_WEIGHT(4) 98cabdff1aSopenharmony_ciH264_WEIGHT(2) 99cabdff1aSopenharmony_ci 100cabdff1aSopenharmony_ci#undef op_scale1 101cabdff1aSopenharmony_ci#undef op_scale2 102cabdff1aSopenharmony_ci#undef H264_WEIGHT 103cabdff1aSopenharmony_ci 104cabdff1aSopenharmony_cistatic av_always_inline av_flatten void FUNCC(h264_loop_filter_luma)(uint8_t *p_pix, ptrdiff_t xstride, ptrdiff_t ystride, int inner_iters, int alpha, int beta, int8_t *tc0) 105cabdff1aSopenharmony_ci{ 106cabdff1aSopenharmony_ci pixel *pix = (pixel*)p_pix; 107cabdff1aSopenharmony_ci int i, d; 108cabdff1aSopenharmony_ci xstride >>= sizeof(pixel)-1; 109cabdff1aSopenharmony_ci ystride >>= sizeof(pixel)-1; 110cabdff1aSopenharmony_ci alpha <<= BIT_DEPTH - 8; 111cabdff1aSopenharmony_ci beta <<= BIT_DEPTH - 8; 112cabdff1aSopenharmony_ci for( i = 0; i < 4; i++ ) { 113cabdff1aSopenharmony_ci const int tc_orig = tc0[i] * (1 << (BIT_DEPTH - 8)); 114cabdff1aSopenharmony_ci if( tc_orig < 0 ) { 115cabdff1aSopenharmony_ci pix += inner_iters*ystride; 116cabdff1aSopenharmony_ci continue; 117cabdff1aSopenharmony_ci } 118cabdff1aSopenharmony_ci for( d = 0; d < inner_iters; d++ ) { 119cabdff1aSopenharmony_ci const int p0 = pix[-1*xstride]; 120cabdff1aSopenharmony_ci const int p1 = pix[-2*xstride]; 121cabdff1aSopenharmony_ci const int p2 = pix[-3*xstride]; 122cabdff1aSopenharmony_ci const int q0 = pix[0]; 123cabdff1aSopenharmony_ci const int q1 = pix[1*xstride]; 124cabdff1aSopenharmony_ci const int q2 = pix[2*xstride]; 125cabdff1aSopenharmony_ci 126cabdff1aSopenharmony_ci if( FFABS( p0 - q0 ) < alpha && 127cabdff1aSopenharmony_ci FFABS( p1 - p0 ) < beta && 128cabdff1aSopenharmony_ci FFABS( q1 - q0 ) < beta ) { 129cabdff1aSopenharmony_ci 130cabdff1aSopenharmony_ci int tc = tc_orig; 131cabdff1aSopenharmony_ci int i_delta; 132cabdff1aSopenharmony_ci 133cabdff1aSopenharmony_ci if( FFABS( p2 - p0 ) < beta ) { 134cabdff1aSopenharmony_ci if(tc_orig) 135cabdff1aSopenharmony_ci pix[-2*xstride] = p1 + av_clip( (( p2 + ( ( p0 + q0 + 1 ) >> 1 ) ) >> 1) - p1, -tc_orig, tc_orig ); 136cabdff1aSopenharmony_ci tc++; 137cabdff1aSopenharmony_ci } 138cabdff1aSopenharmony_ci if( FFABS( q2 - q0 ) < beta ) { 139cabdff1aSopenharmony_ci if(tc_orig) 140cabdff1aSopenharmony_ci pix[ xstride] = q1 + av_clip( (( q2 + ( ( p0 + q0 + 1 ) >> 1 ) ) >> 1) - q1, -tc_orig, tc_orig ); 141cabdff1aSopenharmony_ci tc++; 142cabdff1aSopenharmony_ci } 143cabdff1aSopenharmony_ci 144cabdff1aSopenharmony_ci i_delta = av_clip( (((q0 - p0 ) * 4) + (p1 - q1) + 4) >> 3, -tc, tc ); 145cabdff1aSopenharmony_ci pix[-xstride] = av_clip_pixel( p0 + i_delta ); /* p0' */ 146cabdff1aSopenharmony_ci pix[0] = av_clip_pixel( q0 - i_delta ); /* q0' */ 147cabdff1aSopenharmony_ci } 148cabdff1aSopenharmony_ci pix += ystride; 149cabdff1aSopenharmony_ci } 150cabdff1aSopenharmony_ci } 151cabdff1aSopenharmony_ci} 152cabdff1aSopenharmony_cistatic void FUNCC(h264_v_loop_filter_luma)(uint8_t *pix, ptrdiff_t stride, int alpha, int beta, int8_t *tc0) 153cabdff1aSopenharmony_ci{ 154cabdff1aSopenharmony_ci FUNCC(h264_loop_filter_luma)(pix, stride, sizeof(pixel), 4, alpha, beta, tc0); 155cabdff1aSopenharmony_ci} 156cabdff1aSopenharmony_cistatic void FUNCC(h264_h_loop_filter_luma)(uint8_t *pix, ptrdiff_t stride, int alpha, int beta, int8_t *tc0) 157cabdff1aSopenharmony_ci{ 158cabdff1aSopenharmony_ci FUNCC(h264_loop_filter_luma)(pix, sizeof(pixel), stride, 4, alpha, beta, tc0); 159cabdff1aSopenharmony_ci} 160cabdff1aSopenharmony_cistatic void FUNCC(h264_h_loop_filter_luma_mbaff)(uint8_t *pix, ptrdiff_t stride, int alpha, int beta, int8_t *tc0) 161cabdff1aSopenharmony_ci{ 162cabdff1aSopenharmony_ci FUNCC(h264_loop_filter_luma)(pix, sizeof(pixel), stride, 2, alpha, beta, tc0); 163cabdff1aSopenharmony_ci} 164cabdff1aSopenharmony_ci 165cabdff1aSopenharmony_cistatic av_always_inline av_flatten void FUNCC(h264_loop_filter_luma_intra)(uint8_t *p_pix, ptrdiff_t xstride, ptrdiff_t ystride, int inner_iters, int alpha, int beta) 166cabdff1aSopenharmony_ci{ 167cabdff1aSopenharmony_ci pixel *pix = (pixel*)p_pix; 168cabdff1aSopenharmony_ci int d; 169cabdff1aSopenharmony_ci xstride >>= sizeof(pixel)-1; 170cabdff1aSopenharmony_ci ystride >>= sizeof(pixel)-1; 171cabdff1aSopenharmony_ci alpha <<= BIT_DEPTH - 8; 172cabdff1aSopenharmony_ci beta <<= BIT_DEPTH - 8; 173cabdff1aSopenharmony_ci for( d = 0; d < 4 * inner_iters; d++ ) { 174cabdff1aSopenharmony_ci const int p2 = pix[-3*xstride]; 175cabdff1aSopenharmony_ci const int p1 = pix[-2*xstride]; 176cabdff1aSopenharmony_ci const int p0 = pix[-1*xstride]; 177cabdff1aSopenharmony_ci 178cabdff1aSopenharmony_ci const int q0 = pix[ 0*xstride]; 179cabdff1aSopenharmony_ci const int q1 = pix[ 1*xstride]; 180cabdff1aSopenharmony_ci const int q2 = pix[ 2*xstride]; 181cabdff1aSopenharmony_ci 182cabdff1aSopenharmony_ci if( FFABS( p0 - q0 ) < alpha && 183cabdff1aSopenharmony_ci FFABS( p1 - p0 ) < beta && 184cabdff1aSopenharmony_ci FFABS( q1 - q0 ) < beta ) { 185cabdff1aSopenharmony_ci 186cabdff1aSopenharmony_ci if(FFABS( p0 - q0 ) < (( alpha >> 2 ) + 2 )){ 187cabdff1aSopenharmony_ci if( FFABS( p2 - p0 ) < beta) 188cabdff1aSopenharmony_ci { 189cabdff1aSopenharmony_ci const int p3 = pix[-4*xstride]; 190cabdff1aSopenharmony_ci /* p0', p1', p2' */ 191cabdff1aSopenharmony_ci pix[-1*xstride] = ( p2 + 2*p1 + 2*p0 + 2*q0 + q1 + 4 ) >> 3; 192cabdff1aSopenharmony_ci pix[-2*xstride] = ( p2 + p1 + p0 + q0 + 2 ) >> 2; 193cabdff1aSopenharmony_ci pix[-3*xstride] = ( 2*p3 + 3*p2 + p1 + p0 + q0 + 4 ) >> 3; 194cabdff1aSopenharmony_ci } else { 195cabdff1aSopenharmony_ci /* p0' */ 196cabdff1aSopenharmony_ci pix[-1*xstride] = ( 2*p1 + p0 + q1 + 2 ) >> 2; 197cabdff1aSopenharmony_ci } 198cabdff1aSopenharmony_ci if( FFABS( q2 - q0 ) < beta) 199cabdff1aSopenharmony_ci { 200cabdff1aSopenharmony_ci const int q3 = pix[3*xstride]; 201cabdff1aSopenharmony_ci /* q0', q1', q2' */ 202cabdff1aSopenharmony_ci pix[0*xstride] = ( p1 + 2*p0 + 2*q0 + 2*q1 + q2 + 4 ) >> 3; 203cabdff1aSopenharmony_ci pix[1*xstride] = ( p0 + q0 + q1 + q2 + 2 ) >> 2; 204cabdff1aSopenharmony_ci pix[2*xstride] = ( 2*q3 + 3*q2 + q1 + q0 + p0 + 4 ) >> 3; 205cabdff1aSopenharmony_ci } else { 206cabdff1aSopenharmony_ci /* q0' */ 207cabdff1aSopenharmony_ci pix[0*xstride] = ( 2*q1 + q0 + p1 + 2 ) >> 2; 208cabdff1aSopenharmony_ci } 209cabdff1aSopenharmony_ci }else{ 210cabdff1aSopenharmony_ci /* p0', q0' */ 211cabdff1aSopenharmony_ci pix[-1*xstride] = ( 2*p1 + p0 + q1 + 2 ) >> 2; 212cabdff1aSopenharmony_ci pix[ 0*xstride] = ( 2*q1 + q0 + p1 + 2 ) >> 2; 213cabdff1aSopenharmony_ci } 214cabdff1aSopenharmony_ci } 215cabdff1aSopenharmony_ci pix += ystride; 216cabdff1aSopenharmony_ci } 217cabdff1aSopenharmony_ci} 218cabdff1aSopenharmony_cistatic void FUNCC(h264_v_loop_filter_luma_intra)(uint8_t *pix, ptrdiff_t stride, int alpha, int beta) 219cabdff1aSopenharmony_ci{ 220cabdff1aSopenharmony_ci FUNCC(h264_loop_filter_luma_intra)(pix, stride, sizeof(pixel), 4, alpha, beta); 221cabdff1aSopenharmony_ci} 222cabdff1aSopenharmony_cistatic void FUNCC(h264_h_loop_filter_luma_intra)(uint8_t *pix, ptrdiff_t stride, int alpha, int beta) 223cabdff1aSopenharmony_ci{ 224cabdff1aSopenharmony_ci FUNCC(h264_loop_filter_luma_intra)(pix, sizeof(pixel), stride, 4, alpha, beta); 225cabdff1aSopenharmony_ci} 226cabdff1aSopenharmony_cistatic void FUNCC(h264_h_loop_filter_luma_mbaff_intra)(uint8_t *pix, ptrdiff_t stride, int alpha, int beta) 227cabdff1aSopenharmony_ci{ 228cabdff1aSopenharmony_ci FUNCC(h264_loop_filter_luma_intra)(pix, sizeof(pixel), stride, 2, alpha, beta); 229cabdff1aSopenharmony_ci} 230cabdff1aSopenharmony_ci 231cabdff1aSopenharmony_cistatic av_always_inline av_flatten void FUNCC(h264_loop_filter_chroma)(uint8_t *p_pix, ptrdiff_t xstride, ptrdiff_t ystride, int inner_iters, int alpha, int beta, int8_t *tc0) 232cabdff1aSopenharmony_ci{ 233cabdff1aSopenharmony_ci pixel *pix = (pixel*)p_pix; 234cabdff1aSopenharmony_ci int i, d; 235cabdff1aSopenharmony_ci alpha <<= BIT_DEPTH - 8; 236cabdff1aSopenharmony_ci beta <<= BIT_DEPTH - 8; 237cabdff1aSopenharmony_ci xstride >>= sizeof(pixel)-1; 238cabdff1aSopenharmony_ci ystride >>= sizeof(pixel)-1; 239cabdff1aSopenharmony_ci for( i = 0; i < 4; i++ ) { 240cabdff1aSopenharmony_ci const int tc = ((tc0[i] - 1U) << (BIT_DEPTH - 8)) + 1; 241cabdff1aSopenharmony_ci if( tc <= 0 ) { 242cabdff1aSopenharmony_ci pix += inner_iters*ystride; 243cabdff1aSopenharmony_ci continue; 244cabdff1aSopenharmony_ci } 245cabdff1aSopenharmony_ci for( d = 0; d < inner_iters; d++ ) { 246cabdff1aSopenharmony_ci const int p0 = pix[-1*xstride]; 247cabdff1aSopenharmony_ci const int p1 = pix[-2*xstride]; 248cabdff1aSopenharmony_ci const int q0 = pix[0]; 249cabdff1aSopenharmony_ci const int q1 = pix[1*xstride]; 250cabdff1aSopenharmony_ci 251cabdff1aSopenharmony_ci if( FFABS( p0 - q0 ) < alpha && 252cabdff1aSopenharmony_ci FFABS( p1 - p0 ) < beta && 253cabdff1aSopenharmony_ci FFABS( q1 - q0 ) < beta ) { 254cabdff1aSopenharmony_ci 255cabdff1aSopenharmony_ci int delta = av_clip( ((q0 - p0) * 4 + (p1 - q1) + 4) >> 3, -tc, tc ); 256cabdff1aSopenharmony_ci 257cabdff1aSopenharmony_ci pix[-xstride] = av_clip_pixel( p0 + delta ); /* p0' */ 258cabdff1aSopenharmony_ci pix[0] = av_clip_pixel( q0 - delta ); /* q0' */ 259cabdff1aSopenharmony_ci } 260cabdff1aSopenharmony_ci pix += ystride; 261cabdff1aSopenharmony_ci } 262cabdff1aSopenharmony_ci } 263cabdff1aSopenharmony_ci} 264cabdff1aSopenharmony_cistatic void FUNCC(h264_v_loop_filter_chroma)(uint8_t *pix, ptrdiff_t stride, int alpha, int beta, int8_t *tc0) 265cabdff1aSopenharmony_ci{ 266cabdff1aSopenharmony_ci FUNCC(h264_loop_filter_chroma)(pix, stride, sizeof(pixel), 2, alpha, beta, tc0); 267cabdff1aSopenharmony_ci} 268cabdff1aSopenharmony_cistatic void FUNCC(h264_h_loop_filter_chroma)(uint8_t *pix, ptrdiff_t stride, int alpha, int beta, int8_t *tc0) 269cabdff1aSopenharmony_ci{ 270cabdff1aSopenharmony_ci FUNCC(h264_loop_filter_chroma)(pix, sizeof(pixel), stride, 2, alpha, beta, tc0); 271cabdff1aSopenharmony_ci} 272cabdff1aSopenharmony_cistatic void FUNCC(h264_h_loop_filter_chroma_mbaff)(uint8_t *pix, ptrdiff_t stride, int alpha, int beta, int8_t *tc0) 273cabdff1aSopenharmony_ci{ 274cabdff1aSopenharmony_ci FUNCC(h264_loop_filter_chroma)(pix, sizeof(pixel), stride, 1, alpha, beta, tc0); 275cabdff1aSopenharmony_ci} 276cabdff1aSopenharmony_cistatic void FUNCC(h264_h_loop_filter_chroma422)(uint8_t *pix, ptrdiff_t stride, int alpha, int beta, int8_t *tc0) 277cabdff1aSopenharmony_ci{ 278cabdff1aSopenharmony_ci FUNCC(h264_loop_filter_chroma)(pix, sizeof(pixel), stride, 4, alpha, beta, tc0); 279cabdff1aSopenharmony_ci} 280cabdff1aSopenharmony_cistatic void FUNCC(h264_h_loop_filter_chroma422_mbaff)(uint8_t *pix, ptrdiff_t stride, int alpha, int beta, int8_t *tc0) 281cabdff1aSopenharmony_ci{ 282cabdff1aSopenharmony_ci FUNCC(h264_loop_filter_chroma)(pix, sizeof(pixel), stride, 2, alpha, beta, tc0); 283cabdff1aSopenharmony_ci} 284cabdff1aSopenharmony_ci 285cabdff1aSopenharmony_cistatic av_always_inline av_flatten void FUNCC(h264_loop_filter_chroma_intra)(uint8_t *p_pix, ptrdiff_t xstride, ptrdiff_t ystride, int inner_iters, int alpha, int beta) 286cabdff1aSopenharmony_ci{ 287cabdff1aSopenharmony_ci pixel *pix = (pixel*)p_pix; 288cabdff1aSopenharmony_ci int d; 289cabdff1aSopenharmony_ci xstride >>= sizeof(pixel)-1; 290cabdff1aSopenharmony_ci ystride >>= sizeof(pixel)-1; 291cabdff1aSopenharmony_ci alpha <<= BIT_DEPTH - 8; 292cabdff1aSopenharmony_ci beta <<= BIT_DEPTH - 8; 293cabdff1aSopenharmony_ci for( d = 0; d < 4 * inner_iters; d++ ) { 294cabdff1aSopenharmony_ci const int p0 = pix[-1*xstride]; 295cabdff1aSopenharmony_ci const int p1 = pix[-2*xstride]; 296cabdff1aSopenharmony_ci const int q0 = pix[0]; 297cabdff1aSopenharmony_ci const int q1 = pix[1*xstride]; 298cabdff1aSopenharmony_ci 299cabdff1aSopenharmony_ci if( FFABS( p0 - q0 ) < alpha && 300cabdff1aSopenharmony_ci FFABS( p1 - p0 ) < beta && 301cabdff1aSopenharmony_ci FFABS( q1 - q0 ) < beta ) { 302cabdff1aSopenharmony_ci 303cabdff1aSopenharmony_ci pix[-xstride] = ( 2*p1 + p0 + q1 + 2 ) >> 2; /* p0' */ 304cabdff1aSopenharmony_ci pix[0] = ( 2*q1 + q0 + p1 + 2 ) >> 2; /* q0' */ 305cabdff1aSopenharmony_ci } 306cabdff1aSopenharmony_ci pix += ystride; 307cabdff1aSopenharmony_ci } 308cabdff1aSopenharmony_ci} 309cabdff1aSopenharmony_cistatic void FUNCC(h264_v_loop_filter_chroma_intra)(uint8_t *pix, ptrdiff_t stride, int alpha, int beta) 310cabdff1aSopenharmony_ci{ 311cabdff1aSopenharmony_ci FUNCC(h264_loop_filter_chroma_intra)(pix, stride, sizeof(pixel), 2, alpha, beta); 312cabdff1aSopenharmony_ci} 313cabdff1aSopenharmony_cistatic void FUNCC(h264_h_loop_filter_chroma_intra)(uint8_t *pix, ptrdiff_t stride, int alpha, int beta) 314cabdff1aSopenharmony_ci{ 315cabdff1aSopenharmony_ci FUNCC(h264_loop_filter_chroma_intra)(pix, sizeof(pixel), stride, 2, alpha, beta); 316cabdff1aSopenharmony_ci} 317cabdff1aSopenharmony_cistatic void FUNCC(h264_h_loop_filter_chroma_mbaff_intra)(uint8_t *pix, ptrdiff_t stride, int alpha, int beta) 318cabdff1aSopenharmony_ci{ 319cabdff1aSopenharmony_ci FUNCC(h264_loop_filter_chroma_intra)(pix, sizeof(pixel), stride, 1, alpha, beta); 320cabdff1aSopenharmony_ci} 321cabdff1aSopenharmony_cistatic void FUNCC(h264_h_loop_filter_chroma422_intra)(uint8_t *pix, ptrdiff_t stride, int alpha, int beta) 322cabdff1aSopenharmony_ci{ 323cabdff1aSopenharmony_ci FUNCC(h264_loop_filter_chroma_intra)(pix, sizeof(pixel), stride, 4, alpha, beta); 324cabdff1aSopenharmony_ci} 325cabdff1aSopenharmony_cistatic void FUNCC(h264_h_loop_filter_chroma422_mbaff_intra)(uint8_t *pix, ptrdiff_t stride, int alpha, int beta) 326cabdff1aSopenharmony_ci{ 327cabdff1aSopenharmony_ci FUNCC(h264_loop_filter_chroma_intra)(pix, sizeof(pixel), stride, 2, alpha, beta); 328cabdff1aSopenharmony_ci} 329