On Mon, 25 Jul 2016, Diego Biurrun wrote:

On Fri, Jul 15, 2016 at 01:43:16PM +0300, Martin Storsjö wrote:
This simplifies use of the patent license, simplifying use with a
library that has been downloaded at runtime (making it possible
to actually load and run libavcodec before the corresponding
OpenH264 library exists).
---
This patch was sent for review earlier, and got some feedback, but it was
deferred back then due not knowing how much interest there would be in it
- see https://patches.libav.org/patch/56287/.

Now there seems to be interest
in it, see https://lists.libav.org/pipermail/libav-devel/2016-July/078139.html,
so I'm resending it, with the feedback from the previous round applied,
and updated on top of the latest master.
---
 configure                   |  8 ++++--
 libavcodec/Makefile         |  1 +
 libavcodec/libopenh264.c    |  4 +--
 libavcodec/libopenh264.h    |  5 +++-
 libavcodec/libopenh264dec.c | 61 ++++++++++++++++++++++++++++++++++++++++++---
 libavcodec/libopenh264enc.c | 49 +++++++++++++++++++++++++++++++++---
 6 files changed, 115 insertions(+), 13 deletions(-)

I'm undecided about the general merits of this patch.

Some implementation remarks below...

--- a/configure
+++ b/configure
@@ -4594,6 +4596,8 @@ enabled libopencore_amrnb && require libopencore_amrnb 
opencore-amrnb/interf_dec
 enabled libopencv         && require_pkg_config opencv opencv/cv.h 
cvCreateImageHeader
 enabled libopenh264       && require_pkg_config openh264 wels/codec_api.h 
WelsGetCodecVersion
+enabled libopenh264_dyn   && { { check_header wels/codec_ver.h && enabled 
dyn_lib_open; } ||
+                                 die "ERROR: OpenH264 1.3 header not found, or 
dlopen/LoadLibrary not found"; }

Not sure if mentioning the version number here is a good idea looking
forward.

Right, removed.

index 8eb7d36..f639ac5 100644
--- a/libavcodec/Makefile
+++ b/libavcodec/Makefile
@@ -771,6 +771,7 @@ SKIPHEADERS                            += %_tablegen.h      
            \
 SKIPHEADERS-$(CONFIG_D3D11VA)          += d3d11va.h dxva2_internal.h
 SKIPHEADERS-$(CONFIG_DXVA2)            += dxva2.h dxva2_internal.h
 SKIPHEADERS-$(CONFIG_LIBSCHROEDINGER)  += libschroedinger.h
+SKIPHEADERS-$(CONFIG_LIBOPENH264)      += libopenh264.h

This will also skip the header if LIBOPENH264_DYN is set, which I think
is not what you intend.

Hmm, indeed. Fixing that properly is a bit harder...

--- a/libavcodec/libopenh264dec.c
+++ b/libavcodec/libopenh264dec.c
@@ -23,6 +23,9 @@
 #include <wels/codec_ver.h>

 #include "libavutil/common.h"
+#if CONFIG_LIBOPENH264_DYN
+#include "libavutil/dyn_lib_open.h"
+#endif

You are missing a config.h #include.

Sure

@@ -239,4 +291,5 @@ AVCodec ff_libopenh264_decoder = {
     .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_DR1,
     .caps_internal  = FF_CODEC_CAP_SETS_PKT_DTS | FF_CODEC_CAP_INIT_THREADSAFE 
|
                       FF_CODEC_CAP_INIT_CLEANUP,
+    .priv_class     = &class,

unrelated?

No, it's for hooking up the options (for setting the library name to load; previously the decoder wrapper didn't have any options).

--- a/libavcodec/libopenh264enc.c
+++ b/libavcodec/libopenh264enc.c
@@ -24,6 +24,9 @@

 #include "libavutil/attributes.h"
 #include "libavutil/common.h"
+#if CONFIG_LIBOPENH264_DYN
+#include "libavutil/dyn_lib_open.h"
+#endif
 #include "libavutil/opt.h"
 #include "libavutil/internal.h"
 #include "libavutil/intreadwrite.h"

You're missing a config.h #include.

--- a/libavcodec/libopenh264dec.c
+++ b/libavcodec/libopenh264dec.c
@@ -67,15 +93,41 @@ static av_cold int svc_decode_init(AVCodecContext *avctx)
     WelsTraceCallback callback_function;
+    int (*create_func)(ISVCDecoder **ppDecoder);
+    OpenH264Version (*get_version_func)(void);
+
+#if CONFIG_LIBOPENH264_DYN
+    if (!s->libname) {
+        av_log(avctx, AV_LOG_ERROR, "No library name provided\n");
+        return AVERROR(EINVAL);
+    }
+    s->lib = load_library(s->libname);
+    if (!s->lib) {
+        av_log(avctx, AV_LOG_ERROR, "Unable to load %s\n", s->libname);
+        return AVERROR(EINVAL);
+    }
+#endif

-    if ((err = ff_libopenh264_check_version(avctx)) < 0)
+    if ((err = ff_libopenh264_check_version(avctx, get_version_func)) < 0)
         return err;

--- a/libavcodec/libopenh264enc.c
+++ b/libavcodec/libopenh264enc.c
@@ -97,11 +112,37 @@ static av_cold int svc_encode_init(AVCodecContext *avctx)
     WelsTraceCallback callback_function;
     AVCPBProperties *props;
+    int (*create_func)(ISVCEncoder **ppEncoder);
+    OpenH264Version (*get_version_func)(void);
+
+#if CONFIG_LIBOPENH264_DYN
+    if (!s->libname) {
+        av_log(avctx, AV_LOG_ERROR, "No library name provided\n");
+        return AVERROR(EINVAL);
+    }
+    s->lib = load_library(s->libname);
+    if (!s->lib) {
+        av_log(avctx, AV_LOG_ERROR, "Unable to load %s\n", s->libname);
+        return AVERROR(EINVAL);
+    }
+#endif

-    if ((err = ff_libopenh264_check_version(avctx)) < 0)
+    if ((err = ff_libopenh264_check_version(avctx, get_version_func)) < 0)
         return err;

This looks similar enough that it could be shared between decoder and
encoder.

No, I don't think it's really worth it, since it'd still end up something like this:

#if CONFIG_LIBOPENH264_DYN
if (load_library_ifdef_dyn_and_warn_if_not(s->libname))
    return AVERROR(EINVAL);
create_func = get_function()
#endif


You save a reused load_library call and error logging, nothing more, both which are trivial enough.

// Martin
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to