Vlc基础数据结构记录

1.  Vlc基础数据结构

[email protected]

1.1  基础数据结构 struct vlc_object_t,相关文件为src\misc\objects.c。

定义为:

struct vlc_object_t

{

VLC_COMMON_MEMBERS

};

其中的VLC_COMMON_MEMBERS为micro,扩展而下:

struct vlc_object_t

{

const char *psz_object_type;

char *psz_header;

int  i_flags;

volatile bool b_die;

bool b_force;

libvlc_int_t *p_libvlc;

vlc_object_t *  p_parent;

};

1.2 VLC_OBJECT宏把包含vlc_object_t且为第一个字段的数据类型cast成vlc_object_t类型

# define VLC_OBJECT( x ) ((vlc_object_t *)(x))

结构vlc_object_internals_t ,在vlc里malloc一个新的object时,vlc_object_internals_t分配在vlc_object_t的前面,vlc_object_internals_t里面的互斥信号量保护object的访问,特别是里面variable的访问, 宏vlc_internals从object指针cast到vlc_object_internals_t指针, 具体的分配函数为object.c: vlc_custom_create()。相关文件为src\libvlc.h

struct vlc_object_internals

{

int             i_object_type;

char           *psz_name;

void           *var_root;

vlc_mutex_t     var_lock;

vlc_cond_t      var_wait;

vlc_thread_t    thread_id;

bool            b_thread;

int             pipes[2];

vlc_spinlock_t   ref_spin;

unsigned         i_refcount;

vlc_destructor_t pf_destructor;

vlc_object_internals_t *next;

vlc_object_internals_t *prev;

vlc_object_internals_t *first;

#ifndef NDEBUG

vlc_object_t   *old_parent;

#endif

};

1.3   object的释放函数typedef void (*vlc_destructor_t)(struct vlc_object_t *);

其他模块分配了一个object后,可能也分配有资源,就可以自己定义一个destructor函数,并赋值给vlc_object_t,在释放object时会调用这个函数来释放自己分配的资源。

1.4   struct variable_ops_t和struct variable_t结构,vlc的很多参数都是用variable_t结构来表示并动态创建加入某个object的列表。这个列表的root为vlc_object_internals_t.var_root.

每个variable都有name,还有一个回调列表,当改变了这个变量的值时触发这个回调,当然外界也可以调用var_TriggerCallback来触发回调。Vlc里的很多事件就是基于这个原理,如video的长度,time,position等。相关文件为src\misc\variables.c。

typedef struct variable_ops_t

{

int  (*pf_cmp) ( vlc_value_t, vlc_value_t );

void (*pf_dup) ( vlc_value_t * );

void (*pf_free) ( vlc_value_t * );

} variable_ops_t;

struct variable_t

{

char *       psz_name;

vlc_value_t  val;

char *       psz_text;

const variable_ops_t *ops;

int          i_type;

unsigned     i_usage;

vlc_value_t  min, max, step;

int          i_default;

vlc_list_t   choices;

vlc_list_t   choices_text;

bool   b_incallback;

int                i_entries;

callback_entry_t * p_entries;

};

1.5   struct vlc_value_t结构,这是一个union,包含了各种通用的数据类型,一般在struct variable_t里用的很多,定义如下:

typedef union

{

int             i_int;

bool            b_bool;

float           f_float;

char *          psz_string;

void *          p_address;

vlc_object_t *  p_object;

vlc_list_t *    p_list;

mtime_t         i_time;

struct { int32_t x; int32_t y; } coords;

uint8_t padding[8];

} vlc_value_t;

1.6   struct block_t和 struct block_sys_t,vlc里在vout之前的数据都是以block来保存的。从定义里可以看到vlc内部实际是以block_sys_t来分配的,原因是为了适应各种cpu,vlc为block分配的内存有各种align和pading。struct block_fifo_t为保存block的一个先进先出fifo,提供了多个线程访问struct block_fifo_t之间的同步。相关文件为src\misc\block.c。

struct block_t

{

block_t     *p_next;

uint32_t    i_flags;

mtime_t     i_pts;

mtime_t     i_dts;

mtime_t     i_length;

int64_t              i64_original_pts;

int64_t              i64_original_dts;

unsigned    i_nb_samples;

int         i_rate;

size_t      i_buffer;

uint8_t     *p_buffer;

block_free_t pf_release;

};

struct block_sys_t

{

block_t     self;

size_t      i_allocated_buffer;

uint8_t     p_allocated_buffer[];

};

struct block_fifo_t

{

vlc_mutex_t         lock;

vlc_cond_t          wait;

vlc_cond_t          wait_room;

block_t             *p_first;

block_t             **pp_last;

size_t              i_depth;

size_t              i_size;

bool          b_force_wake;

};

时间: 2024-08-06 13:25:35

Vlc基础数据结构记录的相关文章

排序与基础数据结构

