WINCE TCPMP应用二: COMMON.DLL解析

 

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 (数据流处理模块)
├─STREAM (数据输入模块)
│  ├─MEMSTREAM_ID (内存数据流模块)
│  ├─FILE_ID (文件IO模块)
│  └─HTTP_ID (网络数据获取模块)
├─TIMER (定时器模块)
│  └─SYSTIMER_ID
├─ASSOCIATION_ID (文件扩展名自动关联模块)
├─ADVANCED_ID (高级设置模块)
├─COLOR_ID (颜色控制模块)
├─PLATFORM_ID (平台信息模块)
├─XSCALEDRIVER_ID (Intel XScale CPU 信息模块)
├─PLAYER_ID (播放控制模块)
└─PLAYER_BUFFER_ID (播放缓冲模块)

节点树状结构由若干个静态定义对象(nodedef)实例实现,
typedef struct nodedef
{
int  Flags;
int  Class;
int  ParentClass;
int  Priority;
nodecreate  Create;
nodedelete  Delete;
} nodedef;
Flags表示当前节点的类型:抽象、实节点、全局、设置。
Class表示当前节点的标识,如MEDIA_CLASS或ASF_ID等等。
ParentClass表示当前节点的父节点标识,如SYSTIMER_ID对象的父节点是TIMER_CLASS。
Priority表示当前节点优先级。
Create 和Delete是两个函数指针,表示该节点的创建函数和销毁函数

来自:http://blog.sina.com.cn/windowsce600

阅读更多
个人分类: TCPMP 相关
想对作者说点什么? 我来说一句

winceTcpmp全插件播放器

2009年10月26日 1.18MB 下载

Tcmp plg 文件

2012年09月18日 1.32MB 下载

TCPMPCE6.7z

2011年12月10日 1.45MB 下载

winceTCPMP原代码

2008年09月21日 5.01MB 下载

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