Merge pull request #959 from sorayuki/patch-1

obs-qsv11: change re-enter lock implementation
master
Jim 2017-07-01 11:36:06 -07:00 committed by GitHub
commit daaa2741a7
1 changed files with 6 additions and 5 deletions

View File

@ -61,7 +61,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "QSV_Encoder_Internal.h" #include "QSV_Encoder_Internal.h"
#include <obs-module.h> #include <obs-module.h>
#include <string> #include <string>
#include <mutex> #include <atomic>
#include <intrin.h> #include <intrin.h>
#define do_log(level, format, ...) \ #define do_log(level, format, ...) \
@ -70,7 +70,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
mfxIMPL impl = MFX_IMPL_HARDWARE_ANY; mfxIMPL impl = MFX_IMPL_HARDWARE_ANY;
mfxVersion ver = {{0, 1}}; // for backward compatibility mfxVersion ver = {{0, 1}}; // for backward compatibility
std::mutex active_mutex; std::atomic<bool> is_active{false};
void qsv_encoder_version(unsigned short *major, unsigned short *minor) void qsv_encoder_version(unsigned short *major, unsigned short *minor)
{ {
@ -80,7 +80,8 @@ void qsv_encoder_version(unsigned short *major, unsigned short *minor)
qsv_t *qsv_encoder_open(qsv_param_t *pParams) qsv_t *qsv_encoder_open(qsv_param_t *pParams)
{ {
if (!active_mutex.try_lock()) { bool false_value = false;
if (!is_active.compare_exchange_strong(false_value, true)) {
do_log(LOG_ERROR, "Cannot have more than one encoder " do_log(LOG_ERROR, "Cannot have more than one encoder "
"active at a time"); "active at a time");
return NULL; return NULL;
@ -91,7 +92,7 @@ qsv_t *qsv_encoder_open(qsv_param_t *pParams)
if (sts != MFX_ERR_NONE) { if (sts != MFX_ERR_NONE) {
delete pEncoder; delete pEncoder;
if (pEncoder) if (pEncoder)
active_mutex.unlock(); is_active.store(false);
return NULL; return NULL;
} }
@ -132,7 +133,7 @@ int qsv_encoder_close(qsv_t *pContext)
delete pEncoder; delete pEncoder;
if (pEncoder) if (pEncoder)
active_mutex.unlock(); is_active.store(false);
return 0; return 0;
} }