C++程序  |  170行  |  7.02 KB

/*--------------------------------------------------------------------------
Copyright (c) 2010 - 2013, The Linux Foundation. All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
    * Redistributions of source code must retain the above copyright
      notice, this list of conditions and the following disclaimer.
    * Redistributions in binary form must reproduce the above copyright
      notice, this list of conditions and the following disclaimer in the
      documentation and/or other materials provided with the distribution.
    * Neither the name of The Linux Foundation nor
      the names of its contributors may be used to endorse or promote
      products derived from this software without specific prior written
      permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--------------------------------------------------------------------------*/
#ifndef MP4_UTILS_H
#define MP4_UTILS_H
#include "OMX_Core.h"
#include "OMX_QCOMExtns.h"
typedef signed long long int64;
typedef unsigned int uint32;   /* Unsigned 32 bit value */
typedef unsigned short uint16;   /* Unsigned 16 bit value */
typedef unsigned char uint8;   /* Unsigned 8  bit value */

typedef int int32;   /* Signed 32 bit value */
typedef signed short int16;   /* Signed 16 bit value */
typedef signed char int8;   /* Signed 8  bit value */

typedef unsigned char byte;   /* Unsigned 8  bit value type. */
#define SIMPLE_PROFILE_LEVEL0            0x08
#define SIMPLE_PROFILE_LEVEL1            0x01
#define SIMPLE_PROFILE_LEVEL2            0x02
#define SIMPLE_PROFILE_LEVEL3            0x03
#define SIMPLE_PROFILE_LEVEL4A            0x04
#define SIMPLE_PROFILE_LEVEL5            0x05
#define SIMPLE_PROFILE_LEVEL6            0x06
#define SIMPLE_PROFILE_LEVEL0B           0x09

#define SIMPLE_SCALABLE_PROFILE_LEVEL0                  0x10
#define SIMPLE_SCALABLE_PROFILE_LEVEL1                  0x11
#define SIMPLE_SCALABLE_PROFILE_LEVEL2                  0x12

#define SIMPLE_SCALABLE_PROFILE_LEVEL0  0x10
#define SIMPLE_SCALABLE_PROFILE_LEVEL1  0x11
#define SIMPLE_SCALABLE_PROFILE_LEVEL2  0x12
#define ADVANCED_SIMPLE_PROFILE_LEVEL0  0xF0
#define ADVANCED_SIMPLE_PROFILE_LEVEL1  0xF1
#define ADVANCED_SIMPLE_PROFILE_LEVEL2  0xF2
#define ADVANCED_SIMPLE_PROFILE_LEVEL3  0xF3
#define ADVANCED_SIMPLE_PROFILE_LEVEL4  0xF4
#define ADVANCED_SIMPLE_PROFILE_LEVEL5  0xF5

#define VISUAL_OBJECT_SEQUENCE_START_CODE   0x000001B0
#define MP4ERROR_SUCCESS     0

#define VIDEO_OBJECT_LAYER_START_CODE_MASK  0xFFFFFFF0
#define VIDEO_OBJECT_LAYER_START_CODE       0x00000120
#define VOP_START_CODE_MASK                 0xFFFFFFFF
#define VOP_START_CODE                      0x000001B6
#define GOV_START_CODE                      0x000001B3
#define SHORT_HEADER_MASK                   0xFFFFFC00
#define SHORT_HEADER_START_MARKER           0x00008000
#define SHORT_HEADER_START_CODE             0x00008000
#define SPARK1_START_CODE                   0x00008400
#define MPEG4_SHAPE_RECTANGULAR               0x00
#define EXTENDED_PAR                        0xF
#define SHORT_VIDEO_START_MARKER         0x20
#define MP4_INVALID_VOL_PARAM   (0x0001)   // unsupported VOL parameter
#define MP4ERROR_UNSUPPORTED_UFEP                   -1068
#define MP4ERROR_UNSUPPORTED_SOURCE_FORMAT          -1069
#define MASK(x) (0xFFFFFFFF >> (32 - (x)))
#define VISUAL_OBJECT_TYPE_VIDEO_ID         0x1
#define VISUAL_OBJECT_START_CODE            0x000001B5
#define VIDEO_OBJECT_START_CODE_MASK        0xFFFFFFE0
#define VIDEO_OBJECT_START_CODE             0x00000100

