tcpmp播放器介绍_第1页
tcpmp播放器介绍_第2页
tcpmp播放器介绍_第3页
tcpmp播放器介绍_第4页
tcpmp播放器介绍_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、TCPMP(The Core Pocket Media Player),这是一个应用于智能设备上的开源媒体播放软件。TCPMP是一个功能强大开放式的开源多媒体播放器,播放器主要由核心框架模块(common工程)和解码器分离器插件组成。TCPMP的插件非常多,联合几个最常用的插件(ffmpeg、splitter)来说明,其中interface 插件实现TCPMP的界面,由于他和媒体播放没有什么关系,这部分可以完全被替换掉,替 换成自己的界面。ffmpeg工程是系统主要的音视频解码模块,ffmpeg是一个集录制、转换、音/视频编码 解码功能为一体的完整的开源解决方案。FFmpeg的开发是基于Lin

2、ux操作系统,但是可以 在大多数操作系统中编译和使用。ffmpeg支持MPEG、DivX、MPEG4、AC3、DV、FLV等 40多种编码,AVI、MPEG、OGG、Matroska、ASF等90多种解码。很多开源播放器都用 到了 ffmpeg。但是ffmpeg程序解码效率不是很高,系统仅仅使用了 FFmpeg的部分解码功 能。ffmpeg 主目录下主要有 libavcodec、libavformat 和 libavutil 等子目录。其中 libavcodec 用于存放各个encode/decode模块,libavformat用于存放muxer/demuxer模块,libavutil用于 存

3、放内存操作等常用模块。本系统的媒体文件分离器有单独的splitter模块完成所以不需要 libavformat 子目录。ffmpeg 目录下 libavcodec、libavutil 保留子目录。libmad工程用于MP3文件解码,该工程包含两个功能模块,一个负责解析MP3文件格 式,包括MPEG1音频文件(MP1,MP2,MP3,MPA),读取每一帧音频数据;另一个负责解码 MPEG1音频数据,解码代码在libmad子目录中。libmad是一个开源的高精度MPEG1音频解码库,支持MPEG-1(Layer I, Layer II和 LayerIII,也就是 MP3)。libmad提供 24-

4、bit 的 PCM 输出,完全是定点 计算,非常适合没有浮点支持的平台上使用。使用libmad提供的一系列API,就可以非常 简单地实现MP3数据解码工作。在libmad的源代码文件目录下的mad.h文件中,可以看到 绝大部分该库的数据结构和API等。libmad是用的fixed-integer,通过整数模拟小数计算的, 精度只能保证到小数点后第9位(大于0的最小值0.00000000372529),虽然解码精度会有 损失,但是极大提高了解码效率,特别是在嵌入式设备上也可以实现高码率MP3文件的解 码。splitter工程用于解析多种音视频文件格式。可以解析的文件格式包括:ASF媒体文件, 视

5、频文件(AVI,DIVX),Windows 波形文件(WAV,RMP),MPEG 电影文件(MPEG,MPG,MPV), MPEG4文件(MP4,3GP,M4A,M4B,K3G)。以上格式可以被解析但是数据编码不一定能正确 解码,需要依赖系统的解码器。common工程是核心模块,是一个开放的集数据输入、转换、音视频解码、信号输出等 功能为一体的完整的多媒体播放框架。这个框架自身不包含任何的Decode和Split功能,这 些功能由插件实现,核心模块以一个树状结构管理所有的功能模块和插件模块,实现数据 Render功能,对输入、转换、输出流程的控制,接受播放过程中的操作和对事件进行处理, 同时也

6、实现系统运行中经常使用的一些共用函数,比如解码过程中经常使用的逆离散余弦变 换,内存操作,界面中需要使用的多语言字符处理等.common工程的主目录下主要有:blit、 dyncode、overlay pcm、softidct、Win32、zlib 等子目录。其中 blit 和 overlay 存放是视频信 号渲染模块,pcm存放PCM音频信号转换模块,softidct存放逆离散余弦变换函数,Win32 存放内存操作等常用模块,dyncode这个目录的代码比较晦涩,存放的是程序运行是动态生 成代码模块,针对不同的CPU指令集,PCM数据数据声道和采样率不同,视频渲染数据格 式和色深等不同情况动

7、态生成不同的优化代码(这段代码非常精彩,不能不让人佩服TCPMP 作者的高超水平)。核心模块有一个上下文对象context,该对象在初始化函数 bool_t Context_Init(中)候创建了一个该对象实例。该对象实例记录管理各个功能模块,用户界面可以通过该对象和核心模块交互,管理控制播放过程。Context对象说明:typedef struct contextint Version; /版本信息uint32_t ProgramId;const tchar_t* ProgramName; /应用程序名称const tchar_t* ProgramVersion; /程序版本号,字符串con

