[FFmpeg-devel] [PATCH] openssl: Support version 1.1.0.

Matt Oliver protogonoi at gmail.com
Fri Oct 21 07:16:18 EEST 2016


On 15 October 2016 at 14:22, Matt Oliver <protogonoi at gmail.com> wrote:

> ---
>  configure                 |   3 +-
>  libavformat/tls_openssl.c | 163 ++++++++++++++++++++++++++++--
> ----------------
>  2 files changed, 102 insertions(+), 64 deletions(-)
>
> diff --git a/configure b/configure
> index e014615..3a92eb3 100755
> --- a/configure
> +++ b/configure
> @@ -5816,7 +5816,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);
> --
>

applied.


More information about the ffmpeg-devel mailing list