http://blog.sina.com.cn/s/blog_5be1061c0100azwv.html
Common.dll作为TCPMP控制各个节点的核心,当然也是播放控制的核心。首先,我们需要来看一下TCPMP的上下文对象context。其结构体如下:
typedef struct context
{
int Version; //版本信息
uint32_t ProgramId;
const tchar_t*
ProgramName; //应用程序名称
const tchar_t*
ProgramVersion; //程序版本号,字符串
const tchar_t*
CmdLine; //程序命令行信息
void*
Wnd; //视频渲染窗口句柄
void*
NodeLock; //功能模块访问临界区互斥变量
array
Node; //功能模块数据对象数组
array
NodeClass; //功能模块定义对象数组,按照系统逻辑关系组织
array
NodeClassPri; //功能模块定义对象数组,按照系统逻辑关系和模块优先级排列
array
NodeModule; //外部插件模块数组
int
LoadModuleNo; //当前正在装载的外部插件序号
void* LoadModule;
array
StrTable[2]; //字符串资源数组,字符串分为
//给底层使用的标准字符串资源和
//给界面使用的显示字符串资源,两种资源用两个数组表示
array StrBuffer;
array
StrModule; //未使用
void*
StrLock; //字符串数组访问临界区互斥变量
uint32_t
Lang; //当前使用语言标志
int
CodePage; //当前使用代码页标志
struct pcm_soft*
PCM; //PCM音频信号转换模块
struct blitpack*
Blit; //视频信号渲染模块
struct node*
Platform; //得到平台相关信息
struct node*
Advanced; //得到播放模块高级信息
struct node*
Player; //播放控制模块
notify
Error; //信息错误回调函数
//屏幕旋转信息,在某些系统中屏幕可以旋转90度或180度
int (*HwOrientation)(void*);
void *HwOrientationContext;
bool_t
TryDynamic; //未使用
int
SettingsPage; //未使用
size_t
StartUpMemory; //可以使用的有效内存数
bool_t InHibernate;
//是否进入休眠状态
bool_t
WaitDisable; //未使用
int
FtrId; //未使用
bool_t
LowMemory; //可以使用的有效内存数是否小于系统要求的最低要求
//动态代码生成中间状态及数据
bool_t CodeFailed;
bool_t CodeMoveBack;
bool_t CodeDelaySlot;
void* CodeLock;
void* CodeInstBegin;
void* CodeInstEnd;
int NextCond;
bool_t NextSet;
bool_t NextByte;
bool_t NextHalf;
bool_t NextSign;
uint32_t*
FlushCache; //未使用
void*
CharConvertUTF8; //未使用
void*
CharConvertCustom; //未使用
int
CustomCodePage; //未使用
void*
CharConvertAscii; //未使用
void* Application;
void*
Logger; //未使用
bool_t
KeepDisplay; //是否保持背光长亮
int
DisableOutOfMemory; //未使用
} context
核心模块上下文指针可以通过全局函数获得context* Context();
初始化上下文对象的全局函数是bool_t Context_Init(const tchar_t* Name,const
tchar_t* Version,int Id,const tchar_t* CmdLine,void*
Application);其中Name参数为应用程序名称,Version为版本信息字符串。
释放上下文对象的全局函数是void Context_Done();。
void Context_Wnd(void*);函数将视频播放窗口句柄初始化给设备上下文。
所有的功能模块结构按一个树状结构来组织, NODE是整个结构的根结点,其下为子节点。如下图:
NODE (根节点)
├─FLOW
(流控制模块)
│ ├─CODEC (解码模块)
│ │ ├─EQUALIZER_ID
(声音均衡器模块)
│ │ ├─VBUFFER_ID
(视频缓冲模块)
│ │ ├─DMO (DirectX Media
Object)
│ │ │
├─WMV_ID
│ │ │
├─WMS_ID
│ │ │
├─WMVA_ID
│ │ │
├─WMA_ID
│ │ │
└─WMAV_ID
│ │ ├─FFMPEG VIDEO (FFMpeg
解码模块)
│ │ └─LIBMAD_ID (Libmad
Mp3解码模块)
│ ├─OUT (信号渲染模块)
│ │ ├─AOUT (音频信号渲染)
│ │ │
├─NULLAUDIO_ID
│ │ │
└─WAVEOUT_ID
│ │ └─VOUT (视频信号渲染)
│
│
├─NULLVIDEO_ID
│
│
└─OVERLAY
│ ├─IDCT (离散余弦解码模块)
│ │ └─SOFTIDCT_ID
│ └─CODECIDCT(离散余弦解码模块,函数比IDCT要少)
│
└─MPEG1_ID
├─MEDIA
(媒体文件格式编码解析模块)
│ ├─FORMAT (格式解析模块)
│ │ └─FORMATBASE
│
│
├─RAWAUDIO
│
│
│ └─MP3_ID
│
│
├─RAWIMAGE
│
│
├─ASF_ID
│
│
├─AVI_ID
│
│
├─MP4_ID
│
│
├─MPG_ID
│
│
├─NSV_ID
│
│
└─WAV_ID
│ ├─PLAYLIST (播放列表模块)
│ │ ├─ASX_ID
│ │ ├─M3U_ID
│ │ └─PLS_ID
│ └─STREAMPROCESS (数据流处理模块)