aboutsummaryrefslogtreecommitdiffstats
path: root/libavcodec/libopenh264.c
diff options
context:
space:
mode:
authorMartin Storsjö <martin@martin.st>2016-06-24 00:58:17 +0300
committerMartin Storsjö <martin@martin.st>2016-06-28 14:17:43 +0300
commit82b7525173f20702a8cbc26ebedbf4b69b8fecec (patch)
tree125eb3d187db9c5a9da834e7aa8ee1696461fb3b /libavcodec/libopenh264.c
parent785c25443b56adb6dbbb78d68cccbd9bd4a42e05 (diff)
downloadffmpeg-82b7525173f20702a8cbc26ebedbf4b69b8fecec.tar.gz
Add an OpenH264 decoder wrapper
While it is less featureful (and slower) than the built-in H264 decoder, one could potentially want to use it to take advantage of the cisco patent license offer. Signed-off-by: Martin Storsjö <martin@martin.st>
Diffstat (limited to 'libavcodec/libopenh264.c')
-rw-r--r--libavcodec/libopenh264.c62
1 files changed, 62 insertions, 0 deletions
diff --git a/libavcodec/libopenh264.c b/libavcodec/libopenh264.c
new file mode 100644
index 0000000000..6252cfdc34
--- /dev/null
+++ b/libavcodec/libopenh264.c
@@ -0,0 +1,62 @@
+/*
+ * OpenH264 shared utils
+ * Copyright (C) 2014 Martin Storsjo
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include <string.h>
+#include <wels/codec_api.h>
+#include <wels/codec_ver.h>
+
+#include "libavutil/log.h"
+
+#include "libopenh264.h"
+
+// Convert libopenh264 log level to equivalent libav log level.
+static int libopenh264_to_libav_log_level(int libopenh264_log_level)
+{
+ if (libopenh264_log_level >= WELS_LOG_DETAIL) return AV_LOG_TRACE;
+ else if (libopenh264_log_level >= WELS_LOG_DEBUG) return AV_LOG_DEBUG;
+ else if (libopenh264_log_level >= WELS_LOG_INFO) return AV_LOG_VERBOSE;
+ else if (libopenh264_log_level >= WELS_LOG_WARNING) return AV_LOG_WARNING;
+ else if (libopenh264_log_level >= WELS_LOG_ERROR) return AV_LOG_ERROR;
+ else return AV_LOG_QUIET;
+}
+
+void ff_libopenh264_trace_callback(void *ctx, int level, const char *msg)
+{
+ // The message will be logged only if the requested EQUIVALENT libav log level is
+ // less than or equal to the current libav log level.
+ int equiv_libav_log_level = libopenh264_to_libav_log_level(level);
+ av_log(ctx, equiv_libav_log_level, "%s\n", msg);
+}
+
+int ff_libopenh264_check_version(void *logctx)
+{
+ // Mingw GCC < 4.7 on x86_32 uses an incorrect/buggy ABI for the WelsGetCodecVersion
+ // function (for functions returning larger structs), thus skip the check in those
+ // configurations.
+#if !defined(_WIN32) || !defined(__GNUC__) || !ARCH_X86_32 || AV_GCC_VERSION_AT_LEAST(4, 7)
+ OpenH264Version libver = WelsGetCodecVersion();
+ if (memcmp(&libver, &g_stCodecVersion, sizeof(libver))) {
+ av_log(logctx, AV_LOG_ERROR, "Incorrect library version loaded\n");
+ return AVERROR(EINVAL);
+ }
+#endif
+ return 0;
+}