电视操作系统

更新时间:2023-03-14 09:26:31 阅读: 评论:0

朝鲜冷面的做法-梳齿

电视操作系统
2023年3月14日发(作者:笔记本电脑怎么截屏)

有线数字机顶盒OSD系统的设计

第1页共40页

1引言

1.1本文的背景

国家广电总局在《广播影视科技"十五"计划和2010年远景规划》中明确提出:把

全面推进数字化、网络化作为今后5~10年事业发展和科技创新工作的主线,并提出了

我国广播影视数字化发展进程表,即:第一步是全面启动和推进(到2005年前),其间

将完成地面数字电视标准的制定,在大城市开播数字电视(包括高清晰度电视);第二

步是基本实现数字化(到2010年),届时数字电视接收机得到普及;第三步是全面实现

数字化(到2015年),即全面完成模拟向数字的过渡,逐步停止模拟电视的播出。由此

可见,我国已制订了明确的发展数字电视的时间计划表,数字电视看似遥远,实则已近

在眼前。按照这个要求,结合我国国情和有线电视的实际情况,有线电视数字化是目前

的当务之急。

1.2数字机顶盒的现状及发展趋势

目前,数字电视技术已经基本成熟,在美国和欧洲一些发达国家,数字电视已经开

始普及,中国的数字电视也已有了明确的时间表,相关标准的制定已经或接近完成,可

以预计,作为接收数字电视信号并提供给当前模拟电视机的数字机顶盒产品,将在几年

内得到迅速发展。

现在的机顶盒开发,通常是在芯片厂家提供的开发平台上进行,一般情况下,厂家

提供的模板程序包括了TS流解调、解复用、视音频解码等控制,所以机顶盒的软件开

发主要集中这样两个部分:OSD菜单和CA系统,其中CA是机顶盒的条件接入模块,

是机顶盒进行电视网络运营的必要手段[1];而OSD菜单因为直接面向用户,其质量直接

关系机顶盒产品的市场前景,地位十分重要。

在竞争日趋激烈的数字机顶盒的市场中,操作简便又美观大方的用户界面是十分重

要的。目前数字机顶盒的用户界面是以其芯片的OSG功能为基础实现的,流行的数字

机顶盒中间件系统[2],如OPENTV等,在通用OSG硬件基础上实现了图形库和OSD

菜单。但是,这样的中间件系统费用十分昂贵,而且在其基础上开发的OSD菜单灵活

性受限制,往往不能得心应手。目前,国内的大部分机顶盒开发商都是选择在芯片OSG

有线数字机顶盒OSD系统的设计

第2页共40页

图形驱动上自行开发菜单系统[3]。

毋庸置疑,数字电视节目的普及已成为必然趋势,而中国现行的“模拟电视+机顶

盒”的转换形式使机顶盒市场蕴藏了巨大商机。由于信息资源更加丰富,用户与各种资

源间的交互性,为使操作更加简便,易于实现智能化,OSD菜单模块也更急需完善。

1.3软件的开发设计思想

本系统开发设计思想:

尽量利用人们现有的软件环境,采用简单快捷的设计方案,从而达到使用方便,容

易操作的目的;

此系统可以满足有线数字电视机顶盒日常使用的需要,并达到操作过程的直观、方

便、实用、安全等要求;

软件采用模块化程序设计方法,既便于软件功能的各种组合和修改,又便于技术维

护人员进行补充、维护[4]。

有线数字机顶盒OSD系统的设计

第3页共40页

2系统需求分析

2.1系统概述

OSD(OnScreenDisplay)提供一种在电视节目图像上叠加输出图形及文字的一种操

作,通过软件编程可以提供一套图形函数接口[5]。OSD系统主要是提供给终端用户一个

机顶盒功能的清单和节目的信息,让用户知道这台机顶盒到底能做什么,然后根据自己

的需求调整和改变一些数据或功能。一般机顶盒会提供10个主要菜单项:数字电视、

数字广播、精彩点播、电视网站、阳光政务、证券之窗、电视信箱、缴费信息、重新收

台、其他功能。这些主要菜单下面又有子菜单,子菜单可能还有子菜单,这样一级一级

的分支。OSD系统还要把数字机顶盒收到的电视节目信息(EPG)显示出来,供用户查阅。

用户根据自己的需求来选择其中的一个菜单或者观看节目,所以就要求系统具有移动光

标、翻页、选择并播放节目的基本功能。

2.2总体目标

●设计并实现各个功能菜单的界面显示

●提供良好的菜单风格,让用户能有好的视觉感受

●基本实现各个菜单的功能,能让用户对其进行操作

●尽量提高系统的易用性、稳定性、可移植性和可扩展性[6]

2.3系统总体需求

机顶盒OSD系统主要由开机启动画面、主菜单界面和节目播放界面三部分组成。

开机启动画面是在机顶盒上电开机时在屏幕上显示的画面。此时,一般是提示用户

机顶盒正在开机,让用户了解机顶盒的运行状态,以免着急。

主菜单界面是显示各个功能项菜单,如:数字电视、数字广播、精彩点播、电视网

站、阳光政务、证券之窗、电视信箱、缴费信息、重新收台、其他功能等这些主菜单以

及它们的子菜单。光标可以在这些菜单上移动,便于用户选择;它们还可以响应用户的

一些特定操作,如光标停在数字电视时,按遥控器上的“确认”键,屏幕就切换到数字

电视菜单的子菜单界面上。

节目播放界面分为两种。一种是全屏播放节目,这时整个屏幕显示的是电视节目的

有线数字机顶盒OSD系统的设计

第4页共40页

内容和画面,在这种状态下按遥控器上的“菜单”键,可以回到主菜单界面,按上下左

右键可以切换频道;一种是在视频窗口中播放电视节目,视频窗口内是节目的内容,而

窗口之外是菜单界面。

2.4开发环境与运行环境

系统开发环境:

开发平台:SourceInsight3.5

开发语言:C

编译工具:Ali_SDK

调试工具:Win_GDB

硬件具体配置如下:

PC机(WindowsXP/2000操作系统)

数字机顶盒(嵌入式实时操作系统)

电视机

烧录用的JTAG线和数据线等

运行环境:

在数字机顶盒里运行,运行结果在电视机或PC机上显示。

有线数字机顶盒OSD系统的设计

第5页共40页

3相关原理与协议

3.1数字电视系统分类

数字电视或HDTV的传输系统的任务就是将数字电视信号可靠的传送到接收机中,

数字电视广播一般有三种途径:

(1)DVB-T(Terrestrial)——地面数字视频广播系统,关于地面广播,其特点是最

复杂,干扰最严重,频道资源紧张,因此数字电视地面广播一般启用“禁用”频道进行

同播。同时地面广播主要面临加性噪声,多径传输即符号间干扰等。

(2)DVB-S(Satellite)——用于11/12GHz(上行/下行)的卫星电视,声音和数据业

务的数据视频广播系统,卫星广播的特点是覆盖面大,质量比较好,而且资源丰富。卫

