blob: 592e566b9b0718685f2aceded4615d25aa051478 [file] [log] [blame]
/*
* Copyright (C) 2011 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
******************************************************************************
* @file M4PTO3GPP_InternalTypes.h
* @brief Picture to 3gpp Service internal definitions
* @note This file contains all enum and types not visible to the external world.
******************************************************************************
*/
#ifndef __M4PTO3GPP_INTERNALTYPES_H__
#define __M4PTO3GPP_INTERNALTYPES_H__
#define M4PTO3GPP_VERSION_MAJOR 3
#define M4PTO3GPP_VERSION_MINOR 0
#define M4PTO3GPP_VERSION_REVISION 6
/**
* M4PTO3GPP public API and types */
#include "M4PTO3GPP_API.h"
#include "M4_Utils.h"
/**
* Internally used modules */
#include "M4WRITER_common.h" /* Write 3GPP file */
#include "M4READER_Common.h" /* Read AMR file */
#include "M4ENCODER_common.h"
#ifdef __cplusplus
extern "C" {
#endif
/**
******************************************************************************
* enum M4PTO3GPP_States
* @brief Main state machine of the M4PTO3GPP.
******************************************************************************
*/
typedef enum
{
M4PTO3GPP_kState_CREATED = 0, /**< M4PTO3GPP_Init has been called */
M4PTO3GPP_kState_OPENED = 1, /**< M4PTO3GPP_Open has been called */
M4PTO3GPP_kState_READY = 2, /**< Step can be called */
M4PTO3GPP_kState_FINISHED = 3, /**< Transcoding is finished */
M4PTO3GPP_kState_CLOSED = 4 /**< Output file has been created */
}
M4PTO3GPP_States;
/**
******************************************************************************
* enum M4PTO3GPP_StreamState
* @brief State of a media stream encoding (audio or video).
******************************************************************************
*/
typedef enum
{
M4PTO3GPP_kStreamState_NOSTREAM = 0, /**< No stream present */
M4PTO3GPP_kStreamState_STARTED = 1, /**< The stream encoding is in progress */
M4PTO3GPP_kStreamState_FINISHED = 2 /**< The stream has finished encoding */
}
M4PTO3GPP_StreamState;
/*
* Definition of max AU size */
#define M4PTO3GPP_VIDEO_MIN_COMPRESSION_RATIO 0.8F /**< Max AU size will be 0.8 times the
YUV4:2:0 frame size */
#define M4PTO3GPP_VIDEO_AU_SIZE_TO_CHUNCK_SIZE_RATIO 1.2F /**< Max chunk size will be 1.2 times
the max AU size */
#define M4PTO3GPP_AUDIO_MAX_AU_SIZE 1000 /**< AAC max AU size seems to be
about 850 bytes */
#define M4PTO3GPP_AUDIO_MAX_CHUNK_SIZE 5000
/**
******************************************************************************
* enum anonymous enum
* @brief enum to keep track of the encoder state
******************************************************************************
*/
enum
{
M4PTO3GPP_kNoEncoder,
M4PTO3GPP_kEncoderClosed,
M4PTO3GPP_kEncoderStopped,
M4PTO3GPP_kEncoderRunning
};
/**
******************************************************************************
* structure M4PTO3GPP_InternalContext
* @brief This structure defines the M4PTO3GPP context (private)
* @note This structure is used for all M4PTO3GPP calls to store the context
******************************************************************************
*/
typedef struct
{
/**
* M4PTO3GPP main variables */
M4PTO3GPP_States m_State; /**< M4PTO3GPP internal state */
M4PTO3GPP_Params m_Params; /**< M4PTO3GPP parameters, set by the user */
M4PTO3GPP_StreamState m_VideoState; /**< State of the video encoding */
M4PTO3GPP_StreamState m_AudioState; /**< State of the audio encoding */
/**
* OSAL file read/write functions */
M4OSA_FileReadPointer* pOsalFileRead; /**< OSAL file read functions,
to be provided by user */
M4OSA_FileWriterPointer* pOsalFileWrite; /**< OSAL file write functions,
to be provided by user */
/**
* Reader stuff */
M4_AccessUnit* m_pReaderAudioAU; /**< Read audio access unit */
M4_AudioStreamHandler* m_pReaderAudioStream;/**< Description of the read audio stream */
/**
* Writer stuff */
M4SYS_AccessUnit m_WriterVideoAU; /**< Written video access unit */
M4SYS_AccessUnit m_WriterAudioAU; /**< Written audio access unit */
M4ENCODER_Header* m_pEncoderHeader; /**< Sequence header returned by the
encoder at encoder create (if any) */
M4SYS_StreamDescription* m_pWriterVideoStream; /**< Description of the written
video stream */
M4SYS_StreamDescription* m_pWriterAudioStream; /**< Description of the written
audio stream */
M4WRITER_StreamVideoInfos* m_pWriterVideoStreamInfo; /**< Video properties of the written
video stream */
M4WRITER_StreamAudioInfos* m_pWriterAudioStreamInfo; /**< Audio properties of the written
audio stream */
/**
* Contexts of the used modules */
M4OSA_Void* m_pAudioReaderContext; /**< Context of the audio reader module*/
M4OSA_Void* m_p3gpWriterContext; /**< Context of the 3GP writer module */
M4OSA_Void* m_pMp4EncoderContext; /**< Mp4 encoder context */
M4OSA_UInt32 m_eEncoderState;
/**
* Reader Interfaces */
M4READER_GlobalInterface* m_pReaderGlobInt; /**< Reader common interface, global part */
M4READER_DataInterface* m_pReaderDataInt; /**< Reader common interface, data part */
/**
* Writer Interfaces */
M4WRITER_GlobalInterface* m_pWriterGlobInt; /**< Writer common interface, global part */
M4WRITER_DataInterface* m_pWriterDataInt; /**< Writer common interface, data part */
/**
* Encoder Interfaces */
M4ENCODER_GlobalInterface* m_pEncoderInt; /**< Encoder common interface */
M4OSA_Void* m_pEncoderExternalAPI;
M4OSA_Void* m_pEncoderUserData;
/**
* */
M4VIFI_ImagePlane* pSavedPlane;
M4OSA_UInt32 uiSavedDuration;
/**
* Video rate control stuff */
M4_MediaTime m_dLastVideoRegulCts; /**< Last time (CTS) the video bitrate
regulation has been called */
M4_MediaTime m_mtCts; /**< Current video cts */
M4_MediaTime m_mtNextCts; /**< Next video CTS to transcode */
M4_MediaTime m_mtAudioCts; /**< Current audio cts */
M4_MediaTime m_AudioOffSet; /**< Audio Offset to add to the cts in loop mode*/
M4_MediaTime m_PrevAudioCts; /**< Previous audio cts for AAC looping */
M4_MediaTime m_DeltaAudioCts; /**< Delta audio cts for AAC looping */
M4OSA_UInt32 m_CurrentFileSize; /**< Current Output file size */
M4OSA_UInt32 m_MaxFileSize; /**< Max Output file size */
M4OSA_Bool m_IsLastPicture; /**< A boolean that signals to the encoder that
this is the last frame to be encoded*/
M4OSA_Bool m_bLastInternalCallBack;
M4OSA_UInt32 m_NbCurrentFrame; /**< Index of the current YUV frame encoded */
/**
* Audio padding mode */
M4OSA_Bool m_bAudioPaddingSilence; /**< A boolean that signals that audio
AU will be padded by silence */
} M4PTO3GPP_InternalContext;
/**
******************************************************************************
* M4OSA_ERR M4PTO3GPP_applyVPP(M4VPP_Context pContext, M4VIFI_ImagePlane* pPlaneIn,
* M4VIFI_ImagePlane* pPlaneOut)
* @brief Call an external callback to get the picture to encode
* @note It is called by the video encoder
* @param pContext (IN) VPP context, which actually is the M4PTO3GPP
* internal context in our case
* @param pPlaneIn (IN) Contains the image
* @param pPlaneOut (IN/OUT) Pointer to an array of 3 planes that will contain the
* output YUV420 image read with the m_pPictureCallbackFct
* @return M4NO_ERROR: No error
* @return Any error returned by an underlaying module
******************************************************************************
*/
M4OSA_ERR M4PTO3GPP_applyVPP(M4VPP_Context pContext, M4VIFI_ImagePlane* pPlaneIn,
M4VIFI_ImagePlane* pPlaneOut);
#ifdef __cplusplus
}
#endif
#endif /* __M4PTO3GPP_INTERNALTYPES_H__ */