[FFmpeg-cvslog] openssl: Support version 1.1.0.
Matt Oliver
git at videolan.org
Fri Oct 21 07:15:44 EEST 2016
ffmpeg | branch: master | Matt Oliver <protogonoi at gmail.com> | Mon Oct 10 06:49:54 2016 +1100| [798c6ecce50f26a53d48e2577a34fabe46b32eb9] | committer: Matt Oliver
openssl: Support version 1.1.0.
Fixes #5675
Signed-off-by: Matt Oliver <protogonoi at gmail.com>
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=798c6ecce50f26a53d48e2577a34fabe46b32eb9
---
configure | 3 +-
libavformat/tls_openssl.c | 163 ++++++++++++++++++++++++++++------------------
2 files changed, 102 insertions(+), 64 deletions(-)
diff --git a/configure b/configure
index 1e6834f..481f692 100755
--- a/configure
+++ b/configure
@@ -5828,7 +5828,8 @@ enabled omx && { check_header OMX_Core.h ||
add_cflags -isystem/opt/vc/include/IL ; }
check_header OMX_Core.h ; } ||
die "ERROR: OpenMAX IL headers not found"; }
-enabled openssl && { use_pkg_config openssl openssl/ssl.h SSL_library_init ||
+enabled openssl && { use_pkg_config openssl openssl/ssl.h OPENSSL_init_ssl ||
+ use_pkg_config openssl openssl/ssl.h SSL_library_init ||
check_lib openssl/ssl.h SSL_library_init -lssl -lcrypto ||
check_lib openssl/ssl.h SSL_library_init -lssl32 -leay32 ||
check_lib openssl/ssl.h SSL_library_init -lssl -lcrypto -lws2_32 -lgdi32 ||
diff --git a/libavformat/tls_openssl.c b/libavformat/tls_openssl.c
index 46eb3e6..c551ac7 100644
--- a/libavformat/tls_openssl.c
+++ b/libavformat/tls_openssl.c
@@ -43,6 +43,9 @@ typedef struct TLSContext {
TLSShared tls_shared;
SSL_CTX *ctx;
SSL *ssl;
+#if OPENSSL_VERSION_NUMBER >= 0x1010000fL
+ BIO_METHOD* url_bio_method;
+#endif
} TLSContext;
#if HAVE_THREADS
@@ -63,6 +66,87 @@ static unsigned long openssl_thread_id(void)
#endif
#endif
+static int url_bio_create(BIO *b)
+{
+#if OPENSSL_VERSION_NUMBER >= 0x1010000fL
+ BIO_set_init(b, 1);
+ BIO_set_data(b, NULL);
+ BIO_set_flags(b, 0);
+#else
+ b->init = 1;
+ b->ptr = NULL;
+ b->flags = 0;
+#endif
+ return 1;
+}
+
+static int url_bio_destroy(BIO *b)
+{
+ return 1;
+}
+
+#if OPENSSL_VERSION_NUMBER >= 0x1010000fL
+#define GET_BIO_DATA(x) BIO_get_data(x);
+#else
+#define GET_BIO_DATA(x) (x)->ptr;
+#endif
+
+static int url_bio_bread(BIO *b, char *buf, int len)
+{
+ URLContext *h;
+ int ret;
+ h = GET_BIO_DATA(b);
+ ret = ffurl_read(h, buf, len);
+ if (ret >= 0)
+ return ret;
+ BIO_clear_retry_flags(b);
+ if (ret == AVERROR_EXIT)
+ return 0;
+ return -1;
+}
+
+static int url_bio_bwrite(BIO *b, const char *buf, int len)
+{
+ URLContext *h;
+ int ret;
+ h = GET_BIO_DATA(b);
+ ret = ffurl_write(h, buf, len);
+ if (ret >= 0)
+ return ret;
+ BIO_clear_retry_flags(b);
+ if (ret == AVERROR_EXIT)
+ return 0;
+ return -1;
+}
+
+static long url_bio_ctrl(BIO *b, int cmd, long num, void *ptr)
+{
+ if (cmd == BIO_CTRL_FLUSH) {
+ BIO_clear_retry_flags(b);
+ return 1;
+ }
+ return 0;
+}
+
+static int url_bio_bputs(BIO *b, const char *str)
+{
+ return url_bio_bwrite(b, str, strlen(str));
+}
+
+#if OPENSSL_VERSION_NUMBER < 0x1010000fL
+static BIO_METHOD url_bio_method = {
+ .type = BIO_TYPE_SOURCE_SINK,
+ .name = "urlprotocol bio",
+ .bwrite = url_bio_bwrite,
+ .bread = url_bio_bread,
+ .bputs = url_bio_bputs,
+ .bgets = NULL,
+ .ctrl = url_bio_ctrl,
+ .create = url_bio_create,
+ .destroy = url_bio_destroy,
+};
+#endif
+
int ff_openssl_init(void)
{
avpriv_lock_avformat();
@@ -128,73 +212,14 @@ static int tls_close(URLContext *h)
SSL_CTX_free(c->ctx);
if (c->tls_shared.tcp)
ffurl_close(c->tls_shared.tcp);
+#if OPENSSL_VERSION_NUMBER >= 0x1010000fL
+ if (c->url_bio_method)
+ BIO_meth_free(c->url_bio_method);
+#endif
ff_openssl_deinit();
return 0;
}
-static int url_bio_create(BIO *b)
-{
- b->init = 1;
- b->ptr = NULL;
- b->flags = 0;
- return 1;
-}
-
-static int url_bio_destroy(BIO *b)
-{
- return 1;
-}
-
-static int url_bio_bread(BIO *b, char *buf, int len)
-{
- URLContext *h = b->ptr;
- int ret = ffurl_read(h, buf, len);
- if (ret >= 0)
- return ret;
- BIO_clear_retry_flags(b);
- if (ret == AVERROR_EXIT)
- return 0;
- return -1;
-}
-
-static int url_bio_bwrite(BIO *b, const char *buf, int len)
-{
- URLContext *h = b->ptr;
- int ret = ffurl_write(h, buf, len);
- if (ret >= 0)
- return ret;
- BIO_clear_retry_flags(b);
- if (ret == AVERROR_EXIT)
- return 0;
- return -1;
-}
-
-static long url_bio_ctrl(BIO *b, int cmd, long num, void *ptr)
-{
- if (cmd == BIO_CTRL_FLUSH) {
- BIO_clear_retry_flags(b);
- return 1;
- }
- return 0;
-}
-
-static int url_bio_bputs(BIO *b, const char *str)
-{
- return url_bio_bwrite(b, str, strlen(str));
-}
-
-static BIO_METHOD url_bio_method = {
- .type = BIO_TYPE_SOURCE_SINK,
- .name = "urlprotocol bio",
- .bwrite = url_bio_bwrite,
- .bread = url_bio_bread,
- .bputs = url_bio_bputs,
- .bgets = NULL,
- .ctrl = url_bio_ctrl,
- .create = url_bio_create,
- .destroy = url_bio_destroy,
-};
-
static int tls_open(URLContext *h, const char *uri, int flags, AVDictionary **options)
{
TLSContext *p = h->priv_data;
@@ -240,8 +265,20 @@ static int tls_open(URLContext *h, const char *uri, int flags, AVDictionary **op
ret = AVERROR(EIO);
goto fail;
}
+#if OPENSSL_VERSION_NUMBER >= 0x1010000fL
+ p->url_bio_method = BIO_meth_new(BIO_TYPE_SOURCE_SINK, "urlprotocol bio");
+ BIO_meth_set_write(p->url_bio_method, url_bio_bwrite);
+ BIO_meth_set_read(p->url_bio_method, url_bio_bread);
+ BIO_meth_set_puts(p->url_bio_method, url_bio_bputs);
+ BIO_meth_set_ctrl(p->url_bio_method, url_bio_ctrl);
+ BIO_meth_set_create(p->url_bio_method, url_bio_create);
+ BIO_meth_set_destroy(p->url_bio_method, url_bio_destroy);
+ bio = BIO_new(p->url_bio_method);
+ BIO_set_data(bio, c->tcp);
+#else
bio = BIO_new(&url_bio_method);
bio->ptr = c->tcp;
+#endif
SSL_set_bio(p->ssl, bio, bio);
if (!c->listen && !c->numerichost)
SSL_set_tlsext_host_name(p->ssl, c->host);
More information about the ffmpeg-cvslog
mailing list