File: 0006-fdkaacenc-Add-support-for-setting-bitrate-mode.patch

package info (click to toggle)
gst-plugins-bad1.0-contrib 1.20.0-1.1
  • links: PTS, VCS
  • area: contrib
  • in suites: sid, trixie
  • size: 59,548 kB
  • sloc: ansic: 609,893; cpp: 97,160; objc: 3,569; xml: 3,351; sh: 1,035; python: 206; makefile: 91; java: 75
file content (146 lines) | stat: -rw-r--r-- 4,879 bytes parent folder | download | duplicates (2)
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