annotate ffmpeg/libavcodec/h264dsp_template.c @ 13:844d341cf643 tip

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