| /* -LICENSE-START- |
| ** Copyright (c) 2009 Blackmagic Design |
| ** |
| ** Permission is hereby granted, free of charge, to any person or organization |
| ** obtaining a copy of the software and accompanying documentation covered by |
| ** this license (the "Software") to use, reproduce, display, distribute, |
| ** execute, and transmit the Software, and to prepare derivative works of the |
| ** Software, and to permit third-parties to whom the Software is furnished to |
| ** do so, all subject to the following: |
| ** |
| ** The copyright notices in the Software and this entire statement, including |
| ** the above license grant, this restriction and the following disclaimer, |
| ** must be included in all copies of the Software, in whole or in part, and |
| ** all derivative works of the Software, unless such copies or derivative |
| ** works are solely in the form of machine-executable object code generated by |
| ** a source language processor. |
| ** |
| ** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
| ** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
| ** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT |
| ** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE |
| ** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, |
| ** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
| ** DEALINGS IN THE SOFTWARE. |
| ** -LICENSE-END- |
| **/ |
| |
| #include <stdio.h> |
| #include <pthread.h> |
| #include <dlfcn.h> |
| |
| #include "DeckLinkAPI.h" |
| |
| #define kDeckLinkAPI_Name "libDeckLinkAPI.so" |
| #define KDeckLinkPreviewAPI_Name "libDeckLinkPreviewAPI.so" |
| |
| typedef IDeckLinkIterator *(*CreateIteratorFunc) (void); |
| typedef IDeckLinkAPIInformation *(*CreateAPIInformationFunc) (void); |
| typedef IDeckLinkGLScreenPreviewHelper |
| *(*CreateOpenGLScreenPreviewHelperFunc) (void); |
| typedef IDeckLinkVideoConversion *(*CreateVideoConversionInstanceFunc) (void); |
| |
| static pthread_once_t gDeckLinkOnceControl = PTHREAD_ONCE_INIT; |
| static pthread_once_t gPreviewOnceControl = PTHREAD_ONCE_INIT; |
| |
| static bool gLoadedDeckLinkAPI = false; |
| |
| static CreateIteratorFunc gCreateIteratorFunc = NULL; |
| static CreateAPIInformationFunc gCreateAPIInformationFunc = NULL; |
| static CreateOpenGLScreenPreviewHelperFunc gCreateOpenGLPreviewFunc = NULL; |
| static CreateVideoConversionInstanceFunc gCreateVideoConversionFunc = NULL; |
| |
| void InitDeckLinkAPI (void); |
| void |
| InitDeckLinkAPI (void) |
| { |
| void *libraryHandle; |
| |
| libraryHandle = dlopen (kDeckLinkAPI_Name, RTLD_NOW | RTLD_GLOBAL); |
| if (!libraryHandle) { |
| fprintf (stderr, "%s\n", dlerror ()); |
| return; |
| } |
| |
| gLoadedDeckLinkAPI = true; |
| |
| gCreateIteratorFunc = |
| (CreateIteratorFunc) dlsym (libraryHandle, |
| "CreateDeckLinkIteratorInstance_0001"); |
| if (!gCreateIteratorFunc) |
| fprintf (stderr, "%s\n", dlerror ()); |
| gCreateAPIInformationFunc = |
| (CreateAPIInformationFunc) dlsym (libraryHandle, |
| "CreateDeckLinkAPIInformationInstance_0001"); |
| if (!gCreateAPIInformationFunc) |
| fprintf (stderr, "%s\n", dlerror ()); |
| gCreateVideoConversionFunc = |
| (CreateVideoConversionInstanceFunc) dlsym (libraryHandle, |
| "CreateVideoConversionInstance_0001"); |
| if (!gCreateVideoConversionFunc) |
| fprintf (stderr, "%s\n", dlerror ()); |
| } |
| |
| void InitDeckLinkPreviewAPI (void); |
| void |
| InitDeckLinkPreviewAPI (void) |
| { |
| void *libraryHandle; |
| |
| libraryHandle = dlopen (KDeckLinkPreviewAPI_Name, RTLD_NOW | RTLD_GLOBAL); |
| if (!libraryHandle) { |
| fprintf (stderr, "%s\n", dlerror ()); |
| return; |
| } |
| gCreateOpenGLPreviewFunc = |
| (CreateOpenGLScreenPreviewHelperFunc) dlsym (libraryHandle, |
| "CreateOpenGLScreenPreviewHelper_0001"); |
| if (!gCreateOpenGLPreviewFunc) |
| fprintf (stderr, "%s\n", dlerror ()); |
| } |
| |
| bool IsDeckLinkAPIPresent (void); |
| bool |
| IsDeckLinkAPIPresent (void) |
| { |
| // If the DeckLink API dynamic library was successfully loaded, return this knowledge to the caller |
| return gLoadedDeckLinkAPI; |
| } |
| |
| IDeckLinkIterator * |
| CreateDeckLinkIteratorInstance (void) |
| { |
| pthread_once (&gDeckLinkOnceControl, InitDeckLinkAPI); |
| |
| if (gCreateIteratorFunc == NULL) |
| return NULL; |
| return gCreateIteratorFunc (); |
| } |
| |
| IDeckLinkAPIInformation * |
| CreateDeckLinkAPIInformationInstance (void) |
| { |
| pthread_once (&gDeckLinkOnceControl, InitDeckLinkAPI); |
| |
| if (gCreateAPIInformationFunc == NULL) |
| return NULL; |
| return gCreateAPIInformationFunc (); |
| } |
| |
| IDeckLinkGLScreenPreviewHelper * |
| CreateOpenGLScreenPreviewHelper (void) |
| { |
| pthread_once (&gDeckLinkOnceControl, InitDeckLinkAPI); |
| pthread_once (&gPreviewOnceControl, InitDeckLinkPreviewAPI); |
| |
| if (gCreateOpenGLPreviewFunc == NULL) |
| return NULL; |
| return gCreateOpenGLPreviewFunc (); |
| } |
| |
| IDeckLinkVideoConversion * |
| CreateVideoConversionInstance (void) |
| { |
| pthread_once (&gDeckLinkOnceControl, InitDeckLinkAPI); |
| |
| if (gCreateVideoConversionFunc == NULL) |
| return NULL; |
| return gCreateVideoConversionFunc (); |
| } |