avformat/utils: Use static mutexes instead of ff_lock_avformat()
Its existence is a remnant of (libavcodec's) lock-manager API
which has been removed in a04c2c707d.
There is no need to use the same lock for avisynth, chromaprint
or tls, so switch to ordinary static mutexes instead.
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
This commit is contained in:
parent
a2874c5721
commit
8b48b0adab
6 changed files with 30 additions and 46 deletions
|
|
@ -23,6 +23,7 @@
|
||||||
#include "libavutil/internal.h"
|
#include "libavutil/internal.h"
|
||||||
#include "libavutil/mem.h"
|
#include "libavutil/mem.h"
|
||||||
#include "libavutil/opt.h"
|
#include "libavutil/opt.h"
|
||||||
|
#include "libavutil/thread.h"
|
||||||
|
|
||||||
#include "avformat.h"
|
#include "avformat.h"
|
||||||
#include "demux.h"
|
#include "demux.h"
|
||||||
|
|
@ -130,6 +131,8 @@ static const int avs_planes_yuva[4] = { AVS_PLANAR_Y, AVS_PLANAR_U,
|
||||||
static const int avs_planes_rgba[4] = { AVS_PLANAR_G, AVS_PLANAR_B,
|
static const int avs_planes_rgba[4] = { AVS_PLANAR_G, AVS_PLANAR_B,
|
||||||
AVS_PLANAR_R, AVS_PLANAR_A };
|
AVS_PLANAR_R, AVS_PLANAR_A };
|
||||||
|
|
||||||
|
static AVMutex avisynth_mutex = AV_MUTEX_INITIALIZER;
|
||||||
|
|
||||||
/* A conflict between C++ global objects, atexit, and dynamic loading requires
|
/* A conflict between C++ global objects, atexit, and dynamic loading requires
|
||||||
* us to register our own atexit handler to prevent double freeing. */
|
* us to register our own atexit handler to prevent double freeing. */
|
||||||
static AviSynthLibrary avs_library;
|
static AviSynthLibrary avs_library;
|
||||||
|
|
@ -1083,15 +1086,15 @@ static av_cold int avisynth_read_header(AVFormatContext *s)
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
// Calling library must implement a lock for thread-safe opens.
|
// Calling library must implement a lock for thread-safe opens.
|
||||||
if (ret = ff_lock_avformat())
|
if (ff_mutex_lock(&avisynth_mutex))
|
||||||
return ret;
|
return AVERROR_UNKNOWN;
|
||||||
|
|
||||||
if (ret = avisynth_open_file(s)) {
|
if (ret = avisynth_open_file(s)) {
|
||||||
ff_unlock_avformat();
|
ff_mutex_unlock(&avisynth_mutex);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
ff_unlock_avformat();
|
ff_mutex_unlock(&avisynth_mutex);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1127,11 +1130,11 @@ static int avisynth_read_packet(AVFormatContext *s, AVPacket *pkt)
|
||||||
|
|
||||||
static av_cold int avisynth_read_close(AVFormatContext *s)
|
static av_cold int avisynth_read_close(AVFormatContext *s)
|
||||||
{
|
{
|
||||||
if (ff_lock_avformat())
|
if (ff_mutex_lock(&avisynth_mutex))
|
||||||
return AVERROR_UNKNOWN;
|
return AVERROR_UNKNOWN;
|
||||||
|
|
||||||
avisynth_context_destroy(s->priv_data);
|
avisynth_context_destroy(s->priv_data);
|
||||||
ff_unlock_avformat();
|
ff_mutex_unlock(&avisynth_mutex);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -20,15 +20,17 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "avformat.h"
|
#include "avformat.h"
|
||||||
#include "internal.h"
|
|
||||||
#include "mux.h"
|
#include "mux.h"
|
||||||
#include "libavutil/opt.h"
|
#include "libavutil/opt.h"
|
||||||
|
#include "libavutil/thread.h"
|
||||||
#include <chromaprint.h>
|
#include <chromaprint.h>
|
||||||
|
|
||||||
#define CPR_VERSION_INT AV_VERSION_INT(CHROMAPRINT_VERSION_MAJOR, \
|
#define CPR_VERSION_INT AV_VERSION_INT(CHROMAPRINT_VERSION_MAJOR, \
|
||||||
CHROMAPRINT_VERSION_MINOR, \
|
CHROMAPRINT_VERSION_MINOR, \
|
||||||
CHROMAPRINT_VERSION_PATCH)
|
CHROMAPRINT_VERSION_PATCH)
|
||||||
|
|
||||||
|
static AVMutex chromaprint_mutex = AV_MUTEX_INITIALIZER;
|
||||||
|
|
||||||
typedef enum FingerprintFormat {
|
typedef enum FingerprintFormat {
|
||||||
FINGERPRINT_RAW,
|
FINGERPRINT_RAW,
|
||||||
FINGERPRINT_COMPRESSED,
|
FINGERPRINT_COMPRESSED,
|
||||||
|
|
@ -52,9 +54,9 @@ static void deinit(AVFormatContext *s)
|
||||||
ChromaprintMuxContext *const cpr = s->priv_data;
|
ChromaprintMuxContext *const cpr = s->priv_data;
|
||||||
|
|
||||||
if (cpr->ctx) {
|
if (cpr->ctx) {
|
||||||
ff_lock_avformat();
|
ff_mutex_lock(&chromaprint_mutex);
|
||||||
chromaprint_free(cpr->ctx);
|
chromaprint_free(cpr->ctx);
|
||||||
ff_unlock_avformat();
|
ff_mutex_unlock(&chromaprint_mutex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -63,9 +65,9 @@ static av_cold int init(AVFormatContext *s)
|
||||||
ChromaprintMuxContext *cpr = s->priv_data;
|
ChromaprintMuxContext *cpr = s->priv_data;
|
||||||
AVStream *st;
|
AVStream *st;
|
||||||
|
|
||||||
ff_lock_avformat();
|
ff_mutex_lock(&chromaprint_mutex);
|
||||||
cpr->ctx = chromaprint_new(cpr->algorithm);
|
cpr->ctx = chromaprint_new(cpr->algorithm);
|
||||||
ff_unlock_avformat();
|
ff_mutex_unlock(&chromaprint_mutex);
|
||||||
|
|
||||||
if (!cpr->ctx) {
|
if (!cpr->ctx) {
|
||||||
av_log(s, AV_LOG_ERROR, "Failed to create chromaprint context.\n");
|
av_log(s, AV_LOG_ERROR, "Failed to create chromaprint context.\n");
|
||||||
|
|
|
||||||
|
|
@ -727,9 +727,6 @@ struct AVBPrint;
|
||||||
*/
|
*/
|
||||||
int ff_bprint_to_codecpar_extradata(AVCodecParameters *par, struct AVBPrint *buf);
|
int ff_bprint_to_codecpar_extradata(AVCodecParameters *par, struct AVBPrint *buf);
|
||||||
|
|
||||||
int ff_lock_avformat(void);
|
|
||||||
int ff_unlock_avformat(void);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set AVFormatContext url field to the provided pointer. The pointer must
|
* Set AVFormatContext url field to the provided pointer. The pointer must
|
||||||
* point to a valid string. The existing url field is freed if necessary. Also
|
* point to a valid string. The existing url field is freed if necessary. Also
|
||||||
|
|
|
||||||
|
|
@ -25,15 +25,12 @@
|
||||||
#include <gnutls/x509.h>
|
#include <gnutls/x509.h>
|
||||||
|
|
||||||
#include "avformat.h"
|
#include "avformat.h"
|
||||||
#include "internal.h"
|
|
||||||
#include "network.h"
|
#include "network.h"
|
||||||
#include "os_support.h"
|
#include "os_support.h"
|
||||||
#include "url.h"
|
#include "url.h"
|
||||||
#include "tls.h"
|
#include "tls.h"
|
||||||
#include "libavcodec/internal.h"
|
|
||||||
#include "libavutil/avstring.h"
|
|
||||||
#include "libavutil/opt.h"
|
#include "libavutil/opt.h"
|
||||||
#include "libavutil/parseutils.h"
|
#include "libavutil/thread.h"
|
||||||
|
|
||||||
#ifndef GNUTLS_VERSION_NUMBER
|
#ifndef GNUTLS_VERSION_NUMBER
|
||||||
#define GNUTLS_VERSION_NUMBER LIBGNUTLS_VERSION_NUMBER
|
#define GNUTLS_VERSION_NUMBER LIBGNUTLS_VERSION_NUMBER
|
||||||
|
|
@ -41,7 +38,6 @@
|
||||||
|
|
||||||
#if HAVE_THREADS && GNUTLS_VERSION_NUMBER <= 0x020b00
|
#if HAVE_THREADS && GNUTLS_VERSION_NUMBER <= 0x020b00
|
||||||
#include <gcrypt.h>
|
#include <gcrypt.h>
|
||||||
#include "libavutil/thread.h"
|
|
||||||
GCRY_THREAD_OPTION_PTHREAD_IMPL;
|
GCRY_THREAD_OPTION_PTHREAD_IMPL;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
@ -54,22 +50,24 @@ typedef struct TLSContext {
|
||||||
int io_err;
|
int io_err;
|
||||||
} TLSContext;
|
} TLSContext;
|
||||||
|
|
||||||
|
static AVMutex gnutls_mutex = AV_MUTEX_INITIALIZER;
|
||||||
|
|
||||||
void ff_gnutls_init(void)
|
void ff_gnutls_init(void)
|
||||||
{
|
{
|
||||||
ff_lock_avformat();
|
ff_mutex_lock(&gnutls_mutex);
|
||||||
#if HAVE_THREADS && GNUTLS_VERSION_NUMBER < 0x020b00
|
#if HAVE_THREADS && GNUTLS_VERSION_NUMBER < 0x020b00
|
||||||
if (gcry_control(GCRYCTL_ANY_INITIALIZATION_P) == 0)
|
if (gcry_control(GCRYCTL_ANY_INITIALIZATION_P) == 0)
|
||||||
gcry_control(GCRYCTL_SET_THREAD_CBS, &gcry_threads_pthread);
|
gcry_control(GCRYCTL_SET_THREAD_CBS, &gcry_threads_pthread);
|
||||||
#endif
|
#endif
|
||||||
gnutls_global_init();
|
gnutls_global_init();
|
||||||
ff_unlock_avformat();
|
ff_mutex_unlock(&gnutls_mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ff_gnutls_deinit(void)
|
void ff_gnutls_deinit(void)
|
||||||
{
|
{
|
||||||
ff_lock_avformat();
|
ff_mutex_lock(&gnutls_mutex);
|
||||||
gnutls_global_deinit();
|
gnutls_global_deinit();
|
||||||
ff_unlock_avformat();
|
ff_mutex_unlock(&gnutls_mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int print_tls_error(URLContext *h, int ret)
|
static int print_tls_error(URLContext *h, int ret)
|
||||||
|
|
|
||||||
|
|
@ -19,17 +19,12 @@
|
||||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "avformat.h"
|
|
||||||
#include "internal.h"
|
|
||||||
#include "network.h"
|
#include "network.h"
|
||||||
#include "os_support.h"
|
#include "os_support.h"
|
||||||
#include "url.h"
|
#include "url.h"
|
||||||
#include "tls.h"
|
#include "tls.h"
|
||||||
#include "libavutil/avstring.h"
|
|
||||||
#include "libavutil/avutil.h"
|
|
||||||
#include "libavutil/mem.h"
|
#include "libavutil/mem.h"
|
||||||
#include "libavutil/opt.h"
|
#include "libavutil/opt.h"
|
||||||
#include "libavutil/parseutils.h"
|
|
||||||
#include "libavutil/thread.h"
|
#include "libavutil/thread.h"
|
||||||
|
|
||||||
#include <openssl/bio.h>
|
#include <openssl/bio.h>
|
||||||
|
|
@ -49,6 +44,8 @@ typedef struct TLSContext {
|
||||||
int io_err;
|
int io_err;
|
||||||
} TLSContext;
|
} TLSContext;
|
||||||
|
|
||||||
|
static AVMutex openssl_mutex = AV_MUTEX_INITIALIZER;
|
||||||
|
|
||||||
#if HAVE_THREADS && OPENSSL_VERSION_NUMBER < 0x10100000L
|
#if HAVE_THREADS && OPENSSL_VERSION_NUMBER < 0x10100000L
|
||||||
#include <openssl/crypto.h>
|
#include <openssl/crypto.h>
|
||||||
pthread_mutex_t *openssl_mutexes;
|
pthread_mutex_t *openssl_mutexes;
|
||||||
|
|
@ -69,7 +66,7 @@ static unsigned long openssl_thread_id(void)
|
||||||
|
|
||||||
int ff_openssl_init(void)
|
int ff_openssl_init(void)
|
||||||
{
|
{
|
||||||
ff_lock_avformat();
|
ff_mutex_lock(&openssl_mutex);
|
||||||
if (!openssl_init) {
|
if (!openssl_init) {
|
||||||
/* OpenSSL 1.0.2 or below, then you would use SSL_library_init. If you are
|
/* OpenSSL 1.0.2 or below, then you would use SSL_library_init. If you are
|
||||||
* using OpenSSL 1.1.0 or above, then the library will initialize
|
* using OpenSSL 1.1.0 or above, then the library will initialize
|
||||||
|
|
@ -85,7 +82,7 @@ int ff_openssl_init(void)
|
||||||
int i;
|
int i;
|
||||||
openssl_mutexes = av_malloc_array(sizeof(pthread_mutex_t), CRYPTO_num_locks());
|
openssl_mutexes = av_malloc_array(sizeof(pthread_mutex_t), CRYPTO_num_locks());
|
||||||
if (!openssl_mutexes) {
|
if (!openssl_mutexes) {
|
||||||
ff_unlock_avformat();
|
ff_mutex_unlock(&openssl_mutex);
|
||||||
return AVERROR(ENOMEM);
|
return AVERROR(ENOMEM);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -99,14 +96,14 @@ int ff_openssl_init(void)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
openssl_init++;
|
openssl_init++;
|
||||||
ff_unlock_avformat();
|
ff_mutex_unlock(&openssl_mutex);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ff_openssl_deinit(void)
|
void ff_openssl_deinit(void)
|
||||||
{
|
{
|
||||||
ff_lock_avformat();
|
ff_mutex_lock(&openssl_mutex);
|
||||||
openssl_init--;
|
openssl_init--;
|
||||||
if (!openssl_init) {
|
if (!openssl_init) {
|
||||||
#if HAVE_THREADS && OPENSSL_VERSION_NUMBER < 0x10100000L
|
#if HAVE_THREADS && OPENSSL_VERSION_NUMBER < 0x10100000L
|
||||||
|
|
@ -119,7 +116,7 @@ void ff_openssl_deinit(void)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
ff_unlock_avformat();
|
ff_mutex_unlock(&openssl_mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int print_tls_error(URLContext *h, int ret)
|
static int print_tls_error(URLContext *h, int ret)
|
||||||
|
|
|
||||||
|
|
@ -27,7 +27,6 @@
|
||||||
#include "libavutil/bprint.h"
|
#include "libavutil/bprint.h"
|
||||||
#include "libavutil/internal.h"
|
#include "libavutil/internal.h"
|
||||||
#include "libavutil/mem.h"
|
#include "libavutil/mem.h"
|
||||||
#include "libavutil/thread.h"
|
|
||||||
#include "libavutil/time.h"
|
#include "libavutil/time.h"
|
||||||
|
|
||||||
#include "libavcodec/internal.h"
|
#include "libavcodec/internal.h"
|
||||||
|
|
@ -40,23 +39,11 @@
|
||||||
#endif
|
#endif
|
||||||
#include "os_support.h"
|
#include "os_support.h"
|
||||||
|
|
||||||
static AVMutex avformat_mutex = AV_MUTEX_INITIALIZER;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @file
|
* @file
|
||||||
* various utility functions for use within FFmpeg
|
* various utility functions for use within FFmpeg
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int ff_lock_avformat(void)
|
|
||||||
{
|
|
||||||
return ff_mutex_lock(&avformat_mutex) ? -1 : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int ff_unlock_avformat(void)
|
|
||||||
{
|
|
||||||
return ff_mutex_unlock(&avformat_mutex) ? -1 : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* an arbitrarily chosen "sane" max packet size -- 50M */
|
/* an arbitrarily chosen "sane" max packet size -- 50M */
|
||||||
#define SANE_CHUNK_SIZE (50000000)
|
#define SANE_CHUNK_SIZE (50000000)
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue