#include "libavutil/opt.h"
#include "libavutil/parseutils.h"
#include "libavutil/pixdesc.h"
+#include "libavutil/thread.h"
#include "libavutil/time.h"
#include "libavutil/time_internal.h"
#include "libavutil/timestamp.h"
#include "libavutil/ffversion.h"
const char av_format_ffversion[] = "FFmpeg version " FFMPEG_VERSION;
+static AVMutex avformat_mutex = AV_MUTEX_INITIALIZER;
+
/**
* @file
* various utility functions for use within FFmpeg
return LICENSE_PREFIX FFMPEG_LICENSE + sizeof(LICENSE_PREFIX) - 1;
}
+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;
+}
+
#define RELATIVE_TS_BASE (INT64_MAX - (1LL<<48))
static int is_relative(int64_t ts) {
#if FF_API_FORMAT_GET_SET
MAKE_ACCESSORS(AVStream, stream, AVRational, r_frame_rate)
+#if FF_API_LAVF_FFSERVER
+FF_DISABLE_DEPRECATION_WARNINGS
MAKE_ACCESSORS(AVStream, stream, char *, recommended_encoder_configuration)
+FF_ENABLE_DEPRECATION_WARNINGS
+#endif
MAKE_ACCESSORS(AVFormatContext, format, AVCodec *, video_codec)
MAKE_ACCESSORS(AVFormatContext, format, AVCodec *, audio_codec)
MAKE_ACCESSORS(AVFormatContext, format, AVCodec *, subtitle_codec)
goto fail;
if ((ret = ff_id3v2_parse_chapters(s, &id3v2_extra_meta)) < 0)
goto fail;
+ if ((ret = ff_id3v2_parse_priv(s, &id3v2_extra_meta)) < 0)
+ goto fail;
} else
av_log(s, AV_LOG_DEBUG, "demuxer does not support additional id3 data, skipping\n");
}
}
}
+#if FF_API_LAVF_FFSERVER
+FF_DISABLE_DEPRECATION_WARNINGS
av_freep(&dst->recommended_encoder_configuration);
if (src->recommended_encoder_configuration) {
const char *conf_str = src->recommended_encoder_configuration;
if (!dst->recommended_encoder_configuration)
return AVERROR(ENOMEM);
}
+FF_ENABLE_DEPRECATION_WARNINGS
+#endif
return 0;
}
if (st->info)
av_freep(&st->info->duration_error);
av_freep(&st->info);
+#if FF_API_LAVF_FFSERVER
+FF_DISABLE_DEPRECATION_WARNINGS
av_freep(&st->recommended_encoder_configuration);
+FF_ENABLE_DEPRECATION_WARNINGS
+#endif
av_freep(pst);
}
{
#if CONFIG_NETWORK
int ret;
- ff_network_inited_globally = 1;
if ((ret = ff_network_init()) < 0)
return ret;
if ((ret = ff_tls_init()) < 0)
#if CONFIG_NETWORK
ff_network_close();
ff_tls_deinit();
- ff_network_inited_globally = 0;
#endif
return 0;
}
*pb = NULL;
}
+int ff_is_http_proto(char *filename) {
+ const char *proto = avio_find_protocol_name(filename);
+ return proto ? (!av_strcasecmp(proto, "http") || !av_strcasecmp(proto, "https")) : 0;
+}
+
int ff_parse_creation_time_metadata(AVFormatContext *s, int64_t *timestamp, int return_seconds)
{
AVDictionaryEntry *entry;