#define RESERVED_OBJECT_TYPE                0x0
#define SIMPLE_OBJECT_TYPE                  0x1
#define SIMPLE_SCALABLE_OBJECT_TYPE         0x2
#define CORE_OBJECT_TYPE                    0x3
#define MAIN_OBJECT_TYPE                    0x4
#define N_BIT_OBJECT_TYPE                   0x5
#define BASIC_ANIMATED_2D_TEXTURE           0x6
#define ANIMATED_2D_MESH                    0x7
#define ADVANCED_SIMPLE                     0x11


#define SIMPLE_L1_MAX_VBVBUFFERSIZE 10  /* VBV Max Buffer size=10 (p. 498)  */
#define SIMPLE_L1_MAX_BITRATE       160 /* is is 64kpbs or 160 400bits/sec units */
#define SIMPLE_L2_MAX_VBVBUFFERSIZE 40  /* VBV Max Buffer size = 40 */
#define SIMPLE_L2_MAX_BITRATE       320 /* 320 400bps units = 128kpbs */
#define SIMPLE_L3_MAX_VBVBUFFERSIZE 40  /* VBV Max Buffer size = 40 */
#define SIMPLE_L3_MAX_BITRATE       960 /* 960 400bps units = 384kpbs */

/* The MP4 decoder currently supports Simple Profile@L3 */
#define MAX_VBVBUFFERSIZE (SIMPLE_L3_MAX_VBVBUFFERSIZE)
#define MAX_BITRATE       (SIMPLE_L3_MAX_BITRATE)

#define MAX_QUANTPRECISION 9
#define MIN_QUANTPRECISION 3

#define MP4_VGA_WIDTH             640
#define MP4_VGA_HEIGHT            480
#define MP4_WVGA_WIDTH            800
#define MP4_WVGA_HEIGHT           480
#define MP4_720P_WIDTH            1280
#define MP4_720P_HEIGHT           720

#define MP4_MAX_DECODE_WIDTH    MP4_720P_WIDTH
#define MP4_MAX_DECODE_HEIGHT   MP4_720P_HEIGHT

typedef struct {
    unsigned char *data;
    unsigned long int numBytes;
} mp4StreamType;

#define MAX_FRAMES_IN_CHUNK                 10
#define VOP_START_CODE                      0x000001B6
#define VOL_START_CODE                      0x000001B0

typedef enum VOPTYPE {
    NO_VOP = -1, // bitstream contains no VOP.
    MPEG4_I_VOP = 0,   // bitstream contains an MPEG4 I-VOP
    MPEG4_P_VOP = 1,   // bitstream contains an MPEG4 P-VOP
    MPEG4_B_VOP = 2,   // bitstream contains an MPEG4 B-VOP
    MPEG4_S_VOP = 3,   // bitstream contains an MPEG4 S-VOP
} VOP_TYPE;

typedef struct {
    uint32    timestamp_increment;
    uint32    offset;
    uint32    size;
    VOP_TYPE  vopType;
} mp4_frame_info_type;

class MP4_Utils
{
    private:
        struct posInfoType {
            uint8 *bytePtr;
            uint8 bitPos;
        };

        posInfoType m_posInfo;
        byte *m_dataBeginPtr;
        unsigned int vop_time_resolution;
        bool vop_time_found;
        uint16 m_SrcWidth, m_SrcHeight;   // Dimensions of the source clip
    public:
        MP4_Utils();
        ~MP4_Utils();
        int16 populateHeightNWidthFromShortHeader(mp4StreamType * psBits);
        bool parseHeader(mp4StreamType * psBits);
        static uint32 read_bit_field(posInfoType * posPtr, uint32 size);
        bool is_notcodec_vop(unsigned char *pbuffer, unsigned int len);
};
#endif