文档章节

DVB开发之重点掌握

二进制的忧伤
 二进制的忧伤
发布于 2015/01/12 17:07
字数 1056
阅读 90
收藏 0

1、PSI/SI都采用表的形式来存储相关信息,通常一个表又包含子表,段,描述子等元素构成。

    (1)表(Table)

    表最初由MPEG-2标准定义的一种存储信息的结构,通常由一个或者多个子表(Sub_table)组成,不同的表通过表的标识(table_id)进行区分,例如PMT的table_id=0x02,NIT的table_id=0x40;

    (2)段(Section)

    段用于完成PSI/SI信息到传输流包的映射,表或者子表通常由一个或者多个段组成,一个表允许被分成不多于256个段,每个段携带表的一部分;

    Section段的通用结构如下:

    (3)描述子(Descriptor)

    描述子也叫做描述符,语意上比较完整的语法结构,用于提供特定的信息。所有描述子都是一个8位标识的“descripor_tag”开始后面紧跟一个8位的数表示描述子数据区的字节长度,从描述子第三个字节开始的数据则是各个描述子的具体内容。

    其语法结构如下:

    

2、NIT表:

    网络信息表(NIT)
    包含通过一个网络传输的TS流的物理结构有关的信息,以及网络自身有关信息,如:网络基本信息:网络标识、网络名称、网络多语言名称、链接信息 。TS流信息:TS流标识、传输系统描述、频率列表、业务列表;

    NIT表语法结构:

    NIT表C代码,解析了通用表头部分信息:

static void ParseNIT_SectionHead(TS_NIT *pstTS_NIT, unsigned char *pucSectionBuffer)
{
 int iNetworkDescriptorLen = 0;
 int iNIT_Length = 0;
 pstTS_NIT->table_id = pucSectionBuffer[0];
 pstTS_NIT->section_syntax_indicator = pucSectionBuffer[1] >> 7;
 pstTS_NIT->reserved_future_use_1 = (pucSectionBuffer[1] >> 6) & 0x01;
 pstTS_NIT->reserved_1 = (pucSectionBuffer[1] >> 4) & 0x03;
 pstTS_NIT->section_length = ((pucSectionBuffer[1] & 0x0F) << 8) | pucSectionBuffer[2];
 pstTS_NIT->network_id = (pucSectionBuffer[3] << 8) | pucSectionBuffer[4];
 pstTS_NIT->reserved_2 = pucSectionBuffer[5] >> 6;
 pstTS_NIT->version_number = (pucSectionBuffer[5] >> 1) & 0x1F;
 pstTS_NIT->current_next_indicator = (pucSectionBuffer[5] << 7) >> 7;
 pstTS_NIT->section_number = pucSectionBuffer[6];
 pstTS_NIT->last_section_number = pucSectionBuffer[7];
 pstTS_NIT->reserved_future_use_2 = pucSectionBuffer[8] >> 4;
 pstTS_NIT->network_descriptors_length = ((pucSectionBuffer[8] & 0x0F) << 8) | pucSectionBuffer[9];
 iNetworkDescriptorLen = pstTS_NIT->network_descriptors_length;
 memcpy(pstTS_NIT->network_descriptor, pucSectionBuffer + 10, iNetworkDescriptorLen);
 pstTS_NIT->reserved_future_use_2 = pucSectionBuffer[10 + iNetworkDescriptorLen] >> 4;
 pstTS_NIT->transport_stream_loop_length = ((pucSectionBuffer[10 + iNetworkDescriptorLen] & 0x0F) << 8)
         | pucSectionBuffer[10 + iNetworkDescriptorLen + 1];
 iNIT_Length = pstTS_NIT->section_length + 3;
 pstTS_NIT->CRC_32 = (pucSectionBuffer[iNIT_Length - 4] << 24) | (pucSectionBuffer[iNIT_Length - 3] << 16)
         | (pucSectionBuffer[iNIT_Length - 2] << 8) | pucSectionBuffer[iNIT_Length - 1];
}

