/*
* 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 M4READER_3gpCom.h
* @brief Generic encapsulation of the core 3gp reader
* @note This file declares the generic shell interface retrieving function
* of the 3GP reader
************************************************************************
*/
#ifndef __M4READER_3GPCOM_H__
#define __M4READER_3GPCOM_H__
#include "NXPSW_CompilerSwitches.h"
#include "M4OSA_Types.h"
#include "M4OSA_Error.h"
#include "M4READER_Common.h"
#ifdef __cplusplus
extern "C" {
#endif
/**
* Error: Function M4READER_Com3GP_getNextStreamHandler must be called before.
*/
#define M4ERR_NO_VIDEO_STREAM_RETRIEVED_YET M4OSA_ERR_CREATE(M4_ERR, M4READER_3GP, 0x000001)
/**
* Error: No video stream H263 in file.
*/
#define M4ERR_VIDEO_NOT_H263 M4OSA_ERR_CREATE(M4_ERR, M4READER_3GP, 0x000002)
/**
* There has been a problem with the decoder configuration information, seems to be invalid */
#define M4ERR_READER3GP_DECODER_CONFIG_ERROR M4OSA_ERR_CREATE(M4_ERR, M4READER_3GP, 0x000003)
#define M4READER_COM3GP_MAXVIDEOSTREAM 5
#define M4READER_COM3GP_MAXAUDIOSTREAM 5
#define M4READER_COM3GP_MAXTEXTSTREAM 5
typedef struct
{
M4OSA_Context m_pFFContext; /**< core file format context */
M4_StreamHandler* m_AudioStreams[M4READER_COM3GP_MAXAUDIOSTREAM];
M4_StreamHandler* m_pAudioStream; /**< pointer to the current allocated audio
stream handler */
M4_StreamHandler* m_VideoStreams[M4READER_COM3GP_MAXVIDEOSTREAM];
M4_StreamHandler* m_pVideoStream; /**< pointer to the current allocated video
stream handler */
#ifdef M4VPS_SUPPORT_TTEXT
M4_StreamHandler* m_TextStreams[M4READER_COM3GP_MAXTEXTSTREAM];
M4_StreamHandler* m_pTextStream; /**< pointer to the current allocated text
stream handler */
#endif /*M4VPS_SUPPORT_TTEXT*/
} M4READER_Com3GP_Context;
/**
************************************************************************
* structure M4READER_3GP_Buffer (but nothing specific to 3GP, nor to a reader !)
* @brief This structure defines a buffer that can be used to exchange data (should be in OSAL)
************************************************************************
*/
typedef struct
{
M4OSA_UInt32 size; /**< the size in bytes of the buffer */
M4OSA_MemAddr8 dataAddress; /**< the pointer to the buffer */
} M4READER_3GP_Buffer;
/**
************************************************************************
* enum M4READER_3GP_OptionID
* @brief This enum defines the reader options specific to the 3GP format.
* @note These options can be read from or written to a 3GP reader via M4READER_3GP_getOption.
************************************************************************
*/
typedef enum
{
/**
* Get the DecoderConfigInfo for H263,
* option value must be a pointer to M4READER_3GP_H263Properties allocated by caller */
M4READER_3GP_kOptionID_H263Properties = M4OSA_OPTION_ID_CREATE(M4_READ, M4READER_3GP, 0x01),
/**
* Get the Purple Labs drm information */
M4READER_3GP_kOptionID_PurpleLabsDrm = M4OSA_OPTION_ID_CREATE(M4_READ, M4READER_3GP, 0x02),
/**
* Set the Fast open mode (Only the first AU of each stream will be parsed -> less CPU,
less RAM). */
M4READER_3GP_kOptionID_FastOpenMode = M4OSA_OPTION_ID_CREATE(M4_WRITE, M4READER_3GP, 0x03),
/**
* Set the Audio only mode (the video stream won't be opened) */
M4READER_3GP_kOptionID_AudioOnly = M4OSA_OPTION_ID_CREATE(M4_WRITE, M4READER_3GP, 0x04),
/**
* Set the Video only mode (the audio stream won't be opened) */
M4READER_3GP_kOptionID_VideoOnly = M4OSA_OPTION_ID_CREATE(M4_WRITE, M4READER_3GP, 0x05),
/**
* Get the next video CTS */
M4READER_3GP_kOptionID_getNextVideoCTS = M4OSA_OPTION_ID_CREATE(M4_READ, M4READER_3GP, 0x06)
} M4READER_3GP_OptionID;
/**
************************************************************************
* struct M4READER_3GP_H263Properties
* @brief Contains info about H263 stream read from the 3GP file.
************************************************************************
*/
typedef struct
{
/**< the profile as defined in the Visual Object Sequence header, if present */
M4OSA_UInt8 uiProfile;
/**< the level as defined in the Visual Object Sequence header, if present */
M4OSA_UInt8 uiLevel;
} M4READER_3GP_H263Properties;
/**
************************************************************************
* @brief Get the next stream found in the 3gp file
* @note
* @param pContext: (IN) Context of the reader
* @param pMediaFamily: (OUT) Pointer to a user allocated M4READER_MediaFamily that will
* be filled with the media family of the found stream
* @param pStreamHandler: (OUT) Pointer to a stream handler that will be allocated and
* filled with the found stream description
* @return M4NO_ERROR There is no error
* @return M4ERR_PARAMETER At least one parameter is not properly set
* @return M4WAR_NO_MORE_STREAM No more available stream in the media (all streams found)
************************************************************************
*/
M4OSA_ERR M4READER_Com3GP_getNextStreamHandler(M4OSA_Context context,
M4READER_MediaFamily *pMediaFamily,
M4_StreamHandler **pStreamHandler);
/**
************************************************************************
* @brief Prepare the access unit (AU)
* @note An AU is the smallest possible amount of data to be decoded by a decoder.
* @param pContext: (IN) Context of the reader
* @param pStreamHandler (IN) The stream handler of the stream to make jump
* @param pAccessUnit (IN/OUT) Pointer to an access unit to fill with read data
* (the au structure is allocated by the user, and must
* be initialized by calling M4READER_fillAuStruct_fct
* after creation)
* @return M4NO_ERROR There is no error
* @return M4ERR_PARAMETER At least one parameter is not properly set
* @returns M4ERR_ALLOC Memory allocation failed
************************************************************************
*/
M4OSA_ERR M4READER_Com3GP_fillAuStruct(M4OSA_Context context, M4_StreamHandler *pStreamHandler,
M4_AccessUnit *pAccessUnit);
/**
************************************************************************
* @brief Cleans up the stream handler
* @param pContext: (IN/OUT) Context of the reader shell
* @param pStreamHandler: (IN/OUT) Stream handler
* @return M4ERR_PARAMETER: The context is null
* @return M4NO_ERROR: No error
************************************************************************
*/
M4OSA_ERR M4READER_Com3GP_cleanUpHandler(M4_StreamHandler* pStreamHandler);
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* __M4READER_3GPCOM_H__ */