]> git.sesse.net Git - nageru/blob - nageru/decklink/DeckLinkAPIDispatch.cpp
Release Nageru 1.7.5.
[nageru] / nageru / decklink / DeckLinkAPIDispatch.cpp
1 /* -LICENSE-START-
2 ** Copyright (c) 2009 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 #include <stdio.h>
29 #include <pthread.h>
30 #include <dlfcn.h>
31
32 #include "DeckLinkAPI.h"
33
34 #define kDeckLinkAPI_Name "libDeckLinkAPI.so"
35 #define KDeckLinkPreviewAPI_Name "libDeckLinkPreviewAPI.so"
36
37 typedef IDeckLinkIterator* (*CreateIteratorFunc)(void);
38 typedef IDeckLinkAPIInformation* (*CreateAPIInformationFunc)(void);
39 typedef IDeckLinkGLScreenPreviewHelper* (*CreateOpenGLScreenPreviewHelperFunc)(void);
40 typedef IDeckLinkVideoConversion* (*CreateVideoConversionInstanceFunc)(void);
41 typedef IDeckLinkDiscovery* (*CreateDeckLinkDiscoveryInstanceFunc)(void);
42
43 static pthread_once_t                                   gDeckLinkOnceControl = PTHREAD_ONCE_INIT;
44 static pthread_once_t                                   gPreviewOnceControl = PTHREAD_ONCE_INIT;
45
46 static bool                                                             gLoadedDeckLinkAPI = false;
47
48 static CreateIteratorFunc                                       gCreateIteratorFunc = NULL;
49 static CreateAPIInformationFunc                         gCreateAPIInformationFunc = NULL;
50 static CreateOpenGLScreenPreviewHelperFunc      gCreateOpenGLPreviewFunc = NULL;
51 static CreateVideoConversionInstanceFunc        gCreateVideoConversionFunc      = NULL;
52 static CreateDeckLinkDiscoveryInstanceFunc      gCreateDeckLinkDiscoveryFunc = NULL;
53
54 void    InitDeckLinkAPI (void)
55 {
56         void *libraryHandle;
57         
58         libraryHandle = dlopen(kDeckLinkAPI_Name, RTLD_NOW|RTLD_GLOBAL);
59         if (!libraryHandle)
60         {
61                 fprintf(stderr, "%s\n", dlerror());
62                 return;
63         }
64         
65         gLoadedDeckLinkAPI = true;
66         
67         gCreateIteratorFunc = (CreateIteratorFunc)dlsym(libraryHandle, "CreateDeckLinkIteratorInstance_0002");
68         if (!gCreateIteratorFunc)
69                 fprintf(stderr, "%s\n", dlerror());
70         gCreateAPIInformationFunc = (CreateAPIInformationFunc)dlsym(libraryHandle, "CreateDeckLinkAPIInformationInstance_0001");
71         if (!gCreateAPIInformationFunc)
72                 fprintf(stderr, "%s\n", dlerror());
73         gCreateVideoConversionFunc = (CreateVideoConversionInstanceFunc)dlsym(libraryHandle, "CreateVideoConversionInstance_0001");
74         if (!gCreateVideoConversionFunc)
75                 fprintf(stderr, "%s\n", dlerror());
76         gCreateDeckLinkDiscoveryFunc = (CreateDeckLinkDiscoveryInstanceFunc)dlsym(libraryHandle, "CreateDeckLinkDiscoveryInstance_0001");
77         if (!gCreateDeckLinkDiscoveryFunc)
78                 fprintf(stderr, "%s\n", dlerror());
79 }
80
81 void    InitDeckLinkPreviewAPI (void)
82 {
83         void *libraryHandle;
84         
85         libraryHandle = dlopen(KDeckLinkPreviewAPI_Name, RTLD_NOW|RTLD_GLOBAL);
86         if (!libraryHandle)
87         {
88                 fprintf(stderr, "%s\n", dlerror());
89                 return;
90         }
91         gCreateOpenGLPreviewFunc = (CreateOpenGLScreenPreviewHelperFunc)dlsym(libraryHandle, "CreateOpenGLScreenPreviewHelper_0001");
92         if (!gCreateOpenGLPreviewFunc)
93                 fprintf(stderr, "%s\n", dlerror());
94 }
95
96 bool            IsDeckLinkAPIPresent (void)
97 {
98         // If the DeckLink API dynamic library was successfully loaded, return this knowledge to the caller
99         return gLoadedDeckLinkAPI;
100 }
101
102 IDeckLinkIterator*              CreateDeckLinkIteratorInstance (void)
103 {
104         pthread_once(&gDeckLinkOnceControl, InitDeckLinkAPI);
105         
106         if (gCreateIteratorFunc == NULL)
107                 return NULL;
108         return gCreateIteratorFunc();
109 }
110
111 IDeckLinkAPIInformation*        CreateDeckLinkAPIInformationInstance (void)
112 {
113         pthread_once(&gDeckLinkOnceControl, InitDeckLinkAPI);
114         
115         if (gCreateAPIInformationFunc == NULL)
116                 return NULL;
117         return gCreateAPIInformationFunc();
118 }
119
120 IDeckLinkGLScreenPreviewHelper*         CreateOpenGLScreenPreviewHelper (void)
121 {
122         pthread_once(&gDeckLinkOnceControl, InitDeckLinkAPI);
123         pthread_once(&gPreviewOnceControl, InitDeckLinkPreviewAPI);
124         
125         if (gCreateOpenGLPreviewFunc == NULL)
126                 return NULL;
127         return gCreateOpenGLPreviewFunc();
128 }
129
130 IDeckLinkVideoConversion* CreateVideoConversionInstance (void)
131 {
132         pthread_once(&gDeckLinkOnceControl, InitDeckLinkAPI);
133         
134         if (gCreateVideoConversionFunc == NULL)
135                 return NULL;
136         return gCreateVideoConversionFunc();
137 }
138
139 IDeckLinkDiscovery* CreateDeckLinkDiscoveryInstance (void)
140 {
141         pthread_once(&gDeckLinkOnceControl, InitDeckLinkAPI);
142         
143         if (gCreateDeckLinkDiscoveryFunc == NULL)
144                 return NULL;
145         return gCreateDeckLinkDiscoveryFunc();
146 }