M4AD_Common.h revision 01158eac3464fc6e7837be594d6a8d14172154bc
1b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten/*
2b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten * Copyright (C) 2011 The Android Open Source Project
3b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten *
4b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten * Licensed under the Apache License, Version 2.0 (the "License");
5b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten * you may not use this file except in compliance with the License.
6b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten * You may obtain a copy of the License at
7b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten *
8b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten *      http://www.apache.org/licenses/LICENSE-2.0
9b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten *
10b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten * Unless required by applicable law or agreed to in writing, software
11b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten * distributed under the License is distributed on an "AS IS" BASIS,
12b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten * See the License for the specific language governing permissions and
14b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten * limitations under the License.
15b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten */
16b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten/**
17095ce2204cc75a50d9f1df60d1c8f357209a7c3dGlenn Kasten ************************************************************************
18095ce2204cc75a50d9f1df60d1c8f357209a7c3dGlenn Kasten * @fil        M4AD_Common.h
19b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten * @brief    Audio Shell Decoder common interface declaration
20c6853892c94800e72c0bd676d5d2136d48cea76eGlenn Kasten * @note    This file declares the common interfaces that audio decoder shells must implement
21b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten ************************************************************************
22b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten*/
23b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten#ifndef __M4AD_COMMON_H__
24b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten#define __M4AD_COMMON_H__
25b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten
26b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten#include "M4OSA_Types.h"
27b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten#include "M4OSA_Error.h"
28b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten#include "M4OSA_OptionID.h"
29b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten#include "M4OSA_CoreID.h"
30b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten#include "M4DA_Types.h"
31b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten#include "M4TOOL_VersionInfo.h"
32095ce2204cc75a50d9f1df60d1c8f357209a7c3dGlenn Kasten
33b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten#ifdef __cplusplus
34b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kastenextern "C" {
35b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten#endif
36b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten
37b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten
38b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kastentypedef M4OSA_Void* M4AD_Context;
39b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten
40b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten/**
41b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten ************************************************************************
42b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten * enum     M4AD_OptionID
43b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten * @brief    This enum defines the Audio decoder options.
44b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten * @note    These options can be read from or written to a decoder via
45b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten *            M4AD_getOption_fct/M4AD_setOption_fct
46b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten ************************************************************************
47b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten*/
48b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kastentypedef enum
49b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten{
50b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten    /**
51b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten     * Set the flag of presence of protection */
52b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten    M4AD_kOptionID_ProtectionAbsent = M4OSA_OPTION_ID_CREATE(M4_WRITE, M4DECODER_AUDIO, 0x01),
53b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten
54b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten    /**
55b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten     * Set the number of frames per bloc */
56b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten    M4AD_kOptionID_NbFramePerBloc    = M4OSA_OPTION_ID_CREATE(M4_WRITE, M4DECODER_AUDIO, 0x02),
57b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten
58b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten    /**
59b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten     * Set the AAC decoder user parameters */
60c0b196d740ef7a60728a014be0eaadb0dbc1d7aeGlenn Kasten    M4AD_kOptionID_UserParam        = M4OSA_OPTION_ID_CREATE(M4_WRITE, M4DECODER_AUDIO, 0x03),
61b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten
62e629abc58c2acadc7487ea71c1e063f8f8989199Glenn Kasten
63b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten    /**
64b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten     * Get the AAC steam type */
65c0b196d740ef7a60728a014be0eaadb0dbc1d7aeGlenn Kasten    M4AD_kOptionID_StreamType        = M4OSA_OPTION_ID_CREATE(M4_READ , M4DECODER_AUDIO, 0x10),
66c0b196d740ef7a60728a014be0eaadb0dbc1d7aeGlenn Kasten
67c0b196d740ef7a60728a014be0eaadb0dbc1d7aeGlenn Kasten    /**
68b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten     * Get the number of used bytes in the latest decode
69c0b196d740ef7a60728a014be0eaadb0dbc1d7aeGlenn Kasten     (used only when decoding AAC from ADIF file) */
70b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten    M4AD_kOptionID_UsedBytes        = M4OSA_OPTION_ID_CREATE(M4_READ , M4DECODER_AUDIO, 0x11)
71b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten
72b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten} M4AD_OptionID;
73b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten
74b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten
75a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi
76a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivitypedef enum
77b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten{
78b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten    M4_kUnknown = 0,    /* Unknown stream type */
79b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten    M4_kAAC,            /* M4_kAAC_MAIN or M4_kAAC_LC or M4_kAAC_SSR or M4_kAAC_LTP    */
80b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten    M4_kAACplus,        /* Decoder type is AAC plus */
81b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten    M4_keAACplus        /* Decoder type is enhanced AAC plus */
82b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten} M4_AACType;
83b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten
84b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten/**
85b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten ************************************************************************
86b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten * enum     M4AD_Type
87b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten * @brief    This enum defines the audio types used to create decoders
88b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten * @note    This enum is used internally by the VPS to identify a currently supported
89b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten *            audio decoder interface. Each decoder is registered with one of this type associated.
90b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten *            When a decoder instance is needed, this type is used to identify
91b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten *            and retrieve its interface.
92b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten ************************************************************************
93b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten*/
94b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kastentypedef enum
95b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten{
96b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten    M4AD_kTypeAMRNB = 0,
97b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten    M4AD_kTypeAMRWB,
98b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten    M4AD_kTypeAAC,
99b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten    M4AD_kTypeMP3,
100b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten    M4AD_kTypePCM,
101b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten    M4AD_kTypeBBMusicEngine,
102b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten    M4AD_kTypeWMA,
103a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi    M4AD_kTypeRMA,
104a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi    M4AD_kTypeADPCM,
105b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten    M4AD_kType_NB  /* number of decoders, keep it as last enum entry */
106b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten
107b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten} M4AD_Type ;
108b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten
109b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten
110b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten
111b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten/**
112b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten ************************************************************************
113b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten * structure    M4AD_Buffer
114b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten * @brief        Structure to describe a buffer
115b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten ************************************************************************
116b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten*/
117b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kastentypedef struct
118b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten{
119b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten    M4OSA_MemAddr8    m_dataAddress;
120b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten    M4OSA_UInt32    m_bufferSize;
121b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten    int64_t         m_timeStampUs;
122b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten} M4AD_Buffer;
123b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten
124b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten/**
125b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten ************************************************************************
126b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten * @brief    Creates an instance of the decoder
127b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten * @note    Allocates the context
128b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten *
129b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten * @param    pContext:        (OUT)    Context of the decoder
130b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten * @param    pStreamHandler:    (IN)    Pointer to an audio stream description
131b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten * @param    pUserData:        (IN)    Pointer to User data
132b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten *
133b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten * @return    M4NO_ERROR                 there is no error
134b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten * @return  M4ERR_STATE             State automaton is not applied
135b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten * @return    M4ERR_ALLOC                a memory allocation has failed
136b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten * @return    M4ERR_PARAMETER            at least one parameter is not properly set (in DEBUG only)
137b9fa556e62aa6e0c8a59f224136e509df813cfc7Glenn Kasten ************************************************************************
138*/
139
140typedef M4OSA_ERR  (M4AD_create_fct)(M4AD_Context *pContext,
141                                     M4_AudioStreamHandler *pStreamHandler, void* pUserData);
142
143
144/**
145 ************************************************************************
146 * @brief    Destroys the instance of the decoder
147 * @note    After this call the context is invalid
148 *
149 * @param    context:    (IN)    Context of the decoder
150 *
151 * @return    M4NO_ERROR             There is no error
152 * @return  M4ERR_PARAMETER     The context is invalid (in DEBUG only)
153 ************************************************************************
154*/
155typedef M4OSA_ERR  (M4AD_destroy_fct)    (M4AD_Context context);
156
157/**
158 ************************************************************************
159 * @brief   Decodes the given audio data
160 * @note    Parses and decodes the next audio frame, from the given buffer.
161 *            This function changes pInputBufferSize value according to the amount
162 *            of data actually read.
163 *
164 * @param    context:            (IN)    Context of the decoder
165 * @param    inputBuffer:        (IN/OUT)Input Data buffer. It contains at least one audio frame.
166 *                                       The size of the buffer must be updated inside the
167 *                                       function to reflect the size of the actually decoded data.
168 *                                       (e.g. the first frame in pInputBuffer)
169 * @param   decodedPCMBuffer:    (OUT)   Output PCM buffer (decoded data).
170 * @param   jumping:            (IN)    M4OSA_TRUE if a jump was just done, M4OSA_FALSE otherwise.
171 * @return    M4NO_ERROR                 there is no error
172 * @return    M4ERR_PARAMETER            at least one parameter is not properly set
173 ************************************************************************
174*/
175typedef M4OSA_ERR  (M4AD_step_fct)    (M4AD_Context context, M4AD_Buffer *pInputBuffer,
176                                     M4AD_Buffer *pDecodedPCMBuffer, M4OSA_Bool jumping);
177
178/**
179 ************************************************************************
180 * @brief    Gets the decoder version
181 * @note    The version is given in a M4_VersionInfo structure
182 *
183 * @param    pValue:        (OUT)        Pointer to the version structure
184 *
185 * @return    M4NO_ERROR                 there is no error
186 * @return  M4ERR_PARAMETER         The given pointer is null (in DEBUG only)
187 ************************************************************************
188*/
189typedef M4OSA_ERR  (M4AD_getVersion_fct)(M4_VersionInfo* pVersionInfo);
190
191
192/**
193 ************************************************************************
194 * @brief    This function creates the AAC core decoder according to
195 *            the stream properties and to the options that may
196 *            have been set using M4AD_setOption_fct
197 * @note    Creates an instance of the AAC decoder
198 * @note    This function is used especially by the AAC decoder
199 *
200 * @param    pContext:        (IN/OUT)    Context of the decoder
201 * @param    pStreamHandler:    (IN)    Pointer to an audio stream description
202 *
203 * @return    M4NO_ERROR                 there is no error
204 * @return  M4ERR_STATE             State automaton is not applied
205 * @return    M4ERR_ALLOC                a memory allocation has failed
206 * @return    M4ERR_PARAMETER            at least one parameter is not properly set (in DEBUG only)
207 ************************************************************************
208*/
209typedef M4OSA_ERR  (M4AD_start_fct)    (M4AD_Context pContext);
210
211/**
212 ************************************************************************
213 * @brief    Reset the instance of the decoder
214 *
215 * @param    context:    (IN)    Context of the decoder
216 *
217 * @return    M4NO_ERROR             There is no error
218 * @return  M4ERR_PARAMETER     The context is invalid (in DEBUG only)
219 ************************************************************************
220*/
221typedef M4OSA_ERR  (M4AD_reset_fct)    (M4AD_Context context);
222
223
224/**
225 ************************************************************************
226 * @brief   set en option value of the audio decoder
227 *
228 * @param    context:        (IN)    Context of the decoder
229 * @param    optionId:        (IN)    indicates the option to set
230 * @param    pValue:            (IN)    pointer to structure or value (allocated by user)
231 *                                  where option is stored
232 * @return    M4NO_ERROR                 there is no error
233 * @return    M4ERR_BAD_CONTEXT        provided context is not a valid one
234 * @return    M4ERR_PARAMETER            at least one parameter is not properly set
235 * @return    M4ERR_BAD_OPTION_ID        when the option ID is not a valid one
236 ************************************************************************
237*/
238typedef M4OSA_ERR (M4AD_setOption_fct) (M4AD_Context context,
239                                         M4OSA_OptionID optionId, M4OSA_DataOption pValue);
240
241/**
242 ************************************************************************
243 * @brief   Get en option value of the audio decoder
244 *
245 * @param    context:        (IN)    Context of the decoder
246 * @param    optionId:        (IN)    indicates the option to set
247 * @param    pValue:            (OUT)    pointer to structure or value (allocated by user)
248 *                                  where option is stored
249 * @return    M4NO_ERROR                 there is no error
250 * @return    M4ERR_BAD_CONTEXT        provided context is not a valid one
251 * @return    M4ERR_PARAMETER            at least one parameter is not properly set
252 * @return    M4ERR_BAD_OPTION_ID        when the option ID is not a valid one
253 ************************************************************************
254*/
255typedef M4OSA_ERR (M4AD_getOption_fct) (M4AD_Context context, M4OSA_OptionID optionId,
256                                         M4OSA_DataOption pValue);
257/**
258 ************************************************************************
259 * structure    M4AD_Interface
260 * @brief        This structure defines the generic audio decoder interface
261 * @note        This structure stores the pointers to functions of one audio decoder type.
262 *                The decoder type is one of the M4AD_Type
263 ************************************************************************
264*/
265typedef struct _M4AD_Interface
266{
267
268    M4AD_create_fct*        m_pFctCreateAudioDec;
269    M4AD_start_fct*            m_pFctStartAudioDec;
270    M4AD_step_fct*            m_pFctStepAudioDec;
271    M4AD_getVersion_fct*    m_pFctGetVersionAudioDec;
272    M4AD_destroy_fct*        m_pFctDestroyAudioDec;
273    M4AD_reset_fct*            m_pFctResetAudioDec;
274    M4AD_setOption_fct*        m_pFctSetOptionAudioDec;
275    M4AD_getOption_fct*        m_pFctGetOptionAudioDec;
276
277} M4AD_Interface;
278
279#ifdef __cplusplus
280}
281#endif
282
283#endif /*__M4AD_COMMON_H__*/
284
285