diff options
author | David Schleef <ds@schleef.org> | 2009-12-20 17:34:46 -0800 |
---|---|---|
committer | David Schleef <ds@schleef.org> | 2009-12-20 17:34:46 -0800 |
commit | b3c15a340a71afabf416710706e3a9d03bc1cbbe (patch) | |
tree | 1d6e52815a921edd2d34ac3b84f1649a1ae8285f /ext | |
parent | 848a7f2868cc43f748f48f2f9faebdce29b93d8d (diff) |
theoraenc: Add encoder controls for libtheora 1.1
Added drop-frames, cap-overflow, cap-underflow, and rate-buffer.
Diffstat (limited to 'ext')
-rw-r--r-- | ext/theora/gsttheoraenc.h | 5 | ||||
-rw-r--r-- | ext/theora/theoraenc.c | 113 |
2 files changed, 118 insertions, 0 deletions
diff --git a/ext/theora/gsttheoraenc.h b/ext/theora/gsttheoraenc.h index 2514c5657..3efdab20a 100644 --- a/ext/theora/gsttheoraenc.h +++ b/ext/theora/gsttheoraenc.h @@ -98,6 +98,11 @@ struct _GstTheoraEnc guint64 timestamp_offset; gint speed_level; + gboolean vp3_compatible; + gboolean drop_frames; + gboolean cap_overflow; + gboolean cap_underflow; + int rate_buffer; }; struct _GstTheoraEncClass diff --git a/ext/theora/theoraenc.c b/ext/theora/theoraenc.c index e735558f7..121d3820d 100644 --- a/ext/theora/theoraenc.c +++ b/ext/theora/theoraenc.c @@ -104,6 +104,11 @@ _ilog (unsigned int v) #define THEORA_DEF_KEYFRAME_FREQ 64 #define THEORA_DEF_KEYFRAME_FREQ_FORCE 64 #define THEORA_DEF_SPEEDLEVEL 1 +#define THEORA_DEF_VP3_COMPATIBLE FALSE +#define THEORA_DEF_DROP_FRAMES TRUE +#define THEORA_DEF_CAP_OVERFLOW TRUE +#define THEORA_DEF_CAP_UNDERFLOW FALSE +#define THEORA_DEF_RATE_BUFFER 0 enum { ARG_0, @@ -120,6 +125,11 @@ enum ARG_NOISE_SENSITIVITY, ARG_SHARPNESS, ARG_SPEEDLEVEL, + ARG_VP3_COMPATIBLE, + ARG_DROP_FRAMES, + ARG_CAP_OVERFLOW, + ARG_CAP_UNDERFLOW, + ARG_RATE_BUFFER, /* FILL ME */ }; @@ -273,6 +283,38 @@ gst_theora_enc_class_init (GstTheoraEncClass * klass) "encoding. This property requires libtheora version >= 1.0", 0, 2, THEORA_DEF_SPEEDLEVEL, (GParamFlags) G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, ARG_VP3_COMPATIBLE, + g_param_spec_boolean ("vp3-compatible", "VP3 Compatible", + "Disables non-VP3 compatible features." + " This property requires libtheora version >= 1.1", + THEORA_DEF_VP3_COMPATIBLE, + (GParamFlags) G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, ARG_DROP_FRAMES, + g_param_spec_boolean ("drop-frames", "VP3 Compatible", + "Allow or disallow frame dropping." + " This property requires libtheora version >= 1.1", + THEORA_DEF_DROP_FRAMES, + (GParamFlags) G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, ARG_CAP_OVERFLOW, + g_param_spec_boolean ("cap-overflow", "VP3 Compatible", + "Enable capping of bit reservoir overflows." + " This property requires libtheora version >= 1.1", + THEORA_DEF_CAP_OVERFLOW, + (GParamFlags) G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, ARG_CAP_UNDERFLOW, + g_param_spec_boolean ("cap-underflow", "VP3 Compatible", + "Enable capping of bit reservoir underflows." + " This property requires libtheora version >= 1.1", + THEORA_DEF_CAP_UNDERFLOW, + (GParamFlags) G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, ARG_RATE_BUFFER, + g_param_spec_int ("rate-buffer", "Rate Control Buffer", + "Sets the size of the rate control buffer, in units of frames. " + "The default value of 0 instructs the encoder to automatically " + "select an appropriate value." + " This property requires libtheora version >= 1.1", + 0, 1000, THEORA_DEF_RATE_BUFFER, + (GParamFlags) G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); gstelement_class->change_state = theora_enc_change_state; GST_DEBUG_CATEGORY_INIT (theoraenc_debug, "theoraenc", 0, "Theora encoder"); @@ -305,6 +347,11 @@ gst_theora_enc_init (GstTheoraEnc * enc, GstTheoraEncClass * g_class) enc->expected_ts = GST_CLOCK_TIME_NONE; enc->speed_level = THEORA_DEF_SPEEDLEVEL; + enc->vp3_compatible = THEORA_DEF_VP3_COMPATIBLE; + enc->drop_frames = THEORA_DEF_DROP_FRAMES; + enc->cap_overflow = THEORA_DEF_CAP_OVERFLOW; + enc->cap_underflow = THEORA_DEF_CAP_UNDERFLOW; + enc->rate_buffer = THEORA_DEF_RATE_BUFFER; } static void @@ -325,6 +372,7 @@ static void theora_enc_reset (GstTheoraEnc * enc) { ogg_uint32_t keyframe_force; + int rate_flags; if (enc->encoder) th_encode_free (enc->encoder); @@ -335,6 +383,31 @@ theora_enc_reset (GstTheoraEnc * enc) th_encode_ctl (enc->encoder, TH_ENCCTL_SET_SPLEVEL, &enc->speed_level, sizeof (enc->speed_level)); #endif +#ifdef TH_ENCCTL_SET_VP3_COMPATIBLE + th_encode_ctl (enc->encoder, TH_ENCCTL_SET_VP3_COMPATIBLE, + &enc->vp3_compatible, sizeof (enc->vp3_compatible)); +#endif + + rate_flags = 0; +#ifdef TH_ENCCTL_SET_RATE_FLAGS + if (enc->drop_frames) + rate_flags |= TH_RATECTL_DROP_FRAMES; + if (enc->drop_frames) + rate_flags |= TH_RATECTL_CAP_OVERFLOW; + if (enc->drop_frames) + rate_flags |= TH_RATECTL_CAP_UNDERFLOW; + th_encode_ctl (enc->encoder, TH_ENCCTL_SET_RATE_FLAGS, + &rate_flags, sizeof (rate_flags)); +#endif + +#ifdef TH_ENCCTL_SET_RATE_BUFFER + if (enc->rate_buffer) { + th_encode_ctl (enc->encoder, TH_ENCCTL_SET_RATE_BUFFER, + &enc->rate_buffer, sizeof (enc->rate_buffer)); + } else { + /* FIXME */ + } +#endif keyframe_force = enc->keyframe_auto ? enc->keyframe_force : enc->keyframe_freq; @@ -1084,6 +1157,31 @@ theora_enc_set_property (GObject * object, guint prop_id, enc->speed_level = g_value_get_int (value); #endif break; + case ARG_VP3_COMPATIBLE: +#ifdef TH_ENCCTL_SET_VP3_COMPATIBLE + enc->vp3_compatible = g_value_get_boolean (value); +#endif + break; + case ARG_DROP_FRAMES: +#ifdef TH_ENCCTL_SET_RATE_FLAGS + enc->drop_frames = g_value_get_boolean (value); +#endif + break; + case ARG_CAP_OVERFLOW: +#ifdef TH_ENCCTL_SET_RATE_FLAGS + enc->cap_overflow = g_value_get_boolean (value); +#endif + break; + case ARG_CAP_UNDERFLOW: +#ifdef TH_ENCCTL_SET_RATE_FLAGS + enc->cap_underflow = g_value_get_boolean (value); +#endif + break; + case ARG_RATE_BUFFER: +#ifdef TH_ENCCTL_SET_RATE_BUFFER + enc->rate_buffer = g_value_get_int (value); +#endif + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -1136,6 +1234,21 @@ theora_enc_get_property (GObject * object, guint prop_id, case ARG_SPEEDLEVEL: g_value_set_int (value, enc->speed_level); break; + case ARG_VP3_COMPATIBLE: + g_value_set_boolean (value, enc->vp3_compatible); + break; + case ARG_DROP_FRAMES: + g_value_set_boolean (value, enc->drop_frames); + break; + case ARG_CAP_OVERFLOW: + g_value_set_boolean (value, enc->cap_overflow); + break; + case ARG_CAP_UNDERFLOW: + g_value_set_boolean (value, enc->cap_underflow); + break; + case ARG_RATE_BUFFER: + g_value_set_int (value, enc->rate_buffer); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; |