dvboverip详解.docx

上传人:b****6 文档编号:6760117 上传时间:2023-01-10 格式:DOCX 页数:28 大小:1.29MB
下载 相关 举报
dvboverip详解.docx_第1页
第1页 / 共28页
dvboverip详解.docx_第2页
第2页 / 共28页
dvboverip详解.docx_第3页
第3页 / 共28页
dvboverip详解.docx_第4页
第4页 / 共28页
dvboverip详解.docx_第5页
第5页 / 共28页
点击查看更多>>
下载资源
资源描述

dvboverip详解.docx

《dvboverip详解.docx》由会员分享,可在线阅读,更多相关《dvboverip详解.docx(28页珍藏版)》请在冰豆网上搜索。

dvboverip详解.docx

dvboverip详解

dvboverip详解

 

1

TS流的内容

TS->PES->ES->NAL

ES

Anelementarystream(ES)isdefinedbyMPEGcommunicationprotocolisusuallytheoutputofanaudioorvideoencoder.

PES

allowsanElementarystreamtobedividedintopackets.

图一:

PES结构图

PES结构各字段的具体含义见附表一。

由图一可见,1个PES包是由包头、ES特有信息和包数据3个部分组成。

由于包头和ES特有信息二者可合成1个数据头,所以可认为1个PES包是由数据头和包数据(有效载荷)两个部分组成的。

包头由起始码前缀、数据流识别及PES包长信息3部分构成。

包起始码前缀是用23个连续“0”和1个“1”构成的,用于表示有用信息种类的数据流识别,是1个8bit的整数。

由二者合成1个专用的包起始码,可用于识别数据包所属数据流(视频,音频,或其它)的性质及序号。

例如:

比特序110×××××是号码为××××的MPEG-2音频数据流;比特序1110××××是号码为××××的MPEG-2视频数据流。

PES包长用于包长识别,表明在此字段后的字节数。

如,PES包长识别为2B,即2×8=16bit字宽,包总长为216-1=65535B,分给数据头9B(包头6B+ES特有信息3B),可变长度的包数据最大容量为65526B。

尽管PES包最大长度可达(216-1)=65535B(Byte),但在通常的情况下是组成ES的若干个AU中的由头部和编码数据两部分组成的1个AU长度。

1个AU相当于编码的1幅视频图像或1个音频帧,参见图一右上角从ES到PES的示意图。

也可以说,每个AU实际上是编码数据流的显示单元,即相当于解码的1幅视频图像或1个音频帧的取样。

ES特有信息是由PES包头识别标志、PES包头长信息、信息区和用于调整信息区可变包长的填充字节4部分组成的PES包控制信息。

其中,PES包头识别标志由12个部分组成:

PES加扰控制信息、PES优先级别指示、数据适配定位指示符、有否版权指示、原版或拷贝指示、有否显示时间标记(PTS-PresentationTimeStamp)/解码时间标记(DTS-DecodeTimeStamp)标志、PES包头有否基本流时钟基准(ESCR-ElementaryStreamClockReference)信息标志、PES包头有否基本流速率信息标志、有否数字存储媒体(DSM)特技方式信息标志、有否附加的拷贝信息标志、PES包头有否循环冗余校验(CRC-CyclicRedundancyCheck)信息标志、有否PES扩展标志。

有扩展标志,表明还存在其它信息。

如,在有传输误码时,通过数据包计数器,使接收端能以准确的数据恢复数据流,或借助计数器状态,识别出传输时是否有数据包丢失。

其中,有否PTS/DTS标志,是解决视音频同步显示、防止解码器输入缓存器上溢或下溢的关键所在。

因为,PTS表明显示单元出现在系统目标解码器(STD-SystemTargetDecoder)的时间,DTS表明将存取单元全部字节从STD的ES解码缓存器移走的时刻。

视频编码图像帧次序为I1P4B2B3P7B5B6I10B8B9的ES,加入PTS/DTS后,打包成一个个视频PES包。

每个PES包都有一个包头,用于定义PES内的数据内容,提供定时资料。

