1 /*****************************************************************************
2 * frame.c: h264 encoder library
3 *****************************************************************************
4 * Copyright (C) 2003 Laurent Aimar
5 * $Id: frame.c,v 1.1 2004/06/03 19:27:06 fenrir Exp $
7 * Authors: Laurent Aimar <fenrir@via.ecp.fr>
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
22 *****************************************************************************/
30 x264_frame_t *x264_frame_new( x264_t *h )
32 x264_frame_t *frame = x264_malloc( sizeof( x264_frame_t ) );
35 int i_mb_count = h->mb.i_mb_count;
39 memset( frame, 0, sizeof(x264_frame_t) );
41 /* allocate frame data (+64 for extra data for me) */
42 i_stride = ( ( h->param.i_width + 15 )&0xfffff0 )+ 64;
43 i_lines = ( ( h->param.i_height + 15 )&0xfffff0 );
46 for( i = 0; i < 3; i++ )
52 if( h->param.i_csp == X264_CSP_I420 )
54 else if( h->param.i_csp == X264_CSP_I422 )
57 frame->i_stride[i] = i_stride / i_divw;
58 frame->i_lines[i] = i_lines / i_divh;
59 frame->buffer[i] = x264_malloc( frame->i_stride[i] *
60 ( frame->i_lines[i] + 64 / i_divh ) );
62 frame->plane[i] = ((uint8_t*)frame->buffer[i]) +
63 frame->i_stride[i] * 32 / i_divh + 32 / i_divw;
65 frame->i_stride[3] = 0;
66 frame->i_lines[3] = 0;
67 frame->buffer[3] = NULL;
68 frame->plane[3] = NULL;
70 frame->filtered[0] = frame->plane[0];
71 for( i = 0; i < 3; i++ )
73 frame->buffer[4+i] = x264_malloc( frame->i_stride[0] *
74 ( frame->i_lines[0] + 64 ) );
76 frame->filtered[i+1] = ((uint8_t*)frame->buffer[4+i]) +
77 frame->i_stride[0] * 32 + 32;
80 if( h->frames.b_have_lowres )
82 frame->i_stride_lowres = frame->i_stride[0]/2 + 32;
83 frame->i_lines_lowres = frame->i_lines[0]/2;
84 for( i = 0; i < 4; i++ )
86 frame->buffer[7+i] = x264_malloc( frame->i_stride_lowres *
87 ( frame->i_lines[0]/2 + 64 ) );
88 frame->lowres[i] = ((uint8_t*)frame->buffer[7+i]) +
89 frame->i_stride_lowres * 32 + 32;
94 frame->i_type = X264_TYPE_AUTO;
98 frame->i_frame_num = -1;
100 frame->mb_type= x264_malloc( i_mb_count * sizeof( int8_t) );
101 frame->mv[0] = x264_malloc( 2*16 * i_mb_count * sizeof( int16_t ) );
102 frame->ref[0] = x264_malloc( 4 * i_mb_count * sizeof( int8_t ) );
103 if( h->param.i_bframe )
105 frame->mv[1] = x264_malloc( 2*16 * i_mb_count * sizeof( int16_t ) );
106 frame->ref[1] = x264_malloc( 4 * i_mb_count * sizeof( int8_t ) );
111 frame->ref[1] = NULL;
117 void x264_frame_delete( x264_frame_t *frame )
120 for( i = 0; i < frame->i_plane; i++ )
122 x264_free( frame->buffer[i] );
124 for( i = 4; i < 11; i++ ) /* filtered planes */
126 x264_free( frame->buffer[i] );
128 x264_free( frame->mb_type );
129 x264_free( frame->mv[0] );
130 x264_free( frame->mv[1] );
131 x264_free( frame->ref[0] );
132 x264_free( frame->ref[1] );
136 void x264_frame_copy_picture( x264_t *h, x264_frame_t *dst, x264_picture_t *src )
138 dst->i_type = src->i_type;
139 dst->i_qpplus1 = src->i_qpplus1;
140 dst->i_pts = src->i_pts;
142 switch( src->img.i_csp & X264_CSP_MASK )
145 h->csp.i420( dst, &src->img, h->param.i_width, h->param.i_height );
148 h->csp.yv12( dst, &src->img, h->param.i_width, h->param.i_height );
151 h->csp.i422( dst, &src->img, h->param.i_width, h->param.i_height );
154 h->csp.i444( dst, &src->img, h->param.i_width, h->param.i_height );
157 h->csp.yuyv( dst, &src->img, h->param.i_width, h->param.i_height );
160 h->csp.rgb( dst, &src->img, h->param.i_width, h->param.i_height );
163 h->csp.bgr( dst, &src->img, h->param.i_width, h->param.i_height );
166 h->csp.bgra( dst, &src->img, h->param.i_width, h->param.i_height );
170 x264_log( h, X264_LOG_ERROR, "Arg invalid CSP\n" );
177 static void plane_expand_border( uint8_t *pix, int i_stride, int i_height, int i_pad )
179 #define PPIXEL(x, y) ( pix + (x) + (y)*i_stride )
180 const int i_width = i_stride - 2*i_pad;
183 for( y = 0; y < i_height; y++ )
186 memset( PPIXEL(-i_pad, y), PPIXEL(0, y)[0], i_pad );
188 memset( PPIXEL(i_width, y), PPIXEL(i_width-1, y)[0], i_pad );
191 for( y = 0; y < i_pad; y++ )
192 memcpy( PPIXEL(-i_pad, -y-1), PPIXEL(-i_pad, 0), i_stride );
194 for( y = 0; y < i_pad; y++ )
195 memcpy( PPIXEL(-i_pad, i_height+y), PPIXEL(-i_pad, i_height-1), i_stride );
199 void x264_frame_expand_border( x264_frame_t *frame )
202 for( i = 0; i < frame->i_plane; i++ )
204 int i_pad = i ? 16 : 32;
205 plane_expand_border( frame->plane[i], frame->i_stride[i], frame->i_lines[i], i_pad );
209 void x264_frame_expand_border_filtered( x264_frame_t *frame )
211 /* during filtering, 8 extra pixels were filtered on each edge.
212 we want to expand border from the last filtered pixel */
214 for( i = 1; i < 4; i++ )
215 plane_expand_border( frame->filtered[i] - 8*frame->i_stride[0] - 8, frame->i_stride[0], frame->i_lines[0]+2*8, 24 );
218 void x264_frame_expand_border_lowres( x264_frame_t *frame )
221 for( i = 0; i < 4; i++ )
222 plane_expand_border( frame->lowres[i], frame->i_stride_lowres, frame->i_lines_lowres, 32 );
225 void x264_frame_expand_border_mod16( x264_t *h, x264_frame_t *frame )
228 for( i = 0; i < frame->i_plane; i++ )
230 int i_subsample = i ? 1 : 0;
231 int i_width = h->param.i_width >> i_subsample;
232 int i_height = h->param.i_height >> i_subsample;
233 int i_padx = ( h->sps->i_mb_width * 16 - h->param.i_width ) >> i_subsample;
234 int i_pady = ( h->sps->i_mb_height * 16 - h->param.i_height ) >> i_subsample;
238 for( y = 0; y < i_height; y++ )
239 memset( &frame->plane[i][y*frame->i_stride[i] + i_width],
240 frame->plane[i][y*frame->i_stride[i] + i_width - 1],
245 for( y = i_height; y < i_height + i_pady; y++ );
246 memcpy( &frame->plane[i][y*frame->i_stride[i]],
247 &frame->plane[i][(i_height-1)*frame->i_stride[i]],
254 /* Deblocking filter */
256 static const int i_alpha_table[52] =
258 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
259 0, 0, 0, 0, 0, 0, 4, 4, 5, 6,
260 7, 8, 9, 10, 12, 13, 15, 17, 20, 22,
261 25, 28, 32, 36, 40, 45, 50, 56, 63, 71,
262 80, 90,101,113,127,144,162,182,203,226,
265 static const int i_beta_table[52] =
267 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
268 0, 0, 0, 0, 0, 0, 2, 2, 2, 3,
269 3, 3, 3, 4, 4, 4, 6, 6, 7, 7,
270 8, 8, 9, 9, 10, 10, 11, 11, 12, 12,
271 13, 13, 14, 14, 15, 15, 16, 16, 17, 17,
274 static const int i_tc0_table[52][3] =
276 { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 },
277 { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 },
278 { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 1 },
279 { 0, 0, 1 }, { 0, 0, 1 }, { 0, 0, 1 }, { 0, 1, 1 }, { 0, 1, 1 }, { 1, 1, 1 },
280 { 1, 1, 1 }, { 1, 1, 1 }, { 1, 1, 1 }, { 1, 1, 2 }, { 1, 1, 2 }, { 1, 1, 2 },
281 { 1, 1, 2 }, { 1, 2, 3 }, { 1, 2, 3 }, { 2, 2, 3 }, { 2, 2, 4 }, { 2, 3, 4 },
282 { 2, 3, 4 }, { 3, 3, 5 }, { 3, 4, 6 }, { 3, 4, 6 }, { 4, 5, 7 }, { 4, 5, 8 },
283 { 4, 6, 9 }, { 5, 7,10 }, { 6, 8,11 }, { 6, 8,13 }, { 7,10,14 }, { 8,11,16 },
284 { 9,12,18 }, {10,13,20 }, {11,15,23 }, {13,17,25 }
288 static inline int clip_uint8( int a )
296 static inline void deblock_luma_c( uint8_t *pix, int xstride, int ystride, int alpha, int beta, int8_t *tc0 )
299 for( i = 0; i < 4; i++ ) {
304 for( d = 0; d < 4; d++ ) {
305 const int p2 = pix[-3*xstride];
306 const int p1 = pix[-2*xstride];
307 const int p0 = pix[-1*xstride];
308 const int q0 = pix[ 0*xstride];
309 const int q1 = pix[ 1*xstride];
310 const int q2 = pix[ 2*xstride];
312 if( X264_ABS( p0 - q0 ) < alpha &&
313 X264_ABS( p1 - p0 ) < beta &&
314 X264_ABS( q1 - q0 ) < beta ) {
319 if( X264_ABS( p2 - p0 ) < beta ) {
320 pix[-2*xstride] = p1 + x264_clip3( (( p2 + ((p0 + q0 + 1) >> 1)) >> 1) - p1, -tc0[i], tc0[i] );
323 if( X264_ABS( q2 - q0 ) < beta ) {
324 pix[ 1*xstride] = q1 + x264_clip3( (( q2 + ((p0 + q0 + 1) >> 1)) >> 1) - q1, -tc0[i], tc0[i] );
328 delta = x264_clip3( (((q0 - p0 ) << 2) + (p1 - q1) + 4) >> 3, -tc, tc );
329 pix[-1*xstride] = clip_uint8( p0 + delta ); /* p0' */
330 pix[ 0*xstride] = clip_uint8( q0 - delta ); /* q0' */
336 static void deblock_v_luma_c( uint8_t *pix, int stride, int alpha, int beta, int8_t *tc0 )
338 deblock_luma_c( pix, stride, 1, alpha, beta, tc0 );
340 static void deblock_h_luma_c( uint8_t *pix, int stride, int alpha, int beta, int8_t *tc0 )
342 deblock_luma_c( pix, 1, stride, alpha, beta, tc0 );
345 static inline void deblock_chroma_c( uint8_t *pix, int xstride, int ystride, int alpha, int beta, int8_t *tc0 )
348 for( i = 0; i < 4; i++ ) {
349 const int tc = tc0[i];
354 for( d = 0; d < 2; d++ ) {
355 const int p1 = pix[-2*xstride];
356 const int p0 = pix[-1*xstride];
357 const int q0 = pix[ 0*xstride];
358 const int q1 = pix[ 1*xstride];
360 if( X264_ABS( p0 - q0 ) < alpha &&
361 X264_ABS( p1 - p0 ) < beta &&
362 X264_ABS( q1 - q0 ) < beta ) {
364 int delta = x264_clip3( (((q0 - p0 ) << 2) + (p1 - q1) + 4) >> 3, -tc, tc );
365 pix[-1*xstride] = clip_uint8( p0 + delta ); /* p0' */
366 pix[ 0*xstride] = clip_uint8( q0 - delta ); /* q0' */
372 static void deblock_v_chroma_c( uint8_t *pix, int stride, int alpha, int beta, int8_t *tc0 )
374 deblock_chroma_c( pix, stride, 1, alpha, beta, tc0 );
376 static void deblock_h_chroma_c( uint8_t *pix, int stride, int alpha, int beta, int8_t *tc0 )
378 deblock_chroma_c( pix, 1, stride, alpha, beta, tc0 );
381 static inline void deblock_luma_intra_c( uint8_t *pix, int xstride, int ystride, int alpha, int beta )
384 for( d = 0; d < 16; d++ ) {
385 const int p2 = pix[-3*xstride];
386 const int p1 = pix[-2*xstride];
387 const int p0 = pix[-1*xstride];
388 const int q0 = pix[ 0*xstride];
389 const int q1 = pix[ 1*xstride];
390 const int q2 = pix[ 2*xstride];
392 if( X264_ABS( p0 - q0 ) < alpha &&
393 X264_ABS( p1 - p0 ) < beta &&
394 X264_ABS( q1 - q0 ) < beta ) {
396 if(X264_ABS( p0 - q0 ) < ((alpha >> 2) + 2) ){
397 if( X264_ABS( p2 - p0 ) < beta)
399 const int p3 = pix[-4*xstride];
401 pix[-1*xstride] = ( p2 + 2*p1 + 2*p0 + 2*q0 + q1 + 4 ) >> 3;
402 pix[-2*xstride] = ( p2 + p1 + p0 + q0 + 2 ) >> 2;
403 pix[-3*xstride] = ( 2*p3 + 3*p2 + p1 + p0 + q0 + 4 ) >> 3;
406 pix[-1*xstride] = ( 2*p1 + p0 + q1 + 2 ) >> 2;
408 if( X264_ABS( q2 - q0 ) < beta)
410 const int q3 = pix[3*xstride];
412 pix[0*xstride] = ( p1 + 2*p0 + 2*q0 + 2*q1 + q2 + 4 ) >> 3;
413 pix[1*xstride] = ( p0 + q0 + q1 + q2 + 2 ) >> 2;
414 pix[2*xstride] = ( 2*q3 + 3*q2 + q1 + q0 + p0 + 4 ) >> 3;
417 pix[0*xstride] = ( 2*q1 + q0 + p1 + 2 ) >> 2;
421 pix[-1*xstride] = ( 2*p1 + p0 + q1 + 2 ) >> 2;
422 pix[ 0*xstride] = ( 2*q1 + q0 + p1 + 2 ) >> 2;
428 static void deblock_v_luma_intra_c( uint8_t *pix, int stride, int alpha, int beta )
430 deblock_luma_intra_c( pix, stride, 1, alpha, beta );
432 static void deblock_h_luma_intra_c( uint8_t *pix, int stride, int alpha, int beta )
434 deblock_luma_intra_c( pix, 1, stride, alpha, beta );
437 static inline void deblock_chroma_intra_c( uint8_t *pix, int xstride, int ystride, int alpha, int beta )
440 for( d = 0; d < 8; d++ ) {
441 const int p1 = pix[-2*xstride];
442 const int p0 = pix[-1*xstride];
443 const int q0 = pix[ 0*xstride];
444 const int q1 = pix[ 1*xstride];
446 if( X264_ABS( p0 - q0 ) < alpha &&
447 X264_ABS( p1 - p0 ) < beta &&
448 X264_ABS( q1 - q0 ) < beta ) {
450 pix[-1*xstride] = (2*p1 + p0 + q1 + 2) >> 2; /* p0' */
451 pix[ 0*xstride] = (2*q1 + q0 + p1 + 2) >> 2; /* q0' */
457 static void deblock_v_chroma_intra_c( uint8_t *pix, int stride, int alpha, int beta )
459 deblock_chroma_intra_c( pix, stride, 1, alpha, beta );
461 static void deblock_h_chroma_intra_c( uint8_t *pix, int stride, int alpha, int beta )
463 deblock_chroma_intra_c( pix, 1, stride, alpha, beta );
466 static inline void deblock_edge( x264_t *h, uint8_t *pix, int i_stride, int bS[4], int i_qp, int b_chroma,
467 x264_deblock_inter_t pf_inter, x264_deblock_intra_t pf_intra )
470 const int index_a = x264_clip3( i_qp + h->sh.i_alpha_c0_offset, 0, 51 );
471 const int alpha = i_alpha_table[index_a];
472 const int beta = i_beta_table[x264_clip3( i_qp + h->sh.i_beta_offset, 0, 51 )];
477 tc[i] = (bS[i] ? i_tc0_table[index_a][bS[i] - 1] : -1) + b_chroma;
478 pf_inter( pix, i_stride, alpha, beta, tc );
480 pf_intra( pix, i_stride, alpha, beta );
484 void x264_frame_deblocking_filter( x264_t *h, int i_slice_type )
486 const int s8x8 = 2 * h->mb.i_mb_stride;
487 const int s4x4 = 4 * h->mb.i_mb_stride;
491 for( mb_y = 0, mb_x = 0; mb_y < h->sps->i_mb_height; )
493 const int mb_xy = mb_y * h->mb.i_mb_stride + mb_x;
494 const int mb_8x8 = 2 * s8x8 * mb_y + 2 * mb_x;
495 const int mb_4x4 = 4 * s4x4 * mb_y + 4 * mb_x;
498 const int b_8x8_transform = h->mb.mb_transform_size[mb_xy];
500 /* cavlc + 8x8 transform stores nnz per 16 coeffs for the purpose of
501 * entropy coding, but per 64 coeffs for the purpose of deblocking */
502 if( !h->param.b_cabac && b_8x8_transform )
504 uint32_t *nnz = (uint32_t*)h->mb.non_zero_count[mb_xy];
505 if( nnz[0] ) nnz[0] = 0x01010101;
506 if( nnz[1] ) nnz[1] = 0x01010101;
507 if( nnz[2] ) nnz[2] = 0x01010101;
508 if( nnz[3] ) nnz[3] = 0x01010101;
511 /* i_dir == 0 -> vertical edge
512 * i_dir == 1 -> horizontal edge */
513 for( i_dir = 0; i_dir < 2; i_dir++ )
518 i_start = (( i_dir == 0 && mb_x != 0 ) || ( i_dir == 1 && mb_y != 0 ) ) ? 0 : 1;
520 for( i_edge = i_start; i_edge < 4; i_edge++ )
522 int mbn_xy = i_edge > 0 ? mb_xy : ( i_dir == 0 ? mb_xy - 1 : mb_xy - h->mb.i_mb_stride );
523 int mbn_8x8 = i_edge > 0 ? mb_8x8 : ( i_dir == 0 ? mb_8x8 - 2 : mb_8x8 - 2 * s8x8 );
524 int mbn_4x4 = i_edge > 0 ? mb_4x4 : ( i_dir == 0 ? mb_4x4 - 4 : mb_4x4 - 4 * s4x4 );
526 int bS[4]; /* filtering strength */
528 /* *** Get bS for each 4px for the current edge *** */
529 if( IS_INTRA( h->mb.type[mb_xy] ) || IS_INTRA( h->mb.type[mbn_xy] ) )
531 bS[0] = bS[1] = bS[2] = bS[3] = ( i_edge == 0 ? 4 : 3 );
536 for( i = 0; i < 4; i++ )
538 int x = i_dir == 0 ? i_edge : i;
539 int y = i_dir == 0 ? i : i_edge;
540 int xn = (x - (i_dir == 0 ? 1 : 0 ))&0x03;
541 int yn = (y - (i_dir == 0 ? 0 : 1 ))&0x03;
543 if( h->mb.non_zero_count[mb_xy][block_idx_xy[x][y]] != 0 ||
544 h->mb.non_zero_count[mbn_xy][block_idx_xy[xn][yn]] != 0 )
550 /* FIXME: A given frame may occupy more than one position in
551 * the reference list. So we should compare the frame numbers,
552 * not the indices in the ref list.
553 * No harm yet, as we don't generate that case.*/
555 int i8p= mb_8x8+(x/2)+(y/2)*s8x8;
556 int i8q= mbn_8x8+(xn/2)+(yn/2)*s8x8;
557 int i4p= mb_4x4+x+y*s4x4;
558 int i4q= mbn_4x4+xn+yn*s4x4;
563 for( l = 0; l < 1 + (i_slice_type == SLICE_TYPE_B); l++ )
565 if( h->mb.ref[l][i8p] != h->mb.ref[l][i8q] ||
566 abs( h->mb.mv[l][i4p][0] - h->mb.mv[l][i4q][0] ) >= 4 ||
567 abs( h->mb.mv[l][i4p][1] - h->mb.mv[l][i4q][1] ) >= 4 )
579 i_qp = h->mb.qp[mb_xy];
580 i_qpn= h->mb.qp[mbn_xy];
585 if( !b_8x8_transform || !(i_edge & 1) )
587 deblock_edge( h, &h->fdec->plane[0][16*mb_y * h->fdec->i_stride[0] + 16*mb_x + 4*i_edge],
588 h->fdec->i_stride[0], bS, (i_qp+i_qpn+1) >> 1, 0,
589 h->loopf.deblock_h_luma, h->loopf.deblock_h_luma_intra );
594 int i_qpc = ( i_chroma_qp_table[x264_clip3( i_qp + h->pps->i_chroma_qp_index_offset, 0, 51 )] +
595 i_chroma_qp_table[x264_clip3( i_qpn + h->pps->i_chroma_qp_index_offset, 0, 51 )] + 1 ) >> 1;
596 deblock_edge( h, &h->fdec->plane[1][8*(mb_y*h->fdec->i_stride[1]+mb_x)+2*i_edge],
597 h->fdec->i_stride[1], bS, i_qpc, 1,
598 h->loopf.deblock_h_chroma, h->loopf.deblock_h_chroma_intra );
599 deblock_edge( h, &h->fdec->plane[2][8*(mb_y*h->fdec->i_stride[2]+mb_x)+2*i_edge],
600 h->fdec->i_stride[2], bS, i_qpc, 1,
601 h->loopf.deblock_h_chroma, h->loopf.deblock_h_chroma_intra );
606 /* horizontal edge */
607 if( !b_8x8_transform || !(i_edge & 1) )
609 deblock_edge( h, &h->fdec->plane[0][(16*mb_y + 4*i_edge) * h->fdec->i_stride[0] + 16*mb_x],
610 h->fdec->i_stride[0], bS, (i_qp+i_qpn+1) >> 1, 0,
611 h->loopf.deblock_v_luma, h->loopf.deblock_v_luma_intra );
616 int i_qpc = ( i_chroma_qp_table[x264_clip3( i_qp + h->pps->i_chroma_qp_index_offset, 0, 51 )] +
617 i_chroma_qp_table[x264_clip3( i_qpn + h->pps->i_chroma_qp_index_offset, 0, 51 )] + 1 ) >> 1;
618 deblock_edge( h, &h->fdec->plane[1][8*(mb_y*h->fdec->i_stride[1]+mb_x)+2*i_edge*h->fdec->i_stride[1]],
619 h->fdec->i_stride[1], bS, i_qpc, 1,
620 h->loopf.deblock_v_chroma, h->loopf.deblock_v_chroma_intra );
621 deblock_edge( h, &h->fdec->plane[2][8*(mb_y*h->fdec->i_stride[2]+mb_x)+2*i_edge*h->fdec->i_stride[2]],
622 h->fdec->i_stride[2], bS, i_qpc, 1,
623 h->loopf.deblock_v_chroma, h->loopf.deblock_v_chroma_intra );
631 if( mb_x >= h->sps->i_mb_width )
640 void x264_deblock_v_chroma_mmxext( uint8_t *pix, int stride, int alpha, int beta, int8_t *tc0 );
641 void x264_deblock_h_chroma_mmxext( uint8_t *pix, int stride, int alpha, int beta, int8_t *tc0 );
642 void x264_deblock_v_chroma_intra_mmxext( uint8_t *pix, int stride, int alpha, int beta );
643 void x264_deblock_h_chroma_intra_mmxext( uint8_t *pix, int stride, int alpha, int beta );
647 void x264_deblock_v_luma_sse2( uint8_t *pix, int stride, int alpha, int beta, int8_t *tc0 );
648 void x264_deblock_h_luma_sse2( uint8_t *pix, int stride, int alpha, int beta, int8_t *tc0 );
649 #elif defined( HAVE_MMXEXT )
650 void x264_deblock_h_luma_mmxext( uint8_t *pix, int stride, int alpha, int beta, int8_t *tc0 );
651 void x264_deblock_v8_luma_mmxext( uint8_t *pix, int stride, int alpha, int beta, int8_t *tc0 );
653 void x264_deblock_v_luma_mmxext( uint8_t *pix, int stride, int alpha, int beta, int8_t *tc0 )
655 x264_deblock_v8_luma_mmxext( pix, stride, alpha, beta, tc0 );
656 x264_deblock_v8_luma_mmxext( pix+8, stride, alpha, beta, tc0+2 );
660 void x264_deblock_init( int cpu, x264_deblock_function_t *pf )
662 pf->deblock_v_luma = deblock_v_luma_c;
663 pf->deblock_h_luma = deblock_h_luma_c;
664 pf->deblock_v_chroma = deblock_v_chroma_c;
665 pf->deblock_h_chroma = deblock_h_chroma_c;
666 pf->deblock_v_luma_intra = deblock_v_luma_intra_c;
667 pf->deblock_h_luma_intra = deblock_h_luma_intra_c;
668 pf->deblock_v_chroma_intra = deblock_v_chroma_intra_c;
669 pf->deblock_h_chroma_intra = deblock_h_chroma_intra_c;
672 if( cpu&X264_CPU_MMXEXT )
674 pf->deblock_v_chroma = x264_deblock_v_chroma_mmxext;
675 pf->deblock_h_chroma = x264_deblock_h_chroma_mmxext;
676 pf->deblock_v_chroma_intra = x264_deblock_v_chroma_intra_mmxext;
677 pf->deblock_h_chroma_intra = x264_deblock_h_chroma_intra_mmxext;
680 if( cpu&X264_CPU_SSE2 )
682 pf->deblock_v_luma = x264_deblock_v_luma_sse2;
683 pf->deblock_h_luma = x264_deblock_h_luma_sse2;
686 pf->deblock_v_luma = x264_deblock_v_luma_mmxext;
687 pf->deblock_h_luma = x264_deblock_h_luma_mmxext;