[x264-devel] Improve the --b-adapt 1 algorithm

Anton Mitrofanov git at videolan.org
Tue Apr 12 20:36:18 CEST 2016


x264 | branch: master | Anton Mitrofanov <BugMaster at narod.ru> | Sun Apr 10 20:17:32 2016 +0300| [aa26e880bc2cd04cc81c776051d5e21d03fc975a] | committer: Henrik Gramner

Improve the --b-adapt 1 algorithm

Roughly the same speed as before but with significantly better results,
comparable to --b-adapt 2.

> http://git.videolan.org/gitweb.cgi/x264.git/?a=commit;h=aa26e880bc2cd04cc81c776051d5e21d03fc975a
---

 encoder/slicetype.c |   51 +++++++++------------------------------------------
 1 file changed, 9 insertions(+), 42 deletions(-)

diff --git a/encoder/slicetype.c b/encoder/slicetype.c
index 32540be..41392a5 100644
--- a/encoder/slicetype.c
+++ b/encoder/slicetype.c
@@ -1479,7 +1479,6 @@ void x264_slicetype_analyse( x264_t *h, int intra_minigop )
     x264_mb_analysis_t a;
     x264_frame_t *frames[X264_LOOKAHEAD_MAX+3] = { NULL, };
     int num_frames, orig_num_frames, keyint_limit, framecnt;
-    int i_mb_count = NUM_MBS;
     int i_max_search = X264_MIN( h->lookahead->next.i_size, X264_LOOKAHEAD_MAX );
     int vbv_lookahead = h->param.rc.i_vbv_buffer_size && h->param.rc.i_lookahead;
     /* For determinism we should limit the search to the number of frames lookahead has for sure
@@ -1586,6 +1585,7 @@ void x264_slicetype_analyse( x264_t *h, int intra_minigop )
         {
             int last_nonb = 0;
             int num_bframes = h->param.i_bframe;
+            char path[X264_LOOKAHEAD_MAX+1];
             for( int j = 1; j < num_frames; j++ )
             {
                 if( j-1 > 0 && IS_X264_TYPE_B( frames[j-1]->i_type ) )
@@ -1611,50 +1611,17 @@ void x264_slicetype_analyse( x264_t *h, int intra_minigop )
                     continue;
                 }
 
-                if( j - last_nonb <= 1 )
-                {
-                    int cost2p1 = x264_slicetype_frame_cost( h, &a, frames, last_nonb+0, j+1, j+1, 1 );
-                    if( frames[j+1]->i_intra_mbs[2] > i_mb_count / 2 )
-                    {
-                        frames[j]->i_type = X264_TYPE_P;
-                        continue;
-                    }
-
-#if HAVE_OPENCL
-                    if( h->param.b_opencl )
-                    {
-                        int b_work_done = 0;
-                        b_work_done |= x264_opencl_precalculate_frame_cost(h, frames, a.i_lambda, last_nonb+0, j+1, j+0 );
-                        b_work_done |= x264_opencl_precalculate_frame_cost(h, frames, a.i_lambda, last_nonb+0, j+0, j+0 );
-                        b_work_done |= x264_opencl_precalculate_frame_cost(h, frames, a.i_lambda, last_nonb+1, j+1, j+1 );
-                        if( b_work_done )
-                            x264_opencl_flush( h );
-                    }
-#endif
-
-                    int cost1b1 = x264_slicetype_frame_cost( h, &a, frames, last_nonb+0, j+1, j+0, 0 );
-                    int cost1p0 = x264_slicetype_frame_cost( h, &a, frames, last_nonb+0, j+0, j+0, 0 );
-                    int cost2p0 = x264_slicetype_frame_cost( h, &a, frames, last_nonb+1, j+1, j+1, 0 );
+                int bframes = j - last_nonb - 1;
+                memset( path, 'B', bframes );
+                strcpy( path+bframes, "PP" );
+                int cost_p = x264_slicetype_path_cost( h, &a, frames+last_nonb, path, COST_MAX );
+                strcpy( path+bframes, "BP" );
+                int cost_b = x264_slicetype_path_cost( h, &a, frames+last_nonb, path, cost_p );
 
-                    if( cost1p0 + cost2p0 < cost1b1 + cost2p1 )
-                    {
-                        frames[j]->i_type = X264_TYPE_P;
-                        continue;
-                    }
+                if( cost_b < cost_p )
                     frames[j]->i_type = X264_TYPE_B;
-                    continue;
-                }
-
-                // arbitrary and untuned
-                #define INTER_THRESH 300
-                #define P_SENS_BIAS (50 - h->param.i_bframe_bias)
-
-                int pthresh = X264_MAX(INTER_THRESH - P_SENS_BIAS * (j-last_nonb-1), INTER_THRESH/10);
-                int pcost = x264_slicetype_frame_cost( h, &a, frames, last_nonb, j+1, j+1, 1 );
-                if( pcost > pthresh*i_mb_count || frames[j+1]->i_intra_mbs[j-last_nonb+1] > i_mb_count/3 )
-                    frames[j]->i_type = X264_TYPE_P;
                 else
-                    frames[j]->i_type = X264_TYPE_B;
+                    frames[j]->i_type = X264_TYPE_P;
             }
         }
         else



More information about the x264-devel mailing list