3、PAT表:

    节目关联表(PAT)

    关联了节目编号(Program Number)与PMT所使用的PID以及给出NIT所用PID,它是PSI信息的根目录,只要找到PID为0的表,机顶盒就能获知PMT的PID,从而找到PMT表。

    节目关联表语法结构

    PAT表C代码解析数据,只解析Section头:

static void ParsePAT_SectionHead(TS_PAT *pstTS_PAT, unsigned char *pucSectionBuffer)
{
 int iPAT_Length = 0;
 pstTS_PAT->table_id = pucSectionBuffer[0];
 pstTS_PAT->section_syntax_indicator = pucSectionBuffer[1] >> 7;
 pstTS_PAT->zero = (pucSectionBuffer[1] >> 6) & 0x1;
 pstTS_PAT->reserved_1 = (pucSectionBuffer[1] >> 4) & 0x3;
 pstTS_PAT->section_length = ((pucSectionBuffer[1] & 0x0F) << 8) | pucSectionBuffer[2];
 pstTS_PAT->transport_stream_id = (pucSectionBuffer[3] << 8) | pucSectionBuffer[4];
 pstTS_PAT->reserved_2 = pucSectionBuffer[5] >> 6;
 pstTS_PAT->version_number = (pucSectionBuffer[5] >> 1) & 0x1F;
 pstTS_PAT->current_next_indicator = (pucSectionBuffer[5] << 7) >> 7;
 pstTS_PAT->section_number = pucSectionBuffer[6];
 pstTS_PAT->last_section_number = pucSectionBuffer[7];
 iPAT_Length = 3 + pstTS_PAT->section_length;
 pstTS_PAT->CRC_32 = (pucSectionBuffer[iPAT_Length - 4] << 24) | (pucSectionBuffer[iPAT_Length - 3] << 16)
         | (pucSectionBuffer[iPAT_Length - 2] << 8) | pucSectionBuffer[iPAT_Length - 1];
}

   

 4、PMT表:

    节目映射表(PMT)

    描述了组成当前传输流的某个节目的视频流,音频流,数据流信息和PID以及该节目参考时钟PRC的PID,通过PMT表机顶盒可以从传输流中提取出组成该节目的基本流,并予以解码重放,一个PMT表对应一个传输流中的一个节目。

节目映射表语法结构:

    PMT表C语言解析表头数据信息:

static void ParsePMT_SectionHead(TS_PMT *pstTS_PMT, unsigned char *pucSectionBuffer)
{
 int iPMT_Length = 0;
 pstTS_PMT->table_id = pucSectionBuffer[0];
 pstTS_PMT->section_syntax_indicator = pucSectionBuffer[1] >> 7;
 pstTS_PMT->zero = (pucSectionBuffer[1] >> 6) & 0x01;
 pstTS_PMT->reserved_1 = (pucSectionBuffer[1] >> 4) & 0x03;
 pstTS_PMT->section_length = ((pucSectionBuffer[1] & 0x0F) << 8) | pucSectionBuffer[2];
 pstTS_PMT->program_number = (pucSectionBuffer[3] << 8) | pucSectionBuffer[4];
 pstTS_PMT->reserved_2 = pucSectionBuffer[5] >> 6;
 pstTS_PMT->version_number = (pucSectionBuffer[5] >> 1) & 0x1F;
 pstTS_PMT->current_next_indicator = (pucSectionBuffer[5] << 7) >> 7;
 pstTS_PMT->section_number = pucSectionBuffer[6];
 pstTS_PMT->last_section_number = pucSectionBuffer[7];
 pstTS_PMT->reserved_3 = pucSectionBuffer[8] >> 5;
 pstTS_PMT->PCR_PID = ((pucSectionBuffer[8] << 8) | pucSectionBuffer[9]) & 0x1FFF;
 pstTS_PMT->reserved_4 = pucSectionBuffer[10] >> 4;
 pstTS_PMT->program_info_length = ((pucSectionBuffer[10] & 0x0F) << 8) | pucSectionBuffer[11];
 if (0 != pstTS_PMT->program_info_length)
 {
  memcpy(pstTS_PMT->program_info_descriptor, pucSectionBuffer + 12, pstTS_PMT->program_info_length);
 }
 iPMT_Length = pstTS_PMT->section_length + 3;
 pstTS_PMT->CRC_32 = (pucSectionBuffer[iPMT_Length - 4] << 24) | (pucSectionBuffer[iPMT_Length - 3] << 16)
         | (pucSectionBuffer[iPMT_Length - 2] << 8) | pucSectionBuffer[iPMT_Length - 1];
}

    当然不止这些表,这些仅仅只是罗列出了DVB开发中常见的几种表!