每个I、P、B帧的包头都有一个PTS和DTS,但PTS与DTS对B帧都是一样的,无须标出B帧的DTS。

对I帧和P帧,显示前一定要存储于视频解码器的重新排序缓存器中,经过延迟(重新排序)后再显示,一定要分别标明PTS和DTS。

例如,解码器输入的图像帧次序为I1P4B2B3P7B5B6I10B8B9,依解码器输出的帧次序,应该P4比B2、B3在先,但显示时P4一定要比B2、B3在后,即P4要在提前插入数据流中的时间标志指引下,经过缓存器重新排序,以重建编码前视频帧次序I1B2B3P4B5B6P7B8B9I10。

显然,PTS/DTS标志表明对确定事件或确定信息解码的专用时标的存在,依靠专用时标解码器,可知道该确定事件或确定信息开始解码或显示的时刻。

例如,PTS/DTS标志可用于确定编码、多路复用、解码、重建的时间。

TS

Transportstream将具有共同时间基准或者具有独立时间基准的一个或者多个PES组成的单一数据流。

图二:

TS包结构

TS结构各字段的具体含义见附表二。

由图二可见,TS包由包头、自适应区和包数据3部分组成。

每个包长度为固定的188B,包头长度占4B,自适应区和包数据长度占184B。

184B为有用信息空间,用于传送已编码的视音频数据流。

当节目时钟基准(PCR-ProgramClockReference)存在时,包头还包括可变长度的自适应区,包头的长度就会大于4B。

考虑到与通信的关系,整个传输包固定长度应相当于4个ATM包。

考虑到加密是按照8B顺序加扰的,代表有用信息的自适应区和包数据的长度应该是8B的整数倍,即自适应区和包数据为23×8B=184B。

TS包的包头由如图所示的同步字节、传输误码指示符、有效载荷单元起始指示符、传输优先、包识别(PID-PacketIdentification)、传输加扰控制、自适应区控制和连续计数器8个部分组成。

其中,可用同步字节位串的自动相关特性,检测数据流中的包限制,建立包同步;传输误码指示符,是指有不能消除误码时,采用误码校正解码器可表示1bit的误码,但无法校正;有效载荷单元起始指示符,表示该数据包是否存在确定的起始信息;传输优先,是给TS包分配优先权;PID值是由用户确定的,解码器根据PID将TS上从不同ES来的TS包区别出来,以重建原来的ES;传输加扰控制,可指示数据包内容是否加扰,但包头和自适应区永远不加扰;自适应区控制,用2bit表示有否自适应区,即(01)表示有有用信息无自适应区,(10)表示无有用信息有自适应区,(11)表示有有用信息有自适应区,(00)无定义;连续计数器可对PID包传送顺序计数,据计数器读数,接收端可判断是否有包丢失及包传送顺序错误。

显然,包头对TS包具有同步、识别、检错及加密功能。

TS包自适应区由自适应区长、各种标志指示符、与插入标志有关的信息和填充数据4部分组成。

其中标志部分由间断指示符、随机存取指示符、ES优化指示符、PCR标志、接点标志、传输专用数据标志、原始PCR标志、自适应区扩展标志8个部分组成。

重要的是标志部分的PCR字段,可给编解码器的27MHz时钟提供同步资料,进行同步。

其过程是,通过PLL,用解码时本地用PCR相位与输入的瞬时PCR相位锁相比较,确定解码过程是否同步,若不同步,则用这个瞬时PCR调整时钟频率。

因为,数字图像采用了复杂而不同的压缩编码算法,造成每幅图像的数据各不相同,使直接从压缩编码图像数据的开始部分获取时钟信息成为不可能。

为此,选择了某些(而非全部)TS包的自适应区来传送定时信息。

于是,被选中的TS包的自适应区,可用于测定包信息的控制bit和重要的控制信息。

自适应区无须伴随每个包都发送,发送多少主要由选中的TS包的传输专用时标参数决定。

标志中的随机存取指示符和接点标志,在节目变动时,为随机进入I帧压缩的数据流提供随机进入点,也为插入当地节目提供方便。

