音视频入门基础: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中:

cpp 复制代码
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:

cpp 复制代码
    val = get8(pp, p_end);
    if (val < 0)
        return val;
    h->tid = val;

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

cpp 复制代码
    *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:

cpp 复制代码
    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:

cpp 复制代码
    val = get8(pp, p_end);
    if (val < 0)
        return val;
    h->sec_num = val;

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

cpp 复制代码
    val = get8(pp, p_end);
    if (val < 0)
        return val;
    h->last_sec_num = val;
相关推荐
群联云防护小杜2 小时前
云服务器主动防御策略与自动化防护(下)
运维·服务器·分布式·安全·自动化·音视频
带娃的IT创业者8 小时前
《AI大模型应知应会100篇》第39篇:多模态大模型应用:文本、图像和音频的协同处理
人工智能·microsoft·音视频
ImAlex9 小时前
【ffmpeg应用】使用ffmpeg免费下载m3u8网络视频并转化为mp4格式
ffmpeg
18538162800余--10 小时前
短视频矩阵系统可视化剪辑功能开发,支持OEM
线性代数·矩阵·音视频
浮桥10 小时前
uniapp -- 实现微信小程序、app、H5端视频上传
微信小程序·uni-app·音视频
EasyDSS12 小时前
EasyCVR视频汇聚平台助力大型生产监控项目摄像机选型与应用
网络·人工智能·音视频
科技小E14 小时前
EasyRTC嵌入式音视频通信SDK智能安防与监控系统的全方位升级解决方案
大数据·网络·人工智能·音视频
张风捷特烈14 小时前
FFmpeg 7.1.1 | 调试 ffmpeg.c 环境 - Widows&Clion&WSL
android·ffmpeg
18538162800余--15 小时前
短视频矩阵系统贴牌批量剪辑功能开发,支持OEM
线性代数·矩阵·音视频
脚本语言_菜鸟18 小时前
音频转base64
android·javascript·音视频