vlc | branch: master | Devin Heitmueller <[email protected]> | Fri Sep 7 15:50:56 2018 -0400| [9ff9cfa3c1d58799f0c2d5f701eece6d0b68f8ce] | committer: Marvin Scholz
Decklink: Make input/output modules build on OSX The Decklink SDK has platform-specific implementations for various calls which return strings. Add some portability macros to properly handle those calls and then normalize the result down to a C char * as we would typically see in VLC. Signed-off-by: Devin Heitmueller <[email protected]> > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=9ff9cfa3c1d58799f0c2d5f701eece6d0b68f8ce --- configure.ac | 3 ++ modules/access/decklink.cpp | 33 +++++++++++++++----- modules/access/vlc_decklink.h | 54 +++++++++++++++++++++++++++++++++ modules/stream_out/sdi/DBMSDIOutput.cpp | 11 +++++-- modules/stream_out/sdi/DBMSDIOutput.hpp | 3 +- modules/video_output/decklink.cpp | 20 +++++++++--- 6 files changed, 107 insertions(+), 17 deletions(-) diff --git a/configure.ac b/configure.ac index 09992925b7..054d3d69d4 100644 --- a/configure.ac +++ b/configure.ac @@ -1903,6 +1903,9 @@ then AC_LANG_PUSH([C++]) AC_CHECK_HEADERS([DeckLinkAPIDispatch.cpp], [ have_decklink=yes + AS_IF([test "${SYS}" = "darwin"], [ + VLC_ADD_LIBS([decklink decklinkoutput],[-Wl,-framework,CoreFoundation]) + ]) ], [ AS_IF([test "${enable_decklink}" = "yes"], [ AC_MSG_ERROR([Blackmagic DeckLink SDI include files not found!]) diff --git a/modules/access/decklink.cpp b/modules/access/decklink.cpp index 2e31897f93..e1def76adc 100644 --- a/modules/access/decklink.cpp +++ b/modules/access/decklink.cpp @@ -34,7 +34,7 @@ #include <arpa/inet.h> #endif -#include <DeckLinkAPI.h> +#include "vlc_decklink.h" #include <DeckLinkAPIDispatch.cpp> #include "sdi.h" @@ -261,11 +261,17 @@ public: if( !(events & bmdVideoInputDisplayModeChanged )) return S_OK; - const char *mode_name; - if (mode->GetName(&mode_name) != S_OK) - mode_name = "unknown"; + DECKLINK_STR tmp_name; + char *mode_name; + if (mode->GetName(&tmp_name) != S_OK) { + mode_name = strdup("unknown"); + } else { + mode_name = DECKLINK_STRDUP(tmp_name); + DECKLINK_STRDUP(tmp_name); + } msg_Dbg(demux_, "Video input format changed to %s", mode_name); + free(mode_name); if (!sys->autodetect) { msg_Err(demux_, "Video format detection disabled"); return S_OK; @@ -555,11 +561,17 @@ static int Open(vlc_object_t *p_this) } } - const char *model_name; - if (sys->card->GetModelName(&model_name) != S_OK) - model_name = "unknown"; + DECKLINK_STR tmp_name; + char *model_name; + if (sys->card->GetModelName(&tmp_name) != S_OK) { + model_name = strdup("unknown"); + } else { + model_name = DECKLINK_STRDUP(tmp_name); + DECKLINK_FREE(tmp_name); + } msg_Dbg(demux, "Opened DeckLink PCI card %d (%s)", card_index, model_name); + free(model_name); if (sys->card->QueryInterface(IID_IDeckLinkInput, (void**)&sys->input) != S_OK) { msg_Err(demux, "Card has no inputs"); @@ -636,9 +648,14 @@ static int Open(vlc_object_t *p_this) uint32_t field_flags; const char *field = GetFieldDominance(m->GetFieldDominance(), &field_flags); BMDDisplayMode id = ntohl(m->GetDisplayMode()); + DECKLINK_STR tmp_name; - if (m->GetName(&mode_name) != S_OK) + if (m->GetName(&tmp_name) != S_OK) { mode_name = "unknown"; + } else { + mode_name = DECKLINK_STRDUP(tmp_name); + DECKLINK_FREE(tmp_name); + } if (m->GetFrameRate(&frame_duration, &time_scale) != S_OK) { time_scale = 0; frame_duration = 1; diff --git a/modules/access/vlc_decklink.h b/modules/access/vlc_decklink.h new file mode 100644 index 0000000000..854caf734f --- /dev/null +++ b/modules/access/vlc_decklink.h @@ -0,0 +1,54 @@ +/***************************************************************************** + * vlc_decklink.h: Decklink Common includes + ***************************************************************************** + * Copyright (C) 2018 LTN Global Communications + * + * Authors: Devin Heitmueller <[email protected]> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_DECKLINK_H +#define VLC_DECKLINK_H 1 + +/** + * \file + * This file defines Decklink portability macros and other functions + */ + +#include <DeckLinkAPI.h> + +/* Portability code to deal with differences how the Blackmagic SDK + handles strings on various platforms */ +#ifdef _WIN32 +#error FIXME: Win32 is known to not work for decklink. +#elif defined(__APPLE__) +static char *dup_cfstring_to_utf8(CFStringRef w) +{ + char s[256]; + CFStringGetCString(w, s, 255, kCFStringEncodingUTF8); + return strdup(s); +} +#define DECKLINK_STR const __CFString * +#define DECKLINK_STRDUP dup_cfstring_to_utf8 +#define DECKLINK_FREE(s) CFRelease(s) +#else +#define DECKLINK_STR const char * +#define DECKLINK_STRDUP strdup +#define DECKLINK_FREE(s) free((void *) s) +#endif + +#endif /* VLC_DECKLINK_H */ + diff --git a/modules/stream_out/sdi/DBMSDIOutput.cpp b/modules/stream_out/sdi/DBMSDIOutput.cpp index a95762d774..956ed2a08f 100644 --- a/modules/stream_out/sdi/DBMSDIOutput.cpp +++ b/modules/stream_out/sdi/DBMSDIOutput.cpp @@ -107,11 +107,15 @@ IDeckLinkDisplayMode * DBMSDIOutput::MatchDisplayMode(const video_format_t *fmt, BMDTimeValue frameduration; BMDTimeScale timescale; const char *psz_mode_name; + DECKLINK_STR tmp_name; if(p_mode->GetFrameRate(&frameduration, ×cale) == S_OK && - p_mode->GetName(&psz_mode_name) == S_OK) + p_mode->GetName(&tmp_name) == S_OK) { BMDDisplayMode modenl = htonl(mode_id); + psz_mode_name = DECKLINK_STRDUP(tmp_name); + DECKLINK_FREE(tmp_name); + if(i==0) { BMDFieldDominance field = htonl(p_mode->GetFieldDominance()); @@ -239,9 +243,12 @@ int DBMSDIOutput::Open() CHECK("Card not found"); } + DECKLINK_STR tmp_name; const char *psz_model_name; - result = p_card->GetModelName(&psz_model_name); + result = p_card->GetModelName(&tmp_name); CHECK("Unknown model name"); + psz_model_name = DECKLINK_STRDUP(tmp_name); + DECKLINK_FREE(tmp_name); msg_Dbg(p_stream, "Opened DeckLink PCI card %s", psz_model_name); diff --git a/modules/stream_out/sdi/DBMSDIOutput.hpp b/modules/stream_out/sdi/DBMSDIOutput.hpp index 13a65fd29f..95fe8bf9ce 100644 --- a/modules/stream_out/sdi/DBMSDIOutput.hpp +++ b/modules/stream_out/sdi/DBMSDIOutput.hpp @@ -24,8 +24,7 @@ #include "SDIOutput.hpp" #include <vlc_es.h> - -#include <DeckLinkAPI.h> +#include "../../access/vlc_decklink.h" namespace sdi_sout { diff --git a/modules/video_output/decklink.cpp b/modules/video_output/decklink.cpp index 1e20c78d30..a0b29606d1 100644 --- a/modules/video_output/decklink.cpp +++ b/modules/video_output/decklink.cpp @@ -43,11 +43,12 @@ #include <vlc_block.h> #include <vlc_image.h> #include <vlc_aout.h> + #ifdef HAVE_ARPA_INET_H #include <arpa/inet.h> #endif -#include <DeckLinkAPI.h> +#include "../access/vlc_decklink.h" #include <DeckLinkAPIDispatch.cpp> #define FRAME_SIZE 1920 @@ -490,12 +491,16 @@ static IDeckLinkDisplayMode * MatchDisplayMode(vout_display_t *vd, BMDDisplayMode mode_id = p_mode->GetDisplayMode(); BMDTimeValue frameduration; BMDTimeScale timescale; - const char *psz_mode_name; + char *psz_mode_name; + DECKLINK_STR tmp_name; if(p_mode->GetFrameRate(&frameduration, ×cale) == S_OK && - p_mode->GetName(&psz_mode_name) == S_OK) + p_mode->GetName(&tmp_name) == S_OK) { BMDDisplayMode modenl = htonl(mode_id); + psz_mode_name = DECKLINK_STRDUP(tmp_name); + DECKLINK_FREE(tmp_name); + if(i==0) { BMDFieldDominance field = htonl(p_mode->GetFieldDominance()); @@ -506,6 +511,7 @@ static IDeckLinkDisplayMode * MatchDisplayMode(vout_display_t *vd, double(timescale) / frameduration, timescale, frameduration); } + free(psz_mode_name); } else { @@ -620,11 +626,15 @@ static int OpenDecklink(vout_display_t *vd, decklink_sys_t *sys) CHECK("Card not found"); } - const char *psz_model_name; - result = p_card->GetModelName(&psz_model_name); + DECKLINK_STR tmp_name; + char *psz_model_name; + result = p_card->GetModelName(&tmp_name); CHECK("Unknown model name"); + psz_model_name = DECKLINK_STRDUP(tmp_name); + DECKLINK_FREE(tmp_name); msg_Dbg(vd, "Opened DeckLink PCI card %s", psz_model_name); + free(psz_model_name); /* Read attributes */ _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