6大排序与6大基础数据结构 本文从冒泡排序撩起,对选择.插入.希尔.归并.快排6种经典的数组排序进行了深入分析,并详解其间的关联,让你深刻理解其中的关键点:同时对经典的数据结构Vector.Stack.Queue.树.Map.Set做了归纳总结,对其底层的实现做了解析,分享给大家,作为每一个中高级程序员应该懂得的算法与排序,祝大家早上走上自己的"成金之路". 目录: 1.排序算法 2.数据结构 3.资料参考 1.排序算法: a.起源: 计算机从诞生起,就在模拟人这种智能生物的行为,而排

理解 OpenStack & Ceph (4):Ceph 的基础数据结构 [Pool, Image, Snapshot, Clone]

本系列文章会深入研究 Ceph 以及 Ceph 和 OpenStack 的集成: (1)安装和部署 (2)Ceph RBD 接口和工具 (3)Ceph 物理和逻辑结构 (4)Ceph 的基础数据结构 (5)Ceph 与 OpenStack 集成的实现 (6)TBD 1 Pool(池) Pool 的概念前面讲过了,Ceph 支持丰富的对 Pool 的操作,主要的包括: 列表.创建和删除 pool ceph osd pool create {pool-name} {pg-num} [{pgp-num

redis 基础数据结构实现

参考文献 redis数据结构分析 Skip List(跳跃表)原理详解 redis 源码分析之内存布局 Redis 基础数据结构与对象 Redis设计与实现-第7章-压缩列表 在redis中构建了自己的底层数据结构:动态字符,双端链表,字典,压缩列表,整数集合和跳跃表等.通过这些数据结构,redis构造出字符串对象,列表对象,哈希对象,集合对象和有序集合对象这5种我们常用的数据结构.接下来将从底层数据结构开始,一步步介绍redis的数据结构的实现 动态字符串 在redis中并没有使用c语言原生的

ceph(4)--Ceph 的基础数据结构

本系列文章会深入研究 Ceph 以及 Ceph 和 OpenStack 的集成: (1)安装和部署 (2)Ceph RBD 接口和工具 (3)Ceph 物理和逻辑结构 (4)Ceph 的基础数据结构 (5)Ceph 与 OpenStack 集成的实现 (6)QEMU-KVM 和 Ceph RBD 的 缓存机制总结 (7)Ceph 的基本操作和常见故障排除方法 (8)关于Ceph PGs 1 Pool(池) Pool 的概念前面讲过了,Ceph 支持丰富的对 Pool 的操作,主要的包括: 列表.

Objc基础学习记录5

NSMutableString类继承的NSString类. NSMutableString是动态的字符串. 1.appendingString 方式: 向字符串尾部添加一个字符串. 2.appendingFormat:可以添加多个类型的字符串. int,chat float,double等 3.stringWithString 创建字符串, 4.rangeOfString 返回str1在另一个字符串中的位置. 5.NSMakeRange(0,3) 字符串0位到3位. 6.deleteCharac

IP,路由,交换基础培训记录

IP,路由,交换基础培训记录: IP 掩码  子网划分 vlan划分(有助于减少广播压力) vlan之间互通通过交换机打通. 路由,静态路由,动态路由(学习到的),路由表,下一跳,网络位长的优先级高. 交换机,hub集线器. hub是整体冲突模式,交换机是某个口是冲突模式. bps pps含义 常用网络命令: ping arp -a netstat -rn tracert -d IP地址 route add,添加路由,同时记得要添加回程路由

Objc基础学习记录3

在学习Objective-c中, 数组 1.NSArray, 这是一个不可变的数组,不能修改和删除其中的对象,可以存储任意objective的对象指针. 不能存储int,char类型的,,需要转换为需要的类型. 要快速枚举数组中的值,用in. 1 for (NSString *eleement in myArray) 2 NSLog(@"myArray is %@",element); 2.NSMutableArray 这是一个可变的数组,可以向其中添加和删除对象. a.添加addOb

MVC+Ext.net零基础学习记录(五)

继MVC+Ext.net零基础学习记录(四),在后面我在既有的项目上又添加了一个子项目,还用前面提到的方法,进行主项目中引用DLL,然后子项目中生成事件中使用mkdir 进行拷贝 发现一个下午就总是报错 错误 1 命令“mkdir "...\Areas\HPSS\Views" xcopy "...?\Views" "E:\Work\01 TPMSRC\MVCWEBTPM\WEBTPM\Areas\HPSS\Views" /S /E /C /Y 已

LNMP系列网站零基础开发记录(三)

[目录] 扯淡吹逼之开发前奏 Django 开发环境搭建及配置 web 页面开发 Django app开发 Django 站点管理 Python 简易爬虫开发 Nginx&uWSGI 服务器配置 ... 三.web页面开发 好吧,本来想单独写一章bootstrap的,但是前端确实没什么好写的,这里我们直接结合实际直接开搞吧.做WEB我习惯先把想要的页面模板做完,然后再根据razar或者这里要用到的django template修改.美工确实不太好,P得一手烂图,所以一般都用现成的开源框架,这里我