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是两个函数指针,表示该节点的创建函数和销毁函数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值