[x264-devel] commit: Add High 10 Intra profile support (AVC-Intra) ( Jason Garrett-Glaser )
git at videolan.org
git at videolan.org
Tue Sep 28 15:38:22 CEST 2010
x264 | branch: master | Jason Garrett-Glaser <darkshikari at gmail.com> | Sun Sep 26 21:04:30 2010 -0700| [b20059aa39ede0b3e3415c261110acd558d12425] | committer: Jason Garrett-Glaser
Add High 10 Intra profile support (AVC-Intra)
x264 should now be able to encode compliant AVC-Intra 50.
With a 10-bit-compiled version of x264, a sample commandline for 1080i25 might be:
--interlaced --keyint 1 --vbv-bufsize 2000 --bitrate 50000 --vbv-maxrate 50000 --nal-hrd cbr
Also print "Constrained Baseline" for baseline profile, since that's all x264 (and everything else in the world) supports.
Also reorganize parameter validation a bit to reduce some spurious warnings.
> http://git.videolan.org/gitweb.cgi/x264.git/?a=commit;h=b20059aa39ede0b3e3415c261110acd558d12425
---
encoder/encoder.c | 14 +++++++++-----
encoder/set.c | 15 ++++++++++-----
2 files changed, 19 insertions(+), 10 deletions(-)
diff --git a/encoder/encoder.c b/encoder/encoder.c
index 6f4cfba..1b17936 100644
--- a/encoder/encoder.c
+++ b/encoder/encoder.c
@@ -439,6 +439,13 @@ static int x264_validate_parameters( x264_t *h )
if( h->i_thread_frames > 1 )
h->param.nalu_process = NULL;
+ h->param.i_keyint_max = x264_clip3( h->param.i_keyint_max, 1, X264_KEYINT_MAX_INFINITE );
+ if( h->param.i_keyint_max == 1 )
+ {
+ h->param.b_intra_refresh = 0;
+ h->param.analyse.i_weighted_pred = 0;
+ }
+
if( h->param.b_interlaced )
{
if( h->param.analyse.i_me_method >= X264_ME_ESA )
@@ -576,7 +583,6 @@ static int x264_validate_parameters( x264_t *h )
h->param.i_frame_reference = x264_clip3( h->param.i_frame_reference, 1, X264_REF_MAX );
h->param.i_dpb_size = x264_clip3( h->param.i_dpb_size, 1, X264_REF_MAX );
- h->param.i_keyint_max = x264_clip3( h->param.i_keyint_max, 1, X264_KEYINT_MAX_INFINITE );
if( h->param.i_scenecut_threshold < 0 )
h->param.i_scenecut_threshold = 0;
if( !h->param.analyse.i_subpel_refine && h->param.analyse.i_direct_mv_pred > X264_DIRECT_PRED_SPATIAL )
@@ -586,8 +592,6 @@ static int x264_validate_parameters( x264_t *h )
}
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_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 );
if( h->param.i_bframe <= 1 )
h->param.i_bframe_pyramid = X264_B_PYRAMID_NONE;
@@ -1155,10 +1159,10 @@ x264_t *x264_encoder_open( x264_param_t *param )
fclose( f );
}
- const char *profile = h->sps->i_profile_idc == PROFILE_BASELINE ? "Baseline" :
+ const char *profile = h->sps->i_profile_idc == PROFILE_BASELINE ? "Constrained Baseline" :
h->sps->i_profile_idc == PROFILE_MAIN ? "Main" :
h->sps->i_profile_idc == PROFILE_HIGH ? "High" :
- h->sps->i_profile_idc == PROFILE_HIGH10 ? "High 10" :
+ h->sps->i_profile_idc == PROFILE_HIGH10 ? (h->sps->b_constraint_set3 == 1 ? "High 10 Intra" : "High 10") :
"High 4:4:4 Predictive";
char level[4];
snprintf( level, sizeof(level), "%d.%d", h->sps->i_level_idc/10, h->sps->i_level_idc%10 );
diff --git a/encoder/set.c b/encoder/set.c
index a003012..0a24bf7 100644
--- a/encoder/set.c
+++ b/encoder/set.c
@@ -121,17 +121,17 @@ void x264_sps_init( x264_sps_t *sps, int i_id, x264_param_t *param )
sps->b_constraint_set1 = sps->i_profile_idc <= PROFILE_MAIN;
/* Never set constraint_set2, it is not necessary and not used in real world. */
sps->b_constraint_set2 = 0;
+ sps->b_constraint_set3 = 0;
+ sps->i_level_idc = param->i_level_idc;
if( param->i_level_idc == 9 && ( sps->i_profile_idc >= PROFILE_BASELINE && sps->i_profile_idc <= PROFILE_EXTENDED ) )
{
sps->b_constraint_set3 = 1; /* level 1b with Baseline, Main or Extended profile is signalled via constraint_set3 */
sps->i_level_idc = 11;
}
- else
- {
- sps->b_constraint_set3 = 0;
- sps->i_level_idc = param->i_level_idc;
- }
+ /* High 10 Intra profile */
+ if( param->i_keyint_max == 1 && sps->i_profile_idc == PROFILE_HIGH10 )
+ sps->b_constraint_set3 = 1;
sps->vui.i_num_reorder_frames = param->i_bframe_pyramid ? 2 : param->i_bframe ? 1 : 0;
/* extra slot with pyramid so that we don't have to override the
@@ -140,6 +140,11 @@ void x264_sps_init( x264_sps_t *sps, int i_id, x264_param_t *param )
sps->i_num_ref_frames = X264_MIN(X264_REF_MAX, X264_MAX4(param->i_frame_reference, 1 + sps->vui.i_num_reorder_frames,
param->i_bframe_pyramid ? 4 : 1, param->i_dpb_size));
sps->i_num_ref_frames -= param->i_bframe_pyramid == X264_B_PYRAMID_STRICT;
+ if( param->i_keyint_max == 1 )
+ {
+ sps->i_num_ref_frames = 0;
+ sps->vui.i_max_dec_frame_buffering = 0;
+ }
/* number of refs + current frame */
int max_frame_num = sps->vui.i_max_dec_frame_buffering * (!!param->i_bframe_pyramid+1) + 1;
More information about the x264-devel
mailing list