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 #include "utils/Log.h"
17 #include "M4OSA_Types.h"
18 #include "M4OSA_Debug.h"
19
20 #include "M4VD_EXTERNAL_Interface.h"
21 #include "M4VD_Tools.h"
22 #include "M4_VideoEditingCommon.h"
23 #include "OMX_Video.h"
24 /**
25 ************************************************************************
26 * @file M4VD_EXTERNAL_BitstreamParser.c
27 * @brief
28 * @note This file implements external Bitstream parser
29 ************************************************************************
30 */
31
32 typedef struct {
33 M4OSA_UInt8 code;
34 M4OSA_Int32 profile;
35 M4OSA_Int32 level;
36 } codeProfileLevel;
37
38 static codeProfileLevel mpeg4ProfileLevelTable[] = {
39 {0x01, OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level1},
40 {0x02, OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level2},
41 {0x03, OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level3},
42 {0x04, OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level4a},
43 {0x05, OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level5},
44 {0x08, OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level0},
45 {0x11, OMX_VIDEO_MPEG4ProfileSimpleScalable,OMX_VIDEO_MPEG4Level1},
46 {0x12, OMX_VIDEO_MPEG4ProfileSimpleScalable,OMX_VIDEO_MPEG4Level2},
47 {0x21, OMX_VIDEO_MPEG4ProfileCore, OMX_VIDEO_MPEG4Level1},
48 {0x22, OMX_VIDEO_MPEG4ProfileCore, OMX_VIDEO_MPEG4Level2},
49 {0x32, OMX_VIDEO_MPEG4ProfileMain, OMX_VIDEO_MPEG4Level2},
50 {0x33, OMX_VIDEO_MPEG4ProfileMain, OMX_VIDEO_MPEG4Level3},
51 {0x34, OMX_VIDEO_MPEG4ProfileMain, OMX_VIDEO_MPEG4Level4},
52 {0x42, OMX_VIDEO_MPEG4ProfileNbit, OMX_VIDEO_MPEG4Level2},
53 {0x51, OMX_VIDEO_MPEG4ProfileScalableTexture, OMX_VIDEO_MPEG4Level1},
54 {0x61, OMX_VIDEO_MPEG4ProfileSimpleFace, OMX_VIDEO_MPEG4Level1},
55 {0x62, OMX_VIDEO_MPEG4ProfileSimpleFace, OMX_VIDEO_MPEG4Level2},
56 {0x71, OMX_VIDEO_MPEG4ProfileBasicAnimated, OMX_VIDEO_MPEG4Level1},
57 {0x72, OMX_VIDEO_MPEG4ProfileBasicAnimated, OMX_VIDEO_MPEG4Level2},
58 {0x81, OMX_VIDEO_MPEG4ProfileHybrid, OMX_VIDEO_MPEG4Level1},
59 {0x82, OMX_VIDEO_MPEG4ProfileHybrid, OMX_VIDEO_MPEG4Level2},
60 {0x91, OMX_VIDEO_MPEG4ProfileAdvancedRealTime, OMX_VIDEO_MPEG4Level1},
61 {0x92, OMX_VIDEO_MPEG4ProfileAdvancedRealTime, OMX_VIDEO_MPEG4Level2},
62 {0x93, OMX_VIDEO_MPEG4ProfileAdvancedRealTime, OMX_VIDEO_MPEG4Level3},
63 {0x94, OMX_VIDEO_MPEG4ProfileAdvancedRealTime, OMX_VIDEO_MPEG4Level4},
64 {0xa1, OMX_VIDEO_MPEG4ProfileCoreScalable, OMX_VIDEO_MPEG4Level1},
65 {0xa2, OMX_VIDEO_MPEG4ProfileCoreScalable, OMX_VIDEO_MPEG4Level2},
66 {0xa3, OMX_VIDEO_MPEG4ProfileCoreScalable, OMX_VIDEO_MPEG4Level3},
67 {0xb1, OMX_VIDEO_MPEG4ProfileAdvancedCoding, OMX_VIDEO_MPEG4Level1},
68 {0xb2, OMX_VIDEO_MPEG4ProfileAdvancedCoding, OMX_VIDEO_MPEG4Level2},
69 {0xb3, OMX_VIDEO_MPEG4ProfileAdvancedCoding, OMX_VIDEO_MPEG4Level3},
70 {0xb4, OMX_VIDEO_MPEG4ProfileAdvancedCoding, OMX_VIDEO_MPEG4Level4},
71 {0xc1, OMX_VIDEO_MPEG4ProfileAdvancedCore, OMX_VIDEO_MPEG4Level1},
72 {0xc2, OMX_VIDEO_MPEG4ProfileAdvancedCore, OMX_VIDEO_MPEG4Level2},
73 {0xd1, OMX_VIDEO_MPEG4ProfileAdvancedScalable, OMX_VIDEO_MPEG4Level1},
74 {0xd2, OMX_VIDEO_MPEG4ProfileAdvancedScalable, OMX_VIDEO_MPEG4Level2},
75 {0xd3, OMX_VIDEO_MPEG4ProfileAdvancedScalable, OMX_VIDEO_MPEG4Level3},
76 {0xf0, OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level0},
77 {0xf1, OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level1},
78 {0xf2, OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level2},
79 {0xf3, OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level3},
80 {0xf4, OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level4},
81 {0xf5, OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level5}
82 };
83
M4VD_EXTERNAL_GetBitsFromMemory(M4VS_Bitstream_ctxt * parsingCtxt,M4OSA_UInt32 nb_bits)84 M4OSA_UInt32 M4VD_EXTERNAL_GetBitsFromMemory(M4VS_Bitstream_ctxt* parsingCtxt,
85 M4OSA_UInt32 nb_bits)
86 {
87 return(M4VD_Tools_GetBitsFromMemory(parsingCtxt,nb_bits));
88 }
89
M4VD_EXTERNAL_WriteBitsToMemory(M4OSA_UInt32 bitsToWrite,M4OSA_MemAddr32 dest_bits,M4OSA_UInt8 offset,M4OSA_UInt8 nb_bits)90 M4OSA_ERR M4VD_EXTERNAL_WriteBitsToMemory(M4OSA_UInt32 bitsToWrite,
91 M4OSA_MemAddr32 dest_bits,
92 M4OSA_UInt8 offset, M4OSA_UInt8 nb_bits)
93 {
94 return (M4VD_Tools_WriteBitsToMemory( bitsToWrite,dest_bits,
95 offset, nb_bits));
96 }
97
M4DECODER_EXTERNAL_ParseVideoDSI(M4OSA_UInt8 * pVol,M4OSA_Int32 aVolSize,M4DECODER_MPEG4_DecoderConfigInfo * pDci,M4DECODER_VideoSize * pVideoSize)98 M4OSA_ERR M4DECODER_EXTERNAL_ParseVideoDSI(M4OSA_UInt8* pVol, M4OSA_Int32 aVolSize,
99 M4DECODER_MPEG4_DecoderConfigInfo* pDci,
100 M4DECODER_VideoSize* pVideoSize)
101 {
102 M4VS_Bitstream_ctxt parsingCtxt;
103 M4OSA_UInt32 code, j;
104 M4OSA_MemAddr8 start;
105 M4OSA_UInt8 i;
106 M4OSA_UInt32 time_incr_length;
107 M4OSA_UInt8 vol_verid=0, b_hierarchy_type;
108
109 /* Parsing variables */
110 M4OSA_UInt8 video_object_layer_shape = 0;
111 M4OSA_UInt8 sprite_enable = 0;
112 M4OSA_UInt8 reduced_resolution_vop_enable = 0;
113 M4OSA_UInt8 scalability = 0;
114 M4OSA_UInt8 enhancement_type = 0;
115 M4OSA_UInt8 complexity_estimation_disable = 0;
116 M4OSA_UInt8 interlaced = 0;
117 M4OSA_UInt8 sprite_warping_points = 0;
118 M4OSA_UInt8 sprite_brightness_change = 0;
119 M4OSA_UInt8 quant_precision = 0;
120
121 /* Fill the structure with default parameters */
122 pVideoSize->m_uiWidth = 0;
123 pVideoSize->m_uiHeight = 0;
124
125 pDci->uiTimeScale = 0;
126 pDci->uiProfile = 0;
127 pDci->uiUseOfResynchMarker = 0;
128 pDci->bDataPartition = M4OSA_FALSE;
129 pDci->bUseOfRVLC = M4OSA_FALSE;
130
131 /* Reset the bitstream context */
132 parsingCtxt.stream_byte = 0;
133 parsingCtxt.stream_index = 8;
134 parsingCtxt.in = (M4OSA_Int8 *)pVol;
135
136 start = (M4OSA_Int8 *)pVol;
137
138 /* Start parsing */
139 while (parsingCtxt.in - start < aVolSize)
140 {
141 code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, 8);
142 if (code == 0)
143 {
144 code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, 8);
145 if (code == 0)
146 {
147 code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, 8);
148 if (code == 1)
149 {
150 /* start code found */
151 code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, 8);
152
153 /* ----- 0x20..0x2F : video_object_layer_start_code ----- */
154
155 if ((code > 0x1F) && (code < 0x30))
156 {
157 code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt,
158 1);/* random accessible vol */
159 code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt,
160 8);/* video object type indication */
161 code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt,
162 1);/* is object layer identifier */
163 if (code == 1)
164 {
165 code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt,
166 4); /* video object layer verid */
167 vol_verid = (M4OSA_UInt8)code;
168 code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt,
169 3); /* video object layer priority */
170 }
171 code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt,
172 4);/* aspect ratio */
173 if (code == 15)
174 code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt,
175 16); /* par_width and par_height (8+8) */
176 code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt,
177 1);/* vol control parameters */
178 if (code == 1)
179 {
180 code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt,
181 3);/* chroma format + low delay (3+1) */
182 code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt,
183 1);/* vbv parameters */
184 if (code == 1)
185 {
186 code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt,
187 32);/* first and latter half bitrate + 2 marker bits
188 (15 + 1 + 15 + 1) */
189 code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt,
190 31);/* first and latter half vbv buffer size + first
191 half vbv occupancy + marker bits (15+1+3+11+1)*/
192 code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt,
193 16);/* first half vbv occupancy + marker bits (15+1)*/
194 }
195 }
196 code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt,
197 2); /* video object layer shape */
198 /* Need to save it for vop parsing */
199 video_object_layer_shape = (M4OSA_UInt8)code;
200
201 if (code != 0) return 0; /* only rectangular case supported */
202
203 code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt,
204 1); /* Marker bit */
205 code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt,
206 16); /* VOP time increment resolution */
207 pDci->uiTimeScale = code;
208
209 /* Computes time increment length */
210 j = code - 1;
211 for (i = 0; (i < 32) && (j != 0); j >>=1)
212 {
213 i++;
214 }
215 time_incr_length = (i == 0) ? 1 : i;
216
217 code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt,
218 1);/* Marker bit */
219 code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt,
220 1);/* Fixed VOP rate */
221 if (code == 1)
222 {
223 code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt,
224 time_incr_length);/* Fixed VOP time increment */
225 }
226
227 if(video_object_layer_shape != 1) /* 1 = Binary */
228 {
229 if(video_object_layer_shape == 0) /* 0 = rectangular */
230 {
231 code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt,
232 1);/* Marker bit */
233 code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt,
234 13);/* Width */
235 pVideoSize->m_uiWidth = code;
236 code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt,
237 1);/* Marker bit */
238 code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt,
239 13);/* Height */
240 pVideoSize->m_uiHeight = code;
241 code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt,
242 1);/* Marker bit */
243 }
244 }
245
246 code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt,
247 1);/* interlaced */
248 interlaced = (M4OSA_UInt8)code;
249 code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt,
250 1);/* OBMC disable */
251
252 if(vol_verid == 1)
253 {
254 code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt,
255 1);/* sprite enable */
256 sprite_enable = (M4OSA_UInt8)code;
257 }
258 else
259 {
260 code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt,
261 2);/* sprite enable */
262 sprite_enable = (M4OSA_UInt8)code;
263 }
264 if ((sprite_enable == 1) || (sprite_enable == 2))
265 /* Sprite static = 1 and Sprite GMC = 2 */
266 {
267 if (sprite_enable != 2)
268 {
269
270 code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt,
271 13);/* sprite width */
272 code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt,
273 1);/* Marker bit */
274 code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt,
275 13);/* sprite height */
276 code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt,
277 1);/* Marker bit */
278 code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt,
279 13);/* sprite l coordinate */
280 code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt,
281 1);/* Marker bit */
282 code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt,
283 13);/* sprite top coordinate */
284 code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt,
285 1);/* Marker bit */
286 }
287
288 code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt,
289 6);/* sprite warping points */
290 sprite_warping_points = (M4OSA_UInt8)code;
291 code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt,
292 2);/* sprite warping accuracy */
293 code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt,
294 1);/* sprite brightness change */
295 sprite_brightness_change = (M4OSA_UInt8)code;
296 if (sprite_enable != 2)
297 {
298 code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt,
299 1);/* low latency sprite enable */
300 }
301 }
302 if ((vol_verid != 1) && (video_object_layer_shape != 0))
303 {
304 code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt,
305 1);/* sadct disable */
306 }
307
308 code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, 1); /* not 8 bits */
309 if (code)
310 {
311 code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt,
312 4);/* quant precision */
313 quant_precision = (M4OSA_UInt8)code;
314 code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt,
315 4);/* bits per pixel */
316 }
317
318 /* greyscale not supported */
319 if(video_object_layer_shape == 3)
320 {
321 code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt,
322 3); /* nogray quant update + composition method +
323 linear composition */
324 }
325
326 code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt,
327 1);/* quant type */
328 if (code)
329 {
330 code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt,
331 1);/* load intra quant mat */
332 if (code)
333 {
334 code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, 8);/* */
335 i = 1;
336 while (i < 64)
337 {
338 code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, 8);
339 if (code == 0)
340 break;
341 i++;
342 }
343 }
344
345 code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt,
346 1);/* load non intra quant mat */
347 if (code)
348 {
349 code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, 8);/* */
350 i = 1;
351 while (i < 64)
352 {
353 code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, 8);
354 if (code == 0)
355 break;
356 i++;
357 }
358 }
359 }
360
361 if (vol_verid != 1)
362 {
363 code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt,
364 1);/* quarter sample */
365 }
366
367 code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt,
368 1);/* complexity estimation disable */
369 complexity_estimation_disable = (M4OSA_UInt8)code;
370 if (!code)
371 {
372 //return M4ERR_NOT_IMPLEMENTED;
373 }
374
375 code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt,
376 1);/* resync marker disable */
377 pDci->uiUseOfResynchMarker = (code) ? 0 : 1;
378
379 code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt,
380 1);/* data partitionned */
381 pDci->bDataPartition = (code) ? M4OSA_TRUE : M4OSA_FALSE;
382 if (code)
383 {
384 /* reversible VLC */
385 code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, 1);
386 pDci->bUseOfRVLC = (code) ? M4OSA_TRUE : M4OSA_FALSE;
387 }
388
389 if (vol_verid != 1)
390 {
391 code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, 1);/* newpred */
392 if (code)
393 {
394 //return M4ERR_PARAMETER;
395 }
396 /* reduced resolution vop enable */
397 code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, 1);
398 reduced_resolution_vop_enable = (M4OSA_UInt8)code;
399 }
400
401 code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, 1);/* scalability */
402 scalability = (M4OSA_UInt8)code;
403 if (code)
404 {
405 /* hierarchy type */
406 code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, 1);
407 b_hierarchy_type = (M4OSA_UInt8)code;
408 /* ref layer id */
409 code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, 4);
410 /* ref sampling direct */
411 code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, 1);
412 /* hor sampling factor N */
413 code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, 5);
414 /* hor sampling factor M */
415 code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, 5);
416 /* vert sampling factor N */
417 code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, 5);
418 /* vert sampling factor M */
419 code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, 5);
420 /* enhancement type */
421 code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, 1);
422 enhancement_type = (M4OSA_UInt8)code;
423 if ((!b_hierarchy_type) && (video_object_layer_shape == 1))
424 {
425 /* use ref shape */
426 code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, 1);
427 /* use ref texture */
428 code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, 1);
429 /* shape hor sampling factor N */
430 code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, 5);
431 /* shape hor sampling factor M */
432 code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, 5);
433 /* shape vert sampling factor N */
434 code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, 5);
435 /* shape vert sampling factor M */
436 code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, 5);
437 }
438 }
439 break;
440 }
441
442 /* ----- 0xB0 : visual_object_sequence_start_code ----- */
443
444 else if(code == 0xB0)
445 {
446 /* profile_and_level_indication */
447 code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, 8);
448 pDci->uiProfile = (M4OSA_UInt8)code;
449 }
450
451 /* ----- 0xB5 : visual_object_start_code ----- */
452
453 else if(code == 0xB5)
454 {
455 /* is object layer identifier */
456 code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, 1);
457 if (code == 1)
458 {
459 /* visual object verid */
460 code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, 4);
461 vol_verid = (M4OSA_UInt8)code;
462 /* visual object layer priority */
463 code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, 3);
464 }
465 else
466 {
467 /* Realign on byte */
468 code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, 7);
469 vol_verid = 1;
470 }
471 }
472
473 /* ----- end ----- */
474 }
475 else
476 {
477 if ((code >> 2) == 0x20)
478 {
479 /* H263 ...-> wrong*/
480 break;
481 }
482 }
483 }
484 }
485 }
486
487 return M4NO_ERROR;
488 }
489
getAVCProfileAndLevel(M4OSA_UInt8 * pDSI,M4OSA_Int32 DSISize,M4OSA_Int32 * pProfile,M4OSA_Int32 * pLevel)490 M4OSA_ERR getAVCProfileAndLevel(M4OSA_UInt8* pDSI, M4OSA_Int32 DSISize,
491 M4OSA_Int32 *pProfile, M4OSA_Int32 *pLevel) {
492
493 M4OSA_UInt16 index = 28; /* the 29th byte is SPS start */
494 M4OSA_Bool constraintSet3;
495
496 if ((pProfile == M4OSA_NULL) || (pLevel == M4OSA_NULL)) {
497 return M4ERR_PARAMETER;
498 }
499
500 if ((DSISize <= index) || (pDSI == M4OSA_NULL)) {
501 LOGE("getAVCProfileAndLevel: DSI is invalid");
502 *pProfile = M4VIDEOEDITING_VIDEO_UNKNOWN_PROFILE;
503 *pLevel = M4VIDEOEDITING_VIDEO_UNKNOWN_LEVEL;
504 return M4ERR_PARAMETER;
505 }
506
507 constraintSet3 = (pDSI[index+2] & 0x10);
508 LOGV("getAVCProfileAndLevel profile_byte %d, level_byte: %d constrain3flag",
509 pDSI[index+1], pDSI[index+3], constraintSet3);
510
511 switch (pDSI[index+1]) {
512 case 66:
513 *pProfile = OMX_VIDEO_AVCProfileBaseline;
514 break;
515 case 77:
516 *pProfile = OMX_VIDEO_AVCProfileMain;
517 break;
518 case 88:
519 *pProfile = OMX_VIDEO_AVCProfileExtended;
520 break;
521 case 100:
522 *pProfile = OMX_VIDEO_AVCProfileHigh;
523 break;
524 case 110:
525 *pProfile = OMX_VIDEO_AVCProfileHigh10;
526 break;
527 case 122:
528 *pProfile = OMX_VIDEO_AVCProfileHigh422;
529 break;
530 case 244:
531 *pProfile = OMX_VIDEO_AVCProfileHigh444;
532 break;
533 default:
534 *pProfile = M4VIDEOEDITING_VIDEO_UNKNOWN_PROFILE;
535 }
536
537 switch (pDSI[index+3]) {
538 case 10:
539 *pLevel = OMX_VIDEO_AVCLevel1;
540 break;
541 case 11:
542 if (constraintSet3)
543 *pLevel = OMX_VIDEO_AVCLevel1b;
544 else
545 *pLevel = OMX_VIDEO_AVCLevel11;
546 break;
547 case 12:
548 *pLevel = OMX_VIDEO_AVCLevel12;
549 break;
550 case 13:
551 *pLevel = OMX_VIDEO_AVCLevel13;
552 break;
553 case 20:
554 *pLevel = OMX_VIDEO_AVCLevel2;
555 break;
556 case 21:
557 *pLevel = OMX_VIDEO_AVCLevel21;
558 break;
559 case 22:
560 *pLevel = OMX_VIDEO_AVCLevel22;
561 break;
562 case 30:
563 *pLevel = OMX_VIDEO_AVCLevel3;
564 break;
565 case 31:
566 *pLevel = OMX_VIDEO_AVCLevel31;
567 break;
568 case 32:
569 *pLevel = OMX_VIDEO_AVCLevel32;
570 break;
571 case 40:
572 *pLevel = OMX_VIDEO_AVCLevel4;
573 break;
574 case 41:
575 *pLevel = OMX_VIDEO_AVCLevel41;
576 break;
577 case 42:
578 *pLevel = OMX_VIDEO_AVCLevel42;
579 break;
580 case 50:
581 *pLevel = OMX_VIDEO_AVCLevel5;
582 break;
583 case 51:
584 *pLevel = OMX_VIDEO_AVCLevel51;
585 break;
586 default:
587 *pLevel = M4VIDEOEDITING_VIDEO_UNKNOWN_LEVEL;
588 }
589 LOGV("getAVCProfileAndLevel profile %ld level %ld", *pProfile, *pLevel);
590 return M4NO_ERROR;
591 }
592
getH263ProfileAndLevel(M4OSA_UInt8 * pDSI,M4OSA_Int32 DSISize,M4OSA_Int32 * pProfile,M4OSA_Int32 * pLevel)593 M4OSA_ERR getH263ProfileAndLevel(M4OSA_UInt8* pDSI, M4OSA_Int32 DSISize,
594 M4OSA_Int32 *pProfile, M4OSA_Int32 *pLevel) {
595
596 M4OSA_UInt16 index = 7; /* the 5th and 6th bytes contain the level and profile */
597
598 if ((pProfile == M4OSA_NULL) || (pLevel == M4OSA_NULL)) {
599 LOGE("getH263ProfileAndLevel invalid pointer for pProfile");
600 return M4ERR_PARAMETER;
601 }
602
603 if ((DSISize < index) || (pDSI == M4OSA_NULL)) {
604 LOGE("getH263ProfileAndLevel: DSI is invalid");
605 *pProfile = M4VIDEOEDITING_VIDEO_UNKNOWN_PROFILE;
606 *pLevel = M4VIDEOEDITING_VIDEO_UNKNOWN_LEVEL;
607 return M4ERR_PARAMETER;
608 }
609 LOGV("getH263ProfileAndLevel profile_byte %d, level_byte",
610 pDSI[6], pDSI[5]);
611 /* get the H263 level */
612 switch (pDSI[5]) {
613 case 10:
614 *pLevel = OMX_VIDEO_H263Level10;
615 break;
616 case 20:
617 *pLevel = OMX_VIDEO_H263Level20;
618 break;
619 case 30:
620 *pLevel = OMX_VIDEO_H263Level30;
621 break;
622 case 40:
623 *pLevel = OMX_VIDEO_H263Level40;
624 break;
625 case 45:
626 *pLevel = OMX_VIDEO_H263Level45;
627 break;
628 case 50:
629 *pLevel = OMX_VIDEO_H263Level50;
630 break;
631 case 60:
632 *pLevel = OMX_VIDEO_H263Level60;
633 break;
634 case 70:
635 *pLevel = OMX_VIDEO_H263Level70;
636 break;
637 default:
638 *pLevel = M4VIDEOEDITING_VIDEO_UNKNOWN_LEVEL;
639 }
640
641 /* get H263 profile */
642 switch (pDSI[6]) {
643 case 0:
644 *pProfile = OMX_VIDEO_H263ProfileBaseline;
645 break;
646 case 1:
647 *pProfile = OMX_VIDEO_H263ProfileH320Coding;
648 break;
649 case 2:
650 *pProfile = OMX_VIDEO_H263ProfileBackwardCompatible;
651 break;
652 case 3:
653 *pProfile = OMX_VIDEO_H263ProfileISWV2;
654 break;
655 case 4:
656 *pProfile = OMX_VIDEO_H263ProfileISWV3;
657 break;
658 case 5:
659 *pProfile = OMX_VIDEO_H263ProfileHighCompression;
660 break;
661 case 6:
662 *pProfile = OMX_VIDEO_H263ProfileInternet;
663 break;
664 case 7:
665 *pProfile = OMX_VIDEO_H263ProfileInterlace;
666 break;
667 case 8:
668 *pProfile = OMX_VIDEO_H263ProfileHighLatency;
669 break;
670 default:
671 *pProfile = M4VIDEOEDITING_VIDEO_UNKNOWN_PROFILE;
672 }
673 LOGV("getH263ProfileAndLevel profile %ld level %ld", *pProfile, *pLevel);
674 return M4NO_ERROR;
675 }
676
getMPEG4ProfileAndLevel(M4OSA_UInt8 profileAndLevel,M4OSA_Int32 * pProfile,M4OSA_Int32 * pLevel)677 M4OSA_ERR getMPEG4ProfileAndLevel(M4OSA_UInt8 profileAndLevel,
678 M4OSA_Int32 *pProfile, M4OSA_Int32 *pLevel) {
679
680 M4OSA_UInt32 i = 0;
681 M4OSA_UInt32 length = 0;
682 if ((pProfile == M4OSA_NULL) || (pLevel == M4OSA_NULL)) {
683 return M4ERR_PARAMETER;
684 }
685 LOGV("getMPEG4ProfileAndLevel profileAndLevel %d", profileAndLevel);
686 length = sizeof(mpeg4ProfileLevelTable) /sizeof(mpeg4ProfileLevelTable[0]);
687 *pProfile = M4VIDEOEDITING_VIDEO_UNKNOWN_PROFILE;
688 *pLevel = M4VIDEOEDITING_VIDEO_UNKNOWN_LEVEL;
689 for (i = 0; i < length; i++) {
690 if (mpeg4ProfileLevelTable[i].code == profileAndLevel) {
691 *pProfile = mpeg4ProfileLevelTable[i].profile;
692 *pLevel = mpeg4ProfileLevelTable[i].level;
693 break;
694 }
695 }
696 LOGV("getMPEG4ProfileAndLevel profile %ld level %ld", *pProfile, *pLevel);
697 return M4NO_ERROR;
698 }
699