From 39785a6058b3fb0067d55a83b57280a67fdfd6d9 Mon Sep 17 00:00:00 2001 From: Martin Pulec Date: Tue, 22 Mar 2022 10:28:35 +0100 Subject: [PATCH] BMD: implement get_bmd_api_str_from_cstr abstraction --- src/blackmagic_common.cpp | 16 ++++++++++++++++ src/blackmagic_common.h | 1 + src/video_display/decklink.cpp | 12 ++---------- 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/src/blackmagic_common.cpp b/src/blackmagic_common.cpp index 171b171fc..d67dc28cf 100644 --- a/src/blackmagic_common.cpp +++ b/src/blackmagic_common.cpp @@ -97,6 +97,22 @@ char *get_cstr_from_bmd_api_str(BMD_STR bmd_string) return cstr; } +BMD_STR get_bmd_api_str_from_cstr(const char *cstr) +{ +#ifdef __APPLE__ + return CFStringCreateWithCString(kCFAllocatorMalloc, cstr, kCFStringEncodingUTF8); +#elif defined _WIN32 + mbstate_t mbstate{}; + const char *tmp = cstr; + size_t required_size = mbsrtowcs(NULL, &tmp, 0, &mbstate) + 1; + BMD_STR out = (wchar_t *) malloc(required_size * sizeof(wchar_t)); + mbsrtowcs(out, &tmp, required_size, &mbstate); + return out; +#else + return strdup(cstr); +#endif +} + void release_bmd_api_str(BMD_STR string) { #ifdef HAVE_MACOSX diff --git a/src/blackmagic_common.h b/src/blackmagic_common.h index cfc8e81bb..73ca3f6cd 100644 --- a/src/blackmagic_common.h +++ b/src/blackmagic_common.h @@ -91,6 +91,7 @@ static std::vector> uv_to_bmd_codec_map = { #define BMD_STR const char * #endif char *get_cstr_from_bmd_api_str(BMD_STR string); +BMD_STR get_bmd_api_str_from_cstr(const char *cstr); void release_bmd_api_str(BMD_STR string); IDeckLinkIterator *create_decklink_iterator(bool verbose = true, bool coinit = true); diff --git a/src/video_display/decklink.cpp b/src/video_display/decklink.cpp index ed803e375..deda7ee28 100644 --- a/src/video_display/decklink.cpp +++ b/src/video_display/decklink.cpp @@ -188,17 +188,9 @@ class DeckLinkTimecode : public IDeckLinkTimecode{ char *out = (char *) malloc(14); assert(minutes <= 59 && seconds <= 59); sprintf(out, "%02" PRIu8 ":%02" PRIu8 ":%02" PRIu8 ":%02" PRIu8, hours, minutes, seconds, frames); -#ifdef _WIN32 - mbstate_t mbstate{}; - const char *tmp = out; - size_t required_size = mbsrtowcs(NULL, &tmp, 0, &mbstate) + 1; - *timecode = (wchar_t *) malloc(required_size * sizeof(wchar_t)); - mbsrtowcs(*timecode, &tmp, required_size, &mbstate); + *timecode = get_bmd_api_str_from_cstr(out); free(out); -#else - *timecode = out; -#endif - return S_OK; + return *timecode ? S_OK : E_FAIL; } virtual BMDTimecodeFlags STDMETHODCALLTYPE GetFlags (void) { return bmdTimecodeFlagDefault; } virtual HRESULT STDMETHODCALLTYPE GetTimecodeUserBits (/* out */ BMDTimecodeUserBits *userBits) { if (!userBits) return E_POINTER; else return S_OK; }