星电视广播(DVB-S)是目前重要的通信手段之一,其中DVB-S为11/12GHz频段用的

卫星传输系统。

(3)DVB-C(Cable)——有线电视的数字视频广播系统。电缆和光纤混合网形式的

有线传输CATV(HFC),其特点是质量第一,资源丰富,但成本最高,目前借助于有

线电视技术开通数字电视交互业务(如视频点播)是首选方案。本文就是基于DVB-C

技术来做详细论述的。

3.2机顶盒工作原理

机顶盒工作原理如图3.1所示:

图3.1数字机顶盒工作原理图

数字机顶盒拥有的模拟视频通道,数字视频通道和双向控制通道,使其能够支持模

调谐器

A/D

QAM解调

信道前向

纠错译码

解扰音频DAC解复用MPEG-2译码

视频编码

信号

有线数字机顶盒OSD系统的设计

第6页共40页

拟式广播传输,数字式广播传输和交互功能,按照接受信号传播介质的不同,机顶盒一

般分为接收卫星数字电视机顶盒,接入有线电视(CATV)机顶盒和接入Internet的WebTV

机顶盒。一般常见性的机顶盒没有上行功能,主要是对接收数据的解复用,对压缩数据

的解压缩,解密收费和信道解码。

调谐模块接收射频信号并下行变频为中频信号,然后进行A/D转换为数字信号,再

送入QAM解调模块进行QAM解调,输出MPEG传输流的串行或并行数据[7]。解复用

模块接收MPEG传输流,从中抽出一个节目的PES数据,包括视频PES、音频PES以

及数据PES。解复用模块中包含一个解扰引擎,可在传输流层和PES层对加扰的数据进

行解扰,其输出是已解扰的PES。视频PES送入视频解码模块,取出MPEG视频数据,

并对MPEG视频数据进行解码,然后输出到PAL/NTSC编码器,编码成模拟电视信号,

再经视频输出电路输出。音频PES送入音频解码模块,取出MPEG音频数据,并对MPEG

音频数据进行解码,输出PCM音频数据到PCM解码器,PCM解码器输出立体声模拟

音频信号,经音频输出电路输出。数据流传递给CPU,由CPU做相应处理[8]。例如,

CPU根据数据流中的选单图形数据来控制图形发生器产生的选单图形;CPU还可根据

用户选择产生相应的消息数据,经QPSK或QAM调制后由上行信道反馈给视频服务器。

3.3PSI/SI协议

数字电视业务信息由PSI和SI两部分构成。PSI由MPEG-2标准定义,用于描述

TS的组成结构,规范不同业务和业务中的组件如何进行复用,由PAT,PMT,CAT和NIT4

种表组成[9]。在DVB中,因PSI表不够用,需对PSI表作补充与扩展,形成了DVB-SI

规范,它由BAT,SDT,EIT,RST,TDT,ST,SIT和DIT等表构成。

PSI数据提供了使能够接收机自动配置的信息,用于对复用流中的不同节目流进行

解复用和解码。

PSI信息由四种类型表组成,每类表按ction传输[10]。

1)节目关联表(PAT):

针对复用的每一路业务,PAT提供了相应的节目映射表(PMT)的位置(传

输流(TS)包的包标识符(PID)的值),同时还提供网络信息表(NIT)的

位置。

2)条件接收表(CAT):

条件接收表提供了在复用流中条件接收系统的有关信息。这些信息属于专用

有线数字机顶盒OSD系统的设计

第7页共40页

数据(未在本标准中定义),并依赖于条件接收系统。当有EMM时,它还

包括了EMM流的位置。

3)节目映射表(PMT):

节目映射表标识并指示了组成每路业务的流的位置,及每路业务的节目时钟

参考(PCR)字段的位置。

4)网络信息表(NIT):

-NIT表的位置符合GB/T17975.1-2000规范,但数据格式已超出了GB/T

17975.1-2000的范围,这是为了提供更多的有关物理网络的信息。

PSI中的PAT、CAT、PMT只提供了它所在的复用流(现行符复用流)的信息,业

务信息(SI)还提供了其他复用流中的业务和事件信息。这些数据由以下九个表构成:

1)业务群关联表(BAT):

-业务群关联表提供了业务群相关的信息,给出了业务群的名称以及每个业

务群中的业务列表。

2)业务描述表(SDT):

-业务描述表包含了描述系统中业务的数据,例如业务名称、业务提供者等。

3)事件信息表(EIT):

-事件信息表包含了与事件或节目相关的数据,例如事件名称、起始时间、

持续时间等。

-不同的描述符用于不同类型的事件信息的传输,例如不同的业务类型。

4)运行状态表(RST):

-运行状态表给出了事件的状态(运行/非运行)。运行状态表更新这些信

息,允许自动适时切换事件。

5)时间和日期表(TDT):

-时间和日期表给出了与当前的时间和日期相关的信息。由于这些信息频繁

更新,所以需要使用一个单独的表。

6)时间偏移表(TOT):

-时间偏移表给出了与当前的时间、日期和本地时间偏移相关的信息。由于

时间信息频繁更新,所以需要使用一个单独的表。

7)填充表(ST):

-填充表用于使现有的段无效,例如在一个传输系统的边界。

有线数字机顶盒OSD系统的设计

第8页共40页

8)选择信息表(SIT):

-选择信息表仅用于码流片段(例如,记录的一段码流)中,它包含了描述

该码流片段的业务信息的概要数据。

9)间断信息表(DIT):

-间断信息表仅用于码流片段(例如,记录的一段码流)中,它将插入到码

流片段业务信息间断的地方。

3.4机顶盒软件结构

在机顶盒中,软件系统是一个重要的组成部分。主控制器的工作通过软件的执行来

完成。

图3.2机顶盒软件系统结构图

机顶盒的软件基本结构如图3.2所示。操作系统一般采用实时操作系统。在这个操

作系统中主要完成进程调度、中断管理、内存分配、进程间通信、异常处理、时钟提取

等工作。硬件驱动部分提供外围硬件设备的驱动,包括IC总线、异步串行通信口、并

行通信口、非易失内存、键盘、遥控器、调谐器、信道解码模块等。图形接口主要用于

完成图形显示功能,以便于为用户提供友好的图形用户界面。音频解码和视频解码驱动

用于控制音频解码和视频解码硬件的工作。解复用和数据表提取模块主要是对码流解复

用和数据表提取操作的控制。应用程序编程接口将所有与硬件相关的底层函数映射到一

应用程序

应用程序编程接口或中间件

解复用音频解视频解图形

条件接受和数据码驱动码驱动接口硬件驱动

驱动表提取

操作系统

有线数字机顶盒OSD系统的设计

第9页共40页

个统一的接口上,并且提供一些与硬件无关的公用处理函数,比如网络协议、图形格式

分析、业务信息数据表分析等。条件接收驱动用于完成条件接收处理的工作和软件接口。

应用程序编程接口为应用程序提供了一个公共的编程接口,把应用程序与硬件屏蔽开,

使得应用程序与硬件无关。这样,就便于实现应用程序的可移植性。