8、st tchar_t* CmdLine; /程序命令行信息void* Wnd; /视频渲染窗口句柄void* NodeLock; /功能模块访问临界区互斥变量array Node; /功能模块数据对象数组array NodeClass; /功能模块定义对象数组,按照系统逻辑关系组织array NodeClassPri; /功能模块定义对象数组,按照系统逻辑关系和模块优先级排列array NodeModule; /夕卜部插件模块数组int LoadModuleNo; 当前正在装载的外部插件序号void* LoadModule;array StrTable2; /字符串资源数组,字符串分为给底层使

9、用的标准字符串资源和给界面使用的显示字符串资源,两种资源用两个数组表示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;

10、/播放控制模块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; /可以使用的有效内存数是否小于系统要求的最低要

11、求动态代码生成中间状态及数据bool_t CodeFailed;bool_t CodeMoveBack;bool_t CodeDelaySlot;void* CodeLock;void* CodelnstBegin;void* CodeInstEnd;int NextCond;bool_t NextSet;bool_t NextByte;bool_t NextHalf;bool_t NextSign;uint32_t* FlushCache; /未使用void* CharConvertUTF8; /未使用void* CharConvertCustom; /未使用int CustomCodePa

12、ge; /未使用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* ersion, int Id,const tchar_t* CmdLine, void* Applicat

13、ion);其中 Name 参数为应用程序名称, Version为版本信息字符串。释放上下文对象的全局函数是void Context_Done();。void Context_Wnd(void*);函数将视频播放窗口句柄初始化给设备上下文。功能模块包含定义对象和数据对象,定义对象描述功能模块相互间的逻辑结构,数据对 象记录模块属性和方法。所有的功能模块结构按一个树状结构来组织,结构关系如下,NODE是整个结构的根结 点,其下为子节点,节点按类型可分为实节点,全局节点,设置节点,抽象节点。#define CF_SIZE 0 x00FFFFFF#define CF_GLOBAL 0 x0100000

14、0#define CF_SETTINGS 0 x02000000#define CF_ABSTRACT 0 x08000000抽象节点没有对应的对象实例,类似C+的抽象基类,为了按照逻辑关系组织系统结构 而存在,例如NODE就是抽象节点。全局节点全局只有一个对象的实例,如播放控制模块 PLAYER_I D。设置节点表示和系统播放设置相关,比如声音均衡器模块EQUALIZER_ID, 颜色控制模块COLOR_ID。实节点与抽象节点不同,指可以生成对象实例的节点,实节点 没有特殊标识,一般以数据对象占用内存大小表示是否是一个实节点,创建节点时要根据该 信息分配内存单元,实节点也可以有子节点,例如:

15、MMS_ID的父节点是HTTP_ID。全局 节点,设置节点和实节点可以相互组合,比如播放控制节点同时是全局节点,设置节点和实 节点。节点名称后带ID的就是实节点,否则就是抽象节点。NODE (根节点)FLOW (流控制模块)| CODEC (解码模块)| | EQUALIZERJD (声音均衡器模块)| | VBUFFERJD (视频缓冲模块)| | |_DMO (DirectX Media Object)| | | |WMV_ID| | | |WMS_ID| | | |WMVA_ID| | | |WMA_ID| | | !WMAV_ID| | |FFMPEG VIDEO (FFMpeg 解码

16、模块)| | L-LIBMAD_ID (Libmad Mp3 解码模块)| OUT (信号渲染模块)| | AOUT (音频信号渲染)| | | |NULLAUDIO_ID| | | L-WAVEOUT_ID| | L-VOUT (视频信号渲染)| |NULLVIDEO_ID| | L-OVERLAY| IDCT (离散余弦解码模块)| | L-softidct_id| L-CODECIDCT (离散余弦解码模块,函数比IDCT要少)| L-mpeG1_ID|MEDIA (媒体文件格式编码解析模块)| FORMAT (格式解析模块)| | L-FORMATBASE| | |-RAWAUDIO|

17、 L-mP3_ID|-RAWIMAGE|-asf_id|AVI_ID|MP4_ID|MPG_ID|NSV_ID|L-wav_id| PLAYLIST (播放列表模块)| | |-asx_id| | |M3U_ID| | L-pls_ID| L-STREAMPROCESS (数据流处理模块)STREAM (数据输入模块)| MEMSTREAM_ID (内存数据流模块)| |FILE_ID (文件 IO 模块)| L-HTTP_ID (网络数据获取模块)TIMER (定时器模块)I l-SYSTIMER_IDASSOCIATION_ID (文件扩展名自动关联模块)ADVANCED_ID (高级设置

18、模块)COLOR_ID (颜色控制模块)platform_id (平台信息模块)|XSCALEDRIVER_ID (Intel XScale CPU 信息模块)player_id (播放控制模块)L-PLAYER_BUFFER_ID (播放缓冲模块)节点树状结构由若干个静态定义对象(nodedef)实例实现,typedef struct nodedefint Flags;int Class;int ParentClass;int Priority;nodecreate Create;nodedelete Delete; nodedef;Flags表示当前节点的类型:抽象、实节点、全局、设置。C

