diff --git a/ext/vpx/gstvp9enc.c b/ext/vpx/gstvp9enc.c index e64f5af..ab263a6 100644 --- a/ext/vpx/gstvp9enc.c +++ b/ext/vpx/gstvp9enc.c @@ -115,7 +115,8 @@ GST_DEBUG_CATEGORY_STATIC (gst_vp9enc_debug); #define DEFAULT_NOISE_SENSITIVITY 0 #define DEFAULT_SHARPNESS 0 #define DEFAULT_STATIC_THRESHOLD 0 -#define DEFAULT_TOKEN_PARTITIONS 0 +#define DEFAULT_TILE_COLUMNS 0 +#define DEFAULT_TILE_ROWS 0 #define DEFAULT_ARNR_MAXFRAMES 0 #define DEFAULT_ARNR_STRENGTH 3 #define DEFAULT_ARNR_TYPE 3 @@ -164,7 +165,8 @@ enum PROP_NOISE_SENSITIVITY, PROP_SHARPNESS, PROP_STATIC_THRESHOLD, - PROP_TOKEN_PARTITIONS, + PROP_TILE_COLUMNS, + PROP_TILE_ROWS, PROP_ARNR_MAXFRAMES, PROP_ARNR_STRENGTH, PROP_ARNR_TYPE, @@ -288,30 +290,6 @@ gst_vp9_enc_scaling_mode_get_type (void) return id; } -#define GST_VP9_ENC_TOKEN_PARTITIONS_TYPE (gst_vp9_enc_token_partitions_get_type()) -static GType -gst_vp9_enc_token_partitions_get_type (void) -{ - static const GEnumValue values[] = { - {VP8_ONE_TOKENPARTITION, "One token partition", "1"}, - {VP8_TWO_TOKENPARTITION, "Two token partitions", "2"}, - {VP8_FOUR_TOKENPARTITION, "Four token partitions", "4"}, - {VP8_EIGHT_TOKENPARTITION, "Eight token partitions", "8"}, - {0, NULL, NULL} - }; - static volatile GType id = 0; - - if (g_once_init_enter ((gsize *) & id)) { - GType _id; - - _id = g_enum_register_static ("GstVP9EncTokenPartitions", values); - - g_once_init_leave ((gsize *) & id, _id); - } - - return id; -} - #define GST_VP9_ENC_ER_FLAGS_TYPE (gst_vp9_enc_er_flags_get_type()) static GType gst_vp9_enc_er_flags_get_type (void) @@ -638,10 +616,16 @@ gst_vp9_enc_class_init (GstVP9EncClass * klass) 0, G_MAXINT, DEFAULT_STATIC_THRESHOLD, (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); - g_object_class_install_property (gobject_class, PROP_TOKEN_PARTITIONS, - g_param_spec_enum ("token-partitions", "Token partitions", - "Number of token partitions", - GST_VP9_ENC_TOKEN_PARTITIONS_TYPE, DEFAULT_TOKEN_PARTITIONS, + g_object_class_install_property (gobject_class, PROP_TILE_COLUMNS, + g_param_spec_int ("tile-columns", "Tile columns", + "Tile columns (0 = 1 tile column 1 = 2 tile columns 2 = 4 tile columns ... n = 2**n tile columns)", + 0, 4096, DEFAULT_TILE_COLUMNS, + (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + + g_object_class_install_property (gobject_class, PROP_TILE_ROWS, + g_param_spec_int ("tile-rows", "Tile rows", + "Tile rows (0 = 1 tile row 1 = 2 tile rows 2 = 4 tile rows)", + 0, 2, DEFAULT_TILE_ROWS, (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); g_object_class_install_property (gobject_class, PROP_ARNR_MAXFRAMES, @@ -748,7 +732,8 @@ gst_vp9_enc_init (GstVP9Enc * gst_vp9_enc) gst_vp9_enc->noise_sensitivity = DEFAULT_NOISE_SENSITIVITY; gst_vp9_enc->sharpness = DEFAULT_SHARPNESS; gst_vp9_enc->static_threshold = DEFAULT_STATIC_THRESHOLD; - gst_vp9_enc->token_partitions = DEFAULT_TOKEN_PARTITIONS; + gst_vp9_enc->tile_columns = DEFAULT_TILE_COLUMNS; + gst_vp9_enc->tile_rows = DEFAULT_TILE_ROWS; gst_vp9_enc->arnr_maxframes = DEFAULT_ARNR_MAXFRAMES; gst_vp9_enc->arnr_strength = DEFAULT_ARNR_STRENGTH; gst_vp9_enc->arnr_type = DEFAULT_ARNR_TYPE; @@ -1065,15 +1050,28 @@ gst_vp9_enc_set_property (GObject * object, guint prop_id, } } break; - case PROP_TOKEN_PARTITIONS: - gst_vp9_enc->token_partitions = g_value_get_enum (value); + case PROP_TILE_COLUMNS: + gst_vp9_enc->tile_columns = g_value_get_int (value); + if (gst_vp9_enc->inited) { + status = + vpx_codec_control (&gst_vp9_enc->encoder, VP9E_SET_TILE_COLUMNS, + gst_vp9_enc->tile_columns); + if (status != VPX_CODEC_OK) { + GST_WARNING_OBJECT (gst_vp9_enc, + "Failed to set VP9E_SET_TILE_COLUMNS: %s", + gst_vpx_error_name (status)); + } + } + break; + case PROP_TILE_ROWS: + gst_vp9_enc->tile_rows = g_value_get_int (value); if (gst_vp9_enc->inited) { status = - vpx_codec_control (&gst_vp9_enc->encoder, VP8E_SET_TOKEN_PARTITIONS, - gst_vp9_enc->token_partitions); + vpx_codec_control (&gst_vp9_enc->encoder, VP9E_SET_TILE_ROWS, + gst_vp9_enc->tile_rows); if (status != VPX_CODEC_OK) { GST_WARNING_OBJECT (gst_vp9_enc, - "Failed to set VP8E_SET_TOKEN_PARTIONS: %s", + "Failed to set VP9E_SET_TILE_ROWS: %s", gst_vpx_error_name (status)); } } @@ -1345,8 +1343,11 @@ gst_vp9_enc_get_property (GObject * object, guint prop_id, GValue * value, case PROP_STATIC_THRESHOLD: g_value_set_int (value, gst_vp9_enc->static_threshold); break; - case PROP_TOKEN_PARTITIONS: - g_value_set_enum (value, gst_vp9_enc->token_partitions); + case PROP_TILE_COLUMNS: + g_value_set_int (value, gst_vp9_enc->tile_columns); + break; + case PROP_TILE_ROWS: + g_value_set_int (value, gst_vp9_enc->tile_rows); break; case PROP_ARNR_MAXFRAMES: g_value_set_int (value, gst_vp9_enc->arnr_maxframes); @@ -1626,11 +1627,18 @@ gst_vp9_enc_set_format (GstVideoEncoder * video_encoder, "Failed to set VP8E_SET_STATIC_THRESHOLD: %s", gst_vpx_error_name (status)); } - status = vpx_codec_control (&encoder->encoder, VP8E_SET_TOKEN_PARTITIONS, - encoder->token_partitions); + status = vpx_codec_control (&encoder->encoder, VP9E_SET_TILE_COLUMNS, + encoder->tile_columns); + if (status != VPX_CODEC_OK) { + GST_WARNING_OBJECT (encoder, + "Failed to set VP9E_SET_TILE_COLUMNS: %s", + gst_vpx_error_name (status)); + } + status = vpx_codec_control (&encoder->encoder, VP9E_SET_TILE_ROWS, + encoder->tile_rows); if (status != VPX_CODEC_OK) { GST_WARNING_OBJECT (encoder, - "Failed to set VP8E_SET_TOKEN_PARTIONS: %s", + "Failed to set VP9E_SET_TILE_ROWS: %s", gst_vpx_error_name (status)); } status = vpx_codec_control (&encoder->encoder, VP8E_SET_ARNR_MAXFRAMES, diff --git a/ext/vpx/gstvp9enc.h b/ext/vpx/gstvp9enc.h index 7851f1a..a9fe354 100644 --- a/ext/vpx/gstvp9enc.h +++ b/ext/vpx/gstvp9enc.h @@ -86,7 +86,8 @@ struct _GstVP9Enc unsigned int noise_sensitivity; unsigned int sharpness; unsigned int static_threshold; - vp8e_token_partitions token_partitions; + unsigned int tile_columns; + unsigned int tile_rows; unsigned int arnr_maxframes; unsigned int arnr_strength; unsigned int arnr_type;