2 ** Copyright (c) 2014 Blackmagic Design
4 ** Permission is hereby granted, free of charge, to any person or organization
5 ** obtaining a copy of the software and accompanying documentation covered by
6 ** this license (the "Software") to use, reproduce, display, distribute,
7 ** execute, and transmit the Software, and to prepare derivative works of the
8 ** Software, and to permit third-parties to whom the Software is furnished to
9 ** do so, all subject to the following:
11 ** The copyright notices in the Software and this entire statement, including
12 ** the above license grant, this restriction and the following disclaimer,
13 ** must be included in all copies of the Software, in whole or in part, and
14 ** all derivative works of the Software, unless such copies or derivative
15 ** works are solely in the form of machine-executable object code generated by
16 ** a source language processor.
18 ** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 ** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 ** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
21 ** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
22 ** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
23 ** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
24 ** DEALINGS IN THE SOFTWARE.
28 #ifndef BMD_DECKLINKAPISTREAMING_H
29 #define BMD_DECKLINKAPISTREAMING_H
34 #define BMD_CONST __declspec(selectany) static const
36 #define BMD_CONST static const
43 // Interface ID Declarations
45 BMD_CONST REFIID IID_IBMDStreamingDeviceNotificationCallback
= /* F9531D64-3305-4B29-A387-7F74BB0D0E84 */ {0xF9,0x53,0x1D,0x64,0x33,0x05,0x4B,0x29,0xA3,0x87,0x7F,0x74,0xBB,0x0D,0x0E,0x84};
46 BMD_CONST REFIID IID_IBMDStreamingH264InputCallback
= /* 823C475F-55AE-46F9-890C-537CC5CEDCCA */ {0x82,0x3C,0x47,0x5F,0x55,0xAE,0x46,0xF9,0x89,0x0C,0x53,0x7C,0xC5,0xCE,0xDC,0xCA};
47 BMD_CONST REFIID IID_IBMDStreamingDiscovery
= /* 2C837444-F989-4D87-901A-47C8A36D096D */ {0x2C,0x83,0x74,0x44,0xF9,0x89,0x4D,0x87,0x90,0x1A,0x47,0xC8,0xA3,0x6D,0x09,0x6D};
48 BMD_CONST REFIID IID_IBMDStreamingVideoEncodingMode
= /* 1AB8035B-CD13-458D-B6DF-5E8F7C2141D9 */ {0x1A,0xB8,0x03,0x5B,0xCD,0x13,0x45,0x8D,0xB6,0xDF,0x5E,0x8F,0x7C,0x21,0x41,0xD9};
49 BMD_CONST REFIID IID_IBMDStreamingMutableVideoEncodingMode
= /* 19BF7D90-1E0A-400D-B2C6-FFC4E78AD49D */ {0x19,0xBF,0x7D,0x90,0x1E,0x0A,0x40,0x0D,0xB2,0xC6,0xFF,0xC4,0xE7,0x8A,0xD4,0x9D};
50 BMD_CONST REFIID IID_IBMDStreamingVideoEncodingModePresetIterator
= /* 7AC731A3-C950-4AD0-804A-8377AA51C6C4 */ {0x7A,0xC7,0x31,0xA3,0xC9,0x50,0x4A,0xD0,0x80,0x4A,0x83,0x77,0xAA,0x51,0xC6,0xC4};
51 BMD_CONST REFIID IID_IBMDStreamingDeviceInput
= /* 24B6B6EC-1727-44BB-9818-34FF086ACF98 */ {0x24,0xB6,0xB6,0xEC,0x17,0x27,0x44,0xBB,0x98,0x18,0x34,0xFF,0x08,0x6A,0xCF,0x98};
52 BMD_CONST REFIID IID_IBMDStreamingH264NALPacket
= /* E260E955-14BE-4395-9775-9F02CC0A9D89 */ {0xE2,0x60,0xE9,0x55,0x14,0xBE,0x43,0x95,0x97,0x75,0x9F,0x02,0xCC,0x0A,0x9D,0x89};
53 BMD_CONST REFIID IID_IBMDStreamingAudioPacket
= /* D9EB5902-1AD2-43F4-9E2C-3CFA50B5EE19 */ {0xD9,0xEB,0x59,0x02,0x1A,0xD2,0x43,0xF4,0x9E,0x2C,0x3C,0xFA,0x50,0xB5,0xEE,0x19};
54 BMD_CONST REFIID IID_IBMDStreamingMPEG2TSPacket
= /* 91810D1C-4FB3-4AAA-AE56-FA301D3DFA4C */ {0x91,0x81,0x0D,0x1C,0x4F,0xB3,0x4A,0xAA,0xAE,0x56,0xFA,0x30,0x1D,0x3D,0xFA,0x4C};
55 BMD_CONST REFIID IID_IBMDStreamingH264NALParser
= /* 5867F18C-5BFA-4CCC-B2A7-9DFD140417D2 */ {0x58,0x67,0xF1,0x8C,0x5B,0xFA,0x4C,0xCC,0xB2,0xA7,0x9D,0xFD,0x14,0x04,0x17,0xD2};
57 /* Enum BMDStreamingDeviceMode - Device modes */
59 typedef uint32_t BMDStreamingDeviceMode
;
60 enum _BMDStreamingDeviceMode
{
61 bmdStreamingDeviceIdle
= 'idle',
62 bmdStreamingDeviceEncoding
= 'enco',
63 bmdStreamingDeviceStopping
= 'stop',
64 bmdStreamingDeviceUnknown
= 'munk'
67 /* Enum BMDStreamingEncodingFrameRate - Encoded frame rates */
69 typedef uint32_t BMDStreamingEncodingFrameRate
;
70 enum _BMDStreamingEncodingFrameRate
{
72 /* Interlaced rates */
74 bmdStreamingEncodedFrameRate50i
= 'e50i',
75 bmdStreamingEncodedFrameRate5994i
= 'e59i',
76 bmdStreamingEncodedFrameRate60i
= 'e60i',
78 /* Progressive rates */
80 bmdStreamingEncodedFrameRate2398p
= 'e23p',
81 bmdStreamingEncodedFrameRate24p
= 'e24p',
82 bmdStreamingEncodedFrameRate25p
= 'e25p',
83 bmdStreamingEncodedFrameRate2997p
= 'e29p',
84 bmdStreamingEncodedFrameRate30p
= 'e30p',
85 bmdStreamingEncodedFrameRate50p
= 'e50p',
86 bmdStreamingEncodedFrameRate5994p
= 'e59p',
87 bmdStreamingEncodedFrameRate60p
= 'e60p'
90 /* Enum BMDStreamingEncodingSupport - Output encoding mode supported flag */
92 typedef uint32_t BMDStreamingEncodingSupport
;
93 enum _BMDStreamingEncodingSupport
{
94 bmdStreamingEncodingModeNotSupported
= 0,
95 bmdStreamingEncodingModeSupported
,
96 bmdStreamingEncodingModeSupportedWithChanges
99 /* Enum BMDStreamingVideoCodec - Video codecs */
101 typedef uint32_t BMDStreamingVideoCodec
;
102 enum _BMDStreamingVideoCodec
{
103 bmdStreamingVideoCodecH264
= 'H264'
106 /* Enum BMDStreamingH264Profile - H264 encoding profile */
108 typedef uint32_t BMDStreamingH264Profile
;
109 enum _BMDStreamingH264Profile
{
110 bmdStreamingH264ProfileHigh
= 'high',
111 bmdStreamingH264ProfileMain
= 'main',
112 bmdStreamingH264ProfileBaseline
= 'base'
115 /* Enum BMDStreamingH264Level - H264 encoding level */
117 typedef uint32_t BMDStreamingH264Level
;
118 enum _BMDStreamingH264Level
{
119 bmdStreamingH264Level12
= 'lv12',
120 bmdStreamingH264Level13
= 'lv13',
121 bmdStreamingH264Level2
= 'lv2 ',
122 bmdStreamingH264Level21
= 'lv21',
123 bmdStreamingH264Level22
= 'lv22',
124 bmdStreamingH264Level3
= 'lv3 ',
125 bmdStreamingH264Level31
= 'lv31',
126 bmdStreamingH264Level32
= 'lv32',
127 bmdStreamingH264Level4
= 'lv4 ',
128 bmdStreamingH264Level41
= 'lv41',
129 bmdStreamingH264Level42
= 'lv42'
132 /* Enum BMDStreamingH264EntropyCoding - H264 entropy coding */
134 typedef uint32_t BMDStreamingH264EntropyCoding
;
135 enum _BMDStreamingH264EntropyCoding
{
136 bmdStreamingH264EntropyCodingCAVLC
= 'EVLC',
137 bmdStreamingH264EntropyCodingCABAC
= 'EBAC'
140 /* Enum BMDStreamingAudioCodec - Audio codecs */
142 typedef uint32_t BMDStreamingAudioCodec
;
143 enum _BMDStreamingAudioCodec
{
144 bmdStreamingAudioCodecAAC
= 'AAC '
147 /* Enum BMDStreamingEncodingModePropertyID - Encoding mode properties */
149 typedef uint32_t BMDStreamingEncodingModePropertyID
;
150 enum _BMDStreamingEncodingModePropertyID
{
152 /* Integers, Video Properties */
154 bmdStreamingEncodingPropertyVideoFrameRate
= 'vfrt', // Uses values of type BMDStreamingEncodingFrameRate
155 bmdStreamingEncodingPropertyVideoBitRateKbps
= 'vbrt',
157 /* Integers, H264 Properties */
159 bmdStreamingEncodingPropertyH264Profile
= 'hprf',
160 bmdStreamingEncodingPropertyH264Level
= 'hlvl',
161 bmdStreamingEncodingPropertyH264EntropyCoding
= 'hent',
163 /* Flags, H264 Properties */
165 bmdStreamingEncodingPropertyH264HasBFrames
= 'hBfr',
167 /* Integers, Audio Properties */
169 bmdStreamingEncodingPropertyAudioCodec
= 'acdc',
170 bmdStreamingEncodingPropertyAudioSampleRate
= 'asrt',
171 bmdStreamingEncodingPropertyAudioChannelCount
= 'achc',
172 bmdStreamingEncodingPropertyAudioBitRateKbps
= 'abrt'
175 // Forward Declarations
177 class IBMDStreamingDeviceNotificationCallback
;
178 class IBMDStreamingH264InputCallback
;
179 class IBMDStreamingDiscovery
;
180 class IBMDStreamingVideoEncodingMode
;
181 class IBMDStreamingMutableVideoEncodingMode
;
182 class IBMDStreamingVideoEncodingModePresetIterator
;
183 class IBMDStreamingDeviceInput
;
184 class IBMDStreamingH264NALPacket
;
185 class IBMDStreamingAudioPacket
;
186 class IBMDStreamingMPEG2TSPacket
;
187 class IBMDStreamingH264NALParser
;
189 /* Interface IBMDStreamingDeviceNotificationCallback - Device notification callbacks. */
191 class IBMDStreamingDeviceNotificationCallback
: public IUnknown
194 virtual HRESULT
StreamingDeviceArrived (/* in */ IDeckLink
* device
) = 0;
195 virtual HRESULT
StreamingDeviceRemoved (/* in */ IDeckLink
* device
) = 0;
196 virtual HRESULT
StreamingDeviceModeChanged (/* in */ IDeckLink
* device
, /* in */ BMDStreamingDeviceMode mode
) = 0;
199 virtual ~IBMDStreamingDeviceNotificationCallback () {} // call Release method to drop reference count
202 /* Interface IBMDStreamingH264InputCallback - H264 input callbacks. */
204 class IBMDStreamingH264InputCallback
: public IUnknown
207 virtual HRESULT
H264NALPacketArrived (/* in */ IBMDStreamingH264NALPacket
* nalPacket
) = 0;
208 virtual HRESULT
H264AudioPacketArrived (/* in */ IBMDStreamingAudioPacket
* audioPacket
) = 0;
209 virtual HRESULT
MPEG2TSPacketArrived (/* in */ IBMDStreamingMPEG2TSPacket
* tsPacket
) = 0;
210 virtual HRESULT
H264VideoInputConnectorScanningChanged (void) = 0;
211 virtual HRESULT
H264VideoInputConnectorChanged (void) = 0;
212 virtual HRESULT
H264VideoInputModeChanged (void) = 0;
215 virtual ~IBMDStreamingH264InputCallback () {} // call Release method to drop reference count
218 /* Interface IBMDStreamingDiscovery - Installs device notifications */
220 class IBMDStreamingDiscovery
: public IUnknown
223 virtual HRESULT
InstallDeviceNotifications (/* in */ IBMDStreamingDeviceNotificationCallback
* theCallback
) = 0;
224 virtual HRESULT
UninstallDeviceNotifications (void) = 0;
227 virtual ~IBMDStreamingDiscovery () {} // call Release method to drop reference count
230 /* Interface IBMDStreamingVideoEncodingMode - Represents an encoded video mode. */
232 class IBMDStreamingVideoEncodingMode
: public IUnknown
235 virtual HRESULT
GetName (/* out */ CFStringRef
*name
) = 0;
236 virtual unsigned int GetPresetID (void) = 0;
237 virtual unsigned int GetSourcePositionX (void) = 0;
238 virtual unsigned int GetSourcePositionY (void) = 0;
239 virtual unsigned int GetSourceWidth (void) = 0;
240 virtual unsigned int GetSourceHeight (void) = 0;
241 virtual unsigned int GetDestWidth (void) = 0;
242 virtual unsigned int GetDestHeight (void) = 0;
243 virtual HRESULT
GetFlag (/* in */ BMDStreamingEncodingModePropertyID cfgID
, /* out */ bool* value
) = 0;
244 virtual HRESULT
GetInt (/* in */ BMDStreamingEncodingModePropertyID cfgID
, /* out */ int64_t* value
) = 0;
245 virtual HRESULT
GetFloat (/* in */ BMDStreamingEncodingModePropertyID cfgID
, /* out */ double* value
) = 0;
246 virtual HRESULT
GetString (/* in */ BMDStreamingEncodingModePropertyID cfgID
, /* out */ CFStringRef
*value
) = 0;
247 virtual HRESULT
CreateMutableVideoEncodingMode (/* out */ IBMDStreamingMutableVideoEncodingMode
** newEncodingMode
) = 0; // Creates a mutable copy of the encoding mode
250 virtual ~IBMDStreamingVideoEncodingMode () {} // call Release method to drop reference count
253 /* Interface IBMDStreamingMutableVideoEncodingMode - Represents a mutable encoded video mode. */
255 class IBMDStreamingMutableVideoEncodingMode
: public IBMDStreamingVideoEncodingMode
258 virtual HRESULT
SetSourceRect (/* in */ uint32_t posX
, /* in */ uint32_t posY
, /* in */ uint32_t width
, /* in */ uint32_t height
) = 0;
259 virtual HRESULT
SetDestSize (/* in */ uint32_t width
, /* in */ uint32_t height
) = 0;
260 virtual HRESULT
SetFlag (/* in */ BMDStreamingEncodingModePropertyID cfgID
, /* in */ bool value
) = 0;
261 virtual HRESULT
SetInt (/* in */ BMDStreamingEncodingModePropertyID cfgID
, /* in */ int64_t value
) = 0;
262 virtual HRESULT
SetFloat (/* in */ BMDStreamingEncodingModePropertyID cfgID
, /* in */ double value
) = 0;
263 virtual HRESULT
SetString (/* in */ BMDStreamingEncodingModePropertyID cfgID
, /* in */ CFStringRef value
) = 0;
266 virtual ~IBMDStreamingMutableVideoEncodingMode () {} // call Release method to drop reference count
269 /* Interface IBMDStreamingVideoEncodingModePresetIterator - Enumerates encoding mode presets */
271 class IBMDStreamingVideoEncodingModePresetIterator
: public IUnknown
274 virtual HRESULT
Next (/* out */ IBMDStreamingVideoEncodingMode
** videoEncodingMode
) = 0;
277 virtual ~IBMDStreamingVideoEncodingModePresetIterator () {} // call Release method to drop reference count
280 /* Interface IBMDStreamingDeviceInput - Created by QueryInterface from IDeckLink */
282 class IBMDStreamingDeviceInput
: public IUnknown
288 virtual HRESULT
DoesSupportVideoInputMode (/* in */ BMDDisplayMode inputMode
, /* out */ bool* result
) = 0;
289 virtual HRESULT
GetVideoInputModeIterator (/* out */ IDeckLinkDisplayModeIterator
** iterator
) = 0;
290 virtual HRESULT
SetVideoInputMode (/* in */ BMDDisplayMode inputMode
) = 0;
291 virtual HRESULT
GetCurrentDetectedVideoInputMode (/* out */ BMDDisplayMode
* detectedMode
) = 0;
295 virtual HRESULT
GetVideoEncodingMode (/* out */ IBMDStreamingVideoEncodingMode
** encodingMode
) = 0;
296 virtual HRESULT
GetVideoEncodingModePresetIterator (/* in */ BMDDisplayMode inputMode
, /* out */ IBMDStreamingVideoEncodingModePresetIterator
** iterator
) = 0;
297 virtual HRESULT
DoesSupportVideoEncodingMode (/* in */ BMDDisplayMode inputMode
, /* in */ IBMDStreamingVideoEncodingMode
* encodingMode
, /* out */ BMDStreamingEncodingSupport
* result
, /* out */ IBMDStreamingVideoEncodingMode
** changedEncodingMode
) = 0;
298 virtual HRESULT
SetVideoEncodingMode (/* in */ IBMDStreamingVideoEncodingMode
* encodingMode
) = 0;
302 virtual HRESULT
StartCapture (void) = 0;
303 virtual HRESULT
StopCapture (void) = 0;
304 virtual HRESULT
SetCallback (/* in */ IUnknown
* theCallback
) = 0;
307 virtual ~IBMDStreamingDeviceInput () {} // call Release method to drop reference count
310 /* Interface IBMDStreamingH264NALPacket - Represent an H.264 NAL packet */
312 class IBMDStreamingH264NALPacket
: public IUnknown
315 virtual long GetPayloadSize (void) = 0;
316 virtual HRESULT
GetBytes (/* out */ void** buffer
) = 0;
317 virtual HRESULT
GetBytesWithSizePrefix (/* out */ void** buffer
) = 0; // Contains a 32-bit unsigned big endian size prefix
318 virtual HRESULT
GetDisplayTime (/* in */ uint64_t requestedTimeScale
, /* out */ uint64_t* displayTime
) = 0;
319 virtual HRESULT
GetPacketIndex (/* out */ uint32_t* packetIndex
) = 0; // Deprecated
322 virtual ~IBMDStreamingH264NALPacket () {} // call Release method to drop reference count
325 /* Interface IBMDStreamingAudioPacket - Represents a chunk of audio data */
327 class IBMDStreamingAudioPacket
: public IUnknown
330 virtual BMDStreamingAudioCodec
GetCodec (void) = 0;
331 virtual long GetPayloadSize (void) = 0;
332 virtual HRESULT
GetBytes (/* out */ void** buffer
) = 0;
333 virtual HRESULT
GetPlayTime (/* in */ uint64_t requestedTimeScale
, /* out */ uint64_t* playTime
) = 0;
334 virtual HRESULT
GetPacketIndex (/* out */ uint32_t* packetIndex
) = 0; // Deprecated
337 virtual ~IBMDStreamingAudioPacket () {} // call Release method to drop reference count
340 /* Interface IBMDStreamingMPEG2TSPacket - Represent an MPEG2 Transport Stream packet */
342 class IBMDStreamingMPEG2TSPacket
: public IUnknown
345 virtual long GetPayloadSize (void) = 0;
346 virtual HRESULT
GetBytes (/* out */ void** buffer
) = 0;
349 virtual ~IBMDStreamingMPEG2TSPacket () {} // call Release method to drop reference count
352 /* Interface IBMDStreamingH264NALParser - For basic NAL parsing */
354 class IBMDStreamingH264NALParser
: public IUnknown
357 virtual HRESULT
IsNALSequenceParameterSet (/* in */ IBMDStreamingH264NALPacket
* nal
) = 0;
358 virtual HRESULT
IsNALPictureParameterSet (/* in */ IBMDStreamingH264NALPacket
* nal
) = 0;
359 virtual HRESULT
GetProfileAndLevelFromSPS (/* in */ IBMDStreamingH264NALPacket
* nal
, /* out */ uint32_t* profileIdc
, /* out */ uint32_t* profileCompatability
, /* out */ uint32_t* levelIdc
) = 0;
362 virtual ~IBMDStreamingH264NALParser () {} // call Release method to drop reference count
369 IBMDStreamingDiscovery
* CreateBMDStreamingDiscoveryInstance (void);
370 IBMDStreamingH264NALParser
* CreateBMDStreamingH264NALParser (void);
375 #endif /* defined(BMD_DECKLINKAPISTREAMING_H) */