ffmpeg 怎样分析ts 流中的 sdt 表

---------------------------------------------------------
author:hjjdebug
date: 2024年 07月 24日 星期三 10:34:08 CST
descriptor: ffmpeg 怎样分析ts 流中的 sdt 表
---------------------------------------------------------
1. sdt 的概念
   sdt 就是服务描述表,就是这个表包含一个或多个服务.
   一个服务对应一个节目,所以服务就是节目的服务.
   上面听起来就是挺虎人的,
   那服务是什么呢? 
   服务就是每个频道对应的频道名称和频道供应商等信息.
   可以简单理解为就是2个字符串!!


2. ffmpeg 怎样保存sdt 表中的字符串
   由于字符串的长度并不固定,所以需要动态分配内存来保存.

    switch (desc_tag) {
    case 0x48: //0x48描述符
        service_type = get8(&p, p_end);
        if (service_type < 0) // 服务类型,0x1为数字电视业务
            break;
// getstr8 会返回动态分配的内存, 该内存的容量往往比字符串长度要大.
// 另getstr8 还会调用icon_open()函数, 该函数有动态内存分配,需调用icon_close()释放动态内存
// 这是我向下跟踪得到的.这里就不展开了.
        provider_name = getstr8(&p, p_end); 
        if (!provider_name)
            break;
        name = getstr8(&p, p_end); // 此处也是动态指针
        if (name) {
//ts->stream 是avformatContext, 先找有没有sid这个节目, 有的话直接返回program
//没有再分配节目, 有动态内存分配,要等释放AVFormatContext 时才会释放program
            AVProgram *program = av_new_program(ts->stream, sid); 
            if (program) {
            //sdt 信息保存在节目的metadata 中, program->metadata是一个字典dictionary
            //添加字典项会有内存再分配
            //而字典项key和value根据flags 可能会被复制,就是说可能有内存分配,
            //只所以要进行字符串复制是因为这里用strdup,会根据字符长度重新分配一次内存,呈紧凑字符串形式
            //它们的内存释放要等到program 被释放的时候
            //关于字典的操作还有很多细节,例如key-value已经有值了怎么办等, 可由flags控制.
                av_dict_set(&program->metadata, "service_name", name, 0);
                av_dict_set(&program->metadata, "service_provider", provider_name, 0);
            }
        }
        av_free(name);  // 释放动态内存, 保持内存平衡,因为这里的字符串存储空间往往比字符串长度大.
        av_free(provider_name);
        break;
    default:
        break;
    }

3. 这些为字符串分配的内存何时释放
   参考第2步的代码注释!
   简单说,临时用的就立即释放了,对象用的要等到对象释放时才释放,
   对象的属性也可能是不断变化的.但对sdt来讲,虽然有很多sdt表,但内容是不变的.

小结: 本博着重从内存分配的角度来描述一下sdt表的存储,是我查内存泄漏的一个小收获!
 

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值