source: svn/newcon3bcm2_21bu/nexus/modules/audio/7552/src/nexus_audio_encoder.c

Last change on this file was 76, checked in by megakiss, 10 years ago

1W 대기전력을 만족시키기 위하여 POWEROFF시 튜너를 Standby 상태로 함

  • Property svn:executable set to *
File size: 16.5 KB
Line 
1/***************************************************************************
2*     (c)2004-2011 Broadcom Corporation
3
4*  This program is the proprietary software of Broadcom Corporation and/or its licensors,
5*  and may only be used, duplicated, modified or distributed pursuant to the terms and
6*  conditions of a separate, written license agreement executed between you and Broadcom
7*  (an "Authorized License").  Except as set forth in an Authorized License, Broadcom grants
8*  no license (express or implied), right to use, or waiver of any kind with respect to the
9*  Software, and Broadcom expressly reserves all rights in and to the Software and all
10*  intellectual property rights therein.  IF YOU HAVE NO AUTHORIZED LICENSE, THEN YOU
11*  HAVE NO RIGHT TO USE THIS SOFTWARE IN ANY WAY, AND SHOULD IMMEDIATELY
12*  NOTIFY BROADCOM AND DISCONTINUE ALL USE OF THE SOFTWARE. 
13*   
14*  Except as expressly set forth in the Authorized License,
15*   
16*  1.     This program, including its structure, sequence and organization, constitutes the valuable trade
17*  secrets of Broadcom, and you shall use all reasonable efforts to protect the confidentiality thereof,
18*  and to use this information only in connection with your use of Broadcom integrated circuit products.
19*   
20*  2.     TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE SOFTWARE IS PROVIDED "AS IS"
21*  AND WITH ALL FAULTS AND BROADCOM MAKES NO PROMISES, REPRESENTATIONS OR
22*  WARRANTIES, EITHER EXPRESS, IMPLIED, STATUTORY, OR OTHERWISE, WITH RESPECT TO
23*  THE SOFTWARE.  BROADCOM SPECIFICALLY DISCLAIMS ANY AND ALL IMPLIED WARRANTIES
24*  OF TITLE, MERCHANTABILITY, NONINFRINGEMENT, FITNESS FOR A PARTICULAR PURPOSE,
25*  LACK OF VIRUSES, ACCURACY OR COMPLETENESS, QUIET ENJOYMENT, QUIET POSSESSION
26*  OR CORRESPONDENCE TO DESCRIPTION. YOU ASSUME THE ENTIRE RISK ARISING OUT OF
27*  USE OR PERFORMANCE OF THE SOFTWARE.
28
29*  3.     TO THE MAXIMUM EXTENT PERMITTED BY LAW, IN NO EVENT SHALL BROADCOM OR ITS
30*  LICENSORS BE LIABLE FOR (i) CONSEQUENTIAL, INCIDENTAL, SPECIAL, INDIRECT, OR
31*  EXEMPLARY DAMAGES WHATSOEVER ARISING OUT OF OR IN ANY WAY RELATING TO YOUR
32*  USE OF OR INABILITY TO USE THE SOFTWARE EVEN IF BROADCOM HAS BEEN ADVISED OF
33*  THE POSSIBILITY OF SUCH DAMAGES; OR (ii) ANY AMOUNT IN EXCESS OF THE AMOUNT
34*  ACTUALLY PAID FOR THE SOFTWARE ITSELF OR U.S. $1, WHICHEVER IS GREATER. THESE
35*  LIMITATIONS SHALL APPLY NOTWITHSTANDING ANY FAILURE OF ESSENTIAL PURPOSE OF
36*  ANY LIMITED REMEDY.
37*
38* $brcm_Workfile: nexus_audio_encoder.c $
39* $brcm_Revision: 14 $
40* $brcm_Date: 12/20/11 4:18p $
41*
42* API Description:
43*   API name: DtsEncode
44*    Specific APIs related to DTS Audio Encoding
45*
46* Revision History:
47*
48* $brcm_Log: /nexus/modules/audio/7422/src/nexus_audio_encoder.c $
49*
50* 14   12/20/11 4:18p jgarrett
51* SW7425-1018: Propagating loudness equivalence setting to APE
52*
53* 13   12/20/11 4:13p jgarrett
54* SW7425-1018: Adding initial A/85 implementation
55*
56* 12   12/9/11 11:18a jgarrett
57* SW7425-1478: Adding WMA encoding
58*
59* 11   8/15/11 2:03p jgarrett
60* SW7346-443: Coverity CID 34599
61*
62* 10   7/29/11 5:38p jgarrett
63* SW7346-357: coverity cid 33741
64*
65* 9   6/16/11 5:26p jgarrett
66* SW7425-741: Adding MP3 encoder
67*
68* 8   4/26/11 11:35a jgarrett
69* SW7425-437: Resolving kernel mode shutdown issues
70*
71* 7   4/25/11 9:45p jgarrett
72* SW7425-437: Fixing shutdown crash if still connected or running
73*
74* 6   3/28/11 5:34a jgarrett
75* SW7422-146:  Fixing RemoveAllInputs
76*
77* 5   3/21/11 7:04p jgarrett
78* SW7422-355: Adding AAC encoders
79*
80* 4   3/1/11 7:25p jgarrett
81* SW7422-146: Adding DTS/AC3 encoders
82*
83* 3   2/22/11 5:44p jgarrett
84* SW7422-146: Implemented type renaming based on filter graph review
85*  comments
86*
87* 2   1/13/11 5:25p jgarrett
88* SW7422-146: Adding encoder hooks
89*
90* 1   1/10/11 3:26p jgarrett
91* SW7422-146: Adding full nexus API set
92*
93***************************************************************************/
94
95#include "nexus_audio_module.h"
96
97BDBG_MODULE(nexus_audio_encoder);
98BDBG_OBJECT_ID(NEXUS_AudioEncoder);
99
100/***************************************************************************
101Summary:
102    Get default settings for an Audio Encoder stage
103***************************************************************************/
104void NEXUS_AudioEncoder_GetDefaultSettings(
105    NEXUS_AudioEncoderSettings *pSettings   /* [out] default settings */
106    )
107{
108    BAPE_EncoderSettings encoderSettings;
109
110    BDBG_ASSERT(NULL != pSettings);
111    BKNI_Memset(pSettings, 0, sizeof(*pSettings));
112
113    BAPE_Encoder_GetDefaultSettings(&encoderSettings);
114    pSettings->codec = NEXUS_Audio_P_MagnumToCodec(encoderSettings.codec);
115// JPF    pSettings->loudnessEquivalenceEnabled = encoderSettings.loudnessEquivalenceEnabled;
116}
117
118/***************************************************************************
119Summary:
120    Open an Audio Encoder stage
121***************************************************************************/
122NEXUS_AudioEncoderHandle NEXUS_AudioEncoder_Open( /* attr{destructor=NEXUS_AudioEncoder_Close}  */
123    const NEXUS_AudioEncoderSettings *pSettings     /* Pass NULL for default settings */
124    )
125{
126    NEXUS_Error errCode;
127    NEXUS_AudioEncoderHandle handle;
128    BAPE_EncoderSettings encoderSettings;
129    BAPE_Connector path;
130    NEXUS_AudioEncoderSettings defaults;
131   
132    if ( NULL == pSettings )
133    {
134        NEXUS_AudioEncoder_GetDefaultSettings(&defaults);
135        pSettings = &defaults;
136    }
137
138    handle = BKNI_Malloc(sizeof(NEXUS_AudioEncoder));
139    if ( NULL == handle )
140    {
141        (void)BERR_TRACE(BERR_OUT_OF_SYSTEM_MEMORY);
142        goto err_malloc;
143    }
144
145    BKNI_Memset(handle, 0, sizeof(NEXUS_AudioEncoder));
146    BDBG_OBJECT_SET(handle, NEXUS_AudioEncoder);
147   
148    BAPE_Encoder_GetDefaultSettings(&encoderSettings);
149    encoderSettings.codec = NEXUS_Audio_P_CodecToMagnum(pSettings->codec);
150    errCode = BAPE_Encoder_Create(NEXUS_AUDIO_DEVICE_HANDLE,
151                                  &encoderSettings,
152                                  &handle->encoder);
153    if ( errCode )
154    {
155        (void)BERR_TRACE(errCode);
156        goto err_create;
157    }
158
159    NEXUS_AUDIO_INPUT_INIT(&handle->connector, NEXUS_AudioInputType_eEncoder, handle);
160    handle->connector.format = NEXUS_AudioInputFormat_eCompressed;
161    BAPE_Encoder_GetConnector(handle->encoder, &path);
162    handle->connector.port = (uint32_t)path;
163   
164    /* success */
165    return handle;
166
167err_create:
168    BDBG_OBJECT_DESTROY(handle, NEXUS_AudioEncoder);
169    BKNI_Free(handle);
170err_malloc:
171    return NULL;
172}
173
174/***************************************************************************
175Summary:
176    Close an DTS Encode stage
177   
178Description:
179    Input to the stage must be removed prior to closing.
180***************************************************************************/
181void NEXUS_AudioEncoder_Close(
182    NEXUS_AudioEncoderHandle handle
183    )
184{
185    BDBG_OBJECT_ASSERT(handle, NEXUS_AudioEncoder);
186    NEXUS_AudioInput_Shutdown(&handle->connector);
187    BAPE_Encoder_Destroy(handle->encoder);
188    BDBG_OBJECT_DESTROY(handle, NEXUS_AudioEncoder);
189    BKNI_Free(handle);
190}
191
192/***************************************************************************
193Summary:
194    Get Settings for an DTS Encode stage
195***************************************************************************/
196void NEXUS_AudioEncoder_GetSettings(
197    NEXUS_AudioEncoderHandle handle,
198    NEXUS_AudioEncoderSettings *pSettings    /* [out] Settings */
199    )
200{
201    BAPE_EncoderSettings settings;
202    BDBG_OBJECT_ASSERT(handle, NEXUS_AudioEncoder);
203    BDBG_ASSERT(NULL != pSettings);
204
205    BAPE_Encoder_GetSettings(handle->encoder, &settings);
206    pSettings->codec = NEXUS_Audio_P_MagnumToCodec(settings.codec);
207// JPF    pSettings->loudnessEquivalenceEnabled = settings.loudnessEquivalenceEnabled;
208}
209
210
211/***************************************************************************
212Summary:
213    Set Settings for an DTS Encode stage
214***************************************************************************/
215NEXUS_Error NEXUS_AudioEncoder_SetSettings(
216    NEXUS_AudioEncoderHandle handle,
217    const NEXUS_AudioEncoderSettings *pSettings
218    )
219{
220    BAPE_EncoderSettings settings;
221    BERR_Code errCode;
222
223    BDBG_OBJECT_ASSERT(handle, NEXUS_AudioEncoder);
224    BDBG_ASSERT(NULL != pSettings);
225
226    BAPE_Encoder_GetSettings(handle->encoder, &settings);
227    settings.codec = NEXUS_Audio_P_CodecToMagnum(pSettings->codec);
228// JPF    settings.loudnessEquivalenceEnabled = pSettings->loudnessEquivalenceEnabled;
229    errCode = BAPE_Encoder_SetSettings(handle->encoder, &settings);
230    if ( errCode )
231    {
232        return BERR_TRACE(errCode);
233    }
234    return BERR_SUCCESS;
235}
236
237
238/***************************************************************************
239Summary:
240    Get Codec-Specific Settings for an Audio Encoder stage
241***************************************************************************/
242void NEXUS_AudioEncoder_GetCodecSettings(
243    NEXUS_AudioEncoderHandle handle,
244    NEXUS_AudioCodec codec, /* the codec for which you are retrieving settings. */
245    NEXUS_AudioEncoderCodecSettings *pSettings    /* [out] Settings */
246    )
247{
248    BAVC_AudioCompressionStd magnumCodec;
249    BAPE_EncoderCodecSettings codecSettings;
250    BDBG_OBJECT_ASSERT(handle, NEXUS_AudioEncoder);
251    BDBG_ASSERT(NULL != pSettings);
252    pSettings->codec = codec;
253    magnumCodec = NEXUS_Audio_P_CodecToMagnum(codec);
254    BAPE_Encoder_GetCodecSettings(handle->encoder, magnumCodec, &codecSettings);
255    switch ( codec )
256    {
257    case NEXUS_AudioCodec_eAc3:
258        pSettings->codecSettings.ac3.spdifHeaderEnabled = codecSettings.codecSettings.ac3.spdifHeaderEnabled;
259        break;
260    case NEXUS_AudioCodec_eDts:
261        pSettings->codecSettings.dts.spdifHeaderEnabled = codecSettings.codecSettings.dts.spdifHeaderEnabled;
262        break;
263    case NEXUS_AudioCodec_eAacAdts:
264    case NEXUS_AudioCodec_eAacLoas:
265        pSettings->codecSettings.aac.bitRate = codecSettings.codecSettings.aac.bitRate;
266        pSettings->codecSettings.aac.outputMode = (codecSettings.codecSettings.aac.channelMode == BAPE_ChannelMode_e1_0)?NEXUS_AacEncodeOutputMode_e1_0:NEXUS_AacEncodeOutputMode_e2_0;
267        break;
268    case NEXUS_AudioCodec_eAacPlusAdts:
269    case NEXUS_AudioCodec_eAacPlusLoas:
270        pSettings->codecSettings.aacPlus.bitRate = codecSettings.codecSettings.aacPlus.bitRate;
271        pSettings->codecSettings.aacPlus.outputMode = (codecSettings.codecSettings.aacPlus.channelMode == BAPE_ChannelMode_e1_0)?NEXUS_AacEncodeOutputMode_e1_0:NEXUS_AacEncodeOutputMode_e2_0;
272        break;
273    case NEXUS_AudioCodec_eMp3:
274        pSettings->codecSettings.mp3.bitRate = codecSettings.codecSettings.mp3.bitRate;
275        pSettings->codecSettings.mp3.privateBit = codecSettings.codecSettings.mp3.privateBit;
276        pSettings->codecSettings.mp3.copyrightBit = codecSettings.codecSettings.mp3.copyrightBit;
277        pSettings->codecSettings.mp3.originalBit = codecSettings.codecSettings.mp3.originalBit;
278        pSettings->codecSettings.mp3.emphasis = (NEXUS_AudioMpegEmphasis)codecSettings.codecSettings.mp3.emphasisMode;
279        BDBG_CASSERT((int)NEXUS_AudioMpegEmphasis_eMax==(int)BAPE_MpegEmphasisMode_eMax);
280        break;
281    case NEXUS_AudioCodec_eWmaStd:
282        pSettings->codecSettings.wmaStd.bitRate = codecSettings.codecSettings.wmaStd.bitRate;
283        pSettings->codecSettings.wmaStd.monoEncoding = (codecSettings.codecSettings.wmaStd.channelMode == BAPE_ChannelMode_e1_0)?true:false;
284    default:
285        break;
286    }
287}
288
289
290/***************************************************************************
291Summary:
292    Set Codec-Specific Settings for an Audio Encoder stage
293***************************************************************************/
294NEXUS_Error NEXUS_AudioEncoder_SetCodecSettings(
295    NEXUS_AudioEncoderHandle handle,
296    const NEXUS_AudioEncoderCodecSettings *pSettings
297    )
298{
299    BAVC_AudioCompressionStd magnumCodec;
300    BAPE_EncoderCodecSettings codecSettings;
301    BERR_Code errCode;
302    BDBG_OBJECT_ASSERT(handle, NEXUS_AudioEncoder);
303    BDBG_ASSERT(NULL != pSettings);
304    magnumCodec = NEXUS_Audio_P_CodecToMagnum(pSettings->codec);
305    BAPE_Encoder_GetCodecSettings(handle->encoder, magnumCodec, &codecSettings);
306    switch ( pSettings->codec )
307    {
308    case NEXUS_AudioCodec_eAc3:
309        codecSettings.codecSettings.ac3.spdifHeaderEnabled = pSettings->codecSettings.ac3.spdifHeaderEnabled;
310        break;
311    case NEXUS_AudioCodec_eDts:
312        codecSettings.codecSettings.dts.spdifHeaderEnabled = pSettings->codecSettings.dts.spdifHeaderEnabled;
313        break;
314    case NEXUS_AudioCodec_eAacAdts:
315    case NEXUS_AudioCodec_eAacLoas:
316        codecSettings.codecSettings.aac.bitRate = pSettings->codecSettings.aac.bitRate;
317        codecSettings.codecSettings.aac.channelMode = (pSettings->codecSettings.aac.outputMode ==NEXUS_AacEncodeOutputMode_e1_0)?BAPE_ChannelMode_e1_0:BAPE_ChannelMode_e2_0;
318        break;
319    case NEXUS_AudioCodec_eAacPlusAdts:
320    case NEXUS_AudioCodec_eAacPlusLoas:
321        codecSettings.codecSettings.aacPlus.bitRate = pSettings->codecSettings.aacPlus.bitRate;
322        codecSettings.codecSettings.aacPlus.channelMode = (pSettings->codecSettings.aacPlus.outputMode ==NEXUS_AacEncodeOutputMode_e1_0)?BAPE_ChannelMode_e1_0:BAPE_ChannelMode_e2_0;
323        break;
324    case NEXUS_AudioCodec_eMp3:
325        codecSettings.codecSettings.mp3.bitRate = pSettings->codecSettings.mp3.bitRate;
326        codecSettings.codecSettings.mp3.privateBit = pSettings->codecSettings.mp3.privateBit;
327        codecSettings.codecSettings.mp3.copyrightBit = pSettings->codecSettings.mp3.copyrightBit;
328        codecSettings.codecSettings.mp3.originalBit = pSettings->codecSettings.mp3.originalBit;
329        codecSettings.codecSettings.mp3.emphasisMode = (BAPE_MpegEmphasisMode)pSettings->codecSettings.mp3.emphasis;
330        break;
331    case NEXUS_AudioCodec_eWmaStd:
332        codecSettings.codecSettings.wmaStd.bitRate = pSettings->codecSettings.wmaStd.bitRate;
333        codecSettings.codecSettings.wmaStd.channelMode = pSettings->codecSettings.wmaStd.monoEncoding ? BAPE_ChannelMode_e1_0 : BAPE_ChannelMode_e2_0;
334        break;
335    default:
336        return BERR_SUCCESS;
337    }
338    errCode = BAPE_Encoder_SetCodecSettings(handle->encoder, &codecSettings);
339    if ( errCode )
340    {
341        return BERR_TRACE(errCode);
342    }
343    return BERR_SUCCESS;
344}
345
346/***************************************************************************
347Summary:
348    Get the audio connector for an Audio Encoder stage
349
350Description:
351This is used for a direct connection to SPDIF, as follows:
352
353    NEXUS_AudioOutput_AddInput(NEXUS_SpdifOutput_GetConnector(spdif), NEXUS_AudioEncoder_GetConnector(audioEncoder));
354
355***************************************************************************/
356NEXUS_AudioInput NEXUS_AudioEncoder_GetConnector( /* attr{shutdown=NEXUS_AudioInput_Shutdown} */
357    NEXUS_AudioEncoderHandle handle
358    )
359{
360    BDBG_OBJECT_ASSERT(handle, NEXUS_AudioEncoder);
361    return &handle->connector;
362}
363
364/***************************************************************************
365Summary:
366Add an input to this processing stage
367***************************************************************************/
368NEXUS_Error NEXUS_AudioEncoder_AddInput(
369    NEXUS_AudioEncoderHandle handle,
370    NEXUS_AudioInput input
371    )
372{
373    BERR_Code errCode;
374
375    BDBG_OBJECT_ASSERT(handle, NEXUS_AudioEncoder);
376    BDBG_ASSERT(NULL != input);
377
378    errCode = BAPE_Encoder_AddInput(handle->encoder, (BAPE_Connector)input->port);
379    if ( errCode )
380    {
381        return BERR_TRACE(errCode);
382    }
383
384    errCode = NEXUS_AudioInput_P_AddInput(&handle->connector, input);
385    if ( errCode )
386    {
387        (void)BAPE_Encoder_RemoveInput(handle->encoder, (BAPE_Connector)input->port);
388        return BERR_TRACE(errCode);
389    }
390
391    handle->input = input;
392    return BERR_SUCCESS;
393}
394
395/***************************************************************************
396Summary:
397Remove an input from this processing stage
398***************************************************************************/
399NEXUS_Error NEXUS_AudioEncoder_RemoveInput(
400    NEXUS_AudioEncoderHandle handle,
401    NEXUS_AudioInput input
402    )
403{
404    BDBG_OBJECT_ASSERT(handle, NEXUS_AudioEncoder);
405    BDBG_ASSERT(NULL != input);
406    if ( input != handle->input )
407    {
408        return BERR_TRACE(BERR_INVALID_PARAMETER);
409    }
410    (void)BAPE_Encoder_RemoveInput(handle->encoder, (BAPE_Connector)input->port);
411    handle->input = NULL;
412    return NEXUS_AudioInput_P_RemoveInput(&handle->connector, input);
413}
414
415/***************************************************************************
416Summary:
417Remove all inputs from this processing stage
418***************************************************************************/
419NEXUS_Error NEXUS_AudioEncoder_RemoveAllInputs(
420    NEXUS_AudioEncoderHandle handle
421    )
422{
423    if ( handle->input ) 
424    {
425        return NEXUS_AudioEncoder_RemoveInput(handle, handle->input);
426    }
427    return NEXUS_SUCCESS;
428}
429
Note: See TracBrowser for help on using the repository browser.