for( i = 0; i < 4; i++ )
{
- const int s02 = dct[0][i] + dct[2][i];
- const int d02 = dct[0][i] - dct[2][i];
- const int s13 = dct[1][i] + (dct[3][i]>>1);
- const int d13 = (dct[1][i]>>1) - dct[3][i];
-
- tmp[0][i] = s02 + s13;
- tmp[1][i] = d02 + d13;
- tmp[2][i] = d02 - d13;
- tmp[3][i] = s02 - s13;
+ const int s02 = dct[i][0] + dct[i][2];
+ const int d02 = dct[i][0] - dct[i][2];
+ const int s13 = dct[i][1] + (dct[i][3]>>1);
+ const int d13 = (dct[i][1]>>1) - dct[i][3];
+
+ tmp[i][0] = s02 + s13;
+ tmp[i][1] = d02 + d13;
+ tmp[i][2] = d02 - d13;
+ tmp[i][3] = s02 - s13;
}
for( i = 0; i < 4; i++ )
{
- const int s02 = tmp[i][0] + tmp[i][2];
- const int d02 = tmp[i][0] - tmp[i][2];
- const int s13 = tmp[i][1] + (tmp[i][3]>>1);
- const int d13 = (tmp[i][1]>>1) - tmp[i][3];
-
- d[i][0] = ( s02 + s13 + 32 ) >> 6;
- d[i][1] = ( d02 + d13 + 32 ) >> 6;
- d[i][2] = ( d02 - d13 + 32 ) >> 6;
- d[i][3] = ( s02 - s13 + 32 ) >> 6;
+ const int s02 = tmp[0][i] + tmp[2][i];
+ const int d02 = tmp[0][i] - tmp[2][i];
+ const int s13 = tmp[1][i] + (tmp[3][i]>>1);
+ const int d13 = (tmp[1][i]>>1) - tmp[3][i];
+
+ d[0][i] = ( s02 + s13 + 32 ) >> 6;
+ d[1][i] = ( d02 + d13 + 32 ) >> 6;
+ d[2][i] = ( d02 - d13 + 32 ) >> 6;
+ d[3][i] = ( s02 - s13 + 32 ) >> 6;
}
+
for( y = 0; y < 4; y++ )
{
for( x = 0; x < 4; x++ )
; Load dct coeffs
mov eax, [esp+12] ; dct
movq mm0, [eax+ 0]
- movq mm1, [eax+ 8]
- movq mm2, [eax+16]
- movq mm3, [eax+24]
+ movq mm4, [eax+ 8]
+ movq mm3, [eax+16]
+ movq mm1, [eax+24]
mov eax, [esp+ 4] ; p_dst
mov ecx, [esp+ 8] ; i_dst
lea edx, [ecx+ecx*2]
+ ; out:mm0, mm1, mm2, mm3
+ MMX_TRANSPOSE mm0, mm4, mm3, mm1, mm2
+
MMX_SUMSUB_BA mm2, mm0 ; mm2=s02 mm0=d02
MMX_SUMSUBD2_AB mm1, mm3, mm5, mm4 ; mm1=s13 mm4=d13 ( well 1 + 3>>1 and 1>>1 + 3)
MMX_SUMSUB_BADC mm2, mm3, mm4, mm1 ; mm2=s02+s13 mm3=s02-s13 mm4=d02+d13 mm1=d02-d13
- ; in: mm2, mm4, mm1, mm3 out: mm2, mm3, mm0, mm1
- MMX_TRANSPOSE mm2, mm4, mm1, mm3, mm0
-
MMX_ZERO mm7
movq mm6, [x264_mmx_32]
- MMX_STORE_DIFF_4P mm2, mm4, mm6, mm7, [eax]
- MMX_STORE_DIFF_4P mm3, mm4, mm6, mm7, [eax+ecx]
- MMX_STORE_DIFF_4P mm0, mm4, mm6, mm7, [eax+ecx*2]
- MMX_STORE_DIFF_4P mm1, mm4, mm6, mm7, [eax+edx]
+ MMX_STORE_DIFF_4P mm2, mm0, mm6, mm7, [eax]
+ MMX_STORE_DIFF_4P mm4, mm0, mm6, mm7, [eax+ecx]
+ MMX_STORE_DIFF_4P mm1, mm0, mm6, mm7, [eax+ecx*2]
+ MMX_STORE_DIFF_4P mm3, mm0, mm6, mm7, [eax+edx]
ret
int i;
+ if( IS_SKIP( h->mb.i_type ) )
+ h->mb.qp[i_mb_xy] = h->mb.i_last_qp;
+
h->mb.i_last_dqp = h->mb.qp[i_mb_xy] - h->mb.i_last_qp;
h->mb.i_last_qp = h->mb.qp[i_mb_xy];
x264_mb_analysis_t analysis;
int i;
- /* qp TODO */
+ /* qp TODO implement a nice RC */
h->mb.qp[h->mb.i_mb_xy] = x264_clip3( h->pps->i_pic_init_qp + h->sh.i_qp_delta + 0, 0, 51 );
+ /* FIXME check if it's 12 */
+ if( h->mb.qp[h->mb.i_mb_xy] - h->mb.i_last_qp < -12 )
+ h->mb.qp[h->mb.i_mb_xy] = h->mb.i_last_qp - 12;
+ else if( h->mb.qp[h->mb.i_mb_xy] - h->mb.i_last_qp > 12 )
+ h->mb.qp[h->mb.i_mb_xy] = h->mb.i_last_qp + 12;
+
/* init analysis */
x264_mb_analyse_init( h, &analysis, h->mb.qp[h->mb.i_mb_xy] );
int i_cost;
/* Fast P_SKIP detection */
- if( analysis.i_qp == h->mb.i_last_qp &&
- ( ( (i_neighbour&MB_LEFT) && h->mb.type[h->mb.i_mb_xy - 1] == P_SKIP ) ||
- ( (i_neighbour&MB_TOP) && h->mb.type[h->mb.i_mb_xy - h->mb.i_mb_stride] == P_SKIP ) ||
- ( ((i_neighbour&(MB_TOP|MB_LEFT)) == (MB_TOP|MB_LEFT) ) && h->mb.type[h->mb.i_mb_xy - h->mb.i_mb_stride-1 ] == P_SKIP ) ||
- ( (i_neighbour&MB_TOPRIGHT) && h->mb.type[h->mb.i_mb_xy - h->mb.i_mb_stride+1 ] == P_SKIP ) ) )
+ if( ( (i_neighbour&MB_LEFT) && h->mb.type[h->mb.i_mb_xy - 1] == P_SKIP ) ||
+ ( (i_neighbour&MB_TOP) && h->mb.type[h->mb.i_mb_xy - h->mb.i_mb_stride] == P_SKIP ) ||
+ ( ((i_neighbour&(MB_TOP|MB_LEFT)) == (MB_TOP|MB_LEFT) ) && h->mb.type[h->mb.i_mb_xy - h->mb.i_mb_stride-1 ] == P_SKIP ) ||
+ ( (i_neighbour&MB_TOPRIGHT) && h->mb.type[h->mb.i_mb_xy - h->mb.i_mb_stride+1 ] == P_SKIP ) )
{
b_skip = x264_macroblock_probe_pskip( h );
}
#include "macroblock.h"
//#define DEBUG_MB_TYPE
-//#define DEBUG_DUMP_FRAME 1
+#define DEBUG_DUMP_FRAME 1
static int64_t i_mtime_encode_frame = 0;
/* store cbp */
h->mb.cbp[h->mb.i_mb_xy] = (i_cbp_dc << 8) | (h->mb.i_cbp_chroma << 4) | h->mb.i_cbp_luma;
+ if( h->mb.i_type != I_16x16 && h->mb.i_cbp_luma == 0 && h->mb.i_cbp_chroma == 0 )
+ {
+ /* It won'y change anything at the decoder side but it is needed else the
+ * decoder will fail to read the next QP */
+ h->mb.qp[h->mb.i_mb_xy] = h->mb.i_last_qp;
+ }
+
+
/* Check for P_SKIP
* XXX: in the me perhaps we should take x264_mb_predict_mv_pskip into account
* (if multiple mv give same result)*/
if( h->mb.i_type == P_L0 && h->mb.i_partition == D_16x16 &&
- h->mb.i_cbp_luma == 0x00 && h->mb.i_cbp_chroma== 0x00 &&
- h->mb.qp[h->mb.i_mb_xy] == h->mb.i_last_qp )
+ h->mb.i_cbp_luma == 0x00 && h->mb.i_cbp_chroma== 0x00 )
{
if( h->mb.cache.ref[0][x264_scan8[0]] == 0 )
{
h->mb.cache.mv[0][x264_scan8[0]][1] == mvp[1] )
{
h->mb.type[h->mb.i_mb_xy] = h->mb.i_type = P_SKIP;
+ h->mb.qp[h->mb.i_mb_xy] = h->mb.i_last_qp; /* Needed */
}
}
}