summaryrefslogtreecommitdiff
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-07-27 10:19:40 +0300
commitc5d326f551b0312ff581bf1df35b21d956e01523 (patch)
tree4736c5943b53002f6b17687a4a562c3e881563b3 /libavcodec/libopenh264.c
parent54a0a52be100d36291084f92b7d6aee1a4960acb (diff)
downloadffmpeg-c5d326f551b0312ff581bf1df35b21d956e01523.tar.gz
Add an OpenH264 decoder wrapper
This is cherrypicked from libav, from commits 82b7525173f20702a8cbc26ebedbf4b69b8fecec and d0b1e6049b06eeeeca146ece4d2f199c5dba1565. 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..59c61a3a4c
--- /dev/null
+++ b/libavcodec/libopenh264.c
@@ -0,0 +1,62 @@
+/*
+ * OpenH264 shared utils
+ * Copyright (C) 2014 Martin Storsjo
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg 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.
+ *
+ * FFmpeg 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 FFmpeg; 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 ffmpeg log level.
+static int libopenh264_to_ffmpeg_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 ffmpeg log level is
+ // less than or equal to the current ffmpeg log level.
+ int equiv_ffmpeg_log_level = libopenh264_to_ffmpeg_log_level(level);
+ av_log(ctx, equiv_ffmpeg_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;
+}