tizen beta release
[profile/ivi/gst-openmax0.10.git] / omx / gstomx_aacenc.c
1 /*
2  * Copyright (C) 2007-2009 Nokia Corporation.
3  *
4  * Author: Felipe Contreras <felipe.contreras@nokia.com>
5  *
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.
10  *
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.
15  *
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
19  *
20  */
21
22 #include "gstomx_aacenc.h"
23 #include "gstomx_base_filter.h"
24 #include "gstomx.h"
25
26 enum
27 {
28   ARG_0,
29   ARG_BITRATE,
30   ARG_PROFILE,
31   ARG_OUTPUT_FORMAT,
32 };
33
34 #define DEFAULT_BITRATE 64000
35 #define DEFAULT_PROFILE OMX_AUDIO_AACObjectLC
36 #define DEFAULT_OUTPUT_FORMAT OMX_AUDIO_AACStreamFormatRAW
37
38 GSTOMX_BOILERPLATE (GstOmxAacEnc, gst_omx_aacenc, GstOmxBaseFilter,
39     GST_OMX_BASE_FILTER_TYPE);
40
41 #define GST_TYPE_OMX_AACENC_PROFILE (gst_omx_aacenc_profile_get_type ())
42 static GType
43 gst_omx_aacenc_profile_get_type (void)
44 {
45   static GType gst_omx_aacenc_profile_type = 0;
46
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)",
60           "HE_PS"},
61       {0, NULL, NULL},
62     };
63
64     gst_omx_aacenc_profile_type = g_enum_register_static ("GstOmxAacencProfile",
65         gst_omx_aacenc_profile);
66   }
67
68   return gst_omx_aacenc_profile_type;
69 }
70
71 #define GST_TYPE_OMX_AACENC_OUTPUT_FORMAT (gst_omx_aacenc_output_format_get_type ())
72 static GType
73 gst_omx_aacenc_output_format_get_type (void)
74 {
75   static GType gst_omx_aacenc_output_format_type = 0;
76
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",
80           "MP2ADTS"},
81       {OMX_AUDIO_AACStreamFormatMP4ADTS, "Audio Data Transport Stream 4 format",
82           "MP4ADTS"},
83       {OMX_AUDIO_AACStreamFormatMP4LOAS, "Low Overhead Audio Stream format",
84           "MP4LOAS"},
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",
89           "MP4FF"},
90       {OMX_AUDIO_AACStreamFormatRAW, "AAC Raw Format", "RAW"},
91       {0, NULL, NULL},
92     };
93
94     gst_omx_aacenc_output_format_type =
95         g_enum_register_static ("GstOmxAacencOutputFormat",
96         gst_omx_aacenc_output_format);
97   }
98
99   return gst_omx_aacenc_output_format_type;
100 }
101
102 static void
103 type_base_init (gpointer g_class)
104 {
105   GstElementClass *element_class;
106
107   element_class = GST_ELEMENT_CLASS (g_class);
108
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");
113
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")));
117
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")));
121 }
122
123 static void
124 set_property (GObject * obj,
125     guint prop_id, const GValue * value, GParamSpec * pspec)
126 {
127   GstOmxAacEnc *self;
128
129   self = GST_OMX_AACENC (obj);
130
131   switch (prop_id) {
132     case ARG_BITRATE:
133       self->bitrate = g_value_get_uint (value);
134       break;
135     case ARG_PROFILE:
136       self->profile = g_value_get_enum (value);
137       break;
138     case ARG_OUTPUT_FORMAT:
139       self->output_format = g_value_get_enum (value);
140       break;
141     default:
142       G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
143       break;
144   }
145 }
146
147 static void
148 get_property (GObject * obj, guint prop_id, GValue * value, GParamSpec * pspec)
149 {
150   GstOmxAacEnc *self;
151
152   self = GST_OMX_AACENC (obj);
153
154   switch (prop_id) {
155     case ARG_BITRATE:
156             /** @todo propagate this to OpenMAX when processing. */
157       g_value_set_uint (value, self->bitrate);
158       break;
159     case ARG_PROFILE:
160       g_value_set_enum (value, self->profile);
161       break;
162     case ARG_OUTPUT_FORMAT:
163       g_value_set_enum (value, self->output_format);
164       break;
165     default:
166       G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
167       break;
168   }
169 }
170
171 static void
172 type_class_init (gpointer g_class, gpointer class_data)
173 {
174   GObjectClass *gobject_class;
175
176   gobject_class = G_OBJECT_CLASS (g_class);
177
178   /* Properties stuff */
179   {
180     gobject_class->set_property = set_property;
181     gobject_class->get_property = get_property;
182
183     g_object_class_install_property (gobject_class, ARG_BITRATE,
184         g_param_spec_uint ("bitrate", "Bit-rate",
185             "Encoding 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));
193
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));
199   }
200 }
201
202 static gboolean
203 sink_setcaps (GstPad * pad, GstCaps * caps)
204 {
205   GstStructure *structure;
206   GstOmxBaseFilter *omx_base;
207   GOmxCore *gomx;
208   gint rate = 0;
209   gint channels = 0;
210
211   omx_base = GST_OMX_BASE_FILTER (GST_PAD_PARENT (pad));
212   gomx = (GOmxCore *) omx_base->gomx;
213
214   GST_INFO_OBJECT (omx_base, "setcaps (sink): %" GST_PTR_FORMAT, caps);
215
216   g_return_val_if_fail (gst_caps_get_size (caps) == 1, FALSE);
217
218   structure = gst_caps_get_structure (caps, 0);
219
220   gst_structure_get_int (structure, "rate", &rate);
221   gst_structure_get_int (structure, "channels", &channels);
222
223   /* Input port configuration. */
224   {
225     OMX_AUDIO_PARAM_PCMMODETYPE param;
226
227     G_OMX_INIT_PARAM (param);
228
229     param.nPortIndex = omx_base->in_port->port_index;
230     OMX_GetParameter (gomx->omx_handle, OMX_IndexParamAudioPcm, &param);
231
232     param.nSamplingRate = rate;
233     param.nChannels = channels;
234
235     OMX_SetParameter (gomx->omx_handle, OMX_IndexParamAudioPcm, &param);
236   }
237
238   {
239     GstCaps *src_caps;
240
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);
245
246     gst_pad_set_caps (omx_base->srcpad, src_caps);
247
248     gst_caps_unref (src_caps);
249   }
250
251   return gst_pad_set_caps (pad, caps);
252 }
253
254 static void
255 omx_setup (GstOmxBaseFilter * omx_base)
256 {
257   GstOmxAacEnc *self;
258   GOmxCore *gomx;
259
260   self = GST_OMX_AACENC (omx_base);
261   gomx = (GOmxCore *) omx_base->gomx;
262
263   GST_INFO_OBJECT (omx_base, "begin");
264
265   {
266     OMX_AUDIO_PARAM_AACPROFILETYPE param;
267
268     G_OMX_INIT_PARAM (param);
269
270     /* Output port configuration. */
271     {
272       param.nPortIndex = omx_base->out_port->port_index;
273       OMX_GetParameter (gomx->omx_handle, OMX_IndexParamAudioAac, &param);
274
275       GST_DEBUG_OBJECT (omx_base, "setting bitrate: %i", self->bitrate);
276       param.nBitRate = self->bitrate;
277
278       GST_DEBUG_OBJECT (omx_base, "setting profile: %i", self->profile);
279       param.eAACProfile = self->profile;
280
281       GST_DEBUG_OBJECT (omx_base, "setting output format: %i",
282           self->output_format);
283       param.eAACStreamFormat = self->output_format;
284
285       OMX_SetParameter (gomx->omx_handle, OMX_IndexParamAudioAac, &param);
286     }
287   }
288
289   /* some workarounds. */
290 #if 0
291   {
292     OMX_AUDIO_PARAM_PCMMODETYPE param;
293
294     G_OMX_INIT_PARAM (param);
295
296     param.nPortIndex = omx_base->in_port->port_index;
297     OMX_GetParameter (omx_base->gomx->omx_handle, OMX_IndexParamAudioPcm,
298         &param);
299
300     rate = param.nSamplingRate;
301     channels = param.nChannels;
302   }
303
304   {
305     OMX_AUDIO_PARAM_AACPROFILETYPE param;
306
307     G_OMX_INIT_PARAM (param);
308
309     param.nPortIndex = omx_base->out_port->port_index;
310     OMX_GetParameter (omx_base->gomx->omx_handle, OMX_IndexParamAudioAac,
311         &param);
312
313     param.nSampleRate = rate;
314     param.nChannels = channels;
315
316     OMX_SetParameter (omx_base->gomx->omx_handle, OMX_IndexParamAudioAac,
317         &param);
318   }
319 #endif
320
321   GST_INFO_OBJECT (omx_base, "end");
322 }
323
324 static void
325 type_instance_init (GTypeInstance * instance, gpointer g_class)
326 {
327   GstOmxBaseFilter *omx_base;
328   GstOmxAacEnc *self;
329
330   omx_base = GST_OMX_BASE_FILTER (instance);
331   self = GST_OMX_AACENC (instance);
332
333   omx_base->omx_setup = omx_setup;
334
335   gst_pad_set_setcaps_function (omx_base->sinkpad, sink_setcaps);
336
337   self->bitrate = DEFAULT_BITRATE;
338   self->profile = DEFAULT_PROFILE;
339   self->output_format = DEFAULT_OUTPUT_FORMAT;
340 }