Home | History | Annotate | Download | only in src
      1 /*M///////////////////////////////////////////////////////////////////////////////////////
      2 //
      3 //  IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
      4 //
      5 //  By downloading, copying, installing or using the software you agree to this license.
      6 //  If you do not agree to this license, do not download, install,
      7 //  copy or use the software.
      8 //
      9 //
     10 //                          License Agreement
     11 //                For Open Source Computer Vision Library
     12 //
     13 // Copyright (C) 2000-2008, Intel Corporation, all rights reserved.
     14 // Copyright (C) 2009, Willow Garage Inc., all rights reserved.
     15 // Copyright (C) 2013, OpenCV Foundation, all rights reserved.
     16 // Third party copyrights are property of their respective owners.
     17 //
     18 // Redistribution and use in source and binary forms, with or without modification,
     19 // are permitted provided that the following conditions are met:
     20 //
     21 //   * Redistribution's of source code must retain the above copyright notice,
     22 //     this list of conditions and the following disclaimer.
     23 //
     24 //   * Redistribution's in binary form must reproduce the above copyright notice,
     25 //     this list of conditions and the following disclaimer in the documentation
     26 //     and/or other materials provided with the distribution.
     27 //
     28 //   * The name of the copyright holders may not be used to endorse or promote products
     29 //     derived from this software without specific prior written permission.
     30 //
     31 // This software is provided by the copyright holders and contributors "as is" and
     32 // any express or implied warranties, including, but not limited to, the implied
     33 // warranties of merchantability and fitness for a particular purpose are disclaimed.
     34 // In no event shall the Intel Corporation or contributors be liable for any direct,
     35 // indirect, incidental, special, exemplary, or consequential damages
     36 // (including, but not limited to, procurement of substitute goods or services;
     37 // loss of use, data, or profits; or business interruption) however caused
     38 // and on any theory of liability, whether in contract, strict liability,
     39 // or tort (including negligence or otherwise) arising in any way out of
     40 // the use of this software, even if advised of the possibility of such damage.
     41 //
     42 //M*/
     43 
     44 #include "precomp.hpp"
     45 
     46 #ifdef HAVE_NVCUVID
     47 
     48 using namespace cv::cudacodec::detail;
     49 
     50 #ifdef WIN32
     51 
     52 namespace
     53 {
     54     struct UserData
     55     {
     56         Thread::Func func;
     57         void* param;
     58     };
     59 
     60     DWORD WINAPI WinThreadFunction(LPVOID lpParam)
     61     {
     62         UserData* userData = static_cast<UserData*>(lpParam);
     63 
     64         userData->func(userData->param);
     65 
     66         return 0;
     67     }
     68 }
     69 
     70 class cv::cudacodec::detail::Thread::Impl
     71 {
     72 public:
     73     Impl(Thread::Func func, void* userData)
     74     {
     75         userData_.func = func;
     76         userData_.param = userData;
     77 
     78         thread_ = CreateThread(
     79             NULL,                   // default security attributes
     80             0,                      // use default stack size
     81             WinThreadFunction,      // thread function name
     82             &userData_,             // argument to thread function
     83             0,                      // use default creation flags
     84             &threadId_);            // returns the thread identifier
     85     }
     86 
     87     ~Impl()
     88     {
     89         CloseHandle(thread_);
     90     }
     91 
     92     void wait()
     93     {
     94         WaitForSingleObject(thread_, INFINITE);
     95     }
     96 
     97 private:
     98     UserData userData_;
     99     HANDLE thread_;
    100     DWORD threadId_;
    101 };
    102 
    103 #else
    104 
    105 namespace
    106 {
    107     struct UserData
    108     {
    109         Thread::Func func;
    110         void* param;
    111     };
    112 
    113     void* PThreadFunction(void* lpParam)
    114     {
    115         UserData* userData = static_cast<UserData*>(lpParam);
    116 
    117         userData->func(userData->param);
    118 
    119         return 0;
    120     }
    121 }
    122 
    123 class cv::cudacodec::detail::Thread::Impl
    124 {
    125 public:
    126     Impl(Thread::Func func, void* userData)
    127     {
    128         userData_.func = func;
    129         userData_.param = userData;
    130 
    131         pthread_create(&thread_, NULL, PThreadFunction, &userData_);
    132     }
    133 
    134     ~Impl()
    135     {
    136         pthread_detach(thread_);
    137     }
    138 
    139     void wait()
    140     {
    141         pthread_join(thread_, NULL);
    142     }
    143 
    144 private:
    145     pthread_t thread_;
    146     UserData userData_;
    147 };
    148 
    149 #endif
    150 
    151 cv::cudacodec::detail::Thread::Thread(Func func, void* userData) :
    152     impl_(new Impl(func, userData))
    153 {
    154 }
    155 
    156 void cv::cudacodec::detail::Thread::wait()
    157 {
    158     impl_->wait();
    159 }
    160 
    161 void cv::cudacodec::detail::Thread::sleep(int ms)
    162 {
    163 #ifdef WIN32
    164     ::Sleep(ms);
    165 #else
    166     ::usleep(ms * 1000);
    167 #endif
    168 }
    169 
    170 #endif // HAVE_NVCUVID
    171