自适应区中的填充数据是由于PES包长不可能正好转为TS包的整数倍,最后的TS包保留一小部分有用容量,通过填充字节加以填补,这样可以防止缓存器下溢,保持总码率恒定不变。

2TS流的解码过程(只考虑本地文件,解码只涉及到系统层打包的解码,不涉及到编码的解码)

TS流的基本解码过程:

PAT节目关联表-》PMT节目映射表-》PES音频、视频包。

首先,从PAT获取TS流中所有节目映射表.

然后,从节目映射表中获取每个节目(本设计为本地文件,只含有一个PMT)数据(视频和音频)的PID。

最后,根据传输过来的数据PID对视频数据和音频数据进行系统层复用解码。

系统层复用解码:

循环:

TS-》PES-》ES。

PAT解码:

PAT表携带以下信息:

(1)TS流ID---transport_stream_id,该ID标志唯一的流ID。

(2)节目频道号--program_number,该号码标志TS流中的一个频道,该频道可以包含很多的节目(即可以包含多个VideoPID和AudioPID)

(3)PMT的PID---program_map_PID,表示本频道使用的哪个PID做为PMT的,因为PID可以有很多的频道,因此DVB规定PMT的PID可以由用户自己定义.

PMT解码

PMT表中包含的数据如下:

(1)当前频道中包含的所有Video数据的PID

(2)当前频道中包含的所有Audio数据的PID

(3)和当前频道关联在一起的其他数据的PID(如数字广播,数据通讯等使用的PID)

音视频解码

音视频解码的数据如下:

(1)根据音频PID解码音频数据到缓存区

(2)根据视频PID解码音频数据到缓存区

(3)和当前频道关联在一起的其他数据放到数据区中

3TS流解码

总用例图

Decoder首先调用事件管理器注册各类事件(事件类型见3.2.2),然后调用read_packet函数读取指定文件中的TS包进行分析,根据PID值不同分别对TS进行不同的处理。

Parse_PAT/PMT/..._packet把PAT(注:

PAT的PID为0)和PMT的携带的相关节目流PID的信息(包括视频,音频,私有数据等)存入Directory中,之后Parse_ts_packet通过Directory中提供的PID信号分别对不同的TS分别处理。

各解码类的UML图

3.1.1解码主类

TheDecoderobjectmanagessuchglobalinformationastheNetworkTablepidvalue,thecurrentpacketnumberandthenumberofprogramsandstreamsperprogram(asrepresentedintheDirectorystructure)。

主要函数介绍:

read_packet():

Calledtoreadanewtransportpacket。

install_dir(Directory*):

installDirectory,Directory是一个节目单(比如湖南卫视,星空卫视,东方卫视,CCTV)。

install_prog(Program*):

installprogram(如湖南卫视)toDirectory。

install_netpid():

表示网络信号的来源,当这个更新时,需要重新安装目录。

install_prog_on_current_list安装节目到当前列表。

install_prog_on_new_list安装节目到新的列表。

3.1.2事件管理类

typedefvoid(*Callback)(EventType,void*,void*):

回调函数模板。

voidRegister(EventTypet,Callbackf,void*d):

注册事件。

voidTrigger(EventType,void*):

触发事件。

3.1.3各类包解析的关系图

Consumer:

connect(InputPort*):

连接到输入接口。

set_cstate、get_cstate表示设置和获取状态。

Sectionconsumer:

read_partial表示读取TS的payload.。

read_header_a、read_header_b表示读取负载的头部分。

read_section根据读取的负载,更新节目。

各个子类分别实现。

PES同上。

3.1.4输入输出类

按要求从缓冲区中读入规定的位,或者字节数。

比如函数read_bit()表示从缓冲区中读入一个bit的数据(注意缓冲区中以byte对齐),读入时生成CRC。

所有从缓冲区读出数据的方式(bit\byte\nbits)基函数都是这个。

函数read_byte从缓冲区读取一个字节。

read_pattern表示读取指定字符串。

read_reserved_bits读取填充数据。

read_uimsbf(intnbits,char*message)读取n位转化为无符号整形,高位在前。

