当前位置: 首页 > news >正文

网站版权信息修改优化流程

网站版权信息修改,优化流程,计算机应用技术网站开发基础知识,网站建设中怎么回事一、引言 从《音视频入门基础#xff1a;MPEG2-TS专题#xff08;9#xff09;——FFmpeg源码中#xff0c;解码TS Header的实现》可以知道#xff1a;FFmpeg源码中使用handle_packet函数来处理一个transport packet#xff08;TS包#xff09;#xff0c;该函数的前半…一、引言 从《音视频入门基础MPEG2-TS专题9——FFmpeg源码中解码TS Header的实现》可以知道FFmpeg源码中使用handle_packet函数来处理一个transport packetTS包该函数的前半部分实现解析一个transport packet的TS Header。而在解析完TS Header后handle_packet函数内部会调用write_section_data函数来把各个transport packet组合成一个Section并在得到一个完整的Section后调用对应的解析PSI/SI表的方法 /* handle one TS packet */ static int handle_packet(MpegTSContext *ts, const uint8_t *packet, int64_t pos) { //.../* if past the end of packet, ignore */p_end packet TS_PACKET_SIZE;if (p p_end || !has_payload)return 0;if (pos 0) {av_assert0(pos TS_PACKET_SIZE);ts-pos47_full pos - TS_PACKET_SIZE;}if (tss-type MPEGTS_SECTION) {if (is_start) {/* pointer field present */len *p;if (len p_end - p)return 0;if (len cc_ok) {/* write remaining section bytes */write_section_data(ts, tss,p, len, 0);/* check whether filter has been closed */if (!ts-pids[pid])return 0;}p len;if (p p_end) {write_section_data(ts, tss,p, p_end - p, 1);}} else {if (cc_ok) {write_section_data(ts, tss,p, p_end - p, 0);}}// stop find_stream_info from waiting for more streams// when all programs have received a PMTif (ts-stream-ctx_flags AVFMTCTX_NOHEADER ts-scan_all_pmts 0) {int i;for (i 0; i ts-nb_prg; i) {if (!ts-prg[i].pmt_found)break;}if (i ts-nb_prg ts-nb_prg 0) {av_log(ts-stream, AV_LOG_DEBUG, All programs have pmt, headers found\n);ts-stream-ctx_flags ~AVFMTCTX_NOHEADER;}}} //... } 上述代码中首先让指针p_end指向该transport packet的末尾 /* if past the end of packet, ignore */p_end packet TS_PACKET_SIZE; 如果已经读取到了该transport packet的末尾p p_end或者载荷不存在!has_payloadhandle_packet函数直接返回不继续进行处理 if (p p_end || !has_payload)return 0; 如果该transport packet不是PES分组是Section数据tss-type MPEGTS_SECTION并且TS Header中的payload_unit_start_indicator属性的值为1is_start为真表示该transport packet是一个Section的首包这时TS Header后面还会有一个长度为1字节的pointer_field属性通过语句len *p读取该pointer_field属性让指针p指向该transport packet的有效数据。根据有没有pointer_field属性和pointer_field的值是多少调用write_section_data函数并传入不同参数 if (tss-type MPEGTS_SECTION) {if (is_start) {/* pointer field present */len *p;if (len p_end - p)return 0;if (len cc_ok) {/* write remaining section bytes */write_section_data(ts, tss,p, len, 0);/* check whether filter has been closed */if (!ts-pids[pid])return 0;}p len;if (p p_end) {write_section_data(ts, tss,p, p_end - p, 1);}}//... } 二、write_section_data函数 一write_section_data函数的定义 ​​​​write_section_data函数定义在FFmpeg源码本文演示用的FFmpeg源码版本为7.0.1的源文件libavformat/mpegts.c中 /*** Assemble PES packets out of TS packets, and then call the section_cb* function when they are complete.*/ static void write_section_data(MpegTSContext *ts, MpegTSFilter *tss1,const uint8_t *buf, int buf_size, int is_start) {MpegTSSectionFilter *tss tss1-u.section_filter;uint8_t *cur_section_buf NULL;int len, offset;if (is_start) {memcpy(tss-section_buf, buf, buf_size);tss-section_index buf_size;tss-section_h_size -1;tss-end_of_section_reached 0;} else {if (tss-end_of_section_reached)return;len MAX_SECTION_SIZE - tss-section_index;if (buf_size len)len buf_size;memcpy(tss-section_buf tss-section_index, buf, len);tss-section_index len;}offset 0;cur_section_buf tss-section_buf;while (cur_section_buf - tss-section_buf MAX_SECTION_SIZE cur_section_buf[0] ! 0xff) {/* compute section length if possible */if (tss-section_h_size -1 tss-section_index - offset 3) {len (AV_RB16(cur_section_buf 1) 0xfff) 3;if (len MAX_SECTION_SIZE)return;tss-section_h_size len;}if (tss-section_h_size ! -1 tss-section_index offset tss-section_h_size) {int crc_valid 1;tss-end_of_section_reached 1;if (tss-check_crc) {crc_valid !av_crc(av_crc_get_table(AV_CRC_32_IEEE), -1, cur_section_buf, tss-section_h_size);if (tss-section_h_size 4)tss-crc AV_RB32(cur_section_buf tss-section_h_size - 4);if (crc_valid) {ts-crc_validity[ tss1-pid ] 100;}else if (ts-crc_validity[ tss1-pid ] -10) {ts-crc_validity[ tss1-pid ]--;}elsecrc_valid 2;}if (crc_valid) {tss-section_cb(tss1, cur_section_buf, tss-section_h_size);if (crc_valid ! 1)tss-last_ver -1;}cur_section_buf tss-section_h_size;offset tss-section_h_size;tss-section_h_size -1;} else {tss-section_h_size -1;tss-end_of_section_reached 0;break;}} } 该函数的作用是把各个transport packet组合成一个Section并在得到一个完整的Section后调用对应的解析PSI/SI表的方法。 形参ts既是输入型参数也是输出型参数指向一个MpegTSContext类型变量。 形参tss1既是输入型参数也是输出型参数指向一个MpegTSFilter类型变量。 形参buf指针输入型参数指向某个transport packet去掉TS Header和pointer_field后的有效数据。 形参buf_size输入型参数该transport packet有效数据的长度单位为字节。 形参is_start输入型参数该transport packet是否为一个Section的首包。值为1表示是值为0表示否。 返回值无 二write_section_data函数的内部实现 write_section_data函数中首先判断该transport packet是否为一个Section的首包。如果是通过语句memcpy(tss-section_buf, buf, buf_size将该transport packet去掉TS Header和pointer_field后的有效数据拷贝到tss-section_buf中。tss-section_buf存放一个Section的数据一个Section可能包含一个或多个transport packet。tss-section_index为该Section的累计长度通过语句tss-section_index buf_size让该Section的累计长度等于该transport packet有效数据的长度 if (is_start) {memcpy(tss-section_buf, buf, buf_size);tss-section_index buf_size;tss-section_h_size -1;tss-end_of_section_reached 0;} 如果该transport packet不是一个Section的首包并且还未到达该Section的末尾通过语句memcpy(tss-section_buf tss-section_index, buf, len)将该transport packet的有效数据拼接到tss-section_buf的末尾。通过语句tss-section_index len让该Section的累计长度增加 if (is_start) {//...} else {if (tss-end_of_section_reached)return;len MAX_SECTION_SIZE - tss-section_index;if (buf_size len)len buf_size;memcpy(tss-section_buf tss-section_index, buf, len);tss-section_index len;} 读取该Section的Section Header中的section_length属性section_length属性的值加3就是整个Section的长度将整个Section的长度赋值给变量len和tss-section_h_size /* compute section length if possible */if (tss-section_h_size -1 tss-section_index - offset 3) {len (AV_RB16(cur_section_buf 1) 0xfff) 3;if (len MAX_SECTION_SIZE)return;tss-section_h_size len;}如果已经读取到该Section的末尾并且需要检查CRC校验tss-check_crc为真通过语句crc_valid !av_crc(av_crc_get_table(AV_CRC_32_IEEE), -1, cur_section_buf, tss-section_h_size)判断该Section的CRC校验是否正确关于av_crc函数用法可以参考《FFmpeg源码中计算CRC校验的实现》。通过语句tss-crc AV_RB32(cur_section_buf tss-section_h_size - 4)获取到该Section的CRC校验 if (tss-section_h_size ! -1 tss-section_index offset tss-section_h_size) {int crc_valid 1;tss-end_of_section_reached 1;if (tss-check_crc) {crc_valid !av_crc(av_crc_get_table(AV_CRC_32_IEEE), -1, cur_section_buf, tss-section_h_size);if (tss-section_h_size 4)tss-crc AV_RB32(cur_section_buf tss-section_h_size - 4);if (crc_valid) {ts-crc_validity[ tss1-pid ] 100;}else if (ts-crc_validity[ tss1-pid ] -10) {ts-crc_validity[ tss1-pid ]--;}elsecrc_valid 2;} 如果CRC校验正确根据Section类型调用对应的解析PSI/SI表的方法。tss-section_cb是函数指针指向不同PSI/SI表的解析函数比如SDT表对应的解析函数是sdt_cbPAT表对应的解析函数是pat_cbPMT表对应的解析函数是pmt_cb if (crc_valid) {tss-section_cb(tss1, cur_section_buf, tss-section_h_size);if (crc_valid ! 1)tss-last_ver -1;}三、总结 通过上面的代码分析可以看出来TS流中使用Section分段传输的意义在于只要接收到一个Section的完整数据就可以进行解析而不需要接收到完整的PSI/SI表表时才开始解析工作。
http://www.hkea.cn/news/14589642/

