M4MCS_InternalTypes.h revision 0a25bd5bacf5408ca205b15e53cfb6dc2fc1d171
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   M4MCS_API.h
19 * @brief  MCS internal types and structures definitions
20 * @note   This header file is not public
21 *************************************************************************
22 **/
23
24#ifndef __M4MCS_INTERNALTYPES_H__
25#define __M4MCS_INTERNALTYPES_H__
26
27/**
28 *    MCS public API and types */
29#include "M4MCS_API.h"
30#include "M4MCS_ErrorCodes.h"
31
32#include "NXPSW_CompilerSwitches.h"
33
34/** Determine absolute value of a. */
35#define M4MCS_ABS(a)               ( ( (a) < (0) ) ? (-(a)) : (a) )
36
37
38#define Y_PLANE_BORDER_VALUE    0x00
39#define U_PLANE_BORDER_VALUE    0x80
40#define V_PLANE_BORDER_VALUE    0x80
41
42
43/**
44 *    Internally used modules */
45#include "M4READER_3gpCom.h"        /**< Read 3GPP file     */
46#include "M4DECODER_Common.h"       /**< Decode video       */
47#include "M4VIFI_FiltersAPI.h"      /**< Video resize       */
48#include "M4AD_Common.h"            /**< Decoder audio      */
49#include "SSRC.h"                   /**< SSRC               */
50#include "From2iToMono_16.h"        /**< Stereo to Mono     */
51#include "MonoTo2I_16.h"            /**< Mono to Stereo     */
52#include "M4ENCODER_AudioCommon.h"  /**< Encode audio       */
53#include "M4WRITER_common.h"        /**< Writer common interface */
54#include "M4ENCODER_common.h"
55
56/**
57 *  Instead of including AAC core properties, it is better to redefine the needed type
58 *  AAC_DEC_STREAM_PROPS
59 *  In case of external AAC decoder, it will be necessary to put this type as public
60 */
61
62/**
63 ******************************************************************************
64 * struct AAC_DEC_STREAM_PROPS
65 * @brief AAC Stream properties
66 * @Note aNoChan and aSampFreq are used for parsing even the user parameters
67 *        are different.  User parameters will be input for the output behaviour
68 *        of the decoder whereas for parsing bitstream properties are used.
69 ******************************************************************************
70 */
71typedef struct {
72  M4OSA_Int32 aAudioObjectType;     /**< Audio object type of the stream - in fact
73                                         the type found in the Access Unit parsed */
74  M4OSA_Int32 aNumChan;             /**< number of channels (=1(mono) or =2(stereo))
75                                         as indicated by input bitstream*/
76  M4OSA_Int32 aSampFreq;            /**< sampling frequency in Hz */
77  M4OSA_Int32 aExtensionSampFreq;   /**< extended sampling frequency in Hz, = 0 is
78                                         no extended frequency */
79  M4OSA_Int32 aSBRPresent;          /**< presence=1/absence=0 of SBR */
80  M4OSA_Int32 aPSPresent;           /**< presence=1/absence=0 of PS */
81  M4OSA_Int32 aMaxPCMSamplesPerCh;  /**< max number of PCM samples per channel */
82} AAC_DEC_STREAM_PROPS;
83
84/**
85 ******************************************************************************
86 * @brief        Codecs registration same as in VPS and VES, so less mapping
87 *              is required toward MCS api types
88 ******************************************************************************
89 */
90typedef struct
91{
92    M4WRITER_GlobalInterface* pGlobalFcts;    /**< open, close, setoption,etc... functions */
93    M4WRITER_DataInterface*    pDataFcts;        /**< data manipulation functions */
94} M4MCS_WriterInterface;
95
96/**
97 ******************************************************************************
98 * enum            M4MCS_States
99 * @brief        Main state machine of the MCS.
100 ******************************************************************************
101 */
102typedef enum
103{
104    M4MCS_kState_CREATED,           /**< M4MCS_init has been called                */
105    M4MCS_kState_OPENED,            /**< M4MCS_open has been called                */
106    M4MCS_kState_SET,               /**< All mandatory parameters have been set    */
107    M4MCS_kState_READY,             /**< All optionnal parameters have been set    */
108    M4MCS_kState_BEGINVIDEOJUMP,    /**< Must jump to the Iframe before the begin cut */
109    M4MCS_kState_BEGINVIDEODECODE,  /**< Must decode up to the begin cut        */
110    M4MCS_kState_PROCESSING,        /**< Step can be called                        */
111    M4MCS_kState_PAUSED,            /**< Paused, Resume can be called            */
112    M4MCS_kState_FINISHED,          /**< Transcoding is finished                */
113    M4MCS_kState_CLOSED             /**< Output file has been created            */
114} M4MCS_States;
115
116/**
117 ******************************************************************************
118 * enum            M4MCS_StreamState
119 * @brief        State of a media stream encoding (audio or video).
120 ******************************************************************************
121 */
122typedef enum
123{
124    M4MCS_kStreamState_NOSTREAM  = 0,    /**< No stream present                    */
125    M4MCS_kStreamState_STARTED   = 1,    /**< The stream encoding is in progress */
126    M4MCS_kStreamState_FINISHED  = 2    /**< The stream has finished encoding    */
127} M4MCS_StreamState;
128
129
130/**
131 ******************************************************************************
132 * enum            anonymous enum
133 * @brief        enum to keep track of the encoder state
134 ******************************************************************************
135 */
136enum
137{
138    M4MCS_kNoEncoder,
139    M4MCS_kEncoderClosed,
140    M4MCS_kEncoderStopped,
141    M4MCS_kEncoderRunning
142};
143
144/**
145 ******************************************************************************
146 * structure    M4MCS_InternalContext
147 * @brief        This structure defines the MCS context (private)
148 * @note        This structure is used for all MCS calls to store the context
149 ******************************************************************************
150 */
151typedef struct
152{
153    M4OSA_UInt32    bitPos;
154                 /* bit count of number of bits used so far */
155
156    M4OSA_UInt8   *streamBuffer;
157                /* Bitstream Buffer */
158
159    M4OSA_UInt32    byteCnt;
160                /* Number of Bytes written in Bitstream buffer*/
161
162    M4OSA_UInt32    currBuff;
163                /* Current buffer holds, 4bytes of bitstream*/
164
165    M4OSA_UInt8   prevByte;
166                /* Previous byte written in the buffer */
167
168    M4OSA_UInt8   prevPrevByte;
169                /* Previous to previous byte written in the buffer */
170
171}NSWAVC_bitStream_t_MCS;
172
173#define _MAXnum_slice_groups  8
174#define _MAXnum_ref_frames_in_pic_order_cnt_cycle  256
175
176typedef struct
177{
178  M4OSA_UInt32  level_idc_index;
179  M4OSA_UInt32  MaxFrameNum;
180  M4OSA_UInt32  expectedDeltaPerPicOrderCntCycle;
181  M4OSA_Int32   MaxPicOrderCntLsb;
182  M4OSA_Int32   max_dec_frame_buffering;
183
184  /* (pic_order_cnt_type == 1) */
185  M4OSA_Int32   offset_for_non_ref_pic;
186  M4OSA_Int32   offset_for_top_to_bottom_field;
187  M4OSA_Int32   frame_crop_left_offset;
188  M4OSA_Int32   frame_crop_right_offset;
189  M4OSA_Int32   frame_crop_top_offset;
190  M4OSA_Int32   frame_crop_bottom_offset;
191  M4OSA_Int32   offset_for_ref_frame[_MAXnum_ref_frames_in_pic_order_cnt_cycle];
192
193  M4OSA_UInt16 PicWidthInMbs;
194  M4OSA_UInt16 FrameHeightInMbs;
195  M4OSA_UInt16  pic_width_in_mbs_minus1;
196  M4OSA_UInt16  pic_height_in_map_units_minus1;
197
198#ifdef _CAP_FMO_
199  M4OSA_UInt16 NumSliceGroupMapUnits;
200  M4OSA_UInt16 MaxPicSizeInMbs;
201#endif /*_CAP_FMO_*/
202
203  M4OSA_UInt8   profile_idc;
204  M4OSA_UInt8   reserved_zero_4bits;
205  M4OSA_UInt8   level_idc;
206  M4OSA_UInt8   seq_parameter_set_id;
207  M4OSA_UInt8   log2_max_frame_num_minus4;
208  M4OSA_UInt8   pic_order_cnt_type;
209  /* if(pic_order_cnt_type == 0) */
210  M4OSA_UInt8   log2_max_pic_order_cnt_lsb_minus4;
211
212  M4OSA_UInt8   num_ref_frames_in_pic_order_cnt_cycle;
213  /* for( i = 0; i < num_ref_frames_in_pic_order_cnt_cycle; i++ ) */
214  M4OSA_UInt8   num_ref_frames;
215
216  M4OSA_Bool    constraint_set0_flag;
217  M4OSA_Bool    constraint_set1_flag;
218  M4OSA_Bool    constraint_set2_flag;
219  M4OSA_Bool    constraint_set3_flag;
220  M4OSA_Bool    delta_pic_order_always_zero_flag;
221  M4OSA_Bool    gaps_in_frame_num_value_allowed_flag;
222  M4OSA_Bool    frame_mbs_only_flag;
223  M4OSA_Bool    mb_adaptive_frame_field_flag;
224  M4OSA_Bool    direct_8x8_inference_flag;
225  M4OSA_Bool    frame_cropping_flag;
226  M4OSA_Bool    vui_parameters_present_flag;
227  M4OSA_Bool    Active;
228
229  /* vui_seq_parameters_t vui_seq_parameters; */
230} ComSequenceParameterSet_t_MCS;
231
232typedef struct
233{
234  M4OSA_Int16       pic_init_qp_minus26;
235  M4OSA_Int16       pic_init_qs_minus26;
236  M4OSA_Int16       chroma_qp_index_offset;
237
238//#ifdef _CAP_FMO_
239  /* if( slice_group_map_type = = 0 ) */
240  M4OSA_UInt16      run_length_minus1[_MAXnum_slice_groups];
241  /* else if( slice_group_map_type = = 2 ) */
242  M4OSA_UInt16      top_left[_MAXnum_slice_groups];
243  M4OSA_UInt16      bottom_right[_MAXnum_slice_groups];
244  /* else if( slice_group_map_type = = 6 ) */
245  M4OSA_UInt16      pic_size_in_map_units_minus1;
246  M4OSA_UInt16      slice_group_change_rate_minus1;
247
248  M4OSA_UInt16 FirstMbInSliceGroup[_MAXnum_slice_groups];
249  M4OSA_UInt16 LastMbInSliceGroup[_MAXnum_slice_groups];
250
251
252  M4OSA_UInt8  *slice_group_id;
253  M4OSA_UInt8  *MapUnitToSliceGroupMap;
254  M4OSA_UInt8  *MbToSliceGroupMap;
255  M4OSA_UInt16  NumSliceGroupMapUnits;
256
257  M4OSA_UInt8       slice_group_map_type;
258  /* else if( slice_group_map_type = = 3 || 4 || 5 */
259  M4OSA_Bool        slice_group_change_direction_flag;
260  M4OSA_Bool   map_initialized;
261// #endif /*_CAP_FMO_*/
262
263  M4OSA_UInt8       pic_parameter_set_id;
264  M4OSA_UInt8       seq_parameter_set_id;
265  M4OSA_UInt8      num_ref_idx_l0_active_minus1;
266  M4OSA_UInt8      num_ref_idx_l1_active_minus1;
267  M4OSA_UInt8       weighted_bipred_idc;
268  M4OSA_UInt8       num_slice_groups_minus1;
269
270  M4OSA_Bool        entropy_coding_mode_flag;
271  /* if( pic_order_cnt_type < 2 )  in the sequence parameter set */
272  M4OSA_Bool        pic_order_present_flag;
273  M4OSA_Bool        weighted_pred_flag;
274  M4OSA_Bool        deblocking_filter_control_present_flag;
275  M4OSA_Bool        constrained_intra_pred_flag;
276  M4OSA_Bool        redundant_pic_cnt_present_flag;
277  M4OSA_Bool    Active;
278
279  ComSequenceParameterSet_t_MCS *p_active_sps;
280} ComPictureParameterSet_t_MCS;
281
282typedef struct
283{
284      M4OSA_UInt32 bitPos;                /*!< bit position in buffer */
285      M4OSA_UInt32 totalBits;             /*!< bit position in file (total bits read so far) */
286
287      M4OSA_UInt32 lastTotalBits;         /*!< bit position in file of the last VOP */
288      M4OSA_UInt32 numBitsInBuffer;       /*!< number of bits in buffer */
289      M4OSA_UInt32 readableBytesInBuffer; /*!< number of bytes that can be read in decoder buffer*/
290      M4OSA_UInt32 maxBufferSize;         /*!< max buffer size in bit units */
291      M4OSA_UInt8  *Buffer;               /*!< char buffer at reading from file */
292      M4OSA_Int32     i8BitCnt;
293      M4OSA_UInt32     ui32TempBuff;
294      M4OSA_Int8*pui8BfrPtr;
295      M4OSA_UInt32    ui32LastTwoBytes;  /*!< stores the last read two bytes */
296} ComBitStreamMCS_t;
297
298
299typedef struct
300{
301
302    M4OSA_Int32 prev_frame_num;
303    M4OSA_Int32 cur_frame_num;
304    M4OSA_Int32 prev_new_frame_num;
305    M4OSA_Int32 log2_max_frame_num_minus4;
306    M4OSA_Int32 is_done;
307    M4OSA_Int32 is_first;
308    M4OSA_Int32 frame_count;
309    M4OSA_Int32 frame_mod_count;
310    M4OSA_Int32 POC_lsb;
311    M4OSA_Int32 POC_lsb_mod;
312
313
314    M4OSA_UInt32    m_Num_Bytes_NALUnitLength;
315
316    M4OSA_UInt8*    m_pDecoderSpecificInfo;   /**< Pointer on specific information required
317                                                   to create a decoder */
318    M4OSA_UInt32    m_decoderSpecificInfoSize;/**< Size of the specific information pointer above*/
319
320    M4OSA_UInt8*    m_pEncoderSPS;
321    M4OSA_UInt32    m_encoderSPSSize;
322
323    M4OSA_UInt8*    m_pEncoderPPS;
324    M4OSA_UInt32    m_encoderPPSSize;
325
326    M4OSA_UInt8*    m_pFinalDSI;
327    M4OSA_UInt32    m_pFinalDSISize;
328
329    M4OSA_UInt32    m_encoder_SPS_Cnt;
330    ComSequenceParameterSet_t_MCS *p_clip_sps;
331    M4OSA_UInt32    m_encoder_PPS_Cnt;
332    ComPictureParameterSet_t_MCS  *p_clip_pps;
333
334    ComSequenceParameterSet_t_MCS *p_encoder_sps;
335    ComPictureParameterSet_t_MCS  *p_encoder_pps;
336
337
338    ComSequenceParameterSet_t_MCS  encoder_sps;
339    ComPictureParameterSet_t_MCS   encoder_pps;
340    ComSequenceParameterSet_t_MCS  clip_sps;
341
342    /* Encoder SPS parameters */
343    M4OSA_UInt32 enc_seq_parameter_set_id;
344    M4OSA_UInt32 enc_log2_max_frame_num_minus4;
345    M4OSA_UInt32 enc_pic_order_cnt_type;
346    M4OSA_UInt32 enc_log2_max_pic_order_cnt_lsb_minus4; /* applicable when POC type = 0 */
347    M4OSA_UInt32 enc_delta_pic_order_always_zero_flag;
348    M4OSA_Int32 enc_offset_for_non_ref_pic;
349    M4OSA_Int32 enc_offset_for_top_to_bottom_field;
350    M4OSA_UInt32 enc_num_ref_frames_in_pic_order_cnt_cycle; /* range 0 to 255 */
351    /* array of size num_ref_frames_in_pic_order_cnt_cycle */
352    M4OSA_Int32   enc_offset_for_ref_frame[256];
353    M4OSA_UInt32 enc_num_ref_frames;
354    M4OSA_UInt32 enc_gaps_in_frame_num_value_allowed_flag;
355
356
357    /* Input clip SPS parameters */
358    M4OSA_UInt32 clip_seq_parameter_set_id;
359    M4OSA_UInt32 clip_log2_max_frame_num_minus4;
360    M4OSA_UInt32 clip_pic_order_cnt_type;
361    M4OSA_UInt32 clip_log2_max_pic_order_cnt_lsb_minus4; /* applicable when POC type = 0 */
362    M4OSA_UInt32 clip_delta_pic_order_always_zero_flag;
363    M4OSA_Int32  clip_offset_for_non_ref_pic;
364    M4OSA_Int32  clip_offset_for_top_to_bottom_field;
365    M4OSA_UInt32 clip_num_ref_frames_in_pic_order_cnt_cycle; /* range 0 to 255 */
366    /* array of size num_ref_frames_in_pic_order_cnt_cycle */
367    M4OSA_Int32  clip_offset_for_ref_frame[256];
368    M4OSA_UInt32 clip_num_ref_frames;
369    M4OSA_UInt32 clip_gaps_in_frame_num_value_allowed_flag;
370
371    M4OSA_UInt32 final_PPS_ID;
372    M4OSA_UInt32 final_SPS_ID;
373    NSWAVC_bitStream_t_MCS  encbs;
374
375} NSWAVC_MCS_t;
376
377
378
379/**
380 ******************************************************************************
381 * structure    M4MCS_InternalContext
382 * @brief       This structure defines the MCS context (private)
383 * @note        This structure is used for all MCS calls to store the context
384 ******************************************************************************
385 */
386typedef struct
387{
388    /**
389     * MCS State and settings stuff */
390    M4MCS_States            State;     /**< MCS internal state */
391    M4MCS_StreamState       VideoState;/**< State of the video encoding */
392    M4MCS_StreamState       AudioState;/**< State of the audio encoding */
393    M4OSA_Bool              noaudio;/**< Flag to know if we have to deal with audio transcoding */
394    M4OSA_Bool              novideo;/**< Flag to know if we have to deal with video transcoding */
395
396    M4VIDEOEDITING_ClipProperties  InputFileProperties;/**< Input audio/video stream properties */
397    M4OSA_Void*             pInputFile;             /**< Remember input file pointer between fast
398                                                         open and normal open */
399    M4VIDEOEDITING_FileType InputFileType;          /**< Remember input file type between fast
400                                                         open and normal open */
401    M4OSA_Bool              bFileOpenedInFastMode;  /**< Flag to know if a particular reader
402                                                         supports fast open */
403    M4OSA_UInt32            uiMaxMetadataSize;      /**< Limitation on the max acceptable moov
404                                                         size of a 3gpp file */
405
406    M4ENCODER_Format        EncodingVideoFormat;    /**< Output video format, set by the user */
407    M4ENCODER_FrameWidth    EncodingWidth;          /**< Output video width, set by the user */
408    M4ENCODER_FrameHeight   EncodingHeight;         /**< Output video height, set by the user */
409    M4ENCODER_FrameRate     EncodingVideoFramerate; /**< Output video framerate, set by the user*/
410
411    M4OSA_UInt32            uiBeginCutTime;     /**< Begin cut time, in milliseconds */
412    M4OSA_UInt32            uiEndCutTime;       /**< Begin cut time, in milliseconds */
413    M4OSA_UInt32            uiMaxFileSize;      /**< Maximum output file size, in bytes */
414    M4OSA_UInt32            uiAudioBitrate;     /**< Targeted audio bitrate in bps */
415    M4OSA_UInt32            uiVideoBitrate;     /**< Targeted video bitrate in bps */
416
417    M4OSA_UInt8     uiProgress;  /**< Progress information saved at each step to be able to
418                                      return it in case of pause */
419
420    /**
421     * Reader stuff */
422    M4OSA_Context           pReaderContext;           /**< Context of the reader module */
423    M4_VideoStreamHandler*  pReaderVideoStream;       /**< Description of the read video stream */
424    M4_AudioStreamHandler*  pReaderAudioStream;       /**< Description of the read audio stream */
425    M4OSA_Bool              bUnsupportedVideoFound;   /**< True if an unsupported video stream
426                                                            type has been found */
427    M4OSA_Bool              bUnsupportedAudioFound;   /**< True if an unsupported audio stream
428                                                            type has been found */
429    M4_AccessUnit           ReaderVideoAU;            /**< Read video access unit */
430    M4_AccessUnit           ReaderVideoAU1;           /**< Read video access unit */
431    M4_AccessUnit           ReaderVideoAU2;           /**< Read video access unit */
432    M4_AccessUnit           ReaderAudioAU;            /**< Read audio access unit */
433    M4_AccessUnit           ReaderAudioAU1;           /**< Read audio access unit */
434    M4_AccessUnit           ReaderAudioAU2;           /**< Read audio access unit */
435    M4OSA_MemAddr8          m_pDataAddress1;          /**< Temporary buffer for Access Unit */
436    M4OSA_MemAddr8          m_pDataAddress2;          /**< Temporary buffer for Access Unit */
437    M4OSA_MemAddr8          m_pDataVideoAddress1;     /**< Temporary buffer for Access Unit */
438    M4OSA_MemAddr8          m_pDataVideoAddress2;     /**< Temporary buffer for Access Unit */
439    M4OSA_UInt32            m_audioAUDuration;        /**< Audio AU duration */
440    M4OSA_Int32             iAudioCtsOffset;          /**< Audio AU CTS offset due to begin cut */
441
442    /**
443     * Video decoder stuff */
444    M4OSA_Context         pViDecCtxt;         /**< Video decoder context */
445    M4OSA_Double          dViDecStartingCts;  /**< Video CTS at which the decode/encode will start
446                                                   (used for begin cut and pause/resume) */
447    M4OSA_Double          dViDecCurrentCts;   /**< Video CTS to decode */
448    M4OSA_Int32           iVideoBeginDecIncr; /**< CTS step for the begin cut decode (doesn't
449                                                    need floating point precision) */
450    M4OSA_Double          dCtsIncrement;      /**< Cts increment from one video frame to another*/
451    M4OSA_Bool            isRenderDup;        /**< To handle duplicate frame rendering in case of
452                                                    external decoding */
453    M4VIFI_ImagePlane*    lastDecodedPlane;   /**< Last decoded plane */
454
455    /**
456     * Video encoder stuff */
457    M4OSA_Context         pViEncCtxt;         /**< Video encoder context */
458    M4VIFI_ImagePlane*    pPreResizeFrame;    /**< The decoded image before resize
459                                                  (allocated if resize needed only)*/
460    M4OSA_UInt32          uiEncVideoBitrate;  /**< Actual video bitrate for the video encoder */
461    M4OSA_UInt32          outputVideoTimescale;
462    M4OSA_UInt32          encoderState;
463
464    /**
465     * Audio decoder stuff */
466    M4OSA_Context         pAudioDecCtxt;        /**< Audio (AAC) decoder context */
467    M4AD_Buffer           AudioDecBufferIn;     /**< Input structure for the audio decoder */
468    M4AD_Buffer           AudioDecBufferOut;    /**< Output structure for the audio decoder */
469    M4OSA_MemAddr8        pPosInDecBufferOut;   /**< Position into the decoder buffer */
470    AAC_DEC_STREAM_PROPS  AacProperties;   /**< Structure for new api to get AAC properties */
471
472    /**
473     * Sample Rate Convertor (SSRC) stuff */
474    SSRC_Instance_t        SsrcInstance;       /**< Context of the Ssrc */
475    SSRC_Scratch_t*        SsrcScratch;        /**< Working memory of the Ssrc */
476    short                  iSsrcNbSamplIn;     /**< Number of sample the Ssrc needs as input */
477    short                  iSsrcNbSamplOut;    /**< Number of sample the Ssrc outputs */
478    M4OSA_MemAddr8         pSsrcBufferIn;      /**< Input of the SSRC */
479    M4OSA_MemAddr8         pSsrcBufferOut;     /**< Output of the SSRC */
480    M4OSA_MemAddr8         pPosInSsrcBufferIn; /**< Position into the SSRC in buffer */
481    M4OSA_MemAddr8         pPosInSsrcBufferOut;/**< Position into the SSRC out buffer */
482
483    M4OSA_Context          pLVAudioResampler;
484
485
486    /**
487     * audio encoder stuff */
488    M4OSA_Context                   pAudioEncCtxt; /**< Context of the audio encoder */
489    M4ENCODER_AudioDecSpecificInfo  pAudioEncDSI; /**< Decoder specific info built by the encoder*/
490    M4ENCODER_AudioParams           AudioEncParams;/**< Config of the audio encoder */
491    M4OSA_MemAddr8            pAudioEncoderBuffer;      /**< Input of the encoder */
492    M4OSA_MemAddr8            pPosInAudioEncoderBuffer; /**< Position into the encoder buffer */
493    M4OSA_UInt32              audioEncoderGranularity;  /**< Minimum number of pcm samples needed
494                                                             to feed audio encoder */
495
496    /**
497     * Writer stuff */
498    M4OSA_Context             pWriterContext;     /**< Context of the writer module */
499    M4OSA_Void*               pOutputFile;        /**< Output file to be created */
500    M4OSA_Void*               pTemporaryFile;     /**< Temporary file to be created to store
501                                                        metadata ("moov.bin") */
502    M4SYS_StreamDescription   WriterVideoStream;  /**< Description of the written video stream */
503    M4SYS_StreamDescription   WriterAudioStream;  /**< Description of the written audio stream */
504    M4WRITER_StreamVideoInfos WriterVideoStreamInfo;/**< Video properties of the written video
505                                                          stream */
506    M4SYS_AccessUnit          WriterVideoAU;        /**< Written video access unit */
507    M4SYS_AccessUnit          WriterAudioAU;        /**< Written audio access unit */
508    M4OSA_UInt32              uiVideoAUCount;       /**< Number of video AU written in output
509                                                          file */
510    M4OSA_UInt32              uiVideoMaxAuSize;     /**< Max access unit size for the output
511                                                          video stream */
512    M4OSA_UInt32              uiVideoMaxChunckSize; /**< Max chunck size for the output video
513                                                          stream */
514    M4OSA_UInt32              uiAudioAUCount;   /**< Number of audio AU written in output file */
515    M4OSA_UInt32              uiAudioMaxAuSize; /**< Max access unit size for the output
516                                                       audio stream */
517    M4OSA_UInt32              uiAudioCts;       /**< Audio AU cts (when audio is transcoded) */
518    M4OSA_Bool                b_isRawWriter;    /**< Boolean to know if the raw writer is
519                                                      registered or not */
520    M4OSA_Context             pOutputPCMfile;   /**< Output PCM file if not NULL */
521
522    /**
523     * Filesystem functions */
524    M4OSA_FileReadPointer*    pOsaFileReadPtr; /**< OSAL file read functions,
525                                                    to be provided by user */
526    M4OSA_FileWriterPointer*  pOsaFileWritPtr; /**< OSAL file write functions,
527                                                    to be provided by user */
528
529    /**
530      * Media and Codec registration */
531    /**< Table of M4VES_WriterInterface structures for avalaible Writers list */
532    M4MCS_WriterInterface               WriterInterface[M4WRITER_kType_NB];
533    /**< open, close, setoption,etc... functions of the used writer*/
534    M4WRITER_GlobalInterface*           pWriterGlobalFcts;
535    /**< data manipulation functions of the used writer */
536    M4WRITER_DataInterface*             pWriterDataFcts;
537    /**< Table of M4ENCODER_GlobalInterface structures for avalaible encoders list */
538    M4ENCODER_GlobalInterface*          pVideoEncoderInterface[M4ENCODER_kVideo_NB];
539    /**< Functions of the used encoder */
540    M4ENCODER_GlobalInterface*          pVideoEncoderGlobalFcts;
541
542    M4OSA_Void*                         pVideoEncoderExternalAPITable[M4ENCODER_kVideo_NB];
543    M4OSA_Void*                         pCurrentVideoEncoderExternalAPI;
544    M4OSA_Void*                         pVideoEncoderUserDataTable[M4ENCODER_kVideo_NB];
545    M4OSA_Void*                         pCurrentVideoEncoderUserData;
546
547    /**< Table of M4ENCODER_AudioGlobalInterface structures for avalaible encoders list */
548    M4ENCODER_AudioGlobalInterface*     pAudioEncoderInterface[M4ENCODER_kAudio_NB];
549    /**< Table of internal/external flags for avalaible encoders list */
550    M4OSA_Bool                          pAudioEncoderFlag[M4ENCODER_kAudio_NB];
551    /**< Functions of the used encoder */
552    M4ENCODER_AudioGlobalInterface*     pAudioEncoderGlobalFcts;
553    M4OSA_Void*                         pAudioEncoderUserDataTable[M4ENCODER_kAudio_NB];
554    M4OSA_Void*                         pCurrentAudioEncoderUserData;
555
556    M4READER_GlobalInterface*           m_pReaderGlobalItTable[M4READER_kMediaType_NB];
557    M4READER_DataInterface*             m_pReaderDataItTable[M4READER_kMediaType_NB];
558    M4READER_GlobalInterface*           m_pReader;
559    M4READER_DataInterface*             m_pReaderDataIt;
560    M4OSA_UInt8                         m_uiNbRegisteredReaders;
561
562    M4DECODER_VideoInterface*           m_pVideoDecoder;
563    M4DECODER_VideoInterface*           m_pVideoDecoderItTable[M4DECODER_kVideoType_NB];
564#ifdef M4VSS_ENABLE_EXTERNAL_DECODERS
565    M4OSA_Void*                         m_pCurrentVideoDecoderUserData;
566    M4OSA_Void*                         m_pVideoDecoderUserDataTable[M4DECODER_kVideoType_NB];
567#endif /* M4VSS_ENABLE_EXTERNAL_DECODERS */
568    M4OSA_UInt8                         m_uiNbRegisteredVideoDec;
569
570    M4AD_Interface*         m_pAudioDecoder;
571    M4AD_Interface*         m_pAudioDecoderItTable[M4AD_kType_NB];
572    M4OSA_Bool              m_pAudioDecoderFlagTable[M4AD_kType_NB]; /**< store indices of external
573                                                                      decoders */
574    M4OSA_Void*             m_pAudioDecoderUserDataTable[M4AD_kType_NB];
575    M4OSA_Void*             m_pCurrentAudioDecoderUserData;
576
577    M4MCS_MediaRendering    MediaRendering;     /**< FB: to crop, resize, or render black borders*/
578    M4OSA_Context           m_air_context;
579    M4OSA_Bool              bExtOMXAudDecoder;  /* External OMX Audio decoder */
580
581    /**< FlB 2009.03.04: Audio effects*/
582    M4MCS_EffectSettings    *pEffects;              /**< List of effects */
583    M4OSA_UInt8             nbEffects;              /**< Number of effects in the above list */
584    M4OSA_Int8              pActiveEffectNumber;    /**< Effect ID to be applied, if -1,
585                                                       no effect has to be applied currently*/
586
587#ifdef M4MCS_SUPPORT_STILL_PICTURE
588    M4OSA_Bool              m_bIsStillPicture;       /**< =TRUE if input file is a still picture
589                                                        (JPEG, PNG, BMP, GIF)*/
590    M4MCS_Context           m_pStillPictureContext; /**< Context of the still picture part of MCS*/
591#endif /*M4MCS_SUPPORT_STILL_PICTURE*/
592    NSWAVC_MCS_t            *m_pInstance;
593    M4OSA_UInt8             *H264MCSTempBuffer;
594    M4OSA_UInt32            H264MCSTempBufferSize;
595    M4OSA_UInt32            H264MCSTempBufferDataSize;
596    M4OSA_Bool              bH264Trim;
597    /* Flag when to get  lastdecodedframeCTS */
598    M4OSA_Bool              bLastDecodedFrameCTS;
599    M4OSA_Int32             encodingVideoProfile;
600    M4OSA_Int32             encodingVideoLevel;
601
602} M4MCS_InternalContext;
603
604
605#endif /* __M4MCS_INTERNALTYPES_H__ */
606
607