1.  Vlc基础数据结构

hongxianzhao@hotmail.com

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;

};

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

  1. 1.基础: 万丈高楼平地起——Redis基础数据结构 学习记录

    <Redis深度历险:核心原理和应用实践>1.基础: 万丈高楼平地起——Redis基础数据结构 学习记录http://naotu.baidu.com/file/b874e2624d3f37 ...

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

    本系列文章会深入研究 Ceph 以及 Ceph 和 OpenStack 的集成: (1)安装和部署 (2)Ceph RBD 接口和工具 (3)Ceph 物理和逻辑结构 (4)Ceph 的基础数据结构 ...

  3. Redis基础数据结构

    Redis数据库中每个键值对都是由对象( c 的结构体对象)组成的. 数据库键总是一个字符串对象(string object) 数据库键的值可以使字符串对象.列表对象(list object).哈希对 ...

  4. redis 基础数据结构实现

    参考文献 redis数据结构分析 Skip List(跳跃表)原理详解 redis 源码分析之内存布局 Redis 基础数据结构与对象 Redis设计与实现-第7章-压缩列表 在redis中构建了自己 ...

  5. Redis基础——剖析基础数据结构及其用法

    这是一个系列的文章,打算把Redis的基础数据结构.高级数据结构.持久化的方式以及高可用的方式都讲一遍,公众号会比其他的平台提前更新,感兴趣的可以提前关注,「SH的全栈笔记」,下面开始正文. 如果你是 ...

  6. C语言- 基础数据结构和算法 - 09 栈的应用_中缀表达式转后缀表达式20220611

    09 栈的应用_中缀表达式转后缀表达式20220611 听黑马程序员教程<基础数据结构和算法 (C版本)>, 照着老师所讲抄的, 视频地址https://www.bilibili.com/ ...

  7. C语言- 基础数据结构和算法 - 08 栈的应用_就近匹配20220611

    听黑马程序员教程<基础数据结构和算法 (C版本)>, 照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1 喜欢的朋友 ...

  8. C语言- 基础数据结构和算法 - 循环链表

    听黑马程序员教程<基础数据结构和算法 (C版本)>,照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1 喜欢的朋友可 ...

  9. C语言 - 基础数据结构和算法 - 单向链表

    听黑马程序员教程<基础数据结构和算法 (C版本)>,照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1 喜欢的朋友可 ...

随机推荐

  1. 一个用 Cumulative Penalty 培训 L1 正规 Log-linear 型号随机梯度下降

      Log-Linear 模型(也叫做最大熵模型)是 NLP 领域中使用最为广泛的模型之中的一个.其训练常採用最大似然准则.且为防止过拟合,往往在目标函数中增加(能够产生稀疏性的) L1 正则.但对于 ...

  2. SQLLoader4(数据文件中的列与表中列不一致情况-filler)

    A.数据文件中字段个数少于表中列字段个数,但数据文件中缺少的列,在表定义中可以为空.----- 这种情况是比较简单的,只需要将数据文件中数据对应的列的名字写到控制文件中即可.因为SQL*Loader是 ...

  3. Android PackageManager基础知识

    一.PackageManagerService启动过程 SystemServer首先启动,创建一个ServerThread线程来启动所有Android核心服务,其中PackageManagerServ ...

  4. Android向Rest服务Post数据遇到的Date类型数据问题

    今天在Android端向Rest服务Post数据时,总是不成功,查了很多资料,才知道Rest端将json串反序列化时,需要的时间格式必须是UTC类型,及Date(12345678+0800)格式. A ...

  5. pca图像识别

    代码下载:基于PCA(主成分分析)的人脸识别 人脸识别是一个有监督学习过程,首先利用训练集构造一个人脸模型,然后将测试集与训练集进行匹配,找到与之对应的训练集头像.最容易的方式是直接利用欧式距离计算测 ...

  6. Java—NumberFormat与DecimalFormat类

    1.NumberFormat表示数字的格式化类 NumberFormat表示数字的格式化类,即:可以按照本地的风格习惯进行数字的显示. No. 方法 类型 描述 1 public static Loc ...

  7. poj 3959 Alignment of Code <vector>“字符串”

    Description You are working in a team that writes Incredibly Customizable Programming Codewriter (IC ...

  8. vimdiff: 使用Vim中强大的文件diff功能[转]

    学习了一段时间的Vim,直到最近才发现Vim的diff功能是如此方便,对比代码变化再也不用到处去找diff软件或者依靠版本控制的diff了.强大的Vim. 下图是我在macVim中的diff效果. 下 ...

  9. Equations(hdu 1496 二分查找+各种剪枝)

    Equations Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  10. poj 1699 Best Sequence

    http://poj.org/problem?id=1699 题意:给你n个长度为L的序列,求包含这几个序列的最短长度. 先预处理每两个序列之间的关系,然后dfs枚举就行. #include < ...