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
|
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(-)
Index: gst-plugins-bad1.0-contrib/ext/fdkaac/gstfdkaacenc.c
===================================================================
--- gst-plugins-bad1.0-contrib.orig/ext/fdkaac/gstfdkaacenc.c
+++ gst-plugins-bad1.0-contrib/ext/fdkaac/gstfdkaacenc.c
@@ -31,6 +31,7 @@
/* TODO:
* - Add support for other AOT / profiles
+ * - Expose more properties, e.g. vbr
* - Signal encoder delay
*/
@@ -39,6 +40,7 @@ enum
PROP_0,
PROP_AFTERBURNER,
PROP_BITRATE,
+ PROP_BITRATEMODE,
PROP_HEADER_PERIOD,
PROP_PEAK_BITRATE,
PROP_RATE_CONTROL,
@@ -146,6 +148,28 @@ gst_fdk_aac_rate_control_get_type (void)
return fdk_aac_rate_control_type;
}
+#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)
@@ -168,6 +192,9 @@ gst_fdkaacenc_set_property (GObject * ob
case PROP_VBR_PRESET:
self->vbr_preset = g_value_get_enum (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;
@@ -200,6 +227,9 @@ gst_fdkaacenc_get_property (GObject * ob
case PROP_VBR_PRESET:
g_value_set_enum (value, self->vbr_preset);
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;
@@ -562,6 +592,13 @@ gst_fdkaacenc_set_format (GstAudioEncode
GST_INFO_OBJECT (self, "Afterburner enabled");
}
+ 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) {
GST_ERROR_OBJECT (self, "Unable to set header period %d: %d",
@@ -806,6 +843,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;
self->afterburner = FALSE;
@@ -894,6 +932,12 @@ gst_fdkaacenc_class_init (GstFdkAacEncCl
GST_FDK_AAC_VBR_PRESET, DEFAULT_VBR_PRESET,
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",
Index: gst-plugins-bad1.0-contrib/ext/fdkaac/gstfdkaacenc.h
===================================================================
--- gst-plugins-bad1.0-contrib.orig/ext/fdkaac/gstfdkaacenc.h
+++ gst-plugins-bad1.0-contrib/ext/fdkaac/gstfdkaacenc.h
@@ -73,6 +73,16 @@ typedef enum
GST_FDK_AAC_RATE_CONTROL_VARIABLE_BITRATE,
} GstFdkAacRateControl;
+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;
@@ -84,6 +94,7 @@ struct _GstFdkAacEnc {
const GstAudioChannelPosition *aac_positions;
gboolean is_drained;
+ GstAacBitrateMode bitrate_mode;
guint header_period;
guint peak_bitrate;
|