[x264-devel] commit: Make open-GOP Blu-ray compatible (Lamont Alston )
git at videolan.org
git at videolan.org
Thu Jul 15 04:08:51 CEST 2010
x264 | branch: stable | Lamont Alston <wewk584 at gmail.com> | Tue Jun 29 10:11:42 2010 -0700| [22bf1672adafa4e938a13952b8f71cd7548d31f1] | committer: Jason Garrett-Glaser
Make open-GOP Blu-ray compatible
Blu-ray is even more braindamaged than we thought.
Accordingly, open-gop options are now "normal" and "bluray", as opposed to display and coded.
Normal should be used in all cases besides Blu-ray authoring.
> http://git.videolan.org/gitweb.cgi/x264.git/?a=commit;h=22bf1672adafa4e938a13952b8f71cd7548d31f1
---
encoder/encoder.c | 2 +-
encoder/slicetype.c | 28 +++++++---------------------
x264.c | 8 ++++----
x264.h | 8 ++++----
4 files changed, 16 insertions(+), 30 deletions(-)
diff --git a/encoder/encoder.c b/encoder/encoder.c
index fe97aef..5cd3307 100644
--- a/encoder/encoder.c
+++ b/encoder/encoder.c
@@ -577,7 +577,7 @@ static int x264_validate_parameters( x264_t *h )
h->param.analyse.i_direct_mv_pred = X264_DIRECT_PRED_SPATIAL;
}
h->param.i_bframe = x264_clip3( h->param.i_bframe, 0, X264_MIN( X264_BFRAME_MAX, h->param.i_keyint_max-1 ) );
- h->param.i_open_gop = x264_clip3( h->param.i_open_gop, X264_OPEN_GOP_NONE, X264_OPEN_GOP_CODED_ORDER );
+ h->param.i_open_gop = x264_clip3( h->param.i_open_gop, X264_OPEN_GOP_NONE, X264_OPEN_GOP_BLURAY );
if( h->param.i_keyint_max == 1 )
h->param.b_intra_refresh = 0;
h->param.i_bframe_bias = x264_clip3( h->param.i_bframe_bias, -90, 100 );
diff --git a/encoder/slicetype.c b/encoder/slicetype.c
index 2703f02..4ede8cf 100644
--- a/encoder/slicetype.c
+++ b/encoder/slicetype.c
@@ -1233,17 +1233,11 @@ void x264_slicetype_analyse( x264_t *h, int keyframe )
if( !h->param.b_intra_refresh )
for( int i = keyint_limit+1; i <= num_frames; i += h->param.i_keyint_max )
{
- int j = i;
- if( h->param.i_open_gop == X264_OPEN_GOP_CODED_ORDER )
- {
- while( IS_X264_TYPE_B( frames[i]->i_type ) )
- i++;
- while( IS_X264_TYPE_B( frames[j-1]->i_type ) )
- j--;
- }
frames[i]->i_type = X264_TYPE_I;
reset_start = X264_MIN( reset_start, i+1 );
- i = j;
+ if( h->param.i_open_gop == X264_OPEN_GOP_BLURAY )
+ while( IS_X264_TYPE_B( frames[i-1]->i_type ) )
+ i--;
}
if( vbv_lookahead )
@@ -1337,16 +1331,8 @@ void x264_slicetype_decide( x264_t *h )
if( frm->i_type == X264_TYPE_AUTO || frm->i_type == X264_TYPE_I )
frm->i_type = h->param.i_open_gop && h->lookahead->i_last_keyframe >= 0 ? X264_TYPE_I : X264_TYPE_IDR;
int warn = frm->i_type != X264_TYPE_IDR;
- if( warn && h->param.i_open_gop == X264_OPEN_GOP_DISPLAY_ORDER )
- warn &= frm->i_type != X264_TYPE_I && frm->i_type != X264_TYPE_KEYFRAME;
- if( warn && h->param.i_open_gop == X264_OPEN_GOP_CODED_ORDER )
- {
- /* if this minigop ends with i, it's not a violation */
- int j = bframes;
- while( IS_X264_TYPE_B( h->lookahead->next.list[j]->i_type ) )
- j++;
- warn = h->lookahead->next.list[j]->i_type != X264_TYPE_I && h->lookahead->next.list[j]->i_type != X264_TYPE_KEYFRAME;
- }
+ if( warn && h->param.i_open_gop )
+ warn &= frm->i_type != X264_TYPE_I;
if( warn )
x264_log( h, X264_LOG_WARNING, "specified frame type (%d) at %d is not compatible with keyframe interval\n", frm->i_type, frm->i_frame );
}
@@ -1355,8 +1341,8 @@ void x264_slicetype_decide( x264_t *h )
if( h->param.i_open_gop )
{
h->lookahead->i_last_keyframe = frm->i_frame; // Use display order
- if( h->param.i_open_gop == X264_OPEN_GOP_CODED_ORDER )
- h->lookahead->i_last_keyframe -= bframes; // Use coded order
+ if( h->param.i_open_gop == X264_OPEN_GOP_BLURAY )
+ h->lookahead->i_last_keyframe -= bframes; // Use bluray order
frm->b_keyframe = 1;
}
else
diff --git a/x264.c b/x264.c
index df04385..f08ab41 100644
--- a/x264.c
+++ b/x264.c
@@ -382,10 +382,10 @@ static void Help( x264_param_t *defaults, int longhelp )
" - normal: Non-strict (not Blu-ray compatible)\n",
strtable_lookup( x264_b_pyramid_names, defaults->i_bframe_pyramid ) );
H1( " --open-gop <string> Use recovery points to close GOPs [none]\n"
- " - none: Use standard closed GOPs\n"
- " - display: Base GOP length on display order\n"
- " (not Blu-ray compatible)\n"
- " - coded: Base GOP length on coded order\n"
+ " - none: closed GOPs only\n"
+ " - normal: standard open GOPs\n"
+ " (not Blu-ray compatible)\n"
+ " - bluray: Blu-ray-compatible open GOPs\n"
" Only available with b-frames\n" );
H1( " --no-cabac Disable CABAC\n" );
H1( " -r, --ref <integer> Number of reference frames [%d]\n", defaults->i_frame_reference );
diff --git a/x264.h b/x264.h
index e1ae084..86f7426 100644
--- a/x264.h
+++ b/x264.h
@@ -153,8 +153,8 @@ typedef struct
#define X264_B_PYRAMID_NORMAL 2
#define X264_KEYINT_MIN_AUTO 0
#define X264_OPEN_GOP_NONE 0
-#define X264_OPEN_GOP_DISPLAY_ORDER 1
-#define X264_OPEN_GOP_CODED_ORDER 2
+#define X264_OPEN_GOP_NORMAL 1
+#define X264_OPEN_GOP_BLURAY 2
static const char * const x264_direct_pred_names[] = { "none", "spatial", "temporal", "auto", 0 };
static const char * const x264_motion_est_names[] = { "dia", "hex", "umh", "esa", "tesa", 0 };
@@ -166,7 +166,7 @@ static const char * const x264_colorprim_names[] = { "", "bt709", "undef", "", "
static const char * const x264_transfer_names[] = { "", "bt709", "undef", "", "bt470m", "bt470bg", "smpte170m", "smpte240m", "linear", "log100", "log316", 0 };
static const char * const x264_colmatrix_names[] = { "GBR", "bt709", "undef", "", "fcc", "bt470bg", "smpte170m", "smpte240m", "YCgCo", 0 };
static const char * const x264_nal_hrd_names[] = { "none", "vbr", "cbr", 0 };
-static const char * const x264_open_gop_names[] = { "none", "display", "coded", 0 };
+static const char * const x264_open_gop_names[] = { "none", "normal", "bluray", 0 };
/* Colorspace type
* legacy only; nothing other than I420 is really supported. */
@@ -276,7 +276,7 @@ typedef struct x264_param_t
int i_bframe_adaptive;
int i_bframe_bias;
int i_bframe_pyramid; /* Keep some B-frames as references: 0=off, 1=strict hierarchical, 2=normal */
- int i_open_gop; /* Open gop: 1=display order, 2=coded order to determine gop size */
+ int i_open_gop; /* Open gop: 1=display order, 2=bluray compatibility braindamage mode */
int b_deblocking_filter;
int i_deblocking_filter_alphac0; /* [-6, 6] -6 light filter, 6 strong */
More information about the x264-devel
mailing list