mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-07-25 07:48:19 +00:00
celtenc: Add complexity, cbr, and max-bitrate properties
This commit is contained in:
parent
e4a2eb1d6f
commit
de0ceb1178
|
@ -79,12 +79,18 @@ GST_ELEMENT_DETAILS ("Celt audio encoder",
|
||||||
|
|
||||||
#define DEFAULT_BITRATE 64
|
#define DEFAULT_BITRATE 64
|
||||||
#define DEFAULT_FRAMESIZE 256
|
#define DEFAULT_FRAMESIZE 256
|
||||||
|
#define DEFAULT_CBR TRUE
|
||||||
|
#define DEFAULT_COMPLEXITY 9
|
||||||
|
#define DEFAULT_MAX_BITRATE 64
|
||||||
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
PROP_0,
|
PROP_0,
|
||||||
PROP_BITRATE,
|
PROP_BITRATE,
|
||||||
PROP_FRAMESIZE
|
PROP_FRAMESIZE,
|
||||||
|
PROP_CBR,
|
||||||
|
PROP_COMPLEXITY,
|
||||||
|
PROP_MAX_BITRATE
|
||||||
};
|
};
|
||||||
|
|
||||||
static void gst_celt_enc_finalize (GObject * object);
|
static void gst_celt_enc_finalize (GObject * object);
|
||||||
|
@ -152,13 +158,26 @@ gst_celt_enc_class_init (GstCeltEncClass * klass)
|
||||||
|
|
||||||
g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_BITRATE,
|
g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_BITRATE,
|
||||||
g_param_spec_int ("bitrate", "Encoding Bit-rate",
|
g_param_spec_int ("bitrate", "Encoding Bit-rate",
|
||||||
"Specify an encoding bit-rate (in Kbps). (0 = automatic)",
|
"Specify an encoding bit-rate (in Kbps).",
|
||||||
10, 320, DEFAULT_BITRATE,
|
10, 320, DEFAULT_BITRATE,
|
||||||
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
||||||
g_object_class_install_property (gobject_class, PROP_FRAMESIZE,
|
g_object_class_install_property (gobject_class, PROP_FRAMESIZE,
|
||||||
g_param_spec_int ("framesize", "Frame Size",
|
g_param_spec_int ("framesize", "Frame Size",
|
||||||
"The number of samples per frame", 64, 512, DEFAULT_FRAMESIZE,
|
"The number of samples per frame", 64, 512, DEFAULT_FRAMESIZE,
|
||||||
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
||||||
|
g_object_class_install_property (gobject_class, PROP_CBR,
|
||||||
|
g_param_spec_boolean ("cbr", "Constant bit rate",
|
||||||
|
"Constant bit rate", DEFAULT_CBR,
|
||||||
|
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
||||||
|
g_object_class_install_property (gobject_class, PROP_COMPLEXITY,
|
||||||
|
g_param_spec_int ("complexity", "Complexity",
|
||||||
|
"Complexity", 0, 10, DEFAULT_COMPLEXITY,
|
||||||
|
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
||||||
|
g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_MAX_BITRATE,
|
||||||
|
g_param_spec_int ("max-bitrate", "Maximum Encoding Bit-rate",
|
||||||
|
"Specify a maximum encoding bit rate (in Kbps) for variable bit rate encoding.",
|
||||||
|
10, 320, DEFAULT_MAX_BITRATE,
|
||||||
|
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
||||||
|
|
||||||
gobject_class->finalize = GST_DEBUG_FUNCPTR (gst_celt_enc_finalize);
|
gobject_class->finalize = GST_DEBUG_FUNCPTR (gst_celt_enc_finalize);
|
||||||
|
|
||||||
|
@ -511,6 +530,9 @@ gst_celt_enc_init (GstCeltEnc * enc, GstCeltEncClass * klass)
|
||||||
|
|
||||||
enc->bitrate = DEFAULT_BITRATE;
|
enc->bitrate = DEFAULT_BITRATE;
|
||||||
enc->frame_size = DEFAULT_FRAMESIZE;
|
enc->frame_size = DEFAULT_FRAMESIZE;
|
||||||
|
enc->cbr = DEFAULT_CBR;
|
||||||
|
enc->complexity = DEFAULT_COMPLEXITY;
|
||||||
|
enc->max_bitrate = DEFAULT_MAX_BITRATE;
|
||||||
|
|
||||||
enc->setup = FALSE;
|
enc->setup = FALSE;
|
||||||
enc->header_sent = FALSE;
|
enc->header_sent = FALSE;
|
||||||
|
@ -551,7 +573,6 @@ static gboolean
|
||||||
gst_celt_enc_setup (GstCeltEnc * enc)
|
gst_celt_enc_setup (GstCeltEnc * enc)
|
||||||
{
|
{
|
||||||
gint error = CELT_OK;
|
gint error = CELT_OK;
|
||||||
gint bytes_per_packet;
|
|
||||||
|
|
||||||
enc->setup = FALSE;
|
enc->setup = FALSE;
|
||||||
|
|
||||||
|
@ -562,9 +583,6 @@ gst_celt_enc_setup (GstCeltEnc * enc)
|
||||||
|
|
||||||
celt_mode_info (enc->mode, CELT_GET_FRAME_SIZE, &enc->frame_size);
|
celt_mode_info (enc->mode, CELT_GET_FRAME_SIZE, &enc->frame_size);
|
||||||
|
|
||||||
bytes_per_packet =
|
|
||||||
(enc->bitrate * 1000 * enc->frame_size / enc->rate + 4) / 8;
|
|
||||||
|
|
||||||
celt_header_init (&enc->header, enc->mode);
|
celt_header_init (&enc->header, enc->mode);
|
||||||
enc->header.nb_channels = enc->channels;
|
enc->header.nb_channels = enc->channels;
|
||||||
|
|
||||||
|
@ -572,6 +590,12 @@ gst_celt_enc_setup (GstCeltEnc * enc)
|
||||||
if (!enc->state)
|
if (!enc->state)
|
||||||
goto encoder_creation_failed;
|
goto encoder_creation_failed;
|
||||||
|
|
||||||
|
if (!enc->cbr) {
|
||||||
|
GST_ERROR ("setting vbr");
|
||||||
|
celt_encoder_ctl (enc->state, CELT_SET_VBR_RATE (enc->bitrate), 0);
|
||||||
|
}
|
||||||
|
celt_encoder_ctl (enc->state, CELT_SET_COMPLEXITY (enc->complexity), 0);
|
||||||
|
|
||||||
GST_LOG_OBJECT (enc, "we have frame size %d", enc->frame_size);
|
GST_LOG_OBJECT (enc, "we have frame size %d", enc->frame_size);
|
||||||
|
|
||||||
enc->setup = TRUE;
|
enc->setup = TRUE;
|
||||||
|
@ -700,8 +724,15 @@ gst_celt_enc_encode (GstCeltEnc * enc, gboolean flush)
|
||||||
GstFlowReturn ret = GST_FLOW_OK;
|
GstFlowReturn ret = GST_FLOW_OK;
|
||||||
gint frame_size = enc->frame_size;
|
gint frame_size = enc->frame_size;
|
||||||
gint bytes = frame_size * 2 * enc->channels;
|
gint bytes = frame_size * 2 * enc->channels;
|
||||||
gint bytes_per_packet =
|
gint bytes_per_packet;
|
||||||
(enc->bitrate * 1000 * enc->frame_size / enc->rate + 4) / 8;
|
|
||||||
|
if (enc->cbr) {
|
||||||
|
bytes_per_packet =
|
||||||
|
(enc->bitrate * 1000 * enc->frame_size / enc->rate + 4) / 8;
|
||||||
|
} else {
|
||||||
|
bytes_per_packet =
|
||||||
|
(enc->max_bitrate * 1000 * enc->frame_size / enc->rate + 4) / 8;
|
||||||
|
}
|
||||||
|
|
||||||
if (flush && gst_adapter_available (enc->adapter) % bytes != 0) {
|
if (flush && gst_adapter_available (enc->adapter) % bytes != 0) {
|
||||||
guint diff = gst_adapter_available (enc->adapter) % bytes;
|
guint diff = gst_adapter_available (enc->adapter) % bytes;
|
||||||
|
@ -943,6 +974,15 @@ gst_celt_enc_get_property (GObject * object, guint prop_id, GValue * value,
|
||||||
case PROP_FRAMESIZE:
|
case PROP_FRAMESIZE:
|
||||||
g_value_set_int (value, enc->frame_size);
|
g_value_set_int (value, enc->frame_size);
|
||||||
break;
|
break;
|
||||||
|
case PROP_CBR:
|
||||||
|
g_value_set_boolean (value, enc->cbr);
|
||||||
|
break;
|
||||||
|
case PROP_COMPLEXITY:
|
||||||
|
g_value_set_int (value, enc->complexity);
|
||||||
|
break;
|
||||||
|
case PROP_MAX_BITRATE:
|
||||||
|
g_value_set_int (value, enc->max_bitrate);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
break;
|
break;
|
||||||
|
@ -964,6 +1004,15 @@ gst_celt_enc_set_property (GObject * object, guint prop_id,
|
||||||
case PROP_FRAMESIZE:
|
case PROP_FRAMESIZE:
|
||||||
enc->frame_size = g_value_get_int (value);
|
enc->frame_size = g_value_get_int (value);
|
||||||
break;
|
break;
|
||||||
|
case PROP_CBR:
|
||||||
|
enc->cbr = g_value_get_boolean (value);
|
||||||
|
break;
|
||||||
|
case PROP_COMPLEXITY:
|
||||||
|
enc->complexity = g_value_get_int (value);
|
||||||
|
break;
|
||||||
|
case PROP_MAX_BITRATE:
|
||||||
|
enc->max_bitrate = g_value_get_int (value);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -62,6 +62,9 @@ struct _GstCeltEnc {
|
||||||
|
|
||||||
gint bitrate;
|
gint bitrate;
|
||||||
gint frame_size;
|
gint frame_size;
|
||||||
|
gboolean cbr;
|
||||||
|
gint complexity;
|
||||||
|
gint max_bitrate;
|
||||||
|
|
||||||
gint channels;
|
gint channels;
|
||||||
gint rate;
|
gint rate;
|
||||||
|
|
Loading…
Reference in a new issue