Merge pull request #473 from Montellese/onplaybackspeedchanged
[vuplus_xbmc] / lib / DllLibbluray.h
1 /*
2  *      Copyright (C) 2005-2009 Team XBMC
3  *      http://www.xbmc.org
4  *
5  *  This Program is free software; you can redistribute it and/or modify
6  *  it under the terms of the GNU General Public License as published by
7  *  the Free Software Foundation; either version 2, or (at your option)
8  *  any later version.
9  *
10  *  This Program is distributed in the hope that it will be useful,
11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  *  GNU General Public License for more details.
14  *
15  *  You should have received a copy of the GNU General Public License
16  *  along with XBMC; see the file COPYING.  If not, write to
17  *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
18  *  http://www.gnu.org/copyleft/gpl.html
19  *
20  */
21 #pragma once
22 #include "system.h"
23 #ifdef HAVE_LIBBLURAY
24
25 #include "DynamicDll.h"
26
27
28 extern "C"
29 {
30 #include <libbluray/bluray.h>
31 #include <libbluray/filesystem.h>
32 #ifndef HAVE_LIBBLURAY_NOLOGCONTROL
33 #include <libbluray/log_control.h>
34 #endif
35 }
36
37 class DllLibblurayInterface
38 {
39 public:
40   virtual ~DllLibblurayInterface() {};
41   virtual uint32_t bd_get_titles(BLURAY *bd, uint8_t flags, uint32_t min_title_length)=0;
42   virtual BLURAY_TITLE_INFO* bd_get_title_info(BLURAY *bd, uint32_t title_idx, unsigned angle)=0;
43   virtual BLURAY_TITLE_INFO* bd_get_playlist_info(BLURAY *bd, uint32_t playlist, unsigned angle)=0;
44   virtual void bd_free_title_info(BLURAY_TITLE_INFO *title_info)=0;
45   virtual BLURAY *bd_open(const char* device_path, const char* keyfile_path)=0;
46   virtual void bd_close(BLURAY *bd)=0;
47   virtual int64_t bd_seek(BLURAY *bd, uint64_t pos)=0;
48   virtual int64_t bd_seek_time(BLURAY *bd, uint64_t tick)=0;
49   virtual int bd_read(BLURAY *bd, unsigned char *buf, int len)=0;
50   virtual int64_t bd_seek_chapter(BLURAY *bd, unsigned chapter)=0;
51   virtual int64_t bd_chapter_pos(BLURAY *bd, unsigned chapter)=0;
52   virtual uint32_t bd_get_current_chapter(BLURAY *bd)=0;
53   virtual int64_t bd_seek_mark(BLURAY *bd, unsigned mark)=0;
54   virtual int bd_select_playlist(BLURAY *bd, uint32_t playlist)=0;
55   virtual int bd_select_title(BLURAY *bd, uint32_t title)=0;
56   virtual int bd_select_angle(BLURAY *bd, unsigned angle)=0;
57   virtual void bd_seamless_angle_change(BLURAY *bd, unsigned angle)=0;
58   virtual uint64_t bd_get_title_size(BLURAY *bd)=0;
59   virtual uint32_t bd_get_current_title(BLURAY *bd)=0;
60   virtual unsigned bd_get_current_angle(BLURAY *bd)=0;
61   virtual uint64_t bd_tell(BLURAY *bd)=0;
62   virtual uint64_t bd_tell_time(BLURAY *bd)=0;
63   virtual BD_FILE_OPEN bd_register_file(BD_FILE_OPEN p)=0;
64   virtual BD_DIR_OPEN bd_register_dir(BD_DIR_OPEN p)=0;
65
66 #ifndef HAVE_LIBBLURAY_NOLOGCONTROL
67   virtual void     bd_set_debug_handler(BD_LOG_FUNC)=0;
68   virtual void     bd_set_debug_mask(uint32_t mask)=0;
69   virtual uint32_t bd_get_debug_mask(void)=0;
70 #endif
71 };
72
73 class DllLibbluray : public DllDynamic, DllLibblurayInterface
74 {
75   DECLARE_DLL_WRAPPER(DllLibbluray, DLL_PATH_LIBBLURAY)
76 #ifdef HAVE_LIBBBLURAY_HAVE_LIBBLURAY_NOANGLE
77   DEFINE_METHOD3(uint32_t,            bd_get_titles,          (BLURAY *p1, uint8_t p2))
78   DEFINE_METHOD3(BLURAY_TITLE_INFO*,  bd_get_title_info,      (BLURAY *p1, uint32_t p2))
79   DEFINE_METHOD3(BLURAY_TITLE_INFO*,  bd_get_playlist_info,   (BLURAY *p1, uint32_t p2))
80 #else
81   DEFINE_METHOD3(uint32_t,            bd_get_titles,          (BLURAY *p1, uint8_t p2, uint32_t p3))
82   DEFINE_METHOD3(BLURAY_TITLE_INFO*,  bd_get_title_info,      (BLURAY *p1, uint32_t p2, unsigned p3))
83   DEFINE_METHOD3(BLURAY_TITLE_INFO*,  bd_get_playlist_info,   (BLURAY *p1, uint32_t p2, unsigned p3))
84 #endif
85   DEFINE_METHOD1(void,                bd_free_title_info,     (BLURAY_TITLE_INFO *p1))
86   DEFINE_METHOD2(BLURAY*,             bd_open,                (const char* p1, const char* p2))
87   DEFINE_METHOD1(void,                bd_close,               (BLURAY *p1))
88   DEFINE_METHOD2(int64_t,             bd_seek,                (BLURAY *p1, uint64_t p2))
89   DEFINE_METHOD2(int64_t,             bd_seek_time,           (BLURAY *p1, uint64_t p2))
90   DEFINE_METHOD3(int,                 bd_read,                (BLURAY *p1, unsigned char *p2, int p3))
91   DEFINE_METHOD2(int64_t,             bd_seek_chapter,        (BLURAY *p1, unsigned p2))
92   DEFINE_METHOD2(int64_t,             bd_chapter_pos,         (BLURAY *p1, unsigned p2))
93   DEFINE_METHOD1(uint32_t,            bd_get_current_chapter, (BLURAY *p1))
94   DEFINE_METHOD2(int64_t,             bd_seek_mark,           (BLURAY *p1, unsigned p2))
95   DEFINE_METHOD2(int,                 bd_select_playlist,     (BLURAY *p1, uint32_t p2))
96   DEFINE_METHOD2(int,                 bd_select_title,        (BLURAY *p1, uint32_t p2))
97   DEFINE_METHOD2(int,                 bd_select_angle,        (BLURAY *p1, unsigned p2))
98   DEFINE_METHOD2(void,                bd_seamless_angle_change,(BLURAY *p1, unsigned p2))
99   DEFINE_METHOD1(uint64_t,            bd_get_title_size,      (BLURAY *p1))
100   DEFINE_METHOD1(uint32_t,            bd_get_current_title,   (BLURAY *p1))
101   DEFINE_METHOD1(unsigned,            bd_get_current_angle,   (BLURAY *p1))
102   DEFINE_METHOD1(uint64_t,            bd_tell,                (BLURAY *p1))
103   DEFINE_METHOD1(uint64_t,            bd_tell_time,           (BLURAY *p1))
104   DEFINE_METHOD1(BD_FILE_OPEN,        bd_register_file,       (BD_FILE_OPEN p1))
105   DEFINE_METHOD1(BD_DIR_OPEN,         bd_register_dir,        (BD_DIR_OPEN p1))
106
107 #ifndef HAVE_LIBBLURAY_NOLOGCONTROL
108   DEFINE_METHOD1(void,                bd_set_debug_handler,   (BD_LOG_FUNC p1))
109   DEFINE_METHOD1(void,                bd_set_debug_mask,      (uint32_t p1))
110   DEFINE_METHOD0(uint32_t,            bd_get_debug_mask)
111 #endif
112
113   BEGIN_METHOD_RESOLVE()
114     RESOLVE_METHOD(bd_get_titles)
115     RESOLVE_METHOD(bd_get_title_info)
116     RESOLVE_METHOD(bd_get_playlist_info)
117     RESOLVE_METHOD_RENAME(bd_free_title_info,   bd_free_title_info)
118     RESOLVE_METHOD_RENAME(bd_open,              bd_open)
119     RESOLVE_METHOD_RENAME(bd_close,             bd_close)
120     RESOLVE_METHOD_RENAME(bd_seek,              bd_seek)
121     RESOLVE_METHOD_RENAME(bd_seek_time,         bd_seek_time)
122     RESOLVE_METHOD_RENAME(bd_read,              bd_read)
123     RESOLVE_METHOD_RENAME(bd_seek_chapter,      bd_seek_chapter)
124     RESOLVE_METHOD_RENAME(bd_chapter_pos,       bd_chapter_pos)
125     RESOLVE_METHOD_RENAME(bd_get_current_chapter, bd_get_current_chapter)
126     RESOLVE_METHOD_RENAME(bd_seek_mark,         bd_seek_mark)
127     RESOLVE_METHOD_RENAME(bd_select_playlist,   bd_select_playlist)
128     RESOLVE_METHOD_RENAME(bd_select_title,      bd_select_title)
129     RESOLVE_METHOD_RENAME(bd_select_angle,      bd_select_angle)
130     RESOLVE_METHOD_RENAME(bd_seamless_angle_change, bd_seamless_angle_change)
131     RESOLVE_METHOD_RENAME(bd_get_title_size,    bd_get_title_size)
132     RESOLVE_METHOD_RENAME(bd_get_current_title, bd_get_current_title)
133     RESOLVE_METHOD_RENAME(bd_get_current_angle, bd_get_current_angle)
134     RESOLVE_METHOD_RENAME(bd_tell,              bd_tell)
135     RESOLVE_METHOD_RENAME(bd_tell_time,         bd_tell_time)
136     RESOLVE_METHOD_RENAME(bd_register_file,     bd_register_file)
137     RESOLVE_METHOD_RENAME(bd_register_dir,      bd_register_dir)
138     RESOLVE_METHOD(bd_set_debug_handler)
139     RESOLVE_METHOD(bd_set_debug_mask)
140     RESOLVE_METHOD(bd_get_debug_mask)
141 #ifndef HAVE_LIBBLURAY_NOLOGCONTROL
142     RESOLVE_METHOD(bd_set_debug_handler)
143     RESOLVE_METHOD(bd_set_debug_mask)
144     RESOLVE_METHOD(bd_get_debug_mask)
145 #endif
146   END_METHOD_RESOLVE()
147
148 #ifdef HAVE_LIBBBLURAY_HAVE_LIBBLURAY_NOANGLE
149   uint32_t bd_get_titles(BLURAY *bd, uint8_t flags, uint32_t min_title_length)
150       {return bd_get_titles_noangle(bd, flags);           }
151   BLURAY_TITLE_INFO* bd_get_title_info(BLURAY *bd, uint32_t title_idx, unsigned angle)
152       {return bd_get_title_info_noangle(bd, title_idx);   }
153   BLURAY_TITLE_INFO* bd_get_playlist_info(BLURAY *bd, uint32_t playlist, unsigned angle)
154       {return bd_get_playlist_info_noangle(bd, playlist); }
155 #endif
156
157 public:
158   static void       file_close(BD_FILE_H *file);
159   static int64_t    file_seek(BD_FILE_H *file, int64_t offset, int32_t origin);
160   static int64_t    file_tell(BD_FILE_H *file);
161   static int        file_eof(BD_FILE_H *file);
162   static int64_t    file_read(BD_FILE_H *file, uint8_t *buf, int64_t size);
163   static int64_t    file_write(BD_FILE_H *file, const uint8_t *buf, int64_t size);
164   static BD_FILE_H *file_open(const char* filename, const char *mode);
165   static void      dir_close(BD_DIR_H *dir);
166   static int       dir_read(BD_DIR_H *dir, BD_DIRENT *entry);
167   static BD_DIR_H *dir_open(const char* dirname);
168   static void      bluray_logger(const char* msg);
169 };
170
171 #endif