dvboverip详解.doc
dvb over ip详解TS系统解码11TS流的容21.1ES21.2PES21.3TS42TS流的解码过程只考虑本地文件,解码只涉及到系统层打包的解码,不涉及到编码的解码52.1PAT解码:52.2PMT解码62.3音视频解码63TS流解码73.1总用例图73.2各解码类的UML图83.2.1解码主类83.2.2事件管理类93.2.3各类包解析的关系图103.2.4输入输出类113.2.5解析PAT、PMT、私有数据等123.2.6解析TS 包133.2.7解析PES包143.2.8PCR时钟类153.2.9CRC校验类153.3解码流程图163.3.1TS包解析流程图163.3.2Section解码流程图173.3.3PES解码流程图184TS流合成编码194.1各编码类的UML图194.1.1编码主类194.1.2合成各类之间的关系204.2编码主要流程214.2.1TS编码流程图214.2.2负载pes、section打包过程22附表一:23附表二:251 TS流的容TS->PES->ES->NALESAn elementary stream (ES) is defined by MPEG munication protocol is usually the output of an audio or video encoder.PESallows an Elementary stream to be divided into packets.图一:PES构造图PES构造各字段的具体含义见附表一。由图一可见,1个PES包是由、ES特有信息和包数据3个局部组成。由于和ES特有信息二者可合成1个数据头,所以可认为1个PES包是由数据头和包数据有效载荷两个局部组成的。由起始码前缀、数据流识别及PES包长信息3局部构成。包起始码前缀是用23个连续"0和1个"1构成的,用于表示有用信息种类的数据流识别,是1个8 bit的整数。由二者合成1个专用的包起始码,可用于识别数据包所属数据流视频,音频,或其它的性质及序号。例如:比特序1 1 0 ×××××是为××××的MPEG-2音频数据流; 比特序1 1 1 0 ××××是为××××的MPEG-2视频数据流。PES包长用于包长识别,说明在此字段后的字节数。如,PES包长识别为2 B ,即2×8 = 16 bit字宽,包总长为216-1=65535 B,分给数据头9 B6 B + ES特有信息3 B ,可变长度的包数据最大容量为65526 B。尽管PES包最大长度可达216 -1=65535 BByte,但在通常的情况下是组成ES的假设干个AU中的由头部和编码数据两局部组成的1个AU长度。1个AU相当于编码的1幅视频图像或1个音频帧,参见图一右上角从ES到PES的示意图。也可以说,每个AU实际上是编码数据流的显示单元,即相当于解码的1幅视频图像或1个音频帧的取样。ES特有信息是由PES识别标志、PES长信息、信息区和用于调整信息区可变包长的填充字节4局部组成的PES包控制信息。其中,PES识别标志由12个局部组成:PES加扰控制信息、PES优先级别指示、数据适配定位指示符、有否指示、原版或拷贝指示、有否显示时间标记PTS-Presentation Time Stamp/解码时间标记(DTS-Decode Time Stamp)标志、PES有否根本流时钟基准(ESCR-Elementary Stream Clock Reference)信息标志、PES有否根本流速率信息标志、有否数字存储媒体DSM特技方式信息标志、有否附加的拷贝信息标志、PES有否循环冗余校验CRC-Cyclic Redundancy Check信息标志、有否PES扩展标志。有扩展标志,说明还存在其它信息。如,在有传输误码时,通过数据包计数器,使接收端能以准确的数据恢复数据流,或借助计数器状态,识别出传输时是否有数据包丧失。其中,有否PTS/DTS标志,是解决视音频同步显示、防止解码器输入缓存器上溢或下溢的关键所在。因为,PTS说明显示单元出现在系统目标解码器STD-System Target Decoder的时间, 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标志可用于确定编码、多路复用、解码、重建的时间。TSTransport stream将具有共同时间基准或者具有独立时间基准的一个或者多个PES组成的单一数据流。图二:TS包构造TS构造各字段的具体含义见附表二。由图二可见,TS包由、自适应区和包数据3局部组成。每个包长度为固定的188 B,长度占4 B,自适应区和包数据长度占184 B。184 B为有用信息空间,用于传送已编码的视音频数据流。当节目时钟基准PCR-Program Clock Reference存在时,还包括可变长度的自适应区,的长度就会大于4 B。考虑到与通信的关系,整个传输包固定长度应相当于4个ATM包。考虑到加密是按照8 B顺序加扰的,代表有用信息的自适应区和包数据的长度应该是8 B的整数倍,即自适应区和包数据为23×8 B =184 B。 TS包的由如下列图的同步字节、传输误码指示符、有效载荷单元起始指示符、传输优先、包识别PID-Packet Identification、传输加扰控制、自适应区控制和连续计数器8个局部组成。其中,可用同步字节位串的自动相关特性,检测数据流中的包限制,建立包同步;传输误码指示符,是指有不能消除误码时,采用误码校正解码器可表示1bit 的误码,但无法校正;有效载荷单元起始指示符,表示该数据包是否存在确定的起始信息;传输优先,是给TS包分配优先权;PID值是由用户确定的,解码器根据PID将TS上从不同ES来的TS包区别出来,以重建原来的ES;传输加扰控制,可指示数据包容是否加扰,但和自适应区永远不加扰;自适应区控制,用2 bit表示有否自适应区,即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包保存一小局部有用容量,通过填充字节加以填补,这样可以防止缓存器下溢,保持总码率恒定不变。2 TS流的解码过程只考虑本地文件,解码只涉及到系统层打包的解码,不涉及到编码的解码TS流的根本解码过程:PAT节目关联表-"PMT节目映射表-"PES音频、视频包。首先,从PAT获取TS流中所有节目映射表.然后,从节目映射表中获取每个节目本设计为本地文件,只含有一个PMT数据视频和音频的PID。最后,根据传输过来的数据PID对视频数据和音频数据进展系统层复用解码。系统层复用解码:循环:TS-"PES-"ES。PAT解码:PAT 表携带以下信息:1TS 流ID - transport_stream_id,该ID标志唯一的流ID 。2节目频道号- program_number,该标志TS流中的一个频道, 该频道可以包含很多的节目(即可以包含多个Video PID 和Audio PID)3PMT 的PID- program_map_PID,表示本频道使用的哪个PID做为PMT 的,因为PID可以有很多的频道, 因此DVB规定PMT 的PID 可以由用户自己定义PMT解码PMT 表中包含的数据如下:1 当前频道中包含的所有Video 数据的PID2 当前频道中包含的所有Audio 数据的PID3 和当前频道关联在一起的其他数据的PID(如数字播送,数据通讯等使用的PID)音视频解码音视频解码的数据如下:1 根据音频PID解码音频数据到缓存区2 根据视频PID解码音频数据到缓存区3 和当前频道关联在一起的其他数据放到数据区中3 TS流解码总用例图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 解码主类The Decoder object manages such global information as the Network Table pid value, the current packet number and the number of programs and streams per program (as represented in the Directory structure)。主要函数介绍:read_packet:Called to read a new transport packet。install_dir (Directory*):install Directory, Directory是一个节目单比方卫视,星空卫视,卫视,CCTV。install_prog (Program*):install program(如卫视) to Directory。install_netpid:表示网络信号的来源,当这个更新时,需要重新安装目录。install_prog_on_current_list安装节目到当前列表。install_prog_on_new_list安装节目到新的列表。3.1.2 事件管理类typedef void (*Callback)(EventType, void*, void*):回调函数模板。void Register (EventType t, Callback f, void* d):注册事件。void Trigger (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。所有从缓冲区读出数据的方式bitbytenbits基函数都是这个。函数read_byte从缓冲区读取一个字节。read_pattern表示读取指定字符串。read_reserved_bits读取填充数据。read_uimsbf(int nbits, char* message)读取n位转化为无符号整形,高位在前。read_tcimsbf(int nbits, 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表示total length of the adaptation field。3.1.7 解析PES包对PES包进展解析。解析出头部数据,解析后的数据分别存贮在stream68和stream692个文件中。函数get_length 表示包总长度。get_header_data_length表示PES头长度,不包括填充字段。get_header_length 表示PES头长度,包括填充字段。config_basic 表示PES参数设置。3.1.8 PCR时钟类系统时钟的相关的类,对系统时钟进展比较。其中对27MHZ的时钟算术和逻辑运算符进展了重载。注:PCR的校正一直是学术界研究的热点。3.1.9 CRC校验类每位进展异或运算后存储在一个4BYTE的数组中。函数poly_cmp 作CRC验证。函数push_bit 作CRC的生成。解码流程图3.1.10 TS包解析流程图3.1.11 Section解码流程图3.1.12 PES解码流程图4 TS流合成编码各编码类的UML图4.1.1 编码主类函数install_dir首先安装PAT函数send_packet表示按PID发送TS包函数send_scheduled_packet表示按一定的规律轮流发送TS包。函数recalc_mu*表示节目复用4.1.2 合成各类之间的关系函数get_nready获取已经填充的字节长度.函数fill_buffer 填充buffer.函数send_payload发送负载.函数send_section发送section packet.编码主要流程4.1.3 TS编码流程图4.1.4 负载pes、section打包过程附表一:l PES分组字段packet_start_code_prefi*(24)开场码字为0*00 00 01stream_id(8)原始流的类型和数目,取值从1011 1100到1111 1111之间。各值含义具体见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-1 1-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_e*tention_flag(1)1表示扩展字段在PES存在,0表示扩展字段不存在PES_header_data_length(8)表示可选字段和填充字段所占的字节数。00100010填充字段,表示只含有PTS,不含有DTS当含有DTS时,这个填充字段为0011PTS字段。PTS3230(3)marker_bit(1)PTS2915(15)marker_bit(1)PTS140(15)marker_bit(1)00010001填充字段,表示接下来为DTS。DTS数据解码时间DTS3230(3)marker_bit(1)DTS2915(15)marker_bit(1)DTS140(15)marker_bit(1)reserved(2)填充字段根本系统参考时间,和扩展系统参考时间。ESCR_base3230(3)marker_bit(1)ESCR_base2915(15)marker_bit(1)ESCR_base140(15)marker_bit(1)ESCR_e*tention(9)marker_bit(1)marker_bit(1)表示系统解码器从PES分组中接收字节的速度。以50B/s为单位,有传送的作用。ES_rate(22)marker_bit(1)trick_mode_control(3)特技模式,比方快进,快退。具体见13818-1field_id(2)表示在特技模式中,哪些场将被显示。00表示仅显示顶场,01表示仅显示底场,10表示显示全帧。11保存。1表示编码间隙中可能丧失宏块,0表示不会丧失宏块。丧失宏块用前面已解码的图像宏块代替。编码的受限系数集,表示DCT后系统的非零限制,具体见13818-1intra_slice_refresh(1)frequency_trunction(2)field_rep_trl(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/IEC 11172的组首部。0表示PES首部没有含有组首部。program_packet_sequence_counter_flag(1)1表示PES分组含program packet sequence counter和字段,0表示不含有。P-STD_buffer_flag(1)reserved(3)填充PES_e*tention_flag_2(1)1表示出现PES_e*tention_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/IEC 11172-1系统信息,0代表带有PS流信息。original_stuff_length(6)01P-STD_buffer_scale(1)联合使用控制BSn缓冲区的大小,具体定义见13818-1。仅用于PS流中。P-STD_buffer_size(13)marker_bit(1)PES_e*tention_field_length(7)规定此字段之后的扩展(填充)字段长度单位字节reserved(8)保存位8位stuffing_byte(8)填充字段。1111 1111PES_packet_data_byte(8)PES包原始流数据长度,等于PES_packet _length减去从PES_packet_length到此字段之前的长度。padding_byte(8)填充字段。1111 1111附表二:l 传送流构造sync_byte (8)01000111transport_error_indicator(1)传送层外被置1,表示至少一个不可纠正的错误位,改正前不被置0payload_unit_start_indicator(1)该字段置1表示携带的是PSI或PES第一个包。该字段置0表示携带的不是PSI或PES第一个包。transport_priority(1)置1表示比其他同PID组有更高优先级PID(13)0*0000-0*000F保存,0*1FFF空分组transport_scrambling_control(2)00表示未加密,其他"自定义,空分组为00adaption_field_control(2)00保存,01无调整字段,10无负载,11调整字段后为有效负载continuity_counter(4)依据前一成员,只在10和11时生效。计数同PID的分组数data_bytePES分组、PSI局部,以及其他构造中私有数据的连续字节;假设为空分组,可以为任意值。即有效负载的数据。l 传送流调整字段adaptation_field_length(8)调整字段长度。不包括他自身的1byte,即他之后的长度discontinuity_indicator(1)连续指示符。Random_access_indicator(1)随机存储指示符,为1时,表示TS为一个PES分组原始流的开场。当PID和PSI中的PCR_PID该PID是时针PID相等,且Random_access_indicator为1时,调整字段中必须含有PCR。elementary_stream_priority_indicator(1)根本码流优先级指示符。当码流中含有有效负载时才有效,1表示比其他传送流优先级高。0表示优先级等同。PCR_flag(1)PCR标记,1表示包含PCR字段,0表示不包含。OPCR_flag(1)原始OPCR标记,1表示包含OPCR字段,0表示不包含。splicing_point_flag(1)节点标记,为1时表示splice_countdown出现在调整字段中,否则不出现。transport_private_data_flag(1)表示调整字段中是否含有私有字段,0表示没有,1表示有。adaptation_field_e*tention_flag(1)为1时,表示存在调整字段扩展,为0是,表示不存在调整字段扩展。program_clock_reference_base(33)PCR时间参考基准reserved(6)6位保存字段program_clock_reference_e*tention(9)PCR扩展original_program_clock_reference_base(33)原始PCR时间参考基准reserved(6)保存6位original_program_clock_reference_e*tention(33)原始PCR时间扩展splice_countdown(8)可正、可负。正值表示此PES分组还剩下多少TS分组数目,0表示此分组已经是此PES分组的最后一个字节。为负数的时候表示,TS是拼接点之后的第N个分组。transport_private_data_length(8)表示其后面私有数据长度字节为单位,私有数据不能延伸到调整字段之外。private_data_byte私有数据,以字节为单位adaptation_field_e*tention_length(8)表示其后面扩展字段数据长度字节为单位ltw_flag(1)合法时间窗口标记,为1时,表示ltw_offset字段存在。piecewise_rate_flag(1)为1时,表示piecewise_rate字段存在seamless_splice_flag(1)为1时,缓存控制。为0表示此字段无意义。reserved(5)保存位5位ltw_valid_flag(1)为1时,表示ltw_offset字段有效,为0时表示此字段无意义。ltw_offset(15)控制是否下溢。reserved(2)保存位piecewise_rate(22)正整数,传输分组的比特率,具有延续作用。splice_type(4)规定具有此分组的一样PID的传送比特率。DTS_ne*t_au3230(3)marker_bit(1)DTS_ne*t_au2915(3)33位表示系统时钟DTSmarker_bit(1)DTS_ne*t_au140(3)marker_bit(1)reserved填充字段,以字节为单位。stuffing_byte(8)11111111填充字节。