mirror of
https://github.com/WinampDesktop/winamp.git
synced 2024-12-28 23:26:07 +00:00
976 lines
34 KiB
C
976 lines
34 KiB
C
/* ///////////////////////////////////////////////////////////////////////
|
|
//
|
|
// INTEL CORPORATION PROPRIETARY INFORMATION
|
|
// This software is supplied under the terms of a license agreement or
|
|
// nondisclosure agreement with Intel Corporation and may not be copied
|
|
// or disclosed except in accordance with the terms of that agreement.
|
|
// Copyright (c) 2001-2008 Intel Corporation. All Rights Reserved.
|
|
//
|
|
// Description: MPEG-4 header.
|
|
//
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <bfc/platform/types.h>
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include "../tools/staticlib/ipp_px.h"
|
|
#include "ippdefs.h"
|
|
#include "ippcore.h"
|
|
#include "ipps.h"
|
|
#include "ippi.h"
|
|
#include "ippvc.h"
|
|
//#include "vm_debug.h"
|
|
//#include "vm_thread.h"
|
|
|
|
#pragma warning(disable : 4710) // function not inlined
|
|
#pragma warning(disable : 4514) // unreferenced inline function has been removed CL
|
|
#pragma warning(disable : 4100) // unreferenced formal parameter CL
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
//#define USE_INLINE_BITS_FUNC
|
|
#define USE_NOTCODED_STATE
|
|
|
|
#if defined(__INTEL_COMPILER) || defined(_MSC_VER)
|
|
#define __INLINE static __inline
|
|
#elif defined( __GNUC__ )
|
|
#define __INLINE static __inline__
|
|
#else
|
|
#define __INLINE static
|
|
#endif
|
|
|
|
#if defined(__INTEL_COMPILER) && !defined(_WIN32_WCE)
|
|
#define __ALIGN16(type, name, size) \
|
|
__declspec (align(16)) type name[size]
|
|
#else
|
|
#if defined(_WIN64) || defined(WIN64) || defined(LINUX64)
|
|
#define __ALIGN16(type, name, size) \
|
|
uint8_t _a16_##name[(size)*sizeof(type)+15]; type *name = (type*)(((int64_t)(_a16_##name) + 15) & ~15)
|
|
#else
|
|
#define __ALIGN16(type, name, size) \
|
|
uint8_t _a16_##name[(size)*sizeof(type)+15]; type *name = (type*)(((int32_t)(_a16_##name) + 15) & ~15)
|
|
#endif
|
|
#endif
|
|
|
|
#define mp4_CLIP(x, min, max) if ((x) < (min)) (x) = (min); else if ((x) > (max)) (x) = (max)
|
|
#define mp4_CLIPR(x, max) if ((x) > (max)) (x) = (max)
|
|
#define mp4_SWAP(type, x, y) {mp4_Frame *t = (x); (x) = (y); (y) = t;}
|
|
#define mp4_ABS(a) ((a) >= 0 ? (a) : -(a))
|
|
|
|
/* Timer Info */
|
|
#if defined(_WIN32) || defined(_WIN64) || defined(WIN32) || defined(WIN64)
|
|
|
|
#include <windows.h>
|
|
|
|
typedef struct _mp4_Timer {
|
|
LARGE_INTEGER count;
|
|
LARGE_INTEGER start;
|
|
LARGE_INTEGER stop;
|
|
int32_t calls;
|
|
} mp4_Timer;
|
|
|
|
__INLINE void mp4_TimerStart(mp4_Timer *t)
|
|
{
|
|
QueryPerformanceCounter(&t->start);
|
|
}
|
|
|
|
__INLINE void mp4_TimerStop(mp4_Timer *t)
|
|
{
|
|
QueryPerformanceCounter(&t->stop);
|
|
t->count.QuadPart += t->stop.QuadPart - t->start.QuadPart;
|
|
t->calls ++;
|
|
}
|
|
|
|
#define TIMER_FREQ_TYPE LARGE_INTEGER
|
|
|
|
__INLINE void mp4_GetTimerFreq(TIMER_FREQ_TYPE *f)
|
|
{
|
|
QueryPerformanceFrequency(f);
|
|
}
|
|
|
|
__INLINE double mp4_GetTimerSec(mp4_Timer *t, TIMER_FREQ_TYPE f)
|
|
{
|
|
return (double)t->count.QuadPart / (double)f.QuadPart;
|
|
}
|
|
|
|
#else // LINUX
|
|
|
|
#include <time.h>
|
|
|
|
typedef struct _mp4_Timer {
|
|
clock_t count;
|
|
clock_t start;
|
|
clock_t stop;
|
|
int32_t calls;
|
|
} mp4_Timer;
|
|
|
|
__INLINE void mp4_TimerStart(mp4_Timer *t)
|
|
{
|
|
t->start = clock();
|
|
}
|
|
|
|
__INLINE void mp4_TimerStop(mp4_Timer *t)
|
|
{
|
|
t->stop = clock();
|
|
t->count += t->stop - t->start;
|
|
t->calls ++;
|
|
}
|
|
|
|
#define TIMER_FREQ_TYPE int32_t
|
|
|
|
__INLINE void mp4_GetTimerFreq(TIMER_FREQ_TYPE *f)
|
|
{
|
|
*f = CLOCKS_PER_SEC;
|
|
}
|
|
|
|
__INLINE double mp4_GetTimerSec(mp4_Timer *t, TIMER_FREQ_TYPE f)
|
|
{
|
|
return (double)t->count / (double)f;
|
|
}
|
|
|
|
#endif
|
|
|
|
/* number of exterior MB */
|
|
#define MP4_NUM_EXT_MB 1
|
|
|
|
/* Statistic Info */
|
|
typedef struct _mp4_Statistic {
|
|
// VideoObjectLayer Info
|
|
int32_t nVOP;
|
|
int32_t nVOP_I;
|
|
int32_t nVOP_P;
|
|
int32_t nVOP_B;
|
|
int32_t nVOP_S;
|
|
int32_t nMB;
|
|
int32_t nMB_INTER;
|
|
int32_t nMB_INTER_Q;
|
|
int32_t nMB_INTRA;
|
|
int32_t nMB_INTRA_Q;
|
|
int32_t nMB_INTER4V;
|
|
int32_t nMB_DIRECT;
|
|
int32_t nMB_INTERPOLATE;
|
|
int32_t nMB_BACKWARD;
|
|
int32_t nMB_FORWARD;
|
|
int32_t nMB_NOTCODED;
|
|
int32_t nB_INTRA_DC;
|
|
int32_t nB_INTRA_AC;
|
|
int32_t nB_INTER_C;
|
|
int32_t nB_INTER_NC;
|
|
// app Timing Info
|
|
mp4_Timer time_DecodeShow; // decode + draw + file reading
|
|
mp4_Timer time_Decode; // decode + file reading
|
|
mp4_Timer time_DecodeOnly; // decode only
|
|
} mp4_Statistic;
|
|
|
|
__INLINE void mp4_StatisticInc(int32_t *s)
|
|
{
|
|
*s = (*s) + 1;
|
|
}
|
|
|
|
// when using Full Statistic, FPS is less
|
|
#ifdef MP4_FULL_STAT
|
|
#define mp4_StatisticInc_(s) mp4_StatisticInc(s)
|
|
#define mp4_TimerStart_(t) mp4_TimerStart(t)
|
|
#define mp4_TimerStop_(t) mp4_TimerStop(t)
|
|
#else
|
|
#define mp4_StatisticInc_(s)
|
|
#define mp4_TimerStart_(t)
|
|
#define mp4_TimerStop_(t)
|
|
#endif
|
|
|
|
/* status codes */
|
|
typedef enum {
|
|
MP4_STATUS_OK = 0, // no error
|
|
MP4_STATUS_NO_MEM = -1, // out of memory
|
|
MP4_STATUS_FILE_ERROR = -2, // file error
|
|
MP4_STATUS_NOTSUPPORT = -3, // not supported mode
|
|
MP4_STATUS_PARSE_ERROR = -4, // fail in parse MPEG-4 stream
|
|
MP4_STATUS_ERROR = -5 // unknown/unspecified error
|
|
} mp4_Status;
|
|
|
|
/* MPEG-4 start code values */
|
|
// ISO/IEC 14496-2: table 6-3
|
|
enum {
|
|
MP4_VIDEO_OBJECT_MIN_SC = 0x00,
|
|
MP4_VIDEO_OBJECT_MAX_SC = 0x1F,
|
|
MP4_VIDEO_OBJECT_LAYER_MIN_SC = 0x20,
|
|
MP4_VIDEO_OBJECT_LAYER_MAX_SC = 0x2F,
|
|
MP4_FGS_BP_MIN_SC = 0x40,
|
|
MP4_FGS_BP_MAX_SC = 0x5F,
|
|
MP4_VISUAL_OBJECT_SEQUENCE_SC = 0xB0,
|
|
MP4_VISUAL_OBJECT_SEQUENCE_EC = 0xB1,
|
|
MP4_USER_DATA_SC = 0xB2,
|
|
MP4_GROUP_OF_VOP_SC = 0xB3,
|
|
MP4_VIDEO_SESSION_ERROR_SC = 0xB4,
|
|
MP4_VISUAL_OBJECT_SC = 0xB5,
|
|
MP4_VIDEO_OBJECT_PLANE_SC = 0xB6,
|
|
MP4_SLICE_SC = 0xB7,
|
|
MP4_EXTENSION_SC = 0xB8,
|
|
MP4_FGS_VOP_SC = 0xB9,
|
|
MP4_FBA_OBJECT_SC = 0xBA,
|
|
MP4_FBA_OBJECT_PLANE_SC = 0xBB,
|
|
MP4_MESH_OBJECT_SC = 0xBC,
|
|
MP4_MESH_OBJECT_PLANE_SC = 0xBD,
|
|
MP4_STILL_TEXTURE_OBJECT_SC = 0xBE,
|
|
MP4_TEXTURE_SPATIAL_LAYER_SC = 0xBF,
|
|
MP4_TEXTURE_SNR_LAYER_SC = 0xC0,
|
|
MP4_TEXTURE_TILE_SC = 0xC1,
|
|
MP4_TEXTURE_SHAPE_LAYER_SC = 0xC2,
|
|
MP4_STUFFING_SC = 0xC3
|
|
};
|
|
|
|
/* MPEG-4 code values */
|
|
// ISO/IEC 14496-2:2004 table 6-6
|
|
enum {
|
|
MP4_VISUAL_OBJECT_TYPE_VIDEO = 1,
|
|
MP4_VISUAL_OBJECT_TYPE_TEXTURE = 2,
|
|
MP4_VISUAL_OBJECT_TYPE_MESH = 3,
|
|
MP4_VISUAL_OBJECT_TYPE_FBA = 4,
|
|
MP4_VISUAL_OBJECT_TYPE_3DMESH = 5
|
|
};
|
|
|
|
// ISO/IEC 14496-2:2004 table 6-7
|
|
enum {
|
|
MP4_VIDEO_FORMAT_COMPONENT = 0,
|
|
MP4_VIDEO_FORMAT_PAL = 1,
|
|
MP4_VIDEO_FORMAT_NTSC = 2,
|
|
MP4_VIDEO_FORMAT_SECAM = 3,
|
|
MP4_VIDEO_FORMAT_MAC = 4,
|
|
MP4_VIDEO_FORMAT_UNSPECIFIED = 5
|
|
};
|
|
|
|
// ISO/IEC 14496-2:2004 table 6-8..10
|
|
enum {
|
|
MP4_VIDEO_COLORS_FORBIDDEN = 0,
|
|
MP4_VIDEO_COLORS_ITU_R_BT_709 = 1,
|
|
MP4_VIDEO_COLORS_UNSPECIFIED = 2,
|
|
MP4_VIDEO_COLORS_RESERVED = 3,
|
|
MP4_VIDEO_COLORS_ITU_R_BT_470_2_M = 4,
|
|
MP4_VIDEO_COLORS_ITU_R_BT_470_2_BG = 5,
|
|
MP4_VIDEO_COLORS_SMPTE_170M = 6,
|
|
MP4_VIDEO_COLORS_SMPTE_240M = 7,
|
|
MP4_VIDEO_COLORS_GENERIC_FILM = 8
|
|
};
|
|
|
|
// ISO/IEC 14496-2:2004 table 6-11
|
|
enum {
|
|
MP4_VIDEO_OBJECT_TYPE_SIMPLE = 1,
|
|
MP4_VIDEO_OBJECT_TYPE_SIMPLE_SCALABLE = 2,
|
|
MP4_VIDEO_OBJECT_TYPE_CORE = 3,
|
|
MP4_VIDEO_OBJECT_TYPE_MAIN = 4,
|
|
MP4_VIDEO_OBJECT_TYPE_NBIT = 5,
|
|
MP4_VIDEO_OBJECT_TYPE_2DTEXTURE = 6,
|
|
MP4_VIDEO_OBJECT_TYPE_2DMESH = 7,
|
|
MP4_VIDEO_OBJECT_TYPE_SIMPLE_FACE = 8,
|
|
MP4_VIDEO_OBJECT_TYPE_STILL_SCALABLE_TEXTURE = 9,
|
|
MP4_VIDEO_OBJECT_TYPE_ADVANCED_REAL_TIME_SIMPLE = 10,
|
|
MP4_VIDEO_OBJECT_TYPE_CORE_SCALABLE = 11,
|
|
MP4_VIDEO_OBJECT_TYPE_ADVANCED_CODING_EFFICIENCY = 12,
|
|
MP4_VIDEO_OBJECT_TYPE_ADVANCED_SCALABLE_TEXTURE = 13,
|
|
MP4_VIDEO_OBJECT_TYPE_SIMPLE_FBA = 14,
|
|
MP4_VIDEO_OBJECT_TYPE_SIMPLE_STUDIO = 15,
|
|
MP4_VIDEO_OBJECT_TYPE_CORE_STUDIO = 16,
|
|
MP4_VIDEO_OBJECT_TYPE_ADVANCED_SIMPLE = 17,
|
|
MP4_VIDEO_OBJECT_TYPE_FINE_GRANULARITY_SCALABLE = 18
|
|
};
|
|
|
|
// ISO/IEC 14496-2:2004 table 6.17 (maximum defined video_object_layer_shape_extension)
|
|
#define MP4_SHAPE_EXT_NUM 13
|
|
// ISO/IEC 14496-2:2004 table 6-14
|
|
enum {
|
|
MP4_ASPECT_RATIO_FORBIDDEN = 0,
|
|
MP4_ASPECT_RATIO_1_1 = 1,
|
|
MP4_ASPECT_RATIO_12_11 = 2,
|
|
MP4_ASPECT_RATIO_10_11 = 3,
|
|
MP4_ASPECT_RATIO_16_11 = 4,
|
|
MP4_ASPECT_RATIO_40_33 = 5,
|
|
MP4_ASPECT_RATIO_EXTPAR = 15
|
|
};
|
|
|
|
// ISO/IEC 14496-2:2004 table 6-15
|
|
#define MP4_CHROMA_FORMAT_420 1
|
|
// ISO/IEC 14496-2:2004 table 6-16
|
|
enum {
|
|
MP4_SHAPE_TYPE_RECTANGULAR = 0,
|
|
MP4_SHAPE_TYPE_BINARY = 1,
|
|
MP4_SHAPE_TYPE_BINARYONLY = 2,
|
|
MP4_SHAPE_TYPE_GRAYSCALE = 3
|
|
};
|
|
|
|
// ISO/IEC 14496-2:2004 table 6-19
|
|
#define MP4_SPRITE_STATIC 1
|
|
#define MP4_SPRITE_GMC 2
|
|
// ISO/IEC 14496-2:2004 table 6-24
|
|
enum {
|
|
MP4_VOP_TYPE_I = 0,
|
|
MP4_VOP_TYPE_P = 1,
|
|
MP4_VOP_TYPE_B = 2,
|
|
MP4_VOP_TYPE_S = 3
|
|
};
|
|
|
|
// ISO/IEC 14496-2:2004 table 6-26
|
|
enum {
|
|
MP4_SPRITE_TRANSMIT_MODE_STOP = 0,
|
|
MP4_SPRITE_TRANSMIT_MODE_PIECE = 1,
|
|
MP4_SPRITE_TRANSMIT_MODE_UPDATE = 2,
|
|
MP4_SPRITE_TRANSMIT_MODE_PAUSE = 3
|
|
};
|
|
|
|
// ISO/IEC 14496-2:2004 table 7-3
|
|
enum {
|
|
MP4_BAB_TYPE_MVDSZ_NOUPDATE = 0,
|
|
MP4_BAB_TYPE_MVDSNZ_NOUPDATE = 1,
|
|
MP4_BAB_TYPE_TRANSPARENT = 2,
|
|
MP4_BAB_TYPE_OPAQUE = 3,
|
|
MP4_BAB_TYPE_INTRACAE = 4,
|
|
MP4_BAB_TYPE_MVDSZ_INTERCAE = 5,
|
|
MP4_BAB_TYPE_MVDSNZ_INTERCAE = 6
|
|
};
|
|
|
|
#define MP4_DC_MARKER 0x6B001 // 110 1011 0000 0000 0001
|
|
#define MP4_MV_MARKER 0x1F001 // 1 1111 0000 0000 0001
|
|
|
|
// ISO/IEC 14496-2:2004 table G.1
|
|
enum {
|
|
MP4_SIMPLE_PROFILE_LEVEL_1 = 0x01,
|
|
MP4_SIMPLE_PROFILE_LEVEL_2 = 0x02,
|
|
MP4_SIMPLE_PROFILE_LEVEL_3 = 0x03,
|
|
MP4_SIMPLE_PROFILE_LEVEL_0 = 0x08,
|
|
MP4_SIMPLE_SCALABLE_PROFILE_LEVEL_0 = 0x10,
|
|
MP4_SIMPLE_SCALABLE_PROFILE_LEVEL_1 = 0x11,
|
|
MP4_SIMPLE_SCALABLE_PROFILE_LEVEL_2 = 0x12,
|
|
MP4_CORE_PROFILE_LEVEL_1 = 0x21,
|
|
MP4_CORE_PROFILE_LEVEL_2 = 0x22,
|
|
MP4_MAIN_PROFILE_LEVEL_2 = 0x32,
|
|
MP4_MAIN_PROFILE_LEVEL_3 = 0x33,
|
|
MP4_MAIN_PROFILE_LEVEL_4 = 0x34,
|
|
MP4_NBIT_PROFILE_LEVEL_2 = 0x42,
|
|
MP4_SCALABLE_TEXTURE_PROFILE_LEVEL_1 = 0x51,
|
|
MP4_SIMPLE_FACE_ANIMATION_PROFILE_LEVEL_1 = 0x61,
|
|
MP4_SIMPLE_FACE_ANIMATION_PROFILE_LEVEL_2 = 0x62,
|
|
MP4_SIMPLE_FBA_PROFILE_LEVEL_1 = 0x63,
|
|
MP4_SIMPLE_FBA_PROFILE_LEVEL_2 = 0x64,
|
|
MP4_BASIC_ANIMATED_TEXTURE_PROFILE_LEVEL_1 = 0x71,
|
|
MP4_BASIC_ANIMATED_TEXTURE_PROFILE_LEVEL_2 = 0x72,
|
|
MP4_HYBRID_PROFILE_LEVEL_1 = 0x81,
|
|
MP4_HYBRID_PROFILE_LEVEL_2 = 0x82,
|
|
MP4_ADVANCED_REAL_TIME_SIMPLE_PROFILE_LEVEL_1 = 0x91,
|
|
MP4_ADVANCED_REAL_TIME_SIMPLE_PROFILE_LEVEL_2 = 0x92,
|
|
MP4_ADVANCED_REAL_TIME_SIMPLE_PROFILE_LEVEL_3 = 0x93,
|
|
MP4_ADVANCED_REAL_TIME_SIMPLE_PROFILE_LEVEL_4 = 0x94,
|
|
MP4_CORE_SCALABLE_PROFILE_LEVEL_1 = 0xA1,
|
|
MP4_CORE_SCALABLE_PROFILE_LEVEL_2 = 0xA2,
|
|
MP4_CORE_SCALABLE_PROFILE_LEVEL_3 = 0xA3,
|
|
MP4_ADVANCED_CODING_EFFICIENCY_PROFILE_LEVEL_1 = 0xB1,
|
|
MP4_ADVANCED_CODING_EFFICIENCY_PROFILE_LEVEL_2 = 0xB2,
|
|
MP4_ADVANCED_CODING_EFFICIENCY_PROFILE_LEVEL_3 = 0xB3,
|
|
MP4_ADVANCED_CODING_EFFICIENCY_PROFILE_LEVEL_4 = 0xB4,
|
|
MP4_ADVANCED_CORE_PROFILE_LEVEL_1 = 0xC1,
|
|
MP4_ADVANCED_CORE_PROFILE_LEVEL_2 = 0xC2,
|
|
MP4_ADVANCED_SCALABLE_TEXTURE_PROFILE_LEVEL_1 = 0xD1,
|
|
MP4_ADVANCED_SCALABLE_TEXTURE_PROFILE_LEVEL_2 = 0xD2,
|
|
MP4_ADVANCED_SCALABLE_TEXTURE_PROFILE_LEVEL_3 = 0xD3,
|
|
MP4_SIMPLE_STUDIO_PROFILE_LEVEL_1 = 0xE1,
|
|
MP4_SIMPLE_STUDIO_PROFILE_LEVEL_2 = 0xE2,
|
|
MP4_SIMPLE_STUDIO_PROFILE_LEVEL_3 = 0xE3,
|
|
MP4_SIMPLE_STUDIO_PROFILE_LEVEL_4 = 0xE4,
|
|
MP4_CORE_STUDIO_PROFILE_LEVEL_1 = 0xE5,
|
|
MP4_CORE_STUDIO_PROFILE_LEVEL_2 = 0xE6,
|
|
MP4_CORE_STUDIO_PROFILE_LEVEL_3 = 0xE7,
|
|
MP4_CORE_STUDIO_PROFILE_LEVEL_4 = 0xE8,
|
|
MP4_ADVANCED_SIMPLE_PROFILE_LEVEL_0 = 0xF0,
|
|
MP4_ADVANCED_SIMPLE_PROFILE_LEVEL_1 = 0xF1,
|
|
MP4_ADVANCED_SIMPLE_PROFILE_LEVEL_2 = 0xF2,
|
|
MP4_ADVANCED_SIMPLE_PROFILE_LEVEL_3 = 0xF3,
|
|
MP4_ADVANCED_SIMPLE_PROFILE_LEVEL_4 = 0xF4,
|
|
MP4_ADVANCED_SIMPLE_PROFILE_LEVEL_5 = 0xF5,
|
|
MP4_ADVANCED_SIMPLE_PROFILE_LEVEL_3B = 0xF7,
|
|
MP4_FGS_PROFILE_LEVEL_0 = 0xF8,
|
|
MP4_FGS_PROFILE_LEVEL_1 = 0xF9,
|
|
MP4_FGS_PROFILE_LEVEL_2 = 0xFA,
|
|
MP4_FGS_PROFILE_LEVEL_3 = 0xFB,
|
|
MP4_FGS_PROFILE_LEVEL_4 = 0xFC,
|
|
MP4_FGS_PROFILE_LEVEL_5 = 0xFD
|
|
};
|
|
|
|
/* Frame Info */
|
|
typedef struct _mp4_Frame {
|
|
uint8_t* apY; // allocated with border
|
|
uint8_t* apCb; // allocated with border
|
|
uint8_t* apCr; // allocated with border
|
|
int32_t stepY;
|
|
int32_t stepCr;
|
|
int32_t stepCb;
|
|
uint8_t* pY; // real pointer
|
|
uint8_t* pCb; // real pointer
|
|
uint8_t* pCr; // real pointer
|
|
int32_t type;
|
|
int64_t time;
|
|
int32_t mbPerRow; // info for realloc VOP with Shape
|
|
int32_t mbPerCol;
|
|
uint8_t* apB; // for binary mask
|
|
uint8_t* pB;
|
|
uint8_t* apA[3]; // for aux components
|
|
uint8_t* pA[3];
|
|
uint8_t* mid;
|
|
uint64_t timestamp; // user-provided timestamp
|
|
int QP;
|
|
unsigned int reference_count;
|
|
int outputted; // for debugging purposes
|
|
int sprite; // 0 - frame, 1 - sprite
|
|
struct _mp4_Frame *next; // benski> for linked list of display & free frames
|
|
} mp4_Frame;
|
|
|
|
/* Block Info for Intra Prediction */
|
|
typedef struct _mp4_IntraPredBlock {
|
|
struct _mp4_IntraPredBlock *predA;
|
|
struct _mp4_IntraPredBlock *predB;
|
|
struct _mp4_IntraPredBlock *predC;
|
|
int16_t dct_acA[8];
|
|
int16_t dct_acC[8];
|
|
int16_t dct_dc;
|
|
} mp4_IntraPredBlock;
|
|
|
|
/* Buffer for Intra Prediction */
|
|
typedef struct _mp4_IntraPredBuff {
|
|
uint8_t *quant; // quant buffer;
|
|
mp4_IntraPredBlock dcB[6]; // blocks for Left-Top DC only
|
|
mp4_IntraPredBlock *block;
|
|
} mp4_IntraPredBuff;
|
|
|
|
/* MacroBlock Info Data Partitioned mode */
|
|
typedef struct _mp4_DataPartMacroBlock {
|
|
int16_t dct_dc[6];
|
|
uint8_t type;
|
|
uint8_t not_coded;
|
|
uint8_t mcsel;
|
|
uint8_t ac_pred_flag;
|
|
uint8_t pat;
|
|
uint8_t quant;
|
|
} mp4_DataPartMacroBlock;
|
|
|
|
/* MacroBlock Info for Motion */
|
|
typedef struct _mp4_MacroBlock {
|
|
IppMotionVector mv[4];
|
|
uint8_t validPred; // for MV pred, OBMC
|
|
uint8_t type; // for OBMC, BVOP
|
|
uint8_t not_coded; // for OBMC, BVOP
|
|
uint8_t field_info; // for Interlaced BVOP Direct mode
|
|
} mp4_MacroBlock;
|
|
|
|
/* Group Of Video Object Plane Info */
|
|
typedef struct _mp4_GroupOfVideoObjectPlane {
|
|
int64_t time_code;
|
|
int32_t closed_gov;
|
|
int32_t broken_link;
|
|
} mp4_GroupOfVideoObjectPlane;
|
|
|
|
/* Video Object Plane Info */
|
|
typedef struct _mp4_VideoObjectPlane {
|
|
int32_t coding_type;
|
|
int32_t modulo_time_base;
|
|
int32_t time_increment;
|
|
int32_t coded;
|
|
int32_t id; // verid != 1 (newpred)
|
|
int32_t id_for_prediction_indication; // verid != 1 (newpred)
|
|
int32_t id_for_prediction; // verid != 1 (newpred)
|
|
int32_t rounding_type;
|
|
int32_t reduced_resolution; // verid != 1
|
|
int32_t vop_width;
|
|
int32_t vop_height;
|
|
int32_t vop_horizontal_mc_spatial_ref;
|
|
int32_t vop_vertical_mc_spatial_ref;
|
|
int32_t background_composition;
|
|
int32_t change_conv_ratio_disable;
|
|
int32_t vop_constant_alpha;
|
|
int32_t vop_constant_alpha_value;
|
|
int32_t intra_dc_vlc_thr;
|
|
int32_t top_field_first;
|
|
int32_t alternate_vertical_scan_flag;
|
|
int32_t sprite_transmit_mode;
|
|
int32_t warping_mv_code_du[4];
|
|
int32_t warping_mv_code_dv[4];
|
|
int32_t brightness_change_factor;
|
|
int32_t quant;
|
|
int32_t alpha_quant[3];
|
|
int32_t fcode_forward;
|
|
int32_t fcode_backward;
|
|
int32_t shape_coding_type;
|
|
int32_t load_backward_shape;
|
|
int32_t ref_select_code;
|
|
int32_t dx;
|
|
int32_t dy;
|
|
int32_t quant_scale;
|
|
int32_t macroblock_num;
|
|
int32_t vop_id;
|
|
int32_t vop_id_for_prediction_indication;
|
|
int32_t vop_id_for_prediction;
|
|
} mp4_VideoObjectPlane;
|
|
|
|
/* mp4_ComplexityEstimation Info */
|
|
typedef struct _mp4_ComplexityEstimation {
|
|
int32_t estimation_method;
|
|
int32_t shape_complexity_estimation_disable;
|
|
int32_t opaque;
|
|
int32_t transparent;
|
|
int32_t intra_cae;
|
|
int32_t inter_cae;
|
|
int32_t no_update;
|
|
int32_t upsampling;
|
|
int32_t texture_complexity_estimation_set_1_disable;
|
|
int32_t intra_blocks;
|
|
int32_t inter_blocks;
|
|
int32_t inter4v_blocks;
|
|
int32_t not_coded_blocks;
|
|
int32_t texture_complexity_estimation_set_2_disable;
|
|
int32_t dct_coefs;
|
|
int32_t dct_lines;
|
|
int32_t vlc_symbols;
|
|
int32_t vlc_bits;
|
|
int32_t motion_compensation_complexity_disable;
|
|
int32_t apm;
|
|
int32_t npm;
|
|
int32_t interpolate_mc_q;
|
|
int32_t forw_back_mc_q;
|
|
int32_t halfpel2;
|
|
int32_t halfpel4;
|
|
int32_t version2_complexity_estimation_disable; // verid != 1
|
|
int32_t sadct; // verid != 1
|
|
int32_t quarterpel; // verid != 1
|
|
int32_t dcecs_opaque;
|
|
int32_t dcecs_transparent;
|
|
int32_t dcecs_intra_cae;
|
|
int32_t dcecs_inter_cae;
|
|
int32_t dcecs_no_update;
|
|
int32_t dcecs_upsampling;
|
|
int32_t dcecs_intra_blocks;
|
|
int32_t dcecs_inter_blocks;
|
|
int32_t dcecs_inter4v_blocks;
|
|
int32_t dcecs_not_coded_blocks;
|
|
int32_t dcecs_dct_coefs;
|
|
int32_t dcecs_dct_lines;
|
|
int32_t dcecs_vlc_symbols;
|
|
int32_t dcecs_vlc_bits;
|
|
int32_t dcecs_apm;
|
|
int32_t dcecs_npm;
|
|
int32_t dcecs_interpolate_mc_q;
|
|
int32_t dcecs_forw_back_mc_q;
|
|
int32_t dcecs_halfpel2;
|
|
int32_t dcecs_halfpel4;
|
|
int32_t dcecs_sadct; // verid != 1
|
|
int32_t dcecs_quarterpel; // verid != 1
|
|
} mp4_ComplexityEstimation;
|
|
|
|
/* mp4_Scalability Info */
|
|
typedef struct _mp4_ScalabilityParameters {
|
|
int32_t dummy;
|
|
} mp4_ScalabilityParameters;
|
|
|
|
/* VOLControlParameters Info */
|
|
typedef struct _mp4_VOLControlParameters {
|
|
int32_t chroma_format;
|
|
int32_t low_delay;
|
|
int32_t vbv_parameters;
|
|
int32_t bit_rate;
|
|
int32_t vbv_buffer_size;
|
|
int32_t vbv_occupancy;
|
|
} mp4_VOLControlParameters;
|
|
|
|
/* Video Object Plane with int16_t header Info */
|
|
typedef struct _mp4_VideoObjectPlaneH263 {
|
|
int32_t temporal_reference;
|
|
int32_t split_screen_indicator;
|
|
int32_t document_camera_indicator;
|
|
int32_t full_picture_freeze_release;
|
|
int32_t source_format;
|
|
int32_t picture_coding_type;
|
|
int32_t vop_quant;
|
|
int32_t gob_number;
|
|
int32_t num_gobs_in_vop;
|
|
int32_t num_macroblocks_in_gob;
|
|
int32_t gob_header_empty;
|
|
int32_t gob_frame_id;
|
|
int32_t quant_scale;
|
|
int32_t num_rows_in_gob;
|
|
} mp4_VideoObjectPlaneH263;
|
|
|
|
/* Video Object Info */
|
|
typedef struct _mp4_VideoObject {
|
|
// iso part
|
|
int32_t id;
|
|
int32_t short_video_header;
|
|
int32_t random_accessible_vol;
|
|
int32_t type_indication;
|
|
int32_t is_identifier;
|
|
int32_t verid;
|
|
int32_t priority;
|
|
int32_t aspect_ratio_info;
|
|
int32_t aspect_ratio_info_par_width;
|
|
int32_t aspect_ratio_info_par_height;
|
|
int32_t is_vol_control_parameters;
|
|
mp4_VOLControlParameters VOLControlParameters;
|
|
int32_t shape;
|
|
int32_t shape_extension; // verid != 1
|
|
int32_t vop_time_increment_resolution;
|
|
int32_t vop_time_increment_resolution_bits;
|
|
int32_t fixed_vop_rate;
|
|
int32_t fixed_vop_time_increment;
|
|
int32_t width;
|
|
int32_t height;
|
|
int32_t interlaced;
|
|
int32_t obmc_disable;
|
|
int32_t sprite_enable; // if verid != 1 (2 bit GMC is added)
|
|
int32_t sprite_width;
|
|
int32_t sprite_height;
|
|
int32_t sprite_left_coordinate;
|
|
int32_t sprite_top_coordinate;
|
|
int32_t sprite_warping_points;
|
|
int32_t sprite_warping_accuracy;
|
|
int32_t sprite_brightness_change;
|
|
int32_t low_latency_sprite_enable;
|
|
int32_t sadct_disable; // verid != 1
|
|
int32_t not_8_bit;
|
|
int32_t quant_precision;
|
|
int32_t bits_per_pixel;
|
|
int32_t no_gray_quant_update;
|
|
int32_t composition_method;
|
|
int32_t linear_composition;
|
|
int32_t quant_type;
|
|
int32_t load_intra_quant_mat;
|
|
uint8_t intra_quant_mat[64];
|
|
int32_t load_nonintra_quant_mat;
|
|
uint8_t nonintra_quant_mat[64];
|
|
int32_t load_intra_quant_mat_grayscale[3];
|
|
uint8_t intra_quant_mat_grayscale[3][64];
|
|
int32_t load_nonintra_quant_mat_grayscale[3];
|
|
uint8_t nonintra_quant_mat_grayscale[3][64];
|
|
int32_t quarter_sample; // verid != 1
|
|
int32_t complexity_estimation_disable;
|
|
mp4_ComplexityEstimation ComplexityEstimation;
|
|
int32_t resync_marker_disable;
|
|
int32_t data_partitioned;
|
|
int32_t reversible_vlc;
|
|
int32_t newpred_enable; // verid != 1
|
|
int32_t requested_upstream_message_type;// verid != 1
|
|
int32_t newpred_segment_type; // verid != 1
|
|
int32_t reduced_resolution_vop_enable; // verid != 1
|
|
int32_t scalability;
|
|
mp4_ScalabilityParameters ScalabilityParameters;
|
|
mp4_GroupOfVideoObjectPlane GroupOfVideoObjectPlane;
|
|
mp4_VideoObjectPlane VideoObjectPlane;
|
|
mp4_VideoObjectPlaneH263 VideoObjectPlaneH263;
|
|
// app part
|
|
int32_t VOPindex;
|
|
int32_t MacroBlockPerRow;
|
|
int32_t MacroBlockPerCol;
|
|
int32_t MacroBlockPerVOP;
|
|
int32_t mbns; // num bits for MacroBlockPerVOP
|
|
mp4_MacroBlock* MBinfo;
|
|
mp4_IntraPredBuff IntraPredBuff;
|
|
mp4_DataPartMacroBlock* DataPartBuff;
|
|
IppiQuantInvIntraSpec_MPEG4* QuantInvIntraSpec;
|
|
IppiQuantInvInterSpec_MPEG4* QuantInvInterSpec;
|
|
IppiWarpSpec_MPEG4* WarpSpec;
|
|
// for B-VOP
|
|
int32_t prevPlaneIsB;
|
|
// for interlaced B-VOP direct mode
|
|
int32_t Tframe;
|
|
IppMotionVector* FieldMV;
|
|
// for B-VOP direct mode
|
|
int32_t TRB, TRD;
|
|
// time increment of past and future VOP for B-VOP
|
|
int64_t rTime, nTime;
|
|
// VOP global time
|
|
int64_t vop_sync_time, vop_sync_time_b;
|
|
#ifdef USE_NOTCODED_STATE
|
|
// not_coded MB state
|
|
uint8_t* ncState;
|
|
int32_t ncStateCleared;
|
|
#endif
|
|
} mp4_VideoObject;
|
|
|
|
/* StillTexture Object Info */
|
|
typedef struct _mp4_StillTextureObject {
|
|
int32_t dummy;
|
|
} mp4_StillTextureObject;
|
|
|
|
/* Mesh Object Info */
|
|
typedef struct _mp4_MeshObject {
|
|
int32_t dummy;
|
|
} mp4_MeshObject;
|
|
|
|
/* Face Object Info */
|
|
typedef struct _mp4_FaceObject {
|
|
int32_t dummy;
|
|
} mp4_FaceObject;
|
|
|
|
/* video_signal_type Info */
|
|
typedef struct _mp4_VideoSignalType {
|
|
int32_t is_video_signal_type;
|
|
int32_t video_format;
|
|
int32_t video_range;
|
|
int32_t is_colour_description;
|
|
int32_t colour_primaries;
|
|
int32_t transfer_characteristics;
|
|
int32_t matrix_coefficients;
|
|
} mp4_VideoSignalType;
|
|
|
|
/* Visual Object Info */
|
|
typedef struct _mp4_VisualObject {
|
|
int32_t is_identifier;
|
|
int32_t verid;
|
|
int32_t priority;
|
|
int32_t type;
|
|
mp4_VideoSignalType VideoSignalType;
|
|
mp4_VideoObject VideoObject;
|
|
mp4_StillTextureObject StillTextureObject;
|
|
mp4_MeshObject MeshObject;
|
|
mp4_FaceObject FaceObject;
|
|
mp4_Frame *sFrame; // static sprite
|
|
mp4_Frame *cFrame; // current TODO make pointer
|
|
mp4_Frame *rFrame; // reference in past TODO make pointer
|
|
mp4_Frame *nFrame; // reference in future TODO make pointer
|
|
int32_t frameCount;
|
|
int32_t frameInterval;
|
|
int32_t frameScale;
|
|
mp4_Statistic Statistic;
|
|
mp4_Frame *frame_cache; // linked list of available frames (malloc cache)
|
|
mp4_Frame *sprite_cache; // linked list of available sprite (malloc cache)
|
|
mp4_Frame *display_frames; // linked list of display frames
|
|
} mp4_VisualObject;
|
|
|
|
/* Full Info */
|
|
typedef struct _mp4_Info {
|
|
int32_t ftype; // 0 - raw, 1 - mp4, 2 - avi
|
|
int32_t ftype_f; // ftype == 1 (0 - QuickTime(tm)), ftype == 2 (0 - DivX(tm) v. < 5, XVID, 1 - DivX(tm) v. >= 5)
|
|
uint8_t* buffer; /* buffer header for saving MPEG-4 stream */
|
|
size_t buflen; /* total buffer length */
|
|
size_t len; /* valid data in buffer */
|
|
uint8_t* bufptr; /* current frame, point to header or data */
|
|
int32_t bitoff; /* mostly point to next frame header or PSC */
|
|
int32_t profile_and_level_indication;
|
|
mp4_VisualObject VisualObject;
|
|
int32_t stopOnErr;
|
|
int strictSyntaxCheck;
|
|
int noPVOPs;
|
|
int noBVOPs;
|
|
} mp4_Info;
|
|
|
|
/* bitstream functions */
|
|
extern uint8_t* mp4_FindStartCodePtr(mp4_Info* pInfo);
|
|
extern uint8_t* mp4_FindStartCodeOrShortPtr(mp4_Info* pInfo);
|
|
extern int32_t mp4_SeekStartCodePtr(mp4_Info* pInfo);
|
|
extern int32_t mp4_SeekStartCodeOrShortPtr(mp4_Info* pInfo);
|
|
extern int32_t mp4_SeekStartCodeValue(mp4_Info* pInfo, uint8_t code);
|
|
extern uint8_t* mp4_FindShortVideoStartMarkerPtr(mp4_Info* pInfo);
|
|
extern int32_t mp4_SeekShortVideoStartMarker(mp4_Info* pInfo);
|
|
extern int32_t mp4_SeekGOBMarker(mp4_Info* pInfo);
|
|
extern int32_t mp4_SeekResyncMarker(mp4_Info* pInfo);
|
|
extern int32_t mp4_FindResyncMarker(mp4_Info* pInfo);
|
|
extern int mp4_IsStartCodeOrShort(mp4_Info* pInfo);
|
|
extern int mp4_IsStartCodeValue(mp4_Info* pInfo, int min, int max);
|
|
extern int mp4_IsShortCode(mp4_Info* pInfo);
|
|
|
|
/* tables */
|
|
typedef struct _mp4_VLC1 {
|
|
uint8_t code;
|
|
uint8_t len;
|
|
} mp4_VLC1;
|
|
|
|
extern const uint8_t mp4_DefaultIntraQuantMatrix[];
|
|
extern const uint8_t mp4_DefaultNonIntraQuantMatrix[];
|
|
extern const uint8_t mp4_ClassicalZigzag[];
|
|
extern const uint8_t mp4_DCScalerLuma[];
|
|
extern const uint8_t mp4_DCScalerChroma[];
|
|
extern const uint8_t mp4_cCbCrMvRound16[];
|
|
extern const uint8_t mp4_cCbCrMvRound12[];
|
|
extern const uint8_t mp4_cCbCrMvRound8[];
|
|
extern const uint8_t mp4_cCbCrMvRound4[];
|
|
extern const Ipp8s mp4_dquant[];
|
|
extern const mp4_VLC1 mp4_cbpy1[];
|
|
extern const mp4_VLC1 mp4_cbpy2[];
|
|
extern const mp4_VLC1 mp4_cbpy3[];
|
|
extern const mp4_VLC1 mp4_cbpy4[];
|
|
extern const mp4_VLC1* mp4_cbpy_t[];
|
|
extern const uint8_t mp4_cbpy_b[];
|
|
extern const int32_t mp4_DC_vlc_Threshold[];
|
|
extern const uint8_t mp4_PVOPmb_type[];
|
|
extern const uint8_t mp4_PVOPmb_cbpc[];
|
|
extern const uint8_t mp4_PVOPmb_bits[];
|
|
extern const mp4_VLC1 mp4_BVOPmb_type[];
|
|
extern const mp4_VLC1 mp4_MVD_B12_1[];
|
|
extern const mp4_VLC1 mp4_MVD_B12_2[];
|
|
extern const int32_t mp4_H263_width[];
|
|
extern const int32_t mp4_H263_height[];
|
|
extern const int32_t mp4_H263_mbgob[];
|
|
extern const int32_t mp4_H263_gobvop[];
|
|
extern const int32_t mp4_H263_rowgob[];
|
|
extern const uint8_t mp4_aux_comp_count[];
|
|
extern const uint8_t mp4_aux_comp_is_alpha[];
|
|
extern const uint8_t mp4_BABtypeIntra[][3];
|
|
extern const int32_t mp4_DivIntraDivisor[];
|
|
|
|
// project functions
|
|
extern void mp4_Error(const char *str);
|
|
//#define mp4_Error(str) puts(str)
|
|
extern mp4_Status mp4_InitVOL(mp4_Info *pInfo);
|
|
extern mp4_Status mp4_FreeVOL(mp4_Info *pInfo);
|
|
extern void mp4_ResetVOL(mp4_Info *pInfo);
|
|
//extern void mp4_ShowFrame(mp4_Frame *frame);
|
|
#define mp4_ShowFrame(frame)
|
|
extern mp4_Status mp4_Parse_VisualObjectSequence(mp4_Info* pInfo);
|
|
extern mp4_Status mp4_Parse_VisualObject(mp4_Info* pInfo);
|
|
extern mp4_Status mp4_Parse_VideoObject(mp4_Info* pInfo);
|
|
extern mp4_Status mp4_Parse_GroupOfVideoObjectPlane(mp4_Info* pInfo);
|
|
extern mp4_Status mp4_Parse_VideoObjectPlane(mp4_Info* pInfo);
|
|
extern mp4_Status mp4_DecodeVideoObjectPlane(mp4_Info* pInfo);
|
|
|
|
#ifndef USE_INLINE_BITS_FUNC
|
|
extern uint32_t mp4_ShowBits(mp4_Info* pInfo, int32_t n);
|
|
extern uint32_t mp4_ShowBit(mp4_Info* pInfo);
|
|
extern uint32_t mp4_ShowBits9(mp4_Info* pInfo, int32_t n);
|
|
extern void mp4_FlushBits(mp4_Info* pInfo, int32_t n);
|
|
extern uint32_t mp4_GetBits(mp4_Info* pInfo, int32_t n);
|
|
//extern uint32_t mp4_GetBit(mp4_Info* pInfo);
|
|
extern uint32_t mp4_GetBits9(mp4_Info* pInfo, int32_t n);
|
|
extern void mp4_AlignBits(mp4_Info* pInfo);
|
|
extern void mp4_AlignBits7F(mp4_Info* pInfo);
|
|
extern uint32_t mp4_ShowBitsAlign(mp4_Info* pInfo, int32_t n);
|
|
extern uint32_t mp4_ShowBitsAlign7F(mp4_Info* pInfo, int32_t n);
|
|
#else
|
|
__INLINE uint32_t mp4_ShowBits(mp4_Info* pInfo, int32_t n)
|
|
{
|
|
uint8_t* ptr = pInfo->bufptr;
|
|
uint32_t tmp = (ptr[0] << 24) | (ptr[1] << 16) | (ptr[2] << 8) | (ptr[3]);
|
|
tmp <<= pInfo->bitoff;
|
|
tmp >>= 32 - n;
|
|
return tmp;
|
|
}
|
|
|
|
__INLINE uint32_t mp4_ShowBit(mp4_Info* pInfo)
|
|
{
|
|
uint32_t tmp = pInfo->bufptr[0];
|
|
tmp >>= 7 - pInfo->bitoff;
|
|
return (tmp & 1);
|
|
}
|
|
|
|
__INLINE uint32_t mp4_ShowBits9(mp4_Info* pInfo, int32_t n)
|
|
{
|
|
uint8_t* ptr = pInfo->bufptr;
|
|
uint32_t tmp = (ptr[0] << 8) | ptr[1];
|
|
tmp <<= (pInfo->bitoff + 16);
|
|
tmp >>= 32 - n;
|
|
return tmp;
|
|
}
|
|
|
|
__INLINE void mp4_FlushBits(mp4_Info* pInfo, int32_t n)
|
|
{
|
|
n = n + pInfo->bitoff;
|
|
pInfo->bufptr += n >> 3;
|
|
pInfo->bitoff = n & 7;
|
|
}
|
|
|
|
__INLINE uint32_t mp4_GetBits(mp4_Info* pInfo, int32_t n)
|
|
{
|
|
uint8_t* ptr = pInfo->bufptr;
|
|
uint32_t tmp = (ptr[0] << 24) | (ptr[1] << 16) | (ptr[2] << 8) | (ptr[3]);
|
|
tmp <<= pInfo->bitoff;
|
|
tmp >>= 32 - n;
|
|
n = n + pInfo->bitoff;
|
|
pInfo->bufptr += n >> 3;
|
|
pInfo->bitoff = n & 7;
|
|
return tmp;
|
|
}
|
|
|
|
__INLINE uint32_t mp4_GetBits9(mp4_Info* pInfo, int32_t n)
|
|
{
|
|
uint8_t* ptr = pInfo->bufptr;
|
|
uint32_t tmp = (ptr[0] << 8) | ptr[1];
|
|
tmp <<= (pInfo->bitoff + 16);
|
|
tmp >>= 32 - n;
|
|
n = n + pInfo->bitoff;
|
|
pInfo->bufptr += n >> 3;
|
|
pInfo->bitoff = n & 7;
|
|
return tmp;
|
|
}
|
|
|
|
__INLINE void mp4_AlignBits(mp4_Info* pInfo)
|
|
{
|
|
if (pInfo->bitoff > 0) {
|
|
pInfo->bitoff = 0;
|
|
(pInfo->bufptr)++;
|
|
}
|
|
}
|
|
|
|
__INLINE void mp4_AlignBits7F(mp4_Info* pInfo)
|
|
{
|
|
if (pInfo->bitoff > 0) {
|
|
pInfo->bitoff = 0;
|
|
(pInfo->bufptr)++;
|
|
} else {
|
|
if (*pInfo->bufptr == 0x7F)
|
|
(pInfo->bufptr)++;
|
|
}
|
|
}
|
|
|
|
__INLINE uint32_t mp4_ShowBitsAlign(mp4_Info* pInfo, int32_t n)
|
|
{
|
|
uint8_t* ptr = pInfo->bitoff ? (pInfo->bufptr + 1) : pInfo->bufptr;
|
|
uint32_t tmp = (ptr[0] << 24) | (ptr[1] << 16) | (ptr[2] << 8) | (ptr[3]);
|
|
tmp >>= 32 - n;
|
|
return tmp;
|
|
}
|
|
|
|
__INLINE uint32_t mp4_ShowBitsAlign7F(mp4_Info* pInfo, int32_t n)
|
|
{
|
|
uint8_t* ptr = pInfo->bitoff ? (pInfo->bufptr + 1) : pInfo->bufptr;
|
|
uint32_t tmp;
|
|
if (!pInfo->bitoff) {
|
|
if (*ptr == 0x7F)
|
|
ptr ++;
|
|
}
|
|
tmp = (ptr[0] << 24) | (ptr[1] << 16) | (ptr[2] << 8) | (ptr[3]);
|
|
tmp >>= 32 - n;
|
|
return tmp;
|
|
}
|
|
|
|
#endif // USE_INLINE_BITS_FUNC
|
|
|
|
__INLINE uint32_t mp4_GetBit(mp4_Info* pInfo)
|
|
{
|
|
uint32_t tmp = pInfo->bufptr[0];
|
|
if (pInfo->bitoff != 7) {
|
|
tmp >>= 7 - pInfo->bitoff;
|
|
pInfo->bitoff ++;
|
|
} else {
|
|
pInfo->bitoff = 0;
|
|
pInfo->bufptr ++;
|
|
}
|
|
return (tmp & 1);
|
|
}
|
|
|
|
__INLINE int32_t mp4_GetMarkerBit(mp4_Info* pInfo) {
|
|
if (!mp4_GetBit(pInfo)) {
|
|
mp4_Error("Error: wrong marker bit");
|
|
return 0;
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
// added by benski
|
|
extern mp4_Frame *CreateFrame(mp4_VisualObject *object);
|
|
extern void ReleaseFrame(mp4_VisualObject *object, mp4_Frame *frame);
|
|
extern mp4_Frame *GetDisplayFrame(mp4_VisualObject *object);
|
|
extern void DisplayFrame(mp4_VisualObject *object, mp4_Frame *frame);
|
|
extern void FreeCache(mp4_VisualObject *object);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|