3.5OSD库

OSD库是用来建立机顶盒图形用户界面的。他采用面向对象程序模型,同时采用信

息驱动程序模式。他把GIP显示和程序元素描述成几种OSD对象,每种对象能处理各

自的信息和显示它们。

当对象的状态变化时,对象会传递事件到应用层。

每种对象被描述成一个独立的数据结构、一个独立的绘画函数、和一个独立的信息

处理程序。每一种对象的数据结构被分为两个部分:公共部分和独立部分。公共部分被

用来描述对象的类型、位置和大小,它的领近对象的ID,绘制对象的颜色图案,它的

父体对象,和两个应用来定义keymapping和eventpostingcallback的指针。

公共部分扮演着一个重要的角色:把所有在屏幕的对象链接在一起。

数据结构的独立部分是用来描述对象不能在公共部分定义的属性。

为了使每种对象能运行自己,它有一个专用的绘画函数:OSD_DrawXXCell(…).

同样,为了使得每种对象能处理自己的信息,它也有一个专用的信息处理函数

OSD_XXXProc(…).

每种对象有一个或唯一一个OSD_DrawXXCell()andOSD_XXXProc(…).同样用来

协助建立GUI,OSD_ObjectOpen(…)andOSD_ObjectClo(…)通过对象提供“open”

和”clo”来建立GIP。

目前已经有十种对象被定义了:

Container,List,ProgressBar,ScrollBar,MultiText,TextField,Bitmap,Editfield,

MultilectandMatrixBox.

这10个对象分别是:

NER窗口容器,用来放其它小窗口

T用来显示用户可选列表

SS_BAR用不同的颜色指示进程的进度(进程条)。

_BAR弹出滚动菜单

有线数字机顶盒OSD系统的设计

第10页共40页

_FIELD显示单行静态文字

_TEXT显示多行静态文字

显示位图

_FIELD用户输入框(字符串、数字)

EL下拉框

_BOX复杂窗口容器,用来做复杂的窗口界面

4系统详细设计

有线数字机顶盒OSD系统的设计

第11页共40页

本章将根据系统需求分析对系统的各个模块进行设计,明确系统的模块组成,说明

各个模块的功能。

4.1软件启动流程

数字电视机顶盒软件开机流程如图4.1所示:

图4.1软件开机处理流程图

4.2系统实现思想

数字机顶盒OSD菜单的实现,通常要在OSG图形驱动的基础上作两部分的工作。

一个是在OSG驱动上建立OSG菜单系统所需要的图形库和字库,这是OSD菜单控件

元素的显示基础;另外就是建立菜单控件数据结构和OSD菜单消息处理循环[10]。

(1)画出对象

有线数字机顶盒OSD系统的设计

第12页共40页

在OSD库的介绍中,我们知道OSD定义了10种对象,这10种对象就是菜单界面

的内容和元素,画出了这些对象就显示了菜单界面。下面就简单介绍几个画这些对象的

函数。

VoidOSD_DrawObject(POBJECT_HEADpObj,UINT32nCmdDraw);

这个函数是画出不是当前焦点的对象,即以普通的方式画出。

VoidOSD_TrackObject(POBJECT_HEADpObj,UINT32nCmdDraw);

依据不同的对象类型调用不同的OSD_DrawXXXCell()函数,以高亮的方式画出对

象,即画出焦点对象。

VoidOSD_SelObject(POBJECT_HEADpObj,UINT32nCmdDraw);

画出所选中的对象。

VoidOSD_HideObject(POBJECT_HEADpObj,UINT32nCmdDraw);

隐藏一个对象(以它的父对象的背景颜色来画出这个对象)。

VoidOSD_ClearObject(POBJECT_HEADpObj,UINT32nCmdDraw);

清除被这个对象覆盖的那部分屏幕,让这块屏幕以透明的颜色显示。

(2)OSD菜单控件实现思想

在本系统的OSD中,菜单元素结构都从一种统一元素结构出发构建,这也是借鉴

C++中面向对象设计方法中的主类和派生类的思路[11]。这样的设计方法,使控件元素的

显示和管理能够方便的联系起来,程序结构也更加清晰。

统一元素结构概括了所有菜单元素的共性,包括元素类型,活动标志,显示起始位

置,回调函数等。如下示:

typedefstruct_OBJECT_HEADOBJECT_HEAD,*POBJECT_HEAD

struct_OBJECT_HEAD

{

UINT8bType;//Componenttype

UINT8bAttr;//控件的属性,包括以下几种:

//C_ATTR_ACTIVE/C_ATTR_SELECT/C_ATTR_INACTIVE/C_ATTR_HIDDEN

UINT8bFont;//Textfonttype.

UINT8bID;//ComponetnID.0isinvalidID

UINT8bLeftID;//Theleftneighbourcompoent’siD.

UINT8bRightID;//Therightneighbourcomponent’sID

UINT8bUpID;//Theaboveneighbourcomponent’sID

UINT8bDownID;//Thebelowneighbourcomponent’sID

OSD_RECTFrame;//Componentcoordinationintheparentwindow

COLOR_STYLEStyle;//ains4styleindexes.

VACTION(*pKeyMap)(OBJECT_HEAD*pObj,UINT32vkey);//按键处理函数

有线数字机顶盒OSD系统的设计

第13页共40页

PRESULT(*pCallback)(OBJECT_HEAD*pObj,UINT32Event,UINT32Param1,

UINT32Param2);//回调函数,控件消息处理函数

OBJECT_HEAD*pNext;//pointstonextcomponent

OBJECT_HEAD*pRoot;//pointstotheparentobject.

};

所有控件元素结构都是从该统一结构定义派生出来的,控件元素的结构定义一般包

括这样几部分的内容。

控件属性:主要是控件元素的静态信息,包括类型,显示位置和大小,活动标志,

下一个菜单链元素等;

控件方法:主要是该控件接收消息后的响应,主要是响应回调函数(或响应菜单),

响应回调函数有两类,一类是控件的默认响应函数,该函数主要完成焦点设置转移和选

中后响应特定回调函数等;另一类是特定响应函数,通常是选中按钮、列表框等焦点后

的应用程序回调函数。

OSD菜单采用单向链表的形式将一个菜单中的所有控件元素连接起来,在菜单的结

构中维护该链表的指针;菜单结构汇总还包含跟菜单显示有关的内容,目前包含是否显

示Logo图案的逻辑变量,以在显示菜单时决定是否显示Logo。

菜单显示函数利用控件显示函数指针数组方便的调用不同控件的显示函数,链式显

示整个菜单。

根据这种实现思路,本系统实现的图形控件有:

1)按钮(Button):用户的选择和确定操作,显示为图标按钮,支持遥控的选中(lect)

操作。

2)输入框(InputBox):用于用户输入数据或英文文字,主要用于机顶盒参数设置;

3)列表框(ListBox):用于用户选择节目数据库中的节目项,主要用于电子节目菜单;

4)进度条(Progress):主要用于特定模拟量的动态显示,例如机顶盒中进行高频头信号

