summaryrefslogtreecommitdiff
path: root/docs/random/design
blob: c2fe81dfb75ce2145f0f89a5192739403cd2c74d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
GNonLin Design Document

Global Overview
---------------

GNonLin works as a companion library for GStreamer, in order to be
able to easily manipulate and assemble media streams through time, and
use that composition in any GStreamer graph just like any other
GStreamer element.


GNonLin Object (GnlObject)
--------------------------

  Base class for all GNonLin objects. Virtual class.

  Contains all the properties, functions and methods for
  time-shifting.


* Properties:

  _ start: Start position of the object in it's container.
  _ duration: Duration of the object in it's container.
  _ stop: Stop position of the object in it's container (read-only,
    computed from start and duration properties).

  _ media-start: Start position of the element controlled by the
    object.
  _ media-duration: Duration of the element controlled by the object.
  _ media-stop: Stop position of the element controlled by the object
    (read-only, computed from media-start and media-duration
    properties). 

  _ rate: Rate of the outgoing stream (read-only, computed from
    duration and media-duration properties).

  _ caps: GstCaps used to filter the object's caps. The first pad
    whose caps intersect with these caps will be used by the
    GnlObject.
  _ priority: Priority of the object in it's container
    GnlComposition. 0 is the highest priority (the object will
    supersed any other object set to play at the same time), and 2^32
    is the lowest priority (the object will be scheduled to play if
    nothing else is set to play at that time).
  _ active: If set to FALSE, this object will not be used in it's
    container GnlComposition


* Time-shifting:

    The values set for start, duration, media-start and media-duration
  will be used to decide which section will be taken in the controlled
  element, and how it will be shifted in time.

    The outputted data will be:
     [media-start -> media-stop] from the controlled element,
     shifted to appear as [start -> stop].

    This time-shifting is done by intercepting incoming and outgoing
  events in the element pad controlled by the GnlObject.


GNonLin source (GnlSource)
--------------------------

  Object for controlling source elements (only provide data).

* Controlling a GstElement:

    The GnlSource can control a source GstElement which is added to it
 (using the standard gst_bin_add() function). 

    If the element provides several pads, the first pad whose caps
 intersect the one specified in the caps property will be used.


GNonLin URI source (GnlURISource)
-----------------------------------

  Convenience source. Contains a uridecodebin.

* URI

    The URI of the content to control.


GNonLin operation (GnlOperation)
--------------------------------

  Object for controlling multiple-input single-output elements.

* Controlling an effect GstElement:

    The same rules applies here as for GnlSource. The only difference
  is that the operation will check that the given element has
  (potential) input sources.

* Number of inputs:

    The number of inputs to be used by this operation is set with the
  'inputs' priority. This will be used by the container composition to
  automatically  link it to the proper sources.

    The default value, 0, means that it will be up to the parent
  composition to request new input pads if it needs more. If a value
  was specified, then the composition will only use those N
  inputs. This suits both the cases where, the developer automatically
  wants that operation to apply to all the underlying sources, and the
  case where the developers only wants that operation to apply to a
  given number of underlying sources. 

    If the controlled operation has non-request sinkpads, then the
  number of inputs will be set to the number of sinkpads. Trying to
  manually change that property will fail.


GNonLin composition (GnlComposition)
------------------------------------

  Contains GnlObjects and connects them dynamicly to create a
  composition.

* Adding/Removing objects to the composition:

    Any GnlObject derivative can be added/removed to/from a
  composition using the standard gst_bin_add()/gst_bin_remove()
  methods.

* What is played at any given time:

  The object taken for output at one given time is the object:
    _ which is active
    _ AND is set for that time (start <= time < stop)
    _ AND has the highest priority (smallest numerical value)

    If that object is an operation which has N sinkpads, the
  composition will recursively connect the GnlObjects by increasing
  priorities:
    _ which are active
    _ AND set for that time (start <= time < stop)
    _ If the object is an operation, recursively apply this rule.


Object Hierarchy:
-----------------

GstBin
 !
 +--- GnlObject
       !
       +--- GnlSource
       !     !
       !     +--- GnlUriSource
       !
       +--- GnlOperation
       !
       +--- GnlComposition