著录项信息
专利名称 | 多频点电子节目指南信息的接收方法 |
申请号 | CN200310116953.6 | 申请日期 | 2003-12-03 |
法律状态 | 权利终止 | 申报国家 | 中国 |
公开/公告日 | 2005-06-08 | 公开/公告号 | CN1625237 |
优先权 | 暂无 | 优先权号 | 暂无 |
主分类号 | H04N5/445 | IPC分类号 | H;0;4;N;5;/;4;4;5;;;H;0;4;N;7;/;0;2;5查看分类表>
|
申请人 | 北京中视联数字系统有限公司 | 申请人地址 | 北京市经济技术开发区宏达北路10号5层
变更
专利地址、主体等相关变化,请及时变更,防止失效 |
权利人 | 北京中视联数字系统有限公司 | 当前权利人 | 北京中视联数字系统有限公司 |
发明人 | 伍志刚 |
代理机构 | 北京同立钧成知识产权代理有限公司 | 代理人 | 刘芳;刘薇 |
摘要
本发明公开了一种多频点电子节目指南信息的接收方法,包括如下步骤:首先为接收电子节目指南信息分配资源;然后在回调程序中完成数据的接收;解析接收到的数据,得到电子节目指南信息;释放电子节目指南信息所用到的资源,最后将电子节目指南信息填充到固定的数据组织结构中,提供给EPG应用。本发明采用了先接收后解析的EPG接收方法,缩短了EPG的接收时间,在EPG接收中采用了内存池的管理机制,提高了内存利用率;给出了各个信息表的适合EPG应用使用的数据组织结构和最近7天EIT表的接收中按本地时间接收时的segment计算方法。
技术领域\n本发明涉及一种接收数字电视节目指南信息的方法,尤其是一种接收来 自多个频点的电子节目指南信息的方法。\n背景技术\n在数字电视系统的前端采用了复用技术,即将一个服务(Service)的视 频、音频和其他数据分别打包编码复用形成一个单服务传输流,然后与同一 个频道(Channel)的其他单节目流二次复用,再加上各种业务信息,形成一 个多节目的传输流,然后经过调制,通过电缆、地面传输或卫星传输到用户 端。在用户端的接收器通过调谐器解调,加密节目经过解扰器解扰,然后经 过解复用器将不同节目的音视频流过滤出来,送到音视频解码器解码,最后 经过DA变换,将用户选择的电视节目播放出来。\n电子节目指南(EPG)信息包括网络信息、服务信息、业务群信息、节 目信息和时间信息等。电子节目指南的出现成为数字电视传输的一种特色, 而这些为用户提供节目导航功能的电子节目指南信息是和音视频信号一起 复用在传输流里的,所以要将节目导航信息从传输流里提取出来,形成能供 用户浏览和查询的数据结构。\n电子节目指南信息主要来源于《数字视频广播中文业务信息规范》中的 网络信息表NIT、服务描述表SDT、业务群关联信息表BAT、节目信息表EIT, 时间日期表TDT/TOT等。这些信息表的结构在服务信息(SI)标准里有明确 的定义。\n网络信息表NIT、服务描述表SDT、业务群关联信息表BAT、节目信息 表EIT可以被划分为多个子表,每个子表又被分为最多256个段(Section)。 Section数据的组合通常是由硬件过滤器来完成的,设置好通道的PID,以 及在过滤器设置中所需的table_id,transport_stream_id, section_number等信息,然后打开过滤器和通道,硬件芯片完成从传输流 包到section的过滤。当有合适的section组合完毕,硬件产生中断,此中 断服务程序在程序中也被称为回调程序。该回调程序得到一个缓冲区 (buffer)的起始地址和长度,由软件对该buffer进行处理,提取所需的 信息。\n现有技术的处理方法是,在回调程序里作处理,获取电台节目信息。由 于两个具有相同pid,table_id,table_id_extension,相同的或不相同的 section_number的两个section之间的时间不能少于25ms(见SI标准的 en300468的5.1.4),也就是说普通的机顶盒至少需要25ms的时间来处理 一个section。SI信息的发送不能过快,否则接收端可能处理不过来,而且 同一个表的section应该尽量分布均匀。如果发送数据量较大,而且以较快 的速率发送,用以上的方法来处理可能在处理过程中错过很多section,从 而需要频繁等待下一轮数据,导致接收的效率低下,接收时间成倍增加。\n发明内容\n本发明所要解决的技术问题在于提供一种多频点电子节目指南信息的 接收方法,快速接收并解析来自多个频点的传输流里的多频点电子节目指南 信息。\n本发明所述的方法包括如下步骤:\n步骤一、接收数据流中的电子节目指南信息的数据,如果在指定的时间 内,电子节目指南信息全部被接收,则执行步骤二;否则,超出指定的时间, 则强制停止接收过程,并释放占用的资源;\n步骤二、解析步骤一得到的电子节目指南信息数据,得到电子节目指南 信息,释放占用的资源;\n步骤三、将步骤二得到信息填入到固定的数据结构中,提供给EPG应 用。\n本发明采用了先接收后解析的EPG接收方法,缩短了EPG的接收时间, 在EPG接收中采用了内存池的管理机制,提高了内存利用率;给出了各个信 息表的适合EPG应用使用的数据组织结构和最近7天EIT表的接收中按本地 时间接收时,数据段(segment)的计算方法。\n附图说明\n图1是本发明方法接收和解析过程的流程图;\n图2是本发明方法分配资源的流程图;\n图3是本发明方法接收数据的流程图;\n图4是本发明方法Section回调程序的流程图;\n图5是本发明方法内存池的示意图;\n图6是本发明方法解析数据流程图;\n图7是本发明方法释放资源的流程图;\n图8是本发明方法的单链表存储结构的示意图。\n具体实施方式\n本发明方法采用接收数据和解析数据两个步骤来完成电子节目指南信 息的获得,可以避免接收数据时的频繁等待,加快整个接收处理过程。将接 收过程分成两个步骤,其基本出发点是,回调程序类似于中断处理,时间要 求严格,应尽量作最少的工作,以防止阻塞数据的连续接收。在回调程序里, 在所接收的表的所有段完全接收完毕之后,停止接收,将数据拷贝到专门开 辟的存储空间;然后再执行表的数据的解析过程,从而得到所需的信息。\n本发明所述的方法,包括如下步骤:\n步骤一、接收数据流中的电子节目指南信息的数据,如果在指定的时间 内,电子节目指南信息全部被接收,则执行步骤二;否则,超出指定的时间, 则强制停止接收过程,并释放占用的资源;\n步骤二、解析步骤一得到的电子节目指南信息数据,得到电子节目指南 信息,释放占用的资源;\n步骤三、将步骤二得到信息填入到固定的数据结构中,提供给EPG应用。\n电子节目指南信息数据的接收(步骤一)和解析(步骤二)是本发明的 重点,其流程图如图1所示,将解析后的信息填入到固定的数据结构中,提 供给EPG应用可以采用与现有技术完全相同的方式。\n关于对于电子节目指南信息数据的接收,由于这些数据是复用在整个信 息流中,经过前端的解复用器后,可以单独分离出来;对这些数据的处理与 其他数据如视频数据,音频数据的处理方法类似,要单独分配资源,如通道、 缓存等;只是电子节目指南信息数据流量并不大,所以占用的资源也比较少。\n数据的接收过程具体包括:\n步骤1.1、为接收电子节目指南信息数据分配系统资源,分配过滤器;\n步骤1.2、检验系统资源是否可用,如果可用,则开始接收过程;\n步骤1.3、接收电子节目指南信息数据,判断是否所有电子节目指南信 息表都已经接收,如果是,则执行步骤二;否则,更换新的过滤器,继续接 收过程;如果超时,则强制停止接收过程,并释放占用的资源。\n数据的接收过程中,首先要为接收电子节目指南信息数据分配资源,并 保证这些资源在整个接收过程中可用;由于接收不同类型的电子节目指南信 息数据(不同类型的信息表)要采用不同的过滤器来获取,过滤器接收完其 所接收的数据(全部子表和子表中全部的Section)后,再更换过滤器,重 新启动新的过滤器进行接收,直到所有的过滤器已经全部接收完数据,结束 接收过程。\n也可能出现由于网络状态不好,出现接收的时间过长,考虑到这种情况, 同样为了节省系统资源,在接收超过预先设定的时间后,强制停止接收过程, 并释放占用的资源。\n图2是本发明方法步骤1.1的流程图,包括如下步骤:\n步骤1.11、从解复用器中分配未使用的通道;如果分配失败,则执行 步骤1.16;\n步骤1.12、为步骤1.11所分配的通道注册相应的回调程序(此程序在 硬件监测到数据到达时被调用),如果注册失败,则执行步骤1.16;\n步骤1.13、为步骤1.11所分配的通道分配缓存资源;如果分配失败, 则执行步骤1.16;\n步骤1.14、为步骤1.11所分配的通道设置PID值,此PID值为过滤器 接收传输流的PID值;如果设置失败,则执行步骤1.16;\n步骤1.15、为步骤1.11所分配的通道分配过滤器,结束步骤1.1;如 果分配失败,则执行步骤1.16;\n步骤1.16、释放资源,根据失败的类型,释放过滤器、通道及缓存, 退出节目指南信息的接收。\n过滤器的设置方法可以依照业务信息规范,对各个表的table_id值的 预先分配值进行设置。网络信息表的通道PID设为0x10,过滤器table_id 设为0x40/0x41,服务描述表的通道PID设为0x11,过滤器table_id设为 0x42/0x46,业务群关联信息表的通道PID设为0x11,过滤器table_id设 为0x4a,节目信息表的通道PID设为0x12,过滤器table_id设为0x4e/0x4f, 或0x50-0x5f/0x60-0x6f,时间日期表的通道PID设为0x14,过滤器 table_id设为0x70,时间偏移表的通道PID设为0x14,过滤器table_id 设为0x73。\n接收步骤中,根据所要接收的数据流首先为通道分配对应的PID,然后 在设置对应的过滤器来接收对应通道的节目指南数据,实现电子节目指南信 息的接收。\n由于以上的过程中也可能会有错误发生,为了使使用者或管理者了解错 误地方,以便作出相应的调整,本发明对于每个可能出现错误的地方设置了 错误采集的机制,为不同的类型错误设置了不同的错误编号,使本发明使用 更加灵活、方便和人性化。\n图3给出了本发明所述方法中步骤1.2的流程图,包括如下步骤:\n步骤1.21、判断通道是否有效,如果有效,执行步骤1.22;否则执行 步骤1.26;\n步骤1.22、判断过滤器是否有效,如果有效,执行步骤1.23;否则执 行步骤1.26;\n步骤1.23、设置过滤器参数,包括数据位和掩码(各种信息表的过滤 器的设置方法依照SI标准指定的TABLE_ID等参数执行),如果成功,执行 步骤1.24;否则执行步骤1.26;\n步骤1.24、启动过滤器,如果成功,执行步骤1.25;否则执行步骤1.26;\n步骤1.25、启动通道,如果成功,则开始接收节目指南信息数据,结 束步骤1.2;否则执行步骤1.26;\n步骤1.26、根据错误的类型,设置错误号,释放过滤器、通道及缓存, 结束节目指南信息的接收过程。\n在步骤1.1中通道、过滤器和缓存分配成功之后,要对资源的可用性进 行检验,然后根据要接收的信息表种类来设置过滤器的数据位和掩码,并启 动过滤器和通道,开始接收信息表数据。\n在开始接收之后,执行步骤1.3来接收数据,直到所有信息表的数据被 接收或者超时,具体包括:\n步骤1.31、硬件检测到数据到达,调用Section回调程序,接收当前 过滤器传来的Section数据,一个Section数据的数据完全被接收,回调程 序将其拷贝到缓存中;\n步骤1.32、重新调用Section回调程序,接收下一个Section的数据;\n步骤1.33、如果一个信息表的全部数据(全部的子表和子表的全部 Section数据)被接收,则更换新的过滤器,重新接收未接收信息表的 Section数据;如果所有信息表的全部数据都已经被接收,则执行步骤二; 如果超时,则强制停止接收过程,并释放占用的资源。\n所需的数据到达时,回调程序就被调用;并且每接收一个Section的 数据,回调程序就被调用一次。本发明在回调程序里接收数据,并检查 Section数据的正确性,并执行Section数据的拷贝任务,判断整个信息表 /子表是否完全被接收。\n在回调程序里,所需的数据被拷贝到内存的缓冲区中。为了更有效的 利用内存,本发明采用了缓冲池的方式来更合理的利用内存,防止随机进行 内存分配而出现的大量的小块的内存无法利用的情况,提高内存的利用效 率。\n内存缓冲池采用预分配方式,用pool_start、pool_free、pool_length 三个变量保存缓冲池的始末地址和长度;用一个section数组保存已存入的 section在缓冲池中的起始地址和长度;用section_sum保存已存入的 seciton总个数。当缓冲区的大小不够使用时(即pool_free和pool_start +pool_length的差值小于某个临界值),将缓冲区的大小增大一倍,同时 保持已有数据不变。内存空间连续分配,防止了内存碎片的产生。图5所 示为一个存有两个Section的缓冲池,section0和section1表示存储的数 据,section0_start,和section0_length表示缓冲池的数据结构。\nEPG数据存储区对所有不同的表采用一致的数据结构(即内存池),包 含起始地址、长度、末尾地址,总的section个数等内容。每个内存池最多 存放256个section,在多子表的情况下,一个完整的表包含多个内存池, 每个内存池存放一个子表。内存池的初始大小根据信息表的种类各不相同, NIT表、BAT表、SDT表可以为20KB;OSDT表可以为40KB;PF-EIT表 可以为80KB;SCH-EIT表可以为64KB;TDT/TOT表可以为4KB。\n本发明采用如下方法判断所有所需的数据是否到达:\n缓冲池内的Section总个数等于此接收子表的最后段编号 lastSectionNumber,表示该子表已经被完全接收。\n接收程序也不是无限制的等待数据完全被接收,在所设定的时间内没有 收完全所有的Section,即缓冲池内所接收到的Section总数小于此接收子 表的最后段编号lastSectionNumber,则强行停止接收,接收程序返回超时。\n通过以上的描述可以看出,回调程序中完成主要的接收功能;回调程序 由硬件启动,当通道打开而硬件检测到有数据到达,就自动调用回调程序。 图4是上述的回调程序的工作流程图,包括:\n步骤1.300、判断接收是否已经结束,如果已经结束,则退出回调程序; 否则,执行步骤1.301;\n步骤1.301、判断Section的数据版本是否正确,如果正确,则执行步 骤1.302;否则,执行步骤1.305;\n步骤1.302、判断数据是否正确,如果正确,则执行步骤1.303;否则, 重新启动通道,接收该Section的数据,结束回调程序;\n步骤1.303、判断是否缓冲区中已经存在该Section的完整数据,如果 是,则抛弃接收的数据;否则执行步骤1.304;\n步骤1.304、将数据添加到缓冲区中,如果成功,则重新设置过滤器; 重新启动通道,结束回调程序;否则,执行步骤1.305;\n步骤1.305、停止通道和过滤器,根据错误类型设置错误号,结束回调 程序,退出电子节目指南信息的接收。\n所述的步骤1.305,停止通道和过滤器,进一步包括如下步骤:\n步骤1.3051、判断通道是否有效,如果有效,则停止通道;否则执行 步骤1.3053;\n步骤1.3052、判断过滤器是否有效,如果有效,则停止过滤器,结束 回调程序;否则执行步骤1.3053;\n步骤1.3053、根据错误类型,设置错误号,结束回调程序。\n缓冲池内的数据根据section_num从小到大依次排列。对于某种表有多 个子表的要考虑到不同频点之间的数据可能发生重复,对于多频点EPG前端 尤其如此。比如某个频点的SDT表中不但保存着本频点的电台信息,而且可 能包含其它频点的电台信息,在SI标准里是当作Other SDT表来传送。但 是,在其它某个频点,这些其他SDT(Other SDT)的信息可能就是它的SDT 表。避免数据信息在内存中的重复就是必须要考虑的事情。在回调程序中, 对此进行了考虑,比较了接收的Section数据与已有的Section数据。\n由于网络信息和电台信息对于每个频点来说,实际的数据相同,只是放 到不同的表中传送,而且这些信息不同于节目信息和时间信息,不是经常变 化,所以这些数据只在开机后接收一次,解析后并存放到非易失存储介质中, 便于以后应用。\n在将所需要的所有数据拷贝到缓冲池之后,进行数据的解析。所有的表 的字段和描述子的解析均严格依照业务信息规范进行。但其中不是所有的信 息都进行提取,对于某些没有立即解析的数据提供单独的方法,用来在用户 需要时提取,比如节目的详细描述信息,节目的Item列表等。\n图6是本发明所述的步骤二解析数据的流程图,包括如下步骤:\n步骤2.1、获取信息表的第一层循环的长度,如果大于零,则执行步骤 3.2;否则执行步骤2.4;\n步骤2.2、获取描述子内容,第一层循环长度减去此描述子长度,若内 容正确,执行步骤2.3,否则回到步骤2.1;\n步骤2.3、添加描述子内容到当前结果,回到步骤2.1;\n步骤2.4、获取信息表第二层循环的长度,若大于零,则执行步骤2.5; 否则结束步骤3;\n步骤2.5、获取图表(map)内容,第二层循环长度减去此map长度,得 到map内的第一个描述子的descriptor_id,根据SI标准解析此描述子, 并将结构添加到当前结果;反复步骤2.5,直到解析完此map内所有的描述 子;\n步骤2.6、将步骤2.5中所获得的map内容中解析所得的内容添加到结 果列表;返回步骤2.4。\n对接收的电子节目指南信息表的解析,与现有技术的解析方式相同,并 且,实际上并也不复杂,在SI标准中对于接收到的电子节目指南信息的数 据结构有详细的描述,而解析的方法也容易实现。\n解析之后,得到了完整的电子节目指南信息EPG,将其通过固定的数据 结构存储在存储空间中,内存和通道等资源应该释放,归还系统。\n图7是本发明所述的释放资源的流程图,包括如下步骤:\n步骤4.1、判断过滤器是否有效,如果有效,释放过滤器及缓存;否则, 执行步骤4.3;\n步骤4.2、判断通道是否有效,如果有效,释放通道,结束释放资源; 否则执行步骤4.3;\n步骤4.3、根据错误类型,设置错误号,结束释放资源。\n本发明所述的步骤三,进一步具体包括如下过程:\n经过解析之后得到的数据按照固定的数据结构提供给EPG应用,即将数 据赋值给数据结构中的对应的变量,便于EPG应用使用这些变量,完成相应 的功能。对于多section的信息表(包括网络信息表NIT、服务描述表SDT、 业务群关联信息表BAT、节目信息表EIT等),解析后存储的信息可以采用 一致的单链表存储结构,见图8。采用一致的单链表存储结构可以很好的节 约存储空间,并且更新电子节目指南信息也很方便。\n下面给出各个信息表的数据结构的实例,用C语言描述如下:\n网络信息表(NIT):\n typedef struct {\n unsigned short version; /* 版本号 */\n unsigned short original_network_id;/* 网络识别号 */\n unsigned short stream_id; /* 复用流识别号 */\n unsigned long frequency; /* 传输频率 */\n unsigned long symbol_rate; /* 传输符号率 */\n int delevery_type /* 传输网络类型 */\n dtvia_cable_delivery_ptr p_cable_delivery_desc /*有线传输\n 参数*/\n dtvia_satellite_delivery_ptrp_satellite_delivery_desc /* 卫星传\n 输参数*/\n int name_length /* 网络名称长度 */\n unsigned char * network_name /* 网络名称 */\n int multilingual_sum; /*多语言网络名称个数*/\n dtvia_multilingual_name_ptr p_mul_name /*多语言网络名称链表*/\n int additional_frequency_sum; /* 附加频率个数 */\n dtvia_frequency_list_ptr p_a_frequency; /* 附加频率链表 */\n int service_list_sum; /* 服务列表个数 */\n dtvia_service_list_ptr p_service /* 服务链表 */\n EPG_NIT_INFO_PTR p_next;\n } EPG_NIT_INFO,*EPG_NIT_INFO_PTR;\nNIT链表:\n typedef struct{\n int nit_sum; /* 网络个数 */\n EPG_NIT_INFO_PTR p_nit_list; /* 网络信息 */\n int linkage_sum; /* 链接个数 */\n dtvia_linkage_ptr p_linkage_list; /* linkage链表 */\n }dtiva_nit_head,*dtiva_nit_ptr;\n业务群关联表(BAT):\n typedef struct {\n unsigned short version; /* 版本号 */\n unsigned short bouquet_id; /* 业务群识别号 */\n int name_length; /* 名称长度 */\n unsigned char * bouquet_name /* 业务群名称*/\n int multoilingual_sum; /*多语言名称个数*/\n dtvia_multilingual_name_ptr p_mul_name /*多语言名称链表*/\n int ca_identify_sum; /* CA Identify 个数*/\n dtvia_ca_identify_ptrp_ca_identify; /* CA Identify链表*/\n int available_country_sum; /* 允许国家个数 */\n dtvia_country_available_ptr p_available_country;/* 允许国家链表\n */\n int unavailable_country_sum; /* 不允许国家个数\n */\n dtvia_country_available_ptr p_un_available_country;/*不允许国家\n 链表*/\n int service_list_sum; /* 服务列表个数 */\n dtvia_service_list_ptr p_service /* 服务链表 */\n int linkage_sum; /* 链接个数 */\n dtvia_linkage_ptr p_linkage_list; /* linkage链表 */\n EPG_BAT_INFO_PTR p_next;\n } EPG_BAT_INFO,*EPG_BAT_INFO_PTR;\n BAT链表\n typedef struct{\n int bat_sum; /* BAT表个数 */\n EPG_BAT_INFO_PTR p_bat_list; /* BAT表链表 */\n }dtiva_bat_head,*dtiva_bat_ptr;\n 服务描述表SDT:\n typedef struct {\n unsigned short version; /*版本号 */\n unsigned short original_network_id;/* 网络识别号 */\n unsigned short stream_id; /* 复用流识别号 */\n unsigned short service_id; /* 电视台识别号*/\n unsigned short service_type; /* 分类*/\n int name_length; /* 电视台名长度 */\n unsigned char *service_name; /* 电视台名称 */\n int provider_length; /* 提供商名长度*/\n unsigned char *service_provider; /* 提供商名*/\n unsigned short free_ca_mode; /* 加扰模式*/\n unsigned short schedule_flag; /* schedule 存在标志*/\n unsigned short pf_flag; /* present following 存在标志*/\n int multilingual_sum; /* 多语言个数 */\n dtvia_multilingual_service_desc_ptr p_mul_service /*多语言名称链表*/\n int ca_identify_sum; /* CA Identify 个数*/\n dtvia_ca_identify_ptr p_ca_identify; /* CA Identify 链表*/\n int available_country_sum; /* 允许国家个数 */\n dtvia_country_available_ptr p_available_country;/* 允许国家链表\n */\n int unavailable_country_sum; /* 不允许国家个数 */\n dtvia_country_available_ptr p_un_available_country;/* 不允许国\n 家链表*/\n int bouquet_name_length; /* 业务群名称长度 */\n unsigned char *bouquet_name /* 业务群名称*/\n int linkage_sum; /* 链接个数 */\n dtvia_linkage_ptr p_linkage_list; /* linkage链表\n */\n int data_broadcast_sum; /* Data broadcast个数 */\n dtvia_data_broadcast_ptr p_db_desc;/* Data broadcast链表 */\n int announcement_sum /* 通告个数 0或者 1*/\n dtvia_announcement_ptr p_announcement; /*通告链表 */\n EPG_SDT_INFO_PTR p_next;\n }EPG_SDT_INFO,*EPG_SDT_INFO_PTR;\n //SDT链表:\n typedef struct {\n int sdt_sum; /* SDT表个数*/\n EPG_SDT_INFO_PTR p_sdt_list; /* SDT表链表*/\n }dtiva_sdt_head,dtiva_sdt_ptr;\n节目信息表EIT:\n typedef struct {\n unsigned short version; /* 版本号 */\n unsigned short original_network_id; /* 网络识别号 */\n unsigned short service_id; /* 服务号 */\n unsigned short stream_id; /* 传输流号 */\n unsigned short event_id; /* 节目号 */\n unsigned short year; /* 年 */\n unsigned short month; /* 月 */\n unsigned short day; /* 日 */\n unsigned short start_hour; /* 节目起始时间(小时)\n */\n unsigned short start_minute; /* 节目起始时间(分钟) */\n unsigned short duration_hour; /* 节目持续小时 */\n unsigned short duration_minute; /* 节目持续分钟 */\n int name_length; /* 节目名称长度 */\n unsigned char *event_name; /* 节目名称 */\n int short_desc_length; /* 节目简短描述长度 */\n unsigned char *short_desc; /* 节目简短描述 */\n unsigned short event_state; /* 状态 */\n unsigned short free_ca_mode; /* 加扰模式 */\n unsigned short nibble1; /* 分类 1*/\n unsigned short nibble2; /* 分类 2*/\n int component_sum /* 组件个数 */\n dtvia_component_ptr p_component /* 组件链表 */\n int ca_identify_sum; /* CA Identify 个数*/\n dtvia_ca_identify_ptr p_ca_identify; /* CA Identify 链表\n */\n int parent_rate_sum; /* 家长级别个数 */\n dtvia_parent_rate_ptrp_parent_rate; /* 家长级别链表 */\n int detail_length /* 详细描述长度 */\n unsigned char * event_detail /* 详细描述 */\n int item_sum /* item个数 */\n dtvia_item_desc_ptr p_item /* item链表 */\n int linkage_sum; /* 链接个数 */\n dtvia_linkage_ptr p_linkage_list; /* linkage链表 */\n int data_broadcast_sum; /* Data broadcast个数 */\n dtvia_data_broadcast_ptr p_db_desc; /* Data broadcast链表 */\n EPG_EIT_INFO_PTR p_next\n }EPG_EIT_INFO,*EPG_EIT_INFO_PTR;\n EIT链表\ntypedef struct {\n int eit_sum;\n EPG_EIT_INFO_PTR p_eit_list;\n}dtiva_eit_head,dtiva_eit_ptr;\n对于时间信息,TDT表中接收的是UTC标准时间,如果要接收本地时间, 则需要接收TOT表。时间信息的存储结构如下(C语言描述): typedef struct {\n int m_year; /* 年 */\n int m_month; /* 月 */\n int m_day; /* 日 */\n int m_week_day; /* 星期 */\n int m_hour; /* 小时 */\n int m_minute; /* 分钟 */\n int m_second; /* 秒 */ } dtvia_time,*dtvia_time_ptr; typedef struct local_time{\n dtvia_time local_time; /* 本地时间 */\n short current_offset_hour;/* -12-+13 */ /* 时区偏移小时 */\n short current_offset_minute; /* 时区偏移分钟 */\n short time_change_sum; /* 时区变更时间总数 */\n TIME_CHANGE_PTR p_change_list; /* 时区变更时间列表 */ }LOCAL_TIME,*LOCAL_TIME_PTR;\n接收节目信息指南,一般在开机的时候进行;但是,由于某些表如 TDT/TOT表的信息的发送频率较低,如果在每次开机时接收可能导致开机时 间延长。为了解决开机时间延长的问题,可以采用本方法在后台设立一个 EPG接收引擎,在系统空闲的时候去接收TDT/TOT以及其它一些SI信息。\nTDT/TOT表里提供系统时钟的可能。在每次开机时接收TOT表,设置本 地时钟,提供为电子节目指南里的时间显示和预定节目的参考时间。SI标 准里规定,在节目信息表里的时间都是UTC时间,而EIT预告节目的子表 table_id及segment的划分也是以UTC时间来计算的,在接收EIT表设置 过滤器时就要注意到跨天的情况。\n举个例子,比如一个用户在北京时间的星期二的上午九点想查看北京 时间星期二零点到二十四点之间的节目信息,转成标准时间就是星期一的下 午四点到星期二的下午四点。如果按照北京时间零点到二十四点来分 table_id的话,它应该是table_id=0x50的segment0-segment7(每 个segment包含8个section,对应于3小时),而按照SI标准,则必须是 依照UTC的时间来划分,则在北京时间星期二的上午九点是UTC时间的星期 二的一点,而这时table_id已经刚好更新一小时,所以实际上用户只能得 到北京时间星期二八点到二十四点的节目信息,且这段时间对应于table_id =0x50的segment0-segment5。\n本发明给出了一种接收一周(7天)预告节目的table_id及segment 的换算方法,以便用户得到正确的时间信息,流程如下:\n从TOT表中得到本地时间的偏移utc_offset;\n设置预告天数偏移offset_day(取值范围0~6)\n如果偏移utc_offset<0,则utc_offset=utc_offset+24;\n如果当前小时hour>=utc_offset && hour<24则:\n 如果offset_day=4(这一天跨table_id)则接收\n table_id=0x50(如果是o-sch则为0x60),\n 起始start_segment=31-utc_offse/3\n 结束end_segment=31\n 并接收\n table_id=0x51(如果是o-sch则为0x61),\n 起始start_segment=0\n 结束end_segment=(23-utc_offset)/3\n 如果offset_day=0(当天)则\n table_id=0x50(如果是o-sch则为0x60),\n 起始start_segment=0\n 结束end_segment=(23-utc_offset)/3\n 如果offset_day为其它值,则\n table_id=(offset_day-1)/4+0x50(如果是o-sch则\n 为(offset_day-1)/4+0x60),\n 起始start_segment=8*((offset_day-1)%4)\n +(24-utc_offset)/3\n 结束end_segment=start_segment+7\n如果当前小时hour<utc_offset(locally second day)则\n 如果offset_day=3(这一天跨table_id)则接收\n table_id=0x50(如果是o-sch则为0x60),\n 起始start_segment=31-utc_offse/3\n 结束end_segment=31\n 并接收\n table_id=0x51(如果是o-sch则为0x61),\n 起始start_segment=0\n 结束end_segment=(23-utc_offset)/3\n 如果off_set_day为其它值,则\n table_id=offset_day/4+0x50(如果是o-sch则为\n offset_day/4+0x60),\n 起始start_segment=8*(offset_day%4)\n +(24-utc_offset)/3\n 结束end_segment=start_segment+7\n最后所应说明的是:以上实施例仅用以说明而非限制本发明的技术方 案,尽管参照上述实施例对本发明进行了详细说明,本领域的普通技术人员 应当理解:依然可以对本发明进行修改或者等同替换,而不脱离本发明的精 神和范围的任何修改或局部替换,其均应涵盖在本发明的权利要求范围当 中。
法律信息
- 2014-02-05
未缴年费专利权终止
IPC(主分类): H04N 5/445
专利号: ZL 200310116953.6
申请日: 2003.12.03
授权公告日: 2006.06.14
- 2007-04-04
专利申请权、专利权的转移专利权的转移
<变更事项>专利权人<变更前权利人>北京中视联数字系统有限公司<变更后权利人>北京宽视软件技术有限公司<登记生效日>2007.03.02
- 2007-04-04
专利申请权、专利权的转移专利权的转移
<变更事项>地址<变更前权利人>100176北京市经济技术开发区宏达北路10号5层<变更后权利人>100080北京市海淀区中关村东路66号世纪科贸大厦B座26层<登记生效日>2007.03.02
- 2006-06-14
- 2005-08-10
- 2005-06-08
引用专利(该专利引用了哪些专利)
序号 | 公开(公告)号 | 公开(公告)日 | 申请日 | 专利名称 | 申请人 | 该专利没有引用任何外部专利数据! |
被引用专利(该专利被哪些专利引用)
序号 | 公开(公告)号 | 公开(公告)日 | 申请日 | 专利名称 | 申请人 | 1 | | 2007-12-12 | 2007-12-12 | | |