|
|
|
@@ -33,6 +33,25 @@ typedef struct ThreadContext{ |
|
|
|
int ret; |
|
|
|
}ThreadContext; |
|
|
|
|
|
|
|
// it's odd Be never patented that :D |
|
|
|
struct benaphore { |
|
|
|
vint32 atom; |
|
|
|
sem_id sem; |
|
|
|
}; |
|
|
|
static inline int lock_ben(struct benaphore *ben) |
|
|
|
{ |
|
|
|
if (atomic_add(&ben->atom, 1) > 0) |
|
|
|
return acquire_sem(ben->sem); |
|
|
|
return B_OK; |
|
|
|
} |
|
|
|
static inline int unlock_ben(struct benaphore *ben) |
|
|
|
{ |
|
|
|
if (atomic_add(&ben->atom, -1) > 1) |
|
|
|
return release_sem(ben->sem); |
|
|
|
return B_OK; |
|
|
|
} |
|
|
|
|
|
|
|
static struct benaphore av_thread_lib_ben; |
|
|
|
|
|
|
|
static int32 ff_thread_func(void *v){ |
|
|
|
ThreadContext *c= v; |
|
|
|
@@ -131,3 +150,31 @@ fail: |
|
|
|
avcodec_thread_free(s); |
|
|
|
return -1; |
|
|
|
} |
|
|
|
|
|
|
|
/* provide a mean to serialize calls to avcodec_*() for thread safety. */ |
|
|
|
|
|
|
|
int avcodec_thread_lock_lib(void) |
|
|
|
{ |
|
|
|
return lock_ben(&av_thread_lib_ben); |
|
|
|
} |
|
|
|
|
|
|
|
int avcodec_thread_unlock_lib(void) |
|
|
|
{ |
|
|
|
return unlock_ben(&av_thread_lib_ben); |
|
|
|
} |
|
|
|
|
|
|
|
/* our versions of _init and _fini (which are called by those actually from crt.o) */ |
|
|
|
|
|
|
|
void initialize_after(void) |
|
|
|
{ |
|
|
|
av_thread_lib_ben.atom = 0; |
|
|
|
av_thread_lib_ben.sem = create_sem(0, "libavcodec benaphore"); |
|
|
|
} |
|
|
|
|
|
|
|
void uninitialize_before(void) |
|
|
|
{ |
|
|
|
delete_sem(av_thread_lib_ben.sem); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|