类装载器DexClassLoader
1,作用:动态装载想要的class文件,标准的JAVA有一个classloader,使用它的对象可以装载class文件。当然在初始化时必须指定class文件的路径。
2,一般情况下,应用程序不需要创建一个全新的classloader对象,因为在Javaruntime环境初始化的时候,其内部会创建用于一个classloader加载runtime所需的各种Java类。
3,使用DexClassLoader可以将指定的class从某个库中装载来,然后使用反射机制调用方法。
线程局部存储“thread local storage TLS
希望:从同一个线程中引用该变量时,其值总是相同的,而从不同的线程中引用该变量时,其值应该不同,即需要一种作用域为线程的变量定义。这就是线程局部存储。
实现方法:建立一个全局表,通过当前线程ID去查询相应的数据,因为各个线程的ID不同,查到的数据自然也不同了
一般在connect之后发送describe请求之后,都会设置一个接收数据超时的定时器。
本文描述的对象是DMS软件模块(后文简称“本模块”),通过对设计过程的详细描述,以满足上游的需求,同时为本模块的编码工作提供必要的基础。
1.2 文档约定
本文档遵循以下约定:
a) 使用的模板是:“TP-D320 软件模块详细设计说明模板 V1.0”。
b) 表头文字使用了20%灰度背景。
c) 插图一律“嵌入”于描述正文中,而非“浮于文字上方”。
d) 用同号、同体但加粗的文字来强调需要读者重视的内容。
2 术语、定义和缩略语
2.1 术语、定义
本文使用的专用术语、定义见表2.1。
表2.1
术语/定义 英文对应词 含 义
动作 action UPnP网络中的远程过程调用;控制点将动作发送到设备服务,在动作完成(或失败)后,服务返回相应的结果或错误。
控制点 control point 客户端,获取设备提供的服务信息并使用服务。
设备 device 设备上提供的功能单元。
服务 service 服务端,用以在网络上提供各种服务,可能包含其它设备。
事件 event 事件是指服务的状态变量的一个或多个改变的通知。
[原文]Notification of one or more changes in state variables exposed by a service.
DIDL-Lite DIDL-Lite DIDL-Lite是DIDL的子集,采用W3C XML schema构建。
2.2 缩略语
本文使用的缩略语见表2.2。
表2.2
缩写 英 文 全 称 中 文 全 称
IPTV Internet Protocol Television 以电视为终端,以IP网络为承载网,为用户提供多媒体综合服务的业务。
STB Set Top Box 机顶盒
HTML Hypertext Markup Language 超文本链接标示语言
XML Extensible Markup Language 可扩展标记语言
TV Television 电视
VOD Video On Demand 视频点播
UPNP Universal Plug and Play 通用即插即用
DLNA Digital Living Network Alliance 数字生活网络联盟
DMP Digital Media Player 数字媒体播放器
DMS Digital Media Server 数字媒体服务器
SOAP Simple Object Access Protocol 简单对象访问协议
CP Control Point 控制点
DCP Device Control Point 设备控制点
GENA General Event Notification Architecture 通用事件通知架构
HTTP Hypertext Transfer Protocol 超文本传输协议
HTTPMU Hypertext Transfer Protocol Multicast 基于UDP的HTTP多播
HTTPU Hypertext Transfer Protocol Unicast 基于UDP的HTTP单播
SSDP Simple Service Discovery Protocol 简单服务发现协议
UDA UPnP Device Architecure UPnP设备体系结构
UPC Universal Product Code 通用产品代码
URI Uniform Resource Identifier 统一资源标识符
URL Uniform Resource Locator 统一资源定位器
URN Uniform Resource Name 统一资源名称
UUID Universally Unique Identifier 全球唯一标识符
DDD Device Description Document 设备描述文档
UDN Universal Device Name 全局设备名称
USN Unique Service Name 唯一的服务名称
SCPD Service Control Protocol Description 服务控制协议描述
ST Search Target SSDP中的搜索目标
CDS Content Directory Service 内容目录服务
CSV Comma Separated Value 逗号分隔数值
DIDL Digital Item Declaration Language 数字项声明语言
FXPP Flaxible Xml Processing Profile 灵活xml处理框架
CDS Feature A set of extended funcionalities for the ContentDirectory service CDS扩展功能
3 相关文档
本文的相关文档见表3.1。
表3.1
文件编号 文件名称 版本号 说明
ZXV10 IPTV 机顶盒市场需求说明书--CBT&StarHub二期需求 A 上游文档
机顶盒DLNA媒体共享方案V2
4 概述
DMS软件模块V1.0实现了文件浏览、文件详细信息查看等基本功能,本次设计的DMS软件模块在DMS软件模块V1.0的基础上新增节目展示功能,即节目浏览、节目详细信息查看,节目属性修改功能,节目删除功能,书签功能(书签功能包含书签创建,书签销毁,书签浏览功能),其中书签要求能跟随节目展示,书签集中展示功能本版本暂时不要求,要求设计上可以扩展为支持书签集中展示。支持CDS扩展功能中的书签功能。
要求节目浏览功能不影响原有网络影音部分DMS展示文件的内容。网络影音修改后续再明确。
节目浏览分两种方式,一种是新加坡的树状文件夹形式,跟目前本地的节目浏览一致,一种是CBT列表形式,要求可以排序,连续剧展示为文件夹,选中文件夹浏览后才展示连续剧节目,选中节目后,只有播放和删除两个动作。节目浏览的两种方式
新加坡树状节目浏览功能要求将文件夹下存在*.idx文件的目录以item方式展示,例如实际文件如下:
My playlist
|Springs Of Life
Springs Of Life.ini (或者叫0.ini)
|Springs Of Life Ep04
Springs Of Life Ep04.ini (0.ini)
Springs Of Life Ep04.idx (0.idx)
Springs Of Life Ep04001.idx (001.idx)
Springs Of Life Ep04001.dat (001.dat)
| Springs Of Life Ep05
Springs Of Life Ep05001.idx (001.idx)
| Springs Of Life Ep06
|News
|Time
Time.ini
Time01.idx
|New York
New York.ini
New York01.idx
新加坡树状节目展示如下:
My playlist
|Springs Of Life
Springs Of Life Ep04
Springs Of Life Ep05
|Springs Of Life Ep06
|News
Time
New York
CBT列表形式展示如下
My playlist
|Springs Of Life
Springs Of Life Ep04
Springs Of Life Ep05
Time
New York
5 设计思路
5.1 设计原理
5.1.1 功能设计
本模块主要功能是作为媒体服务器,提供媒体资源给DMP播放。提取节目和书签的信息进行发布。
本模块设计支持的动作请求及实现计划见表5-1。
表5-1
服务 动作 实现计划
内容目录服务 GetSearchCapabilities 支持,仅返回空字符串
GetSortCapabilities 支持,仅返回空字符串
GetSystemUpdateID 支持
Browse 支持
CreateObject 支持
DestroyObject 支持
UpdateObject 支持
MoveObject 支持
GetFeatureList 支持
连接管理服务 GetProtocolInfo 支持
GetCurrentConnectionIDs 支持,返回IDs为0
GetCurrentConnectionInfo 支持,返回空字符串
5.1.2 可靠性设计
本模块在容错性方面做了以下处理:
1. 接收到DMC发送来的本模块不支持的动作调用时,将直接返回出错提示。
5.1.3 可测试性设计
本模块的主要功能是提供媒体源,可通过使用任何一个符合DLNA规范的DMP来获取或显示本模块提供的媒体文件,对本模块的功能进行测试。
本模块实现了日志打印功能,记录或者打印本模块各主要行为的内部运行情况。调试和测试本模块功能时,可打开打印开关。日志的内容包括所有动作的报文交互内容,页面请求的路径及反馈信息,关键输入数据,出错提示等。
5.1.4 性能设计
本模块的主要性能指标如下:
1. 内容目录重建:内容目录重建耗费的时间长,当内容目录修改添加或删除时要求,树上叶子变动时,整棵树只修剪,不重建。
2:节省内存考虑,书签不建在树上。
3:出于节省内存考虑,节目详细信息不保存在树结构中,需要的时候DMS从ini文件中读取。
4:DMS从节目管理模块获取节目列表的时候,一次获取全部节目列表,512K内存大概可以容纳2000个节目列表,避免频繁查询节目列表。
5.1.5 可扩展性设计
1. 内容目录的扩展:新增加的节目和书签展示与原有文件展示区分,另外建一棵节目展示树。
5.2 关键数据设计
本模块的主要功能是提供内容目录服务,所以需要重点解决如何提供媒体内容描述信息的问题。
对于节目,在V1.0版本object对象描述内容基础上,增加节目详细信息。详细信息有:频道号,频道名,是否被锁,节目简名,节目详名,节目章节号,节目简介,节目录制时间,录制状态(正在录制、录制完成、录制失败等),节目时长,字节大小。节目详细信息由DMS从ini文件中读取。
对于书签,则增加书签item对象下列属性,包括:书签对象ID、播放属性(@neverPlayable是否可播放,缺省设置为0:可用播放)、bookmarkedObjectID书签标记的对象ID、状态变量stateVariableCollection(XML文件标记的状态变量和变量值,可用来描述书签时间。)。
其中书签对象ID定义为:bookmark#节目对象ID#时间#用户#type(普通标签或followme标签)。书签时间信息从书签管理模块获取,或者从书签文件中读取。
5.2.1 节目列表形式
本模块container和item的设计遵循以下原则:
a. 最顶层是根目录,有且仅有一个;
b. 根目录下包含节目item和连续剧container。
c. 连续剧container下为连续剧的节目item。
本模块媒体内容描述信息中对象ID的规划遵循以下原则:
a. 根目录container的对象ID为10000;
b. 其余container的对象ID则和所有item对象混合编号;该对象ID为从节目管理模块获取的itemID加上10000。
图5.1 列表节目ID示意图
CBT节目列表不建树,直接从节目列表模块获取。要求节目管理模块提供节目获取、节目排序、节目删除等功能。
5.2.2 树结构形式
5.2.2.1 container设计
本模块container的设计遵循以下原则:
d. 最顶层是根目录,有且仅有一个;
e. 根目录下包含StorageFolder这个二层container。
f. StorageFolder集合根据节目的存放路径的层次,生成对应的子集合。
g. Bookmark container根据Bookmark的不同属性值分别进行归类,设置了两个子container,分别为Bookmark container和PauseliveTVmark container。(注:书签暂时不需要集中展示,这里设计的书签容器供将来扩展用。)
本模块媒体内容描述信息中对象ID的规划遵循以下原则:
c. 根目录container的对象ID为10000;
d. 二层目录下container的对象ID为数字10001~10009中的任意一个;
e. 其余container的对象ID则和所有item对象混合编号;为遍历媒体库,该对象被发现或被创建的顺序序号加上10200。
f. 对象ID 10100~10199为预留的扩展container的对象ID。
Storge container的子container的class值实现情况见表5-2。
表5-2
对象名称 对象ID 子对象 class值 实现版本
X X 无 object.container 1.0.00
Bookmark container的子container实现情况见表5-3。
表5-3
对象名称 对象ID 子对象 class值 实现版本
All Bookmark X X object.container.bookmarkFolder 2.0.00
根据以上原则,我们规划了媒体内容描述中container的层次结构为一棵多叉树,如图5.2所示。
图5.2 媒体描述内容集合架构图
注意,上图并没有将根据媒体内容描述信息动态生成的container标识出来。
5.2.2.2 item设计
item对象ID为根据媒体文件被发现的顺序递增的整型数字,和container混合编号。
同一个item对象,根据不同属性进行划分,可能从属于不同的container对象;我们将item的parents节点设置为该item所处的文件夹对应的cotainer。
本模块设计支持的item对象的类型为节目和书签,它们的class值设计如表5-4所示。
表 5-4
item类型 class值
节目 object.item.videoItem.movie
书签 object.item.bookmarkItem
节目的识别:我们需要解析Storge下是否存在.idx文件,如果存在.idx文件,则将它识别为一个节目,item的class值设置为object.item.videoItem.movie。
5.2.2.3 container和item的存储关系设计
一个container下有多个item,而同一个item则因为分类的方式不同,可以从属于多个container。我们只在floder分类中存储各个文件夹的子节点信息,而不存储其他类型container与item的从属关系。 在建立内容目录的同时建立一棵内容目录索引的红黑树,以对象ID为关键字存储各对象。在接收到DMC的browse请求时,通过遍历内容目录索引,逐一解析媒体文件(item)的各项属性,将符合要求的媒体内容的描述信息封装返回给DMC。
该方案的container结构图的一个示例如图5.3所示:
图5.3 container结构树
6 模块结构
6.1 模块功能结构
本模块根据各组成的功能,可以将本模块内部划分为若干功能子模块:配置管理、媒体管理、服务管理、事件管理、虚拟web目录服务等。其中,服务管理模块包括内容目录服务和连接管理服务。
本模块子模块划分与功能结构图如图6.1所示。
图6.1 DMS模块功能结构图
图6.1本设计中的DMS软件模块主要修改内容目录收集模块和内容目录服务模块。
6.2 子模块说明
6.2.1 配置管理模块
配置管理模块主要负责进行用户配置的解析,并根据用户配置的情况控制DMS软件模块的运行方式和运行状态。同时,负责与管理媒介交互,执行用户的配置以及向用户展示DMS软件模块的运行状态。
本模块的用户配置项如表6.1所示。
表6.1
配置名称 作用 备注
节目媒体源 媒体内容的存放路径,可以配置多个路径,不同路径间以英文符号“,”隔开。
节目展示形式 节目展示形式:列表形式、树结构。 需要机顶盒配置模块提供
6.2.2 媒体管理子模块
媒体管理子模块负责从外接存储设备或者网络服务器中获取节目信息,并生成媒体内容目录存储到数据库中。
本模块由其他模块的配置媒体目录,遍历该目录下的所有文件夹及文件,生成节目内容目录存储到数据库中。同时,本模块需要与其他模块合作,处理主控模块发送的启用或禁用节目源消息,触发节目内容目录的重建。
所有媒体对象的描述对象各自被封装成一个T_DLNA_ENTRY型结构体,为了方便执行动作调用时候的查找,我们将指向这些描述信息的指针添加到一棵红黑树中。然后通过对该数据结构的添加、删除、搜索完成节目内容目录的添加、删除和搜索。
6.2.3 服务管理子模块
服务管理子模块主要负责执行UPnP SDK转发的action请求,对应UPnP AV Server协议中定义的媒体管理服务。媒体管理服务包含内容目录管理、连接管理和媒体传输管理三种类型的服务。其中,媒体传输管理服务主要是控制媒体文件的播放状态,如开始播放、停止、快进等。媒体传输管理服务的主要应用场景是DMP、DMR中,或者是push方式下的DMS,而本模块实现的是pull方式的DMS,所以暂不开发媒体传输管理服务,只实现内容目录管理服务和连接管理服务。
6.2.3.1 内容目录服务
内容目录服务负责提供一系列动作,使AV控制点(DMC设备即为一个AV控制点)能够找到媒体服务器提供给家庭网络的媒体内容。
内容目录服务提供的所有动作内容见表6.2:
表6.2
名称 属性
GetSearchCapabilities R
GetSortCapabilities R
GetSystemUpdateID R
Browse R
Search O
CreateObject O
DestroyObject O
UpdateObject O
ImportResource O
ExportResource O
StopTransferResource O
GetTransferProgress O
DeleteResource O
CreateReference O
Non-standard actions implemented by an UPnP vendor go here. X
备注:R-必选; O-可选; X-自定义
根据各action的作用,我们优先设计实现GetSearchCapabilities、GetSortCapabilities、GetSystemUpdateID、browse这几个必须动作。其他动作,可在后续版本中根据需要进行扩展。
GetSearchCapabilities:该动作返回本模块的search能力集。因本模块暂未实现search动作,所以实现时,只需要将SearchCaps参数置为空字符串,然后将动作名称、SearchCaps参数名、SearchCaps参数值通过UPnP SDK的接口函数UpnpAddToActionResponse返回给控制点。下文中涉及的所有其他动作均通过该方式返回动作执行的结果。
GetSortCapabilities:该动作返回本模块的sort能力集。因本模块暂未实现sort动作,所以实现时,只需要将SortCaps参数置为空字符串返回给控制点。
GetSystemUpdateID:该动作返回本模块变量SystemUpdateID的值,用于告知控制点本模块的内容目录是否已经更新。DLNA协议规定SystemUpdateID参数的取值无具体意义,但要求媒体库内容有更新时,该值应和原值有差异,且该值的更新频率应小于0.5HZ。实现该动作的方案为:设置一全局变量g_iSystemUpdateID,本模块初始化时,该值为0;之后,每次更新媒体库时,该值自动加1。当控制点调用哪个本动作时,将g_iSystemUpdateID的值返回给控制点。(目前代码中一直为0,没有更新)
6.2.3.1.1 browse
browse:该动作的主要入参是对象ID,分browse metadata、browse directorychildren这两种不同的浏览方式。browse metadata时,将该对象的描述信息返回。browse directorychildren时,需要从数据库中将该对象下的所有子节点信息取出并返回。
本模块增加一种私有的BrowseFlag浏览书签bookmark。
browse动作对参数的处理如表6.3所示。
表6.3
参数名称 输入/输出 参数说明
ObjectID IN 需要校验对象ID的合法性
BrowseFlag IN 只能是metadata或directchildren,或bookmark
Filter IN 本模块暂不处理过滤请求
StartingIndex IN 返回结果时,忽略StartingIndex前的对象
RequestedCount IN 需要返回查询结果的最大个数
SortCriteria IN 本模块暂不处理排序请求
Result OUT didl-lite语言描述
NumberReturned OUT 实际返回的对象个数
TotalMatches OUT 符合条件的对象个数
UpdateID OUT 更新情况标识
6.2.3.1.2 CreateObject
CreateObject:该动作的主要入参是Container ID,Elements。
CreateObject动作对参数的处理如表6.4所示。
表6.4
参数名称 输入/输出 参数说明
ContainerID IN 需要校验对象ID的合法性
Elements IN didl-lite语言描述,Elements 的最小信息集合必须包含@id, @parentID, @restricted, dc:title, and upnp:class properties.参数
ObjectID OUT 对象ID
Result OUT didl-lite语言描述
注1:CreateObject可以创建一个新的书签项(bookmak item),书签项可以创建于任何容器中,
@id必须设置为空“”.
@parentID必须与输入的ContainerID一致。
@restricted必须设置为“0” (false)
如创建书签,书签信息通过title传给DMS。
"<item id=\"\" parentID=\"10202$10203\" restricted=\"0\"><dc:title>bookmark#bookmarkedid#time#user#followme</dc:title><upnp:class>object.item.bookmarkItem</upnp:class>"
6.2.3.1.3 DestroyObject
DestroyObject:该动作的主要入参是对象ID,当删除对象为container时,其子对象也相应删除。
DestroyObject动作对参数的处理如表6.5所示。
表6.5
参数名称 输入/输出 参数说明
ObjectID IN 对象ID
注1:DestroyObject可以删除书签项(bookmak item)或书签容器(bookmak container)
6.2.3.1.4 UpdateObject
UpdateObject:该动作的主要入参是对象ID,CurrentTagValue和NewTagValue。
UpdateObject动作对参数的处理如表6.6所示。
表6.6
参数名称 输入/输出 参数说明
ObjectID IN 需要校验对象ID的合法性
CurrentTagValue IN TagValueList
NewTagValue IN TagValueList
注1:UpdateObject可以修改item的属性。
6.2.3.1.5 MoveObject
MoveObject:该动作的主要入参是对象ID,新的父对象ID。
MoveObject动作对参数的处理如表6.7所示。
表6.7
参数名称 输入/输出 参数说明
ObjectID IN 需要校验对象ID的合法性
NewParentID IN 新的父对象ID
NewObjectID OUT 新的对象ID
注1:MoveObject可以移动对象的位置。
6.2.3.1.6 GetFeatureList
GetFeatureList:该动作返回本设备支持的可选的CDS features的一个XML文件描述,。
MoveObject动作对参数的处理如表6.8所示。
表6.8
参数名称 输入/输出 参数说明
FeatureList OUT FeatureList
6.2.3.2 连接管理服务
连接管理服务负责管理DMS与DMR之间存在的媒体文件传输连接。本方案不修改。
6.2.4 虚拟WEB服务子模块
虚拟web服务子模块负责配合UPnP SDK完成展示页面、媒体文件的下载功能。本方案不修改。
6.2.5 事件管理子模块
为了配合UPnP SDK完成事件机制,本模块不修改
6.2.6 相关模块
书签管理模块:该模块提供书签管理。
节目管理模块:该模块提供节目列表管理。
主控:该模块负责启动DMS模块。提供参数设置,包括节目展示形式,节目源设置等。还提供节目被删除,节目被添加,硬盘卸载硬盘加载等信息。
7 协作流程
7.1 主流程
主流程主要是协调配置管理、媒体管理、服务管理、虚拟web服务和事件管理等各功能子模块正常平稳的运行,它的处理流程如图7.1所示。
图7.1 主处理流程
7.2 媒体管理流程
本模块管理的内容为USB存储器中,用户配置指定的目录下的所有节目。此次设计container类型为: Folder。Folder类型则是媒体文件的实际存储路径。
7.2.1 创建节目内容目录流程
创建节目内容目录处理流程如图7.2所示。
图7.2创建节目内容目录流程
7.2.2 更新节目内容目录流程
节目内容目录的更新主要有两种类型:定时更新,实时更新。其中,定时更新为根据用户的配置,每隔一段时间,重建一次媒体内容的数据库。而实时更新,则为主控模块监听USB管理模块发送的USB设备接入和断开的消息,并启动更新媒体内容数据库。它们的流程图如图7.3、7.4所示。
图7.3 内容目录定时更新流程
图7.4 内容目录实时更新流程
7.3 服务管理流程
本模块在初始化时,向UPnP SDK注册了回调函数,当UPnP SDK接收到其他设备或控制点的服务请求时,UPnP SDK将调用该回调函数进行服务处理。回调函数的入参为服务名称、动作名称及执行该动作所需的入参。
本模块将所有服务内容存放在一个service_t类型的数组中。当需要执行动作调用时,本模块将根据服务ID和动作名称选取相应的执行函数。媒体管理服务的流程如图7.5所示。
图7.5 媒体管理服务流程
7.3.1 browse动作实现流程
browse动作的主要执行内容为根据入参的内容,返回指定对象xml格式的描述信息。如图7.6所示。
图7.6 browse动作实现流程
对于浏览树结构中的信息,它的实现流程如图7.7所示。
图7.7 树结构节目browse动作实现流程
对于浏览节目列表信息,browse动作从节目列表管理模块获取节目列表,判断对象类型时,根据从节目管理模块获取的是否dir来判断是container或者item。它的实现流程与树结构浏览类似,只是获取childcount信息是从节目管理模块获取。
7.3.2 CreateObject动作实现流程
Create动作的主要执行内容为根据入参的内容,创建相应对象,并返回对象xml格式的描述信息。
图7.8
7.3.3 DestroyObject动作实现流程
Destroy动作的主要执行内容为根据对象ID,删除相应对象。
图7.9
7.3.4 UpdateObject动作实现流程
图7.10
7.3.5 MoveObject动作实现流程
图7.11
7.3.6 事件注册流程
本模块支持事件机制,实现了与内容目录相关的状态变量:SystemUpdateID;与连接管理相关的状态变量:SourceProtocolInfo、SinkProtocolInfo、CurrentConnectionIDs。
本模块处理事件的流程如图7.12所示:
图7.12 事件注册的处理流程
7.4 与主控模块的交互流程
图7.13
8 数据定义
8.1 关键数据说明
8.1.1 进行关键信息
用途:该参数用于记录本模块的关键运行信息。
定义:
typedef struct t_dlna_core_info {
BOOL bInit;
INT32 iEntryNum;
INT32 check_extensions;
UpnpDeviceId dev;
WORD iPort;
DWORD dwTimerId;
CHAR *szUdn;
struct rbtree *rb;
struct t_dlna_entry *ptRootEntry;
struct t_mm_info *ptProfile;
struct t_programm_entry *ptprogramm;/*新的节目树*/
}T_DLNA_CORE_INFO, *PT_DLNA_CORE_INFO;
元素说明:
bInit:标识该进程是否已经初始化。
iEntryNum:对象总数,含动态生成的item和container对象,不包含初始化时建立的默认container。
check_extensions:是否进行后缀名的校验。该值为true时,不对非法后缀名的文件进行解析,以减少扫描媒体文件的时间。
dev:本模块向UPnP SDK注册后获得的设备号。
iPort:本模块运行时的端口号。
dwTimerId:重建内容目录的周期。
szUdn:UUID值。
rb:内容目录索引红黑树。
ptRootEntry:根节点对象。
ptProfile:已注册的媒体解析功能列表。
8.1.2 媒体内容描述信息
8.1.2.1 节目数对象描述信息
用途:本关键数据用于记录本模块节目树信息。
typedef struct t_programm_entry {
INT32 iProgrammEntryNum;
struct rbtree *rb;
struct t_dlna_prog_entry *ptRootEntry;
}T_PROGRAMM_ENTRY, *PT_PROGRAMM_ENTRY;
元素说明:
iProgrammEntryNum:节目对象总数,含动态生成的item和container对象,不包含初始化时建立的默认container。
rb:内容目录索引红黑树。
ptRootEntry:根节点对象。
8.1.2.2 媒体对象描述信息
用途:本关键数据用于记录本模块所获取到的节目媒体文件的信息。
定义:
typedef struct t_dlna_prog_entry {
int id; /* 对象ID */
char *title; /* 标题*/
char *url; /* 网址*/
struct t_dlna_entry *parent; /* 父节点 */
int child_count; /* 子节点个数 */
PT_DLNA_PROG_ITEM *prog_item_pf; /* 节目item属性 */
PT_DLNA_CONTAINER *container_pf; /* container属性 */
}T_DLNA_PROG_ENTRY, *PT_DLNA_PROG_ENTRY;
元素说明:
id:对象ID。
title:实例名称,可能是文件名、文件夹名或者container名称。
url:媒体播放器来获取该媒体文件所用的下载路径。
parent:指向父对象的指针
child_count :子对象个数;item的子对象个数为-1;
prog_item_pf:节目item对象的描述信息,详细说明见下文。
container_pf:container对象的描述信息,详细说明见下文。
8.1.2.3 item对象描述信息
用途:本关键数据用于记录item对象的描述信息。
定义:
typedef struct t_dlna_prog_item{
E_ITEM_CLASS class; /* 媒体类型,决定item的class值 */
int duration; /* 播放时长 */
}T_DLNA_PROG_ITEM, *PT_DLNA_PROG_ITEM;
元素说明:
class:媒体文件的类型。
duration:媒体文件的播放时长;图片文件该参数设为0值。
8.1.2.4 container对象描述信息
用途:本关键数据用于记录container对象的描述信息。
定义:
typedef struct t_dlna_container{
E_ITEM_CLASS class; /* 决定container的class值 */
struct rbtree *rb; /* 红黑树 */
}T_DLNA_CONTAINER, *PT_DLNA_CONTAINER;
元素说明:
class:container的class值。
rb:用于记录所有子节点的红黑树。
8.2 数据结构说明
无
9 函数设计
9.1 _cdsCreateObject
功能:本函数执行UPnP SDK的动作调用,返回创建对象内容。
函数声明:static bool _cdsCreateObject (struct action_event_t *event)
输入输出数据说明:
a) 返回值:
true:执行成功。
flase:执行失败。
b) 输入参数:
event->request ->ActionRequest:CreateObject动作所需参数集合,包括 ContainerID、Elements。
c) 输出参数:
objectID和event->request->ActionResult:将相关媒体文件的描述信息封装成xml格式返回。
9.2 _cdsDestroyObject
功能:本函数执行UPnP SDK的销毁对象动作调用。
函数声明:static bool _cdsDestroyObject (struct action_event_t *event)
输入输出数据说明:
d) 返回值:
true:执行成功。
flase:执行失败。
e) 输入参数:
event->request ->ActionRequest:DestroyObject动作所需参数集合,包括 ObjectID。
f) 输出参数:
无。
9.3 _cdsUpdateObject
功能:本函数执行UPnP SDK的更新对象动作调用。
函数声明:static bool _cdsUpdateObject (struct action_event_t *event)
输入输出数据说明:
g) 返回值:
true:执行成功。
flase:执行失败。
h) 输入参数:
event->request ->ActionRequest:UpdateObject动作所需参数集合,包括 ObjectID,CurrentTagValue,NewTagValue。
i) 输出参数:
无。
9.4 _cdsMoveObject
功能:本函数执行UPnP SDK的移动对象动作调用。
函数声明:static bool _cdsMoveObject (struct action_event_t *event)
输入输出数据说明:
j) 返回值:
true:执行成功。
flase:执行失败。
k) 输入参数:
event->request ->ActionRequest:MoveObject动作所需参数集合,包括 ObjectID,NewParentID。
l) 输出参数:
NewObjectID。
9.5 _cdsGetFeatureList
功能:本函数执行UPnP SDK的GetFeatureList动作调用。
函数声明:static bool _cdsGetFeatureList (struct action_event_t *event)
输入输出数据说明:
m) 返回值:
true:执行成功。
flase:执行失败。
n) 输入参数:
无。
o) 输出参数:
FeatureList。
9.6 dlnaGetConfig
功能:本函数主要完成解析配置文件内容的功能。
函数声明:INT32 dlnaGetConfig(PT_DLNA_CORE_INFO ptDlnaInfo)
输入输出数据说明:
p) 返回值:
RET_DLNA_FAIL:解析配置文件失败。
RET_DLNA_OK:解析配置文件成功。
q) 输入参数:
无。
r) 输出参数:。
ptDlnaInfo:记录用户配置文件信息的结构体。
9.7 dlnaBuildProgrammLst
功能:本函数主要完成创建节目内容描述信息链表的功能。
函数声明:VOID dlnaBuildProgrammLst(PT_DLNA_CORE_INFO ptInfo)
输入输出数据说明:
a) 返回值:
无。
b) 输入参数:
ptInfo:含媒体文件的存储路径,根节点指针等信息的结构体。
c) 输出参数:。
ptInfo:含媒体内容描述信息的索引ptInfo -> rb.
9.8 dlnaFindServiceAction
功能:返回UPnP动作调用的处理函数。本函数v1.0版本已支持,需要增加本次设计支持的几个object动作。
函数声明:bool dlnaFindServiceAction
(struct Upnp_Action_Request *request,
struct service_t **service,
struct service_action_t **action)
输入输出数据说明:
a) 返回值:
true:成功返回动作调用函数
flase:失败。
b) 输入参数:
request:请求动作的名称。
service:请求动作所属的服务类型名称。
c) 输出参数:
action:执行动作执行函数的指针。
9.9 _cdsBrowseProgramm
功能:本函数执行UPnP SDK的动作调用,返回媒体内容目录。
函数声明:static bool _cdsBrowseProgramm (struct action_event_t *event)
输入输出数据说明:
d) 返回值:
true:执行成功。
flase:执行失败。
e) 输入参数:
event->request ->ActionRequest:browse动作所需参数集合,包括 ObjectID、BrowseFlag、Filter、StartingIndex、RequestedCount。
f) 输出参数:
event->request->ActionResult:将相关媒体文件的描述信息封装成xml格式返回。
9.10 _cdsBrowseProgrammMeta
功能:本函数进行item对象的媒体内容描述信息的封装。
函数声明:static int _cdsBrowseMeta
(struct action_event_t *event,
struct buffer_t *out,
int index,
int count,
struct upnp_entry_t *entry,
char *filter)
输入输出数据说明:
a) 返回值:
失败:-1。
成功:符合条件的媒体内容的个数。
b) 输入参数:
event:动作调用事件的指针。
out:存放的媒体描述内容的buffer。
index:要求返回的媒体内容的起始序号。
count:要求返回的媒体内容的最大个数。
entry:要求返回的媒体对象。
filter:返回结果的过滤条件。
c) 输出参数:
event->request->ActionResult:将相关媒体文件的描述信息封装成xml格式返回。
9.11 _cdsBrowseProgrammChild
功能:本函数进行container对象的媒体内容描述信息的封装。
函数声明:static int _cdsBrowseChild
(struct action_event_t *event,
struct buffer_t *out,
int index,
int count,
struct upnp_entry_t *entry,
char *filter)
输入输出数据说明:
a) 返回值:
失败:-1。
成功:符合条件的媒体内容的个数。
b) 输入参数:
event:动作调用事件的指针。
out:存放的媒体描述内容的buffer。
index:要求返回的媒体内容的起始序号。
count:要求返回的媒体内容的最大个数。
entry:要求返回的媒体对象。
filter:返回结果的过滤条件。
c) 输出参数:
event->request->ActionResult:将相关媒体文件的描述信息封装成xml格式返回。
9.12 _cdsBrowseBookmark
功能:本函数进行container对象的媒体内容描述信息的封装。
函数声明:static int _cdsBrowseBookmark
(struct action_event_t *event,
struct buffer_t *out,
int index,
int count,
struct upnp_entry_t *entry,
char *filter)
输入输出数据说明:
d) 返回值:
失败:-1。
成功:符合条件的媒体内容的个数。
e) 输入参数:
event:动作调用事件的指针。
out:存放的媒体描述内容的buffer。
index:要求返回的媒体内容的起始序号。
count:要求返回的媒体内容的最大个数。
entry:要求返回的媒体对象。
filter:返回结果的过滤条件。
f) 输出参数:
event->request->ActionResult:将相关媒体文件的描述信息封装成xml格式返回。
10 接口设计
10.1 节目管理模块接口
参见《书签管理模块详细设计》和《节目表管理模块详细设计》提供的接口。
10.2 其他模块
1、主控模块通知DMS,节目被删除,节目被创建,节目被移动等信息,DMS收到后更新DMS树。
2、主控模块通知DMS节目展示形式。
3、主控模块设置媒体源。
10.2.1 设置节目展示形式
设置节目展示形式,该消息发往DMS模块。
消息名称:DMS_C_SetProgrammDisplayMode
消息定义如下:
语法 位数(比特) 缩写
pParmeter ()
{
DisplayMode
}
8
uimsbf
参数定义如下:
DisplayMode:节目展示形式,1:树结构,2:列表形式。
10.2.2 设置媒体源
设置媒体源,该消息发往DMS模块。
消息名称:DMS_C_SetMediaSource
消息定义如下:
语法 位数(比特) 缩写
pParmeter ()
{
MediaType
Dir
}
8
128*8
uimsbf
uimsbf
参数定义如下:
MediaType:媒体类型,1:网络影音媒体,2:节目
Dir:媒体内容的存放路径,可以配置多个路径,不同路径间以符号“|”隔开。
10.2.3 启用节目媒体源
启用节目媒体源,该消息发往DMS模块。DMS收到启用媒体源后,该媒体源可用。
消息名称:DMS_C_EnableMediaSource
消息定义如下:
语法 位数(比特) 缩写
pParmeter ()
{
MediaType
Dir
}
8
128*8
Uimsbf
uimsbf
参数定义如下:
MediaType:媒体类型,1:网络影音媒体,2:节目
Dir:媒体内容的存放路径,可以配置多个路径,不同路径间以符号“|”隔开。
10.2.4 禁用节目媒体源
禁用节目媒体源,该消息发往DMS模块。DMS收到禁用媒体源后,禁用该媒体源。
消息名称:DMS_C_DisableMediaSource
消息定义如下:
语法 位数(比特) 缩写
pParmeter ()
{
MediaType
Dir
}
8
128*8
Uimsbf
uimsbf
参数定义如下:
MediaType:媒体类型,1:网络影音媒体,2:节目
Dir:媒体内容的存放路径,可以配置多个路径,不同路径间以符号“|”隔开。
10.2.5 媒体被删除
媒体被删除,该消息发往DMS模块。
消息名称:DMS_C_MediaDeleted
消息定义如下:
语法 位数(比特) 缩写
pParmeter ()
{
MediaType
Dir
}
8
128*8
uimsbf
uimsbf
参数定义如下:
MediaType:媒体类型,1:网络影音媒体,2:节目
Dir:被删除的媒体存放路径。
10.2.6 媒体被创建
媒体被创建,该消息发往DMS模块。
消息名称:DMS_C_MediaCreated
消息定义如下:
语法 位数(比特) 缩写
pParmeter ()
{
MediaType
Dir
}
8
128*8
uimsbf
uimsbf
参数定义如下:
MediaType:媒体类型,1:网络影音媒体,2:节目
Dir:被创建的媒体存放路径。