19、lass表示当前节点的标识,如MEDIA_CLASS或ASF_ID等等。ParentClass表示当前节点的父节点标识,如SYSTIMER_ID对象的父节点是 TIMER_CLASS。Priority表示当前节点优先级。Create和Delete是两个函数指针,表示该节点的创建函数和销毁函数。如播放控制模块的结构定义是static const nodedef Player =sizeof(player_base)|CF_GLOBAL|CF_SETTINGS,PLAYER_ID,NODE_CLASS,PRI_MAXIMUM+600,(nodecreate)Create,(nodedelete)D

20、elete,;绝大多数节点都有一个对应的数据对象,记录该节点的数据和方法,每一个子节点对 象都是以父节点对象作为该节点一个元素,类似C+的封装继承机制。如果子节点的父节点 没有数据对象,该节点可以从node节点直接继承。每一个节点都可以看成Node节点的直 接或间接子节点,所以所有节点头以一个相同的node结构开头,子节点可能还有自己的属 性,在继承父对象后就是子节点自己的元素。typedef struct nodeint Class;nodeenum Enum;nodeget Get;nodeset Set; node;Class表示该对象的标识,如PLAYER_ID。Enum是一个函数指针

21、,指向一个函数用于枚举当前节点的属性。Get是一个函数指针,得到当前节点某一属性值。Set是一个函数指针,设置当前节点的某一属性数值。节点的属性值数据特性在一个static const datatable xxxParams = ;的静态数组里定义。typedef struct datatableint No;int Type;int Flags;int Format1;int Format2; datatable;No表示属性的标识,如播放控制模块的#define PLAYER_PLAY 0 x32就表示控制播放 器播放或暂停。Type表示属性的数据类型,可用值在node.h中定义。Flag

22、s是属性数据的标志,表示该数据是不是只读数据,是否有最大最小值等等,可用 值在node.h中定义,如果该标志包含DF_SETUP同时不包含DF_NOSAVE和DF_RDONLY 属性,该属性会被记录在注册表中,下次启动时用注册表的数据初始化该属性。Format1和Format2是可选标志与Flags配合使用,比如如果Flags表示该属性存在最 大最小值,Format 1和Format2可以分别表示最小和最大数值。在在系统上下文对象中有两个元素记录节点信息array Node;和array NodeClass;, array 是数组数据类型,Node是节点数据对象的数组,NodeClass节点对

23、象的数组,按照系统逻辑 关系组织。创建节点时传入nodedef对象到节点创建函数,函数会根据nodedef信息生成对应 nodeclass对象添加到NodeClass数组,同时根据nodedef信息分配数据对象的内存空间。在 该节点的Create函数里面再初始化该节点的数据对象。在所有功能模块中和界面加交互的主要就是播放控制模块struct node* Player;使用方法 如下:context* p = Context();player* myplayer = NULL;if(p) myplayer = (player*)(p-Player);控制播放参数使用 Set(void* This

24、,int No,const void* Data,int Size);函数,第一个参数是播 放模块指针,第二个参数是控制代码,即要进行什么操作,第三个参数是需要赋值给控制代 码的数值,最后一个参数是所赋数值的占用内存的大小。例如开始播放的代码是:myplayer-Set(myplayer,PLAYER_PLAY1,sizeof(int);PLAYER_PLAY为控制代码,表示当前控制的是播放暂停功能,数值为1表示播放为0 表示暂停。得到某一控制属性使用Get(void* This,int No,void* Data,int Size);函数,参数含义和Set 函数相同。控制代码是一组宏,定义在

25、player.h文件中。比较重要的控制参数有/ play or pause (bool_t)#define PLAYER_PLAY 0 x32/ position in fraction (fraction)#define PLAYER_PERCENT 0 x25/ position in time (tick_t)#define PLAYER_POSITION 0 x28/ current format (format*)#define PLAYER_FORMAT 0 x2B/ current file in playlist (int)#define PLAYER_LIST_CURRENT 0 x2F/ current file index (suffled) in playlist (int)#define PLAYER_LIST_CURRIDX 0 xA2/ fullscreen mode (bool_t)#define PLAYER_

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论