FFmpeg
Loading...
Searching...
No Matches
decklink_common.h
Go to the documentation of this file.
1/*
2 * Blackmagic DeckLink common code
3 * Copyright (c) 2013-2014 Ramiro Polla, Luca Barbato, Deti Fliegl
4 * Copyright (c) 2017 Akamai Technologies, Inc.
5 *
6 * This file is part of FFmpeg.
7 *
8 * FFmpeg is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
12 *
13 * FFmpeg is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
17 *
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with FFmpeg; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 */
22
23#ifndef AVDEVICE_DECKLINK_COMMON_H
24#define AVDEVICE_DECKLINK_COMMON_H
25
26#include <DeckLinkAPIVersion.h>
27#if BLACKMAGIC_DECKLINK_API_VERSION < 0x0b000000
28#define IID_IDeckLinkProfileAttributes IID_IDeckLinkAttributes
29#define IDeckLinkProfileAttributes IDeckLinkAttributes
30#endif
31
32#if BLACKMAGIC_DECKLINK_API_VERSION < 0x0e030000
33#define IDeckLinkInput_v14_2_1 IDeckLinkInput
34#define IDeckLinkInputCallback_v14_2_1 IDeckLinkInputCallback
35#define IDeckLinkMemoryAllocator_v14_2_1 IDeckLinkMemoryAllocator
36#define IDeckLinkOutput_v14_2_1 IDeckLinkOutput
37#define IDeckLinkVideoFrame_v14_2_1 IDeckLinkVideoFrame
38#define IDeckLinkVideoInputFrame_v14_2_1 IDeckLinkVideoInputFrame
39#define IDeckLinkVideoOutputCallback_v14_2_1 IDeckLinkVideoOutputCallback
40#define IID_IDeckLinkInput_v14_2_1 IID_IDeckLinkInput
41#define IID_IDeckLinkInputCallback_v14_2_1 IID_IDeckLinkInputCallback
42#define IID_IDeckLinkMemoryAllocator_v14_2_1 IID_IDeckLinkMemoryAllocator
43#define IID_IDeckLinkOutput_v14_2_1 IID_IDeckLinkOutput
44#define IID_IDeckLinkVideoFrame_v14_2_1 IID_IDeckLinkVideoFrame
45#define IID_IDeckLinkVideoInputFrame_v14_2_1 IID_IDeckLinkVideoInputFrame
46#define IID_IDeckLinkVideoOutputCallback_v14_2_1 IID_IDeckLinkVideoOutputCallback
47#endif
48
49extern "C" {
50#include "libavutil/mem.h"
52#include "libavfilter/ccfifo.h"
53}
54#include "libavutil/thread.h"
55#include "decklink_common_c.h"
56#if CONFIG_LIBKLVANC
57#include "libklvanc/vanc.h"
58#endif
59
60#ifdef _WIN32
61#define DECKLINK_BOOL BOOL
62#else
63#define DECKLINK_BOOL bool
64#endif
65
66#ifdef _WIN32
67static char *dup_wchar_to_utf8(wchar_t *w)
68{
69 char *s = NULL;
70 int l = WideCharToMultiByte(CP_UTF8, 0, w, -1, 0, 0, 0, 0);
71 s = (char *) av_malloc(l);
72 if (s)
73 WideCharToMultiByte(CP_UTF8, 0, w, -1, s, l, 0, 0);
74 return s;
75}
76#define DECKLINK_STR OLECHAR *
77#define DECKLINK_STRDUP dup_wchar_to_utf8
78#define DECKLINK_FREE(s) SysFreeString(s)
79#elif defined(__APPLE__)
80static char *dup_cfstring_to_utf8(CFStringRef w)
81{
82 char s[256];
83 CFStringGetCString(w, s, 255, kCFStringEncodingUTF8);
84 return av_strdup(s);
85}
86#define DECKLINK_STR const __CFString *
87#define DECKLINK_STRDUP dup_cfstring_to_utf8
88#define DECKLINK_FREE(s) CFRelease(s)
89#else
90#define DECKLINK_STR const char *
91#define DECKLINK_STRDUP av_strdup
92/* free() is needed for a string returned by the DeckLink SDL. */
93#define DECKLINK_FREE(s) free((void *) s)
94#endif
95
96#ifdef _WIN32
97#include <guiddef.h> // REFIID, IsEqualIID()
98#define DECKLINK_IsEqualIID IsEqualIID
99#else
100static inline bool DECKLINK_IsEqualIID(const REFIID& riid1, const REFIID& riid2)
101{
102 return memcmp(&riid1, &riid2, sizeof(REFIID)) == 0;
103}
104#endif
105
108
119
121 /* DeckLink SDK interfaces */
122 IDeckLink *dl;
125 IDeckLinkConfiguration *cfg;
128
129 /* DeckLink mode information */
130 BMDTimeValue bmd_tb_den;
131 BMDTimeValue bmd_tb_num;
132 BMDDisplayMode bmd_mode;
133 BMDVideoConnection video_input;
134 BMDAudioConnection audio_input;
135 BMDTimecodeFormat tc_format;
140
141 /* Capture buffer queue */
143
144 CCFifo cc_fifo; ///< closed captions
145
146 /* Output VANC queue */
148
149 /* Streams present */
150 int audio;
151 int video;
152
153 /* Status */
157 unsigned long frameCount;
158 unsigned int dropped;
164
165 /* Options */
170 double preroll;
172 BMDLinkConfiguration link;
176 BMDPixelFormat raw_format;
178
181
186
187#if CONFIG_LIBKLVANC
188 struct klvanc_context_s *vanc_ctx;
189#endif
190
193 unsigned long tc_seen; // used with option wait_for_tc
194};
195
197
198static const BMDPixelFormat decklink_raw_format_map[] = {
199 (BMDPixelFormat)0,
200 bmdFormat8BitYUV,
201 bmdFormat10BitYUV,
202 bmdFormat8BitARGB,
203 bmdFormat8BitBGRA,
204 bmdFormat10BitRGB,
205};
206
207static const BMDAudioConnection decklink_audio_connection_map[] = {
208 (BMDAudioConnection)0,
209 bmdAudioConnectionEmbedded,
210 bmdAudioConnectionAESEBU,
211 bmdAudioConnectionAnalog,
212 bmdAudioConnectionAnalogXLR,
213 bmdAudioConnectionAnalogRCA,
214 bmdAudioConnectionMicrophone,
215};
216
217static const BMDVideoConnection decklink_video_connection_map[] = {
218 (BMDVideoConnection)0,
219 bmdVideoConnectionSDI,
220 bmdVideoConnectionHDMI,
221 bmdVideoConnectionOpticalSDI,
222 bmdVideoConnectionComponent,
223 bmdVideoConnectionComposite,
224 bmdVideoConnectionSVideo,
225};
226
227static const BMDTimecodeFormat decklink_timecode_format_map[] = {
228 (BMDTimecodeFormat)0,
229 bmdTimecodeRP188VITC1,
230 bmdTimecodeRP188VITC2,
231 bmdTimecodeRP188LTC,
232 bmdTimecodeRP188Any,
233 bmdTimecodeVITC,
234 bmdTimecodeVITCField2,
235 bmdTimecodeSerial,
236#if BLACKMAGIC_DECKLINK_API_VERSION >= 0x0b000000
237 bmdTimecodeRP188HighFrameRate,
238#else
239 (BMDTimecodeFormat)0,
240#endif
241};
242
243static const BMDLinkConfiguration decklink_link_conf_map[] = {
244 (BMDLinkConfiguration)0,
245 bmdLinkConfigurationSingleLink,
246 bmdLinkConfigurationDualLink,
247 bmdLinkConfigurationQuadLink
248};
249
250#if BLACKMAGIC_DECKLINK_API_VERSION >= 0x0b000000
251static const BMDProfileID decklink_profile_id_map[] = {
252 (BMDProfileID)0,
253 bmdProfileTwoSubDevicesHalfDuplex,
254 bmdProfileOneSubDeviceFullDuplex,
255 bmdProfileOneSubDeviceHalfDuplex,
256 bmdProfileTwoSubDevicesFullDuplex,
257 bmdProfileFourSubDevicesHalfDuplex,
258};
259#endif
260
262int ff_decklink_set_format(AVFormatContext *avctx, int width, int height, int tb_num, int tb_den, enum AVFieldOrder field_order, decklink_direction_t direction = DIRECTION_OUT);
264int ff_decklink_list_devices(AVFormatContext *avctx, struct AVDeviceInfoList *device_list, int show_inputs, int show_outputs);
265void ff_decklink_list_devices_legacy(AVFormatContext *avctx, int show_inputs, int show_outputs);
268int ff_decklink_init_device(AVFormatContext *avctx, const char* name);
269
277
278#endif /* AVDEVICE_DECKLINK_COMMON_H */
#define s(width, name)
Definition cbs_vp9.c:198
CC FIFO Buffer.
#define NULL
Definition coverity.c:32
long long int64_t
Definition coverity.c:34
static int16_t block[64]
Definition dct.c:125
AVFieldOrder
Definition defs.h:211
static AVPacket * pkt
static char * dup_wchar_to_utf8(wchar_t *w)
Definition dshow.c:313
uint8_t w
Definition llvidencdsp.c:39
Memory handling functions.
#define av_strdup(s)
Definition ops_static.c:55
#define av_malloc(s)
Definition ops_static.c:52
_fmutex pthread_mutex_t
Definition os2threads.h:53
const char * name
Definition qsvenc.c:142
List of devices.
Definition avdevice.h:343
Format I/O context.
Definition avformat.h:1333
This structure stores compressed data.
Definition packet.h:580
Stream structure.
Definition avformat.h:766
pthread_mutex_t mutex
unsigned long long size
AVFormatContext * avctx
#define height
Definition dsp.h:89
#define width
Definition dsp.h:89