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
|
From b205b62653911ef766198a00a16bb3edb77760f8 Mon Sep 17 00:00:00 2001
From: Sanchayan Maity <sanchayan@asymptotic.io>
Date: Sat, 23 Jan 2021 18:12:39 +0530
Subject: [PATCH 4/7] fdkaacenc: Add support for setting header period
Header period is frame count period for sending in-band configuration buffers
within LATM/LOAS transport layer. Additionally this parameter configures the
Program Config Element (PCE) repetition period in raw data block.
---
.../gst-plugins-bad/ext/fdkaac/gstfdkaacenc.c | 27 ++++++++++++++++++-
.../gst-plugins-bad/ext/fdkaac/gstfdkaacenc.h | 2 ++
2 files changed, 28 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
@@ -39,6 +39,7 @@ enum
PROP_0,
PROP_AFTERBURNER,
PROP_BITRATE,
+ PROP_HEADER_PERIOD,
PROP_PEAK_BITRATE,
PROP_RATE_CONTROL,
PROP_VBR_PRESET,
@@ -167,6 +168,9 @@ gst_fdkaacenc_set_property (GObject * ob
case PROP_VBR_PRESET:
self->vbr_preset = g_value_get_enum (value);
break;
+ case PROP_HEADER_PERIOD:
+ self->header_period = g_value_get_uint (value);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -196,6 +200,9 @@ gst_fdkaacenc_get_property (GObject * ob
case PROP_VBR_PRESET:
g_value_set_enum (value, self->vbr_preset);
break;
+ case PROP_HEADER_PERIOD:
+ g_value_set_uint (value, self->header_period);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -554,6 +561,14 @@ gst_fdkaacenc_set_format (GstAudioEncode
GST_INFO_OBJECT (self, "Afterburner enabled");
}
+
+ 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",
+ self->header_period, err);
+ return FALSE;
+ }
+
if ((err = aacEncEncode (self->enc, NULL, NULL, NULL, NULL)) != AACENC_OK) {
GST_ERROR_OBJECT (self, "Unable to initialize encoder: %d", err);
return FALSE;
@@ -777,6 +792,11 @@ gst_fdkaacenc_flush (GstAudioEncoder * e
aacEncClose (&self->enc);
self->enc = NULL;
self->is_drained = TRUE;
+ /*
+ * 0xFF: auto-mode. Default 10 for TT_MP4_ADTS, TT_MP4_LOAS and
+ * TT_MP4_LATM_MCP1 otherwise 0.
+ */
+ self->header_period = 255;
if (GST_AUDIO_INFO_IS_VALID (info))
gst_fdkaacenc_set_format (enc, info);
@@ -874,6 +894,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_HEADER_PERIOD,
+ g_param_spec_uint ("header-period", "Frame count period",
+ "Frame count period for sending in-band configuration buffers",
+ 0, 255, 255 /* auto-mode */ ,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
gst_element_class_add_static_pad_template (element_class, &sink_template);
gst_element_class_add_static_pad_template (element_class, &src_template);
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
@@ -84,6 +84,8 @@ struct _GstFdkAacEnc {
const GstAudioChannelPosition *aac_positions;
gboolean is_drained;
+ guint header_period;
+
guint peak_bitrate;
gboolean afterburner;
|