~ubuntu-branches/ubuntu/wily/x264/wily-proposed

« back to all changes in this revision

Viewing changes to encoder/encoder.c

  • Committer: Package Import Robot
  • Author(s): Reinhard Tartler
  • Date: 2012-01-19 07:28:39 UTC
  • mfrom: (12.1.11 experimental)
  • Revision ID: package-import@ubuntu.com-20120119072839-0vj6g40ky09d9nru
Tags: 2:0.120.2127+gitf33c8cb-2ubuntu1
* Merge from Debian, remaining changes:
  - build against libgpac-dev to enable .mp4 output

Show diffs side-by-side

added added

removed removed

Lines of Context:
61
61
 
62
62
static double x264_ssim( double ssim )
63
63
{
64
 
    return -10.0 * log10( 1 - ssim );
 
64
    double inv_ssim = 1 - ssim;
 
65
    if( inv_ssim <= 0.0000000001 ) /* Max 100dB */
 
66
        return 100;
 
67
 
 
68
    return -10.0 * log10( inv_ssim );
65
69
}
66
70
 
67
71
static void x264_frame_dump( x264_t *h )
79
83
    if( !CHROMA444 )
80
84
    {
81
85
        int cw = h->param.i_width>>1;
82
 
        int ch = h->param.i_height>>h->mb.chroma_v_shift;
 
86
        int ch = h->param.i_height>>CHROMA_V_SHIFT;
83
87
        pixel *planeu = x264_malloc( (cw*ch*2+32)*sizeof(pixel) );
84
88
        pixel *planev = planeu + cw*ch + 16;
85
89
        h->mc.plane_copy_deinterleave( planeu, cw, planev, cw, h->fdec->plane[1], h->fdec->i_stride[1], cw, ch );
418
422
    }
419
423
 
420
424
    int i_csp = h->param.i_csp & X264_CSP_MASK;
 
425
#if X264_CHROMA_FORMAT
 
426
    if( CHROMA_FORMAT != CHROMA_420 && i_csp >= X264_CSP_I420 && i_csp <= X264_CSP_NV12 )
 
427
    {
 
428
        x264_log( h, X264_LOG_ERROR, "not compiled with 4:2:0 support\n" );
 
429
        return -1;
 
430
    }
 
431
    else if( CHROMA_FORMAT != CHROMA_422 && i_csp >= X264_CSP_I422 && i_csp <= X264_CSP_NV16 )
 
432
    {
 
433
        x264_log( h, X264_LOG_ERROR, "not compiled with 4:2:2 support\n" );
 
434
        return -1;
 
435
    }
 
436
    else if( CHROMA_FORMAT != CHROMA_444 && i_csp >= X264_CSP_I444 && i_csp <= X264_CSP_RGB )
 
437
    {
 
438
        x264_log( h, X264_LOG_ERROR, "not compiled with 4:4:4 support\n" );
 
439
        return -1;
 
440
    }
 
441
#endif
421
442
    if( i_csp <= X264_CSP_NONE || i_csp >= X264_CSP_MAX )
422
443
    {
423
444
        x264_log( h, X264_LOG_ERROR, "invalid CSP (only I420/YV12/NV12/I422/YV16/NV16/I444/YV24/BGR/BGRA/RGB supported)\n" );
455
476
 
456
477
    if( h->param.i_threads == X264_THREADS_AUTO )
457
478
        h->param.i_threads = x264_cpu_num_processors() * (h->param.b_sliced_threads?2:3)/2;
458
 
    h->param.i_threads = x264_clip3( h->param.i_threads, 1, X264_THREAD_MAX );
459
479
    if( h->param.i_threads > 1 )
460
480
    {
461
481
#if !HAVE_THREAD
470
490
            h->param.i_threads = X264_MIN( h->param.i_threads, max_threads );
471
491
        }
472
492
    }
473
 
    else
 
493
    h->param.i_threads = x264_clip3( h->param.i_threads, 1, X264_THREAD_MAX );
 
494
    if( h->param.i_threads == 1 )
474
495
        h->param.b_sliced_threads = 0;
475
496
    h->i_thread_frames = h->param.b_sliced_threads ? 1 : h->param.i_threads;
476
497
    if( h->i_thread_frames > 1 )
947
968
    h->pixf.intra_mbcmp_x3_4x4 = satd ? h->pixf.intra_satd_x3_4x4 : h->pixf.intra_sad_x3_4x4;
948
969
    h->pixf.intra_mbcmp_x9_4x4 = h->param.b_cpu_independent || h->mb.b_lossless ? NULL