read_tcimsbf(intnbits,char*message)读取n位转化为有符号整形,高位在前。

check_crc表示CRC校验。

3.1.5解析PAT、PMT、私有数据等

解析PMT中携带的节目信息到program,再把program插入到directory。

类似于机顶盒的搜台系统。

Dirrctory:

函数add_program、remove_program表示添加和删除节目。

get_program表示获取节目,get_num_programs表示获取节目数,

Program:

函数active、deactivate表示添加激活和停止节目,add_estream、remove_estream表示给节目添加和删除ES流,set_pcr_estream表示设置该流含有PCR,get_estream表示获取ES流,get_num_streams表示获取节目中含流的数目。

3.1.6解析TS包

TS包结构,函数get_header_length表示TS包头的长度,config_basic表示TS包基本标志参数设置,config_adaptation表示适应字段设置,inc_cc表示包数量增加,add_pcr,delete_pcr添加和删除PCR。

get_fields_length表示调整字段长,不包括标志位,get_length表示totallengthoftheadaptationfield。

3.1.7解析PES包

对PES包进行解析。

解析出头部数据,解析后的数据分别存贮在”stream68”和”stream69”2个文件中。

函数get_length表示包总长度。

get_header_data_length表示PES头长度,不包括填充字段。

get_header_length表示PES头长度,包括填充字段。

config_basic表示PES参数设置。

3.1.8PCR时钟类

系统时钟的相关的类,对系统时钟进行比较。

其中对27MHZ的时钟算术和逻辑运算符进行了重载。

注:

PCR的校正一直是学术界研究的热点。

3.1.9CRC校验类

每位进行异或运算后存储在一个4BYTE的数组中。

函数poly_cmp作CRC验证。

函数push_bit作CRC的生成。

解码流程图

3.1.10TS包解析流程图

3.1.11Section解码流程图

3.1.12PES解码流程图

4

TS流合成(编码)

各编码类的UML图

4.1.1编码主类

函数install_dir首先安装PAT

函数send_packet表示按PID发送TS包

函数send_scheduled_packet表示按一定的规律轮流发送TS包。

函数recalc_mux表示节目复用

4.1.2合成各类之间的关系

函数get_nready获取已经填充的字节长度.

函数fill_buffer填充buffer.

函数send_payload发送负载.

函数send_section发送sectionpacket.

编码主要流程

4.1.3TS编码流程图

4.1.4负载(pes、section)打包过程

附表一:

●PES分组字段

packet_start_code_prefix(24)

开始码字为0X000001

stream_id(8)

原始流的类型和数目,取值从10111100到11111111之间。

各值含义具体见13818-1。

PES_packet_length(16)

表示从此字节之后PES包长(单位字节)。

0表示PES包长不限制,且只能用于视频PES。

10

填充字节。

PES_scrambling_control

(2)

PES有效负载的加密模式。

00表示不加密,其余表示用户自定义。

PES_priority

(1)

PES数据包的优先级。

类似于TS的此字段。

data_alignment_indicator

(1)

为1时,表明此分组头部之后紧跟着数据流描述子中定义的访问单元类型。

copyright

(1)

版权,1表示有版权,具体见版权描述子13818-11-2-6-24。

0表示没有。

original_or_copy

(1)

1表示原始数据,0表示备份

PTS_DTS_flag

(2)

10表示含有PTS字段,11表示含有PTS和DTS字段,00表示不含有PTS和DTS,01无定义。

ESCR_flag

(1)

1表示ESCR在PES首部出现,0表示不出现

ES_rate_flag

(1)

1表示PES分组含有ES_rate字段。

0表示不含有。

DSM_trick_mode_flag

(1)

1表示有8位的trick_mode_flag字段,0表示不出现此字段。

只对DSM有效。

在广播中不用。

additional_copy_info_flag

(1)

1表示有copy_info_flag字段,0表示不出现此字段。

PES_CRC_flag

(1)

1表示PES分组中有CRC字段,0表示不出现此字段。

PES_extention_flag

(1)

1表示扩展字段在PES包头存在,0表示扩展字段不存在

