summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libavformat/libopenmpt.c25
1 files changed, 25 insertions, 0 deletions
diff --git a/libavformat/libopenmpt.c b/libavformat/libopenmpt.c
index 2e22290003..30c3d6e646 100644
--- a/libavformat/libopenmpt.c
+++ b/libavformat/libopenmpt.c
@@ -21,6 +21,14 @@
#include <libopenmpt/libopenmpt.h>
#include <libopenmpt/libopenmpt_stream_callbacks_file.h>
+#include <libopenmpt/libopenmpt_version.h>
+/* Shims to support libopenmpt < 0.3.0 (as documented by libopenmpt) */
+#if !defined(OPENMPT_API_VERSION_MAKE)
+#define OPENMPT_API_VERSION_MAKE(major, minor, patch) (((major)<<24)|((minor)<<16)|((patch)<<0))
+#endif
+#if !defined(OPENMPT_API_VERSION_AT_LEAST)
+#define OPENMPT_API_VERSION_AT_LEAST(major, minor, patch) (OPENMPT_API_VERSION >= OPENMPT_API_VERSION_MAKE((major), (minor), (patch)))
+#endif
#include "libavutil/avstring.h"
#include "libavutil/opt.h"
@@ -74,6 +82,9 @@ static int read_header_openmpt(AVFormatContext *s)
OpenMPTContext *openmpt = s->priv_data;
int64_t size;
char *buf;
+#if OPENMPT_API_VERSION_AT_LEAST(0,3,0)
+ int error;
+#endif
int ret;
size = avio_size(s->pb);
@@ -89,10 +100,24 @@ static int read_header_openmpt(AVFormatContext *s)
return size;
}
+#if OPENMPT_API_VERSION_AT_LEAST(0,3,0)
+ error = OPENMPT_ERROR_OK;
+ openmpt->module = openmpt_module_create_from_memory2(buf, size, openmpt_logfunc, s, NULL, NULL, &error, NULL, NULL);
+ av_freep(&buf);
+ if (!openmpt->module) {
+ if (error == OPENMPT_ERROR_OUT_OF_MEMORY)
+ return AVERROR(ENOMEM);
+ else if (error >= OPENMPT_ERROR_GENERAL)
+ return AVERROR_INVALIDDATA;
+ else
+ return AVERROR_UNKNOWN;
+ }
+#else
openmpt->module = openmpt_module_create_from_memory(buf, size, openmpt_logfunc, s, NULL);
av_freep(&buf);
if (!openmpt->module)
return AVERROR_INVALIDDATA;
+#endif
openmpt->channels = av_get_channel_layout_nb_channels(openmpt->layout);