-
Notifications
You must be signed in to change notification settings - Fork 3
/
Quentin.idl
3614 lines (3472 loc) · 173 KB
/
Quentin.idl
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
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
/*
* Quentin IDL definition file
* Copyright Quantel Ltd 2001-2004
*/
/*
Licensing and distribution information
Quantel retains ownership of the intellectual property contained within
this document. However, Quantel grants permission for this document
to be freely copied, distributed, and compiled with or without charge
provided that either a) it is distributed unchanged or b) the modified
version retains this claim of ownership and also clearly identifies the
fact that it has been modified and by whom.
No warranty of accuracy, completeness or suitability for any purpose
whatsoever is implied by the simple distribution of this document.
Where this document is referenced by a contract between Quantel and any
other parties, all warranties and liabilities will be as described by such a
contract. Aside from such contractual references, Quantel disclaims all
liability for damages resulting from the use of this document, either as
an information source or as a machine-readable document, and whether such
damages are direct or consequential.
*/
/** @file Quentin.idl Quentin IDL definition file
*/
/*
* The embedded documentation in this file is designed to be extracted by the
* Open Source tool doxygen, available from http://www.doxygen.org.
*
* Further doxygen formatted information will be found in the file Documentation.idl
* which should be parsed along with this file by doxygen.
*
*/
module Quentin
{
//{{{ Forward definitions
interface DirectoryViewer ;
interface Server ;
interface ZonePortal ;
//}}}
//{{{ Constants and enums
//{{{ Constants and Enums etc. used when numbering clips
/** @name Constants etc. for use when numbering clips.*/
/** @{ */
const long maxNumber = 9999 ; /**< @brief Numbers available, from zero.*/
const long noNumber = -1 ; /**< @brief In fact, any out of range number denumbers.*/
//{{{
/** @brief Method to be used to resolve conflicts when numbering clips.
* Used only for backwards compatibility - deprecated.
* @see numberClip()
*/
enum ConflictMode {
findNumber, /**<@brief Find a free number, starting from requested number; returns the number found.*/
renumber, /**<@brief Push any conflicting clip to another number; returns that number.*/
denumber, /**<@brief Denumber any conflicting clip; return 1 if did so, 0 if not.*/
fail /**<@brief Fail the denumber, returning 0, if conflict; otherwise return 1.*/
} ;
//}}}
//{{{
/** @brief Mode to be used for searching clip numbers.
* Used only for backwards compatibility - deprecated.
* @see scanNumbers()
*/
enum FindMode {
findExact, /**< Get data on exact number only */
findForwards, /**< Get data on first numbered clip at or after number*/
findBackwards /**< Get data in first numbered clip at or before number*/
} ;
//}}}
/** @} */
//}}}
//{{{ Default ticket numbers
/** @name Constants associated with ticketing copies*/
/** @{ */
const long noTicket = 0 ; /**< @brief Ticket number to use if no ticket required.*/
/** @} */
//}}}
//{{{ Aspect ratio control
/** @{ */
/** @brief Mode for fitting video to output port.
*
* It is possible to play out video which does not "fit" the format in which it is being displayed
* e.g. 4x3 Standard Definition video being played on a 16x9 High Definition port. This defines how
* the problem is to be solved. The solution is defined in three places, in increasing precedence:
* <ol>
* <li> The server has a default format</li>
* <li> The server default can be overridden by the Port::setViewMode() function.</li>
* <li> The server or port default can be overridden by the flags in the ServerVideoFragment</li?
* </ol>
*/
/* play aspect */
const long defaultAspect = 0 ;
const long aspect16x9 = 1 ;
const long aspect4x3 = 2 ;
/* play mode */
const long defaultPlayMode = 0 ; /**< Use underlying mode */
const long box = 1 ; /**< Display all available video undistorted, adding black at edges where necessary*/
const long cut = 2 ; /**< Fill the picture with undistorted video, cropping excess lines or pixels*/
const long anamorphic = 3 ; /**< Display all available video, stretching if necessary to fill space*/
const long play14x9 = 4 ;
/** @} */
//}}}
//{{{ Constants defining fields in flags in the flagsFragment
/** @name Constants for use in ServerEssenceFragment::contentFlags
* Flags which modify the way in which the audio and video tracks are displayed.
* They will normally be defined before recording, but if set wrongly, can be corrected later.
* Flags do not need to be present if the default of all zeroes will suffice.
* Further flags may be defined, using bits from the bottom up. If users want
* to add their own flags, they should work from the top down (start
* at 0x80000000).
*
* PlayModeShift defines a two-bit field in which a ViewMode value can be inserted to
* override the port's view mode.
*/
/** @{ */
const long frameVideo = 0x1 ; /**<@brief Video does not have inter-field movement.*/
const long playModeOverride = 0x8 ; /**<@brief Set if playmode has been overridden by automation.*/
const long playModeShift = 4 ; /**<@brief Number of places to shift the playMode to insert it into the flags*/
const long aspectShift = 12 ; /**<@brief Number of places to shift the aspect to insert it into the flags*/
/** @} */
//}}}
//{{{ Standard tag names, used in the tagtype field of the RushTag struct
const wstring TagOriginator = L"Q_Originator" ; /**< @brief The name of the source (e.g.tape ID) from which the rush was recorded: set by Port.setOriginator()*/
const wstring TagRecordServer = L"Q_RecordServer" ; /**< @brief The server on which the rush was recorded: set by server*/
const wstring TagRecordChannel = L"Q_RecordChannel" ; /**< @brief The channel on which the rush was recorded: set by server*/
const wstring TagRecordTime = L"Q_RecordTime" ; /**< @brief The time at which recording of this rush was initialised, set by server*/
const wstring TagSceneChange = L"Q_SceneChange" ; /**< @brief A marker for scene changes inserted by the server at record time*/
const wstring TagPixelAspect = L"Q_PixelAspect"; /**< @brief A rational number describing the aspect of the pixels*/
const wstring TagCropRectangle = L"Q_CropRectangle"; /**< @brief Four comma-separated rationals describing active image area x,y,width, height */
const wstring TagMatch = L"Q_Match" ; /**< @brief The IDs of any rushes recorded simultaneously */
const wstring TagValidVideo = L"Q_ValidVideo" ; /**< @brief The frame which recording reached when the rush was terminated*/
const wstring TagFreezeMode = L"Q_FreezeMode"; /**< @brief The mode used for the rush when freeze - either field or frame */
const wstring TagRecordRate = L"Q_RecordRate"; /**< @brief Indicates the record rate, e.g. x1, x2, x3 */
const wstring TagStereo3D = L"Q_Stereo3D"; /**< @brief Indicates identity of rush in context of 3D recording, format is %d:%s where %d = camera rig # and %s is "Left" or "Right" */
//}}}
//}}}
//{{{ Typedefs, structs and classes
/** @defgroup misc Typedefs, structs and classes, structs and classes used by the main Objects.
* @{ */
//{{{ Typedefs
typedef short FormatCode ;
/**< Identifies the format of Essence data in Essence fragments*/
typedef sequence <FormatCode> FormatCodes ;
/**< @brief array of format codes */
typedef sequence <octet> RawData ;
/**< @brief Used for containing unspecified data.*/
typedef sequence <long> Longs ;
/**< @brief Simple array of integers*/
typedef sequence <wstring> WStrings ;
/**< @brief Simple array of WStrings*/
//{{{
typedef long Timecode ;
/**< @brief Timecode stored in a 32-bit integer.
*
* The timecode is stored as Binary Code Decimal, with each timecode digit occupying four bits
* @verbatim
* Bit 3 2 1 0
* . 10987654321098765432109876543210
* . 0dHHhhhh0MMMmmmm0SSSssss0FFFffff
* @endverbatim
* @li 0 - A mandatory zero bit (though certain functions may pack in extra control bits)
* @li d - Drop frame flag. Valid only in NTSC
* @li HH - Tens of hours
* @li hhhh - Units of hours
* @li MMM - Tens of minutes
* @li mmmm - Units of minutes
* @li SSS - Tens of seconds
* @li ssss - Units of seconds
* @li FFF - Tens of frames
* @li ffff - Units of frames
* A negative timecode (anything with the MS bit set) is invalid.
*/
//}}}
//}}}
//{{{ Structs
//{{{
/** A unique ID generated for each separate record session*/
struct RushIdent
{
long long first ; /**< @brief First half of Rush Ident */
long long second ; /**< @brief Second half of Rush Ident */
} ;
//}}}
//{{{
/**@brief A Name/value pair used for specifying clip Metadata.*/
struct ClipProperty
{
wstring name ; /**<@brief The "key" by which the property is referenced.*/
wstring value ; /**<@brief The current value of the property.*/
} ;
//}}}
/**@brief An array of name/value pairs.*/
typedef sequence <ClipProperty> ClipPropertyList ;
/**@brief An array of ClipProperty's */
//{{{
enum SortDirection
{
ascending,
descending
};
/**@brief A Name/direction pair used for specifying sort orders.*/
struct SortOrder
{
wstring name ; /**<@brief The "key" to order sort by.*/
SortDirection direction ; /**<@brief Direction of the sort.*/
} ;
//}}}
/**@brief An array of name/value pairs.*/
typedef sequence <SortOrder> SortOrderList ;
/**@brief enum used for clip protection */
enum ProtectMode
{
protectReadWrite, /**<@brief clip is unprotected */
protectReadOnly, /**<@brief clip is fully protected */
protectDelete /**<@brief clip is protected against deletion only */
};
//{{{
/**@brief Unvarying data about a Server.*/
struct ServerInfo
{
long ident ; /**<@brief This server's identity.*/
boolean down ; /**<@brief If set, this server is unavailable.*/
long numChannels ; /**<@brief Number of channels fitted to this server.*/
Longs pools ; /**<@brief The pools currently attached to the port.*/
wstring name ; /**<@brief Logical name allocated to this server*/
} ;
//}}}
//{{{
/**@brief Unvarying information about a Pool.*/
struct PoolInfo
{
boolean down ; /**<@brief If set, the pool is unavailable (not all raids attached to the same working server and ready).*/
long ident ; /**<@brief This pool's identity.*/
long long capacity ; /**<@brief This pool's capacity in protons.*/
wstring name ; /**<@brief Name allocated to this pool.*/
} ;
//}}}
//{{{
/**@brief Unvarying information about a port.*/
struct PortInfo
{
Server portServer ; /**<@brief The Server Object for the port.*/
long serverIdent ; /**<@brief The number of the server for the port.*/
wstring name ; /**<@brief The port name assigned by getPort.*/
long number ; /**<@brief The port number assigned by getPort.*/
Longs numTracks ; /**<@brief Number of tracks, indexed by track type.*/
} ;
//}}}
//{{{
/**@brief Info sent to inform a supervisor of changes to directory or configuration.
*/
enum StateChangeType { //Information about machine state changes
clipCreated, /**<@brief A clip has been created.*/
clipModified, /**<@brief A clip has been modified.*/
clipHidden, /**<@brief A clip has started the delete process.*/
clipDeleted, /**<@brief A clip has finished the delete process.*/
serverUp, /**<@brief A server has become available.*/
serverDown, /**<@brief A server has disappeared.*/
serverChanged, /**<@brief The allocation of channels on the server has changed.*/
poolUp, /**<@brief A pool has become available.*/
poolDown, /**<@brief A pool has disappeared.*/
listenerGone, /**<@brief A port has reported that it's Listener has unexpectedly stopped listening; this may indicate that the client software has crashed.*/
copyComplete, /**<@brief A copy has completed successfully.*/
copyFailed, /**<@brief A copy has failed or been aborted.*/
zoneUp, /**<@brief A remote zone has come up*/
zoneDown, /**<@brief A remote zone has gone down*/
zoneFailover, /**<@brief A remote zone has failed over, but is still accessible; references to it may need refreshing*/
aafUpdated /**<@brief An AAF file has been updated*/
} ;
//}}}
//{{{
/**@brief The structure sent to a StateChangeListener to inform it of events within Quentin.*/
struct StateChangeInfo
{
StateChangeType type ; /**<@brief The nature of the state change which has just occurred.*/
long ident ; /**<@brief The identity of the thing that has changed (clip, port, server, pool...).*/
long changeNum ; /**<@brief A simple counter so every State Change is unique.*/
} ;
//}}}
typedef sequence <StateChangeInfo> StateChangeList ; /**<@brief An array of StateChanegeInfo.*/
//{{{
/**@brief Structure defining the progress of a clip copy between servers.*/
struct CopyProgress
{
long clipID ; /**<@brief ID of clip being copied to.*/
long totalProtons ; /**<@brief Total number of protons that need copying.*/
long protonsLeft ; /**<@brief Number of protons remaining to copy.*/
long secsLeft ; /**<Estimated seconds to completion.*/
long priority ; /**<Priority at which copy is being done*/
boolean ticketed ; /**< True if copy has a ticket*/
} ;
//}}}
typedef sequence <CopyProgress> CopyProgressList ; /**<@brief An array of CopyProgress records.*/
//{{{
/** @brief A element in the CopyMap.
*
* The Copy Map is used to give a detailed report on the progress of a copy
*/
struct CopyMapElement
{
long flags ; /**< @brief Flags defining whether the copy is started, ticketed etc.
* @see ZonePortal::copyNotDone, ZonePortal::copyHasTicket,
* ZonePortal::copySourceDown, ZonePortal::copyDestDown, ZonePortal::copyFailed*/
long protons ; /**< @brief The number of protons this fragment represents*/
long frames ; /**< @brief The number of frames this fragment represents*/
} ;
//}}}
typedef sequence <CopyMapElement> CopyMapList ; /**< An array of CopyMapElements*/
//{{{
/** @brief A tag which has been placed on a source rush.
*
* It is sometimes useful to put a marker on source material which remains attached to that material
* even when it is edited.
*/
struct RushTag
{
RushIdent rushID ; /**<@brief RushID being tagged*/
long start ; /**<@brief Start of tagged section within rush*/
long finish ; /**<@brief End of tagged section: must be start+1 or greater*/
wstring tagtype ; /**<@brief A string describing the tag type such as "Goal", "Copyright Megacorp", or "Obscenity"*/
wstring info ; /**<@brief An informational string expanding on the tag type*/
} ;
//}}}
typedef sequence <RushTag> RushTagList ; /**< An array of tag data records*/
//{{{
/** @brief A block of timecode data associated with a rush.
*
* RushTimecode blocks are
* recorded by the Server as the rush is first captured. The RushTimecode's for
* a rush can be retrieved by getTimecodes()
*/
struct RushTimecode
{
long start ; /**< The frame within the rush at which this timecode block starts*/
long finish ; /**< The frame within the rush at which this timecode block starts; values <= start imply the block lasts to the end of the rush*/
Timecode portTimecode ; /**< The Port timecode of the first frame of the block*/
long userBits ; /**< The user bits of the first timecode of the block */
Timecode refTimecode ; /**< The reference timecode of the first frame of the block*/
} ;
//}}}
typedef sequence <RushTimecode> RushTimecodeList ; /**< An array of RushTimecode records*/
//{{{
/**@brief Description of a database column.
*
* Controlling software may need to enquire what database columns are available and what it
* can do with them. This structure is intended to answer those questions.
*/
struct ColumnDesc
{
wstring columnName ; /**<@brief Column Name.*/
wstring columnType ; /**<@brief Column Type.*/
wstring _alias ; /**<@brief An alias on the column name for display purposes only*/
boolean alterable ; /**<@brief If true, column can be altered after clip creation.*/
boolean creatable ; /**<@brief If true, column can be defined at clip creation time.*/
boolean searchable ; /**<@brief If true, column can be used for searching.*/
boolean clones ; /**<@brief If true, the column will be copied to clones if not overridden*/
} ;
//}}}
typedef sequence <ColumnDesc> ColumnDescList ; /**< An array of ColumnDescription records*/
//{{{
/** @brief The description of a configuration to which a port can be set.
*
* Video, audio and auxiliary data are configured independently, for both
* play and record. This data structure is returned by getConfigurations()
* to allow selection of appropriate values for the configure() command
*/
struct ConfigDescription
{
wstring description ; /**< A free text description of the format, suitable for making user selections*/
long configNumber ; /**< The identifying number for this configuration*/
float protonsPerFrame ; /**< Approximate number, for space allocation purposes, of protons per frame*/
} ;
//}}}
typedef sequence <ConfigDescription> ConfigDescriptionList ; /**<@brief A list of configuration descriptions*/
//{{{
/** @brief The full Clip ID, including zone*/
struct FullClipID
{
long zone ; /**< The Zone in which the clip exists */
long clipID ; /**< The clipID within the Zone */
} ;
//}}}
typedef sequence <FullClipID> FullClipIDList ; /**<@brief A list of Full Clip IDs*/
//{{{
/** @brief Data about a single placeholder
*/
struct PlaceholderData
{
long clipID ; /**< The clip ID of this placeholder */
long poolID ; /**< The pool it is on */
long zoneID ; /**< The Zone that pool is in */
wstring extData ; /**< The extended data supplied to createExtPlaceholder */
} ;
//}}}
typedef sequence <PlaceholderData> PlaceholderDataList ; /**<@brief a list of placeholders*/
//}}}
//{{{ The Fragment and the sub-classes which make it up
/** @{ */
//{{{
/**@brief The possible different fragment types.*/
enum FragmentType {
videoFragment, /**<@brief A number of frames of Video.*/
audioFragment, /**<@brief A number of frames of audio.*/
auxFragment, /**<@brief Auxiliary data, such as closed Caption data, for a number of frames*/
spare3, /**<@brief The "spare" types are reserved for possible future tracks containing "Essence".*/
spare4, /**<@brief The "spare" types are reserved for possible future tracks containing "Essence".*/
spare5, /**<@brief The "spare" types are reserved for possible future tracks containing "Essence".*/
spare6, /**<@brief The "spare" types are reserved for possible future tracks containing "Essence".*/
spare7, /**<@brief The "spare" types are reserved for possible future tracks containing "Essence".*/
flagsFragment, /**<@brief Modifiers for the content of the audio and video tracks (e.g. frame/field flag).*/
timecodeFragment, /**<@brief A number of frames of contiguous timecode.*/
aspectFragment, /**<@brief A block of video of non-standard aspect ratio.*/
cropFragment, /**<@brief A block of video requiring cropping, usually to remove black.*/
panZoomFragment, /**<@brief Pan and zoom information.*/
speedFragment,
multiCamFragment, /**<@brief Selects which stream in multi-cam clip is displayed.*/
ccFragment, /**<@brief Closed caption data. */
noteFragment, /**<@brief An annotation to the clip, which may be reported as an event.*/
effectFragment, /**<@brief A trigger command for an effects processor.*/
numFragmentTypes /**<@brief Provides a numeric value for the number of elements in this enum.*/
} ;
//}}}
const long lastEssenceTrack = 7 ; /**<spare7: Essence tracks describe essence data held on the raids.*/
const long lastLinearTrack = 14 ; /**<spare15: "Linear" tracks are modifiers tot the essence tracks.*/
//{{{
/** @brief Structure defining a contiguous burst of data on the server Raids.
*
* This structure contains all the information necessary to identify and locate
* a burst of data on disk. There may be other fields which modify the way in which
* that data is processed on disk.
*/
struct PositionData
{
FormatCode format ; /**< The format in which the data is stored*/
long poolID ; /**< The ID number of the pool on which the data is stored*/
long long poolFrame ; /**< The frame number, counting from the start of the pool, from which the data is stored.*/
short skew ; /**< The skew value of the atoms from the "zero position", in protons*/
RushIdent rushID ; /**< The RushId of the session when the data was recorded */
long rushFrame ; /**< The frame number, counting from the start of the rush, at which the rush was recorded*/
} ;
//}}}
//{{{
/** @brief Modifiers which can alter the way essence data is interpreted*/
struct ServerFlagsFragment
{
long flags ; /**<A flags word which can modify the interpretation of the Essence.*/
} ;
//}}}
//{{{
/**@brief A burst of contiguous timecode.*/
struct ServerTimecodeFragment
{
Timecode startTimecode ; /**<@brief The timecode of the first frame of the fragment.*/
long userBits ; /**<@brief The User Bits associated with the fragment.*/
} ;
//}}}
//{{{
/** @brief A rational describing the pixel aspect ratio for a block of video.
*
* Used to describe blocks of video whose pixel aspect ratio is not standard for its format.
* The magnitude of the two fields is not important: it is simply their ratio
* that matters.
*/
struct ServerAspectFragment
{
long width ; /**< the width of a pixel, in arbitrary units*/
long height ; /**< The height of a pixel, in the same arbitrary units*/
} ;
//}}}
//{{{
/** @brief Describes a block of video which needs to be cropped.
*
* Video sometimes needs cropping because it has black on it (letterbox/pillarbox)
*/
struct ServerCropFragment
{
long x ; /**< Rectangle describing area of valid video on input*/
long y ; /**< Rectangle describing area of valid video on input*/
long width ; /**< Rectangle describing area of valid video on input*/
long height ; /**< Rectangle describing area of valid video on input*/
} ;
//}}}
//{{{
/** @brief Describes a block of video which needs to be cropped.
*
* Video sometimes needs cropping because it has black on it (letterbox/pillarbox)
*/
struct ServerPanZoomFragment
{
long x; /**< X position of top-left of picture*/
long y; /**< Y position of top-left of picture*/
long hZoom; /**< Horizontal picture zoom */
long vZoom; /**< Vertical picture zoom */
} ;
//}}}
//{{{
/** @brief Describes a block of video which needs to be cropped.
*
* Video sometimes needs cropping because it has black on it (letterbox/pillarbox)
*/
struct ServerSpeedFragment
{
long speed; /**< Speed of clip*/
long profile; /**< Profile to use*/
} ;
//}}}
//{{{
/** @brief Describes lWhich multiCam stream to display
*
*
*/
struct ServerMultiCamFragment
{
long stream; /**< Multi-cam stream to display*/
} ;
//}}}
//{{{
/**@brief A "Note" which may be appended to a clip.
*
* The note has no effect on the playing of the clip. There are two basic uses
* for note fragments: to annotate tracks so that the controller can read back what it
* has loaded in a functional sense, and to provide signals via the PortListener
* interface as a track is played to allow the controlling software to keep track of where the
* player has reached.
*/
struct ServerNoteFragment
{
long noteID ; /**<@brief A number, supplied by the client, to identify which note this is.*/
long aux ; /**<@brief A modifier, meaning dependant upon client.*/
long mask ; /**<@brief A mask, used in conjunction with the noteMask parameter of reportStatus, to control reporting of notes */
wstring note ; /**<@brief A string used to identify the note - may be null.*/
//RawData data ; This field has been withdrawn
} ;
//}}}
//{{{
/**@brief A Effect which may be attached to a clip to perform output processing on the server.
*/
struct ServerEffectFragment
{
long effectID ; /**<@brief An ID for the effect.*/
RawData effectData ; /**<@brief The parameters for the effect as "dark" data.*/
} ;
/**@brief Constant effectID definitions to define the content of effect fragments
*/
const long extFragSpeed = 0 ; /**<@brief Speed profile */
const long extFragPanZoom = 1 ; /**<@brief Pan and zoom profile */
const long extFragMultiCam = 32 ; /**<@brief Multicam angle selection */
const long extFragCEA608 = 0x100 ; /**<@brief 608 closed caption data */
//}}}
//{{{
/**@brief A Closed caption which may be attached to a clip
*/
struct ServerCCFragment
{
RushIdent ccID ; /**<@brief An ID for the CC data.*/
long ccType ; /**<@brief Type of CC data. 608, OP-46 etc.*/
RawData ccData ; /**<@brief Closed Caption data.*/
} ;
//}}}
//{{{
/**@brief The varying data for the various different fragment types.
*/
union ServerFragmentData switch (FragmentType)
{
case videoFragment:
PositionData videoFragmentData ; /**<@brief Video data.*/
case audioFragment:
PositionData audioFragmentData ; /**<@brief Audio data.*/
case auxFragment:
PositionData auxFragmentData ; /**<@brief Auxiliary data*/
case flagsFragment:
ServerFlagsFragment flagsFragmentData ; /**<@brief Modifier flags*/
case timecodeFragment:
ServerTimecodeFragment timecodeFragmentData ; /**<@brief Timecode start.*/
case aspectFragment:
ServerAspectFragment aspectFragmentData ; /**<@brief Pixel aspect ratio. */
case cropFragment:
ServerCropFragment cropFragmentData ; /**<@brief Crop rectangle. */
case noteFragment:
ServerNoteFragment noteFragmentData ; /**<@brief Note contents.*/
case effectFragment:
ServerEffectFragment effectFragmentData ; /**<@brief "Dark" effect data.*/
case panZoomFragment:
ServerPanZoomFragment panZoomFragmentData ; /**<@brief Pan & zoom data.*/
case speedFragment:
ServerSpeedFragment speedFragmentData ; /**<@brief Speed data.*/
case multiCamFragment:
ServerMultiCamFragment multiCamFragmentData ; /**<@brief Multicam data.*/
case ccFragment:
ServerCCFragment ccFragmentData ; /**<@brief Closed caption data.*/
} ;
//}}}
//{{{
/**@brief A single fragment of clip data.
*/
struct ServerFragment
{
long trackNum ; /**<@brief The track within the class of tracks to which the fragment applies.*/
long start ; /**<@brief The start frame of the fragment.*/
long finish ; /**<@brief The finish frame of the fragment. This is the frame <em>after</em> the fragment finishes,
so that the length of the fragment is (finish - start).*/
ServerFragmentData fragmentData ; /**<@brief The variable data describing the fragment.*/
} ;
//}}}
/**@brief An array of ServerFragment.*/
typedef sequence <ServerFragment> ServerFragments ;
//}}}
//{{{
/** @brief Data describing a recording format.
The servers are capable of recording the different essence types (video, audio, aux) in several
different formats.
*/
struct FormatInfo
{
FormatCode formatNumber ; /**< The unique format number of this format*/
FragmentType essenceType ; /**< The essence type of this format (Video/audio/aux) */
long frameRate ; /**< Frame rate: usually 25/30 for interlaced, 50/60 for progressive*/
long height ; /**< Height of picture, in lines: video only*/
long width ; /**< Width of picture, in pixels: video only*/
long samples ; /**< Samples per second: audio only*/
long compressionFamily ; /**< The compression family, e.g DV, MPeg-2*/
long protonsPerAtom ; /**< The number of contiguous protons which form an atom in this format.*/
long framesPerAtom ; /**< The number of frames to packed into an atom. O identifies variabnle width formats such as browse*/
long quark ; /**< Quark format code */
wstring formatName ; /**< A human friendly explanation of the formatNumber*/
wstring layoutName ; /**< A human friendly explanation of the layout*/
wstring compressionName ; /**< A human friendly explanation of the compressionName*/
} ;
//}}}
//{{{ Other base interfaces
/** @defgroup others Other base interfaces
* @{
*/
//{{{
/**@brief A package of name/value pairs.
*
* This interface exists so that other, more complicated, interfaces may be
* derived from it.
*
* There are usually a number of facts which a controller wishes to know about an
* object which it is controlling. These are usually constant for a particular
* configuration or change slowly. Examples are Machine Serial Number and
* Software version. New properties may need to be added at a later date.
* Rather than provide an indefinite number of queries, these are handled by
* giving each property a name string, and returning a property string. If the
* property is numeric, it will be returned as a string in the form of a decimal
* number.
*/
interface Properties
{
wstring getProperty (in wstring propertyName) ;
/**<@brief Request a Property.
*
* @param propertyName The name of the requested property. The name must be an exact match
* so case and white space are significant.
* @return: The property string, or the empty string if the property is undefined or unknown.
*/
WStrings getPropertyList () ;
/**<@brief Request a list of all known properties.
*
* @return An array of WStrings containing the property names, in arbitrary order.
*/
//{{{ Property Strings
/**@name Predefined names of properties.
* These WStrings provide names of properties common to several different
* interfaces. Not all interfaces will support these properties - just that,
* if they do, they will support these WStrings. */
/** @{ */
const wstring idlImplementation = L"IdlImplementation" ; /**<@brief All implementers should return the ZoneManager::idlVersion string with which they were compiled.*/
const wstring softwareVersion = L"SoftwareVersion" ; /**<@brief Software version string.*/
const wstring serialNumber = L"SerialNumber" ; /**<@brief Hard-wired serial number, as a decimal string.*/
const wstring name = L"Name" ; /**<@brief A human-friendly name for this equipment.*/
const wstring location = L"EngineeringName" ; /**<@brief A description of where this equipment is located.*/
const wstring frameRate = L"FrameRate"; /**<@brief Video frame rate: normally "25" or "30"*/
const wstring redAlert = L"RedAlert" ; /**<@brief Description of any outstanding "Red" alert.*/
const wstring amberAlert = L"AmberAlert" ; /**<@brief Description of any outstanding "Amber" alert.*/
const wstring consoleURI = L"ConsoleURI" ; /**<@brief The URI, usually the form "http://MyMachine:1234/index.html", upon which this machine offers an HTTP control console */
const wstring isDummyServer = L"IsDummyServer" ; /**<@brief "Yes" if the interface is a dummyserver, "" otherwise */
const wstring searchPath = L"SearchPath" ; /**<@brief URL of search service */
/** @{ */
} ;
//}}}
//}}}
//{{{
/**@brief Basic interface for Effects controllers.
*
* There will in future be one or more effects controllers fitted to the system.
* This interface provides a subclass from which all such controllers will be
* derived. The effect controllers can be obtained from the Port, and must be
* up-cast to the appropriate derived class.
* It is, of course, difficult to generalise about the wide variety of possible
* Effect Controllers. However, there is a general structure. Each Controller
* will have a number of live controls used to configure it in real time. These
* controls update an internal state. Generally, but not always, each controller
* is capable of changing cleanly from its existing state to a new one by means
* of an effects move. This internal state may be requested buy getState() in order
* either to create EffectFragments or to restore the controller to its current state
* by calling setState().
*/
interface EffectController
{
wstring getName () ;
/**<@brief Get name of controller.
*
* Each effect controller will have a unique name. This call can be used to confirm
* the name of this particular controller, and should be called to check before upcasting.
* @return String identifying effect controller type
*/
long getVersion () ;
/**<@brief Get controller major and minor version numbers.
*
* Effects controllers will inevitably develop with time. This method allow a check
* of which version of the controller is running. It is divided into two halves:
* a major version in the MS 16 bits and a minor version in the LS 16. Higher
* minor versions of the same major version should be upward compatible; different
* major versions may well be incompatible.
* @return Major version in bits 16-31, minor version in bits 0-15
*/
void reset () ;
/**<@brief Reset controller.*/
RawData getState () ;
/**<@brief Get current state of controller.
*
* This routine returns an object describing the current state of the controller
* which may be used either to create Effect Fragments or as a parameter to setState()
* @return Raw data object encapsulating current server state.
*/
void setState (in RawData state) ;
/**<@brief Return Controller to a previously saved state.
*
* Note: the transition from the current state is not necessarily clean. In
* order to do a smooth state change (if the Controller is capable of it), the
* raw data must be converted into an Effect Fragment, which must be inserted
* into the Port Timeline and executed.
* @param state Raw data object obtained from getState()
*/
} ;
//}}}
/** @} */
//}}}
/** @brief ChannelType identifies the Channel duplex characteristics
*/
enum ChannelType {
halfDuplex,
fullDuplex,
simplexRecord,
simplexPlayback
} ;
/** @brief ChannelCapabilities describe sQ server channel capabilities. See getChannelCapabilities()
*/
struct ChannelCapabilities
{
long chanNumber ; /**<@brief The channel number.*/
ChannelType type; /**<@brief The channel type, e.g. half-duplex, etc..*/
long inputCount; /**<@brief The number of physical inputs*/
long outputCount; /**<@brief The number of physical outputs*/
long long generalFeatures; /**<@brief General features bit field, see GENCAP_xxx flags */
long long recordFeatures; /**<@brief Record features bit field, see RECCAP_xxx flags*/
long long playFeatures; /**<@brief Play features bit field, see PLYCAP_xxx flags*/
} ;
/** @name Flags associated with the generalFeatures field of ChannelCapabilities
*/
const long long CHANCAP_GEN_OVERLAY = 0x1 ; /**<@brief The channel provides an overlay (dirty) output.*/
/** @name Flags associated with the recordFeatures field of ChannelCapabilities
*/
const long long CHANCAP_REC_AUTOSIZE = 0x1 ; /**<@brief The channel provides auto size on input capability */
const long long CHANCAP_REC_AIR = 0x2 ; /**<@brief The channel supports always in record functionality */
/** @name Flags associated with the playFeatures field of ChannelCapabilities
*/
const long long CHANCAP_PLAY_SUBFRAME_JOG = 0x1 ; /**<@brief If set, the channel supports subframe jog capability*/
const long long CHANCAP_PLAY_LIVE_CLAMP = 0x2 ; /**<@brief If set, the channel supports clamping of play position to record head */
const long long CHANCAP_PLAY_AUDIO_16CH = 0x100 ; /**<@brief If set, the channel supports 16 channel audio*/
const long long CHANCAP_PLAY_AUDIO_32CH = 0x200 ; /**<@brief If set, the channel supports 32 channel audio on 3G SDI */
typedef sequence<ChannelCapabilities> ChannelCapabilitiesList ;
/** @brief Describes the features supported by a server*/
struct ServerCapabilities
{
long productID ; /**<@brief The server identifier.*/
long long features; /**<@brief Features of the server.*/
ChannelCapabilitiesList channelCapabilities ; /**<@brief A list of capabilities for all channels.*/
};
/** @name Flags associated with the ServerCapabilities::features field
*/
const long long SVRCAP_REMOTE_PRELOAD_SQ = 0x1 ; /**<@brief The server supports remote essence preload from other sQ systems.*/
const long long SVRCAP_REMOTE_PRELOAD_REVQ = 0x2 ; /**<@brief The server supports remote essence preload from revQ systems.*/
/** @brief Audio patch structure for single channel specification*/
struct AudioPatchInfo
{
long dst; /**<@brief Destination/output channel, range 0..15 */
long src; /**<@brief The source channel, range 0..15, if -1 then patch in silence */
float level; /**<@brief The audio level in dB, i.e. 0.0 = 0dB FS, -6.0 = -6dB FS (i.e. half amplitude). Levels above FS (0.0dB) are not permited */
};
typedef sequence <AudioPatchInfo> AudioPatchInfoList ;
/** @} */
//}}}
//{{{ Exceptions
/** @defgroup Exceptions Exceptions thrown by Quentin
* @{
*/
//{{{
/**@brief The fragments intended to create a clip are not understood.*/
exception InvalidFragments
{
ServerFragments invalids ; /**<@brief The fragments which were not understood.*/
} ;
//}}}
//{{{
/**@brief An error reported by the underlying database.*/
exception DatabaseError
{
wstring error ; /**<@brief The error message returned by the underlying database.*/
} ;
//}}}
//{{{
//{{{
/**@brief The various reasons a BadIdent exception can be returned.*/
enum BadIdentReason {
internalError, /**<@brief The Quentin Manager has generated some kind of internal fault.*/
poolNotKnown, /**<@brief An unknown pool has been referenced.*/
poolNotOnThisServer, /**<@brief The specified pool is not on this server.*/
poolNotAvailable, /**<@brief The specified pool is not available (perhaps one of its raids is down).*/
serverNotKnown, /**<@brief An unknown server has been referenced.*/
clipNotKnown, /**<@brief An unknown clip has been referenced.*/
channelNotKnown, /**<@brief An unknown channel has been referenced.*/
formatNotKnown, /**<@brief An unknown compression format has been referenced.*/
rowNotKnown, /**<@brief The row does not form part of the current search result.*/
serverIsDown, /**<@brief The specified server is down.*/
badFragment, /**<@brief One or more fragments are not valid.*/
triggerNotKnown, /**<@brief An invalid trigger has been specified.*/
invalidMode, /**<@brief A record/play mode has been specified which the port cannot perform.*/
badTicket, /**<@brief An invalid ticket number has been specified */
configNotKnown, /**<@brief The channel does not support the configuration ID*/
zoneNotKnown, /**<@brief This zone is not known*/
notPlaceholder, /**<@brief This clip is not a placeholder*/
badLoggingRole, /**<@brief The specified logging role does not exist.*/
operationNotSupported /**<@brief The operation requested is not supported, e.g. not supported by hardware, etc.*/
} ;
//}}}
/**@brief A numeric identifier (pool id, server id etc.) is not valid.*/
exception BadIdent
{
BadIdentReason reason ; /**<@brief The type of identifier which was not valid.*/
long ident ; /**<@brief The invalid identifier.*/
} ;
//}}}
//{{{
/**@brief A column name or column contents cannot be understood.*/
exception BadColumnData
{
wstring colName ; /**<@brief The name of the column.*/
wstring badData ; /**<@brief The invalid data if the column name is valid, or null if the column name is invalid.*/
} ;
//}}}
//{{{
/**@brief There is not enough free space in the pool to fulfil the request.*/
exception NoSpace
{
} ;
//}}}
//{{{
/**@brief An attempt has been made to put a port into an invalid mode, or to do an operation not valid in the current mode.
*/
exception WrongMode
{
} ;
//}}}
/**@brief The zone is known to the system but currently inaccessible.*/
exception ZoneInaccessable
{
} ;
/** @} */
//}}}
//{{{ Listeners
/** @defgroup Listeners The Listener Interfaces: Asynchronous feedback to clients
* @{
* These interfaces will be provided by controlling software. They provide a
* "callback" mechanism for the Quentin Manger to tell managing computers about
* events which have occurred or changes which have been made to the system.
* While it is also possible to monitor the Quentin status by continuous
* polling, it is STRONGLY recommended that these interfaces are used instead
* in order to minimise network and system load. As well as reporting when
* statuses have changed or events have occurred, most of the Listener
* interfaces have a time interval after which they will repeat an unchanged
* status or report a null change in order to act as a "heartbeat" to
* reassure that the system is still functioning.
*/
//{{{
/**@brief Client interface for receiving thumbnails sent to the server.
*/
interface ThumbnailListener
{
void newThumbnail (in long ident, in long offset, in long width, in long height, in Longs data) ;
/**<@brief Send a thumbnail to the listener.
*
* @param ident Ident param given by requestThumbnails
* @param offset Offset on a timeline from which thumbnail was derived
* @param width Width of thumbnail in pixels
* @param height Height of thumbnail in pixels
* @param data The thumbnail data - currently RGB packed into 32 bit values
*/
/**@brief Reasons why a thumbnail could not be sent. */
enum NoThumbnailReason {
unknown, /**<@brief Generic if other reasons not appropriate.*/
unrecorded, /**<@brief The frame is on the record track, but has not yet been recorded.*/
unbuilt, /**<@brief The frame is due to be rebuilt by a background rebuild, by has not yet been processed.*/
busy, /**<@brief The server is too busy to respond.*/
badFormat, /**<@brief The video is not in an appropriate format.*/
hardwareError /**<@brief A hardware failure made it impossible to send the thumbnail.*/
} ;
void noThumbnail (in NoThumbnailReason reason, in long ident, in long offset, in boolean tryAgainLater, in wstring reasonStr) ;
/**<@brief Tell Listener a thumbnail cannot be sent.
*
* @param reason The reason the Thumbnail could not be sent
* @param ident Ident param given by requestThumbnails
* @param offset Offset on timeline from which thumbnail could not be sent
* @param tryAgainLater If true, the thumbnail may be available later
* @param reasonStr Explanation for error
*/
void finished (in long ident) ;
/**<@brief Terminates sequence of thumbnails.
*
* This routine is called when a sequence of thumbnails has been sent, to inform the
* Listener that no further thumbnails will be sent.
* @param ident Ident param given by requestThumbnails
*/
} ;
//}}}
//{{{
/**@brief Client interface for reporting the status of a Port.
*/
interface PortListener
{
/** @name consts for flags in all status variants.*/
const long listenerPresent = 0x8000 ; /**<@brief A PortListener has been defined.*/
/**@brief Status record sent to PlayPortListener, or read from Play Port.*/
struct PlayPortStatus
{
long portNumber ; /**<@brief The number of this port.*/
unsigned long flags ; /**<@brief Flags showing port status.*/
Timecode refTime ; /**<@brief "Wallclock" or station reference time derived from server reference feed.*/
Timecode portTime ; /**<@brief Time on input port, if any.*/
long framesUnused ; /**<@brief Number of frames since the Port was last given a valid command or transferred a frame*/
long offset ; /**<@brief Current position in timeline.*/
long endOfData ; /**<@brief Offset+1 of frame at which data ends.*/
float speed ; /**<@brief Speed at which is playing. 0.0 means stopped, 1.0 means normal speed.*/
Timecode outputTime ; /**<@brief Timecode being generated on output.*/
} ;
/** @name consts for flags in PlayPortStatus.*/
/** @{ */
const long readyToPlay = 1; /**<@brief Ready to play - all pre-loads completed.*/
const long playing = 2 ; /**<@brief Now playing.*/
const long jumpReady = 4 ; /**<@brief Ready to jump - jump pre-load completed.*/
const long fading = 8 ; /**<@brief Now cross fading.*/
const long opAudioFlagsMask = 0xF00 ;/* Bitmask for OP audio status.*/
const long opAudioGrp1 = 0x100 ; /* Bit indicating audio chans 0-3 active data.*/
const long opAudioGrp2 = 0x200 ; /* Bit indicating audio chans 4-7 active data.*/
const long opStdFlagsMask = 0xF00000 ; /**<@brief Bitmask for OPStd bitfield.*/
const long opStdSD = 0x000000 ; /**<@brief Output is SD.*/
const long opStdSD4_3 = 0x100000 ; /**<@brief Output is SD 4:3.*/
const long opStdSD16_9 = 0x200000 ; /**<@brief Output is SD 16:9.*/
const long opStdHD720p = 0x300000 ; /**<@brief Output is HD 720p.*/
const long opStdHD1080i = 0x400000 ; /**<@brief Output is HD 1080i.*/