质量的监控。

(3)OSD菜单消息处理

所谓的消息,其实就是一个指令。用户可以通过操作遥控器或者键盘发出消息,

而这种消息显然是没有指定哪个具体的控件接收,这样在处理起来就需要一种机制。

因为我们在定义OSD菜单系统的主类时设置了控件状态标志,并且在显示器屏幕

上在同一时刻只能选中一个控件处于活跃状态,所以我们在不管接收到什么消息,都默

认为应该把消息传给当前处于活跃状态的控件。由于我们在设计时参考了主类和派生类

的思想,因此设计的控件就会有母控件和子控件。如果子控件处于活跃状态,那么它的

有线数字机顶盒OSD系统的设计

第14页共40页

母控件也一定是先处于活跃状态。在消息传给当前处于活跃状态的控件时,首先应该是

传给了处于活跃状态的母控件,再在此母控件上查找有无处于活跃状态的子控件,直到

找到最底层处于活跃状态的控件,再把消息交给其对应消息处理函数,如果没有响应,

则逐层返回消息,直到有消息处理函数处理此消息。

OSD菜单的消息处理主要由Keymap和Callback这两个函数来实现。

1)keymap函数主要是处理按键消息,将物理建值(HKEY)转化为虚拟建值

(VKEY),再将VKEY(键值)翻译成其对应的act(动作),KEYMAP的数据是

从底层往顶层传递的。

通过被调用OBJ的keymap函数将VKEY转化成actioncodeACTION。

Keymap()函数原型:

staticVACTIONxxx_keymap(POBJECT_HEADpObj,UINT32key)

{

returnact;

}

有一些按键是keymap函数不能处理的,此时它会返回一个VACT_PASS值,以此

来调用它的上一层对象或者是根对象来处理。

2)callback处理全部信息(相当中断服务程序)

CALLBACK的数据是从顶层往底层传递的

●获取OBJ运行状态

●负责OBJ行为消息的处理

Callback()函数原型:

staticPRESULTxxx_callback(POBJECT_HEADpObj,VEVENTevent,UINT32param1,

UINT32param2)

{

PRESULTret=PROC_PASS;

Returnret;

}

有线数字机顶盒OSD系统的设计

第15页共40页

ret的返回类型有三种:

PROC_PASS:表示当前函数无法处理,希望其他的函数来完成这项功能

PROC_LOOP:表示当前函数已经处理完成了,不需要其他的函数来处理了

PROC_LEAVE:返回这个值时,系统将关闭当前的UI窗口,返回到它的上一层

4.3系统界面设计

4.3.1开机启动画面

描述:当数字机顶盒上电启动时,会在显示器(电视机屏幕)上显示一个背景是黑屏

的,屏幕底有个提示框,提示内容为:正在开机,请稍候…。此时机顶盒正在做一系列

软硬件的初始化,当初始化完成后,屏幕界面的显示会分两种情况:(1)如果当前频点没

有节目,机顶盒将会启动自动搜索,显示器上为自动搜索界面;(2)如果当前有节目,机

顶盒将会全屏播放节目,此时又分两种情况,一种是当前节目是不加密节目,则界面为

节目的音视频内容,一种是当前节目是加密节目,则弹出一个密码框,提示用户输入密

码,输入密码正确后播放节目内容。

4.3.2主菜单界面

描述:在全屏状态下,按遥控上的“菜单”键即进入主菜单界面。此时界面显示可

分为4个部分。

(1)顶部标题,这个一般是一张图片,根据各个地方广电局的要求来制作。本次设计

是为湖北荆州广电设计的,标题是:湖北楚天金纬数字电视。

(2)界面右边部分的小视频窗和一个小广告。小视频窗中应该播放当前频道的电视节

目内容,如果当前频道是加密节目,则不播放。小广告是一个为提供节目的公司作的宣

传。

(3)界面左边的菜单项列表。从上到下一次为:数字电视、数字广播、精彩点播、电

视网站、阳光政务、证券之窗、电视信箱、缴费信息、重新搜台、其他功能。当你把光

标移动到某一个菜单上,按遥控上的“确认”键,即可进入这个菜单的子菜单列表界面。

◆数字电视:无节目时,按“确认”会弹出一个提示框:无电视节目;有节目时,

会进入数字电视界面,界面分为4个部分:标题、子菜单列表、小视频窗、帮助信息。

子菜单包括:本地节目、中央节目、外省节目、付费节目、喜爱节目。视频窗播放当前

频道的节目。

有线数字机顶盒OSD系统的设计

第16页共40页

图4.2数字电视界面

◆数字广播:无数字广播时提示:无广播节目;有广播节目时进入数字广播界面。

◆精彩点播、电视网站、阳光政务、证券之窗:本次设计没有把这四项的功能实

现,只是用作以后升级扩展功能。

◆电视信箱:电视信箱子菜单有:电视邮件和电视彩信,能查看收到的邮件和彩

信。

图4.3电视信箱界面

◆缴费信息:获取智能卡的缴费信息情况,没插卡时提示:获取信息失败。

◆重新搜台:点击“确认“后,进入搜索界面,此时是根据程序设定的默认主频

点搜索。搜索的节目分为电视频道和广播频道,搜索时会有个进度条,搜索完后会把结

果显示出来。没节目时也会提示:没有搜到任何节目。

有线数字机顶盒OSD系统的设计

第17页共40页

◆其他功能:这个界面也分为4个部分:标题、子菜单列表、小视频窗、帮助信

息。子菜单列表有:节目管理、节目搜索、系统设置、展示舞台、游戏天地、万年历、

帮助。在这个界面里按“返回”能返回到上一级菜单,“退出”能退出到全屏,“确认”

能进入相应菜单的界面。

其他功能界面如图4.4所示:

图4.4其他功能界面

节目管理界面如图4.5:

图4.5节目管理界面

节目搜索界面如图4.6所示:

有线数字机顶盒OSD系统的设计

第18页共40页

图4.6节目搜索界面

系统设置界面如图4.7所示:

图4.7系统设置界面

游戏天地界面如图4.8所示:

有线数字机顶盒OSD系统的设计

第19页共40页

图4.8游戏天地界面

(4)界面底部的帮助信息。每个菜单界面都会有帮助信息,这是为了提示用户一些操

作会有什么样的结果。本次设计的主菜单的帮助信息是:十秒之内无操作自动进入数字

电视[↑↓]上下移动[←→]左右移动[确认]进入。

图4.5主菜单界面

4.3.3节目播放界面

分为全屏播放和小视频窗播放。数字机顶盒最重要的功能就是要把前端送过来的电

视节目码流在屏幕上播放出来。无论哪种播放方式,播放的内容都是当前频道的节目内

容。在全屏播放节目时,按上下键能换频道,左右键调节音量。

有线数字机顶盒OSD系统的设计

第20页共40页

5系统的具体实现

5.1开机画面的实现

当机顶盒开机时,屏幕的背景是黑屏,然后会有一个提示的图片:正在开机,请稍

