libdvbpsi

libdvbpsi源码分析(前言)

元气小坏坏 提交于 2020-04-17 03:32:09
【推荐阅读】微服务还能火多久?>>> libdvbpsi 是vlc中的一个解码库。它能解码或解析出所有的节目专用信息(PSI)以及MPEG2 TS流或DVB流 中的描述符(descriptor)。 目前能解析的PSI/SI表包括( BAT,CAT,EIT,NIT,PAT,PMT,SDT,SIS,TOT,TDT). BAT:Bouquet Association Table 业务关联表 CAT:Conditional Access Table 条件接入表 EIT: Event Information Table 事件信息表(EPG) NIT: Network Information Table 网络信息表 PAT: Program Association Table 节目关联表 PMT: Program Map Table 节目映射表 SDT: Service Description Table 业务描述表 l ibdvbpsi主页 : http://www.videolan.org/developers/libdvbpsi.html 其中涉及到的DVB规范如下: 系统: ISO/IEC 13818-1 视频编码: ISO/IEC 13818-2 音频编码。 ISO/IEC 13818-3 DVB官网: http://www.dvb.org/ 此处笔者使用的是 version 1.1

libdvbpsi源码分析(一)架构分析

£可爱£侵袭症+ 提交于 2020-04-17 02:48:53
【推荐阅读】微服务还能火多久?>>> 源码层次目录如下所示: 其中: psi.c: psi section structure dvbpsi.c: 抽象成DVB/PSI decoders,封装出接口,供应用层调用。 descriptor.c: 各种描述符数据的抽象 demux.c: 解复用器 descriptor/: 各种描述符的解析 tables/: 各种psi子表解析的具体实现 每个解码器被划分成两个实体:即the PSI decoder和the specific decoder。之所以如此划分的原因是,每个psi表的section都有相同的格式。解码器结构如图1所示: 图1:解码器结构 PSI解码器 :主要任务就是获取应用层提供的ts流数据包( STB则是根据底层的解码器芯片获取ts流 ),并将完整的psi section(段)发送给专用的解码器解析。对于不连续的ts流,PSI解码器也必须稳定可靠的工作,并将ts流交给专用的解码器处理。 专用解码器 (specific decoder):主要任务就是根据psi解码器提供的psi sections,重建完整的表(PSI/SI)并将 他们返回给应用层处理( S TB通常是存入相应的databas e ),同时还要根据psi decoder的指示去检查ts的完整性(作CRC校验)。如果不完整,则返回错误。 PSI

libdvbpsi源码分析(四)PAT表解析/重建

孤街浪徒 提交于 2020-04-17 02:47:25
【推荐阅读】微服务还能火多久?>>> 由上一章 libdvbpsi源码分析(三)PSI decocder详细分析 ,我们知道了psi decoder的构建过程。本章将延续上文 以PAT表详细解析为例,由点及面的概述libdvbpsi的实现。 下面详细分析pat decoder解码器的创建过程: a、首先通过dvbpsi_new创建一个通用的decoder,但还未真正的实例化为pat decoder,即pat decoder还未初始化。 dvbpsi_t *dvbpsi_new(dvbpsi_message_cb callback, enum dvbpsi_msg_level level) { dvbpsi_t *p_dvbpsi = calloc(1, sizeof(dvbpsi_t)); if (p_dvbpsi == NULL) return NULL; p_dvbpsi->p_decoder = NULL; //赋值为NULL,pat decoder还未初始化 p_dvbpsi->pf_message = callback; p_dvbpsi->i_msg_level = level; return p_dvbpsi; } b、初始化PAT decoder 并且绑定pat表的解析handle动作。其中dvbpsi_pat_attach中dvbpsi_decoder

libdvbpsi源码分析(二)main函数

拥有回忆 提交于 2020-04-17 02:20:50
【推荐阅读】微服务还能火多久?>>> 从demon的dvbinfo.c中的main函数入口分析: 为了分析方便,此处将宏HAVE_SYS_SOCKET_H隔离的socket代码去掉,只关注libdvbpsi本身的实现。 1.数据结构的设计: 1.1、捕获器capture的数据结构设计如下: typedef struct dvbinfo_capture_s { fifo_t *fifo; fifo_t *empty; pthread_mutex_t lock; pthread_cond_t fifo_full; bool b_fifo_full; size_t size; /* prefered capture size */ params_t *params; bool b_alive; } dvbinfo_capture_t; 由数据结构可知,由于demo是本地的autotest,所以用有名管道fifo作测试。从命令行终端读入ts流文件,一个 线程不断将buffer中的数据push进入fifo,同时主线程不断从fifo pop出数据并解析,直到从fifo中读出的数据为0 1.2、dvbinfo_capture_t中的params_t 结构体 typedef struct params_s { /* parameters */ char *output; char *input;