1 /* ------------------------------------------------------------------
2  * Copyright (C) 1998-2009 PacketVideo
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
13  * express or implied.
14  * See the License for the specific language governing permissions
15  * and limitations under the License.
16  * -------------------------------------------------------------------
17  */
18 #ifndef TI_M4V_CONFIG_PARSER_H_INCLUDED
19 #define TI_M4V_CONFIG_PARSER_H_INCLUDED
20 
21 #include "oscl_base.h"
22 #include "oscl_types.h"
23 
24 #include <utils/Log.h>
25 #define LOG_TAG "TI_Parser_Utils"
26 
27 #define USE_LATER 0  // for some code that will be needed in the future
28 
29 #define MP4_INVALID_VOL_PARAM -1
30 #define SHORT_HEADER_MODE -4
31 
32 #define WVGA_MAX_WIDTH 900
33 #define WVGA_MAX_HEIGHT WVGA_MAX_WIDTH
34 
35 #define VISUAL_OBJECT_SEQUENCE_START_CODE 	0x01B0
36 #define VISUAL_OBJECT_SEQUENCE_END_CODE 	0x01B1
37 #define VISUAL_OBJECT_START_CODE   0x01B5
38 #define VO_START_CODE 		    0x8
39 #define VO_HEADER_LENGTH        32
40 #define VOL_START_CODE 0x12
41 #define VOL_START_CODE_LENGTH 28
42 
43 #define GROUP_START_CODE	0x01B3
44 #define GROUP_START_CODE_LENGTH  32
45 
46 #define VOP_ID_CODE_LENGTH		5
47 #define VOP_TEMP_REF_CODE_LENGTH	16
48 
49 #define USER_DATA_START_CODE	    0x01B2
50 #define USER_DATA_START_CODE_LENGTH 32
51 
52 #define SHORT_VIDEO_START_MARKER		0x20
53 #define SHORT_VIDEO_START_MARKER_LENGTH  22
54 
55 /*Some H264 profiles*/
56 #define H264_PROFILE_IDC_BASELINE 66
57 #define H264_PROFILE_IDC_MAIN 77
58 #define H264_PROFILE_IDC_EXTENDED 88
59 #define H264_PROFILE_IDC_HIGH 100
60 
61 typedef struct
62 {
63     uint8 *data;
64     uint32 numBytes;
65     uint32 bytePos;
66     uint32 bitBuf;
67     uint32 dataBitPos;
68     uint32  bitPos;
69 } mp4StreamType;
70 
71 
72 int16 ShowBits(
73     mp4StreamType *pStream,
74     uint8 ucNBits,
75     uint32 *pulOutData
76 );
77 
78 int16 FlushBits(
79     mp4StreamType *pStream,
80     uint8 ucNBits
81 );
82 
83 int16 ReadBits(
84     mp4StreamType *pStream,
85     uint8 ucNBits,
86     uint32 *pulOutData
87 );
88 
89 int16 ByteAlign(
90     mp4StreamType *pStream
91 );
92 
93 	OSCL_IMPORT_REF int16 iDecodeVOLHeader(
94 		mp4StreamType *psBits,
95 		int32 *width,
96 		int32 *height,
97 		int32 *,
98 		int32 *,
99 		int32 *profilelevel);
100 	OSCL_IMPORT_REF int16 iGetM4VConfigInfo(
101 		uint8 *buffer,
102 		int32 length,
103 		int32 *width,
104 		int32 *height,
105 		int32 *,
106 		int32 *);
107 
108 int16 DecodeUserData(mp4StreamType *pStream);
109 
110 	OSCL_IMPORT_REF int16 iDecodeShortHeader(
111 		mp4StreamType *psBits,
112 		int32 *width,
113 		int32 *height,
114 		int32 *,
115 		int32 *);
116 	OSCL_IMPORT_REF int16 iGetAVCConfigInfo(
117 		uint8 *buffer,
118 		int32 length,
119 		int32 *width,
120 		int32 *height,
121 		int32 *,
122 		int32 *,
123 		int32 *profile,
124 		int32 *level,
125 		uint32 *entropy_coding_mode_flag);
126 
127 int32 FindNAL(uint8** nal_pnt, uint8* buffer, int32 length);
128 int16 DecodeSPS(mp4StreamType *psBits, int32 *width, int32 *height, int32 *display_width, int32 *display_height, int32 *profile_idc, int32 *level_idc);
129 #if USE_LATER
130 int32 DecodeHRD(mp4StreamType *psBits);
131 int32 DecodeVUI(mp4StreamType *psBits);
132 #endif
133 int32 DecodePPS(mp4StreamType *psBits, uint32 *entropy_coding_mode_flag);
134 
135 void ue_v(mp4StreamType *psBits, uint32 *codeNum);
136 void se_v(mp4StreamType *psBits, int32 *value);
137 void Parser_EBSPtoRBSP(uint8 *nal_unit, int32 *size);
138 
139 #endif //TI_M4V_CONFIG_PARSER_H_INCLUDED
140 
141 
142