xv-protocol-v2.txt revision d63b911f
1
2
3
4
5
6
7
8
9
10			  X Video Extension
11			 Protocol Description
12
13			      Version 2
14
15			      25-JUL-91
16
17			     David Carver
18
19		    Digital Equipment Corporation
20		Workstation Engineering/Project Athena
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  Copyright 1991 by Digital Equipment Corporation, Maynard, Massachusetts,
46  and the Massachusetts Institute of Technology, Cambridge, Massachusetts.
47
48                        All Rights Reserved
49
50  Permission to use, copy, modify, and distribute this software and its
51  documentation for any purpose and without fee is hereby granted, provided
52  that the above copyright notice appear in all copies and that both that
53  copyright notice and this permission notice appear in supporting
54  documentation, and that the names of Digital or MIT not be used in
55  advertising or publicity pertaining to distribution of the software
56  without specific, written prior permission.
57
58  DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
59  ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
60  DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
61  ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
62  IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
63  OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
64  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
65
66
67
68  Preface
69  -------
70
71    The following is an outline for an X video extension protocol.  It
72    is preliminary and subject to change.  My goal in writing this was
73    to fix some the shortcomings of existing overly simplistic
74    extensions while avoiding pitfalls in an overly complex extension.
75
76    Your feedback is desired, and since the major design directions
77    have been stable for some time, feel free to hammer on the details
78    of the protocol.
79
80    When you receive a revision of the document, refer to the changes
81    and issues sections to guide your review and analysis.
82
83
84  Acknowledgements
85  ---------------
86
87    The following people have made major contributions to the design of
88    the Xv protocol:
89
90      Branko Gerovac (DEC/Corporate Research)
91      Russ Sasnett (GTE/Project Athena)
92      Ralph Swick (DEC/Project Athena)
93
94    Many ideas and approaches in Xv were the product of discussions
95    with several groups, including
96
97      Project Athena's Visual Computing Group
98      The MIT X Consortium
99      The MIT Media Lab's Interactive Cinema Group
100
101
102  
103  Changes
104  -------
105
106    From version 1.3 to 2.0
107
108    -- Changed SetPortControl and GetPortControl to GetPortAttribute
109       and SetPortAttribute.
110
111    -- Changed QueryBestSize
112
113    -- Simplified SelectVideoNotify and SelectPortNotify requests.
114
115    -- Changed the way SetPortControl and GetPortControl works.
116
117    -- Added a QueryExtension request to return the version and
118       revision information of the extension.
119
120    -- Changed the name of the QueryVideo request to QueryAdaptors;
121       Removed the list of encodings from QueryVideo and added a
122       QueryEncodings request.
123
124    -- Added a PortNotify event that notifies interested clients that
125       a port control has been changed.
126
127    -- Added SelectPortNotify request to select for PortNotify events.
128
129    -- The XvInterruped reason has been replaced by two new reasons:
130       one for when video is preempted by another video request and
131       one for when video is terminated because of hard transmission
132       or reception errors.
133
134    -- Changed the wording of the QueryBestSize request.  Added issue
135       about whether or not returned sizes should maintain the
136       requested aspect ratio.
137
138
139
140  Introduction
141  ------------
142
143    Video technology is moving very quickly.  Standards for processing
144    high resolution video are currently a hot topic of discussion
145    internationally, and it will soon be possible to process video
146    entirely within the digital domain.  The Xv extension, however,
147    does not attempt to address issues of digital video.  Its purpose
148    is to provide a mechanism for support of current and near term
149    interactive video technology.
150
151    It is somewhat ironic that Xv contains nothing particularly
152    innovative.  It takes a minimalistic approach, and without a doubt
153    it could have been defined years ago, and with several revisions.
154    So, the life expectancy of Xv is not long.  Nevertheless, it may
155    undergo further revision and experimentation that will help our
156    progress towards digital video systems.
157
158    One premise of the Xv extension is that the X server is not alone.
159    A separate video server is often used to manage other aspects of
160    video processing, though the partition between what the X server
161    does and what a video server does is a matter of great debate.
162
163
164  Model
165  -----
166
167    This extension models video monitor capabilities in the X Window
168    System.  Some advanced monitors support the simultaneous display
169    of multiple video signals (into separate windows), and that is
170    represented here through the ability to display video from
171    multiple video input adaptors into X drawables.
172
173    Some monitors support multiple video encodings (mostly for
174    internationalization purposes) either through switches or
175    automatic detection, thus each video adaptor specifies the set of
176    encodings it supports.
177
178    The requests to display video from an adaptor into a drawable are
179    modeled after the core PutImage request, though extended to
180    support scaling and source clipping.
181
182    Video output is also supported and is symmetric with the video
183    input function, though fewer GC components are used.
184
185
186  Mechanism
187  ---------
188
189    The Xv extension does the following:
190
191      --  lists available video adaptors
192      --  identifies the number of ports each adaptor supports
193      --  describes what drawable formats each adaptor supports
194      --  describes what video encodings each adaptor supports
195      --  displays video from a port to a drawable
196      --  captures video from a drawable to a port
197      --  grabs and ungrabs ports
198      --  sets and gets port attributes
199      --  delivers event notification
200
201
202
203  Adaptors
204  --------
205
206    A display may have multiple video input and output adaptors.  An
207    adaptor may support multiple simultaneously active ports, and in
208    some cases the number of ports has no fixed limit.
209
210    An input port receives encoded video data and converts it to a
211    stream of data used to update a drawable.  An output port samples
212    data from a drawable and produces a stream of encoded video data.
213
214    The ADAPTORINFO structure is used to describe a video adaptor.
215
216    ADAPTORINFO:
217  	[base-id: PORT
218         num-ports: CARD16
219         type: SETofADAPTORTYPE
220         formats: LISTofFORMAT
221         name: STRING]
222
223    ADAPTORTYPE: {Input, Output}
224
225    FORMAT:
226  	[depth: CARD8
227  	 visual: VISUALID]
228
229    The base-id field specifies the XID of the first port of the
230    adaptor.  The `num-ports' field specifies how many ports the
231    adaptor supports.  The ports of the adaptor have XIDs in the range
232    [base-id..base-id + num-ports - 1]
233
234    The type attribute determines if the adaptor can process video
235    input, output, or input and output.  The if the adaptor can
236    process input then Input is asserted, if the adaptor can process
237    output then Output is asserted.
238
239    The drawable depths and visual types supported by the adaptor are
240    listed in `formats'.  Note: that when video is being processed for
241    pixmaps the visual format is taken to be the visual of the first
242    pair that matches the depth of the pixmap.
243
244    The name field contains an a vendor specific string that
245    identifies the adaptor.
246
247    It should be noted that the existence of separate adaptors doesn't
248    necessarily imply that simultaneous operation is supported.
249
250
251
252  Errors
253  ------
254
255    Port
256
257    A Port error is returned if any request names a PORT that does not
258    exist.
259
260
261    Encoding
262
263    An Encoding error is returned if any request names an ENCODINGID
264    that does not exist.
265
266
267
268
269  Query Requests
270  -------------------
271
272    QueryExtension
273    ==>
274      version: CARD16
275      revision: CARD16
276
277    The QueryExtension request returns the extension version and
278    revision numbers.
279
280
281    QueryAdaptors
282      win: WINDOW
283    ==>
284      adaptors: LISTofADAPTORINFO
285
286    The QueryAdaptors request returns the video adaptor information for
287    the screen of the specified window.
288
289    Errors: {Window}
290
291
292    QueryEncodings
293      port: PORT
294    ==>
295      encodings: LISTofENCODINGINFO
296
297    The QueryEncodings request returns the list of encodings supported
298    by the port adaptor.  Use the SetPortAttribute request to set
299    which encoding a port is to process.  The ENCODINGINFO record
300    describes an encoding:
301
302    ENCODINGINFO:
303  	[encoding: ENCODINGID
304  	 name: STRING
305  	 width, height: CARD16
306  	 rate: FRACTION]
307
308    The `encoding' field identifies an encoding supported by a port.
309    Its value is unique for a screen.  Width and height specify the
310    size of the video image and rate specifies the rate at which
311    fields of image information are encoded.
312
313    An encoding is identified by a string that names the encoding.
314    Encoding naming conventions need to be established (i.e.,
315    something along the lines of font naming, but simpler)
316
317    FRACTION
318          [numerator, denominator: INT32]
319
320    The FRACTION structure is used to specify a fractional number.
321
322    Errors: {Port}
323
324
325
326  Put Video Requests
327  ------------------
328
329    PutVideo
330      port: PORT
331      drawable: DRAWABLE
332      gc: GCONTEXT
333      vid-x, vid-y: INT16
334      vid-w, vid-h: CARD16
335      drw-x, drw-y: INT16
336      drw-w, drw-h: CARD16
337
338    The PutVideo request writes video into a drawable.  The position
339    and size of the source rectangle is specified by vid-x, vid-y,
340    vid-w, and vid-h.  The position and size of the destination
341    rectangle is specified by drw-x, drw-y, drw-w, drw-h.
342
343    Video data is clipped to the bounds of the video encoding, scaled
344    to the requested drawable region size (or the closest size
345    supported), and clipped to the bounds of the drawable.
346
347    If video is successfully initiated, a VideoNotify event with
348    detail Started is generated for the drawable.  If the port is
349    already in use, its video is preempted, and if the new drawable is
350    different than the old, a VideoNotify event with detail Preempted
351    is generated for the old drawable.  If the port is grabbed by
352    another client, this request is ignored, and a VideoNotify event
353    with detail Busy is generated for the drawable.  If the port is
354    not receiving a valid video signal or if the video signal is
355    interrupted while video is active a VideoNotify event with detail
356    HardError is generated for the drawable.
357
358    GC components: subwindow-mode, clip-x-origin, clip-y-origin, clip-mask.
359
360    Errors: {Match, Value, GContext, Port, Alloc}
361
362
363    PutStill
364      port: PORT
365      drawable: DRAWABLE
366      gc: GCONTEXT
367      vid-x, vid-y: INT16
368      vid-w, vid-h: CARD16
369      drw-x, drw-y: INT16
370      drw-w, drw-h: CARD16
371
372    The PutStill request writes a single frame of video into a
373    drawable.  The position and size of the source rectangle is
374    specified by vid-x, vid-y, vid-w, and vid-h.  The position and
375    size of the destination rectangle is specified by drw-x, drw-y,
376    drw-w, drw-h.
377
378    Video data is clipped to the bounds of the video encoding, scaled
379    to the requested drawable region size (or the closest size
380    supported) and clipped to the bounds of the drawable.
381
382    If the port is grabbed by another client, this request is ignored,
383    and a VideoNotify event with detail Busy is generated for the
384    drawable.  If the port is not receiving a valid video signal a
385    VideoNotify event with detail HardError is generated for the
386    drawable.
387
388    GC components: subwindow-mode, clip-x-origin, clip-y-origin, clip-mask.
389
390    Errors: {Match, Value, GContext, Port, Alloc}
391
392  
393
394  Get Video Requests
395  ------------------
396
397    GetVideo
398      port: PORT
399      drawable: DRAWABLE
400      gc: GCONTEXT
401      vid-x, vid-y: INT16
402      vid-w, vid-h: CARD16
403      drw-x, drw-y: INT16
404      drw-w, drw-h: CARD16
405
406    The GetVideo request outputs video from a drawable.  The position
407    and size of the destination rectangle is specified by vid-x,
408    vid-y, vid-w, and vid-h.  The position and size of the source
409    rectangle is specified by drw-x, drw-y, drw-w, and drw-h.
410
411    Drawable data is clipped to the bounds of the drawable, scaled to
412    the requested video region size (or the closest size supported)
413    and clipped to the bounds of the video encoding.  The contents of
414    any region not updated with drawable data is undefined.
415
416    If video is successfully initiated, a VideoNotify event with
417    detail Started is generated for the drawable.  If the port is
418    already in use, its video is preempted, and if the new drawable is
419    different than the old, a VideoNotify event with detail Preempted
420    is generated for the old drawable.  If the port is grabbed by
421    another client, this request is ignored, and a VideoNotify event
422    with detail Busy is generated for the drawable.
423
424    GC components: subwindow-mode, clip-x-origin, clip-y-origin,
425    clip-mask.
426
427    Errors: {Match, Value, GContext, Port, Alloc}
428
429
430    GetStill
431      port: PORT
432      drawable: DRAWABLE
433      gc: GCONTEXT
434      vid-x, vid-y: INT16
435      vid-w, vid-h: CARD16
436      drw-x, drw-y: INT16
437      drw-w, drw-h: CARD16
438
439    The GetStill request outputs video from a drawable.  The position
440    and size of the destination rectangle is specified by vid-x,
441    vid-y, vid-w, and vid-h.  The position and size of the source
442    rectangle is specified by drw-x, drw-y, drw-w, and drw-h.
443
444    Drawable data is clipped to the bounds of the drawable, scaled to
445    the requested video region size (or the closest size supported)
446    and clipped to the bounds of the video encoding.  The contents of
447    any region not updated with drawable data is undefined.
448
449    If the still is successfully captured a VideoNotify event with
450    detail Still is generated for the drawable.  If the port is
451    grabbed by another client, this request is ignored, and a
452    VideoNotify event with detail Busy is generated for the drawable.
453
454    GC components: subwindow-mode, clip-x-origin, clip-y-origin,
455    clip-mask.
456
457    Errors: {Match, Value, GContext, Port, Alloc}
458
459
460  
461
462  Grab Requests
463  -------------
464
465    GrabPort
466      port: PORT
467      timestamp: {TIMESTAMP, CurrentTime}
468    ==>
469      status: {Success, AlreadyGrabbed, InvalidTime}
470
471    The GrabPort request grabs a port.  While a port is grabbed, only
472    video requests from the grabbing client are permitted.
473
474    If timestamp specifies a time older than the current port time, a
475    status of InvalidTime is returned.  If the port is already grabbed
476    by another client, a status of AlreadyGrabbed is returned.
477    Otherwise a status of Success is returned. The port time is
478    updated when the following requests are processed: GrabPort,
479    UngrabPort, PutVideo, PutStill, GetVideo, GetStill
480
481    If the port is actively processing video for another client, the
482    video is preempted, and an VideoNotify event with detail Preempted
483    is generated for its drawable.
484
485    Errors: {Port}
486
487
488    UngrabPort
489      port: PORT
490      timestamp: {TIMESTAMP, CurrentTime}
491
492    The UngrabPort request ungrabs a port.  If timestamp specifies a
493    time before the last connection request time of this port, the
494    request is ignored.
495
496    Errors: {Port}
497
498
499
500  Other Requests
501  --------------
502
503    StopVideo
504      port: PORT
505      drawable: DRAWABLE
506
507    The StopVideo request stops active video for the specified port
508    and drawable.  If the port isn't processing video, or if it is
509    processing video in a different drawable, the request is ignored.
510    When video is stopped a VideoNotify event with detail Stopped is
511    generated for the associated drawable.
512
513    Errors: {Drawable, Port}
514
515
516    SelectVideoNotify
517      drawable: DRAWABLE
518      onoff: BOOL
519
520    The SelectVideoNotify request enables or disables VideoNotify
521    event delivery to the requesting client.  VideoNotify events are
522    generated when video starts and stops.
523
524    Errors: {Drawable}
525
526
527    SelectPortNotify
528      port: PORT
529      onoff: BOOL
530
531    The SelectPortNotify request enables or disables PortNotify event
532    delivery to the requesting client.  PortNotify events are
533    generated when port attributes are changed using SetPortAttribute.
534
535    Errors: {Port}
536
537
538    QueryBestSize
539      port: PORT
540      motion: BOOL
541      vid-w, vid-h: CARD16
542      drw-w, drw-h: CARD16
543    ==>
544      actual-width, actual-height: CARD16
545
546    The QueryBestSize request returns, for the given source size and
547    desired destination size, the closest destination size that the
548    port adaptor supports.  The returned size will be equal
549    or smaller than the requested size if one is supported.  If motion
550    is True then the requested size is intended for use with full
551    motion video.  If motion is False, the requested size is intended
552    for use with stills only.
553
554    The returned size is also chosen to maintain the requested aspect ratio
555    if possible.
556
557    Errors: {Port}
558
559
560
561    SetPortAttribute
562      port: PORT
563      attribute: ATOM
564      value: INT32
565
566    The SetPortAttribute request sets the value of a port attribute.
567    The port attribute is identified by the attribute atom.  The
568    following strings are guaranteed to generate valid atoms using the
569    InternAtom request.
570
571    String                Type
572    -----------------------------------------------------------------
573
574    "XV_ENCODING"         ENCODINGID
575    "XV_HUE"	          [-1000..1000]
576    "XV_SATURATION"       [-1000..1000]
577    "XV_BRIGHTNESS"       [-1000..1000]
578    "XV_CONTRAST"         [-1000..1000]
579
580
581    If the given attribute doesn't match an attribute supported by the
582    port adaptor a Match error is generated.  The supplied encoding
583    must be one of the encodings listed for the adaptor, otherwise an
584    Encoding error is generated.
585
586    If the adaptor doesn't support the exact hue, saturation,
587    brightness, and contrast levels supplied, the closest levels
588    supported are assumed.  The GetPortAttribute request can be used
589    to query the resulting levels.
590
591    When a SetPortAttribute request is processed a PortNotify event is
592    generated for all clients that have requested port change
593    notification using SelectPortNotify.
594
595    Errors: {Port, Match, Value}
596
597
598    GetPortAttribute
599      port: PORT
600      attribute: ATOM
601    ==>
602      value: INT32
603
604
605    The GetPortAttribute request returns the current value of the
606    attribute identified by the given atom.  If the given atom
607    doesn't match an attribute supported by the adaptor a Match
608    error is generated.
609
610    Errors: {Port, Match}
611
612
613
614  Events
615  ------
616
617    VideoNotify
618      drawable: DRAWABLE
619      port: PORT
620      reason: REASON
621      time: TIMESTAMP
622
623    REASON: {Started, Still, Stopped, Busy, Preempted, HardError}
624
625    A VideoNotify event is generated when video activity is started,
626    stopped, or unable to proceed in a drawable.
627
628    A Started reason is generated when video starts in a drawable.
629
630    A Stopped reason is generated when video is stopped in a
631    drawable upon request.
632
633    A Busy reason is generated when a put or get request cannot
634    proceed because the port is grabbed by another client.
635
636    A Preempted reason is generated when video is stopped by a
637    conflicting request.
638
639    A HardError reason is generated when the video port cannot
640    initiate or continue processing a video request because of an
641    underlying transmission or reception error.
642
643
644    PortNotify
645      port: PORT
646      attribute: ATOM
647      value: INT32
648      time: TIMESTAMP
649
650    The PortNotify event is generated when a SetPortAttribute request
651    is processed.  The event is delivered to all clients that have
652    performed a SelectPortNotify request for the port.  The event
653    contains the atom identifying the attribute that changed, and the
654    new value of that attribute.
655