[vlc-devel] Questions about VLC architecture

Derk-Jan Hartman hartman at videolan.org
Sat Sep 20 15:02:04 CEST 2008


On 20 sep 2008, at 14:26, Justus-bulk at Piater.name wrote:
> Hi,
>
> There are two fundamental design ideas in VLC whose rationale I don't
> understand, vlc_object_t (misc/objects.c) and the named variables
> (misc/variables.c). I did not find the answers in the developer's
> wiki:
>
> - The objects look like they implement a sort-of poor man's
>  inheritance, but without the notational convenience, conciseness and
>  type safety of an object-oriented language. I guess this is mostly a
>  legacy issue?
>
>  Secondly, it looks like all kinds of objects are stored inside a
>  single tree (per libvlc instance). Why's this? What does this afford
>  over and above a conventional design where each subsystem takes care
>  of its own data structures?

Each object has a common part and an object specific part.
The common part holds references to it''s children objects, parent and  
the root. This creates a type of Tree of objects each one responsible  
for its own children.
It also holds variables, and flags for various states (dead/dying), a  
name for the object, objecttype id(so we know what type of object  
specific data is stored after the common part), even a thread  
reference if needed.

This allows us to re-use code that we use much throughout the entire  
library, without using C++

> - Similarly, why does VLC need a central repository of named
>  variables? Why cannot each subsystem maintain its own variables?  To
>  me as a newcomer to VLC code, this variable tree looks unwieldy,
>  error prone, and inefficient. Again, what does it afford over and
>  above a conventional design where each subsystem takes care of its
>  own data structures? And why are dynamically-named variables needed
>  at all?

There is no central repository. All variables are connected to an  
object.
What is important to understand with variables is that a variable is  
uniquely identified by it's name AND a specific object, for the  
duration of said object.

A variable can inherit it's value from parent objects that have the  
same named variable, or from a configuration option with the same  
name. A variable can have Callbacks that are triggered when it's value  
is changed, as well as value limits, or lists of allowed named values.  
(To match a value for a device with a human readable string for  
instance). There are 9 classes of variables (mutex,time,float,int,bool  
etc).

All in all it's very flexible if it works. (variable inheritance is a  
tad damaged atm). You can define a variable in a module for instance,  
that immediately inherits its default or non-default setting from the  
preferences. Add a list of descriptions for the string, mark it as a  
command. Then in the interface, you find this variable and use it to  
build a menu entry for instance. Whenever someone changes the option,  
the variable is set and triggers it's callbacks.

It is however arguably used a bit too much and too careless atm.

DJ

> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> http://mailman.videolan.org/listinfo/vlc-devel



More information about the vlc-devel mailing list