3 * Copyright (C) 2005-2013 Team XBMC
6 * This Program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2, or (at your option)
11 * This Program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with XBMC; see the file COPYING. If not, write to the Free
18 * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19 * Boston, MA 02110-1301, USA.
20 * http://www.gnu.org/copyleft/gpl.html
24 #if (defined HAVE_CONFIG_H) && (!defined WIN32)
27 #include "DynamicDll.h"
28 #include "utils/log.h"
32 #pragma warning(disable:4244)
36 #if (defined USE_EXTERNAL_FFMPEG)
37 #include <libavutil/avutil.h>
38 // for av_get_default_channel_layout
39 #include <libavutil/audioconvert.h>
40 #include <libavutil/crc.h>
41 #include <libavutil/fifo.h>
42 // for LIBAVCODEC_VERSION_INT:
43 #include <libavcodec/avcodec.h>
44 // for enum AVSampleFormat
45 #include <libavutil/samplefmt.h>
46 #include <libavutil/opt.h>
47 #include <libavutil/mem.h>
48 #include <libavutil/mathematics.h>
50 #include "libavutil/avutil.h"
51 //for av_get_default_channel_layout
52 #include "libavutil/audioconvert.h"
53 #include "libavutil/crc.h"
54 #include "libavutil/opt.h"
55 #include "libavutil/mem.h"
56 #include "libavutil/fifo.h"
57 // for enum AVSampleFormat
58 #include "libavutil/samplefmt.h"
66 // calback used for logging
67 void ff_avutil_log(void* ptr, int level, const char* format, va_list va);
69 class DllAvUtilInterface
72 virtual ~DllAvUtilInterface() {}
73 virtual void av_log_set_callback(void (*)(void*, int, const char*, va_list))=0;
74 virtual void *av_malloc(unsigned int size)=0;
75 virtual void *av_mallocz(unsigned int size)=0;
76 virtual void *av_realloc(void *ptr, unsigned int size)=0;
77 virtual void av_free(void *ptr)=0;
78 virtual void av_freep(void *ptr)=0;
79 virtual int64_t av_rescale_rnd(int64_t a, int64_t b, int64_t c, enum AVRounding)=0;
80 virtual int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)=0;
81 virtual int av_crc_init(AVCRC *ctx, int le, int bits, uint32_t poly, int ctx_size)=0;
82 virtual const AVCRC* av_crc_get_table(AVCRCId crc_id)=0;
83 virtual uint32_t av_crc(const AVCRC *ctx, uint32_t crc, const uint8_t *buffer, size_t length)=0;
84 virtual int av_opt_set(void *obj, const char *name, const char *val, int search_flags)=0;
85 virtual int av_opt_set_double(void *obj, const char *name, double val, int search_flags)=0;
86 virtual int av_opt_set_int(void *obj, const char *name, int64_t val, int search_flags)=0;
87 virtual AVFifoBuffer *av_fifo_alloc(unsigned int size) = 0;
88 virtual void av_fifo_free(AVFifoBuffer *f) = 0;
89 virtual void av_fifo_reset(AVFifoBuffer *f) = 0;
90 virtual int av_fifo_size(AVFifoBuffer *f) = 0;
91 virtual int av_fifo_generic_read(AVFifoBuffer *f, void *dest, int buf_size, void (*func)(void*, void*, int)) = 0;
92 virtual int av_fifo_generic_write(AVFifoBuffer *f, void *src, int size, int (*func)(void*, void*, int)) = 0;
93 virtual char *av_strdup(const char *s)=0;
94 virtual int av_get_bytes_per_sample(enum AVSampleFormat p1) = 0;
95 virtual AVDictionaryEntry *av_dict_get(AVDictionary *m, const char *key, const AVDictionaryEntry *prev, int flags) = 0;
96 virtual int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags)=0;
97 virtual void av_dict_free(AVDictionary **pm) = 0;
98 virtual int av_samples_get_buffer_size (int *linesize, int nb_channels, int nb_samples, enum AVSampleFormat sample_fmt, int align) = 0;
99 virtual int64_t av_get_default_channel_layout(int nb_channels)=0;
100 virtual int av_samples_alloc(uint8_t **audio_data, int *linesize, int nb_channels, int nb_samples, enum AVSampleFormat sample_fmt, int align) = 0;
101 virtual int av_sample_fmt_is_planar(enum AVSampleFormat sample_fmt) = 0;
102 virtual int av_get_channel_layout_channel_index (uint64_t channel_layout, uint64_t channel) = 0;
103 virtual int av_samples_fill_arrays(uint8_t **audio_data, int *linesize, const uint8_t *buf, int nb_channels, int nb_samples, enum AVSampleFormat sample_fmt, int align) = 0;
104 virtual int av_samples_copy(uint8_t **dst, uint8_t *const *src, int dst_offset, int src_offset, int nb_samples, int nb_channels, enum AVSampleFormat sample_fmt) = 0;
107 #if defined (USE_EXTERNAL_FFMPEG) || (defined TARGET_DARWIN)
109 class DllAvUtilBase : public DllDynamic, DllAvUtilInterface
113 virtual ~DllAvUtilBase() {}
114 virtual void av_log_set_callback(void (*foo)(void*, int, const char*, va_list)) { ::av_log_set_callback(foo); }
115 virtual void *av_malloc(unsigned int size) { return ::av_malloc(size); }
116 virtual void *av_mallocz(unsigned int size) { return ::av_mallocz(size); }
117 virtual void *av_realloc(void *ptr, unsigned int size) { return ::av_realloc(ptr, size); }
118 virtual void av_free(void *ptr) { ::av_free(ptr); }
119 virtual void av_freep(void *ptr) { ::av_freep(ptr); }
120 virtual int64_t av_rescale_rnd(int64_t a, int64_t b, int64_t c, enum AVRounding d) { return ::av_rescale_rnd(a, b, c, d); }
121 virtual int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq) { return ::av_rescale_q(a, bq, cq); }
122 virtual int av_crc_init(AVCRC *ctx, int le, int bits, uint32_t poly, int ctx_size) { return ::av_crc_init(ctx, le, bits, poly, ctx_size); }
123 virtual const AVCRC* av_crc_get_table(AVCRCId crc_id) { return ::av_crc_get_table(crc_id); }
124 virtual uint32_t av_crc(const AVCRC *ctx, uint32_t crc, const uint8_t *buffer, size_t length) { return ::av_crc(ctx, crc, buffer, length); }
125 virtual int av_opt_set(void *obj, const char *name, const char *val, int search_flags) { return ::av_opt_set(obj, name, val, search_flags); }
126 virtual int av_opt_set_double(void *obj, const char *name, double val, int search_flags) { return ::av_opt_set_double(obj, name, val, search_flags); }
127 virtual int av_opt_set_int(void *obj, const char *name, int64_t val, int search_flags) { return ::av_opt_set_int(obj, name, val, search_flags); }
128 virtual AVFifoBuffer *av_fifo_alloc(unsigned int size) {return ::av_fifo_alloc(size); }
129 virtual void av_fifo_free(AVFifoBuffer *f) { ::av_fifo_free(f); }
130 virtual void av_fifo_reset(AVFifoBuffer *f) { ::av_fifo_reset(f); }
131 virtual int av_fifo_size(AVFifoBuffer *f) { return ::av_fifo_size(f); }
132 virtual int av_fifo_generic_read(AVFifoBuffer *f, void *dest, int buf_size, void (*func)(void*, void*, int))
133 { return ::av_fifo_generic_read(f, dest, buf_size, func); }
134 virtual int av_fifo_generic_write(AVFifoBuffer *f, void *src, int size, int (*func)(void*, void*, int))
135 { return ::av_fifo_generic_write(f, src, size, func); }
136 virtual char *av_strdup(const char *s) { return ::av_strdup(s); }
137 virtual int av_get_bytes_per_sample(enum AVSampleFormat p1)
138 { return ::av_get_bytes_per_sample(p1); }
139 virtual AVDictionaryEntry *av_dict_get(AVDictionary *m, const char *key, const AVDictionaryEntry *prev, int flags){ return ::av_dict_get(m, key, prev, flags); }
140 virtual int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags) { return ::av_dict_set(pm, key, value, flags); }
141 virtual void av_dict_free(AVDictionary **pm) { ::av_dict_free(pm); }
142 virtual int av_samples_get_buffer_size (int *linesize, int nb_channels, int nb_samples, enum AVSampleFormat sample_fmt, int align)
143 { return ::av_samples_get_buffer_size(linesize, nb_channels, nb_samples, sample_fmt, align); }
144 virtual int64_t av_get_default_channel_layout(int nb_channels) { return ::av_get_default_channel_layout(nb_channels); }
145 virtual int av_samples_alloc(uint8_t **audio_data, int *linesize, int nb_channels, int nb_samples, enum AVSampleFormat sample_fmt, int align)
146 { return ::av_samples_alloc(audio_data, linesize, nb_channels, nb_samples, sample_fmt, align); }
147 virtual int av_sample_fmt_is_planar(enum AVSampleFormat sample_fmt) { return ::av_sample_fmt_is_planar(sample_fmt); }
148 virtual int av_get_channel_layout_channel_index (uint64_t channel_layout, uint64_t channel) { return ::av_get_channel_layout_channel_index(channel_layout, channel); }
149 virtual int av_samples_fill_arrays(uint8_t **audio_data, int *linesize, const uint8_t *buf, int nb_channels, int nb_samples, enum AVSampleFormat sample_fmt, int align)
150 { return ::av_samples_fill_arrays(audio_data, linesize, buf, nb_channels, nb_samples, AVSampleFormat sample_fmt, align); }
151 virtual int av_samples_copy(uint8_t **dst, uint8_t *const *src, int dst_offset, int src_offset, int nb_samples, int nb_channels, enum AVSampleFormat sample_fmt)
152 { return ::av_samples_copy(dst, src, dst_offset, src_offset, nb_samples, nb_channels, sample_fmt); }
155 virtual bool ResolveExports() { return true; }
156 virtual bool Load() {
157 #if !defined(TARGET_DARWIN)
158 CLog::Log(LOGDEBUG, "DllAvUtilBase: Using libavutil system library");
162 virtual void Unload() {}
167 class DllAvUtilBase : public DllDynamic, DllAvUtilInterface
169 DECLARE_DLL_WRAPPER(DllAvUtilBase, DLL_PATH_LIBAVUTIL)
173 DEFINE_METHOD1(void, av_log_set_callback, (void (*p1)(void*, int, const char*, va_list)))
174 DEFINE_METHOD1(void*, av_malloc, (unsigned int p1))
175 DEFINE_METHOD1(void*, av_mallocz, (unsigned int p1))
176 DEFINE_METHOD2(void*, av_realloc, (void *p1, unsigned int p2))
177 DEFINE_METHOD1(void, av_free, (void *p1))
178 DEFINE_METHOD1(void, av_freep, (void *p1))
179 DEFINE_METHOD4(int64_t, av_rescale_rnd, (int64_t p1, int64_t p2, int64_t p3, enum AVRounding p4));
180 DEFINE_METHOD3(int64_t, av_rescale_q, (int64_t p1, AVRational p2, AVRational p3));
181 DEFINE_METHOD1(const AVCRC*, av_crc_get_table, (AVCRCId p1))
182 DEFINE_METHOD5(int, av_crc_init, (AVCRC *p1, int p2, int p3, uint32_t p4, int p5));
183 DEFINE_METHOD4(uint32_t, av_crc, (const AVCRC *p1, uint32_t p2, const uint8_t *p3, size_t p4));
184 DEFINE_METHOD4(int, av_opt_set, (void *p1, const char *p2, const char *p3, int p4));
185 DEFINE_METHOD4(int, av_opt_set_double, (void *p1, const char *p2, double p3, int p4))
186 DEFINE_METHOD4(int, av_opt_set_int, (void *p1, const char *p2, int64_t p3, int p4))
187 DEFINE_METHOD1(AVFifoBuffer*, av_fifo_alloc, (unsigned int p1))
188 DEFINE_METHOD1(void, av_fifo_free, (AVFifoBuffer *p1))
189 DEFINE_METHOD1(void, av_fifo_reset, (AVFifoBuffer *p1))
190 DEFINE_METHOD1(int, av_fifo_size, (AVFifoBuffer *p1))
191 DEFINE_METHOD4(int, av_fifo_generic_read, (AVFifoBuffer *p1, void *p2, int p3, void (*p4)(void*, void*, int)))
192 DEFINE_METHOD4(int, av_fifo_generic_write, (AVFifoBuffer *p1, void *p2, int p3, int (*p4)(void*, void*, int)))
193 DEFINE_METHOD1(char*, av_strdup, (const char *p1))
194 DEFINE_METHOD1(int, av_get_bytes_per_sample, (enum AVSampleFormat p1))
195 DEFINE_METHOD4(AVDictionaryEntry *, av_dict_get, (AVDictionary *p1, const char *p2, const AVDictionaryEntry *p3, int p4))
196 DEFINE_METHOD4(int, av_dict_set, (AVDictionary **p1, const char *p2, const char *p3, int p4));
197 DEFINE_METHOD1(void, av_dict_free, (AVDictionary **p1));
198 DEFINE_METHOD5(int, av_samples_get_buffer_size, (int *p1, int p2, int p3, enum AVSampleFormat p4, int p5))
199 DEFINE_METHOD1(int64_t, av_get_default_channel_layout, (int p1))
200 DEFINE_METHOD6(int, av_samples_alloc, (uint8_t **p1, int *p2, int p3, int p4, enum AVSampleFormat p5, int p6))
201 DEFINE_METHOD1(int, av_sample_fmt_is_planar, (enum AVSampleFormat p1))
202 DEFINE_METHOD2(int, av_get_channel_layout_channel_index, (uint64_t p1, uint64_t p2))
203 DEFINE_METHOD7(int, av_samples_fill_arrays, (uint8_t **p1, int *p2, const uint8_t *p3, int p4, int p5, enum AVSampleFormat p6, int p7))
204 DEFINE_METHOD7(int, av_samples_copy, (uint8_t **p1, uint8_t *const *p2, int p3, int p4, int p5, int p6, enum AVSampleFormat p7))
207 BEGIN_METHOD_RESOLVE()
208 RESOLVE_METHOD(av_log_set_callback)
209 RESOLVE_METHOD(av_malloc)
210 RESOLVE_METHOD(av_mallocz)
211 RESOLVE_METHOD(av_realloc)
212 RESOLVE_METHOD(av_free)
213 RESOLVE_METHOD(av_freep)
214 RESOLVE_METHOD(av_rescale_rnd)
215 RESOLVE_METHOD(av_rescale_q)
216 RESOLVE_METHOD(av_crc_init)
217 RESOLVE_METHOD(av_crc_get_table)
218 RESOLVE_METHOD(av_crc)
219 RESOLVE_METHOD(av_opt_set)
220 RESOLVE_METHOD(av_opt_set_double)
221 RESOLVE_METHOD(av_opt_set_int)
222 RESOLVE_METHOD(av_fifo_alloc)
223 RESOLVE_METHOD(av_fifo_free)
224 RESOLVE_METHOD(av_fifo_reset)
225 RESOLVE_METHOD(av_fifo_size)
226 RESOLVE_METHOD(av_fifo_generic_read)
227 RESOLVE_METHOD(av_fifo_generic_write)
228 RESOLVE_METHOD(av_strdup)
229 RESOLVE_METHOD(av_get_bytes_per_sample)
230 RESOLVE_METHOD(av_dict_get)
231 RESOLVE_METHOD(av_dict_set)
232 RESOLVE_METHOD(av_dict_free)
233 RESOLVE_METHOD(av_samples_get_buffer_size)
234 RESOLVE_METHOD(av_get_default_channel_layout)
235 RESOLVE_METHOD(av_samples_alloc)
236 RESOLVE_METHOD(av_sample_fmt_is_planar)
237 RESOLVE_METHOD(av_get_channel_layout_channel_index)
238 RESOLVE_METHOD(av_samples_fill_arrays)
239 RESOLVE_METHOD(av_samples_copy)
245 class DllAvUtil : public DllAvUtilBase
250 if( DllAvUtilBase::Load() )
252 DllAvUtilBase::av_log_set_callback(ff_avutil_log);