当前位置: 首页 > 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.mrgr.cn/news/79494.html

相关文章:

  • TCP 的三次握手与四次挥手
  • Spring Boot 进阶指南:深入核心与实战技巧
  • 前端编辑器JSON HTML等,vue2-ace-editor,vue3-ace-editor
  • 华为HarmonyOS NEXT 原生应用开发: 数据持久化存储(用户首选项)的使用 token令牌存储鉴权!
  • 解决Vue项目中npm install卡住问题的详细指南
  • 软考高级 架构师 第五章 计算机网络
  • 【git reset】本地下载特定历史提交哈希值的github文件【未联网服务器】进行git reset操作
  • 编码器:提取语义特征,上下文信息;解码器:生成目标语言;每个单词的词经过编码器后的编码就包括上下文信息
  • MODBUS POll使用简介
  • 使用docker安装jenkins
  • 12.08Java
  • 【时时三省】(NIT计算机考试)Word的使用方法
  • 巴特沃斯滤波器由模拟滤波器设计数字滤波器的双线性变换
  • 【论文阅读】体系结构模拟器在处理器设计过程中的作用
  • 扫二维码进小程序的指定页面
  • CODA 离线安装及虚幻镜迁移
  • uniapp扭蛋机组件
  • 关于GaussDB
  • 软件工程知识点
  • maven多模块开发
  • 电子商务人工智能指南 3/6 - 聊天机器人和客户服务
  • 快充诱骗协议芯片XSP08Q应用案例
  • pika:适用于大数据量持久化的类redis组件|简介及安装(一)
  • Qt之第三方库‌QXlsx使用(三)
  • shell脚本实战案例
  • UE_C++ —— 数据类型