1 /*
2  INTEL CONFIDENTIAL
3  Copyright 2009 Intel Corporation All Rights Reserved.
4  The source code contained or described herein and all documents related to the source code ("Material") are owned by Intel Corporation or its suppliers or licensors. Title to the Material remains with Intel Corporation or its suppliers and licensors. The Material contains trade secrets and proprietary and confidential information of Intel or its suppliers and licensors. The Material is protected by worldwide copyright and trade secret laws and treaty provisions. No part of the Material may be used, copied, reproduced, modified, published, uploaded, posted, transmitted, distributed, or disclosed in any way without Intel’s prior express written permission.
5 
6  No license under any patent, copyright, trade secret or other intellectual property right is granted to or conferred upon you by disclosure or delivery of the Materials, either expressly, by implication, inducement, estoppel or otherwise. Any license under such intellectual property rights must be express and approved by Intel in writing.
7 */
8 
9 /**
10  * SECTION:mixacpaac
11  * @short_description: Audio configuration parameters for AAC-LC, HEAAC v1, and HEAAC v2 audio format.
12  * @include: mixacpaac.h
13  *
14  * A data object which stores audio specific parameters for the following formats:
15  * <itemizedlist>
16  * <listitem>AAC-LC</listitem>
17  * <listitem>HE-AAC v1</listitem>
18  * <listitem>HE-AAC v2</listitem>
19  * </itemizedlist>
20  *
21  * Additional parameters must be set in the parent object #MixAudioConfigParams
22  */
23 
24 #include "mixacpaac.h"
25 #include <string.h>
26 #include <mixlog.h>
27 
28 static GType _mix_acp_aac_type = 0;
29 static MixAudioConfigParamsClass *parent_class = NULL;
30 
31 #define _do_init { _mix_acp_aac_type = g_define_type_id; }
32 
33 gboolean mix_acp_aac_copy(MixParams* target, const MixParams *src);
34 MixParams* mix_acp_aac_dup(const MixParams *obj);
35 gboolean mix_acp_aac_equal(MixParams* first, MixParams *second);
36 static void mix_acp_aac_finalize(MixParams *obj);
37 
38 void mix_aac_print_params(MixAudioConfigParams *obj);
39 
40 G_DEFINE_TYPE_WITH_CODE(MixAudioConfigParamsAAC, mix_acp_aac, MIX_TYPE_AUDIOCONFIGPARAMS, _do_init);
41 
mix_acp_aac_init(MixAudioConfigParamsAAC * self)42 static void mix_acp_aac_init (MixAudioConfigParamsAAC *self)
43 {
44   self->MPEG_id = MIX_AAC_MPEG_ID_NULL;
45   self->bit_stream_format= MIX_AAC_BS_NULL;
46   self->aac_profile=MIX_AAC_PROFILE_NULL;
47   self->aot=0;
48   self->bit_rate_type=MIX_AAC_BR_NULL; /* 0=CBR, 1=VBR */
49   self->CRC=FALSE;
50   self->sbrPresentFlag = -1;
51   self->psPresentFlag = -1;
52   self->pce_present=FALSE; /* Flag. 1- present 0 - not present, for RAW */
53   self->syntc_id[0] = self->syntc_id[1] = 0; /* 0 for ID_SCE(Dula Mono), -1 for raw */
54   self->syntc_tag[0] = self->syntc_tag[1] = 0; /* raw - -1 and 0 -16 for rest of the streams */
55   self->num_syntc_elems = 0;
56   self->aac_sample_rate = 0;
57   self->aac_channels = 0;
58 }
59 
mix_acp_aac_class_init(MixAudioConfigParamsAACClass * klass)60 static void mix_acp_aac_class_init(MixAudioConfigParamsAACClass *klass)
61 {
62   MixParamsClass *mixparams_class = MIX_PARAMS_CLASS(klass);
63 
64   /* setup static parent class */
65   parent_class = (MixAudioConfigParamsClass *) g_type_class_peek_parent (klass);
66 
67   mixparams_class->finalize = mix_acp_aac_finalize;
68   mixparams_class->copy = (MixParamsCopyFunction)mix_acp_aac_copy;
69   mixparams_class->dup = (MixParamsDupFunction)mix_acp_aac_dup;
70   mixparams_class->equal = (MixParamsEqualFunction)mix_acp_aac_equal;
71 
72 //  MixAudioConfigParamsClass *acp = MIX_AUDIOCONFIGPARAMS_GET_CLASS(klass);
73   MixAudioConfigParamsClass *acp = (MixAudioConfigParamsClass *)klass;
74   acp->print_params = mix_aac_print_params;
75 }
76 
mix_acp_aac_new(void)77 MixAudioConfigParamsAAC *mix_acp_aac_new(void)
78 {
79   MixAudioConfigParamsAAC *ret = (MixAudioConfigParamsAAC *)g_type_create_instance (MIX_TYPE_AUDIOCONFIGPARAMSAAC);
80 
81   return ret;
82 }
83 
mix_acp_aac_finalize(MixParams * obj)84 void mix_acp_aac_finalize(MixParams *obj)
85 {
86   /* clean up here. */
87 
88   /* Chain up parent */
89   MixParamsClass *klass = MIX_PARAMS_CLASS(parent_class);
90   if (klass->finalize)
91     klass->finalize(obj);
92 }
93 
mix_acp_aac_ref(MixAudioConfigParamsAAC * mix)94 MixAudioConfigParamsAAC *mix_acp_aac_ref(MixAudioConfigParamsAAC *mix)
95 {
96   return (MixAudioConfigParamsAAC*)mix_params_ref(MIX_PARAMS(mix));
97 }
98 
99 /**
100  * mix_acp_aac_dup:
101  * @obj: a #MixAudioConfigParamsAAC object
102  * @returns: a newly allocated duplicate of the object.
103  *
104  * Copy duplicate of the object.
105  */
mix_acp_aac_dup(const MixParams * obj)106 MixParams* mix_acp_aac_dup(const MixParams *obj)
107 {
108   MixParams *ret = NULL;
109 
110   if (MIX_IS_AUDIOCONFIGPARAMSAAC(obj))
111   {
112     MixAudioConfigParamsAAC *duplicate = mix_acp_aac_new();
113     if (mix_acp_aac_copy(MIX_PARAMS(duplicate), MIX_PARAMS(obj)))
114     {
115       ret = MIX_PARAMS(duplicate);
116     }
117     else
118     {
119       mix_acp_aac_unref(duplicate);
120     }
121   }
122 
123   return ret;
124 }
125 
126 /**
127  * mix_acp_aac_copy:
128  * @target: copy to target
129  * @src: copy from src
130  * @returns: boolean indicates if copy is successful.
131  *
132  * Copy instance data from @src to @target.
133  */
mix_acp_aac_copy(MixParams * target,const MixParams * src)134 gboolean mix_acp_aac_copy(MixParams* target, const MixParams *src)
135 {
136   if (MIX_IS_AUDIOCONFIGPARAMSAAC(target) && MIX_IS_AUDIOCONFIGPARAMSAAC(src))
137   {
138     MixAudioConfigParamsAAC *t = MIX_AUDIOCONFIGPARAMSAAC(target);
139     MixAudioConfigParamsAAC *s = MIX_AUDIOCONFIGPARAMSAAC(src);
140 
141     t->MPEG_id = s->MPEG_id;
142     t->bit_stream_format = s->bit_stream_format;
143     t->aac_profile = s->aac_profile;
144     t->aot = s->aot;
145     t->bit_rate_type = s->bit_rate_type;
146     t->CRC = s->CRC;
147 
148     // Now chainup base class
149     MixParamsClass *klass = MIX_PARAMS_CLASS(parent_class);
150     if (klass->copy)
151     {
152       return klass->copy(MIX_PARAMS_CAST(target), MIX_PARAMS_CAST(src));
153     }
154     else
155       return TRUE;
156   }
157   return FALSE;
158 }
159 
160 /**
161  * mix_acp_aac_equal:
162  * @first: first object to compare
163  * @second: seond object to compare
164  * @returns: boolean indicates if instance are equal.
165  *
166  * Copy instance data from @src to @target.
167  */
mix_acp_aac_equal(MixParams * first,MixParams * second)168 gboolean mix_acp_aac_equal(MixParams* first, MixParams *second)
169 {
170   gboolean ret = FALSE;
171 
172   if (first && second)
173   {
174     if (first == second) return TRUE;
175   }
176   else
177   {
178     return FALSE;
179   }
180 
181   // members within this scope equal. chaining up.
182   MixParamsClass *klass = MIX_PARAMS_CLASS(parent_class);
183   if (klass->equal)
184     ret = klass->equal(first, second);
185   else
186     ret = TRUE;
187 
188   if (ret && MIX_IS_AUDIOCONFIGPARAMSAAC(first) && MIX_IS_AUDIOCONFIGPARAMSAAC(second))
189   {
190 
191     MixAudioConfigParamsAAC *acp1 = MIX_AUDIOCONFIGPARAMSAAC(first);
192     MixAudioConfigParamsAAC *acp2 = MIX_AUDIOCONFIGPARAMSAAC(second);
193 
194     ret = (acp1->MPEG_id == acp2->MPEG_id) &&
195           (acp1->bit_stream_format && acp2->bit_stream_format) &&
196           (acp1->aac_profile == acp2->aac_profile) &&
197           (acp1->aot == acp2->aot) &&
198           (acp1->bit_rate_type == acp2->bit_rate_type) &&
199           (acp1->CRC == acp2->CRC) &&
200           (acp1->sbrPresentFlag == acp2->sbrPresentFlag) &&
201           (acp1->psPresentFlag == acp2->psPresentFlag) &&
202           (acp1->pce_present == acp2->pce_present) &&
203           (acp1->syntc_id[0] == acp2->syntc_id[0]) &&
204           (acp1->syntc_id[1] == acp2->syntc_id[1]) &&
205           (acp1->syntc_tag[0] == acp2->syntc_tag[0]) &&
206           (acp1->syntc_tag[1] == acp2->syntc_tag[1]);
207   }
208 
209   return ret;
210 }
211 
mix_acp_aac_set_bit_stream_format(MixAudioConfigParamsAAC * obj,MixAACBitstreamFormt bit_stream_format)212 MIX_RESULT mix_acp_aac_set_bit_stream_format(MixAudioConfigParamsAAC *obj, MixAACBitstreamFormt bit_stream_format)
213 {
214   MIX_RESULT ret = MIX_RESULT_SUCCESS;
215 
216   if (!obj) return MIX_RESULT_NULL_PTR;
217 
218   if (bit_stream_format < MIX_AAC_BS_ADTS && bit_stream_format >= MIX_AAC_BS_LAST)
219   {
220     ret = MIX_RESULT_INVALID_PARAM;
221   }
222   else
223   {
224     obj->bit_stream_format = bit_stream_format;
225   }
226 
227   return ret;
228 }
mix_acp_aac_get_bit_stream_format(MixAudioConfigParamsAAC * obj)229 MixAACBitstreamFormt mix_acp_aac_get_bit_stream_format(MixAudioConfigParamsAAC *obj)
230 {
231   if (obj)
232     return obj->bit_stream_format;
233   else
234     return MIX_AAC_BS_NULL;
235 }
236 
mix_acp_aac_set_aac_profile(MixAudioConfigParamsAAC * obj,MixAACProfile aac_profile)237 MIX_RESULT mix_acp_aac_set_aac_profile(MixAudioConfigParamsAAC *obj, MixAACProfile aac_profile)
238 {
239   MIX_RESULT ret = MIX_RESULT_SUCCESS;
240 
241   if (!obj) return MIX_RESULT_NULL_PTR;
242 
243   if (aac_profile < MIX_AAC_PROFILE_MAIN || aac_profile >= MIX_AAC_PROFILE_LAST)
244   {
245     ret = MIX_RESULT_INVALID_PARAM;
246   }
247   else
248   {
249     obj->aac_profile = aac_profile;
250   }
251 
252   return ret;
253 }
mix_acp_aac_get_aac_profile(MixAudioConfigParamsAAC * obj)254 MixAACProfile mix_acp_aac_get_aac_profile(MixAudioConfigParamsAAC *obj)
255 {
256   if (obj)
257     return obj->aac_profile;
258   else
259     return MIX_AAC_PROFILE_NULL;
260 }
261 
mix_acp_aac_set_bit_rate_type(MixAudioConfigParamsAAC * obj,MixAACBitrateType bit_rate_type)262 MIX_RESULT mix_acp_aac_set_bit_rate_type(MixAudioConfigParamsAAC *obj, MixAACBitrateType bit_rate_type)
263 {
264   MIX_RESULT ret = MIX_RESULT_SUCCESS;
265 
266   if (!obj) return MIX_RESULT_NULL_PTR;
267 
268   if (bit_rate_type != MIX_AAC_BR_CONSTANT && bit_rate_type != MIX_AAC_BR_VARIABLE)
269   {
270     ret = MIX_RESULT_INVALID_PARAM;
271   }
272   else
273   {
274     obj->bit_rate_type = bit_rate_type;
275   }
276 
277   return ret;
278 }
mix_acp_aac_get_bit_rate_type(MixAudioConfigParamsAAC * obj)279 MixAACBitrateType mix_acp_aac_get_bit_rate_type(MixAudioConfigParamsAAC *obj)
280 {
281   if (obj)
282     return obj->bit_rate_type;
283   else
284     return MIX_AAC_BR_NULL;
285 }
286 
mix_aac_print_params(MixAudioConfigParams * obj)287 void mix_aac_print_params(MixAudioConfigParams *obj)
288 {
289     MixAudioConfigParamsAAC *t = MIX_AUDIOCONFIGPARAMSAAC(obj);
290     mix_log(MIX_AUDIO_COMP, MIX_LOG_LEVEL_INFO, "Mpeg ID: %d\n", t->MPEG_id);
291     mix_log(MIX_AUDIO_COMP, MIX_LOG_LEVEL_INFO, "bit_stream_format: %d\n", t->bit_stream_format);
292     mix_log(MIX_AUDIO_COMP, MIX_LOG_LEVEL_INFO, "aac_profile: %d\n", t->aac_profile);
293     mix_log(MIX_AUDIO_COMP, MIX_LOG_LEVEL_INFO, "aot: %d\n", t->aot);
294     mix_log(MIX_AUDIO_COMP, MIX_LOG_LEVEL_INFO, "bit_rate_type: %d\n", t->bit_rate_type);
295     mix_log(MIX_AUDIO_COMP, MIX_LOG_LEVEL_INFO, "CRC: %d\n", t->CRC);
296     mix_log(MIX_AUDIO_COMP, MIX_LOG_LEVEL_INFO, " \n");
297 }
298 
299 
mix_acp_aac_set_aot(MixAudioConfigParamsAAC * obj,guint aot)300 MIX_RESULT mix_acp_aac_set_aot(MixAudioConfigParamsAAC *obj, guint aot)
301 {
302     if (!obj) return MIX_RESULT_NULL_PTR;
303 
304     if (MIX_IS_AUDIOCONFIGPARAMSAAC(obj))
305     {
306         if ((aot == 2) || (aot == 5))
307         {
308             obj->aot=aot;
309             return MIX_RESULT_SUCCESS;
310         }
311         else
312         {
313             return MIX_RESULT_NOT_SUPPORTED;
314         }
315     }
316     else
317     {
318         return MIX_RESULT_INVALID_PARAM;
319     }
320 }
321 
mix_acp_aac_get_aot(MixAudioConfigParamsAAC * obj)322 guint mix_acp_aac_get_aot(MixAudioConfigParamsAAC *obj)
323 {
324     if (MIX_IS_AUDIOCONFIGPARAMSAAC(obj))
325         return obj->aot;
326     else
327         return 0;
328 }
329 
330 
mix_acp_aac_set_mpeg_id(MixAudioConfigParamsAAC * obj,MixAACMpegID mpegid)331 MIX_RESULT mix_acp_aac_set_mpeg_id(MixAudioConfigParamsAAC *obj, MixAACMpegID mpegid)
332 {
333     if (!obj) return MIX_RESULT_NULL_PTR;
334 
335     if (MIX_IS_AUDIOCONFIGPARAMSAAC(obj))
336     {
337         if ((mpegid >= MIX_AAC_MPEG_ID_NULL) || (mpegid < MIX_AAC_MPEG_LAST))
338         {
339             obj->MPEG_id=mpegid;
340             return MIX_RESULT_SUCCESS;
341         }
342         else
343         {
344             return MIX_RESULT_NOT_SUPPORTED;
345         }
346     }
347     else
348     {
349         return MIX_RESULT_INVALID_PARAM;
350     }
351 }
352 
mix_acp_aac_get_mpeg_id(MixAudioConfigParamsAAC * obj)353 MixAACMpegID mix_acp_aac_get_mpeg_id(MixAudioConfigParamsAAC *obj)
354 {
355     if (MIX_IS_AUDIOCONFIGPARAMSAAC(obj))
356         return obj->MPEG_id;
357     else
358         return MIX_AAC_MPEG_ID_NULL;
359 }
360 
361