2 * Copyright (C) 2007-2009 Nokia Corporation.
4 * Author: Felipe Contreras <felipe.contreras@nokia.com>
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation
9 * version 2.1 of the License.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 #include "gstomx_aacenc.h"
23 #include "gstomx_base_filter.h"
34 #define DEFAULT_BITRATE 64000
35 #define DEFAULT_PROFILE OMX_AUDIO_AACObjectLC
36 #define DEFAULT_OUTPUT_FORMAT OMX_AUDIO_AACStreamFormatRAW
38 GSTOMX_BOILERPLATE (GstOmxAacEnc, gst_omx_aacenc, GstOmxBaseFilter,
39 GST_OMX_BASE_FILTER_TYPE);
41 #define GST_TYPE_OMX_AACENC_PROFILE (gst_omx_aacenc_profile_get_type ())
43 gst_omx_aacenc_profile_get_type (void)
45 static GType gst_omx_aacenc_profile_type = 0;
47 if (!gst_omx_aacenc_profile_type) {
48 static GEnumValue gst_omx_aacenc_profile[] = {
49 {OMX_AUDIO_AACObjectLC, "Low Complexity", "LC"},
50 {OMX_AUDIO_AACObjectMain, "Main", "Main"},
51 {OMX_AUDIO_AACObjectSSR, "Scalable Sample Rate", "SSR"},
52 {OMX_AUDIO_AACObjectLTP, "Long Term Prediction", "LTP"},
53 {OMX_AUDIO_AACObjectHE, "High Efficiency with SBR (HE-AAC v1)", "HE"},
54 {OMX_AUDIO_AACObjectScalable, "Scalable", "Scalable"},
55 {OMX_AUDIO_AACObjectERLC,
56 "ER AAC Low Complexity object (Error Resilient AAC-LC)", "ERLC"},
57 {OMX_AUDIO_AACObjectLD, "AAC Low Delay object (Error Resilient)", "LD"},
58 {OMX_AUDIO_AACObjectHE_PS,
59 "High Efficiency with Parametric Stereo coding (HE-AAC v2, object type PS)",
64 gst_omx_aacenc_profile_type = g_enum_register_static ("GstOmxAacencProfile",
65 gst_omx_aacenc_profile);
68 return gst_omx_aacenc_profile_type;
71 #define GST_TYPE_OMX_AACENC_OUTPUT_FORMAT (gst_omx_aacenc_output_format_get_type ())
73 gst_omx_aacenc_output_format_get_type (void)
75 static GType gst_omx_aacenc_output_format_type = 0;
77 if (!gst_omx_aacenc_output_format_type) {
78 static GEnumValue gst_omx_aacenc_output_format[] = {
79 {OMX_AUDIO_AACStreamFormatMP2ADTS, "Audio Data Transport Stream 2 format",
81 {OMX_AUDIO_AACStreamFormatMP4ADTS, "Audio Data Transport Stream 4 format",
83 {OMX_AUDIO_AACStreamFormatMP4LOAS, "Low Overhead Audio Stream format",
85 {OMX_AUDIO_AACStreamFormatMP4LATM,
86 "Low overhead Audio Transport Multiplex", "MP4LATM"},
87 {OMX_AUDIO_AACStreamFormatADIF, "Audio Data Interchange Format", "ADIF"},
88 {OMX_AUDIO_AACStreamFormatMP4FF, "AAC inside MPEG-4/ISO File Format",
90 {OMX_AUDIO_AACStreamFormatRAW, "AAC Raw Format", "RAW"},
94 gst_omx_aacenc_output_format_type =
95 g_enum_register_static ("GstOmxAacencOutputFormat",
96 gst_omx_aacenc_output_format);
99 return gst_omx_aacenc_output_format_type;
103 type_base_init (gpointer g_class)
105 GstElementClass *element_class;
107 element_class = GST_ELEMENT_CLASS (g_class);
109 gst_element_class_set_details_simple (element_class,
110 "OpenMAX IL AAC audio encoder",
111 "Codec/Encoder/Audio",
112 "Encodes audio in AAC format with OpenMAX IL", "Felipe Contreras");
114 gst_element_class_add_pad_template (element_class,
115 gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS,
116 gstomx_template_caps (G_TYPE_FROM_CLASS (g_class), "sink")));
118 gst_element_class_add_pad_template (element_class,
119 gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS,
120 gstomx_template_caps (G_TYPE_FROM_CLASS (g_class), "src")));
124 set_property (GObject * obj,
125 guint prop_id, const GValue * value, GParamSpec * pspec)
129 self = GST_OMX_AACENC (obj);
133 self->bitrate = g_value_get_uint (value);
136 self->profile = g_value_get_enum (value);
138 case ARG_OUTPUT_FORMAT:
139 self->output_format = g_value_get_enum (value);
142 G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
148 get_property (GObject * obj, guint prop_id, GValue * value, GParamSpec * pspec)
152 self = GST_OMX_AACENC (obj);
156 /** @todo propagate this to OpenMAX when processing. */
157 g_value_set_uint (value, self->bitrate);
160 g_value_set_enum (value, self->profile);
162 case ARG_OUTPUT_FORMAT:
163 g_value_set_enum (value, self->output_format);
166 G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
172 type_class_init (gpointer g_class, gpointer class_data)
174 GObjectClass *gobject_class;
176 gobject_class = G_OBJECT_CLASS (g_class);
178 /* Properties stuff */
180 gobject_class->set_property = set_property;
181 gobject_class->get_property = get_property;
183 g_object_class_install_property (gobject_class, ARG_BITRATE,
184 g_param_spec_uint ("bitrate", "Bit-rate",
186 0, G_MAXUINT, DEFAULT_BITRATE,
187 G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
188 g_object_class_install_property (gobject_class, ARG_PROFILE,
189 g_param_spec_enum ("profile", "Enocding profile",
190 "OMX_AUDIO_AACPROFILETYPE of output",
191 GST_TYPE_OMX_AACENC_PROFILE,
192 DEFAULT_PROFILE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
194 g_object_class_install_property (gobject_class, ARG_OUTPUT_FORMAT,
195 g_param_spec_enum ("output-format", "Output format",
196 "OMX_AUDIO_AACSTREAMFORMATTYPE of output",
197 GST_TYPE_OMX_AACENC_OUTPUT_FORMAT,
198 DEFAULT_OUTPUT_FORMAT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
203 sink_setcaps (GstPad * pad, GstCaps * caps)
205 GstStructure *structure;
206 GstOmxBaseFilter *omx_base;
211 omx_base = GST_OMX_BASE_FILTER (GST_PAD_PARENT (pad));
212 gomx = (GOmxCore *) omx_base->gomx;
214 GST_INFO_OBJECT (omx_base, "setcaps (sink): %" GST_PTR_FORMAT, caps);
216 g_return_val_if_fail (gst_caps_get_size (caps) == 1, FALSE);
218 structure = gst_caps_get_structure (caps, 0);
220 gst_structure_get_int (structure, "rate", &rate);
221 gst_structure_get_int (structure, "channels", &channels);
223 /* Input port configuration. */
225 OMX_AUDIO_PARAM_PCMMODETYPE param;
227 G_OMX_INIT_PARAM (param);
229 param.nPortIndex = omx_base->in_port->port_index;
230 OMX_GetParameter (gomx->omx_handle, OMX_IndexParamAudioPcm, ¶m);
232 param.nSamplingRate = rate;
233 param.nChannels = channels;
235 OMX_SetParameter (gomx->omx_handle, OMX_IndexParamAudioPcm, ¶m);
241 src_caps = gst_caps_new_simple ("audio/mpeg",
242 "mpegversion", G_TYPE_INT, 4,
243 "rate", G_TYPE_INT, rate, "channels", G_TYPE_INT, channels, NULL);
244 GST_INFO_OBJECT (omx_base, "src caps are: %" GST_PTR_FORMAT, src_caps);
246 gst_pad_set_caps (omx_base->srcpad, src_caps);
248 gst_caps_unref (src_caps);
251 return gst_pad_set_caps (pad, caps);
255 omx_setup (GstOmxBaseFilter * omx_base)
260 self = GST_OMX_AACENC (omx_base);
261 gomx = (GOmxCore *) omx_base->gomx;
263 GST_INFO_OBJECT (omx_base, "begin");
266 OMX_AUDIO_PARAM_AACPROFILETYPE param;
268 G_OMX_INIT_PARAM (param);
270 /* Output port configuration. */
272 param.nPortIndex = omx_base->out_port->port_index;
273 OMX_GetParameter (gomx->omx_handle, OMX_IndexParamAudioAac, ¶m);
275 GST_DEBUG_OBJECT (omx_base, "setting bitrate: %i", self->bitrate);
276 param.nBitRate = self->bitrate;
278 GST_DEBUG_OBJECT (omx_base, "setting profile: %i", self->profile);
279 param.eAACProfile = self->profile;
281 GST_DEBUG_OBJECT (omx_base, "setting output format: %i",
282 self->output_format);
283 param.eAACStreamFormat = self->output_format;
285 OMX_SetParameter (gomx->omx_handle, OMX_IndexParamAudioAac, ¶m);
289 /* some workarounds. */
292 OMX_AUDIO_PARAM_PCMMODETYPE param;
294 G_OMX_INIT_PARAM (param);
296 param.nPortIndex = omx_base->in_port->port_index;
297 OMX_GetParameter (omx_base->gomx->omx_handle, OMX_IndexParamAudioPcm,
300 rate = param.nSamplingRate;
301 channels = param.nChannels;
305 OMX_AUDIO_PARAM_AACPROFILETYPE param;
307 G_OMX_INIT_PARAM (param);
309 param.nPortIndex = omx_base->out_port->port_index;
310 OMX_GetParameter (omx_base->gomx->omx_handle, OMX_IndexParamAudioAac,
313 param.nSampleRate = rate;
314 param.nChannels = channels;
316 OMX_SetParameter (omx_base->gomx->omx_handle, OMX_IndexParamAudioAac,
321 GST_INFO_OBJECT (omx_base, "end");
325 type_instance_init (GTypeInstance * instance, gpointer g_class)
327 GstOmxBaseFilter *omx_base;
330 omx_base = GST_OMX_BASE_FILTER (instance);
331 self = GST_OMX_AACENC (instance);
333 omx_base->omx_setup = omx_setup;
335 gst_pad_set_setcaps_function (omx_base->sinkpad, sink_setcaps);
337 self->bitrate = DEFAULT_BITRATE;
338 self->profile = DEFAULT_PROFILE;
339 self->output_format = DEFAULT_OUTPUT_FORMAT;