候…。这部分的实现是在程序中加入了一个m2v的文件:Logo_menu.m2v。这个文件的

内容就是开机时显示的画面。这个m2v文件在程序文件

blocks_script_jade_um_dvt_中添加进工程的,代码如下:

[File]

id=0x02FD0100

offt=0x10000

file=Logo_menu.m2vname="Logo_menu"

ver="1.0.0"

机顶盒开机后,会做一系列软件和硬件初始化,会在这个时候注册一个Controltask

的线程,它会监测当前是否有节目。有节目就跳到主菜单,没有就进入自动搜索界面,

在主频点上搜索节目。代码如下:

if(prog_num!=0)

{

ota_reg_par_callback(ota_table_request);

menu=MAIN_MENU_HANDLE;

show_and_playchannel=1;

}

el

{

menu=(POBJECT_HEAD)&g_win_arch;

autoarch_open();

}

开机后进行搜索的界面如下所示:

有线数字机顶盒OSD系统的设计

第21页共40页

图5.1开机搜索节目

5.2主菜单界面的实现

在本系统中,所有的菜单实现都会遵循这样一条规律:只要定义一些我们需要的

控件(宏),并把这些控件跟当前的界面的根对象(即最大的Container)和它的兄弟对象建立

好链接关系,系统就会把这些控件画出来。

(1)标题的实现:主菜单的标题是由三副图片构成的,三幅图片分别是:

IM_MMENU_TITLE_LOGO,IM_TITLE_TEXT_01_L,IM_TITLE_TEXT_01_R。

实现的代码如下:

DEF_BITMAP(mm_dvbc_tv,&mm_title,&mm_dvbc_logo_text_l,C_ATTR_ACTIVE,0,

1,0,0,0,0,

TITLE_PIC_TV_L,TITLE_PIC_TV_T,TITLE_PIC_TV_W,TITLE_PIC_TV_H,

BMP_SH_IDX,BMP_HL_IDX,BMP_SL_IDX,BMP_GRY_IDX,

NULL,NULL,

C_ALIGN_CENTER|C_ALIGN_VCENTER,0,0,IM_MMENU_TITLE_LOGO)

DEF_BITMAP(mm_dvbc_logo_text_l,&mm_title,&mm_dvbc_logo_text_r,C_ATTR_A

CTIVE,0,

2,0,0,0,0,

TITLE_PIC_TXT_L_L,TITLE_PIC_TXT_L_T,TITLE_PIC_TXT_L_W,TITLE_PIC_T

XT_L_H,BMP_SH_IDX,BMP_HL_IDX,BMP_SL_IDX,BMP_GRY_IDX,

NULL,NULL,

C_ALIGN_CENTER|C_ALIGN_VCENTER,0,0,IM_TITLE_TEXT_01_L)

有线数字机顶盒OSD系统的设计

第22页共40页

DEF_BITMAP(mm_dvbc_logo_text_r,&mm_title,NULL,C_ATTR_ACTIVE,0,

3,0,0,0,0,

TITLE_PIC_TXT_R_L,TITLE_PIC_TXT_R_T,TITLE_PIC_TXT_R_W,TITLE_PIC_T

XT_R_H,BMP_SH_IDX,BMP_HL_IDX,BMP_SL_IDX,BMP_GRY_IDX,

NULL,NULL,

C_ALIGN_CENTER|C_ALIGN_VCENTER,0,0,IM_TITLE_TEXT_01_R)

(2)菜单列表的实现

因为有10个菜单,所以定义了10个Container对象:mm_item_con1„„

mm_item_con10,每个Container下面挂了一个文本对象,用来显示菜单的名字。

Container控件定义如下:

#define

LDEF_MM_ITEM(root,varCon,nxtObj,varTxt,ID,IDl,IDr,IDu,IDd,l,t,w,h,bmpID,resID)

LDEF_CON(&root,varCon,nxtObj,ID,IDl,IDr,IDu,IDd,l,t,w,h,&varTxt,1)

LDEF_TXT(&varCon,varTxt,NULL,0,0,0,0,0,l+TXT_L_OF,t+8,TXT_W,

TXT_H,

TXT_SH_IDX,TXT_HL_IDX,TXT_SL_IDX,TXT_GRY_IDX,resID,NULL)

把10个菜单控件跟当前窗口的根对象(g_win_mainmenu)建立链接,设置好每个菜

单控件的坐标后,程序会在打开这个窗口时把各个菜单画出。现在我以画出“数字电视”

这个菜单的程序作为例子,来说明菜单列表是如何实现的。

画出“数字电视”菜单的代码如下:

LDEF_MM_ITEM(g_win_mainmenu,mm_item_con1,&mm_item_con2,

mm_item_txt1,1,1,1,10,2,

MM_CON_L,MM_CON_T+(MM_CON_H+

MM_CON_GAP_Y)*0,MM_CON_W,MM_CON_H,0,RS_DIGITAL_TV_MAINMENU)

由前面的Container控件定义可知,第一个参数g_win_mainmenu是“数字电视”

菜单控件的父对象,也是当前窗口界面的根对象;参数mm_item_con1是“数字电视”

菜单本身;&mm_item_con2是“数字电视”菜单的兄弟对象,即“数字广播”;

mm_item_txt1是菜单控件的文本,即”数字电视“这四个字;1,1,1,10,2,这5个分别是

“数字电视”菜单的ID,它左边的菜单的ID(即当光标在“数字电视”上,按遥控器的

向左键时,光标要移动到这个ID号的菜单上),它右边的菜单的ID,它上面菜单的ID

和它下面菜单的ID;MM_CON_L,MM_CON_T+(MM_CON_H+MM_CON_GAP_Y)

*0,MM_CON_W,MM_CON_H,这几个参数设置“数字菜单”这个控件在界面的坐标;0

是BmpID,但是“数字电视”菜单不需要图片,所以设置为0;

有线数字机顶盒OSD系统的设计

第23页共40页

RS_DIGITAL_TV_MAINMENU是StringID,属于本系统字库里的序号,内容是“数字

电视”这四个字。

根据这些参数,系统就能画出“数字电视”这个菜单控件,并且找到要画的下一个

菜单控件mm_item_con2,直到把10个控件全部画出来,即当nxtObj为NULL的时候。

菜单对按键的响应:当有按键时,首先会调用Keymap函数把按键转换为Action,

然后调用Callback函数实现具体功能。这个在系统实现思想中已经有详细阐述。具体代

码会在附件中给出,下面是按“确认”键后,菜单响应的部分代码:

if(unact==VACT_ENTER)