© 著作权归作者所有

二进制的忧伤
粉丝 9
博文 19
码字总数 16902
作品 0
深圳
程序员
私信 提问
北京猎头招聘2年经验android手机开发 底层开发 月薪15000

岗位名称:Android应用开发工程师 岗位职责: 1、负责Android应用程序的编码和测试工作 2、负责其它第三方应用界面的开发、维护。 任职要求: 1、 至少2年Android平台的应用开发及精通Andro...

hope8880814
2012/05/17
601
1
北京猎头招聘3年经验android开发 月薪15000

月薪12000-18000 公司提供五险一金 客户方为知名企业,不方便透露,具体电话面谈。 岗位名称:Android应用开发工程师 岗位职责: 1、负责Android应用程序的编码和测试工作 2、负责其它第三方...

freedom333
2012/05/21
1K
0
DVB网关--DVBlast

DVBlast是一个简单而强大的流媒体应用,基于Linux的DVB API开发。它打开一个DVB设备进行调整,放置PID过滤器,配置CAM的模块,组合数据包以输出RTP数据。DVBlast被设计为一个定制IRD或CID的核...

匿名
2009/12/17
2.9K
0
海思Hi3136卫星数字电视信道接收芯片处理器参数介绍

Hi3136是一款同时支持DVB-S(ETS 300 421)、DVB-S2(ETS 302 307)和DirecTV(ITU-R BO.1294 System B)标准的卫星数字电视信道接收芯片。芯片完成卫星数字信号从基带采样到MPEG-TS流输出的全数字...

牛牛00
06/17
0
0
PHP学习路线图 最全PHP自学指南

对于广大零基础的PHP自学者,往往不知道如何系统的学习PHP,导致平白浪费了很多时间。本文将为大家带来最详细的php学习路线图,同时还会附上相应的权威教程,让广大PHP自学者少走许多弯路。 ...

W3Cschool小编
2018/04/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

读书笔记:深入理解ES6 (五)

第五章 解构:使数据访问更便捷 第1节 为什么使用解构功能?   在ES5中,开发者们从对象、数组中获取特定数据并赋值给变量,编写了很多看起来同质化的代码。例如: 1 let options = {2 ...

张森ZS
10分钟前
7
0
CentOS7 yum方式安装MySQL5.7

在CentOS中默认安装有MariaDB,这个是MySQL的分支,但为了需要,还是要在系统中安装MySQL,而且安装完成之后可以直接覆盖掉MariaDB。 1 下载并安装MySQL官方的 Yum Repository [root@localho...

roockee
18分钟前
6
0
Allegro三种自定义设置快捷键的方法

Allegro自定义设置快捷键的三种方法: 1、在Allegro PCB editor 命令窗口直接定义 2、通过修改用户变量env文件来设置快捷键 3、定义笔画为快捷键 1、在Allegro PCB editor 命令窗口直接定义 ...

demyar
23分钟前
6
0
如何做一张能让人眼前一亮的大屏?

作为在职场驰骋的社会人,提到数据可视化大家应该都不陌生了。数据可视化的作用也不用我多说,主要是利用图形化手段,更清晰直观地将数据展示。多层次、交互式的可视化分析能够方便决策者理解...

朕想上头条
24分钟前
4
0
TL138/1808/6748-EthEVM开发板硬件CPU、FLASH、RAM

TL138/1808/6748-EthEVM是广州创龙基于SOM-TL138/1808/6748核心板开发的一款开发板,具有三个网络接口。由于SOM-TL138/1808/6748核心板管脚兼容,所以此三个核心板共用同一个底板。开发板采用...

Tronlong创龙
28分钟前
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部