1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146
|
From 02357506cf4baad4b10a197249ff30349bae8f96 Mon Sep 17 00:00:00 2001
From: Sanchayan Maity <sanchayan@asymptotic.io>
Date: Wed, 27 Jan 2021 23:36:19 +0530
Subject: [PATCH 6/7] fdkaacenc: Add support for setting bitrate mode
---
.../gst-plugins-bad/ext/fdkaac/gstfdkaacenc.c | 44 ++++++++++++++++++-
.../gst-plugins-bad/ext/fdkaac/gstfdkaacenc.h | 11 +++++
2 files changed, 54 insertions(+), 1 deletion(-)
diff --git a/ext/fdkaac/gstfdkaacenc.c b/ext/fdkaac/gstfdkaacenc.c
index 7c8372e3b5..de9c18612f 100644
--- a/ext/fdkaac/gstfdkaacenc.c
+++ b/ext/fdkaac/gstfdkaacenc.c
@@ -31,7 +31,6 @@
/* TODO:
* - Add support for other AOT / profiles
- * - Expose more properties, e.g. vbr
* - Signal encoder delay
*/
@@ -40,6 +39,7 @@ enum
PROP_0,
PROP_AFTERBURNER,
PROP_BITRATE,
+ PROP_BITRATEMODE,
PROP_HEADER_PERIOD
};
@@ -100,6 +100,28 @@ G_DEFINE_TYPE (GstFdkAacEnc, gst_fdkaacenc, GST_TYPE_AUDIO_ENCODER);
GST_ELEMENT_REGISTER_DEFINE (fdkaacenc, "fdkaacenc", GST_RANK_PRIMARY,
GST_TYPE_FDKAACENC);
+#define GST_AAC_BITRATEMODE (gst_aac_bitratemode_get_type ())
+static GType
+gst_aac_bitratemode_get_type (void)
+{
+ static GType aac_bitrate_mode_type = 0;
+ static const GEnumValue bitrate_mode_types[] = {
+ {GST_AAC_BITRATEMODE_CONSTANT, "Constant bitrate", "constant"},
+ {GST_AAC_BITRATEMODE_VERY_LOW, "Variable bitrate", "very low"},
+ {GST_AAC_BITRATEMODE_LOW, "Variable bitrate", "low"},
+ {GST_AAC_BITRATEMODE_MEDIUM, "Variable bitrate", "medium"},
+ {GST_AAC_BITRATEMODE_HIGH, "Variable bitrate", "high"},
+ {GST_AAC_BITRATEMODE_VERY_HIGH, "Variable bitrate", "very high"},
+ {0, NULL, NULL}
+ };
+
+ if (!aac_bitrate_mode_type)
+ aac_bitrate_mode_type =
+ g_enum_register_static ("GstAacBitrateMode", bitrate_mode_types);
+
+ return aac_bitrate_mode_type;
+}
+
static void
gst_fdkaacenc_set_property (GObject * object, guint prop_id,
const GValue * value, GParamSpec * pspec)
@@ -110,6 +132,9 @@ gst_fdkaacenc_set_property (GObject * object, guint prop_id,
case PROP_BITRATE:
self->bitrate = g_value_get_int (value);
break;
+ case PROP_BITRATEMODE:
+ self->bitrate_mode = g_value_get_enum (value);
+ break;
case PROP_HEADER_PERIOD:
self->header_period = g_value_get_uint (value);
break;
@@ -133,6 +158,9 @@ gst_fdkaacenc_get_property (GObject * object, guint prop_id,
case PROP_BITRATE:
g_value_set_int (value, self->bitrate);
break;
+ case PROP_BITRATEMODE:
+ g_value_set_enum (value, self->bitrate_mode);
+ break;
case PROP_HEADER_PERIOD:
g_value_set_uint (value, self->header_period);
break;
@@ -404,6 +432,13 @@ gst_fdkaacenc_set_format (GstAudioEncoder * enc, GstAudioInfo * info)
return FALSE;
}
+ if ((err = aacEncoder_SetParam (self->enc, AACENC_BITRATEMODE,
+ self->bitrate_mode)) != AACENC_OK) {
+ GST_ERROR_OBJECT (self, "Unable to set bitrate mode %d: %d",
+ self->bitrate_mode, err);
+ return FALSE;
+ }
+
if ((err =
aacEncoder_SetParam (self->enc, AACENC_HEADER_PERIOD,
self->header_period)) != AACENC_OK) {
@@ -643,6 +678,7 @@ static void
gst_fdkaacenc_init (GstFdkAacEnc * self)
{
self->bitrate = DEFAULT_BITRATE;
+ self->bitrate_mode = GST_AAC_BITRATEMODE_CONSTANT;
self->enc = NULL;
self->is_drained = TRUE;
/*
@@ -680,6 +716,12 @@ gst_fdkaacenc_class_init (GstFdkAacEncClass * klass)
0, G_MAXINT, DEFAULT_BITRATE,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (object_class, PROP_BITRATEMODE,
+ g_param_spec_enum ("bitrate-mode", "Bitrate Mode",
+ "AAC Bitrate configurations",
+ GST_AAC_BITRATEMODE, GST_AAC_BITRATEMODE_CONSTANT,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
g_object_class_install_property (object_class, PROP_HEADER_PERIOD,
g_param_spec_uint ("header-period", "Frame count period",
"Frame count period for sending in-band configuration buffers",
diff --git a/ext/fdkaac/gstfdkaacenc.h b/ext/fdkaac/gstfdkaacenc.h
index 1da85b8891..6b24cf7bb4 100644
--- a/ext/fdkaac/gstfdkaacenc.h
+++ b/ext/fdkaac/gstfdkaacenc.h
@@ -41,6 +41,16 @@ G_BEGIN_DECLS
typedef struct _GstFdkAacEnc GstFdkAacEnc;
typedef struct _GstFdkAacEncClass GstFdkAacEncClass;
+typedef enum
+{
+ GST_AAC_BITRATEMODE_CONSTANT = 0,
+ GST_AAC_BITRATEMODE_VERY_LOW,
+ GST_AAC_BITRATEMODE_LOW,
+ GST_AAC_BITRATEMODE_MEDIUM,
+ GST_AAC_BITRATEMODE_HIGH,
+ GST_AAC_BITRATEMODE_VERY_HIGH
+} GstAacBitrateMode;
+
struct _GstFdkAacEnc {
GstAudioEncoder element;
@@ -52,6 +62,7 @@ struct _GstFdkAacEnc {
const GstAudioChannelPosition *aac_positions;
gboolean is_drained;
+ GstAacBitrateMode bitrate_mode;
guint header_period;
gboolean afterburner;
};
--
2.34.1
|