《tcpmp代码分析》由会员分享,可在线阅读,更多相关《tcpmp代码分析(12页珍藏版)》请在金锄头文库上搜索。
1、TCPMP 源代码分析播放器主要由核心框架模块(common 工程)和解码器、分离器插件组成。TCPMP 的插件非常多,其中主要的插件有: interface 插件实现了 TCPMP的界面,ffmpeg 是系统主要的音视频解码模块,splitter 是媒体文件分离器。由于 ffmpeg 的解码效率不高,系统仅使用了 ffmpeg 的部分功能。并且未使用其中的 libavformat 模块,而使用 splitter 模块进行。其他插件暂时没有研究。本周主要分析的是 common 工程。common 工程是核心模块,是一个开放的集数据输入、转换、音/ 视频解码、信号输出等功能为一体的完整的多媒体播
2、放框架。这个框架自身不包含任何的 Decode 和 Split 功能,这些功能由插件实现,核心模块以一个树状结构管理所有的功能模块和插件模块,实现数据 Render 功能,对输入、转换、输出流程的控制,接受播放过程中的操作和对事件进行处理,同时也实现系统运行中经常使用的一些共用函数,比如解码过程中经常使用的逆离散余弦变换,内存操作,界面中需要使用的多语言字符处理等。common 工程的主目录下主要有:blit、dyncode、overlay、pcm、softidct、win32、zlib 等子目录。其中 blit 和 overlay 存放是视频信号渲染模块,pcm 存放 PCM 音频信号转换模
3、块,softidct 存放逆离散余弦变换函数,win32 存放内存操作等常用模块,dyncode 这个目录的代码比较晦涩,存放的是程序运行时动态生成代码模块,针对不同的 CPU 指令集,PCM 数据声道和采样率不同,视频渲染数据格式和色深等不同情况动态生成不同的优化代码,zlib 则提供了内存中压缩和解压缩的函数, 包括未压缩数据的完整性检查。以下是 common 工程核心模块中几个重要的概念:(1)上下文对象 context该对象在初始化函数 bool_t Context_Init 中创建了一个该对象实例(context.h)。该对象实例记录管理各个功能模块,用户界面可以通过该对象和核心模块
4、交互,管理控制播放过程。(2)功能模块功能模块包括定义对象 nodedef 和数据对象 node,定义对象描述功能模块相互间的逻辑结构,数据对象记录模块属性和方法。所有的功能模块结构按一个树状结构来组织,结构关系如下,NODE 是整个结构的根结点,其下为子节点,节点按类型可分为实节点,全局节点,设置节点,抽象节点。抽象节点没有对应的对象实例,类似 C+的抽象基类,为了按照逻辑关系组织系统结构而存在,例如 NODE 就是抽象节点。全局节点只有一个对象的实例,如播放控制模块 PLAYER_ID。设置节点表示和系统播放设置相关,比如声音均衡器模块 EQUALIZER_ID,颜色控制模块 COLOR_
5、ID。实节点与抽象节点不同,指可以生成对象实例的节点,实节点没有特殊标识,一般以数据对象占用内存大小表示是否是一个实节点,创建节点时要根据该信息分配内存单元,实节点也可以有子节点,例如:MMS_ID 的父节点是 HTTP_ID。全局节点,设置节点和实节点可以相互组合,比如播放控制节点同时是全局节点,设置节点和实节点。下面是主要的节点树状分布图:NODE_CLASS (根节点)FLOW_CLASS (流控制模块)(com Flow_Init ) CODEC_CLASS (解码模块)(com Codec_Init) AMRNB_ID AMRWB_ID EQUALIZER_ID (声音均衡器模块)(
6、com Equalizer_Init) VBUFFER_ID (视频缓冲模块) DMO_CLASS ( DirectX Media Object)(com dmo_init) WMV_ID WMS_ID WMVA_ID WMA_ID WMAV_ID FFMPEG_VIDEO_CLASS (FFMpeg 解码模块) (ffmpeg FFMPEG_Init) LIBMAD_ID ( Libmad Mp3 解码模块)(libmad LibMad_Init) OUT_CLASS (信号渲染模块) (com Flow_Init) AOUT_CLASS (音频信号渲染)(com Audio_Init) N
7、ULLAUDIO_ID WAVEOUT_ID VOUT_CLASS (视频信号渲染)(com Video_Init) NULLVIDEO_ID OVERLAY_CLASS (com Overlay_Init) AHI_ID (ati3200 ATI3200_Init) DDRAW_ID DIRECT_ID DDRAW_ID FLYTV_ID GAPI_ID GDI_ID RAW_ID IDCT_CLASS (离散余弦解码模块)(com IDCT_Init) SOFTIDCT_ID CODECIDCT_CLASS(离散余弦解码模块,函数比 IDCT 要少)(com IDCT_Init) MJPE
8、G_ID (camera MJPEG_Init) MPEG1_ID (mpeg1 MPEG1_Init) MSMPEG4_ID (mpeg4 msmpeg4_init) MPEG4_ID (mpeg4 mpeg4_done) H263_ID (mpeg4 mpeg4_done) I263_IDMEDIA_CLASS (媒体文件格式编码解析模块)(com Format_Init) FORMAT_CLASS (格式解析模块)(com Format_Init) FORMATBASE_CLASS (com FormatBase_Init) RAWAUDIO_CLASS (com RawAudio_In
9、it) MP3_ID (libmad LibMad_Init) AAC_ID (aac FAAD_Init) AA3_ID AMRNB_FILE_ID (mar AMRNB_Init) AMRWB_FILE_ID RAWIMAGE_CLASS(com RawImage_Init) JPEG_ID (camera MJPEG_Init) PNG_FILE_ID TIFF_FILE_ID ASAP_ID (asap ) ASF_ID (splitter ASF_Init) AVI_ID (splitter AVI_Init) FLV_ID (splitter FLV_Init) MP4_ID(sp
10、litter MP4_Init) MPG_ID (splitter MPG_Init) NSV_ID WEB_MJPEG_ID(camera MJPEG_Init) WAV_ID PLAYLIST (播放列表模块) ASX_ID M3U_ID PLS_ID STREAMPROCESS_CLASS (数据流处理模块)STREAM_CLASS (数据输入模块) MEMSTREAM_ID (内存数据流模块) FILE_ID (文件 IO 模块) HTTP_ID (网络数据获取模块)TIMER_CLASS (定时器模块) SYSTIMER_IDASSOCIATION_ID (文件扩展名自动关联模块)A
11、DVANCED_ID (高级设置模块)COLOR_ID (颜色控制模块)PLATFORM_ID (平台信息模块)XSCALEDRIVER_IDPLAYER_ID (播放控制模块)PLAYER_BUFFER_ID (播放缓冲模块)以下是 common 工程核心模块的几个重要数据结构:(1)context 上下文对象typedef struct contextint Version;/版本信息uint32_t ProgramId;/应用程序句柄const tchar_t* ProgramName;/应用程序名称const tchar_t* ProgramVersion;/程序版本号 ,字符串con
12、st tchar_t* CmdLine;/程序命令行信息void* Wnd;/视频渲染窗口句柄void* NodeLock;/功能模块访问临界区互斥变量array Node; /功能模块数据对象数组array NodeClass; / ordered by id 功能模块定义对象数组,按照系统逻辑关系组织array NodeClassPri; / ordered by priority|id 功能模块定义对象数组,按照系统逻辑关系和优先级排列array NodeModule;/外部插件模块数组int LoadModuleNo;/当前正在加载的外部插件序号void* LoadModule;/当前
13、正在加载的外部插件array StrTable2;/字符串资源数组,字符串分为:给底层使用的标准字符串资源、给界面使用的显示字符串资源,两个资源用两个数组表示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;/信息错误回调函数int (*HwOrientation)(void*);void *HwOrientationContext;bool_t TryDynamic;/未使用int SettingsPage;/未使用size_t StartUpMemory;/可以使用的有效内存数bool_t InHibernate;/是否进入休眠状态bool_t WaitDisable;/未使用int FtrId;/未使用bool_t LowMemory;/可以