dvboverip详解.docx
- 文档编号:6760117
- 上传时间:2023-01-10
- 格式:DOCX
- 页数:28
- 大小:1.29MB
dvboverip详解.docx
《dvboverip详解.docx》由会员分享,可在线阅读,更多相关《dvboverip详解.docx(28页珍藏版)》请在冰豆网上搜索。
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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- dvboverip 详解