PES_header_data_length(8)

表示可选字段和填充字段所占的字节数。

0010

0010填充字段,表示只含有PTS,不含有DTS

当含有DTS时,这个填充字段为0011

PTS字段。

PTS[32…30](3)

marker_bit

(1)

PTS[29…15](15)

marker_bit

(1)

PTS[14…0](15)

marker_bit

(1)

0001

0001填充字段,表示接下来为DTS。

 

DTS数据解码时间

DTS[32…30](3)

marker_bit

(1)

DTS[29…15](15)

marker_bit

(1)

DTS[14…0](15)

marker_bit

(1)

reserved

(2)

填充字段

 

基本系统参考时间,和扩展系统参考时间。

ESCR_base[32…30](3)

marker_bit

(1)

ESCR_base[29…15](15)

marker_bit

(1)

ESCR_base[14…0](15)

marker_bit

(1)

ESCR_extention(9)

marker_bit

(1)

marker_bit

(1)

表示系统解码器从PES分组中接收字节的速度。

以50B/s为单位,有传送的作用。

ES_rate(22)

marker_bit

(1)

trick_mode_control(3)

特技模式,比如快进,快退。

具体见13818-1

field_id

(2)

表示在特技模式中,哪些场将被显示。

00表示仅显示顶场,01表示仅显示底场,10表示显示全帧。

11保留。

1表示编码间隙中可能丢失宏块,0表示不会丢失宏块。

丢失宏块用前面已解码的图像宏块代替。

编码的受限系数集,表示DCT后系统的非零限制,具体见13818-1

intra_slice_refresh

(1)

frequency_trunction

(2)

field_rep_cntrl(5)

隔行扫描中首场和底场显示顺序。

reserved(3)

填充

marker_bit

(1)

填充

additional_copy_info(7)

包含和版权有关的私用数据

previous_PES_packet_CRC(16)

CRC校验PES包数据(不包括包头)

PES_private_data_flag

(1)

1表示PES包首部中含有私用数据,0表示没有。

pack_head_field_flag

(1)

1表示PES首部含有一个ISO/IEC11172的组首部。

0表示PES首部没有含有组首部。

program_packet_sequence_counter_flag

(1)

1表示PES分组含programpacketsequencecounter和

字段,0表示不含有。

P-STD_buffer_flag

(1)

reserved(3)

填充

PES_extention_flag_2

(1)

1表示出现PES_extention_flied及相关字段。

0表示不出现。

PES_private_data(128)

私用数据

pack_field_length(8)

指示pack_header_field()字节长度。

marker_bit

(1)

program_packet_sequence_counter(7)

计数器,到0后重新计数,计算PES分组的数量。

marker_bit

(1)

MPEG1_MPEG2_identifier

(1)

1表示PES分组带有ISO/IEC11172-1系统信息,0代表带有PS流信息。

original_stuff_length(6)

01

P-STD_buffer_scale

(1)

联合使用控制BSn缓冲区的大小,具体定义见13818-1。

仅用于PS流中。

P-STD_buffer_size(13)

marker_bit

(1)

PES_extention_field_length(7)

规定此字段之后的扩展(填充)字段长度(单位字节)

reserved(8)

保留位8位

stuffing_byte(8)

填充字段。

11111111

PES_packet_data_byte(8)

PES包原始流数据长度,等于PES_packet_length减去从PES_packet_length到此字段之前的长度。

padding_byte(8)

填充字段。

11111111

附表二:

●传送流结构

sync_byte(8)

01000111

transport_error_indicator

(1)

传送层外被置1,表示至少一个不可纠正的错误位,改正前不被置0

payload_unit_start_indicator

(1)

该字段置1表示携带的是PSI或PES第一个包。

该字段置0表示携带的不是PSI或PES第一个包。

transport_priority

(1)

置1表示比其他同PID组有更高优先级

PID(13)

0x0000-0x000F保留,0x1FFF空分组

transport_scrambling_control

(2)

00表示未加密,其他“自定义”,空分组为00

adaptio

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 表格类模板

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1