flv_parser.h
11.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
/*****************************************************************************
* Copyright Statement:
* --------------------
* This software is protected by Copyright and the information contained
* herein is confidential. The software may not be copied and the information
* contained herein may not be used or disclosed except with the written
* permission of MediaTek Inc. (C) 2005
*
* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
*
* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
*
* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
*
*****************************************************************************/
/*******************************************************************************
*
* Filename:
* ---------
* flv_parser.h
*
* Project:
* --------
* MAUI
*
* Description:
* ------------
* FLV parser Definitions
*
* Author:
* -------
* -------
*
*==============================================================================
* HISTORY
*******************************************************************************/
#ifndef __FLV_PARSER_H__
#define __FLV_PARSER_H__
#include "fsal.h"
#define FLV_FILE_START 0x464C56
#define FLV_HEADER_TYPE_FLAGS_RESERVED_BITS5 (0xF8)
#define FLV_HEADER_TYPE_FLAGS_AUDIO (0x04)
#define FLV_HEADER_TYPE_FLAGS_RESERVED_BITS1 (0x02)
#define FLV_HEADER_TYPE_FLAGS_VIDEO (0x01)
#define FLV_TAG_RESERVED (0xC0)
#define FLV_TAG_FILTER (0x20)
#define FLV_TAG_FILTER_OFFSET (5)
#define FLV_TAG_TAGTYPE (0x1F)
#define AUDIO_TAG (0x8)
#define VIDEO_TAG (0x9)
#define SCRIPT_DATA_TAG (0x12)
#define FLV_SOUND_FORMAT_AAC 10
#define MAX_SPS_NUMBER 32
#define MAX_PPS_NUMBER 256
#define FLV_KEY_FRAME 1
#define FLV_INTER_FRAME 2
#define FLV_DISPOSABLE_INTER_FRAME 3
#define FLV_GENERATED_KEY_FRAME 4
#define FLV_VIDEO_INFO_COMMAND_FRAME 5
#define FLV_TAG_LENGTH 11
#define FLV_VIDEO_TAG_HDR_LENGTH 5
#define FLV_AUDIO_TAG_HDR_LENGTH 1
#define FLV_AUDIO_TAG_HDR_LENGTH_AAC 2
#define FLV_AVCDECCONFSIZEMIN 5
#define FLV_PREV_TAG_SIZE_LENGTH 4
#define FLV_PARSER_FILE_GET_CUR_POS(pos) \
if (FSAL_GetCurPos(pFLVParser->pstFSAL, &(pos))!=FSAL_OK) \
return FLV_PARSER_FILE_ACCESS_ERROR
#define FLV_PARSER_CHECK_ARG(exp) \
if (!(exp)) \
return FLV_PARSER_INVALID_ARGUMENT
#define FLV_ASSERT( exp ) \
{ \
if( !( exp ) ) \
{ASSERT(0);} \
}
// Video key frame is built during demuxing without key table
// #define __VE_FLV_PSEUDO_KEY_TABLE__
typedef enum
{
AMF_Number = 0,
AMF_Boolean,
AMF_String,
AMF_Object,
AMF_MovieClip, // reserved, not supported
AMF_Null,
AMF_Undefined,
AMF_Reference,
AMF_ECMAArray,
AMF_ObjectEndMarker,
AMF_StrictArray,
AMF_Date,
AMFLongString
}ScriptDataValue;
typedef enum {
FLV_LINEAR_PCM = 0,
FLV_ADPCM,
FLV_MP3,
FLV_LINEAR_PCM_LE,
FLV_NELLYMOSER_16K_MONO,
FLV_NELLYMOSER_8K_MONO,
FLV_NELLYMOSER,
FLV_G711_ALAW_PCM,
FLV_G711_MULAW_PCM,
FLV_RESERVED,
FLV_AAC,
FLV_SPEEX,
FLV_MP3_8K,
FLV_DEVICE_SPECIFIC,
FLV_AUDIO_UNDEFINED
} FLV_AUDIO_CODEC_FORMAT;
typedef enum {
FLV_SORESON_H263 = 2,
FLV_SCREEN_VIDEO,
FLV_ON2_VP6,
FLV_ON2_VP6_ALPHA_CHANNEL,
FLV_SCREEN_VIDEO_V2,
FLV_AVC,
FLV_VIDEO_UNDEFINED
} FLV_VIDEO_CODEC_FORMAT;
#define FLV_RESERVED_TRACK_NO 0xFF
typedef enum {
FLV_TRACK_AUDIO = 0,
FLV_TRACK_VIDEO = 1,
FLV_TRACK_TOTAL
} FLV_Track_Type;
typedef struct
{
unsigned int totalSize;
unsigned int offset;
unsigned int LengthSizeMinusOne;
unsigned char ConVer;
unsigned char profile;
unsigned char profile_comp;
unsigned char level;
}AVCDecConfRecord;
typedef enum
{
FLV_KEYFRAME_INIT = 0,
FLV_KEYFRAME_START,
FLV_KEYFRAME_PARSED
} KeyFrameStatus;
#define FLV_MAX_KEYFRAME_STORE 100
#define FLV_MAX_MEMO_KEYFRAME_STORE 10
typedef struct
{
unsigned int Real_Count; // With key frame case. Determined from meta
KeyFrameStatus eFileOffset;
KeyFrameStatus eTime;
unsigned int KeyOffestStart; // with key frame case, the start offset of "filepositions"
unsigned int KeyTimestart; // with key frame case, the start offset of "times"
unsigned int last_index; // with key frame case, the largest key index (< Real_Count)
unsigned int valid_end_idx; // key frame array 值有意義的最大值. e.g. clip有60張key frame, 這個值就是59
unsigned int au4FileVOffset[FLV_MAX_KEYFRAME_STORE]; // Video tag offset
unsigned int au4Time[FLV_MAX_KEYFRAME_STORE];
unsigned int au4VFrmIdx[FLV_MAX_KEYFRAME_STORE]; // Video frame index
unsigned int interval; // Key frame interval for subsample
unsigned int accum; // accumulation of interval
unsigned int MaxReadOffset;
unsigned int MaxReadTime;
}FLV_KeyFrameTable;
typedef struct
{
unsigned int index;
unsigned int au4FileVOffset[FLV_MAX_MEMO_KEYFRAME_STORE]; // Video tag offset
unsigned int au4Time[FLV_MAX_MEMO_KEYFRAME_STORE];
unsigned int au4VFrmIdx[FLV_MAX_MEMO_KEYFRAME_STORE]; // Video frame index
}FLV_MemoKeyFrameTable;
typedef struct
{
STFSAL *pstFSAL;
FSAL_Status eFSALErr;
unsigned char FLVTAG_Filter;
unsigned char FLVTAG_TagType;
unsigned int FLVTAG_DataSize;
unsigned int FLVTAG_Timestamp;
unsigned char FLVTAG_TimestampExtended;
unsigned char FLVTAG_StreamID;
// Video
unsigned char VideoFrameType;
int CompositionTimeOffset;
}FLVParser;
typedef struct
{
unsigned char version;
unsigned char FLVHeader_TypeFlagsAudio;
unsigned char FLVHeader_TypeFlagsVideo;
unsigned int FLVHeader_DataOffset;
unsigned int VideoFrameNum;
unsigned int AudioFrameNum;
unsigned int FirstVideoTagOffset;
unsigned int FirstAudioTagOffset;
//MetaData
FLV_AUDIO_CODEC_FORMAT AudioCodecId;
unsigned int AudioDataRate; // Audio bit rate in kbs
unsigned int AudioDelay; // delay introduced by the audio codec in seconds
unsigned int AudioSampleRate; // frequency at which the audio stream is replayed
unsigned int AudioSampleSize;
unsigned int duration; // in seconds
unsigned int VideoFrameRate; // Number of Video frames per second *1000
unsigned int AudioFrameRate; // Number of Audio frames per second
unsigned int width;
unsigned int height;
kal_bool stereo;
FLV_VIDEO_CODEC_FORMAT VideoCodecId;
unsigned int VideoDataRate; // kbs
FLV_KeyFrameTable rKeyFrames;
// Audio 14496-3
unsigned char bAudioObjectType;
unsigned char bAudioSamplingFreqIndex; // sampling frequency index (defined in 14496-3)
unsigned char bAudioChannelConfig; // channel configuration (14496-3, Table 1.16)
// AVCDecoderCOnfigurationRecord
AVCDecConfRecord rAVCDecConfig;
// FSAL for key table reading
STFSAL* pt_fsal_key_table; /* FSAL handle pointer to file */
kal_uint32* p_fsal_key_table_buf; /* FSAL working buffer pointer to file */
// Maintain latest audio frame file offset and time
unsigned int LatestAudioTagOffset;
unsigned int LatestAudioTagTime;
// To fast break parsing loops
kal_bool fgFastBreak;
// profile
kal_uint32 u4ParseTime;
}FLVMetaData;
typedef enum {
FLV_PARSER_OK = 1,
FLV_PARSER_AUDIO_CONFIG_OK,
FLV_PARSER_VIDEO_CONFIG_OK,
FLV_PARSER_AUDIO_DATA_OK,
FLV_PARSER_VIDEO_DATA_OK,
FLV_PARSER_INVALID_HEADER,
FLV_PARSER_FILE_ACCESS_ERROR,
FLV_PARSER_INVALID_ARGUMENT,
FLV_PARSER_FILE_READ_ERROR,
FLV_PARSER_FILE_READ_EOF,
FLV_PARSER_FILE_SEEK_ERROR,
FLV_PARSER_METADATA_ERROR,
FLV_PARSER_AUDIO_FORMAT_NOT_SUPPORT,
FLV_PARSER_VIDEO_FORMAT_NOT_SUPPORT,
FLV_PARSER_PARSE_14496_3_BOXLENGTH_ERROR,
FLV_PARSER_INVALID_AUDIO_SAMPLE_FREQ_IDX,
FLV_PARSER_AUDIO_TOO_MANY_CHANNEL,
FLV_PARSER_960_120_IMDCT_NOT_SUPPORT,
FLV_PARSER_PARSE_14496_3_ERROR,
FLV_PARSER_VIDEO_FRAME_TYPE_NOT_SUPPORT,
FLV_PARSER_AVCODEC_NOT_SUPPORT,
FLV_PARSER_BUFFER_READ_OVER,
FLV_PARSER_VIDEO_PKT_EOS,
FLV_PARSER_FAST_BREAK
} FLV_Parser_Status;
FLV_Parser_Status FLV_Parse(FLVParser *pFLVParser, STFSAL *pstFSAL, FLVMetaData *ptMetaData);
FLV_Parser_Status FLV_BuildKeyTable(FLVParser *pFLVParser, FLVMetaData *ptMetaData);
FLV_Parser_Status FLV_GetTrackAvail(FLVMetaData *pFLVMetadata, FLV_Track_Type eTrackType, kal_uint8 *has_this_track);
kal_uint32 FLV_GetCodecType(FLVMetaData* pFLVMetadata, FLV_Track_Type eTrackType);
FLV_Parser_Status FLV_GetMediaDuration(FLVMetaData* pFLVMetadata, kal_uint32 *pDuration);
FLV_Parser_Status FLV_GetVideoResolution(FLVMetaData* pFLVMetadata, kal_uint32 *width, kal_uint32 *height);
FLV_Parser_Status FLV_GetAverageBitRate(FLVMetaData* pFLVMetadata, kal_uint32 *bitrate, FLV_Track_Type eTrackType);
FLV_Parser_Status FLV_GetFrameRate(FLVMetaData* pFLVMetadata, kal_uint32 *fps);
kal_uint16 FLV_Audio_GetChannelCount(FLVMetaData* pFLVMetadata);
kal_uint16 FLV_Audio_GetSampleSize(FLVMetaData* pFLVMetadata);
kal_uint32 FLV_Audio_GetSampleRate(FLVMetaData* pFLVMetadata);
FLV_Parser_Status FLV_Tag(FLVParser *pFLVParser);
FLV_Parser_Status FLV_Tag_Buf(FLVParser *pFLVParser, kal_uint8* start, kal_uint32 length);
FLV_Parser_Status FLV_AudioTag(FLVParser *pFLVParser, FLVMetaData *pMetadata);
FLV_Parser_Status FLV_VideoTag(FLVParser *pFLVParser, FLVMetaData *pMetadata);
FLV_Parser_Status FLV_VideoTag_Buf(FLVParser *pFLVParser, FLVMetaData *pMetadata, kal_uint8* start, kal_uint32 length);
FLV_Parser_Status FLV_PrevKeyFramebyTime(FLVParser* pstParser, FLVMetaData* pFLVMetadata,
kal_uint32 SeekTime,
kal_uint32 *pKeyIndex, kal_uint32 *pOffset, kal_uint32 *pTime,
FLV_Track_Type eTrackType);
#ifdef __VE_FLV_PSEUDO_KEY_TABLE__
void FLV_BuildPseuKeyTable(FLVMetaData *pMetadata, kal_uint32 uTime, kal_uint32 uOffset);
kal_uint32 FLV_GetPseuKeyTableMaxTime(FLVMetaData *pMetadata, kal_uint32* puOffset);
void FLV_UpdatePseuKeyTableMaxRead(FLVMetaData *pMetadata, kal_uint32 uTime, kal_uint32 uOffset);
#endif
#endif