summaryrefslogtreecommitdiff
path: root/ext/celt
diff options
context:
space:
mode:
authorSebastian Dröge <sebastian.droege@collabora.co.uk>2010-07-05 10:08:30 +0200
committerSebastian Dröge <sebastian.droege@collabora.co.uk>2010-07-05 10:08:30 +0200
commit042419baa153afc669a703bc73ab94ddf997eebf (patch)
treeb4dda05beae4ef0c4d35a6a1500f8cca98953936 /ext/celt
parent2d80fd6c22287231181b36d324a7e5c6d77ef814 (diff)
downloadgstreamer-plugins-bad-042419baa153afc669a703bc73ab94ddf997eebf.tar.gz
celtenc: Add support for setting the prediction mode and the start band
Diffstat (limited to 'ext/celt')
-rw-r--r--ext/celt/gstceltenc.c60
-rw-r--r--ext/celt/gstceltenc.h2
2 files changed, 59 insertions, 3 deletions
diff --git a/ext/celt/gstceltenc.c b/ext/celt/gstceltenc.c
index b041a0bf5..be1dd38e7 100644
--- a/ext/celt/gstceltenc.c
+++ b/ext/celt/gstceltenc.c
@@ -54,6 +54,29 @@
GST_DEBUG_CATEGORY_STATIC (celtenc_debug);
#define GST_CAT_DEFAULT celtenc_debug
+#define GST_CELT_ENC_TYPE_PREDICTION (gst_celt_enc_prediction_get_type())
+static GType
+gst_celt_enc_prediction_get_type (void)
+{
+ static const GEnumValue values[] = {
+ {0, "Independent frames", "idependent"},
+ {1, "Short term interframe prediction", "short-term"},
+ {2, "Long term interframe prediction", "long-term"},
+ {0, NULL, NULL}
+ };
+ static volatile GType id = 0;
+
+ if (g_once_init_enter ((gsize *) & id)) {
+ GType _id;
+
+ _id = g_enum_register_static ("GstCeltEncPrediction", values);
+
+ g_once_init_leave ((gsize *) & id, _id);
+ }
+
+ return id;
+}
+
static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink",
GST_PAD_SINK,
GST_PAD_ALWAYS,
@@ -77,6 +100,8 @@ static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src",
#define DEFAULT_CBR TRUE
#define DEFAULT_COMPLEXITY 9
#define DEFAULT_MAX_BITRATE 64
+#define DEFAULT_PREDICTION 0
+#define DEFAULT_START_BAND 0
enum
{
@@ -85,7 +110,9 @@ enum
PROP_FRAMESIZE,
PROP_CBR,
PROP_COMPLEXITY,
- PROP_MAX_BITRATE
+ PROP_MAX_BITRATE,
+ PROP_PREDICTION,
+ PROP_START_BAND
};
static void gst_celt_enc_finalize (GObject * object);
@@ -173,6 +200,16 @@ gst_celt_enc_class_init (GstCeltEncClass * klass)
"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));
+ g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_PREDICTION,
+ g_param_spec_enum ("prediction", "Interframe Prediction",
+ "Controls the use of interframe prediction.",
+ GST_CELT_ENC_TYPE_PREDICTION, DEFAULT_PREDICTION,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_START_BAND,
+ g_param_spec_int ("start-band", "Start Band",
+ "Controls the start band that should be used",
+ 0, G_MAXINT, DEFAULT_START_BAND,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
gobject_class->finalize = GST_DEBUG_FUNCPTR (gst_celt_enc_finalize);
@@ -542,6 +579,7 @@ gst_celt_enc_init (GstCeltEnc * enc, GstCeltEncClass * klass)
enc->cbr = DEFAULT_CBR;
enc->complexity = DEFAULT_COMPLEXITY;
enc->max_bitrate = DEFAULT_MAX_BITRATE;
+ enc->prediction = DEFAULT_PREDICTION;
enc->setup = FALSE;
enc->header_sent = FALSE;
@@ -624,6 +662,12 @@ gst_celt_enc_setup (GstCeltEnc * enc)
#ifdef CELT_SET_COMPLEXITY
celt_encoder_ctl (enc->state, CELT_SET_COMPLEXITY (enc->complexity), 0);
#endif
+#ifdef CELT_SET_PREDICTION
+ celt_encoder_ctl (enc->state, CELT_SET_PREDICTION (enc->prediction), 0);
+#endif
+#ifdef CELT_SET_START_BAND
+ celt_encoder_ctl (enc->state, CELT_SET_START_BAND (enc->start_band), 0);
+#endif
GST_LOG_OBJECT (enc, "we have frame size %d", enc->frame_size);
@@ -1011,9 +1055,7 @@ gst_celt_enc_get_property (GObject * object, guint prop_id, GValue * value,
g_value_set_int (value, enc->frame_size);
break;
case PROP_CBR:
-#ifdef CELT_SET_VBR_RATE
g_value_set_boolean (value, enc->cbr);
-#endif
break;
case PROP_COMPLEXITY:
g_value_set_int (value, enc->complexity);
@@ -1021,6 +1063,12 @@ gst_celt_enc_get_property (GObject * object, guint prop_id, GValue * value,
case PROP_MAX_BITRATE:
g_value_set_int (value, enc->max_bitrate);
break;
+ case PROP_PREDICTION:
+ g_value_set_enum (value, enc->prediction);
+ break;
+ case PROP_START_BAND:
+ g_value_set_int (value, enc->start_band);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -1051,6 +1099,12 @@ gst_celt_enc_set_property (GObject * object, guint prop_id,
case PROP_MAX_BITRATE:
enc->max_bitrate = g_value_get_int (value);
break;
+ case PROP_PREDICTION:
+ enc->prediction = g_value_get_enum (value);
+ break;
+ case PROP_START_BAND:
+ enc->start_band = g_value_get_int (value);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
diff --git a/ext/celt/gstceltenc.h b/ext/celt/gstceltenc.h
index a6939b102..ec8a283c0 100644
--- a/ext/celt/gstceltenc.h
+++ b/ext/celt/gstceltenc.h
@@ -65,6 +65,8 @@ struct _GstCeltEnc {
gboolean cbr;
gint complexity;
gint max_bitrate;
+ gint prediction;
+ gint start_band;
gint channels;
gint rate;