949
970
                               : satd ? h->pixf.intra_satd_x9_4x4 : h->pixf.intra_sad_x9_4x4;
 
971
    h->pixf.intra_mbcmp_x9_8x8 = h->param.b_cpu_independent || h->mb.b_lossless ? NULL
 
972
                               : satd ? h->pixf.intra_sa8d_x9_8x8 : h->pixf.intra_sad_x9_8x8;
950
973
    satd &= h->param.analyse.i_me_method == X264_ME_TESA;
951
974
    memcpy( h->pixf.fpelcmp, satd ? h->pixf.satd : h->pixf.sad, sizeof(h->pixf.fpelcmp) );
952
975
    memcpy( h->pixf.fpelcmp_x3, satd ? h->pixf.satd_x3 : h->pixf.sad_x3, sizeof(h->pixf.fpelcmp_x3) );
961
984
    {
962
985
        case CHROMA_420:
963
986
            memcpy( h->predict_chroma, h->predict_8x8c, sizeof(h->predict_chroma) );
 
987
            h->mc.prefetch_fenc = h->mc.prefetch_fenc_420;
964
988
            h->loopf.deblock_chroma[0] = h->loopf.deblock_h_chroma_420;
965
989
            h->loopf.deblock_chroma_intra[0] = h->loopf.deblock_h_chroma_420_intra;
966
990
            h->loopf.deblock_chroma_mbaff = h->loopf.deblock_chroma_420_mbaff;
971
995
            break;
972
996
        case CHROMA_422:
973
997
            memcpy( h->predict_chroma, h->predict_8x16c, sizeof(h->predict_chroma) );
 
998
            h->mc.prefetch_fenc = h->mc.prefetch_fenc_422;
974
999
            h->loopf.deblock_chroma[0] = h->loopf.deblock_h_chroma_422;
975
1000
            h->loopf.deblock_chroma_intra[0] = h->loopf.deblock_h_chroma_422_intra;
976
1001
            h->loopf.deblock_chroma_mbaff = h->loopf.deblock_chroma_422_mbaff;
980
1005
            h->quantf.coeff_level_run[DCT_CHROMA_DC] = h->quantf.coeff_level_run8;
981
1006
            break;
982
1007
        case CHROMA_444:
 
1008
            h->mc.prefetch_fenc = h->mc.prefetch_fenc_422; /* FIXME: doesn't cover V plane */
983
1009
            h->loopf.deblock_chroma_mbaff = h->loopf.deblock_luma_mbaff;
984
1010
            h->loopf.deblock_chroma_intra_mbaff = h->loopf.deblock_luma_intra_mbaff;
985
1011
            break;
1832
1858
     * consistency by copying deblocked pixels between planes. */
1833
1859
    if( PARAM_INTERLACED )
1834
1860
        for( int p = 0; p < h->fdec->i_plane; p++ )
1835
 
            for( int i = minpix_y>>(h->mb.chroma_v_shift && p); i < maxpix_y>>(h->mb.chroma_v_shift && p); i++ )
 
1861
            for( int i = minpix_y>>(CHROMA_V_SHIFT && p); i < maxpix_y>>(CHROMA_V_SHIFT && p); i++ )
1836
1862
                memcpy( h->fdec->plane_fld[p] + i*h->fdec->i_stride[p],
1837
1863
                        h->fdec->plane[p]     + i*h->fdec->i_stride[p],
1838
1864
                        h->mb.i_mb_width*16*sizeof(pixel) );
1871
1897
            if( !CHROMA444 )
1872
1898
            {
1873
1899
                uint64_t ssd_u, ssd_v;
1874
 
                int v_shift = h->mb.chroma_v_shift;
 
1900
                int v_shift = CHROMA_V_SHIFT;
1875
1901
                x264_pixel_ssd_nv12( &h->pixf,
1876
1902
                    h->fdec->plane[1] + (minpix_y>>v_shift) * h->fdec->i_stride[1], h->fdec->i_stride[1],
1877
1903
                    h->fenc->plane[1] + (minpix_y>>v_shift) * h->fenc->i_stride[1], h->fenc->i_stride[1],
3086
3112
    if( pic_out->i_pts < pic_out->i_dts )
3087
3113
        x264_log( h, X264_LOG_WARNING, "invalid DTS: PTS is less than DTS\n" );
3088
3114
 
 
3115
    pic_out->opaque = h->fenc->opaque;
 
3116
 
3089
3117
    pic_out->img.i_csp = h->fdec->i_csp;
3090
3118
#if HIGH_BIT_DEPTH
3091
3119
    pic_out->img.i_csp |= X264_CSP_HIGH_DEPTH;