Merge pull request #2657 from aballier/aacoutput
[vuplus_xbmc] / lib / DllAvFormat.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 "DllAvCodec.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 (defined HAVE_LIBAVFORMAT_AVFORMAT_H)
41     #include <libavformat/avformat.h>
42   #else
43     #include <ffmpeg/avformat.h>
44   #endif
45   /* xbmc_read_frame_flush() is defined for us in lib/xbmc-dll-symbols/DllAvFormat.c */
46   void xbmc_read_frame_flush(AVFormatContext *s);
47 #else
48   #include "libavformat/avformat.h"
49   #if defined(TARGET_DARWIN)
50     void ff_read_frame_flush(AVFormatContext *s);    // internal replacement 
51     #define xbmc_read_frame_flush ff_read_frame_flush
52   #endif
53 #endif
54 }
55
56 /* Flag introduced without a version bump */
57 #ifndef AVSEEK_FORCE
58 #define AVSEEK_FORCE 0x20000
59 #endif
60
61 typedef int64_t offset_t;
62
63 class DllAvFormatInterface
64 {
65 public:
66   virtual ~DllAvFormatInterface() {}
67   virtual void av_register_all_dont_call(void)=0;
68   virtual AVInputFormat *av_find_input_format(const char *short_name)=0;
69   virtual void avformat_close_input(AVFormatContext **s)=0;
70   virtual int av_read_frame(AVFormatContext *s, AVPacket *pkt)=0;
71   virtual void av_read_frame_flush(AVFormatContext *s)=0;
72   virtual int av_read_play(AVFormatContext *s)=0;
73   virtual int av_read_pause(AVFormatContext *s)=0;
74   virtual int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)=0;
75 #if (!defined USE_EXTERNAL_FFMPEG) && (!defined TARGET_DARWIN)
76   virtual int avformat_find_stream_info_dont_call(AVFormatContext *ic, AVDictionary **options)=0;
77 #endif
78   virtual int avformat_open_input(AVFormatContext **ps, const char *filename, AVInputFormat *fmt, AVDictionary **options)=0;
79   virtual AVIOContext *avio_alloc_context(unsigned char *buffer, int buffer_size, int write_flag, void *opaque,
80                             int (*read_packet)(void *opaque, uint8_t *buf, int buf_size),
81                             int (*write_packet)(void *opaque, uint8_t *buf, int buf_size),
82                             offset_t (*seek)(void *opaque, offset_t offset, int whence))=0;
83   virtual AVInputFormat *av_probe_input_format(AVProbeData *pd, int is_opened)=0;
84   virtual AVInputFormat *av_probe_input_format2(AVProbeData *pd, int is_opened, int *score_max)=0;
85   virtual int av_probe_input_buffer(AVIOContext *pb, AVInputFormat **fmt, const char *filename, void *logctx, unsigned int offset, unsigned int max_probe_size)=0;
86   virtual void av_dump_format(AVFormatContext *ic, int index, const char *url, int is_output)=0;
87   virtual int avio_open(AVIOContext **s, const char *filename, int flags)=0;
88   virtual int avio_close(AVIOContext *s)=0;
89   virtual int avio_open_dyn_buf(AVIOContext **s)=0;
90   virtual int avio_close_dyn_buf(AVIOContext *s, uint8_t **pbuffer)=0;
91   virtual offset_t avio_seek(AVIOContext *s, offset_t offset, int whence)=0;
92   virtual int avio_read(AVIOContext *s, unsigned char *buf, int size)=0;
93   virtual void avio_w8(AVIOContext *s, int b)=0;
94   virtual void avio_write(AVIOContext *s, const unsigned char *buf, int size)=0;
95   virtual void avio_wb24(AVIOContext *s, unsigned int val)=0;
96   virtual void avio_wb32(AVIOContext *s, unsigned int val)=0;
97   virtual void avio_wb16(AVIOContext *s, unsigned int val)=0;
98   virtual AVFormatContext *avformat_alloc_context(void)=0;
99   virtual AVStream *avformat_new_stream(AVFormatContext *s, AVCodec *c)=0;
100   virtual AVOutputFormat *av_guess_format(const char *short_name, const char *filename, const char *mime_type)=0;
101   virtual int avformat_write_header (AVFormatContext *s, AVDictionary **options)=0;
102   virtual int av_write_trailer(AVFormatContext *s)=0;
103   virtual int av_write_frame  (AVFormatContext *s, AVPacket *pkt)=0;
104 };
105
106 #if (defined USE_EXTERNAL_FFMPEG) || (defined TARGET_DARWIN) 
107
108 // Use direct mapping
109 class DllAvFormat : public DllDynamic, DllAvFormatInterface
110 {
111 public:
112   virtual ~DllAvFormat() {}
113   virtual void av_register_all() 
114   { 
115     CSingleLock lock(DllAvCodec::m_critSection);
116     return ::av_register_all();
117   } 
118   virtual void av_register_all_dont_call() { *(volatile int* )0x0 = 0; } 
119   virtual AVInputFormat *av_find_input_format(const char *short_name) { return ::av_find_input_format(short_name); }
120   virtual void avformat_close_input(AVFormatContext **s) { ::avformat_close_input(s); }
121   virtual int av_read_frame(AVFormatContext *s, AVPacket *pkt) { return ::av_read_frame(s, pkt); }
122   virtual void av_read_frame_flush(AVFormatContext *s) { ::xbmc_read_frame_flush(s); }
123   virtual int av_read_play(AVFormatContext *s) { return ::av_read_play(s); }
124   virtual int av_read_pause(AVFormatContext *s) { return ::av_read_pause(s); }
125   virtual int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int flags) { return ::av_seek_frame(s, stream_index, timestamp, flags); }
126   virtual int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
127   {
128     CSingleLock lock(DllAvCodec::m_critSection);
129     return ::avformat_find_stream_info(ic, options);
130   }
131   virtual int avformat_open_input(AVFormatContext **ps, const char *filename, AVInputFormat *fmt, AVDictionary **options)
132   { return ::avformat_open_input(ps, filename, fmt, options); }
133   virtual AVIOContext *avio_alloc_context(unsigned char *buffer, int buffer_size, int write_flag, void *opaque,
134                             int (*read_packet)(void *opaque, uint8_t *buf, int buf_size),
135                             int (*write_packet)(void *opaque, uint8_t *buf, int buf_size),
136                             offset_t (*seek)(void *opaque, offset_t offset, int whence)) { return ::avio_alloc_context(buffer, buffer_size, write_flag, opaque, read_packet, write_packet, seek); }
137   virtual AVInputFormat *av_probe_input_format(AVProbeData *pd, int is_opened) {return ::av_probe_input_format(pd, is_opened); }
138   virtual AVInputFormat *av_probe_input_format2(AVProbeData *pd, int is_opened, int *score_max) {*score_max = 100; return ::av_probe_input_format(pd, is_opened); } // Use av_probe_input_format, this is not exported by ffmpeg's headers
139   virtual int av_probe_input_buffer(AVIOContext *pb, AVInputFormat **fmt, const char *filename, void *logctx, unsigned int offset, unsigned int max_probe_size) { return ::av_probe_input_buffer(pb, fmt, filename, logctx, offset, max_probe_size); }
140   virtual void av_dump_format(AVFormatContext *ic, int index, const char *url, int is_output) { ::av_dump_format(ic, index, url, is_output); }
141   virtual int avio_open(AVIOContext **s, const char *filename, int flags) { return ::avio_open(s, filename, flags); }
142   virtual int avio_close(AVIOContext *s) { return ::avio_close(s); }
143   virtual int avio_open_dyn_buf(AVIOContext **s) { return ::avio_open_dyn_buf(s); }
144   virtual int avio_close_dyn_buf(AVIOContext *s, uint8_t **pbuffer) { return ::avio_close_dyn_buf(s, pbuffer); }
145   virtual offset_t avio_seek(AVIOContext *s, offset_t offset, int whence) { return ::avio_seek(s, offset, whence); }
146   virtual int avio_read(AVIOContext *s, unsigned char *buf, int size) { return ::avio_read(s, buf, size); }
147   virtual void avio_w8(AVIOContext *s, int b) { ::avio_w8(s, b); }
148   virtual void avio_write(AVIOContext *s, const unsigned char *buf, int size) { ::avio_write(s, buf, size); }
149   virtual void avio_wb24(AVIOContext *s, unsigned int val) { ::avio_wb24(s, val); }
150   virtual void avio_wb32(AVIOContext *s, unsigned int val) { ::avio_wb32(s, val); }
151   virtual void avio_wb16(AVIOContext *s, unsigned int val) { ::avio_wb16(s, val); }
152   virtual AVFormatContext *avformat_alloc_context() { return ::avformat_alloc_context(); }
153   virtual AVStream *avformat_new_stream(AVFormatContext *s, AVCodec *c) { return ::avformat_new_stream(s, c); }
154   virtual AVOutputFormat *av_guess_format(const char *short_name, const char *filename, const char *mime_type) { return ::av_guess_format(short_name, filename, mime_type); }
155   virtual int avformat_write_header (AVFormatContext *s, AVDictionary **options) { return ::avformat_write_header (s, options); }
156   virtual int av_write_trailer(AVFormatContext *s) { return ::av_write_trailer(s); }
157   virtual int av_write_frame  (AVFormatContext *s, AVPacket *pkt) { return ::av_write_frame(s, pkt); }
158
159   // DLL faking.
160   virtual bool ResolveExports() { return true; }
161   virtual bool Load() {
162 #if !defined(TARGET_DARWIN)
163     CLog::Log(LOGDEBUG, "DllAvFormat: Using libavformat system library");
164 #endif
165     return true;
166   }
167   virtual void Unload() {}
168 };
169
170 #else
171
172 class DllAvFormat : public DllDynamic, DllAvFormatInterface
173 {
174   DECLARE_DLL_WRAPPER(DllAvFormat, DLL_PATH_LIBAVFORMAT)
175
176   LOAD_SYMBOLS()
177
178   DEFINE_METHOD0(void, av_register_all_dont_call)
179   DEFINE_METHOD1(AVInputFormat*, av_find_input_format, (const char *p1))
180   DEFINE_METHOD1(void, avformat_close_input, (AVFormatContext **p1))
181   DEFINE_METHOD1(int, av_read_play, (AVFormatContext *p1))
182   DEFINE_METHOD1(int, av_read_pause, (AVFormatContext *p1))
183   DEFINE_METHOD1(void, av_read_frame_flush, (AVFormatContext *p1))
184   DEFINE_FUNC_ALIGNED2(int, __cdecl, av_read_frame, AVFormatContext *, AVPacket *)
185   DEFINE_FUNC_ALIGNED4(int, __cdecl, av_seek_frame, AVFormatContext*, int, int64_t, int)
186   DEFINE_FUNC_ALIGNED2(int, __cdecl, avformat_find_stream_info_dont_call, AVFormatContext*, AVDictionary **)
187   DEFINE_FUNC_ALIGNED4(int, __cdecl, avformat_open_input, AVFormatContext **, const char *, AVInputFormat *, AVDictionary **)
188   DEFINE_FUNC_ALIGNED2(AVInputFormat*, __cdecl, av_probe_input_format, AVProbeData*, int)
189   DEFINE_FUNC_ALIGNED3(AVInputFormat*, __cdecl, av_probe_input_format2, AVProbeData*, int, int*)
190   DEFINE_FUNC_ALIGNED6(int, __cdecl, av_probe_input_buffer, AVIOContext *, AVInputFormat **, const char *, void *, unsigned int, unsigned int)
191   DEFINE_FUNC_ALIGNED3(int, __cdecl, avio_read, AVIOContext*, unsigned char *, int)
192   DEFINE_FUNC_ALIGNED2(void, __cdecl, avio_w8, AVIOContext*, int)
193   DEFINE_FUNC_ALIGNED3(void, __cdecl, avio_write, AVIOContext*, const unsigned char *, int)
194   DEFINE_FUNC_ALIGNED2(void, __cdecl, avio_wb24, AVIOContext*, unsigned int)
195   DEFINE_FUNC_ALIGNED2(void, __cdecl, avio_wb32, AVIOContext*, unsigned int)
196   DEFINE_FUNC_ALIGNED2(void, __cdecl, avio_wb16, AVIOContext*, unsigned int)
197   DEFINE_METHOD7(AVIOContext *, avio_alloc_context, (unsigned char *p1, int p2, int p3, void *p4,
198                   int (*p5)(void *opaque, uint8_t *buf, int buf_size),
199                   int (*p6)(void *opaque, uint8_t *buf, int buf_size),
200                   offset_t (*p7)(void *opaque, offset_t offset, int whence)))
201   DEFINE_METHOD4(void, av_dump_format, (AVFormatContext *p1, int p2, const char *p3, int p4))
202   DEFINE_METHOD3(int, avio_open, (AVIOContext **p1, const char *p2, int p3))
203   DEFINE_METHOD1(int, avio_close, (AVIOContext *p1))
204   DEFINE_METHOD1(int, avio_open_dyn_buf, (AVIOContext **p1))
205   DEFINE_METHOD2(int, avio_close_dyn_buf, (AVIOContext *p1, uint8_t **p2))
206   DEFINE_METHOD3(offset_t, avio_seek, (AVIOContext *p1, offset_t p2, int p3))
207   DEFINE_METHOD0(AVFormatContext *, avformat_alloc_context)
208   DEFINE_METHOD2(AVStream *, avformat_new_stream, (AVFormatContext *p1, AVCodec *p2))
209   DEFINE_METHOD3(AVOutputFormat *, av_guess_format, (const char *p1, const char *p2, const char *p3))
210   DEFINE_METHOD2(int, avformat_write_header , (AVFormatContext *p1, AVDictionary **p2))
211   DEFINE_METHOD1(int, av_write_trailer, (AVFormatContext *p1))
212   DEFINE_METHOD2(int, av_write_frame  , (AVFormatContext *p1, AVPacket *p2))
213   BEGIN_METHOD_RESOLVE()
214     RESOLVE_METHOD_RENAME(av_register_all, av_register_all_dont_call)
215     RESOLVE_METHOD(av_find_input_format)
216     RESOLVE_METHOD(avformat_close_input)
217     RESOLVE_METHOD(av_read_frame)
218     RESOLVE_METHOD(av_read_play)
219     RESOLVE_METHOD(av_read_pause)
220     RESOLVE_METHOD(av_read_frame_flush)
221     RESOLVE_METHOD(av_seek_frame)
222     RESOLVE_METHOD_RENAME(avformat_find_stream_info, avformat_find_stream_info_dont_call)
223     RESOLVE_METHOD(avformat_open_input)
224     RESOLVE_METHOD(avio_alloc_context)
225     RESOLVE_METHOD(av_probe_input_format)
226     RESOLVE_METHOD(av_probe_input_format2)
227     RESOLVE_METHOD(av_probe_input_buffer)
228     RESOLVE_METHOD(av_dump_format)
229     RESOLVE_METHOD(avio_open)
230     RESOLVE_METHOD(avio_close)
231     RESOLVE_METHOD(avio_open_dyn_buf)
232     RESOLVE_METHOD(avio_close_dyn_buf)
233     RESOLVE_METHOD(avio_seek)
234     RESOLVE_METHOD(avio_read)
235     RESOLVE_METHOD(avio_w8)
236     RESOLVE_METHOD(avio_write)
237     RESOLVE_METHOD(avio_wb24)
238     RESOLVE_METHOD(avio_wb32)
239     RESOLVE_METHOD(avio_wb16)
240     RESOLVE_METHOD(avformat_alloc_context)
241     RESOLVE_METHOD(avformat_new_stream)
242     RESOLVE_METHOD(av_guess_format)
243     RESOLVE_METHOD(avformat_write_header)
244     RESOLVE_METHOD(av_write_trailer)
245     RESOLVE_METHOD(av_write_frame)
246   END_METHOD_RESOLVE()
247
248   /* dependencies of libavformat */
249   DllAvCodec m_dllAvCodec;
250   // DllAvUtil loaded implicitely by m_dllAvCodec
251
252 public:
253   void av_register_all()
254   {
255     CSingleLock lock(DllAvCodec::m_critSection);
256     av_register_all_dont_call();
257   }
258   int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
259   {
260     CSingleLock lock(DllAvCodec::m_critSection);
261     return avformat_find_stream_info_dont_call(ic, options);
262   }
263
264   virtual bool Load()
265   {
266     if (!m_dllAvCodec.Load())
267       return false;
268     return DllDynamic::Load();
269   }
270 };
271
272 #endif