Merge pull request #2231 from stupid-boy/CpuFreq
[vuplus_xbmc] / lib / DllSwResample.h
1 #pragma once
2 /*
3  *      Copyright (C) 2005-2013 Team XBMC
4  *      http://www.xbmc.org
5  *
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)
9  *  any later version.
10  *
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.
15  *
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
18  *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
19  *  http://www.gnu.org/copyleft/gpl.html
20  *
21  */
22
23 #if (defined HAVE_CONFIG_H) && (!defined WIN32)
24   #include "config.h"
25 #endif
26 #include "DynamicDll.h"
27 #include "utils/log.h"
28
29 extern "C" {
30 #ifndef HAVE_MMX
31 #define HAVE_MMX
32 #endif
33 #ifndef __STDC_CONSTANT_MACROS
34 #define __STDC_CONSTANT_MACROS
35 #endif
36 #ifndef __GNUC__
37 #pragma warning(disable:4244)
38 #endif
39 #if (defined USE_EXTERNAL_FFMPEG)
40   #if HAVE_LIBSWRESAMPLE_SWRESAMPLE_H
41     #include <libswresample/swresample.h>
42   #elif HAVE_LIBAVRESAMPLE_AVRESAMPLE_H
43     #include <libavresample/avresample.h>
44     #include <libavutil/opt.h>
45     #include <libavutil/samplefmt.h>
46     #define SwrContext AVAudioResampleContext
47   #else
48     #error "Either libswresample or libavresample is needed!"
49   #endif
50 #else
51   #include "libswresample/swresample.h"
52 #endif
53 }
54
55 class DllSwResampleInterface
56 {
57 public:
58   virtual ~DllSwResampleInterface() {}
59   virtual struct SwrContext *swr_alloc_set_opts(struct SwrContext *s, int64_t out_ch_layout, enum AVSampleFormat out_sample_fmt, int out_sample_rate, int64_t in_ch_layout, enum AVSampleFormat in_sample_fmt, int in_sample_rate, int log_offset, void *log_ctx)=0;
60   virtual int swr_init(struct SwrContext *s)=0;
61   virtual void swr_free(struct SwrContext **s)=0;
62   virtual int swr_convert(struct SwrContext *s, uint8_t **out, int out_count, const uint8_t **in , int in_count)=0;
63   virtual int64_t swr_get_delay(struct SwrContext *s, int64_t base) = 0;
64   virtual int swr_set_channel_mapping(struct SwrContext *s, const int *channel_map) = 0;
65   virtual int swr_set_matrix(struct SwrContext *s, const double *matrix, int stride) = 0;
66 };
67
68 #if (defined USE_EXTERNAL_FFMPEG) || (defined TARGET_DARWIN) 
69
70 #if HAVE_LIBSWRESAMPLE_SWRESAMPLE_H || (defined TARGET_DARWIN)
71 // Use direct mapping
72 class DllSwResample : public DllDynamic, DllSwResampleInterface
73 {
74 public:
75   virtual ~DllSwResample() {}
76
77   // DLL faking.
78   virtual bool ResolveExports() { return true; }
79   virtual bool Load() {
80 #if !defined(TARGET_DARWIN)
81     CLog::Log(LOGDEBUG, "DllAvFormat: Using libswresample system library");
82 #endif
83     return true;
84   }
85   virtual void Unload() {}
86   virtual struct SwrContext *swr_alloc_set_opts(struct SwrContext *s, int64_t out_ch_layout, enum AVSampleFormat out_sample_fmt, int out_sample_rate, int64_t in_ch_layout, enum AVSampleFormat in_sample_fmt, int in_sample_rate, int log_offset, void *log_ctx) { return ::swr_alloc_set_opts(s, out_ch_layout, out_sample_fmt, out_sample_rate, in_ch_layout, in_sample_fmt, in_sample_rate, log_offset, log_ctx); }
87   virtual int swr_init(struct SwrContext *s) { return ::swr_init(s); }
88   virtual void swr_free(struct SwrContext **s){ return ::swr_free(s); }
89   virtual int swr_convert(struct SwrContext *s, uint8_t **out, int out_count, const uint8_t **in , int in_count){ return ::swr_convert(s, out, out_count, in, in_count); }
90   virtual int64_t swr_get_delay(struct SwrContext *s, int64_t base) { return ::swr_get_delay(s, base); }
91   virtual int swr_set_channel_mapping (struct SwrContext *s, const int *channel_map) { return ::swr_set_channel_mapping(s, channel_map); }
92   virtual int swr_set_matrix(struct SwrContext *s, const double *matrix, int stride) { return ::swr_set_matrix(s, matrix, stride); }
93 };
94 #else
95 // Wrap the same API through libavresample.
96 class DllSwResample : public DllDynamic, DllSwResampleInterface
97 {
98 public:
99   virtual ~DllSwResample() {}
100
101   // DLL faking.
102   virtual bool ResolveExports() { return true; }
103   virtual bool Load() {
104 #if !defined(TARGET_DARWIN)
105     CLog::Log(LOGDEBUG, "DllAvFormat: Using libavresample system library");
106 #endif
107     return true;
108   }
109   virtual void Unload() {}
110   virtual struct SwrContext *swr_alloc_set_opts(struct SwrContext *s, int64_t out_ch_layout, enum AVSampleFormat out_sample_fmt, int out_sample_rate, int64_t in_ch_layout, enum AVSampleFormat in_sample_fmt, int in_sample_rate, int log_offset, void *log_ctx) {
111           AVAudioResampleContext *ret = ::avresample_alloc_context();
112           av_opt_set_int(ret, "out_channel_layout", out_ch_layout  , 0);
113           av_opt_set_int(ret, "out_sample_fmt"    , out_sample_fmt , 0);
114           av_opt_set_int(ret, "out_sample_rate"   , out_sample_rate, 0);
115           av_opt_set_int(ret, "in_channel_layout" , in_ch_layout   , 0);
116           av_opt_set_int(ret, "in_sample_fmt"     , in_sample_fmt  , 0);
117           av_opt_set_int(ret, "in_sample_rate"    , in_sample_rate , 0);
118           return ret;
119   }
120   virtual int swr_init(struct SwrContext *s) { return ::avresample_open(s); }
121   virtual void swr_free(struct SwrContext **s){ ::avresample_close(*s); *s = NULL; }
122   virtual int swr_convert(struct SwrContext *s, uint8_t **out, int out_count, const uint8_t **in , int in_count){ return ::avresample_convert(s, out, 0, out_count, (uint8_t**)in, 0,in_count); }
123 };
124 #endif
125
126 #else
127
128 class DllSwResample : public DllDynamic, DllSwResampleInterface
129 {
130   DECLARE_DLL_WRAPPER(DllSwResample, DLL_PATH_LIBSWRESAMPLE)
131
132   LOAD_SYMBOLS()
133
134   DEFINE_METHOD9(SwrContext*, swr_alloc_set_opts, (struct SwrContext *p1, int64_t p2, enum AVSampleFormat p3, int p4, int64_t p5, enum AVSampleFormat p6, int p7, int p8, void * p9));
135   DEFINE_METHOD1(int, swr_init, (struct SwrContext *p1))
136   DEFINE_METHOD1(void, swr_free, (struct SwrContext **p1))
137   DEFINE_METHOD5(int, swr_convert, (struct SwrContext *p1, uint8_t **p2, int p3, const uint8_t **p4, int p5))
138   DEFINE_METHOD2(int64_t, swr_get_delay, (struct SwrContext *p1, int64_t p2))
139   DEFINE_METHOD2(int, swr_set_channel_mapping, (struct SwrContext *p1, const int *p2))
140   DEFINE_METHOD3(int, swr_set_matrix, (struct SwrContext *p1, const double *p2, int p3))
141
142   BEGIN_METHOD_RESOLVE()
143     RESOLVE_METHOD(swr_alloc_set_opts)
144     RESOLVE_METHOD(swr_init)
145     RESOLVE_METHOD(swr_free)
146     RESOLVE_METHOD(swr_convert)
147     RESOLVE_METHOD(swr_get_delay)
148     RESOLVE_METHOD(swr_set_channel_mapping)
149     RESOLVE_METHOD(swr_set_matrix)
150   END_METHOD_RESOLVE()
151
152   /* dependencies of libavformat */
153   DllAvUtil m_dllAvUtil;
154
155 public:
156
157   virtual bool Load()
158   {
159     if (!m_dllAvUtil.Load())
160       return false;
161     return DllDynamic::Load();
162   }
163 };
164
165 #endif