{

if(mm_windows_list[id-1]!=NULL)

{

av_mode=sys_data_get_cur_chan_mode();

if((id==DTV_ID))//id=1

{

recreate_prog_view(VIEW_ALL|TV_CHAN,0);

if(get_prog_num(VIEW_ALL|TV_CHAN,0)>0)

{

if(OSD_ObjOpen(mm_windows_list[id-1],0xFFFFFFFF)!=

PROC_LEAVE)

{

menu_stack_push(mm_windows_list[id-1]);

}

}

el

{

win_popup_msg(NULL,NULL,RS_MSG_NO_PROGRAM_TV);

ret=PROC_LOOP;

returnret;

}

}

(3)底部帮助信息的实现

帮助信息是由三幅图片组成:IM_HELP_TEXT_01,IM_HELP_TEXT_02,

IM_HELP_TEXT_03。方法跟标题实现的方法一致,这里就不再赘述。

有线数字机顶盒OSD系统的设计

第24页共40页

6问题与解决方法

6.1如何显示EPG里的星期栏?

EPG中的星期栏的显示与其他菜单的显示不相同,只定义了一个对象,然后循环调

用,每次循环改变对象位置,把七天都画出来。当焦点停在某一天(对象)上时,这天(这

个对象)会高亮,并且它的宽度要比其他的宽,这样会更醒目,而且此时除了显示了星

期,还在上面显示了日期。代码说明如下:

POBJECT_HEADtxt=(POBJECT_HEAD)&epg_sch_weekday;//星期的对象

for(i=0;i

{

txt->=SCH_WEEKDAY_L+i*SCH_WEEKDAY_W+

hi*SCH_WEEKDAY_W;//左位置坐标

if(weekdayHilght==i)//如果第i天是焦点,需要高亮

{

hi=1;

txt->=2*SCH_WEEKDAY_W;//宽度是普通的2倍

(&epg_sch_weekday)->pString=unistr;

get_local_time(&dt);//得到码流中的时间

dt2=dt;

mjd_to_ymd(+i,&,&,&,&y);

sprintf(str,"(%02d.%02d)",,);//加载日期

ComAscStr2Uni(str,unistr);

src=

OSD_GetUnicodeString(weekday_id[(i+theFirstWeekdayIDX)%WEEK_DAY_TIEM_CNT])

;//得到星期

len=ComUniStrLen(unistr);

ComUniStrCopyChar((UINT8*)&unistr[len],src);

OSD_SetTextFieldContent(&epg_sch_weekday,STRING_UNICODE,

(UINT32)unistr);//设置对象的内容

OSD_TrackObject(txt,C_UPDATE_ALL);//高亮画出对象

}

el//不是高亮的对象,只显示出星期,不显示日期

{

(&epg_sch_weekday)->pString=NULL;

OSD_SetTextFieldContent(&epg_sch_weekday,STRING_ID,weekday_id[(i+theFirstWee

kdayIDX)%WEEK_DAY_TIEM_CNT]);

txt->=SCH_WEEKDAY_W;

OSD_DrawObject(txt,C_UPDATE_ALL);//普通画出对象

}

}

按遥控的左右键,能在星期之间进行切换,这样就可以查看一周的节目指南。这个

有线数字机顶盒OSD系统的设计

第25页共40页

功能是用函数left_right_key_change_day(INT32shift)实现的,这个函数的具体内容将在

附件中给出。

EPG信息界面如下图所示:

图6.1EPG信息界面

6.2如何弹出一个提示框?

提示框在OSD中很常用,下面就以弹出一个提示“开始工厂升级模式”的提示框,

来说明一种制作弹出提示框的方法:在主菜单界面,按一个红色键钮弹出一个选择是否

“开始工厂升级模式”的提示框了。

制作过程:

1制作需要显示的字符

通过在字库文件中添加

RS_STA_FACT_UPGRADE_MODEstartfactoryUpgrademode开始工厂升级

模式

(字符串中间的是tab而不是空格)这一串字符,并且通过工具

生成所需要的.h后缀的文本,放置到相应的位置,就可以在程序中使用这些字符

了。

有线数字机顶盒OSD系统的设计

第26页共40页

2制作一个简单的弹出框

通过下面两个函数(keymap与callback)来实现弹出一个提示框:

staticVACTIONmm_item_con_keymap(POBJECT_HEADpObj,UINT32key);

staticPRESULTmm_item_con_callback(POBJECT_HEADpObj,VEVENTevent,

UINT32param1,UINT32param2);

keymap:从字面上看就是捕获按键的意思,从我的理解应该是一个定时扫描按键

的程序,系统每间隔一段时间扫描一次键盘,当有按键按下时,处理芯片立即保存

此刻的按键值,并且分析按键值,通过Callback函数转到相应的处理步骤去。

过程:

通过keymap捕捉所按的键值,储存在act这全局变量中;然后callback函数通

过判断act这变量的值是否与所需要判断的键值对应(本次程序所需要测试的按键为

V_KEY_RED),当act于所需判断的按键相符就转入需要处理的程序中。

Keymap函数里面所添加的部分如黄色高亮部分。

callback函数里面添加的部分如下

这样就可以在主菜单界面,通过按一个红色键钮来弹出一个选择是否“开始工厂升

级模式”的提示框了。

有线数字机顶盒OSD系统的设计

第27页共40页

有线数字机顶盒OSD系统的设计

第28页共40页

结束语

经过几个月的设计和开发,有线数字电视OSD系统基本完成。这个系统是运用Ali

的方案,通过C语言编程实现的。本系统能基本实现显示机顶盒菜单界面的功能,各个

菜单的功能也基本实现,能满足客户基本要求。

本系统尚处于实现阶段,还有许多不尽如人意的地方,如界面的风格和画面还不是

很精致,界面切换延时过长,切换画面有明显瞬间残留现象,搜索节目时可能会出现死

机,搜索完后黑屏不能播放节目等许多方面的问题。这些都将有待于在下一步的工作中

不断的完善。

系统设计完毕后,经过对系统的测试和使用,各部分功能实现良好,基本达到了预

期的系统设计目标。

有线数字机顶盒OSD系统的设计

第29页共40页

参考文献

[1]刘硫敏.数字视音频技术与应用[M].北京:电子工业出版社,2003

[2]刘达.数字电视技术[M].北京:电子工业出版社,2006.9

[3]杨恒玲,孙德生.基于HI3110的数字电视机顶盒关键技术[J].怀化学院学报,2008,

27(2),79-81

[4]克尼汉.C程序设计语言(第2版·新,徐宝文,李志等译)[M].北京:机械工业出版

社,2001.1

[5]张素文,贺玮,刘明兰.基于OSD的数字机顶盒用户界面设计[J].可编程控制器与工

厂自动化(PLC&FA),2006,11(4),111-113

[6]谭浩强.C程序设计[M].北京:清华大学出版社,1999

[7]周晓,于鸿洋.有线高清数字电视机顶盒用户操作界面的设计于实现[J].中国有线电

视,2007,6(01),50-54

[8](美)JeanJ,Labros.嵌入式实时操作系统(邵贝贝等译)[M].北京:北京航天航空

大学出版社2007.9

[9]数字视频广播业务信息规范[S].国家广播电影电视总局

[10]刘菁,于鸿洋.有线数字电视机顶盒界面及EPG的设计与实现[J].中国有线电视,

2006,8(07),635-638

[11]马延珂.基于数字机顶盒的OSD设计[J].北京广播学院学报(自然科学版),2003,

10(4),52-57

[12]andImplementationofthelwIPTCP/hInstitute

ofComputerScience,February20,2001

[13]on,,inIntegratingtheMPEG-2subsystemfor

digitaltelevisionISSN,(06)

有线数字机顶盒OSD系统的设计

第30页共40页

致谢

本设计在HHH老师的悉心指导和严格要求下完成,从课题选择、方案论证到具体

设计和调试,无不凝聚着胡老师的心血和汗水,在四年的本科学习和生活期间,也始终

感受着导师的精心指导和无私的关怀,我受益匪浅。在此向HHH老师表示深深的感谢

和崇高的敬意。

另外,我还要感谢我实习所在公司的指导老师JJJ,他严谨细致、一丝不苟的作风

一直是我工作、学习中的榜样;他们循循善诱的教导和不拘一格的思路给予我无尽的启

迪。

不积跬步何以至千里,本设计能够顺利的完成,也归功于各位任课老师的认真负责,

使我能够很好的掌握和运用专业知识,并在设计中得以体现。正是有了他们的悉心帮助

和支持,才使我的毕业论文工作顺利完成,在此向CSLG通信工程专业的全体老师表示

由衷的谢意。感谢他们四年来的辛勤栽培。

有线数字机顶盒OSD系统的设计

第31页共40页

附录

附录A

OSD库中,目前已经有十种对象被定义了:

Container,List,ProgressBar,ScrollBar,MultiText,TextField,Bitmap,Editfield,

MultilectandMatrixBox

下面是对这10个对象的详细描述:

NER窗口容器,用来放其它小窗口

typedefstruct_CONTAINER_{

OBJECT_HEADhead;

POBJECT_HEADpNextInCntn;//pointtothefirstsubobject

UINT8FocusObjectID;//focudsubobjectID

UINT8bHiliteAsWhole;//wheathertohighlightallobjectsincludedinthis

container

}CONTAINER,*PCONTAINE

T用来显示用户可选列表

typedefstruct{

OBJECT_HEADhead;

OBJECT_HEAD**pListField;

SCROLL_BAR*scrollBar;

UINT16bListStyle;

UINT16wDep;//list’scountofapage

UINT16wCount;//countofobjectsinpListField

UINT16wTop;//thefirstitemofthepage"in"thelist

UINT16wCurPoint;//thecurrentfocusitemindex

UINT16wNewPoint;//thenewfoucsitemindextobetomovedto

UINT16wSelect;//singlelectflag

UINT32*dwSelect;//multilectflag

OBJECT_HEAD*pSelMarkObj;//Selectmarkobject

}OBJLIST,*POBJLIST;

有线数字机顶盒OSD系统的设计

第32页共40页

SS_BAR用不同的颜色指示进程的进度(进程条)。

typedefstruct_PROGRESS_BAR

{

OBJECT_HEADhead;

UINT8bStyle;//HorizontalorVertical,andthe

UINT8bX;//intervalwidthbetweentickforhoriprogress

UINT8bY;//intervalheightbetweentickforvertprogress

UINT16wTickBg;//colorstyle,rectarea

UINT16wTickFg;//sameasabove,tickarea

OSD_RECTrcBar;

INT16nMin;

INT16nMax;

INT16nBlocks;

INT16nPos;

}PROGRESS_BAR,*PPROGRESS_BAR;

_BAR弹出滚动菜单

typedefstruct_SCROLL_BAR

{

OBJECT_HEADhead;

UINT8bStyle;//HorizontalorVertical

UINT8bPage;

UINT16wThumbID;//Thumbarea'sstyle

UINT16wTickBg;//rectarea'sstyle

OSD_RECTrcBar;

UINT16nMax;

UINT16nPos;

}SCROLL_BAR,*PSCROLL_BAR;

_FIELD显示单行静态文字

howalineoftext

typedefstruct_TEXT_FIELD

有线数字机顶盒OSD系统的设计

第33页共40页

{

OBJECT_HEADhead;//commoncomponentheader

UINT8bAlign;//alignstyle

UINT8bX;//textofftinhorizontallocation

UINT8bY;//textofftinverticallocation

UINT16wStringID;//theIDofthestring

PWSTRpString;//pointertostring

//IfthispointerisnotNULL,

//thewStringIDwillbeignored

}TEXT_FIELD,*PTEXT_FIELD;

_TEXT显示多行静态文字

typedefstruct_MULTI_TEXT

{

OBJECT_HEADhead;

UINT8bAlign;

UINT8bCount;//ARRAY_SIZE(pTextTable)

UINT16nLine;//currentfirstlineidxfordisplay

OSD_RECTrcText;

SCROLL_BAR*scrollBar;

PTEXT_CONTENTpTextTable;

}MULTI_TEXT,*PMULTI_TEXT;

显示位图

Bitmapcomponentisjustudtoshowapictureataspecifiedlocation.

typedefstruct_BITMAP

{

OBJECT_HEADhead;

UINT8bAlign;//alignstyle

UINT8bX;//bitmapofftinhorizontallocation

UINT8bY;//bitmapofftinverticallocation

UINT16wIconID;//theIDofthepicture

有线数字机顶盒OSD系统的设计

第34页共40页

}BITMAP,*PBITMAP;

_FIELD用户输入框(字符串、数字)

typedefstruct_EDIT_FIELD

{

OBJECT_HEADhead;

UINT8bAlign;

UINT8bX;

UINT8bY;

UINT8bMaxLen;

char*pcsPattern;//fraction:"fXY"-X:integerwidth,Y:fractionwidth

//password:"pIML"-I:theinitialcharforpassword

//M:themaskedcharforpassword

//L:thepasswordlength

//range:"rNNNNN~MMMMM"-NNNNN:theminimumvalue

//MMMMM:themaximumvalue

//date:"dFS"-F:formatindex,S:peratorindex

//time:"t0"-hh:mm:ss

//"t1"-hh:mm

//"t2"-mm:ss

//string:"sLLLLL"-LLLLL:thestringmaximumlength(advancedfeature)

UINT8bStyle;//SELECT_STATUS/EDIT_STATUS|NORMAL_EDIT_MODE/

SELECT_EDIT_MODE

UINT8bCursorMode;//cursormode

UINT8bCursor;

UINT16*pString;

UINT16*pPrefix;//eg.E168

UINT16*pSuffix;//

UINT32valbak;

}EDIT_FIELD,*PEDIT_FIELD;

EL下拉框

有线数字机顶盒OSD系统的设计

第35页共40页

typedefstruct_MULTISEL

{

OBJECT_HEADhead;

UINT8bAlign;

UINT8bX;//Xofft

UINT8bY;

UINT8bSelType;//specifiesstringtypeofpSelTable

void*pSelTable;//pointertypeisdeterminedbybSelType

//bSelType=STRING_ID:UINT16[dwTotal]

//STRING_UNICODE:PWCHAR[dwTotal]

//STRING_NUMBER:UINT32[3]

//pSelTable[0]:theminimumvalue

//pSelTable[1]:themaximumvalue

//pSelTable[2]:thestep

//STRING_NUM_TOTAL:thesameasSTRING_NUMBER,

//butdisplayinformat"value/total".

//STRING_PROC:callbackgetstringfunction

INT16nCount;//ARRAY_SIZE(pSelTable)determinedbybSelType

INT16nSel;//determinedbybSelType

//bSelType=STRING_ID/STRING_UNICODE:currentltopSelTable

//STRING_NUMBER/STRING_NUM_TOTAL:thecurrentvalue

//STRING_PROC:currentl.

}MULTISEL,*PMULTISEL;

_BOX复杂窗口容器,用来做复杂的窗口界面

#defineDEF_MATRIXBOX(mb,root,next,attr,font,ID,lID,rID,tID,dID,l,t,w,h,sh,hl,s

el,gry,kmap,cb,style,ctype,cnt,ctable,row,col,assigntype,ix,iy,it,iz,pos)

MATRIX_BOXmb=

{

{OT_MATRIXBOX,attr,font,ID,lID,rID,tID,dID,

{l,t,w,h},

有线数字机顶盒OSD系统的设计

第36页共40页

{sh,hl,l,gry},

kmap,cb,

(POBJECT_HEAD)next,(POBJECT_HEAD)root,

},

style,ctype,cnt,(void*)ctable,row,col,assigntype,ix,iy,it,iz,pos

};

附录B

主菜单中的keymap和callback函数:

Keymap函数:

staticVACTIONmm_item_con_keymap(POBJECT_HEADpObj,UINT32key)

{

VACTIONact;

if(mainmenuTimer!=INVALID_ID)

{

api_stop_timer(&mainmenuTimer);

mainmenuTimer=INVALID_ID;

}

switch(key)

{

caV_KEY_ENTER:

act=VACT_ENTER;

break;

default:

act=VACT_PASS;

}

returnact;

}

Callback函数:

staticPRESULTmm_item_con_callback(POBJECT_HEADpObj,VEVENTevent,UINT32

param1,UINT32param2)

{

PRESULTret=PROC_PASS;

POBJECT_HEADitem;

VACTIONunact;

UINT8id=OSD_GetObjID(pObj);

UINT8back_saved;

UINT8av_mode;

UINT16curChannel;

有线数字机顶盒OSD系统的设计

第37页共40页

UINT8pre_chan_mode;

UINT8groupIdx=0;

UINT8ret_payment_info=0;

P_NODE*p_data_node=NULL;

UINT16channel=0;

P_NODEpNode;

switch(event)

{

caEVN_FOCUS_PRE_GET:

break;

caEVN_FOCUS_POST_GET:

mainmenuTimer=api_start_timer("mainmenu_timer",10000,

MainmenuTimerProc);

break;

caEVN_FOCUS_PRE_LOSE:

break;

caEVN_UNKNOWN_ACTION:

unact=(VACTION)(param1>>16);

if(unact==VACT_ENTER)

{

if(mm_windows_list[id-1]!=NULL)

{

av_mode=sys_data_get_cur_chan_mode();

if((id==DTV_ID))//id=1

{

recreate_prog_view(VIEW_ALL|TV_CHAN,0);

if(get_prog_num(VIEW_ALL|TV_CHAN,0)>0)

{

if(OSD_ObjOpen(mm_windows_list[id-1],0xFFFFFFFF)!=

PROC_LEAVE)

{

menu_stack_push(mm_windows_list[id-1]);

}

}

el

{

win_popup_msg(NULL,NULL,

RS_MSG_NO_PROGRAM_TV);

ret=PROC_LOOP;

returnret;

}

}

elif((id==RADIO_ID))//id=2

{

recreate_prog_view(VIEW_ALL|RADIO_CHAN,0);

if(get_prog_num(VIEW_ALL|RADIO_CHAN,0)>0)

{

sys_data_t_cur_chan_mode(RADIO_CHAN);

有线数字机顶盒OSD系统的设计

第38页共40页

channel=sys_data_get_cur_group_cur_mode_channel();

if(get_prog_at(channel,&pNode)!=SUCCESS)

{

channel=0;

}

show_and_playchannel=1;

ap_nd_msg(CTRL_MSG_SUBTYPE_CMD_ENTER_ROOT,

(UINT32)&g_win_progname,TRUE);

ret=PROC_LEAVE;

returnret;

}

el

{

win_compopup_init(WIN_POPUP_TYPE_SMSG);

win_compopup_t_msg(NULL,NULL,

RS_MSG_NO_PROGRAM_RADIO);

win_compopup_open_ext(&back_saved);

osal_task_sleep(500);

win_compopup_smsg_restoreback();

mainmenuTimer=api_start_timer("mainmenu_timer",10000,

MainmenuTimerProc);

ret=PROC_LOOP;

returnret;

}

}

elif((TV_WEBSITE_ID==id)||(SUN_GOVERNMENT_ID==

id))//id=4orid=5

{

UINT8uret=0;

if(TV_WEBSITE_ID==id)

uret=direect_enter_enreach(882);//882:tv_websiterviceid

elif(SUN_GOVERNMENT_ID==id)

uret=direect_enter_enreach(881);//881:sungovernment

rviceid

recreate_prog_view(VIEW_ALL|PROG_TV_MODE,0);

if(FALSE==uret)

{

win_compopup_init(WIN_POPUP_TYPE_SMSG);

win_compopup_t_msg(NULL,NULL,

no_group_name_id[id-4]);

win_compopup_open_ext(&back_saved);

osal_task_sleep(1000);

win_compopup_smsg_restoreback();

mainmenuTimer=api_start_timer("mainmenu_timer",10000,

MainmenuTimerProc);

returnPROC_LOOP;

}

有线数字机顶盒OSD系统的设计

第39页共40页

el

{

show_and_playchannel=1;

OSD_ObjOpen((POBJECT_HEAD)&g_win_mainmenu,

C_UPDATE_ALL);

returnPROC_LOOP;

}

}

elif(PAYMENT_INFO==id)//id=8

{

ret_payment_info=get_payment_info();

if(0==ret_payment_info)

{

returnPROC_LEAVE;

}

el

{

if(OSD_ObjOpen(mm_windows_list[id-1],0xFFFFFFFF)!=

PROC_LEAVE)

{

menu_stack_push(mm_windows_list[id-1]);

returnPROC_LOOP;

}

}

}

elif(id==RESEARCH)//id=9

{

autoarch_open();

returnPROC_LOOP;

}

el//id=3,6,7,0

{

if(OSD_ObjOpen(mm_windows_list[id-1],0xFFFFFFFF)!=

PROC_LEAVE)

{

menu_stack_push(mm_windows_list[id-1]);

}

}

}

}

ret=PROC_LOOP;

break;

default:

break;

}

returnret;

}

有线数字机顶盒OSD系统的设计

第40页共40页

附件

本文发布于:2023-03-14 09:26:30,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/1678757191246187.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:电视操作系统.doc

本文 PDF 下载地址:电视操作系统.pdf

上一篇:端午节赛龙舟
下一篇:返回列表
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图