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

音视频入门基础:MPEG2-TS专题(13)——FFmpeg源码中,解析Section Header的实现

一、引言

在《音视频入门基础:MPEG2-TS专题(11)—— TS中的Section》中讲述了Section Header的基本概念,本文讲述FFmpeg源码中是怎样解析Section Header的。

二、parse_section_header函数的定义

FFmpeg源码中通过parse_section_header函数解析Section Header,该函数定义FFmpeg源码(本文演示用的FFmpeg源码版本为7.0.1)的源文件libavformat/mpegts.c中:

static int parse_section_header(SectionHeader *h,const uint8_t **pp, const uint8_t *p_end)
{int val;val = get8(pp, p_end);if (val < 0)return val;h->tid = val;*pp += 2;val  = get16(pp, p_end);if (val < 0)return val;h->id = val;val = get8(pp, p_end);if (val < 0)return val;h->version = (val >> 1) & 0x1f;h->current_next = val & 0x01;val = get8(pp, p_end);if (val < 0)return val;h->sec_num = val;val = get8(pp, p_end);if (val < 0)return val;h->last_sec_num = val;return 0;
}

形参h:输出型参数,指向一个SectionHeader类型变量。执行parse_section_header函数后,形参h会得到从Section Header中解析出来的属性。

形参pp:输入型参数,执行parse_section_header函数前,*pp指向一个Section的SectionHeader开头;执行parse_section_header函数后,*pp指向该Section的SectionHeader之后的数据。

形参p_end:输入型参数,指向该Section的CRC校验。

返回值:返回0表示解析成功,返回一个负数表示解析失败。

三、parse_section_header函数的内部实现分析

parse_section_header函数中,首先解析出SectionHeader中的table_id属性,赋值给h->tid:

    val = get8(pp, p_end);if (val < 0)return val;h->tid = val;

解析出transport_stream_id/program_number属性,赋值给h->id:

    *pp += 2;val  = get16(pp, p_end);if (val < 0)return val;h->id = val;

解析出version_number属性,赋值给h->version。解析出current_next_indicator属性,赋值给h->current_next:

    val = get8(pp, p_end);if (val < 0)return val;h->version = (val >> 1) & 0x1f;h->current_next = val & 0x01;

解析出section_number属性,赋值给h->sec_num:

    val = get8(pp, p_end);if (val < 0)return val;h->sec_num = val;

解析出last_section_number属性,赋值给h->last_sec_num:

    val = get8(pp, p_end);if (val < 0)return val;h->last_sec_num = val;

http://www.lryc.cn/news/502570.html

相关文章:

  • 根据PDF模板单个PDF导出到浏览器和多个PDF打包ZIP导出到浏览器
  • 如何创建一个基本的Spring Boot应用程序
  • 1.2 计算机网络的分类和应用(重要知识点)
  • @JsonSerialize失效解决
  • Docker部署WebRTC-Streamer
  • 2025年的大模型计划重点在于跨领域智能、工作流自动化、多模态能力强化
  • day12 接口测试 ——入门→精通→实战(1)
  • 伏羲0.07(文生图)
  • scala的泛型特质的应用场景
  • Win10环境vscode+latex+中文快速配置
  • 【vue2】el-select,虚拟滚动(vue-virtual-scroller)
  • 【ETCD】[源码阅读]深度解析 EtcdServer 的 processInternalRaftRequestOnce 方法
  • 【RabbitMQ】RabbitMQ中核心概念交换机(Exchange)、队列(Queue)和路由键(Routing Key)等详细介绍
  • 【AI知识】过拟合、欠拟合和正则化
  • 计算机毕设-基于springboot的航空散货调度系统的设计与实现(附源码+lw+ppt+开题报告)
  • 视图、转发与重定向、静态资源处理
  • 优选算法——分治(快排)
  • 【Linux系统】文件系统
  • javaweb的基础
  • 家里养几条金鱼比较好?
  • 写作词汇积累:差池、一体两面、切实可行极简理解
  • 移远EC200A-CN的OPENCPU使用GO开发嵌入式程序TBOX
  • LEED绿色建筑认证最新消息
  • SpringBoot中集成常见邮箱中容易出现的问题
  • webstorm开发uniapp(从安装到项目运行)
  • C# 探险之旅:第七节 - 条件判断(三元判断符):? : 的奇妙冒险
  • FlinkCDC实战:将 MySQL 数据同步至 ES
  • debug小记
  • Qt C++ 显示多级结构体,包括结构体名、变量名和值
  • 【JAVA】旅游行业中大数据的使用