frame.c
上传用户:hjq518
上传日期:2021-12-09
资源大小:5084k
文件大小:34k
源码类别:

Audio

开发平台:

Visual C++

  1. /*****************************************************************************
  2.  * frame.c: h264 encoder library
  3.  *****************************************************************************
  4.  * Copyright (C) 2003-2008 x264 project
  5.  *
  6.  * Authors: Laurent Aimar <fenrir@via.ecp.fr>
  7.  *          Loren Merritt <lorenm@u.washington.edu>
  8.  *
  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.
  13.  *
  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.
  18.  *
  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., 51 Franklin Street, Fifth Floor, Boston, MA  02111, USA.
  22.  *****************************************************************************/
  23. #include "common.h"
  24. #define ALIGN(x,a) (((x)+((a)-1))&~((a)-1))
  25. x264_frame_t *x264_frame_new( x264_t *h )
  26. {
  27.     x264_frame_t *frame = x264_malloc( sizeof(x264_frame_t) );
  28.     int i, j;
  29.     int i_mb_count = h->mb.i_mb_count;
  30.     int i_stride, i_width, i_lines;
  31.     int i_padv = PADV << h->param.b_interlaced;
  32.     int luma_plane_size;
  33.     int align = h->param.cpu&X264_CPU_CACHELINE_64 ? 64 : h->param.cpu&X264_CPU_CACHELINE_32 ? 32 : 16;
  34.     if( !frame ) return NULL;
  35.     memset( frame, 0, sizeof(x264_frame_t) );
  36.     /* allocate frame data (+64 for extra data for me) */
  37.     i_width  = ALIGN( h->param.i_width, 16 );
  38.     i_stride = ALIGN( i_width + 2*PADH, align );
  39.     i_lines  = ALIGN( h->param.i_height, 16<<h->param.b_interlaced );
  40.     frame->i_plane = 3;
  41.     for( i = 0; i < 3; i++ )
  42.     {
  43.         frame->i_stride[i] = i_stride >> !!i;
  44.         frame->i_width[i] = i_width >> !!i;
  45.         frame->i_lines[i] = i_lines >> !!i;
  46.     }
  47.     luma_plane_size = (frame->i_stride[0] * ( frame->i_lines[0] + 2*i_padv ));
  48.     for( i = 1; i < 3; i++ )
  49.     {
  50.         CHECKED_MALLOC( frame->buffer[i], luma_plane_size/4 );
  51.         frame->plane[i] = frame->buffer[i] + (frame->i_stride[i] * i_padv + PADH)/2;
  52.     }
  53.     /* all 4 luma planes allocated together, since the cacheline split code
  54.      * requires them to be in-phase wrt cacheline alignment. */
  55.     CHECKED_MALLOC( frame->buffer[0], 4*luma_plane_size);
  56.     for( i = 0; i < 4; i++ )
  57.         frame->filtered[i] = frame->buffer[0] + i*luma_plane_size + frame->i_stride[0] * i_padv + PADH;
  58.     frame->plane[0] = frame->filtered[0];
  59.     if( h->frames.b_have_lowres )
  60.     {
  61.         frame->i_width_lowres = frame->i_width[0]/2;
  62.         frame->i_stride_lowres = ALIGN( frame->i_width_lowres + 2*PADH, align );
  63.         frame->i_lines_lowres = frame->i_lines[0]/2;
  64.         luma_plane_size = frame->i_stride_lowres * ( frame->i_lines[0]/2 + 2*i_padv );
  65.         CHECKED_MALLOC( frame->buffer_lowres[0], 4 * luma_plane_size );
  66.         for( i = 0; i < 4; i++ )
  67.             frame->lowres[i] = frame->buffer_lowres[0] + (frame->i_stride_lowres * i_padv + PADH) + i * luma_plane_size;
  68.     }
  69.     if( h->param.analyse.i_me_method >= X264_ME_ESA )
  70.     {
  71.         CHECKED_MALLOC( frame->buffer[3],
  72.                         2 * frame->i_stride[0] * (frame->i_lines[0] + 2*i_padv) * sizeof(uint16_t) );
  73.         frame->integral = (uint16_t*)frame->buffer[3] + frame->i_stride[0] * i_padv + PADH;
  74.     }
  75.     frame->i_poc = -1;
  76.     frame->i_type = X264_TYPE_AUTO;
  77.     frame->i_qpplus1 = 0;
  78.     frame->i_pts = -1;
  79.     frame->i_frame = -1;
  80.     frame->i_frame_num = -1;
  81.     frame->i_lines_completed = -1;
  82.     CHECKED_MALLOC( frame->mb_type, i_mb_count * sizeof(int8_t));
  83.     CHECKED_MALLOC( frame->mv[0], 2*16 * i_mb_count * sizeof(int16_t) );
  84.     CHECKED_MALLOC( frame->ref[0], 4 * i_mb_count * sizeof(int8_t) );
  85.     if( h->param.i_bframe )
  86.     {
  87.         CHECKED_MALLOC( frame->mv[1], 2*16 * i_mb_count * sizeof(int16_t) );
  88.         CHECKED_MALLOC( frame->ref[1], 4 * i_mb_count * sizeof(int8_t) );
  89.     }
  90.     else
  91.     {
  92.         frame->mv[1]  = NULL;
  93.         frame->ref[1] = NULL;
  94.     }
  95.     CHECKED_MALLOC( frame->i_row_bits, i_lines/16 * sizeof(int) );
  96.     CHECKED_MALLOC( frame->i_row_qp, i_lines/16 * sizeof(int) );
  97.     for( i = 0; i < h->param.i_bframe + 2; i++ )
  98.         for( j = 0; j < h->param.i_bframe + 2; j++ )
  99.             CHECKED_MALLOC( frame->i_row_satds[i][j], i_lines/16 * sizeof(int) );
  100.     x264_pthread_mutex_init( &frame->mutex, NULL );
  101.     x264_pthread_cond_init( &frame->cv, NULL );
  102.     return frame;
  103. fail:
  104.     x264_frame_delete( frame );
  105.     return NULL;
  106. }
  107. void x264_frame_delete( x264_frame_t *frame )
  108. {
  109.     int i, j;
  110.     for( i = 0; i < 4; i++ )
  111.         x264_free( frame->buffer[i] );
  112.     for( i = 0; i < 4; i++ )
  113.         x264_free( frame->buffer_lowres[i] );
  114.     for( i = 0; i < X264_BFRAME_MAX+2; i++ )
  115.         for( j = 0; j < X264_BFRAME_MAX+2; j++ )
  116.             x264_free( frame->i_row_satds[i][j] );
  117.     x264_free( frame->i_row_bits );
  118.     x264_free( frame->i_row_qp );
  119.     x264_free( frame->mb_type );
  120.     x264_free( frame->mv[0] );
  121.     x264_free( frame->mv[1] );
  122.     x264_free( frame->ref[0] );
  123.     x264_free( frame->ref[1] );
  124.     x264_pthread_mutex_destroy( &frame->mutex );
  125.     x264_pthread_cond_destroy( &frame->cv );
  126.     x264_free( frame );
  127. }
  128. int x264_frame_copy_picture( x264_t *h, x264_frame_t *dst, x264_picture_t *src )
  129. {
  130.     int i_csp = src->img.i_csp & X264_CSP_MASK;
  131.     int i;
  132.     if( i_csp != X264_CSP_I420 && i_csp != X264_CSP_YV12 )
  133.     {
  134.         x264_log( h, X264_LOG_ERROR, "Arg invalid CSPn" );
  135.         return -1;
  136.     }
  137.     dst->i_type     = src->i_type;
  138.     dst->i_qpplus1  = src->i_qpplus1;
  139.     dst->i_pts      = src->i_pts;
  140.     for( i=0; i<3; i++ )
  141.     {
  142.         int s = (i_csp == X264_CSP_YV12 && i) ? i^3 : i;
  143.         uint8_t *plane = src->img.plane[s];
  144.         int stride = src->img.i_stride[s];
  145.         int width = h->param.i_width >> !!i;
  146.         int height = h->param.i_height >> !!i;
  147.         if( src->img.i_csp & X264_CSP_VFLIP )
  148.         {
  149.             plane += (height-1)*stride;
  150.             stride = -stride;
  151.         }
  152.         h->mc.plane_copy( dst->plane[i], dst->i_stride[i], plane, stride, width, height );
  153.     }
  154.     return 0;
  155. }
  156. static void plane_expand_border( uint8_t *pix, int i_stride, int i_width, int i_height, int i_padh, int i_padv, int b_pad_top, int b_pad_bottom )
  157. {
  158. #define PPIXEL(x, y) ( pix + (x) + (y)*i_stride )
  159.     int y;
  160.     for( y = 0; y < i_height; y++ )
  161.     {
  162.         /* left band */
  163.         memset( PPIXEL(-i_padh, y), PPIXEL(0, y)[0], i_padh );
  164.         /* right band */
  165.         memset( PPIXEL(i_width, y), PPIXEL(i_width-1, y)[0], i_padh );
  166.     }
  167.     /* upper band */
  168.     if( b_pad_top )
  169.     for( y = 0; y < i_padv; y++ )
  170.         memcpy( PPIXEL(-i_padh, -y-1), PPIXEL(-i_padh, 0), i_width+2*i_padh );
  171.     /* lower band */
  172.     if( b_pad_bottom )
  173.     for( y = 0; y < i_padv; y++ )
  174.         memcpy( PPIXEL(-i_padh, i_height+y), PPIXEL(-i_padh, i_height-1), i_width+2*i_padh );
  175. #undef PPIXEL
  176. }
  177. void x264_frame_expand_border( x264_t *h, x264_frame_t *frame, int mb_y, int b_end )
  178. {
  179.     int i;
  180.     int b_start = !mb_y;
  181.     if( mb_y & h->sh.b_mbaff )
  182.         return;
  183.     for( i = 0; i < frame->i_plane; i++ )
  184.     {
  185.         int stride = frame->i_stride[i];
  186.         int width = 16*h->sps->i_mb_width >> !!i;
  187.         int height = (b_end ? 16*(h->sps->i_mb_height - mb_y) >> h->sh.b_mbaff : 16) >> !!i;
  188.         int padh = PADH >> !!i;
  189.         int padv = PADV >> !!i;
  190.         // buffer: 2 chroma, 3 luma (rounded to 4) because deblocking goes beyond the top of the mb
  191.         uint8_t *pix = frame->plane[i] + X264_MAX(0, (16*mb_y-4)*stride >> !!i);
  192.         if( b_end && !b_start )
  193.             height += 4 >> (!!i + h->sh.b_mbaff);
  194.         if( h->sh.b_mbaff )
  195.         {
  196.             plane_expand_border( pix, stride*2, width, height, padh, padv, b_start, b_end );
  197.             plane_expand_border( pix+stride, stride*2, width, height, padh, padv, b_start, b_end );
  198.         }
  199.         else
  200.         {
  201.             plane_expand_border( pix, stride, width, height, padh, padv, b_start, b_end );
  202.         }
  203.     }
  204. }
  205. void x264_frame_expand_border_filtered( x264_t *h, x264_frame_t *frame, int mb_y, int b_end )
  206. {
  207.     /* during filtering, 8 extra pixels were filtered on each edge,
  208.      * but up to 3 of the horizontal ones may be wrong.
  209.        we want to expand border from the last filtered pixel */
  210.     int b_start = !mb_y;
  211.     int stride = frame->i_stride[0];
  212.     int width = 16*h->sps->i_mb_width + 8;
  213.     int height = b_end ? (16*(h->sps->i_mb_height - mb_y) >> h->sh.b_mbaff) + 16 : 16;
  214.     int padh = PADH - 4;
  215.     int padv = PADV - 8;
  216.     int i;
  217.     for( i = 1; i < 4; i++ )
  218.     {
  219.         // buffer: 8 luma, to match the hpel filter
  220.         uint8_t *pix = frame->filtered[i] + (16*mb_y - (8 << h->sh.b_mbaff)) * stride - 4;
  221.         if( h->sh.b_mbaff )
  222.         {
  223.             plane_expand_border( pix, stride*2, width, height, padh, padv, b_start, b_end );
  224.             plane_expand_border( pix+stride, stride*2, width, height, padh, padv, b_start, b_end );
  225.         }
  226.         else
  227.         {
  228.             plane_expand_border( pix, stride, width, height, padh, padv, b_start, b_end );
  229.         }
  230.     }
  231. }
  232. void x264_frame_expand_border_lowres( x264_frame_t *frame )
  233. {
  234.     int i;
  235.     for( i = 0; i < 4; i++ )
  236.         plane_expand_border( frame->lowres[i], frame->i_stride_lowres, frame->i_stride_lowres - 2*PADH, frame->i_lines_lowres, PADH, PADV, 1, 1 );
  237. }
  238. void x264_frame_expand_border_mod16( x264_t *h, x264_frame_t *frame )
  239. {
  240.     int i, y;
  241.     for( i = 0; i < frame->i_plane; i++ )
  242.     {
  243.         int i_subsample = i ? 1 : 0;
  244.         int i_width = h->param.i_width >> i_subsample;
  245.         int i_height = h->param.i_height >> i_subsample;
  246.         int i_padx = ( h->sps->i_mb_width * 16 - h->param.i_width ) >> i_subsample;
  247.         int i_pady = ( h->sps->i_mb_height * 16 - h->param.i_height ) >> i_subsample;
  248.         if( i_padx )
  249.         {
  250.             for( y = 0; y < i_height; y++ )
  251.                 memset( &frame->plane[i][y*frame->i_stride[i] + i_width],
  252.                          frame->plane[i][y*frame->i_stride[i] + i_width - 1],
  253.                          i_padx );
  254.         }
  255.         if( i_pady )
  256.         {
  257.             //FIXME interlace? or just let it pad using the wrong field
  258.             for( y = i_height; y < i_height + i_pady; y++ )
  259.                 memcpy( &frame->plane[i][y*frame->i_stride[i]],
  260.                         &frame->plane[i][(i_height-1)*frame->i_stride[i]],
  261.                         i_width + i_padx );
  262.         }
  263.     }
  264. }
  265. /* cavlc + 8x8 transform stores nnz per 16 coeffs for the purpose of
  266.  * entropy coding, but per 64 coeffs for the purpose of deblocking */
  267. static void munge_cavlc_nnz_row( x264_t *h, int mb_y, uint8_t (*buf)[16] )
  268. {
  269.     uint32_t (*src)[6] = (uint32_t(*)[6])h->mb.non_zero_count + mb_y * h->sps->i_mb_width;
  270.     int8_t *transform = h->mb.mb_transform_size + mb_y * h->sps->i_mb_width;
  271.     int x, nnz;
  272.     for( x=0; x<h->sps->i_mb_width; x++ )
  273.     {
  274.         memcpy( buf+x, src+x, 16 );
  275.         if( transform[x] )
  276.         {
  277.             nnz = src[x][0] | src[x][1];
  278.             src[x][0] = src[x][1] = ((uint16_t)nnz ? 0x0101 : 0) + (nnz>>16 ? 0x01010000 : 0);
  279.             nnz = src[x][2] | src[x][3];
  280.             src[x][2] = src[x][3] = ((uint16_t)nnz ? 0x0101 : 0) + (nnz>>16 ? 0x01010000 : 0);
  281.         }
  282.     }
  283. }
  284. static void restore_cavlc_nnz_row( x264_t *h, int mb_y, uint8_t (*buf)[16] )
  285. {
  286.     uint8_t (*dst)[24] = h->mb.non_zero_count + mb_y * h->sps->i_mb_width;
  287.     int x;
  288.     for( x=0; x<h->sps->i_mb_width; x++ )
  289.         memcpy( dst+x, buf+x, 16 );
  290. }
  291. static void munge_cavlc_nnz( x264_t *h, int mb_y, uint8_t (*buf)[16], void (*func)(x264_t*, int, uint8_t (*)[16]) )
  292. {
  293.     func( h, mb_y, buf );
  294.     if( mb_y > 0 )
  295.         func( h, mb_y-1, buf + h->sps->i_mb_width );
  296.     if( h->sh.b_mbaff )
  297.     {
  298.         func( h, mb_y+1, buf + h->sps->i_mb_width * 2 );
  299.         if( mb_y > 0 )
  300.             func( h, mb_y-2, buf + h->sps->i_mb_width * 3 );
  301.     }
  302. }
  303. /* Deblocking filter */
  304. static const uint8_t i_alpha_table[52+12*2] =
  305. {
  306.      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  307.      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  308.      0,  0,  0,  0,  0,  0,  4,  4,  5,  6,
  309.      7,  8,  9, 10, 12, 13, 15, 17, 20, 22,
  310.     25, 28, 32, 36, 40, 45, 50, 56, 63, 71,
  311.     80, 90,101,113,127,144,162,182,203,226,
  312.    255,255,
  313.    255,255,255,255,255,255,255,255,255,255,255,255,
  314. };
  315. static const uint8_t i_beta_table[52+12*2] =
  316. {
  317.      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  318.      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  319.      0,  0,  0,  0,  0,  0,  2,  2,  2,  3,
  320.      3,  3,  3,  4,  4,  4,  6,  6,  7,  7,
  321.      8,  8,  9,  9, 10, 10, 11, 11, 12, 12,
  322.     13, 13, 14, 14, 15, 15, 16, 16, 17, 17,
  323.     18, 18,
  324.     18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
  325. };
  326. static const int8_t i_tc0_table[52+12*2][4] =
  327. {
  328.     {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 },
  329.     {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 },
  330.     {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 },
  331.     {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 },
  332.     {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 1 },
  333.     {-1, 0, 0, 1 }, {-1, 0, 0, 1 }, {-1, 0, 0, 1 }, {-1, 0, 1, 1 }, {-1, 0, 1, 1 }, {-1, 1, 1, 1 },
  334.     {-1, 1, 1, 1 }, {-1, 1, 1, 1 }, {-1, 1, 1, 1 }, {-1, 1, 1, 2 }, {-1, 1, 1, 2 }, {-1, 1, 1, 2 },
  335.     {-1, 1, 1, 2 }, {-1, 1, 2, 3 }, {-1, 1, 2, 3 }, {-1, 2, 2, 3 }, {-1, 2, 2, 4 }, {-1, 2, 3, 4 },
  336.     {-1, 2, 3, 4 }, {-1, 3, 3, 5 }, {-1, 3, 4, 6 }, {-1, 3, 4, 6 }, {-1, 4, 5, 7 }, {-1, 4, 5, 8 },
  337.     {-1, 4, 6, 9 }, {-1, 5, 7,10 }, {-1, 6, 8,11 }, {-1, 6, 8,13 }, {-1, 7,10,14 }, {-1, 8,11,16 },
  338.     {-1, 9,12,18 }, {-1,10,13,20 }, {-1,11,15,23 }, {-1,13,17,25 },
  339.     {-1,13,17,25 }, {-1,13,17,25 }, {-1,13,17,25 }, {-1,13,17,25 }, {-1,13,17,25 }, {-1,13,17,25 },
  340.     {-1,13,17,25 }, {-1,13,17,25 }, {-1,13,17,25 }, {-1,13,17,25 }, {-1,13,17,25 }, {-1,13,17,25 },
  341. };
  342. #define alpha_table(x) i_alpha_table[(x)+12]
  343. #define beta_table(x)  i_beta_table[(x)+12]
  344. #define tc0_table(x)   i_tc0_table[(x)+12]
  345. /* From ffmpeg */
  346. static inline void deblock_luma_c( uint8_t *pix, int xstride, int ystride, int alpha, int beta, int8_t *tc0 )
  347. {
  348.     int i, d;
  349.     for( i = 0; i < 4; i++ )
  350.     {
  351.         if( tc0[i] < 0 )
  352.         {
  353.             pix += 4*ystride;
  354.             continue;
  355.         }
  356.         for( d = 0; d < 4; d++ )
  357.         {
  358.             const int p2 = pix[-3*xstride];
  359.             const int p1 = pix[-2*xstride];
  360.             const int p0 = pix[-1*xstride];
  361.             const int q0 = pix[ 0*xstride];
  362.             const int q1 = pix[ 1*xstride];
  363.             const int q2 = pix[ 2*xstride];
  364.             if( abs( p0 - q0 ) < alpha && abs( p1 - p0 ) < beta && abs( q1 - q0 ) < beta )
  365.             {
  366.                 int tc = tc0[i];
  367.                 int delta;
  368.                 if( abs( p2 - p0 ) < beta )
  369.                 {
  370.                     pix[-2*xstride] = p1 + x264_clip3( (( p2 + ((p0 + q0 + 1) >> 1)) >> 1) - p1, -tc0[i], tc0[i] );
  371.                     tc++;
  372.                 }
  373.                 if( abs( q2 - q0 ) < beta )
  374.                 {
  375.                     pix[ 1*xstride] = q1 + x264_clip3( (( q2 + ((p0 + q0 + 1) >> 1)) >> 1) - q1, -tc0[i], tc0[i] );
  376.                     tc++;
  377.                 }
  378.                 delta = x264_clip3( (((q0 - p0 ) << 2) + (p1 - q1) + 4) >> 3, -tc, tc );
  379.                 pix[-1*xstride] = x264_clip_uint8( p0 + delta );    /* p0' */
  380.                 pix[ 0*xstride] = x264_clip_uint8( q0 - delta );    /* q0' */
  381.             }
  382.             pix += ystride;
  383.         }
  384.     }
  385. }
  386. static void deblock_v_luma_c( uint8_t *pix, int stride, int alpha, int beta, int8_t *tc0 )
  387. {
  388.     deblock_luma_c( pix, stride, 1, alpha, beta, tc0 );
  389. }
  390. static void deblock_h_luma_c( uint8_t *pix, int stride, int alpha, int beta, int8_t *tc0 )
  391. {
  392.     deblock_luma_c( pix, 1, stride, alpha, beta, tc0 );
  393. }
  394. static inline void deblock_chroma_c( uint8_t *pix, int xstride, int ystride, int alpha, int beta, int8_t *tc0 )
  395. {
  396.     int i, d;
  397.     for( i = 0; i < 4; i++ )
  398.     {
  399.         const int tc = tc0[i];
  400.         if( tc <= 0 )
  401.         {
  402.             pix += 2*ystride;
  403.             continue;
  404.         }
  405.         for( d = 0; d < 2; d++ )
  406.         {
  407.             const int p1 = pix[-2*xstride];
  408.             const int p0 = pix[-1*xstride];
  409.             const int q0 = pix[ 0*xstride];
  410.             const int q1 = pix[ 1*xstride];
  411.             if( abs( p0 - q0 ) < alpha && abs( p1 - p0 ) < beta && abs( q1 - q0 ) < beta )
  412.             {
  413.                 int delta = x264_clip3( (((q0 - p0 ) << 2) + (p1 - q1) + 4) >> 3, -tc, tc );
  414.                 pix[-1*xstride] = x264_clip_uint8( p0 + delta );    /* p0' */
  415.                 pix[ 0*xstride] = x264_clip_uint8( q0 - delta );    /* q0' */
  416.             }
  417.             pix += ystride;
  418.         }
  419.     }
  420. }
  421. static void deblock_v_chroma_c( uint8_t *pix, int stride, int alpha, int beta, int8_t *tc0 )
  422. {
  423.     deblock_chroma_c( pix, stride, 1, alpha, beta, tc0 );
  424. }
  425. static void deblock_h_chroma_c( uint8_t *pix, int stride, int alpha, int beta, int8_t *tc0 )
  426. {
  427.     deblock_chroma_c( pix, 1, stride, alpha, beta, tc0 );
  428. }
  429. static inline void deblock_luma_intra_c( uint8_t *pix, int xstride, int ystride, int alpha, int beta )
  430. {
  431.     int d;
  432.     for( d = 0; d < 16; d++ )
  433.     {
  434.         const int p2 = pix[-3*xstride];
  435.         const int p1 = pix[-2*xstride];
  436.         const int p0 = pix[-1*xstride];
  437.         const int q0 = pix[ 0*xstride];
  438.         const int q1 = pix[ 1*xstride];
  439.         const int q2 = pix[ 2*xstride];
  440.         if( abs( p0 - q0 ) < alpha && abs( p1 - p0 ) < beta && abs( q1 - q0 ) < beta )
  441.         {
  442.             if(abs( p0 - q0 ) < ((alpha >> 2) + 2) )
  443.             {
  444.                 if( abs( p2 - p0 ) < beta ) /* p0', p1', p2' */
  445.                 {
  446.                     const int p3 = pix[-4*xstride];
  447.                     pix[-1*xstride] = ( p2 + 2*p1 + 2*p0 + 2*q0 + q1 + 4 ) >> 3;
  448.                     pix[-2*xstride] = ( p2 + p1 + p0 + q0 + 2 ) >> 2;
  449.                     pix[-3*xstride] = ( 2*p3 + 3*p2 + p1 + p0 + q0 + 4 ) >> 3;
  450.                 }
  451.                 else /* p0' */
  452.                     pix[-1*xstride] = ( 2*p1 + p0 + q1 + 2 ) >> 2;
  453.                 if( abs( q2 - q0 ) < beta ) /* q0', q1', q2' */
  454.                 {
  455.                     const int q3 = pix[3*xstride];
  456.                     pix[0*xstride] = ( p1 + 2*p0 + 2*q0 + 2*q1 + q2 + 4 ) >> 3;
  457.                     pix[1*xstride] = ( p0 + q0 + q1 + q2 + 2 ) >> 2;
  458.                     pix[2*xstride] = ( 2*q3 + 3*q2 + q1 + q0 + p0 + 4 ) >> 3;
  459.                 }
  460.                 else /* q0' */
  461.                     pix[0*xstride] = ( 2*q1 + q0 + p1 + 2 ) >> 2;
  462.             }
  463.             else /* p0', q0' */
  464.             {
  465.                 pix[-1*xstride] = ( 2*p1 + p0 + q1 + 2 ) >> 2;
  466.                 pix[ 0*xstride] = ( 2*q1 + q0 + p1 + 2 ) >> 2;
  467.             }
  468.         }
  469.         pix += ystride;
  470.     }
  471. }
  472. static void deblock_v_luma_intra_c( uint8_t *pix, int stride, int alpha, int beta )
  473. {
  474.     deblock_luma_intra_c( pix, stride, 1, alpha, beta );
  475. }
  476. static void deblock_h_luma_intra_c( uint8_t *pix, int stride, int alpha, int beta )
  477. {
  478.     deblock_luma_intra_c( pix, 1, stride, alpha, beta );
  479. }
  480. static inline void deblock_chroma_intra_c( uint8_t *pix, int xstride, int ystride, int alpha, int beta )
  481. {
  482.     int d;
  483.     for( d = 0; d < 8; d++ )
  484.     {
  485.         const int p1 = pix[-2*xstride];
  486.         const int p0 = pix[-1*xstride];
  487.         const int q0 = pix[ 0*xstride];
  488.         const int q1 = pix[ 1*xstride];
  489.         if( abs( p0 - q0 ) < alpha && abs( p1 - p0 ) < beta && abs( q1 - q0 ) < beta )
  490.         {
  491.             pix[-1*xstride] = (2*p1 + p0 + q1 + 2) >> 2;   /* p0' */
  492.             pix[ 0*xstride] = (2*q1 + q0 + p1 + 2) >> 2;   /* q0' */
  493.         }
  494.         pix += ystride;
  495.     }
  496. }
  497. static void deblock_v_chroma_intra_c( uint8_t *pix, int stride, int alpha, int beta )
  498. {
  499.     deblock_chroma_intra_c( pix, stride, 1, alpha, beta );
  500. }
  501. static void deblock_h_chroma_intra_c( uint8_t *pix, int stride, int alpha, int beta )
  502. {
  503.     deblock_chroma_intra_c( pix, 1, stride, alpha, beta );
  504. }
  505. static inline void deblock_edge( x264_t *h, uint8_t *pix1, uint8_t *pix2, int i_stride, uint8_t bS[4], int i_qp, int b_chroma, x264_deblock_inter_t pf_inter )
  506. {
  507.     const int index_a = i_qp + h->sh.i_alpha_c0_offset;
  508.     const int alpha = alpha_table(index_a);
  509.     const int beta  = beta_table(i_qp + h->sh.i_beta_offset);
  510.     int8_t tc[4];
  511.     if( !alpha || !beta )
  512.         return;
  513.     tc[0] = tc0_table(index_a)[bS[0]] + b_chroma;
  514.     tc[1] = tc0_table(index_a)[bS[1]] + b_chroma;
  515.     tc[2] = tc0_table(index_a)[bS[2]] + b_chroma;
  516.     tc[3] = tc0_table(index_a)[bS[3]] + b_chroma;
  517.     pf_inter( pix1, i_stride, alpha, beta, tc );
  518.     if( b_chroma )
  519.         pf_inter( pix2, i_stride, alpha, beta, tc );
  520. }
  521. static inline void deblock_edge_intra( x264_t *h, uint8_t *pix1, uint8_t *pix2, int i_stride, uint8_t bS[4], int i_qp, int b_chroma, x264_deblock_intra_t pf_intra )
  522. {
  523.     const int alpha = alpha_table(i_qp + h->sh.i_alpha_c0_offset);
  524.     const int beta  = beta_table(i_qp + h->sh.i_beta_offset);
  525.     if( !alpha || !beta )
  526.         return;
  527.     pf_intra( pix1, i_stride, alpha, beta );
  528.     if( b_chroma )
  529.         pf_intra( pix2, i_stride, alpha, beta );
  530. }
  531. void x264_frame_deblock_row( x264_t *h, int mb_y )
  532. {
  533.     const int s8x8 = 2 * h->mb.i_mb_stride;
  534.     const int s4x4 = 4 * h->mb.i_mb_stride;
  535.     const int b_interlaced = h->sh.b_mbaff;
  536.     const int mvy_limit = 4 >> b_interlaced;
  537.     const int qp_thresh = 15 - X264_MIN(h->sh.i_alpha_c0_offset, h->sh.i_beta_offset) - X264_MAX(0, h->param.analyse.i_chroma_qp_offset);
  538.     int mb_x;
  539.     int stridey   = h->fdec->i_stride[0];
  540.     int stride2y  = stridey << b_interlaced;
  541.     int strideuv  = h->fdec->i_stride[1];
  542.     int stride2uv = strideuv << b_interlaced;
  543.     if( !h->pps->b_cabac && h->pps->b_transform_8x8_mode )
  544.         munge_cavlc_nnz( h, mb_y, h->mb.nnz_backup, munge_cavlc_nnz_row );
  545.     for( mb_x = 0; mb_x < h->sps->i_mb_width; mb_x += (~b_interlaced | mb_y)&1, mb_y ^= b_interlaced )
  546.     {
  547.         const int mb_xy  = mb_y * h->mb.i_mb_stride + mb_x;
  548.         const int mb_8x8 = 2 * s8x8 * mb_y + 2 * mb_x;
  549.         const int mb_4x4 = 4 * s4x4 * mb_y + 4 * mb_x;
  550.         const int b_8x8_transform = h->mb.mb_transform_size[mb_xy];
  551.         const int i_qp = h->mb.qp[mb_xy];
  552.         int i_edge_end = (h->mb.type[mb_xy] == P_SKIP) ? 1 : 4;
  553.         uint8_t *pixy = h->fdec->plane[0] + 16*mb_y*stridey  + 16*mb_x;
  554.         uint8_t *pixu = h->fdec->plane[1] +  8*mb_y*strideuv +  8*mb_x;
  555.         uint8_t *pixv = h->fdec->plane[2] +  8*mb_y*strideuv +  8*mb_x;
  556.         if( b_interlaced && (mb_y&1) )
  557.         {
  558.             pixy -= 15*stridey;
  559.             pixu -=  7*strideuv;
  560.             pixv -=  7*strideuv;
  561.         }
  562.         x264_prefetch_fenc( h, h->fdec, mb_x, mb_y );
  563.         if( i_qp <= qp_thresh )
  564.             i_edge_end = 1;
  565.         #define FILTER_DIR(intra, i_dir)
  566.         {
  567.             /* Y plane */
  568.             i_qpn= h->mb.qp[mbn_xy];
  569.             if( i_dir == 0 )
  570.             {
  571.                 /* vertical edge */
  572.                 deblock_edge##intra( h, pixy + 4*i_edge, NULL,
  573.                               stride2y, bS, (i_qp+i_qpn+1) >> 1, 0,
  574.                               h->loopf.deblock_h_luma##intra );
  575.                 if( !(i_edge & 1) )
  576.                 {
  577.                     /* U/V planes */
  578.                     int i_qpc = (h->chroma_qp_table[i_qp] + h->chroma_qp_table[i_qpn] + 1) >> 1;
  579.                     deblock_edge##intra( h, pixu + 2*i_edge, pixv + 2*i_edge,
  580.                                   stride2uv, bS, i_qpc, 1,
  581.                                   h->loopf.deblock_h_chroma##intra );
  582.                 }
  583.             }
  584.             else
  585.             {
  586.                 /* horizontal edge */
  587.                 deblock_edge##intra( h, pixy + 4*i_edge*stride2y, NULL,
  588.                               stride2y, bS, (i_qp+i_qpn+1) >> 1, 0,
  589.                               h->loopf.deblock_v_luma##intra );
  590.                 /* U/V planes */
  591.                 if( !(i_edge & 1) )
  592.                 {
  593.                     int i_qpc = (h->chroma_qp_table[i_qp] + h->chroma_qp_table[i_qpn] + 1) >> 1;
  594.                     deblock_edge##intra( h, pixu + 2*i_edge*stride2uv, pixv + 2*i_edge*stride2uv,
  595.                                   stride2uv, bS, i_qpc, 1,
  596.                                   h->loopf.deblock_v_chroma##intra );
  597.                 }
  598.             }
  599.         }
  600.         #define DEBLOCK_STRENGTH(i_dir)
  601.         {
  602.             /* *** Get bS for each 4px for the current edge *** */
  603.             if( IS_INTRA( h->mb.type[mb_xy] ) || IS_INTRA( h->mb.type[mbn_xy]) )
  604.                 *(uint32_t*)bS = 0x03030303;
  605.             else
  606.             {
  607.                 *(uint32_t*)bS = 0x00000000;
  608.                 for( i = 0; i < 4; i++ )
  609.                 {
  610.                     int x  = i_dir == 0 ? i_edge : i;
  611.                     int y  = i_dir == 0 ? i      : i_edge;
  612.                     int xn = i_dir == 0 ? (x - 1)&0x03 : x;
  613.                     int yn = i_dir == 0 ? y : (y - 1)&0x03;
  614.                     if( h->mb.non_zero_count[mb_xy][x+y*4] != 0 ||
  615.                         h->mb.non_zero_count[mbn_xy][xn+yn*4] != 0 )
  616.                         bS[i] = 2;
  617.                     else
  618.                     {
  619.                         /* FIXME: A given frame may occupy more than one position in
  620.                          * the reference list. So we should compare the frame numbers,
  621.                          * not the indices in the ref list.
  622.                          * No harm yet, as we don't generate that case.*/
  623.                         int i8p= mb_8x8+(x>>1)+(y>>1)*s8x8;
  624.                         int i8q= mbn_8x8+(xn>>1)+(yn>>1)*s8x8;
  625.                         int i4p= mb_4x4+x+y*s4x4;
  626.                         int i4q= mbn_4x4+xn+yn*s4x4;
  627.                         for( l = 0; l < 1 + (h->sh.i_type == SLICE_TYPE_B); l++ )
  628.                             if( h->mb.ref[l][i8p] != h->mb.ref[l][i8q] ||
  629.                                 abs( h->mb.mv[l][i4p][0] - h->mb.mv[l][i4q][0] ) >= 4 ||
  630.                                 abs( h->mb.mv[l][i4p][1] - h->mb.mv[l][i4q][1] ) >= mvy_limit )
  631.                             {
  632.                                 bS[i] = 1;
  633.                                 break;
  634.                             }
  635.                     }
  636.                 }
  637.             }
  638.         }
  639.         /* i_dir == 0 -> vertical edge
  640.          * i_dir == 1 -> horizontal edge */
  641.         #define DEBLOCK_DIR(i_dir)
  642.         {
  643.             int i_edge = (i_dir ? (mb_y <= b_interlaced) : (mb_x == 0));
  644.             int i_qpn, i, l, mbn_xy, mbn_8x8, mbn_4x4;
  645.             DECLARE_ALIGNED_4( uint8_t bS[4] );  /* filtering strength */
  646.             if( i_edge )
  647.                 i_edge+= b_8x8_transform;
  648.             else
  649.             {
  650.                 mbn_xy  = i_dir == 0 ? mb_xy  - 1 : mb_xy - h->mb.i_mb_stride;
  651.                 mbn_8x8 = i_dir == 0 ? mb_8x8 - 2 : mb_8x8 - 2 * s8x8;
  652.                 mbn_4x4 = i_dir == 0 ? mb_4x4 - 4 : mb_4x4 - 4 * s4x4;
  653.                 if( b_interlaced && i_dir == 1 )
  654.                 {
  655.                     mbn_xy -= h->mb.i_mb_stride;
  656.                     mbn_8x8 -= 2 * s8x8;
  657.                     mbn_4x4 -= 4 * s4x4;
  658.                 }
  659.                 else if( IS_INTRA( h->mb.type[mb_xy] ) || IS_INTRA( h->mb.type[mbn_xy]) )
  660.                 {
  661.                     FILTER_DIR( _intra, i_dir );
  662.                     goto end##i_dir;
  663.                 }
  664.                 DEBLOCK_STRENGTH(i_dir);
  665.                 if( *(uint32_t*)bS )
  666.                     FILTER_DIR( , i_dir);
  667.                 end##i_dir:
  668.                 i_edge += b_8x8_transform+1;
  669.             }
  670.             mbn_xy  = mb_xy;
  671.             mbn_8x8 = mb_8x8;
  672.             mbn_4x4 = mb_4x4;
  673.             for( ; i_edge < i_edge_end; i_edge+=b_8x8_transform+1 )
  674.             {
  675.                 DEBLOCK_STRENGTH(i_dir);
  676.                 if( *(uint32_t*)bS )
  677.                     FILTER_DIR( , i_dir);
  678.             }
  679.         }
  680.         DEBLOCK_DIR(0);
  681.         DEBLOCK_DIR(1);
  682.     }
  683.     if( !h->pps->b_cabac && h->pps->b_transform_8x8_mode )
  684.         munge_cavlc_nnz( h, mb_y, h->mb.nnz_backup, restore_cavlc_nnz_row );
  685. }
  686. void x264_frame_deblock( x264_t *h )
  687. {
  688.     int mb_y;
  689.     for( mb_y = 0; mb_y < h->sps->i_mb_height; mb_y += 1 + h->sh.b_mbaff )
  690.         x264_frame_deblock_row( h, mb_y );
  691. }
  692. #ifdef HAVE_MMX
  693. void x264_deblock_v_chroma_mmxext( uint8_t *pix, int stride, int alpha, int beta, int8_t *tc0 );
  694. void x264_deblock_h_chroma_mmxext( uint8_t *pix, int stride, int alpha, int beta, int8_t *tc0 );
  695. void x264_deblock_v_chroma_intra_mmxext( uint8_t *pix, int stride, int alpha, int beta );
  696. void x264_deblock_h_chroma_intra_mmxext( uint8_t *pix, int stride, int alpha, int beta );
  697. void x264_deblock_v_luma_sse2( uint8_t *pix, int stride, int alpha, int beta, int8_t *tc0 );
  698. void x264_deblock_h_luma_sse2( uint8_t *pix, int stride, int alpha, int beta, int8_t *tc0 );
  699. void x264_deblock_v_luma_intra_sse2( uint8_t *pix, int stride, int alpha, int beta );
  700. void x264_deblock_h_luma_intra_sse2( uint8_t *pix, int stride, int alpha, int beta );
  701. #ifdef ARCH_X86
  702. void x264_deblock_h_luma_mmxext( uint8_t *pix, int stride, int alpha, int beta, int8_t *tc0 );
  703. void x264_deblock_v8_luma_mmxext( uint8_t *pix, int stride, int alpha, int beta, int8_t *tc0 );
  704. void x264_deblock_h_luma_intra_mmxext( uint8_t *pix, int stride, int alpha, int beta );
  705. void x264_deblock_v8_luma_intra_mmxext( uint8_t *pix, int stride, int alpha, int beta );
  706. static void x264_deblock_v_luma_mmxext( uint8_t *pix, int stride, int alpha, int beta, int8_t *tc0 )
  707. {
  708.     x264_deblock_v8_luma_mmxext( pix,   stride, alpha, beta, tc0   );
  709.     x264_deblock_v8_luma_mmxext( pix+8, stride, alpha, beta, tc0+2 );
  710. }
  711. static void x264_deblock_v_luma_intra_mmxext( uint8_t *pix, int stride, int alpha, int beta )
  712. {
  713.     x264_deblock_v8_luma_intra_mmxext( pix,   stride, alpha, beta );
  714.     x264_deblock_v8_luma_intra_mmxext( pix+8, stride, alpha, beta );
  715. }
  716. #endif
  717. #endif
  718. #ifdef ARCH_PPC
  719. void x264_deblock_v_luma_altivec( uint8_t *pix, int stride, int alpha, int beta, int8_t *tc0 );
  720. void x264_deblock_h_luma_altivec( uint8_t *pix, int stride, int alpha, int beta, int8_t *tc0 );
  721. #endif // ARCH_PPC
  722. void x264_deblock_init( int cpu, x264_deblock_function_t *pf )
  723. {
  724.     pf->deblock_v_luma = deblock_v_luma_c;
  725.     pf->deblock_h_luma = deblock_h_luma_c;
  726.     pf->deblock_v_chroma = deblock_v_chroma_c;
  727.     pf->deblock_h_chroma = deblock_h_chroma_c;
  728.     pf->deblock_v_luma_intra = deblock_v_luma_intra_c;
  729.     pf->deblock_h_luma_intra = deblock_h_luma_intra_c;
  730.     pf->deblock_v_chroma_intra = deblock_v_chroma_intra_c;
  731.     pf->deblock_h_chroma_intra = deblock_h_chroma_intra_c;
  732. #ifdef HAVE_MMX
  733.     if( cpu&X264_CPU_MMXEXT )
  734.     {
  735.         pf->deblock_v_chroma = x264_deblock_v_chroma_mmxext;
  736.         pf->deblock_h_chroma = x264_deblock_h_chroma_mmxext;
  737.         pf->deblock_v_chroma_intra = x264_deblock_v_chroma_intra_mmxext;
  738.         pf->deblock_h_chroma_intra = x264_deblock_h_chroma_intra_mmxext;
  739. #ifdef ARCH_X86
  740.         pf->deblock_v_luma = x264_deblock_v_luma_mmxext;
  741.         pf->deblock_h_luma = x264_deblock_h_luma_mmxext;
  742.         pf->deblock_v_luma_intra = x264_deblock_v_luma_intra_mmxext;
  743.         pf->deblock_h_luma_intra = x264_deblock_h_luma_intra_mmxext;
  744. #endif
  745.         if( (cpu&X264_CPU_SSE2) && !(cpu&X264_CPU_STACK_MOD4) )
  746.         {
  747.             pf->deblock_v_luma = x264_deblock_v_luma_sse2;
  748.             pf->deblock_h_luma = x264_deblock_h_luma_sse2;
  749.             pf->deblock_v_luma_intra = x264_deblock_v_luma_intra_sse2;
  750.             pf->deblock_h_luma_intra = x264_deblock_h_luma_intra_sse2;
  751.         }
  752.     }
  753. #endif
  754. #ifdef ARCH_PPC
  755.     if( cpu&X264_CPU_ALTIVEC )
  756.     {
  757.         pf->deblock_v_luma = x264_deblock_v_luma_altivec;
  758.         pf->deblock_h_luma = x264_deblock_h_luma_altivec;
  759.    }
  760. #endif // ARCH_PPC
  761. }
  762. /* threading */
  763. void x264_frame_cond_broadcast( x264_frame_t *frame, int i_lines_completed )
  764. {
  765.     x264_pthread_mutex_lock( &frame->mutex );
  766.     frame->i_lines_completed = i_lines_completed;
  767.     x264_pthread_cond_broadcast( &frame->cv );
  768.     x264_pthread_mutex_unlock( &frame->mutex );
  769. }
  770. void x264_frame_cond_wait( x264_frame_t *frame, int i_lines_completed )
  771. {
  772.     x264_pthread_mutex_lock( &frame->mutex );
  773.     while( frame->i_lines_completed < i_lines_completed )
  774.         x264_pthread_cond_wait( &frame->cv, &frame->mutex );
  775.     x264_pthread_mutex_unlock( &frame->mutex );
  776. }
  777. /* list operators */
  778. void x264_frame_push( x264_frame_t **list, x264_frame_t *frame )
  779. {
  780.     int i = 0;
  781.     while( list[i] ) i++;
  782.     list[i] = frame;
  783. }
  784. x264_frame_t *x264_frame_pop( x264_frame_t **list )
  785. {
  786.     x264_frame_t *frame;
  787.     int i = 0;
  788.     assert( list[0] );
  789.     while( list[i+1] ) i++;
  790.     frame = list[i];
  791.     list[i] = NULL;
  792.     return frame;
  793. }
  794. void x264_frame_unshift( x264_frame_t **list, x264_frame_t *frame )
  795. {
  796.     int i = 0;
  797.     while( list[i] ) i++;
  798.     while( i-- )
  799.         list[i+1] = list[i];
  800.     list[0] = frame;
  801. }
  802. x264_frame_t *x264_frame_shift( x264_frame_t **list )
  803. {
  804.     x264_frame_t *frame = list[0];
  805.     int i;
  806.     for( i = 0; list[i]; i++ )
  807.         list[i] = list[i+1];
  808.     assert(frame);
  809.     return frame;
  810. }
  811. void x264_frame_push_unused( x264_t *h, x264_frame_t *frame )
  812. {
  813.     assert( frame->i_reference_count > 0 );
  814.     frame->i_reference_count--;
  815.     if( frame->i_reference_count == 0 )
  816.         x264_frame_push( h->frames.unused, frame );
  817.     assert( h->frames.unused[ sizeof(h->frames.unused) / sizeof(*h->frames.unused) - 1 ] == NULL );
  818. }
  819. x264_frame_t *x264_frame_pop_unused( x264_t *h )
  820. {
  821.     x264_frame_t *frame;
  822.     if( h->frames.unused[0] )
  823.         frame = x264_frame_pop( h->frames.unused );
  824.     else
  825.         frame = x264_frame_new( h );
  826.     assert( frame->i_reference_count == 0 );
  827.     frame->i_reference_count = 1;
  828.     return frame;
  829. }
  830. void x264_frame_sort( x264_frame_t **list, int b_dts )
  831. {
  832.     int i, b_ok;
  833.     do {
  834.         b_ok = 1;
  835.         for( i = 0; list[i+1]; i++ )
  836.         {
  837.             int dtype = list[i]->i_type - list[i+1]->i_type;
  838.             int dtime = list[i]->i_frame - list[i+1]->i_frame;
  839.             int swap = b_dts ? dtype > 0 || ( dtype == 0 && dtime > 0 )
  840.                              : dtime > 0;
  841.             if( swap )
  842.             {
  843.                 XCHG( x264_frame_t*, list[i], list[i+1] );
  844.                 b_ok = 0;
  845.             }
  846.         }
  847.     } while( !b_ok );
  848. }