1/*
2 * Copyright (C) 2011 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16/**
17 ******************************************************************************
18 * @file    M4PTO3GPP_InternalTypes.h
19 * @brief    Picture to 3gpp Service internal definitions
20 * @note    This file contains all enum and types not visible to the external world.
21 ******************************************************************************
22 */
23
24
25#ifndef __M4PTO3GPP_INTERNALTYPES_H__
26#define __M4PTO3GPP_INTERNALTYPES_H__
27
28#define M4PTO3GPP_VERSION_MAJOR        3
29#define M4PTO3GPP_VERSION_MINOR        0
30#define M4PTO3GPP_VERSION_REVISION    6
31
32/**
33 *    M4PTO3GPP public API and types */
34#include "M4PTO3GPP_API.h"
35#include "M4_Utils.h"
36
37/**
38 *    Internally used modules */
39
40#include "M4WRITER_common.h"    /* Write 3GPP file    */
41#include "M4READER_Common.h"    /* Read AMR file    */
42#include "M4ENCODER_common.h"
43
44
45#ifdef __cplusplus
46extern "C" {
47#endif
48
49/**
50 ******************************************************************************
51 * enum            M4PTO3GPP_States
52 * @brief        Main state machine of the M4PTO3GPP.
53 ******************************************************************************
54 */
55typedef enum
56{
57    M4PTO3GPP_kState_CREATED         = 0,    /**< M4PTO3GPP_Init has been called */
58    M4PTO3GPP_kState_OPENED          = 1,    /**< M4PTO3GPP_Open has been called */
59    M4PTO3GPP_kState_READY           = 2,    /**< Step can be called */
60    M4PTO3GPP_kState_FINISHED        = 3,    /**< Transcoding is finished */
61    M4PTO3GPP_kState_CLOSED          = 4     /**< Output file has been created */
62}
63M4PTO3GPP_States;
64
65/**
66 ******************************************************************************
67 * enum            M4PTO3GPP_StreamState
68 * @brief        State of a media stream encoding (audio or video).
69 ******************************************************************************
70 */
71typedef enum
72{
73    M4PTO3GPP_kStreamState_NOSTREAM  = 0,    /**< No stream present */
74    M4PTO3GPP_kStreamState_STARTED   = 1,    /**< The stream encoding is in progress */
75    M4PTO3GPP_kStreamState_FINISHED  = 2    /**< The stream has finished encoding */
76}
77M4PTO3GPP_StreamState;
78
79/*
80 * Definition of max AU size */
81#define M4PTO3GPP_VIDEO_MIN_COMPRESSION_RATIO     0.8F    /**< Max AU size will be 0.8 times the
82                                                               YUV4:2:0 frame size */
83#define M4PTO3GPP_VIDEO_AU_SIZE_TO_CHUNCK_SIZE_RATIO    1.2F /**< Max chunk size will be 1.2 times
84                                                                  the max AU size */
85#define M4PTO3GPP_AUDIO_MAX_AU_SIZE              1000    /**< AAC max AU size seems to be
86                                                              about 850 bytes */
87#define M4PTO3GPP_AUDIO_MAX_CHUNK_SIZE           5000
88
89/**
90 ******************************************************************************
91 * enum            anonymous enum
92 * @brief        enum to keep track of the encoder state
93 ******************************************************************************
94 */
95enum
96{
97    M4PTO3GPP_kNoEncoder,
98    M4PTO3GPP_kEncoderClosed,
99    M4PTO3GPP_kEncoderStopped,
100    M4PTO3GPP_kEncoderRunning
101};
102
103/**
104 ******************************************************************************
105 * structure    M4PTO3GPP_InternalContext
106 * @brief        This structure defines the M4PTO3GPP context (private)
107 * @note        This structure is used for all M4PTO3GPP calls to store the context
108 ******************************************************************************
109 */
110typedef struct
111{
112    /**
113     *    M4PTO3GPP main variables */
114    M4PTO3GPP_States             m_State;            /**< M4PTO3GPP internal state */
115    M4PTO3GPP_Params             m_Params;           /**< M4PTO3GPP parameters, set by the user */
116    M4PTO3GPP_StreamState        m_VideoState;       /**< State of the video encoding */
117    M4PTO3GPP_StreamState        m_AudioState;       /**< State of the audio encoding */
118
119    /**
120     *    OSAL file read/write functions */
121    M4OSA_FileReadPointer*        pOsalFileRead;     /**< OSAL file read functions,
122                                                           to be provided by user */
123    M4OSA_FileWriterPointer*      pOsalFileWrite;    /**< OSAL file write functions,
124                                                          to be provided by user */
125
126    /**
127     *    Reader stuff */
128    M4_AccessUnit*                m_pReaderAudioAU;    /**< Read audio access unit */
129    M4_AudioStreamHandler*        m_pReaderAudioStream;/**< Description of the read audio stream */
130
131    /**
132     *    Writer stuff */
133    M4SYS_AccessUnit            m_WriterVideoAU;       /**< Written video access unit */
134    M4SYS_AccessUnit            m_WriterAudioAU;       /**< Written audio access unit */
135    M4ENCODER_Header*           m_pEncoderHeader;      /**< Sequence header returned by the
136                                                            encoder at encoder create (if any) */
137    M4SYS_StreamDescription*    m_pWriterVideoStream;  /**< Description of the written
138                                                             video stream */
139    M4SYS_StreamDescription*    m_pWriterAudioStream;  /**< Description of the written
140                                                             audio stream */
141    M4WRITER_StreamVideoInfos*  m_pWriterVideoStreamInfo;    /**< Video properties of the written
142                                                               video stream */
143    M4WRITER_StreamAudioInfos*    m_pWriterAudioStreamInfo;   /**< Audio properties of the written
144                                                               audio stream */
145
146    /**
147     *    Contexts of the used modules  */
148    M4OSA_Void*                    m_pAudioReaderContext; /**< Context of the audio reader module*/
149    M4OSA_Void*                    m_p3gpWriterContext;   /**< Context of the 3GP writer module */
150    M4OSA_Void*                    m_pMp4EncoderContext;  /**< Mp4 encoder context */
151    M4OSA_UInt32                   m_eEncoderState;
152
153    /**
154     * Reader Interfaces */
155    M4READER_GlobalInterface*    m_pReaderGlobInt;    /**< Reader common interface, global part */
156    M4READER_DataInterface*      m_pReaderDataInt;     /**< Reader common interface, data part */
157
158    /**
159     * Writer Interfaces */
160    M4WRITER_GlobalInterface*   m_pWriterGlobInt;     /**< Writer common interface, global part */
161    M4WRITER_DataInterface*     m_pWriterDataInt;     /**< Writer common interface, data part */
162
163    /**
164     * Encoder Interfaces */
165    M4ENCODER_GlobalInterface*  m_pEncoderInt;                /**< Encoder common interface */
166    M4OSA_Void*                 m_pEncoderExternalAPI;
167    M4OSA_Void*                 m_pEncoderUserData;
168
169    /**
170     * */
171    M4VIFI_ImagePlane*            pSavedPlane;
172    M4OSA_UInt32                  uiSavedDuration;
173
174    /**
175     *    Video rate control stuff */
176    M4_MediaTime                m_dLastVideoRegulCts; /**< Last time (CTS) the video bitrate
177                                                           regulation has been called */
178    M4_MediaTime                m_mtCts;         /**< Current video cts */
179    M4_MediaTime                m_mtNextCts;     /**< Next video CTS to transcode */
180    M4_MediaTime                m_mtAudioCts;    /**< Current audio cts */
181    M4_MediaTime                m_AudioOffSet;   /**< Audio Offset to add to the cts in loop mode*/
182    M4_MediaTime                m_PrevAudioCts;  /**< Previous audio cts for AAC looping */
183    M4_MediaTime                m_DeltaAudioCts; /**< Delta audio cts for AAC looping */
184    M4OSA_UInt32                m_CurrentFileSize; /**< Current Output file size  */
185    M4OSA_UInt32                m_MaxFileSize;     /**< Max Output file size  */
186    M4OSA_Bool                  m_IsLastPicture;   /**< A boolean that signals to the encoder that
187                                                       this is the last frame to be encoded*/
188    M4OSA_Bool                  m_bLastInternalCallBack;
189    M4OSA_UInt32                m_NbCurrentFrame;  /**< Index of the current YUV frame encoded */
190
191    /**
192     *    Audio padding mode */
193    M4OSA_Bool                    m_bAudioPaddingSilence;  /**< A boolean that signals that audio
194                                                                AU will be padded by silence */
195} M4PTO3GPP_InternalContext;
196
197
198
199/**
200 ******************************************************************************
201 * M4OSA_ERR M4PTO3GPP_applyVPP(M4VPP_Context pContext, M4VIFI_ImagePlane* pPlaneIn,
202 *                                  M4VIFI_ImagePlane* pPlaneOut)
203 * @brief    Call an external callback to get the picture to encode
204 * @note    It is called by the video encoder
205 * @param    pContext    (IN) VPP context, which actually is the M4PTO3GPP
206 *                            internal context in our case
207 * @param    pPlaneIn    (IN) Contains the image
208 * @param    pPlaneOut    (IN/OUT) Pointer to an array of 3 planes that will contain the
209 *                        output YUV420 image read with the m_pPictureCallbackFct
210 * @return    M4NO_ERROR:    No error
211 * @return    Any error returned by an underlaying module
212 ******************************************************************************
213 */
214M4OSA_ERR M4PTO3GPP_applyVPP(M4VPP_Context pContext, M4VIFI_ImagePlane* pPlaneIn,
215 M4VIFI_ImagePlane* pPlaneOut);
216
217
218#ifdef __cplusplus
219}
220#endif
221
222#endif /* __M4PTO3GPP_INTERNALTYPES_H__ */
223
224