Home | History | Annotate | Download | only in src
      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 
     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 
     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 
     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 
    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         ALOGE("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     ALOGV("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     ALOGV("getAVCProfileAndLevel profile %ld level %ld", *pProfile, *pLevel);
    590     return M4NO_ERROR;
    591 }
    592 
    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         ALOGE("getH263ProfileAndLevel invalid pointer for pProfile");
    600         return M4ERR_PARAMETER;
    601     }
    602 
    603     if ((DSISize < index) || (pDSI == M4OSA_NULL)) {
    604         ALOGE("getH263ProfileAndLevel: DSI is invalid");
    605         *pProfile = M4VIDEOEDITING_VIDEO_UNKNOWN_PROFILE;
    606         *pLevel = M4VIDEOEDITING_VIDEO_UNKNOWN_LEVEL;
    607         return M4ERR_PARAMETER;
    608     }
    609     ALOGV("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     ALOGV("getH263ProfileAndLevel profile %ld level %ld", *pProfile, *pLevel);
    674     return M4NO_ERROR;
    675 }
    676 
    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     ALOGV("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     ALOGV("getMPEG4ProfileAndLevel profile %ld level %ld", *pProfile, *pLevel);
    697     return M4NO_ERROR;
    698 }
    699