秦俊权_EPG数据获取总结_20161027

上传人:沈*** 文档编号:141947616 上传时间:2022-08-24 格式:DOC 页数:8 大小:175.50KB
返回 下载 相关 举报
秦俊权_EPG数据获取总结_20161027_第1页
第1页 / 共8页
秦俊权_EPG数据获取总结_20161027_第2页
第2页 / 共8页
秦俊权_EPG数据获取总结_20161027_第3页
第3页 / 共8页
点击查看更多>>
资源描述
EPG数据获取介绍1、 频道列表的由来在搜索频道时,系统会自动保存所有频道的相关信息,并存在对应结构体SW_PROG_INFO_t: typedef struct sw_proginfo_tSW_U8 cServiceType; /业务类型(1:电视 2:广播 3:点播?)SW_U16 tsid; /码流idSW_U16 serviceid; /业务idSW_CHAR cServiceName SWSERVNAMELEN + 1 ; /业务名称(频道名称) SW_PROG_INFO_t;这些数据第一次搜索出来之后都会保存在FLASH中,每个频道都有自己对应的一个序号,下次开机时数据仍在。SW_PROG_INFO_t结构体在EPG中主要用到的是业务类型、码流id、业务id和业务名称,获取这些数据可以由下列五个函数获得,只要知道了业务id便可知道其它对应信息。先定义结构体指针SW_PROG_INFO_t *info_p; info_p = NewProg_GetInfoOfCurrProg(); /当前播放频道信息 info_p = NewProg_GetProgInfoOfByIndex(index);/对应index频道信息 info_p = NewProg_GetProgInfoOfType(index, type);/type类型对应index频道信息 info_p = NewProg_GetProgInfoOfServiceID(servid,tsid);/业务id和TSid对应频道信息, 通常频道的业务id都是唯一的,因此tsid 可以不需传递,等于NEWPROG_NOTCARE,主要是在获取PF时使用该函数。 info_p = NewProg_GetProgInfoOfCurrType(index);/获取当前业务类型对应index频道信息 上述的index为这些频道在频道搜索时在数据库中所保存的序号,通常用它们来获取当前播放频道的PF信息、schedule信息和显示频道列表。但如果在频道编辑中修改了频道的排序,则按编辑后的频道排序进行获取数据。其中读取的info_p包含TV和GB(具体排序是?)。type主要有SW_TVPROG和SW_GBPROG。要注意的是获取info_p后要进行if(NULL = info_p)来判断读取的信息是否正确,如果不加判断就使用其信息可能会导致死机。2、 获取频道列表数据在显示频道列表时需要知道对应类型频道的数量,由下列两个函数获得: Num = NewProg_GetProgNumOfType(type); /获取TV或GB频道数量 Num = NewProg_GetProgNumOfCurrType(); /获取当前类型的频道数量 Num = GetTotalTVRadioNum(); /获取TV和GB频道数量,亦用于开机时判断当前有无频道。然后根据这些数量在一个for循环里把相应频道数据插入到位图下拉列表。在使用位图下拉列表刷新列表时可以对每个子条目插入三个参数进行保存,可保存业务id等重要参数:SWCBMPL_InsertItem(SW_CBMPList_t * handle, SW_U32 param1, SW_U32 param2, SW_U32 param3, SW_CHAR_P txt, SW_U32 bmpindex, SW_U32 * index), 而在当位图下拉列表选择中相应频道时,可以先由:SWCBMPL_GetCurrItem(SW_CBMPList_t * handle, SW_U32_P index)获取当前所选择的子条目index,再用SWCBMPL_GetItemInfo(SW_CBMPList_t * handle, SW_U32_P param1, SW_U32_P param2, SW_U32_P param3, SW_CHAR_P txt, SW_U32 index)读出其所包含的信息,主要是业务id,同样文本也是可以读取的。频道名称通常是由for循环(如(for(index = 0;index cServiceName,而对于频道号的读取主要由下列两个函数(但这里读出来的tempNo的值等于index+1?)tempNo = NewProg_ProgIndexToShowNoOfCurType(index);/当前类型对应index频道的频道号TempNo = NewProg_ProgIndexToShowNo(type,index); /type类型对应index的频道号3、 喜爱列表及加锁图标的显示每个频道都有一个对应的结构体SW_PROGRAM_List_t保存频道相关信息:typedef struct sw_program_list_t SW_U8 used;SW_U8lock; /父母锁SW_U8volue; /音量SW_U8fav; /喜爱SW_U8user; SW_U8track; /*声道 0 : right, 1: left . 2: steroe*/SW_S16index; /什么的序号?SW_U8type; /类型指? SW_PROGRAM_List_t;获取这些数据时先定义结构体指针SW_PROGRAM_List_t * proglist,获取函数包括: proglist = NewProg_GetCurrProgMangInfo(); proglist = NewProg_GetProgMangInfoOfCurrType(index); proglist = NewProg_GetProgMangInfoOfType(index, type); /注意获取prolist后要进行非NULL判断这里的index和上述获取频道名称是的index是对应的,因此在显示喜爱节目列表时是对频道列表的一次筛选,主要根据函数PROG_ISMYFAV(proglist-fav,SW_FAV0)返回值为1时表示该频道为喜爱频道。SW_FAV0为喜爱类型,通常只有一种,即proglist-fav为1时表示喜爱节目,同样由proglist-lock为1表示设置为父母锁。在显示图标时使用的是SWCBMPL_SetParams(&ProtList,SWCBMPL_SHOWICON,index);进行小图标显示,而使用SWCBMPL_ShowItemIcon()时导致的左上角出现焦点子条目的原因是?4、 播放频道的切换在电视和广播切换频道时需要考虑到ProgType是否需要进行设置,通常在设置频道时可以判断是否需要切换业务类型。先由NewProg_GetCurrProgType( )获取当前的ProgType,再根据位图下拉列表读取的子条目信息的业务id获得选择频道的type,或者直接把type插入到子条目中,直接读取type。由业务id获得type是由info_p = NewProg_GetProgInfoOfServiceID(servid,tsid);获取info_p后,根据里面的info_p- cServiceType得到其type的,注意这里的info_p- cServiceType是TV为1,GB为2,而ProgType是TV为0,GB为1。然后根据当前ProgType和要切换到的频道type进行比较,如果不同需要用NewProg_SetCurrProgType(type); 设置当前播放业务类型。最后是调用下列函数:EpgMenuMang.serviceid = serviceid;EpgMenuMang.epgshow = 0;index = NewProg_GetIndexByServID(type,serviceid,NEWPROG_NOTCARE);/由业务务id、type获取需要切换至的频道的indexNewProg_SetCurrProgIndex(index);/设置为切换到的频道的index mang_list = NewProg_GetCurrProgMangInfo();if(NULL != mang_list)SWFAT_GetCommE2PInfo(E2P_cParentLock,&parentLock);if(0 != mang_list-lock & parentLock = 1)/父母锁打开切加锁时会弹出密码框SWWin_ProgIsLocked(SW_EPGWINDOW2);elseSW_PlayCurrProg();/播放新频道5、 PF信息和schedule信息的获取PF和Schedule信息的获取是由EIT表获得的,这部分内容会实时更新。频道的EIT表是需要turner对频道所载频点进行锁频后才能获得,而另一种情况是在前端支持下,由主频点发出所有频道的EIT表,这样便可一次性获得所有频道的PF和schedule信息。EIT表包含EIT present/following(EIT p/f)和EIT Schedule(EIT-S)。EIT p/f给出了指定业务中当前和后一个事件的信息,EIT-S则包含一周内或更长时间的节目预告信息。通常是在节目播放后才对TS流中的EIT进行读取分析,一是在播放该节目时会对其锁频,而在播放的同时会发SentNewEpgDataReq(tsid,serviceid)到底层搜数据,底层搜索完数据后会在swcw_epgproc的SW_EPGMODULE中接收到搜索成功的消息,其中返回参数定义如下:与EIT表相关的结构体为NewEpg_Event_t,主要根据业务id搜索到该业务的所有事件,并根据这些时间的起始时间和持续时间获得结束时间,进而对其筛选,而每个事件有独立的事件id用于标示。typedef struct Newepg_event_tchar cEit_used;/*0: no used; 1: used*/unsigned char eventState;/*CAmode */unsigned char ucUserNibble1_2; /用户自定义分类unsigned char ucContentNibble1_2; /节目内容分类,参照下表,高四位为content_nibble_level_ 1 ,低四位为content_nibble_level_ 2,通常只用到高四位。 unsigned short serviceid; /业务id unsigned short uiEventId; /*事件id msb16: serviceid; lsb: eitid*/shortsNextveit_index; /*获得第一个事件后根据该参数判断是否到最后一个,-1: inavailed*/unsigned shortutcStartData; /事件开始日期,可转化为年月日unsigned int utcStartTime; /事件开始时间,可转换为时分秒unsigned int DurSeconds; /事件持续时间,单位秒 unsigned char memEventNameEITNAME_MAXLEN; /事件名称(节目名称) unsigned char memEventDescEITCONT_MAXLEN; /节目简介信息 NewEpg_Event_t;表 content_nibble_level_ 1和content_nibble_level_2的分配Content_nibble_level_1Content_nibble_level_2描述0x00x0 to 0xF未定义的节目内容 电影/戏剧:0x10x0电影/戏剧(普通)0x10x1侦探/恐怖片0x10x2冒险片/西部片/战争片0x10x3科幻/荒诞/恐怖0x10x4喜剧0x10x5肥皂剧/伤感剧/民俗剧0x10x6浪漫剧0x10x7严肃/古典/宗教/历史电影/戏剧0x10x8成人电影/剧0x10x9至0xE预留使用0x10xF用户定义 新闻时事:0x20x0新闻时事(普通)0x20x1新闻/天气预报0x20x2新闻杂志0x20x3资料0x20x4讨论/聊天/辩论0x20x5至0xE预留使用0x20xF用户定义 表演/比赛:0x30x0表演/比赛(普通)0x30x1比赛/智力测验/竞赛0x30x2各种各样的表演0x30x3对话表演0x30x4至0xE预留使用0x30xF用户定义 体育:0x40x0体育(普通)0x40x1特别节目(奥运会、世界杯等)0x40x2体育杂志0x40x3足球/橄榄球0x40x4网球/壁球0x40x5团队运动(足球除外)0x40x6田径0x40x7摩托赛0x40x8水上运动0x40x9冬季运动0x40xA马术0x40xB拳击/武术0x40xC至0xE预留使用0x40xF用户定义 儿童/青少节目:0x50x0 儿童/青少节目(普通)0x50x1幼儿园节目0x50x26-14岁的娱乐节目0x50x310-16岁的娱乐节目0x50x4信息/教育/学校节目0x50x5卡通/木偶戏0x50x6 至0xE预留使用0x50xF用户定义 音乐/芭蕾/舞蹈:0x60x0音乐/芭蕾舞/舞蹈(普通)0x60x1摇滚/流行0x60x2严肃音乐/古典音乐0x60x3民间音乐/传统音乐0x60x4爵士乐0x60x5音乐/戏曲0x60x6芭蕾舞0x60x7至0xE预留使用0x60xF用户定义 艺术/文化(无音乐)0x70x0艺术/文化(无音乐,普通)0x70x1表演艺术0x70x2高雅艺术0x70x3宗教0x70x4大众文化/传统艺术0x70x5文艺0x70x6摄影0x70x7实验摄影/摄像0x70x8广播/出版0x70x9新媒体0x70xA艺术/文化杂志0x70xB时尚0x70xC至0xE预留使用0x70xF用户定义社会/政治/经济:0x80x0社会/政治/经济(普通)0x80x1杂志/报道/资料0x80x2经济/社会报道0x80x3名人0x80x4至0xE预留使用0x80xF用户定义儿童/青少年节目:教育/科学/专题:0x90x0教育/科学/专题(普通)0x90x1自然/动物/环境0x90x2技术/自然科学0x90x3医疗/生理/心理0x90x4外国/旅游0x90x5社会/精神科学0x90x6继续教育0x90x7语言0x90x8至0xE预留使用0x90xF用户定义 娱乐:0xA0x0娱乐(普通)0xA0x1旅游0xA0x2手工0xA0x3赛车0xA0x4减肥与健康0xA0x5烹饪0xA0x6广告/购物0xA0x7园艺0xA0x8至0xE预留使用0xA0xF用户定义0xB0x0母语0xB0x1黑与白0xB0x2未出版的0xB0x3现场直播0xB0x4至0xE预留使用0xB0xF用户定义0xC to 0xE0x0至0xF预留使用0xF0x0至0xF用户定义获取EIT信息的函数为:定义结构体指针NewEpg_Event_t * epg_p epg_p = GetPfEpgInfoOfServiceid(tsid, serviceid, index);/index = 0表示P ,index = 1表示F epg_p = GetEitIdEpgInfoOfService(tsid, serviceid, index); epg_p = GetNextEpgInfoOfService( index , *next );/这里index为下面函数获得的事件的头index,NewEpg_GetEitHeaderOfServID_core(tsid,serviceid),获取index的下一个eit,同时next被赋值为下一个事件的index,当next为-1时表示已经读取到最后一个。在对EIT获取前还需要判断当前业务是否有事件信息,通过num =NewEpg_GetEitNumOfServID_core(tsid,serviceid);读取num判断。 epg_p = GetEventIdInfoOfService(tsid, serviceid, eventid);PF信息的获取只需根据传入业务id和对应参数0或1进行读取P或F。Schedule信息的读取一般用于显示未来和当前播放的事件,因此需要对事件的开始日期、时间、持续时间和当前系统时间进行比较判断。如获取serviceid对应频道的今天正在播放及未播放的所有事件: 获取当前系统时间:SW_GetSysLocalTime(&datatime,§ime);这里读出的datatime的单位为天,sectime的单位为秒。datatime表示今天的日期,因此datatime+1表示明天的日期,同理datatime+N表示第N天后的日期。先是获取当前时间的分钟数:nowsysmins = datatime*1440 + sectime/60;这用于比较节目时间,由于通常是以分钟为最小单位,因此需转化为分钟数。 根据业务id获取EIT表的headindex=NewEpg_GetEitHeaderOfServID_core(tsid,serviceid);再判断该业务的事件数量是否非0:num =NewEpg_GetEitNumOfServID_core(tsid,serviceid);然后进行获取第一个事件信息:epg_p = NewEpg_GetNextEitOfService_core(headindex,&nextindex);然后进行while(-1 != nextindex)的循环读取所有信息,直至nextindex=-1.即到底。 转化读取到的EIT信息的日期、时间与系统日期、时间进行比较SW_LocalTimeAdjust(epg_p-utcStartData,epg_p-utcStartTime,&epgdate,&epgtime);prog_date = epgdate; /开始日期prog_start = epgdate *1440 + (epgtime/60); /开始分钟数prog_end = prog_start + (epg_p-DurSeconds/60); /结束分钟数下列条件语句用于判断该事件开始日期是否等于今天的日期(datatime)并且结束时间是否大于现在的分钟数:if(datatime = prog_ldata) & (prog_end nowsysmins)同样如果想获取第N天 的节目信息只需判断if(datatime+N) = prog_ldata),而nowsysmins可以不用判断,因为第N天的节目只需日期相符即可。6、 窗体切换时的闪烁解决办法造成窗体闪烁的原因通常有两种: 一种是视频正在播放,这时跳转到另一个窗体时调用了SW_PlayCurrProg();会导致视频关闭小视频黑屏,然后又重新打开播放,停顿时间较长,这时通过判断是否需要调用SW_PlayCurrProg()来解决问题,通常在进入频道编辑时会关闭视频,因此从频道编辑返回二级菜单需要调用SW_PlayCurrProg()让二级菜单的小视频继续播放。而此次开机有节目进入主菜单时也需要调用SW_PlayCurrProg()让主菜单的小视频播放。 另一种由于调用SWAV_SmallWindowDisplay(x,y,w,h,0)造成的视频抖动,而解决这个函数带来的视频抖动问题可以在窗体重绘时先显示主背景,这时候再调用SWAV_SmallWindowDisplay(),由于主背景在OSD层,盖住了底层的视频层,然后再显示小视频的背景框,中间为擦除色,这时显示出来的小视频就不会抖动了。
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 管理文书 > 施工组织


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!