From patchwork Wed Feb 22 22:55:23 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kyle Schwarz X-Patchwork-Id: 2654 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.103.65.149 with SMTP id x21csp1108500vsf; Wed, 22 Feb 2017 15:17:43 -0800 (PST) X-Received: by 10.28.101.197 with SMTP id z188mr449437wmb.119.1487805463416; Wed, 22 Feb 2017 15:17:43 -0800 (PST) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id j8si3518549wrb.254.2017.02.22.15.17.40; Wed, 22 Feb 2017 15:17:43 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id D5BC0688340; Thu, 23 Feb 2017 01:17:29 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-it0-f68.google.com (mail-it0-f68.google.com [209.85.214.68]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id C26BE688315 for ; Thu, 23 Feb 2017 01:17:23 +0200 (EET) Received: by mail-it0-f68.google.com with SMTP id w185so2738986ita.3 for ; Wed, 22 Feb 2017 15:17:31 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=h1ix0vOFMByCdVEVMXR7PxnIt21SzOsTIAagzplgFWQ=; b=VEQJkG5z8IaozTug6PAp81pYTck9A08E1c65MsuTVUQbe+vN8eTWTykTttiXTkEfO+ tXxRsXOnA8xSTH9pYsfVl4p86WwzuL8NGEroJ7racQ+FgLDeXI/RxckOylVFK9EFsnhP KZ9Fc71tHaQmejOGgSXGIRh1nroC1Hy/fdtU5EJj5CAzGRavTSyjV3OzUbTqT6sJ6uK7 V7wJBIjpK4fmpRJ5eC9gplAp/f2oqMHn/upDILo+XWVjmgoIedCc1hN2f3vH3FsEIzx2 hXMjWLgycm5YCvZF/9Bmyra6R0+m4PeuUSinjXLgC3sVdtpNObl21C8FZS6W2sZlg5cf fFnA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=h1ix0vOFMByCdVEVMXR7PxnIt21SzOsTIAagzplgFWQ=; b=hD+3v3gdX5iUXQJeyFMC8mMF1lnoZphYrQFWvkLavDV4qIpESimfI9MJ1rFGNA0N0S H0pozdXCAqEfZf2/T4ALf4etMV3B9ZevtayGWL1qg1rluUso4w2aja2Lh6c8rsanuQqy YHVyd3RPzqnhRFbo43nIxUjR91VzlRVyTEZj8FNHDCO2dTF1lGikMyOfIiw76ya6/ns0 kJrk5EvYSaXiFYpXHBntFq3OK+pKirktv0D++DPsECjrchto7oXvwr3gNghjHeCjNj/p U9raPVY6TatEfHcnjGNNF3+b3mIWw991ObMjcu59CU9+4W/pkm63IDCy5VqAkB/gnjLK /REA== X-Gm-Message-State: AMke39nq5xdt9YNXOXNnbHo56AiuIu8Ue+NYSyERwFIektbU/xFQZ2n2xQb4cp3Hp2lhdg== X-Received: by 10.36.141.69 with SMTP id w66mr915746itd.96.1487804132601; Wed, 22 Feb 2017 14:55:32 -0800 (PST) Received: from localhost.localdomain (c-71-227-126-94.hsd1.mi.comcast.net. [71.227.126.94]) by smtp.gmail.com with ESMTPSA id t18sm1171551itb.30.2017.02.22.14.55.30 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 22 Feb 2017 14:55:31 -0800 (PST) From: Kyle Schwarz To: ffmpeg-devel@ffmpeg.org Date: Wed, 22 Feb 2017 14:55:23 -0800 Message-Id: <1487804123-1539-1-git-send-email-zeranoe@gmail.com> X-Mailer: git-send-email 2.7.4 Subject: [FFmpeg-devel] [PATCH] avdevice/decklink: Remove pthread dependency X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Cc: Kyle Schwarz MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" DeckLink depends on pthread, and is silently disabled if pthread is missing. Also fixes w32pthreads to support C++. --- compat/w32pthreads.h | 31 +++++++++++++++++++------------ configure | 4 ++-- libavdevice/decklink_common.cpp | 3 --- libavdevice/decklink_common.h | 4 +++- libavdevice/decklink_dec.cpp | 3 --- libavdevice/decklink_enc.cpp | 14 ++++++-------- 6 files changed, 30 insertions(+), 29 deletions(-) mode change 100644 => 100755 compat/w32pthreads.h mode change 100644 => 100755 libavdevice/decklink_common.cpp mode change 100644 => 100755 libavdevice/decklink_common.h mode change 100644 => 100755 libavdevice/decklink_dec.cpp mode change 100644 => 100755 libavdevice/decklink_enc.cpp diff --git a/compat/w32pthreads.h b/compat/w32pthreads.h old mode 100644 new mode 100755 index 4ac2a99..45c565a --- a/compat/w32pthreads.h +++ b/compat/w32pthreads.h @@ -77,7 +77,7 @@ typedef struct pthread_cond_t { static av_unused unsigned __stdcall attribute_align_arg win32thread_worker(void *arg) { - pthread_t *h = arg; + pthread_t *h = (pthread_t*)arg; h->ret = h->func(h->arg); return 0; } @@ -270,7 +270,7 @@ static av_unused int pthread_cond_init(pthread_cond_t *cond, const void *unused_ } /* non native condition variables */ - win32_cond = av_mallocz(sizeof(win32_cond_t)); + win32_cond = (win32_cond_t*)av_mallocz(sizeof(win32_cond_t)); if (!win32_cond) return ENOMEM; cond->Ptr = win32_cond; @@ -288,7 +288,7 @@ static av_unused int pthread_cond_init(pthread_cond_t *cond, const void *unused_ static av_unused int pthread_cond_destroy(pthread_cond_t *cond) { - win32_cond_t *win32_cond = cond->Ptr; + win32_cond_t *win32_cond = (win32_cond_t*)cond->Ptr; /* native condition variables do not destroy */ if (cond_init) return 0; @@ -305,7 +305,7 @@ static av_unused int pthread_cond_destroy(pthread_cond_t *cond) static av_unused int pthread_cond_broadcast(pthread_cond_t *cond) { - win32_cond_t *win32_cond = cond->Ptr; + win32_cond_t *win32_cond = (win32_cond_t*)cond->Ptr; int have_waiter; if (cond_broadcast) { @@ -337,7 +337,7 @@ static av_unused int pthread_cond_broadcast(pthread_cond_t *cond) static av_unused int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex) { - win32_cond_t *win32_cond = cond->Ptr; + win32_cond_t *win32_cond = (win32_cond_t*)cond->Ptr; int last_waiter; if (cond_wait) { cond_wait(cond, mutex, INFINITE); @@ -369,7 +369,7 @@ static av_unused int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mu static av_unused int pthread_cond_signal(pthread_cond_t *cond) { - win32_cond_t *win32_cond = cond->Ptr; + win32_cond_t *win32_cond = (win32_cond_t*)cond->Ptr; int have_waiter; if (cond_signal) { cond_signal(cond); @@ -397,20 +397,27 @@ static av_unused int pthread_cond_signal(pthread_cond_t *cond) static av_unused void w32thread_init(void) { #if _WIN32_WINNT < 0x0600 + typedef void (*init_cond_var)(pthread_cond_t*); + typedef void (*wake_all_cond_var)(pthread_cond_t*); + typedef void (*wake_cond_var)(pthread_cond_t*); + typedef BOOL (*sleep_cond_var)(pthread_cond_t*, pthread_mutex_t*, DWORD); + typedef BOOL (*init_once_begin_init)(pthread_once_t*, DWORD, BOOL*, void**); + typedef BOOL (*init_once_complete)(pthread_once_t*, DWORD, void*); + HANDLE kernel_dll = GetModuleHandle(TEXT("kernel32.dll")); /* if one is available, then they should all be available */ cond_init = - (void*)GetProcAddress(kernel_dll, "InitializeConditionVariable"); + (init_cond_var)GetProcAddress((HMODULE)kernel_dll, "InitializeConditionVariable"); cond_broadcast = - (void*)GetProcAddress(kernel_dll, "WakeAllConditionVariable"); + (wake_all_cond_var)GetProcAddress((HMODULE)kernel_dll, "WakeAllConditionVariable"); cond_signal = - (void*)GetProcAddress(kernel_dll, "WakeConditionVariable"); + (wake_cond_var)GetProcAddress((HMODULE)kernel_dll, "WakeConditionVariable"); cond_wait = - (void*)GetProcAddress(kernel_dll, "SleepConditionVariableCS"); + (sleep_cond_var)GetProcAddress((HMODULE)kernel_dll, "SleepConditionVariableCS"); initonce_begin = - (void*)GetProcAddress(kernel_dll, "InitOnceBeginInitialize"); + (init_once_begin_init)GetProcAddress((HMODULE)kernel_dll, "InitOnceBeginInitialize"); initonce_complete = - (void*)GetProcAddress(kernel_dll, "InitOnceComplete"); + (init_once_complete)GetProcAddress((HMODULE)kernel_dll, "InitOnceComplete"); #endif } diff --git a/configure b/configure index 6431313..ab9e005 100755 --- a/configure +++ b/configure @@ -2977,9 +2977,9 @@ avfoundation_indev_extralibs="-framework CoreVideo -framework Foundation -framew avfoundation_indev_select="avfoundation" bktr_indev_deps_any="dev_bktr_ioctl_bt848_h machine_ioctl_bt848_h dev_video_bktr_ioctl_bt848_h dev_ic_bt8xx_h" caca_outdev_deps="libcaca" -decklink_indev_deps="decklink pthreads" +decklink_indev_deps="decklink" decklink_indev_extralibs="-lstdc++" -decklink_outdev_deps="decklink pthreads" +decklink_outdev_deps="decklink" decklink_outdev_extralibs="-lstdc++" dshow_indev_deps="IBaseFilter" dshow_indev_extralibs="-lpsapi -lole32 -lstrmiids -luuid -loleaut32 -lshlwapi" diff --git a/libavdevice/decklink_common.cpp b/libavdevice/decklink_common.cpp old mode 100644 new mode 100755 index a3bc58d..7552059 --- a/libavdevice/decklink_common.cpp +++ b/libavdevice/decklink_common.cpp @@ -26,9 +26,6 @@ #include #endif -#include -#include - extern "C" { #include "libavformat/avformat.h" #include "libavformat/internal.h" diff --git a/libavdevice/decklink_common.h b/libavdevice/decklink_common.h old mode 100644 new mode 100755 index bfa2b08..4644cb4 --- a/libavdevice/decklink_common.h +++ b/libavdevice/decklink_common.h @@ -24,6 +24,7 @@ #include +#include "libavutil/thread.h" #include "decklink_common_c.h" class decklink_output_callback; @@ -89,7 +90,8 @@ struct decklink_ctx { int frames_preroll; int frames_buffer; - sem_t semaphore; + pthread_mutex_t mutex; + pthread_cond_t cond; int channels; }; diff --git a/libavdevice/decklink_dec.cpp b/libavdevice/decklink_dec.cpp old mode 100644 new mode 100755 index 7df841b..151dabb --- a/libavdevice/decklink_dec.cpp +++ b/libavdevice/decklink_dec.cpp @@ -21,9 +21,6 @@ #include -#include -#include - extern "C" { #include "config.h" #include "libavformat/avformat.h" diff --git a/libavdevice/decklink_enc.cpp b/libavdevice/decklink_enc.cpp old mode 100644 new mode 100755 index ad00224..5c3166f --- a/libavdevice/decklink_enc.cpp +++ b/libavdevice/decklink_enc.cpp @@ -21,9 +21,6 @@ #include -#include -#include - extern "C" { #include "libavformat/avformat.h" #include "libavformat/internal.h" @@ -78,7 +75,7 @@ public: av_frame_free(&avframe); - sem_post(&ctx->semaphore); + pthread_mutex_unlock(&ctx->mutex); return S_OK; } @@ -120,7 +117,6 @@ static int decklink_setup_video(AVFormatContext *avctx, AVStream *st) ctx->output_callback = new decklink_output_callback(); ctx->dlo->SetScheduledFrameCompletionCallback(ctx->output_callback); - /* Start video semaphore. */ ctx->frames_preroll = c->time_base.den * ctx->preroll; if (c->time_base.den > 1000) ctx->frames_preroll /= 1000; @@ -128,7 +124,8 @@ static int decklink_setup_video(AVFormatContext *avctx, AVStream *st) /* Buffer twice as many frames as the preroll. */ ctx->frames_buffer = ctx->frames_preroll * 2; ctx->frames_buffer = FFMIN(ctx->frames_buffer, 60); - sem_init(&ctx->semaphore, 0, ctx->frames_buffer); + pthread_mutex_init(&ctx->mutex, NULL); + pthread_cond_init(&ctx->cond, NULL); /* The device expects the framerate to be fixed. */ avpriv_set_pts_info(st, 64, c->time_base.num, c->time_base.den); @@ -198,7 +195,8 @@ av_cold int ff_decklink_write_trailer(AVFormatContext *avctx) if (ctx->output_callback) delete ctx->output_callback; - sem_destroy(&ctx->semaphore); + pthread_mutex_destroy(&ctx->mutex); + pthread_cond_destroy(&ctx->cond); av_freep(&cctx->ctx); @@ -248,7 +246,7 @@ static int decklink_write_video_packet(AVFormatContext *avctx, AVPacket *pkt) } /* Always keep at most one second of frames buffered. */ - sem_wait(&ctx->semaphore); + pthread_cond_wait(&ctx->cond, &ctx->mutex); /* Schedule frame for playback. */ hr = ctx->dlo->ScheduleVideoFrame((struct IDeckLinkVideoFrame *) frame,