Home | History | Annotate | Download | only in include
      1 /* -LICENSE-START-
      2 ** Copyright (c) 2014 Blackmagic Design
      3 **
      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:
     10 **
     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.
     17 **
     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.
     25 ** -LICENSE-END-
     26 */
     27 
     28 #ifndef BMD_DECKLINKAPISTREAMING_H
     29 #define BMD_DECKLINKAPISTREAMING_H
     30 
     31 
     32 #ifndef BMD_CONST
     33     #if defined(_MSC_VER)
     34         #define BMD_CONST __declspec(selectany) static const
     35     #else
     36         #define BMD_CONST static const
     37     #endif
     38 #endif
     39 
     40 // Type Declarations
     41 
     42 
     43 // Interface ID Declarations
     44 
     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};
     56 
     57 /* Enum BMDStreamingDeviceMode - Device modes */
     58 
     59 typedef uint32_t BMDStreamingDeviceMode;
     60 enum _BMDStreamingDeviceMode {
     61     bmdStreamingDeviceIdle                                       = 'idle',
     62     bmdStreamingDeviceEncoding                                   = 'enco',
     63     bmdStreamingDeviceStopping                                   = 'stop',
     64     bmdStreamingDeviceUnknown                                    = 'munk'
     65 };
     66 
     67 /* Enum BMDStreamingEncodingFrameRate - Encoded frame rates */
     68 
     69 typedef uint32_t BMDStreamingEncodingFrameRate;
     70 enum _BMDStreamingEncodingFrameRate {
     71 
     72     /* Interlaced rates */
     73 
     74     bmdStreamingEncodedFrameRate50i                              = 'e50i',
     75     bmdStreamingEncodedFrameRate5994i                            = 'e59i',
     76     bmdStreamingEncodedFrameRate60i                              = 'e60i',
     77 
     78     /* Progressive rates */
     79 
     80     bmdStreamingEncodedFrameRate2398p                            = 'e23p',
     81     bmdStreamingEncodedFrameRate24p                              = 'e24p',
     82     bmdStreamingEncodedFrameRate25p                              = 'e25p',
     83     bmdStreamingEncodedFrameRate2997p                            = 'e29p',
     84     bmdStreamingEncodedFrameRate30p                              = 'e30p',
     85     bmdStreamingEncodedFrameRate50p                              = 'e50p',
     86     bmdStreamingEncodedFrameRate5994p                            = 'e59p',
     87     bmdStreamingEncodedFrameRate60p                              = 'e60p'
     88 };
     89 
     90 /* Enum BMDStreamingEncodingSupport - Output encoding mode supported flag */
     91 
     92 typedef uint32_t BMDStreamingEncodingSupport;
     93 enum _BMDStreamingEncodingSupport {
     94     bmdStreamingEncodingModeNotSupported                         = 0,
     95     bmdStreamingEncodingModeSupported,
     96     bmdStreamingEncodingModeSupportedWithChanges
     97 };
     98 
     99 /* Enum BMDStreamingVideoCodec - Video codecs */
    100 
    101 typedef uint32_t BMDStreamingVideoCodec;
    102 enum _BMDStreamingVideoCodec {
    103     bmdStreamingVideoCodecH264                                   = 'H264'
    104 };
    105 
    106 /* Enum BMDStreamingH264Profile - H264 encoding profile */
    107 
    108 typedef uint32_t BMDStreamingH264Profile;
    109 enum _BMDStreamingH264Profile {
    110     bmdStreamingH264ProfileHigh                                  = 'high',
    111     bmdStreamingH264ProfileMain                                  = 'main',
    112     bmdStreamingH264ProfileBaseline                              = 'base'
    113 };
    114 
    115 /* Enum BMDStreamingH264Level - H264 encoding level */
    116 
    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'
    130 };
    131 
    132 /* Enum BMDStreamingH264EntropyCoding - H264 entropy coding */
    133 
    134 typedef uint32_t BMDStreamingH264EntropyCoding;
    135 enum _BMDStreamingH264EntropyCoding {
    136     bmdStreamingH264EntropyCodingCAVLC                           = 'EVLC',
    137     bmdStreamingH264EntropyCodingCABAC                           = 'EBAC'
    138 };
    139 
    140 /* Enum BMDStreamingAudioCodec - Audio codecs */
    141 
    142 typedef uint32_t BMDStreamingAudioCodec;
    143 enum _BMDStreamingAudioCodec {
    144     bmdStreamingAudioCodecAAC                                    = 'AAC '
    145 };
    146 
    147 /* Enum BMDStreamingEncodingModePropertyID - Encoding mode properties */
    148 
    149 typedef uint32_t BMDStreamingEncodingModePropertyID;
    150 enum _BMDStreamingEncodingModePropertyID {
    151 
    152     /* Integers, Video Properties */
    153 
    154     bmdStreamingEncodingPropertyVideoFrameRate                   = 'vfrt',	// Uses values of type BMDStreamingEncodingFrameRate
    155     bmdStreamingEncodingPropertyVideoBitRateKbps                 = 'vbrt',
    156 
    157     /* Integers, H264 Properties */
    158 
    159     bmdStreamingEncodingPropertyH264Profile                      = 'hprf',
    160     bmdStreamingEncodingPropertyH264Level                        = 'hlvl',
    161     bmdStreamingEncodingPropertyH264EntropyCoding                = 'hent',
    162 
    163     /* Flags, H264 Properties */
    164 
    165     bmdStreamingEncodingPropertyH264HasBFrames                   = 'hBfr',
    166 
    167     /* Integers, Audio Properties */
    168 
    169     bmdStreamingEncodingPropertyAudioCodec                       = 'acdc',
    170     bmdStreamingEncodingPropertyAudioSampleRate                  = 'asrt',
    171     bmdStreamingEncodingPropertyAudioChannelCount                = 'achc',
    172     bmdStreamingEncodingPropertyAudioBitRateKbps                 = 'abrt'
    173 };
    174 
    175 // Forward Declarations
    176 
    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;
    188 
    189 /* Interface IBMDStreamingDeviceNotificationCallback - Device notification callbacks. */
    190 
    191 class IBMDStreamingDeviceNotificationCallback : public IUnknown
    192 {
    193 public:
    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;
    197 
    198 protected:
    199     virtual ~IBMDStreamingDeviceNotificationCallback () {}; // call Release method to drop reference count
    200 };
    201 
    202 /* Interface IBMDStreamingH264InputCallback - H264 input callbacks. */
    203 
    204 class IBMDStreamingH264InputCallback : public IUnknown
    205 {
    206 public:
    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;
    213 
    214 protected:
    215     virtual ~IBMDStreamingH264InputCallback () {}; // call Release method to drop reference count
    216 };
    217 
    218 /* Interface IBMDStreamingDiscovery - Installs device notifications */
    219 
    220 class IBMDStreamingDiscovery : public IUnknown
    221 {
    222 public:
    223     virtual HRESULT InstallDeviceNotifications (/* in */ IBMDStreamingDeviceNotificationCallback* theCallback) = 0;
    224     virtual HRESULT UninstallDeviceNotifications (void) = 0;
    225 
    226 protected:
    227     virtual ~IBMDStreamingDiscovery () {}; // call Release method to drop reference count
    228 };
    229 
    230 /* Interface IBMDStreamingVideoEncodingMode - Represents an encoded video mode. */
    231 
    232 class IBMDStreamingVideoEncodingMode : public IUnknown
    233 {
    234 public:
    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
    248 
    249 protected:
    250     virtual ~IBMDStreamingVideoEncodingMode () {}; // call Release method to drop reference count
    251 };
    252 
    253 /* Interface IBMDStreamingMutableVideoEncodingMode - Represents a mutable encoded video mode. */
    254 
    255 class IBMDStreamingMutableVideoEncodingMode : public IBMDStreamingVideoEncodingMode
    256 {
    257 public:
    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;
    264 
    265 protected:
    266     virtual ~IBMDStreamingMutableVideoEncodingMode () {}; // call Release method to drop reference count
    267 };
    268 
    269 /* Interface IBMDStreamingVideoEncodingModePresetIterator - Enumerates encoding mode presets */
    270 
    271 class IBMDStreamingVideoEncodingModePresetIterator : public IUnknown
    272 {
    273 public:
    274     virtual HRESULT Next (/* out */ IBMDStreamingVideoEncodingMode** videoEncodingMode) = 0;
    275 
    276 protected:
    277     virtual ~IBMDStreamingVideoEncodingModePresetIterator () {}; // call Release method to drop reference count
    278 };
    279 
    280 /* Interface IBMDStreamingDeviceInput - Created by QueryInterface from IDeckLink */
    281 
    282 class IBMDStreamingDeviceInput : public IUnknown
    283 {
    284 public:
    285 
    286     /* Input modes */
    287 
    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;
    292 
    293     /* Capture modes */
    294 
    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;
    299 
    300     /* Input control */
    301 
    302     virtual HRESULT StartCapture (void) = 0;
    303     virtual HRESULT StopCapture (void) = 0;
    304     virtual HRESULT SetCallback (/* in */ IUnknown* theCallback) = 0;
    305 
    306 protected:
    307     virtual ~IBMDStreamingDeviceInput () {}; // call Release method to drop reference count
    308 };
    309 
    310 /* Interface IBMDStreamingH264NALPacket - Represent an H.264 NAL packet */
    311 
    312 class IBMDStreamingH264NALPacket : public IUnknown
    313 {
    314 public:
    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
    320 
    321 protected:
    322     virtual ~IBMDStreamingH264NALPacket () {}; // call Release method to drop reference count
    323 };
    324 
    325 /* Interface IBMDStreamingAudioPacket - Represents a chunk of audio data */
    326 
    327 class IBMDStreamingAudioPacket : public IUnknown
    328 {
    329 public:
    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
    335 
    336 protected:
    337     virtual ~IBMDStreamingAudioPacket () {}; // call Release method to drop reference count
    338 };
    339 
    340 /* Interface IBMDStreamingMPEG2TSPacket - Represent an MPEG2 Transport Stream packet */
    341 
    342 class IBMDStreamingMPEG2TSPacket : public IUnknown
    343 {
    344 public:
    345     virtual long GetPayloadSize (void) = 0;
    346     virtual HRESULT GetBytes (/* out */ void** buffer) = 0;
    347 
    348 protected:
    349     virtual ~IBMDStreamingMPEG2TSPacket () {}; // call Release method to drop reference count
    350 };
    351 
    352 /* Interface IBMDStreamingH264NALParser - For basic NAL parsing */
    353 
    354 class IBMDStreamingH264NALParser : public IUnknown
    355 {
    356 public:
    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;
    360 
    361 protected:
    362     virtual ~IBMDStreamingH264NALParser () {}; // call Release method to drop reference count
    363 };
    364 
    365 /* Functions */
    366 
    367 extern "C" {
    368 
    369     IBMDStreamingDiscovery* CreateBMDStreamingDiscoveryInstance (void);
    370     IBMDStreamingH264NALParser* CreateBMDStreamingH264NALParser (void);
    371 
    372 };
    373 
    374 
    375 #endif /* defined(BMD_DECKLINKAPISTREAMING_H) */
    376