annotate libmpcodecs/vd_realvid.c @ 22334:1c7f753ef2c9

Fix wrong typecast, which can cause MPlayer crash
author voroshil
date Mon, 26 Feb 2007 17:21:17 +0000
parents c08b8066a1c6
children a033e5519802
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6341
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
1 #include <stdio.h>
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
2 #include <stdlib.h>
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
3
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
4 #include "config.h"
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
5
10093
ad83de1c0038 cygwin/mingw32 support by Sascha Sommer
alex
parents: 9552
diff changeset
6 #ifdef HAVE_LIBDL
6341
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
7 #include <dlfcn.h>
10093
ad83de1c0038 cygwin/mingw32 support by Sascha Sommer
alex
parents: 9552
diff changeset
8 #endif
6341
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
9
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
10 #include "mp_msg.h"
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
11 #include "help_mp.h"
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
12
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
13 #include "vd_internal.h"
12356
6a61d694f7d3 minimal fix for alex's 1000000000000l compile errors. imo the fix in
rfelker
parents: 10444
diff changeset
14 #include "wine/windef.h"
6341
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
15
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
16 static vd_info_t info = {
6404
83b3315c679b Implement Nilmoni's and Bernd Ernesti's patches for:
atmos4
parents: 6361
diff changeset
17 "RealVideo decoder",
7174
7672615cc811 sync driver names with codec-cfg
arpi
parents: 7172
diff changeset
18 "realvid",
12628
985e1813e298 support for realvideo codecs under macosx, original patch by Donnie Smith
alex
parents: 12356
diff changeset
19 "Alex Beregszaszi",
985e1813e298 support for realvideo codecs under macosx, original patch by Donnie Smith
alex
parents: 12356
diff changeset
20 "Florian Schneider, Arpad Gereoffy, Alex Beregszaszi, Donnie Smith",
6341
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
21 "binary real video codecs"
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
22 };
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
23
7174
7672615cc811 sync driver names with codec-cfg
arpi
parents: 7172
diff changeset
24 LIBVD_EXTERN(realvid)
6341
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
25
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
26
8522
4b29a7646dac alpha support by Alan Young <ayoung@teleport.com>
alex
parents: 7728
diff changeset
27 /*
4b29a7646dac alpha support by Alan Young <ayoung@teleport.com>
alex
parents: 7728
diff changeset
28 * Structures for data packets. These used to be tables of unsigned ints, but
4b29a7646dac alpha support by Alan Young <ayoung@teleport.com>
alex
parents: 7728
diff changeset
29 * that does not work on 64 bit platforms (e.g. Alpha). The entries that are
4b29a7646dac alpha support by Alan Young <ayoung@teleport.com>
alex
parents: 7728
diff changeset
30 * pointers get truncated. Pointers on 64 bit platforms are 8 byte longs.
4b29a7646dac alpha support by Alan Young <ayoung@teleport.com>
alex
parents: 7728
diff changeset
31 * So we have to use structures so the compiler will assign the proper space
4b29a7646dac alpha support by Alan Young <ayoung@teleport.com>
alex
parents: 7728
diff changeset
32 * for the pointer.
4b29a7646dac alpha support by Alan Young <ayoung@teleport.com>
alex
parents: 7728
diff changeset
33 */
4b29a7646dac alpha support by Alan Young <ayoung@teleport.com>
alex
parents: 7728
diff changeset
34 typedef struct cmsg_data_s {
4b29a7646dac alpha support by Alan Young <ayoung@teleport.com>
alex
parents: 7728
diff changeset
35 uint32_t data1;
4b29a7646dac alpha support by Alan Young <ayoung@teleport.com>
alex
parents: 7728
diff changeset
36 uint32_t data2;
4b29a7646dac alpha support by Alan Young <ayoung@teleport.com>
alex
parents: 7728
diff changeset
37 uint32_t* dimensions;
4b29a7646dac alpha support by Alan Young <ayoung@teleport.com>
alex
parents: 7728
diff changeset
38 } cmsg_data_t;
4b29a7646dac alpha support by Alan Young <ayoung@teleport.com>
alex
parents: 7728
diff changeset
39
4b29a7646dac alpha support by Alan Young <ayoung@teleport.com>
alex
parents: 7728
diff changeset
40 typedef struct transform_in_s {
4b29a7646dac alpha support by Alan Young <ayoung@teleport.com>
alex
parents: 7728
diff changeset
41 uint32_t len;
4b29a7646dac alpha support by Alan Young <ayoung@teleport.com>
alex
parents: 7728
diff changeset
42 uint32_t unknown1;
4b29a7646dac alpha support by Alan Young <ayoung@teleport.com>
alex
parents: 7728
diff changeset
43 uint32_t chunks;
4b29a7646dac alpha support by Alan Young <ayoung@teleport.com>
alex
parents: 7728
diff changeset
44 uint32_t* extra;
4b29a7646dac alpha support by Alan Young <ayoung@teleport.com>
alex
parents: 7728
diff changeset
45 uint32_t unknown2;
4b29a7646dac alpha support by Alan Young <ayoung@teleport.com>
alex
parents: 7728
diff changeset
46 uint32_t timestamp;
4b29a7646dac alpha support by Alan Young <ayoung@teleport.com>
alex
parents: 7728
diff changeset
47 } transform_in_t;
4b29a7646dac alpha support by Alan Young <ayoung@teleport.com>
alex
parents: 7728
diff changeset
48
4b29a7646dac alpha support by Alan Young <ayoung@teleport.com>
alex
parents: 7728
diff changeset
49 static unsigned long (*rvyuv_custom_message)(cmsg_data_t* ,void*);
7728
64b5604195c5 make local stuff 'static', complete uninit
arpi
parents: 7557
diff changeset
50 static unsigned long (*rvyuv_free)(void*);
64b5604195c5 make local stuff 'static', complete uninit
arpi
parents: 7557
diff changeset
51 static unsigned long (*rvyuv_init)(void*, void*); // initdata,context
8522
4b29a7646dac alpha support by Alan Young <ayoung@teleport.com>
alex
parents: 7728
diff changeset
52 static unsigned long (*rvyuv_transform)(char*, char*,transform_in_t*,unsigned int*,void*);
8525
8d0bfe72e709 win32 dlls support
alex
parents: 8522
diff changeset
53 #ifdef USE_WIN32DLL
8d0bfe72e709 win32 dlls support
alex
parents: 8522
diff changeset
54 static unsigned long WINAPI (*wrvyuv_custom_message)(cmsg_data_t* ,void*);
8d0bfe72e709 win32 dlls support
alex
parents: 8522
diff changeset
55 static unsigned long WINAPI (*wrvyuv_free)(void*);
8d0bfe72e709 win32 dlls support
alex
parents: 8522
diff changeset
56 static unsigned long WINAPI (*wrvyuv_init)(void*, void*); // initdata,context
8d0bfe72e709 win32 dlls support
alex
parents: 8522
diff changeset
57 static unsigned long WINAPI (*wrvyuv_transform)(char*, char*,transform_in_t*,unsigned int*,void*);
8d0bfe72e709 win32 dlls support
alex
parents: 8522
diff changeset
58 #endif
6341
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
59
7728
64b5604195c5 make local stuff 'static', complete uninit
arpi
parents: 7557
diff changeset
60 static void *rv_handle=NULL;
12628
985e1813e298 support for realvideo codecs under macosx, original patch by Donnie Smith
alex
parents: 12356
diff changeset
61 static int inited=0;
21559
de2a96f41195 Fix realvideo size changes by using our own malloced buffer and export type mpi.
reimar
parents: 21466
diff changeset
62 static uint8_t *buffer = NULL;
21563
c08b8066a1c6 Only increase buffer size to avoid crashes when seeking in
reimar
parents: 21559
diff changeset
63 static int bufsz = 0;
8525
8d0bfe72e709 win32 dlls support
alex
parents: 8522
diff changeset
64 #ifdef USE_WIN32DLL
8d0bfe72e709 win32 dlls support
alex
parents: 8522
diff changeset
65 static int dll_type = 0; /* 0 = unix dlopen, 1 = win32 dll */
8d0bfe72e709 win32 dlls support
alex
parents: 8522
diff changeset
66 #endif
6341
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
67
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
68 void *__builtin_vec_new(unsigned long size) {
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
69 return malloc(size);
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
70 }
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
71
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
72 void __builtin_vec_delete(void *mem) {
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
73 free(mem);
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
74 }
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
75
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
76 void __pure_virtual(void) {
6361
433bc1becbb6 freebsd support (hack) by Nexus
arpi
parents: 6360
diff changeset
77 printf("FATAL: __pure_virtual() called!\n");
433bc1becbb6 freebsd support (hack) by Nexus
arpi
parents: 6360
diff changeset
78 // exit(1);
6341
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
79 }
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
80
15566
3758536dcef3 DragonFly BSD support
diego
parents: 14568
diff changeset
81 #if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__)
6361
433bc1becbb6 freebsd support (hack) by Nexus
arpi
parents: 6360
diff changeset
82 void ___brk_addr(void) {exit(0);}
6404
83b3315c679b Implement Nilmoni's and Bernd Ernesti's patches for:
atmos4
parents: 6361
diff changeset
83 char **__environ={NULL};
6361
433bc1becbb6 freebsd support (hack) by Nexus
arpi
parents: 6360
diff changeset
84 #undef stderr
6404
83b3315c679b Implement Nilmoni's and Bernd Ernesti's patches for:
atmos4
parents: 6361
diff changeset
85 FILE *stderr=NULL;
6361
433bc1becbb6 freebsd support (hack) by Nexus
arpi
parents: 6360
diff changeset
86 #endif
6341
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
87
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
88 // to set/get/query special features/parameters
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
89 static int control(sh_video_t *sh,int cmd,void* arg,...){
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
90 // switch(cmd){
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
91 // case VDCTRL_QUERY_MAX_PP_LEVEL:
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
92 // return 9;
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
93 // case VDCTRL_SET_PP_LEVEL:
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
94 // vfw_set_postproc(sh,10*(*((int*)arg)));
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
95 // return CONTROL_OK;
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
96 // }
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
97 return CONTROL_UNKNOWN;
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
98 }
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
99
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
100 /* exits program when failure */
10093
ad83de1c0038 cygwin/mingw32 support by Sascha Sommer
alex
parents: 9552
diff changeset
101 #ifdef HAVE_LIBDL
7728
64b5604195c5 make local stuff 'static', complete uninit
arpi
parents: 7557
diff changeset
102 static int load_syms_linux(char *path) {
6341
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
103 void *handle;
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
104
17721
7b336a5585e4 Reduce Real DLL/so loading verbosity, OKed by Roberto.
diego
parents: 17012
diff changeset
105 mp_msg(MSGT_DECVIDEO,MSGL_V, "opening shared obj '%s'\n", path);
9386
8537d9a5fed5 possible 10l
alex
parents: 8525
diff changeset
106 handle = dlopen (path, RTLD_LAZY);
6341
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
107 if (!handle) {
6361
433bc1becbb6 freebsd support (hack) by Nexus
arpi
parents: 6360
diff changeset
108 mp_msg(MSGT_DECVIDEO,MSGL_WARN,"Error: %s\n",dlerror());
6341
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
109 return 0;
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
110 }
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
111
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
112 rvyuv_custom_message = dlsym(handle, "RV20toYUV420CustomMessage");
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
113 rvyuv_free = dlsym(handle, "RV20toYUV420Free");
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
114 rvyuv_init = dlsym(handle, "RV20toYUV420Init");
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
115 rvyuv_transform = dlsym(handle, "RV20toYUV420Transform");
6361
433bc1becbb6 freebsd support (hack) by Nexus
arpi
parents: 6360
diff changeset
116
433bc1becbb6 freebsd support (hack) by Nexus
arpi
parents: 6360
diff changeset
117 if(rvyuv_custom_message &&
433bc1becbb6 freebsd support (hack) by Nexus
arpi
parents: 6360
diff changeset
118 rvyuv_free &&
433bc1becbb6 freebsd support (hack) by Nexus
arpi
parents: 6360
diff changeset
119 rvyuv_init &&
9386
8537d9a5fed5 possible 10l
alex
parents: 8525
diff changeset
120 rvyuv_transform)
8537d9a5fed5 possible 10l
alex
parents: 8525
diff changeset
121 {
8537d9a5fed5 possible 10l
alex
parents: 8525
diff changeset
122 rv_handle = handle;
8537d9a5fed5 possible 10l
alex
parents: 8525
diff changeset
123 return 1;
8537d9a5fed5 possible 10l
alex
parents: 8525
diff changeset
124 }
13860
d6f716fdd734 remove mac shlb support to use new helix codec for realvideo support on osx
nplourde
parents: 12628
diff changeset
125
d6f716fdd734 remove mac shlb support to use new helix codec for realvideo support on osx
nplourde
parents: 12628
diff changeset
126 rvyuv_custom_message = dlsym(handle, "RV40toYUV420CustomMessage");
d6f716fdd734 remove mac shlb support to use new helix codec for realvideo support on osx
nplourde
parents: 12628
diff changeset
127 rvyuv_free = dlsym(handle, "RV40toYUV420Free");
d6f716fdd734 remove mac shlb support to use new helix codec for realvideo support on osx
nplourde
parents: 12628
diff changeset
128 rvyuv_init = dlsym(handle, "RV40toYUV420Init");
d6f716fdd734 remove mac shlb support to use new helix codec for realvideo support on osx
nplourde
parents: 12628
diff changeset
129 rvyuv_transform = dlsym(handle, "RV40toYUV420Transform");
d6f716fdd734 remove mac shlb support to use new helix codec for realvideo support on osx
nplourde
parents: 12628
diff changeset
130
d6f716fdd734 remove mac shlb support to use new helix codec for realvideo support on osx
nplourde
parents: 12628
diff changeset
131 if(rvyuv_custom_message &&
d6f716fdd734 remove mac shlb support to use new helix codec for realvideo support on osx
nplourde
parents: 12628
diff changeset
132 rvyuv_free &&
d6f716fdd734 remove mac shlb support to use new helix codec for realvideo support on osx
nplourde
parents: 12628
diff changeset
133 rvyuv_init &&
d6f716fdd734 remove mac shlb support to use new helix codec for realvideo support on osx
nplourde
parents: 12628
diff changeset
134 rvyuv_transform)
d6f716fdd734 remove mac shlb support to use new helix codec for realvideo support on osx
nplourde
parents: 12628
diff changeset
135 {
d6f716fdd734 remove mac shlb support to use new helix codec for realvideo support on osx
nplourde
parents: 12628
diff changeset
136 rv_handle = handle;
d6f716fdd734 remove mac shlb support to use new helix codec for realvideo support on osx
nplourde
parents: 12628
diff changeset
137 return 1;
d6f716fdd734 remove mac shlb support to use new helix codec for realvideo support on osx
nplourde
parents: 12628
diff changeset
138 }
6361
433bc1becbb6 freebsd support (hack) by Nexus
arpi
parents: 6360
diff changeset
139
433bc1becbb6 freebsd support (hack) by Nexus
arpi
parents: 6360
diff changeset
140 mp_msg(MSGT_DECVIDEO,MSGL_WARN,"Error resolving symbols! (version incompatibility?)\n");
9386
8537d9a5fed5 possible 10l
alex
parents: 8525
diff changeset
141 dlclose(handle);
6361
433bc1becbb6 freebsd support (hack) by Nexus
arpi
parents: 6360
diff changeset
142 return 0;
6341
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
143 }
10093
ad83de1c0038 cygwin/mingw32 support by Sascha Sommer
alex
parents: 9552
diff changeset
144 #endif
6341
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
145
6543
70a9c9f695a2 first try to load linux dlls, if failed and we're supporting win32 dlls, then try to load the windows ones
alex
parents: 6404
diff changeset
146 #ifdef USE_WIN32DLL
7127
1e47c2e7aa8e mostly compiler warning fixes, some small bugfix
arpi
parents: 7083
diff changeset
147
10093
ad83de1c0038 cygwin/mingw32 support by Sascha Sommer
alex
parents: 9552
diff changeset
148 #ifdef WIN32_LOADER
17012
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 15566
diff changeset
149 #include "loader/ldt_keeper.h"
10093
ad83de1c0038 cygwin/mingw32 support by Sascha Sommer
alex
parents: 9552
diff changeset
150 #endif
8525
8d0bfe72e709 win32 dlls support
alex
parents: 8522
diff changeset
151 void* WINAPI LoadLibraryA(char* name);
8d0bfe72e709 win32 dlls support
alex
parents: 8522
diff changeset
152 void* WINAPI GetProcAddress(void* handle,char* func);
8d0bfe72e709 win32 dlls support
alex
parents: 8522
diff changeset
153 int WINAPI FreeLibrary(void *handle);
7127
1e47c2e7aa8e mostly compiler warning fixes, some small bugfix
arpi
parents: 7083
diff changeset
154
7728
64b5604195c5 make local stuff 'static', complete uninit
arpi
parents: 7557
diff changeset
155 static int load_syms_windows(char *path) {
6360
1acda8182b14 win32 dll support (non-working)
arpi
parents: 6354
diff changeset
156 void *handle;
8525
8d0bfe72e709 win32 dlls support
alex
parents: 8522
diff changeset
157
17721
7b336a5585e4 Reduce Real DLL/so loading verbosity, OKed by Roberto.
diego
parents: 17012
diff changeset
158 mp_msg(MSGT_DECVIDEO,MSGL_V, "opening win32 dll '%s'\n", path);
10093
ad83de1c0038 cygwin/mingw32 support by Sascha Sommer
alex
parents: 9552
diff changeset
159 #ifdef WIN32_LOADER
6360
1acda8182b14 win32 dll support (non-working)
arpi
parents: 6354
diff changeset
160 Setup_LDT_Keeper();
10093
ad83de1c0038 cygwin/mingw32 support by Sascha Sommer
alex
parents: 9552
diff changeset
161 #endif
9386
8537d9a5fed5 possible 10l
alex
parents: 8525
diff changeset
162 handle = LoadLibraryA(path);
6361
433bc1becbb6 freebsd support (hack) by Nexus
arpi
parents: 6360
diff changeset
163 mp_msg(MSGT_DECVIDEO,MSGL_V,"win32 real codec handle=%p \n",handle);
8525
8d0bfe72e709 win32 dlls support
alex
parents: 8522
diff changeset
164 if (!handle) {
8d0bfe72e709 win32 dlls support
alex
parents: 8522
diff changeset
165 mp_msg(MSGT_DECVIDEO,MSGL_WARN,"Error loading dll\n");
8d0bfe72e709 win32 dlls support
alex
parents: 8522
diff changeset
166 return 0;
8d0bfe72e709 win32 dlls support
alex
parents: 8522
diff changeset
167 }
6360
1acda8182b14 win32 dll support (non-working)
arpi
parents: 6354
diff changeset
168
8525
8d0bfe72e709 win32 dlls support
alex
parents: 8522
diff changeset
169 wrvyuv_custom_message = GetProcAddress(handle, "RV20toYUV420CustomMessage");
8d0bfe72e709 win32 dlls support
alex
parents: 8522
diff changeset
170 wrvyuv_free = GetProcAddress(handle, "RV20toYUV420Free");
8d0bfe72e709 win32 dlls support
alex
parents: 8522
diff changeset
171 wrvyuv_init = GetProcAddress(handle, "RV20toYUV420Init");
8d0bfe72e709 win32 dlls support
alex
parents: 8522
diff changeset
172 wrvyuv_transform = GetProcAddress(handle, "RV20toYUV420Transform");
9386
8537d9a5fed5 possible 10l
alex
parents: 8525
diff changeset
173
8525
8d0bfe72e709 win32 dlls support
alex
parents: 8522
diff changeset
174 if(wrvyuv_custom_message &&
8d0bfe72e709 win32 dlls support
alex
parents: 8522
diff changeset
175 wrvyuv_free &&
8d0bfe72e709 win32 dlls support
alex
parents: 8522
diff changeset
176 wrvyuv_init &&
9386
8537d9a5fed5 possible 10l
alex
parents: 8525
diff changeset
177 wrvyuv_transform)
8537d9a5fed5 possible 10l
alex
parents: 8525
diff changeset
178 {
8537d9a5fed5 possible 10l
alex
parents: 8525
diff changeset
179 dll_type = 1;
8537d9a5fed5 possible 10l
alex
parents: 8525
diff changeset
180 rv_handle = handle;
8537d9a5fed5 possible 10l
alex
parents: 8525
diff changeset
181 return 1;
8537d9a5fed5 possible 10l
alex
parents: 8525
diff changeset
182 }
8525
8d0bfe72e709 win32 dlls support
alex
parents: 8522
diff changeset
183 mp_msg(MSGT_DECVIDEO,MSGL_WARN,"Error resolving symbols! (version incompatibility?)\n");
9386
8537d9a5fed5 possible 10l
alex
parents: 8525
diff changeset
184 FreeLibrary(handle);
6360
1acda8182b14 win32 dll support (non-working)
arpi
parents: 6354
diff changeset
185 return 0; // error
1acda8182b14 win32 dll support (non-working)
arpi
parents: 6354
diff changeset
186 }
1acda8182b14 win32 dll support (non-working)
arpi
parents: 6354
diff changeset
187 #endif
1acda8182b14 win32 dll support (non-working)
arpi
parents: 6354
diff changeset
188
6341
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
189 /* we need exact positions */
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
190 struct rv_init_t {
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
191 short unk1;
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
192 short w;
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
193 short h;
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
194 short unk3;
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
195 int unk2;
6345
2b6ff13acf5b - removed unused function pointers
arpi
parents: 6341
diff changeset
196 int subformat;
6341
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
197 int unk5;
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
198 int format;
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
199 } rv_init_t;
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
200
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
201 // init driver
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
202 static int init(sh_video_t *sh){
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
203 //unsigned int out_fmt;
10102
0f59b1e9ad97 dynamic path[] allocation
alex
parents: 10093
diff changeset
204 char *path;
6341
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
205 int result;
6345
2b6ff13acf5b - removed unused function pointers
arpi
parents: 6341
diff changeset
206 // we export codec id and sub-id from demuxer in bitmapinfohdr:
20920
94b1a797661f Fix extradata passing to lavc RV20 decoder
rtogni
parents: 20144
diff changeset
207 unsigned char* extrahdr=(unsigned char*)(sh->bih+1);
94b1a797661f Fix extradata passing to lavc RV20 decoder
rtogni
parents: 20144
diff changeset
208 unsigned int extrahdr_size = sh->bih->biSize - sizeof(BITMAPINFOHEADER);
94b1a797661f Fix extradata passing to lavc RV20 decoder
rtogni
parents: 20144
diff changeset
209 struct rv_init_t init_data;
6345
2b6ff13acf5b - removed unused function pointers
arpi
parents: 6341
diff changeset
210
20920
94b1a797661f Fix extradata passing to lavc RV20 decoder
rtogni
parents: 20144
diff changeset
211 if(extrahdr_size < 8) {
94b1a797661f Fix extradata passing to lavc RV20 decoder
rtogni
parents: 20144
diff changeset
212 mp_msg(MSGT_DECVIDEO,MSGL_ERR,"realvideo: extradata too small (%u)\n", sh->bih->biSize - sizeof(BITMAPINFOHEADER));
94b1a797661f Fix extradata passing to lavc RV20 decoder
rtogni
parents: 20144
diff changeset
213 return 0;
94b1a797661f Fix extradata passing to lavc RV20 decoder
rtogni
parents: 20144
diff changeset
214 }
94b1a797661f Fix extradata passing to lavc RV20 decoder
rtogni
parents: 20144
diff changeset
215 init_data = (struct rv_init_t){11, sh->disp_w, sh->disp_h, 0, 0, be2me_32(((unsigned int*)extrahdr)[0]), 1, be2me_32(((unsigned int*)extrahdr)[1])}; // rv30
94b1a797661f Fix extradata passing to lavc RV20 decoder
rtogni
parents: 20144
diff changeset
216
94b1a797661f Fix extradata passing to lavc RV20 decoder
rtogni
parents: 20144
diff changeset
217 mp_msg(MSGT_DECVIDEO,MSGL_V,"realvideo codec id: 0x%08X sub-id: 0x%08X\n",be2me_32(((unsigned int*)extrahdr)[1]),be2me_32(((unsigned int*)extrahdr)[0]));
6341
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
218
10102
0f59b1e9ad97 dynamic path[] allocation
alex
parents: 10093
diff changeset
219 path = malloc(strlen(REALCODEC_PATH)+strlen(sh->codec->dll)+2);
0f59b1e9ad97 dynamic path[] allocation
alex
parents: 10093
diff changeset
220 if (!path) return 0;
6404
83b3315c679b Implement Nilmoni's and Bernd Ernesti's patches for:
atmos4
parents: 6361
diff changeset
221 sprintf(path, REALCODEC_PATH "/%s", sh->codec->dll);
6543
70a9c9f695a2 first try to load linux dlls, if failed and we're supporting win32 dlls, then try to load the windows ones
alex
parents: 6404
diff changeset
222
70a9c9f695a2 first try to load linux dlls, if failed and we're supporting win32 dlls, then try to load the windows ones
alex
parents: 6404
diff changeset
223 /* first try to load linux dlls, if failed and we're supporting win32 dlls,
70a9c9f695a2 first try to load linux dlls, if failed and we're supporting win32 dlls, then try to load the windows ones
alex
parents: 6404
diff changeset
224 then try to load the windows ones */
10093
ad83de1c0038 cygwin/mingw32 support by Sascha Sommer
alex
parents: 9552
diff changeset
225 #ifdef HAVE_LIBDL
ad83de1c0038 cygwin/mingw32 support by Sascha Sommer
alex
parents: 9552
diff changeset
226 if(strstr(sh->codec->dll,".dll") || !load_syms_linux(path))
ad83de1c0038 cygwin/mingw32 support by Sascha Sommer
alex
parents: 9552
diff changeset
227 #endif
6544
222f6da66fa3 first try to load linux dlls, if failed and we're supporting win32 dlls, then try to load the windows ones
alex
parents: 6543
diff changeset
228 #ifdef USE_WIN32DLL
10444
2e46e51269c1 Win32 codec paths in vd_realvid.c
diego
parents: 10142
diff changeset
229 if (!load_syms_windows(sh->codec->dll))
6543
70a9c9f695a2 first try to load linux dlls, if failed and we're supporting win32 dlls, then try to load the windows ones
alex
parents: 6404
diff changeset
230 #endif
70a9c9f695a2 first try to load linux dlls, if failed and we're supporting win32 dlls, then try to load the windows ones
alex
parents: 6404
diff changeset
231 {
6341
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
232 mp_msg(MSGT_DECVIDEO,MSGL_ERR,MSGTR_MissingDLLcodec,sh->codec->dll);
9386
8537d9a5fed5 possible 10l
alex
parents: 8525
diff changeset
233 mp_msg(MSGT_DECVIDEO,MSGL_HINT,"Read the RealVideo section of the DOCS!\n");
10102
0f59b1e9ad97 dynamic path[] allocation
alex
parents: 10093
diff changeset
234 free(path);
6341
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
235 return 0;
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
236 }
10102
0f59b1e9ad97 dynamic path[] allocation
alex
parents: 10093
diff changeset
237 free(path);
6341
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
238 // only I420 supported
9552
86b5ea6396ab Ugly hack to handle bad width/height values from stream header
arpi
parents: 9386
diff changeset
239 // if((sh->format!=0x30335652) && !mpcodecs_config_vo(sh,sh->disp_w,sh->disp_h,IMGFMT_I420)) return 0;
6341
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
240 // init codec:
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
241 sh->context=NULL;
8525
8d0bfe72e709 win32 dlls support
alex
parents: 8522
diff changeset
242 #ifdef USE_WIN32DLL
8d0bfe72e709 win32 dlls support
alex
parents: 8522
diff changeset
243 if (dll_type == 1)
8d0bfe72e709 win32 dlls support
alex
parents: 8522
diff changeset
244 result=(*wrvyuv_init)(&init_data, &sh->context);
8d0bfe72e709 win32 dlls support
alex
parents: 8522
diff changeset
245 else
8d0bfe72e709 win32 dlls support
alex
parents: 8522
diff changeset
246 #endif
6341
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
247 result=(*rvyuv_init)(&init_data, &sh->context);
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
248 if (result){
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
249 mp_msg(MSGT_DECVIDEO,MSGL_ERR,"Couldn't open RealVideo codec, error code: 0x%X \n",result);
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
250 return 0;
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
251 }
6345
2b6ff13acf5b - removed unused function pointers
arpi
parents: 6341
diff changeset
252 // setup rv30 codec (codec sub-type and image dimensions):
20920
94b1a797661f Fix extradata passing to lavc RV20 decoder
rtogni
parents: 20144
diff changeset
253 if((sh->format<=0x30335652) && (be2me_32(((unsigned int*)extrahdr)[1])>=0x20200002)){
94b1a797661f Fix extradata passing to lavc RV20 decoder
rtogni
parents: 20144
diff changeset
254 int i, cmsg_cnt;
94b1a797661f Fix extradata passing to lavc RV20 decoder
rtogni
parents: 20144
diff changeset
255 uint32_t cmsg24[16]={sh->disp_w,sh->disp_h};
94b1a797661f Fix extradata passing to lavc RV20 decoder
rtogni
parents: 20144
diff changeset
256 cmsg_data_t cmsg_data={0x24,1+(extrahdr[1]&7), &cmsg24[0]};
94b1a797661f Fix extradata passing to lavc RV20 decoder
rtogni
parents: 20144
diff changeset
257
94b1a797661f Fix extradata passing to lavc RV20 decoder
rtogni
parents: 20144
diff changeset
258 mp_msg(MSGT_DECVIDEO,MSGL_V,"realvideo: using cmsg24 with %u elements.\n",extrahdr[1]&7);
94b1a797661f Fix extradata passing to lavc RV20 decoder
rtogni
parents: 20144
diff changeset
259 cmsg_cnt = (extrahdr[1]&7)*2;
94b1a797661f Fix extradata passing to lavc RV20 decoder
rtogni
parents: 20144
diff changeset
260 if (extrahdr_size-8 < cmsg_cnt) {
94b1a797661f Fix extradata passing to lavc RV20 decoder
rtogni
parents: 20144
diff changeset
261 mp_msg(MSGT_DECVIDEO,MSGL_WARN,"realvideo: not enough extradata (%u) to make %u cmsg24 elements.\n",extrahdr_size-8,extrahdr[1]&7);
94b1a797661f Fix extradata passing to lavc RV20 decoder
rtogni
parents: 20144
diff changeset
262 cmsg_cnt = extrahdr_size-8;
94b1a797661f Fix extradata passing to lavc RV20 decoder
rtogni
parents: 20144
diff changeset
263 }
94b1a797661f Fix extradata passing to lavc RV20 decoder
rtogni
parents: 20144
diff changeset
264 for (i = 0; i < cmsg_cnt; i++)
94b1a797661f Fix extradata passing to lavc RV20 decoder
rtogni
parents: 20144
diff changeset
265 cmsg24[2+i] = extrahdr[8+i]*4;
94b1a797661f Fix extradata passing to lavc RV20 decoder
rtogni
parents: 20144
diff changeset
266 if (extrahdr_size-8 > cmsg_cnt)
94b1a797661f Fix extradata passing to lavc RV20 decoder
rtogni
parents: 20144
diff changeset
267 mp_msg(MSGT_DECVIDEO,MSGL_WARN,"realvideo: %u bytes of unknown extradata remaining.\n",extrahdr_size-8-cmsg_cnt);
8525
8d0bfe72e709 win32 dlls support
alex
parents: 8522
diff changeset
268
8d0bfe72e709 win32 dlls support
alex
parents: 8522
diff changeset
269 #ifdef USE_WIN32DLL
8d0bfe72e709 win32 dlls support
alex
parents: 8522
diff changeset
270 if (dll_type == 1)
8d0bfe72e709 win32 dlls support
alex
parents: 8522
diff changeset
271 (*wrvyuv_custom_message)(&cmsg_data,sh->context);
8d0bfe72e709 win32 dlls support
alex
parents: 8522
diff changeset
272 else
8d0bfe72e709 win32 dlls support
alex
parents: 8522
diff changeset
273 #endif
8522
4b29a7646dac alpha support by Alan Young <ayoung@teleport.com>
alex
parents: 7728
diff changeset
274 (*rvyuv_custom_message)(&cmsg_data,sh->context);
6345
2b6ff13acf5b - removed unused function pointers
arpi
parents: 6341
diff changeset
275 }
6341
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
276 mp_msg(MSGT_DECVIDEO,MSGL_V,"INFO: RealVideo codec init OK!\n");
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
277 return 1;
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
278 }
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
279
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
280 // uninit driver
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
281 static void uninit(sh_video_t *sh){
8525
8d0bfe72e709 win32 dlls support
alex
parents: 8522
diff changeset
282 #ifdef USE_WIN32DLL
8d0bfe72e709 win32 dlls support
alex
parents: 8522
diff changeset
283 if (dll_type == 1)
8d0bfe72e709 win32 dlls support
alex
parents: 8522
diff changeset
284 {
8d0bfe72e709 win32 dlls support
alex
parents: 8522
diff changeset
285 if (wrvyuv_free) wrvyuv_free(sh->context);
8d0bfe72e709 win32 dlls support
alex
parents: 8522
diff changeset
286 } else
8d0bfe72e709 win32 dlls support
alex
parents: 8522
diff changeset
287 #endif
7728
64b5604195c5 make local stuff 'static', complete uninit
arpi
parents: 7557
diff changeset
288 if(rvyuv_free) rvyuv_free(sh->context);
8525
8d0bfe72e709 win32 dlls support
alex
parents: 8522
diff changeset
289
8d0bfe72e709 win32 dlls support
alex
parents: 8522
diff changeset
290 #ifdef USE_WIN32DLL
8d0bfe72e709 win32 dlls support
alex
parents: 8522
diff changeset
291 if (dll_type == 1)
8d0bfe72e709 win32 dlls support
alex
parents: 8522
diff changeset
292 {
8d0bfe72e709 win32 dlls support
alex
parents: 8522
diff changeset
293 if (rv_handle) FreeLibrary(rv_handle);
8d0bfe72e709 win32 dlls support
alex
parents: 8522
diff changeset
294 } else
8d0bfe72e709 win32 dlls support
alex
parents: 8522
diff changeset
295 #endif
10093
ad83de1c0038 cygwin/mingw32 support by Sascha Sommer
alex
parents: 9552
diff changeset
296 #ifdef HAVE_LIBDL
6345
2b6ff13acf5b - removed unused function pointers
arpi
parents: 6341
diff changeset
297 if(rv_handle) dlclose(rv_handle);
10093
ad83de1c0038 cygwin/mingw32 support by Sascha Sommer
alex
parents: 9552
diff changeset
298 #endif
6345
2b6ff13acf5b - removed unused function pointers
arpi
parents: 6341
diff changeset
299 rv_handle=NULL;
14437
37b3dd217cdf 100l, set inited to 0 in uninit, otherwise only first file will play video.
reimar
parents: 13860
diff changeset
300 inited = 0;
21559
de2a96f41195 Fix realvideo size changes by using our own malloced buffer and export type mpi.
reimar
parents: 21466
diff changeset
301 if (buffer)
de2a96f41195 Fix realvideo size changes by using our own malloced buffer and export type mpi.
reimar
parents: 21466
diff changeset
302 free(buffer);
de2a96f41195 Fix realvideo size changes by using our own malloced buffer and export type mpi.
reimar
parents: 21466
diff changeset
303 buffer = NULL;
21563
c08b8066a1c6 Only increase buffer size to avoid crashes when seeking in
reimar
parents: 21559
diff changeset
304 bufsz = 0;
6341
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
305 }
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
306
7082
678e77165b8e uses new dp_hdr_t packet structure
arpi
parents: 6745
diff changeset
307 // copypaste from demux_real.c - it should match to get it working!
678e77165b8e uses new dp_hdr_t packet structure
arpi
parents: 6745
diff changeset
308 typedef struct dp_hdr_s {
678e77165b8e uses new dp_hdr_t packet structure
arpi
parents: 6745
diff changeset
309 uint32_t chunks; // number of chunks
678e77165b8e uses new dp_hdr_t packet structure
arpi
parents: 6745
diff changeset
310 uint32_t timestamp; // timestamp from packet header
678e77165b8e uses new dp_hdr_t packet structure
arpi
parents: 6745
diff changeset
311 uint32_t len; // length of actual data
678e77165b8e uses new dp_hdr_t packet structure
arpi
parents: 6745
diff changeset
312 uint32_t chunktab; // offset to chunk offset array
678e77165b8e uses new dp_hdr_t packet structure
arpi
parents: 6745
diff changeset
313 } dp_hdr_t;
678e77165b8e uses new dp_hdr_t packet structure
arpi
parents: 6745
diff changeset
314
6341
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
315 // decode a frame
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
316 static mp_image_t* decode(sh_video_t *sh,void* data,int len,int flags){
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
317 mp_image_t* mpi;
6745
9734bfbb200a Avoid ulong typedef clash and replace if by unsigned long, patch by Joey Parrish.
atmos4
parents: 6544
diff changeset
318 unsigned long result;
7082
678e77165b8e uses new dp_hdr_t packet structure
arpi
parents: 6745
diff changeset
319 dp_hdr_t* dp_hdr=(dp_hdr_t*)data;
678e77165b8e uses new dp_hdr_t packet structure
arpi
parents: 6745
diff changeset
320 unsigned char* dp_data=((unsigned char*)data)+sizeof(dp_hdr_t);
678e77165b8e uses new dp_hdr_t packet structure
arpi
parents: 6745
diff changeset
321 uint32_t* extra=(uint32_t*)(((char*)data)+dp_hdr->chunktab);
678e77165b8e uses new dp_hdr_t packet structure
arpi
parents: 6745
diff changeset
322
8522
4b29a7646dac alpha support by Alan Young <ayoung@teleport.com>
alex
parents: 7728
diff changeset
323 unsigned int transform_out[5];
4b29a7646dac alpha support by Alan Young <ayoung@teleport.com>
alex
parents: 7728
diff changeset
324 transform_in_t transform_in={
7082
678e77165b8e uses new dp_hdr_t packet structure
arpi
parents: 6745
diff changeset
325 dp_hdr->len, // length of the packet (sub-packets appended)
6341
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
326 0, // unknown, seems to be unused
7082
678e77165b8e uses new dp_hdr_t packet structure
arpi
parents: 6745
diff changeset
327 dp_hdr->chunks, // number of sub-packets - 1
8522
4b29a7646dac alpha support by Alan Young <ayoung@teleport.com>
alex
parents: 7728
diff changeset
328 extra, // table of sub-packet offsets
6341
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
329 0, // unknown, seems to be unused
7082
678e77165b8e uses new dp_hdr_t packet structure
arpi
parents: 6745
diff changeset
330 dp_hdr->timestamp,// timestamp (the integer value from the stream)
6341
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
331 };
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
332
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
333 if(len<=0 || flags&2) return NULL; // skipped frame || hardframedrop
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
334
21563
c08b8066a1c6 Only increase buffer size to avoid crashes when seeking in
reimar
parents: 21559
diff changeset
335 if (bufsz < sh->disp_w*sh->disp_h*3/2) {
21559
de2a96f41195 Fix realvideo size changes by using our own malloced buffer and export type mpi.
reimar
parents: 21466
diff changeset
336 if (buffer) free(buffer);
21563
c08b8066a1c6 Only increase buffer size to avoid crashes when seeking in
reimar
parents: 21559
diff changeset
337 bufsz = sh->disp_w*sh->disp_h*3/2;
c08b8066a1c6 Only increase buffer size to avoid crashes when seeking in
reimar
parents: 21559
diff changeset
338 buffer=malloc(bufsz);
9552
86b5ea6396ab Ugly hack to handle bad width/height values from stream header
arpi
parents: 9386
diff changeset
339 if (!buffer) return 0;
86b5ea6396ab Ugly hack to handle bad width/height values from stream header
arpi
parents: 9386
diff changeset
340 }
6341
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
341
8525
8d0bfe72e709 win32 dlls support
alex
parents: 8522
diff changeset
342 #ifdef USE_WIN32DLL
8d0bfe72e709 win32 dlls support
alex
parents: 8522
diff changeset
343 if (dll_type == 1)
9552
86b5ea6396ab Ugly hack to handle bad width/height values from stream header
arpi
parents: 9386
diff changeset
344 result=(*wrvyuv_transform)(dp_data, buffer, &transform_in,
8525
8d0bfe72e709 win32 dlls support
alex
parents: 8522
diff changeset
345 transform_out, sh->context);
8d0bfe72e709 win32 dlls support
alex
parents: 8522
diff changeset
346 else
8d0bfe72e709 win32 dlls support
alex
parents: 8522
diff changeset
347 #endif
9552
86b5ea6396ab Ugly hack to handle bad width/height values from stream header
arpi
parents: 9386
diff changeset
348 result=(*rvyuv_transform)(dp_data, buffer, &transform_in,
6341
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
349 transform_out, sh->context);
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
350
9552
86b5ea6396ab Ugly hack to handle bad width/height values from stream header
arpi
parents: 9386
diff changeset
351 if(!inited){ // rv30 width/height now known
86b5ea6396ab Ugly hack to handle bad width/height values from stream header
arpi
parents: 9386
diff changeset
352 sh->aspect=(float)sh->disp_w/(float)sh->disp_h;
86b5ea6396ab Ugly hack to handle bad width/height values from stream header
arpi
parents: 9386
diff changeset
353 sh->disp_w=transform_out[3];
86b5ea6396ab Ugly hack to handle bad width/height values from stream header
arpi
parents: 9386
diff changeset
354 sh->disp_h=transform_out[4];
86b5ea6396ab Ugly hack to handle bad width/height values from stream header
arpi
parents: 9386
diff changeset
355 if (!mpcodecs_config_vo(sh,sh->disp_w,sh->disp_h,IMGFMT_I420)) return 0;
21559
de2a96f41195 Fix realvideo size changes by using our own malloced buffer and export type mpi.
reimar
parents: 21466
diff changeset
356 inited=1;
de2a96f41195 Fix realvideo size changes by using our own malloced buffer and export type mpi.
reimar
parents: 21466
diff changeset
357 }
de2a96f41195 Fix realvideo size changes by using our own malloced buffer and export type mpi.
reimar
parents: 21466
diff changeset
358 mpi=mpcodecs_get_image(sh, MP_IMGTYPE_EXPORT, 0 /*MP_IMGFLAG_ACCEPT_STRIDE*/,
9552
86b5ea6396ab Ugly hack to handle bad width/height values from stream header
arpi
parents: 9386
diff changeset
359 sh->disp_w, sh->disp_h);
86b5ea6396ab Ugly hack to handle bad width/height values from stream header
arpi
parents: 9386
diff changeset
360 if(!mpi) return NULL;
21559
de2a96f41195 Fix realvideo size changes by using our own malloced buffer and export type mpi.
reimar
parents: 21466
diff changeset
361 mpi->planes[0] = buffer;
de2a96f41195 Fix realvideo size changes by using our own malloced buffer and export type mpi.
reimar
parents: 21466
diff changeset
362 mpi->stride[0] = sh->disp_w;
de2a96f41195 Fix realvideo size changes by using our own malloced buffer and export type mpi.
reimar
parents: 21466
diff changeset
363 mpi->planes[1] = buffer + sh->disp_w*sh->disp_h;
de2a96f41195 Fix realvideo size changes by using our own malloced buffer and export type mpi.
reimar
parents: 21466
diff changeset
364 mpi->stride[1] = sh->disp_w / 2;
de2a96f41195 Fix realvideo size changes by using our own malloced buffer and export type mpi.
reimar
parents: 21466
diff changeset
365 mpi->planes[2] = buffer + sh->disp_w*sh->disp_h*5/4;
de2a96f41195 Fix realvideo size changes by using our own malloced buffer and export type mpi.
reimar
parents: 21466
diff changeset
366 mpi->stride[2] = sh->disp_w / 2;
9552
86b5ea6396ab Ugly hack to handle bad width/height values from stream header
arpi
parents: 9386
diff changeset
367
21559
de2a96f41195 Fix realvideo size changes by using our own malloced buffer and export type mpi.
reimar
parents: 21466
diff changeset
368 if(transform_out[0] &&
de2a96f41195 Fix realvideo size changes by using our own malloced buffer and export type mpi.
reimar
parents: 21466
diff changeset
369 (sh->disp_w != transform_out[3] || sh->disp_h != transform_out[4]))
de2a96f41195 Fix realvideo size changes by using our own malloced buffer and export type mpi.
reimar
parents: 21466
diff changeset
370 inited = 0;
de2a96f41195 Fix realvideo size changes by using our own malloced buffer and export type mpi.
reimar
parents: 21466
diff changeset
371
6341
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
372 return (result?NULL:mpi);
d79c52610702 RealVideo rv30 decoder, using binary driver from realplayer8
arpi
parents:
diff changeset
373 }