相关文章:

  • 58同城网站模板软考哪个培训机构通过率高
  • 软件下载网站源码网店怎么开要多少钱
  • 招聘网站开发计划书菜鸟是什么网站
  • 如何查看网站cms系统游戏发卡中心网站源码
  • 游戏分类网站怎么做在线教学网站开发
  • 怎么制作网站导航页泉州响应式网站建设
  • 怎么在微信公众号建设微网站婚纱摄影网站模板
  • 小公司做网站的好处网页制作工具有哪些
  • 网站维护的工作内容步骤wordpress4.0 伪静态
  • 深圳福田华丰大厦网站建设山东省菏泽市城乡建设局网站
  • 行业门户网站案例分析西安wordpress开发
  • 大前端网站过年做啥网站能致富
  • 成都专业网站设计好公司梧州网站设计推荐
  • 电子商务网站的开发流程包括周浦做网站公司
  • 顶呱呱网站做的怎么样重庆找做墩子网站
  • 网站开发组织架构图西宁的网站设计
  • 已注册的网站如何注销设计专业知名企业网站
  • 如何用百度云文件做网站建设银行人力资源系统网站
  • 推荐商城网站建设网站建设步骤 文档
  • 创意网站交互wordpress插件写在模板里
  • 让别人做网站应注意什么海南三亚注册公司需要什么条件
  • 织梦手机网站教程视频网站备案人授权书
  • 深圳网站平台建设现在有什么网络游戏好玩
  • 宁波网站建设外包如何做企业网站后台管理
  • 学校网站建设框架最好的网站设计公
  • 网站外部链接网站建设大致价格2017
  • 一下成都网站建设公司杭州房产信息网官网
  • 哪里有网站建设北京vi设计方案
  • 哪些网站可以做问卷调查陕西网站建设优化技术
  • 网页设计企业宣传网站竞价推广遇到恶意点击怎么办