Mercurial > mplayer.hg
annotate libvo/vosub_vidix.c @ 8203:3af4919d9c5f
When you called mplayer with the absolute path to the video and the VOBSUB
subtitle is in a rar archive, mplayer tried to find the files in the archive
with the absolute path. The patch fixes the problem by getting rid of the
full path just trying the filename.
patch by Uwe.Reder@3SOFT.de
author | arpi |
---|---|
date | Sat, 16 Nov 2002 03:04:33 +0000 |
parents | b64f14fdadfb |
children | 772d6d27fd66 |
rev | line source |
---|---|
4010 | 1 /* |
2 * vosub_vidix.c | |
3 * | |
4 * Copyright (C) Nick Kurshev <nickols_k@mail.ru> - 2002 | |
4280 | 5 * Copyright (C) Alex Beregszaszi |
4010 | 6 * |
7 * You can redistribute this file under terms and conditions | |
8 * of GNU General Public licence v2. | |
9 * | |
10 * This file contains vidix interface to any mplayer's VO plugin. | |
11 * (Partly based on vesa_lvo.c from mplayer's package) | |
12 */ | |
13 | |
14 #include <inttypes.h> | |
15 #include <sys/ioctl.h> | |
16 #include <unistd.h> | |
17 #include <fcntl.h> | |
18 #include <sys/mman.h> | |
19 #include <stdio.h> | |
20 #include <stdlib.h> | |
21 #include <string.h> | |
4372 | 22 #include <errno.h> |
4010 | 23 |
24 #include "config.h" | |
25 | |
26 #include "vosub_vidix.h" | |
27 #include "../vidix/vidixlib.h" | |
5052
6f28d6ccbd91
Using yv12_to_yuy2 sw convertor for cards which have no native yv12 support
nick
parents:
5028
diff
changeset
|
28 #include "../postproc/rgb2rgb.h" |
4010 | 29 #include "fastmemcpy.h" |
30 #include "osd.h" | |
31 #include "video_out.h" | |
6550
991e03ca5ceb
added OSD support for yvu9/y800, corrected query_format \(added flag VFCAP_OSD\), fixed multifile support \(no more control infinite loop and destroying old window\) and some cosmetics
alex
parents:
6531
diff
changeset
|
32 #include "sub.h" |
4991 | 33 |
5566 | 34 #include "../libmpcodecs/vfcap.h" |
5607 | 35 #include "../libmpcodecs/mp_image.h" |
4010 | 36 |
4929 | 37 #define NUM_FRAMES VID_PLAY_MAXFRAMES /* Temporary: driver will overwrite it */ |
4010 | 38 #define UNUSED(x) ((void)(x)) /* Removes warning about unused arguments */ |
39 | |
40 static VDL_HANDLE vidix_handler = NULL; | |
41 static uint8_t *vidix_mem = NULL; | |
42 static uint8_t next_frame; | |
5052
6f28d6ccbd91
Using yv12_to_yuy2 sw convertor for cards which have no native yv12 support
nick
parents:
5028
diff
changeset
|
43 static unsigned image_Bpp,image_height,image_width,src_format,forced_fourcc=0; |
4010 | 44 extern int verbose; |
4372 | 45 static int video_on=0; |
4010 | 46 |
47 static vidix_capability_t vidix_cap; | |
48 static vidix_playback_t vidix_play; | |
49 static vidix_fourcc_t vidix_fourcc; | |
4454 | 50 static vo_functions_t * vo_server; |
4999 | 51 static vidix_yuv_t dstrides; |
4739 | 52 static uint32_t (*server_control)(uint32_t request, void *data, ...); |
53 | |
4379 | 54 static int vidix_get_video_eq(vidix_video_eq_t *info); |
55 static int vidix_set_video_eq(const vidix_video_eq_t *info); | |
56 static int vidix_get_num_fx(unsigned *info); | |
57 static int vidix_get_oem_fx(vidix_oem_fx_t *info); | |
58 static int vidix_set_oem_fx(const vidix_oem_fx_t *info); | |
59 static int vidix_set_deint(const vidix_deinterlace_t *info); | |
4372 | 60 |
4234
0ec1d81c8f94
sorry, i really wanted to add vidix_start and stop as int, to detect if something went into the wrong way (also implement check in vo_xvidix)
alex
parents:
4231
diff
changeset
|
61 int vidix_start(void) |
4198
7e2bf04c9a7c
added vidix_start() and vidix_stop() for better runtime-resize support ;)
alex
parents:
4138
diff
changeset
|
62 { |
7e2bf04c9a7c
added vidix_start() and vidix_stop() for better runtime-resize support ;)
alex
parents:
4138
diff
changeset
|
63 int err; |
4270
178c84b1090e
clearing safely the buffer, queryfourcc returns 0x2 (hw accel, noconv.), setting eq only if drivers i able
alex
parents:
4255
diff
changeset
|
64 if((err=vdlPlaybackOn(vidix_handler))!=0) |
178c84b1090e
clearing safely the buffer, queryfourcc returns 0x2 (hw accel, noconv.), setting eq only if drivers i able
alex
parents:
4255
diff
changeset
|
65 { |
178c84b1090e
clearing safely the buffer, queryfourcc returns 0x2 (hw accel, noconv.), setting eq only if drivers i able
alex
parents:
4255
diff
changeset
|
66 printf("vosub_vidix: Can't start playback: %s\n",strerror(err)); |
178c84b1090e
clearing safely the buffer, queryfourcc returns 0x2 (hw accel, noconv.), setting eq only if drivers i able
alex
parents:
4255
diff
changeset
|
67 return -1; |
178c84b1090e
clearing safely the buffer, queryfourcc returns 0x2 (hw accel, noconv.), setting eq only if drivers i able
alex
parents:
4255
diff
changeset
|
68 } |
4379 | 69 video_on=1; |
4234
0ec1d81c8f94
sorry, i really wanted to add vidix_start and stop as int, to detect if something went into the wrong way (also implement check in vo_xvidix)
alex
parents:
4231
diff
changeset
|
70 return 0; |
4198
7e2bf04c9a7c
added vidix_start() and vidix_stop() for better runtime-resize support ;)
alex
parents:
4138
diff
changeset
|
71 } |
7e2bf04c9a7c
added vidix_start() and vidix_stop() for better runtime-resize support ;)
alex
parents:
4138
diff
changeset
|
72 |
4234
0ec1d81c8f94
sorry, i really wanted to add vidix_start and stop as int, to detect if something went into the wrong way (also implement check in vo_xvidix)
alex
parents:
4231
diff
changeset
|
73 int vidix_stop(void) |
4198
7e2bf04c9a7c
added vidix_start() and vidix_stop() for better runtime-resize support ;)
alex
parents:
4138
diff
changeset
|
74 { |
7e2bf04c9a7c
added vidix_start() and vidix_stop() for better runtime-resize support ;)
alex
parents:
4138
diff
changeset
|
75 int err; |
7e2bf04c9a7c
added vidix_start() and vidix_stop() for better runtime-resize support ;)
alex
parents:
4138
diff
changeset
|
76 if((err=vdlPlaybackOff(vidix_handler))!=0) |
7e2bf04c9a7c
added vidix_start() and vidix_stop() for better runtime-resize support ;)
alex
parents:
4138
diff
changeset
|
77 { |
7e2bf04c9a7c
added vidix_start() and vidix_stop() for better runtime-resize support ;)
alex
parents:
4138
diff
changeset
|
78 printf("vosub_vidix: Can't stop playback: %s\n",strerror(err)); |
4234
0ec1d81c8f94
sorry, i really wanted to add vidix_start and stop as int, to detect if something went into the wrong way (also implement check in vo_xvidix)
alex
parents:
4231
diff
changeset
|
79 return -1; |
4198
7e2bf04c9a7c
added vidix_start() and vidix_stop() for better runtime-resize support ;)
alex
parents:
4138
diff
changeset
|
80 } |
4372 | 81 video_on=0; |
4234
0ec1d81c8f94
sorry, i really wanted to add vidix_start and stop as int, to detect if something went into the wrong way (also implement check in vo_xvidix)
alex
parents:
4231
diff
changeset
|
82 return 0; |
4198
7e2bf04c9a7c
added vidix_start() and vidix_stop() for better runtime-resize support ;)
alex
parents:
4138
diff
changeset
|
83 } |
7e2bf04c9a7c
added vidix_start() and vidix_stop() for better runtime-resize support ;)
alex
parents:
4138
diff
changeset
|
84 |
4010 | 85 void vidix_term( void ) |
86 { | |
87 if(verbose > 1) printf("vosub_vidix: vidix_term() was called\n"); | |
4198
7e2bf04c9a7c
added vidix_start() and vidix_stop() for better runtime-resize support ;)
alex
parents:
4138
diff
changeset
|
88 vidix_stop(); |
4010 | 89 vdlClose(vidix_handler); |
6550
991e03ca5ceb
added OSD support for yvu9/y800, corrected query_format \(added flag VFCAP_OSD\), fixed multifile support \(no more control infinite loop and destroying old window\) and some cosmetics
alex
parents:
6531
diff
changeset
|
90 // ((vo_functions_t *)vo_server)->control=server_control; |
4010 | 91 } |
92 | |
4430 | 93 static uint32_t vidix_draw_slice_420(uint8_t *image[], int stride[], int w,int h,int x,int y) |
4010 | 94 { |
95 uint8_t *src; | |
96 uint8_t *dest; | |
97 int i; | |
4324
09f15844c960
don't render UV planes if interleaved (also add support later)
alex
parents:
4317
diff
changeset
|
98 |
09f15844c960
don't render UV planes if interleaved (also add support later)
alex
parents:
4317
diff
changeset
|
99 /* Plane Y */ |
4032 | 100 dest = vidix_mem + vidix_play.offsets[next_frame] + vidix_play.offset.y; |
4999 | 101 dest += dstrides.y*y + x; |
4010 | 102 src = image[0]; |
103 for(i=0;i<h;i++){ | |
104 memcpy(dest,src,w); | |
105 src+=stride[0]; | |
4999 | 106 dest += dstrides.y; |
4010 | 107 } |
108 | |
4324
09f15844c960
don't render UV planes if interleaved (also add support later)
alex
parents:
4317
diff
changeset
|
109 if (vidix_play.flags & VID_PLAY_INTERLEAVED_UV) |
09f15844c960
don't render UV planes if interleaved (also add support later)
alex
parents:
4317
diff
changeset
|
110 { |
4744
da595f0e882e
vidix interleaved U V planes (for g200) by Attila Kinali <kinali@gmx.net>
nick
parents:
4741
diff
changeset
|
111 int hi,wi; |
da595f0e882e
vidix interleaved U V planes (for g200) by Attila Kinali <kinali@gmx.net>
nick
parents:
4741
diff
changeset
|
112 uint8_t *src2; |
da595f0e882e
vidix interleaved U V planes (for g200) by Attila Kinali <kinali@gmx.net>
nick
parents:
4741
diff
changeset
|
113 dest = vidix_mem + vidix_play.offsets[next_frame] + vidix_play.offset.v; |
4999 | 114 dest += dstrides.y*y/2 + x; // <- is this correct ? |
4744
da595f0e882e
vidix interleaved U V planes (for g200) by Attila Kinali <kinali@gmx.net>
nick
parents:
4741
diff
changeset
|
115 h/=2; |
da595f0e882e
vidix interleaved U V planes (for g200) by Attila Kinali <kinali@gmx.net>
nick
parents:
4741
diff
changeset
|
116 w/=2; |
da595f0e882e
vidix interleaved U V planes (for g200) by Attila Kinali <kinali@gmx.net>
nick
parents:
4741
diff
changeset
|
117 src = image[1]; |
da595f0e882e
vidix interleaved U V planes (for g200) by Attila Kinali <kinali@gmx.net>
nick
parents:
4741
diff
changeset
|
118 src2 = image[2]; |
da595f0e882e
vidix interleaved U V planes (for g200) by Attila Kinali <kinali@gmx.net>
nick
parents:
4741
diff
changeset
|
119 for(hi = 0; hi < h; hi++) |
da595f0e882e
vidix interleaved U V planes (for g200) by Attila Kinali <kinali@gmx.net>
nick
parents:
4741
diff
changeset
|
120 { |
da595f0e882e
vidix interleaved U V planes (for g200) by Attila Kinali <kinali@gmx.net>
nick
parents:
4741
diff
changeset
|
121 for(wi = 0; wi < w; wi++) |
da595f0e882e
vidix interleaved U V planes (for g200) by Attila Kinali <kinali@gmx.net>
nick
parents:
4741
diff
changeset
|
122 { |
da595f0e882e
vidix interleaved U V planes (for g200) by Attila Kinali <kinali@gmx.net>
nick
parents:
4741
diff
changeset
|
123 dest[2*wi+0] = src[wi]; |
da595f0e882e
vidix interleaved U V planes (for g200) by Attila Kinali <kinali@gmx.net>
nick
parents:
4741
diff
changeset
|
124 dest[2*wi+1] = src2[wi]; |
da595f0e882e
vidix interleaved U V planes (for g200) by Attila Kinali <kinali@gmx.net>
nick
parents:
4741
diff
changeset
|
125 } |
4999 | 126 dest += dstrides.y; |
4744
da595f0e882e
vidix interleaved U V planes (for g200) by Attila Kinali <kinali@gmx.net>
nick
parents:
4741
diff
changeset
|
127 src += stride[1]; |
4999 | 128 src2+= stride[2]; |
129 } | |
130 } | |
131 else | |
132 { | |
4744
da595f0e882e
vidix interleaved U V planes (for g200) by Attila Kinali <kinali@gmx.net>
nick
parents:
4741
diff
changeset
|
133 /* Plane V */ |
da595f0e882e
vidix interleaved U V planes (for g200) by Attila Kinali <kinali@gmx.net>
nick
parents:
4741
diff
changeset
|
134 dest = vidix_mem + vidix_play.offsets[next_frame] + vidix_play.offset.v; |
4999 | 135 dest += dstrides.v*y/4 + x; |
4744
da595f0e882e
vidix interleaved U V planes (for g200) by Attila Kinali <kinali@gmx.net>
nick
parents:
4741
diff
changeset
|
136 src = image[1]; |
da595f0e882e
vidix interleaved U V planes (for g200) by Attila Kinali <kinali@gmx.net>
nick
parents:
4741
diff
changeset
|
137 for(i=0;i<h/2;i++){ |
da595f0e882e
vidix interleaved U V planes (for g200) by Attila Kinali <kinali@gmx.net>
nick
parents:
4741
diff
changeset
|
138 memcpy(dest,src,w/2); |
da595f0e882e
vidix interleaved U V planes (for g200) by Attila Kinali <kinali@gmx.net>
nick
parents:
4741
diff
changeset
|
139 src+=stride[1]; |
4999 | 140 dest+=dstrides.v/2; |
4744
da595f0e882e
vidix interleaved U V planes (for g200) by Attila Kinali <kinali@gmx.net>
nick
parents:
4741
diff
changeset
|
141 } |
4324
09f15844c960
don't render UV planes if interleaved (also add support later)
alex
parents:
4317
diff
changeset
|
142 |
4744
da595f0e882e
vidix interleaved U V planes (for g200) by Attila Kinali <kinali@gmx.net>
nick
parents:
4741
diff
changeset
|
143 /* Plane U */ |
da595f0e882e
vidix interleaved U V planes (for g200) by Attila Kinali <kinali@gmx.net>
nick
parents:
4741
diff
changeset
|
144 dest = vidix_mem + vidix_play.offsets[next_frame] + vidix_play.offset.u; |
4999 | 145 dest += dstrides.u*y/4 + x; |
4744
da595f0e882e
vidix interleaved U V planes (for g200) by Attila Kinali <kinali@gmx.net>
nick
parents:
4741
diff
changeset
|
146 src = image[2]; |
da595f0e882e
vidix interleaved U V planes (for g200) by Attila Kinali <kinali@gmx.net>
nick
parents:
4741
diff
changeset
|
147 for(i=0;i<h/2;i++){ |
da595f0e882e
vidix interleaved U V planes (for g200) by Attila Kinali <kinali@gmx.net>
nick
parents:
4741
diff
changeset
|
148 memcpy(dest,src,w/2); |
da595f0e882e
vidix interleaved U V planes (for g200) by Attila Kinali <kinali@gmx.net>
nick
parents:
4741
diff
changeset
|
149 src+=stride[2]; |
4999 | 150 dest += dstrides.u/2; |
4744
da595f0e882e
vidix interleaved U V planes (for g200) by Attila Kinali <kinali@gmx.net>
nick
parents:
4741
diff
changeset
|
151 } |
da595f0e882e
vidix interleaved U V planes (for g200) by Attila Kinali <kinali@gmx.net>
nick
parents:
4741
diff
changeset
|
152 return 0; |
4999 | 153 } |
6550
991e03ca5ceb
added OSD support for yvu9/y800, corrected query_format \(added flag VFCAP_OSD\), fixed multifile support \(no more control infinite loop and destroying old window\) and some cosmetics
alex
parents:
6531
diff
changeset
|
154 return -1; |
4010 | 155 } |
156 | |
6482
528216496060
YVU9,IF09,Y800 and Y8 support - and syªªnced with mpxp
alex
parents:
6018
diff
changeset
|
157 static uint32_t vidix_draw_slice_410(uint8_t *image[], int stride[], int w,int h,int x,int y) |
528216496060
YVU9,IF09,Y800 and Y8 support - and syªªnced with mpxp
alex
parents:
6018
diff
changeset
|
158 { |
528216496060
YVU9,IF09,Y800 and Y8 support - and syªªnced with mpxp
alex
parents:
6018
diff
changeset
|
159 uint8_t *src; |
528216496060
YVU9,IF09,Y800 and Y8 support - and syªªnced with mpxp
alex
parents:
6018
diff
changeset
|
160 uint8_t *dest; |
528216496060
YVU9,IF09,Y800 and Y8 support - and syªªnced with mpxp
alex
parents:
6018
diff
changeset
|
161 int i; |
528216496060
YVU9,IF09,Y800 and Y8 support - and syªªnced with mpxp
alex
parents:
6018
diff
changeset
|
162 |
528216496060
YVU9,IF09,Y800 and Y8 support - and syªªnced with mpxp
alex
parents:
6018
diff
changeset
|
163 /* Plane Y */ |
528216496060
YVU9,IF09,Y800 and Y8 support - and syªªnced with mpxp
alex
parents:
6018
diff
changeset
|
164 dest = vidix_mem + vidix_play.offsets[next_frame] + vidix_play.offset.y; |
528216496060
YVU9,IF09,Y800 and Y8 support - and syªªnced with mpxp
alex
parents:
6018
diff
changeset
|
165 dest += dstrides.y*y + x; |
528216496060
YVU9,IF09,Y800 and Y8 support - and syªªnced with mpxp
alex
parents:
6018
diff
changeset
|
166 src = image[0]; |
528216496060
YVU9,IF09,Y800 and Y8 support - and syªªnced with mpxp
alex
parents:
6018
diff
changeset
|
167 for(i=0;i<h;i++){ |
528216496060
YVU9,IF09,Y800 and Y8 support - and syªªnced with mpxp
alex
parents:
6018
diff
changeset
|
168 memcpy(dest,src,w); |
528216496060
YVU9,IF09,Y800 and Y8 support - and syªªnced with mpxp
alex
parents:
6018
diff
changeset
|
169 src+=stride[0]; |
528216496060
YVU9,IF09,Y800 and Y8 support - and syªªnced with mpxp
alex
parents:
6018
diff
changeset
|
170 dest += dstrides.y; |
528216496060
YVU9,IF09,Y800 and Y8 support - and syªªnced with mpxp
alex
parents:
6018
diff
changeset
|
171 } |
528216496060
YVU9,IF09,Y800 and Y8 support - and syªªnced with mpxp
alex
parents:
6018
diff
changeset
|
172 |
528216496060
YVU9,IF09,Y800 and Y8 support - and syªªnced with mpxp
alex
parents:
6018
diff
changeset
|
173 if (vidix_play.flags & VID_PLAY_INTERLEAVED_UV) |
528216496060
YVU9,IF09,Y800 and Y8 support - and syªªnced with mpxp
alex
parents:
6018
diff
changeset
|
174 { |
528216496060
YVU9,IF09,Y800 and Y8 support - and syªªnced with mpxp
alex
parents:
6018
diff
changeset
|
175 printf("vosub_vidix: interleaved uv for yuv410p not supported\n"); |
528216496060
YVU9,IF09,Y800 and Y8 support - and syªªnced with mpxp
alex
parents:
6018
diff
changeset
|
176 } |
528216496060
YVU9,IF09,Y800 and Y8 support - and syªªnced with mpxp
alex
parents:
6018
diff
changeset
|
177 else |
528216496060
YVU9,IF09,Y800 and Y8 support - and syªªnced with mpxp
alex
parents:
6018
diff
changeset
|
178 { |
528216496060
YVU9,IF09,Y800 and Y8 support - and syªªnced with mpxp
alex
parents:
6018
diff
changeset
|
179 /* Plane V */ |
528216496060
YVU9,IF09,Y800 and Y8 support - and syªªnced with mpxp
alex
parents:
6018
diff
changeset
|
180 dest = vidix_mem + vidix_play.offsets[next_frame] + vidix_play.offset.v; |
528216496060
YVU9,IF09,Y800 and Y8 support - and syªªnced with mpxp
alex
parents:
6018
diff
changeset
|
181 dest += dstrides.v*y/8 + x; |
528216496060
YVU9,IF09,Y800 and Y8 support - and syªªnced with mpxp
alex
parents:
6018
diff
changeset
|
182 src = image[1]; |
528216496060
YVU9,IF09,Y800 and Y8 support - and syªªnced with mpxp
alex
parents:
6018
diff
changeset
|
183 for(i=0;i<h/4;i++){ |
528216496060
YVU9,IF09,Y800 and Y8 support - and syªªnced with mpxp
alex
parents:
6018
diff
changeset
|
184 memcpy(dest,src,w/4); |
528216496060
YVU9,IF09,Y800 and Y8 support - and syªªnced with mpxp
alex
parents:
6018
diff
changeset
|
185 src+=stride[1]; |
528216496060
YVU9,IF09,Y800 and Y8 support - and syªªnced with mpxp
alex
parents:
6018
diff
changeset
|
186 dest+=dstrides.v/4; |
528216496060
YVU9,IF09,Y800 and Y8 support - and syªªnced with mpxp
alex
parents:
6018
diff
changeset
|
187 } |
528216496060
YVU9,IF09,Y800 and Y8 support - and syªªnced with mpxp
alex
parents:
6018
diff
changeset
|
188 |
528216496060
YVU9,IF09,Y800 and Y8 support - and syªªnced with mpxp
alex
parents:
6018
diff
changeset
|
189 /* Plane U */ |
528216496060
YVU9,IF09,Y800 and Y8 support - and syªªnced with mpxp
alex
parents:
6018
diff
changeset
|
190 dest = vidix_mem + vidix_play.offsets[next_frame] + vidix_play.offset.u; |
528216496060
YVU9,IF09,Y800 and Y8 support - and syªªnced with mpxp
alex
parents:
6018
diff
changeset
|
191 dest += dstrides.u*y/8 + x; |
528216496060
YVU9,IF09,Y800 and Y8 support - and syªªnced with mpxp
alex
parents:
6018
diff
changeset
|
192 src = image[2]; |
528216496060
YVU9,IF09,Y800 and Y8 support - and syªªnced with mpxp
alex
parents:
6018
diff
changeset
|
193 for(i=0;i<h/4;i++){ |
528216496060
YVU9,IF09,Y800 and Y8 support - and syªªnced with mpxp
alex
parents:
6018
diff
changeset
|
194 memcpy(dest,src,w/4); |
528216496060
YVU9,IF09,Y800 and Y8 support - and syªªnced with mpxp
alex
parents:
6018
diff
changeset
|
195 src+=stride[2]; |
528216496060
YVU9,IF09,Y800 and Y8 support - and syªªnced with mpxp
alex
parents:
6018
diff
changeset
|
196 dest += dstrides.u/4; |
528216496060
YVU9,IF09,Y800 and Y8 support - and syªªnced with mpxp
alex
parents:
6018
diff
changeset
|
197 } |
528216496060
YVU9,IF09,Y800 and Y8 support - and syªªnced with mpxp
alex
parents:
6018
diff
changeset
|
198 return 0; |
528216496060
YVU9,IF09,Y800 and Y8 support - and syªªnced with mpxp
alex
parents:
6018
diff
changeset
|
199 } |
6550
991e03ca5ceb
added OSD support for yvu9/y800, corrected query_format \(added flag VFCAP_OSD\), fixed multifile support \(no more control infinite loop and destroying old window\) and some cosmetics
alex
parents:
6531
diff
changeset
|
200 return -1; |
6482
528216496060
YVU9,IF09,Y800 and Y8 support - and syªªnced with mpxp
alex
parents:
6018
diff
changeset
|
201 } |
528216496060
YVU9,IF09,Y800 and Y8 support - and syªªnced with mpxp
alex
parents:
6018
diff
changeset
|
202 |
528216496060
YVU9,IF09,Y800 and Y8 support - and syªªnced with mpxp
alex
parents:
6018
diff
changeset
|
203 static uint32_t vidix_draw_slice_410_fast(uint8_t *image[], int stride[], int w, int h, int x, int y) |
528216496060
YVU9,IF09,Y800 and Y8 support - and syªªnced with mpxp
alex
parents:
6018
diff
changeset
|
204 { |
528216496060
YVU9,IF09,Y800 and Y8 support - and syªªnced with mpxp
alex
parents:
6018
diff
changeset
|
205 uint8_t *src; |
528216496060
YVU9,IF09,Y800 and Y8 support - and syªªnced with mpxp
alex
parents:
6018
diff
changeset
|
206 uint8_t *dest; |
6550
991e03ca5ceb
added OSD support for yvu9/y800, corrected query_format \(added flag VFCAP_OSD\), fixed multifile support \(no more control infinite loop and destroying old window\) and some cosmetics
alex
parents:
6531
diff
changeset
|
207 |
6482
528216496060
YVU9,IF09,Y800 and Y8 support - and syªªnced with mpxp
alex
parents:
6018
diff
changeset
|
208 UNUSED(w); |
528216496060
YVU9,IF09,Y800 and Y8 support - and syªªnced with mpxp
alex
parents:
6018
diff
changeset
|
209 UNUSED(stride); |
528216496060
YVU9,IF09,Y800 and Y8 support - and syªªnced with mpxp
alex
parents:
6018
diff
changeset
|
210 dest = vidix_mem + vidix_play.offsets[next_frame] + vidix_play.offset.y; |
528216496060
YVU9,IF09,Y800 and Y8 support - and syªªnced with mpxp
alex
parents:
6018
diff
changeset
|
211 dest += dstrides.y*y + x; |
528216496060
YVU9,IF09,Y800 and Y8 support - and syªªnced with mpxp
alex
parents:
6018
diff
changeset
|
212 src = image[0]; |
528216496060
YVU9,IF09,Y800 and Y8 support - and syªªnced with mpxp
alex
parents:
6018
diff
changeset
|
213 memcpy(dest, src, dstrides.y*h*9/8); |
528216496060
YVU9,IF09,Y800 and Y8 support - and syªªnced with mpxp
alex
parents:
6018
diff
changeset
|
214 return 0; |
528216496060
YVU9,IF09,Y800 and Y8 support - and syªªnced with mpxp
alex
parents:
6018
diff
changeset
|
215 } |
528216496060
YVU9,IF09,Y800 and Y8 support - and syªªnced with mpxp
alex
parents:
6018
diff
changeset
|
216 |
528216496060
YVU9,IF09,Y800 and Y8 support - and syªªnced with mpxp
alex
parents:
6018
diff
changeset
|
217 static uint32_t vidix_draw_slice_400(uint8_t *image[], int stride[], int w,int h,int x,int y) |
528216496060
YVU9,IF09,Y800 and Y8 support - and syªªnced with mpxp
alex
parents:
6018
diff
changeset
|
218 { |
528216496060
YVU9,IF09,Y800 and Y8 support - and syªªnced with mpxp
alex
parents:
6018
diff
changeset
|
219 uint8_t *src; |
528216496060
YVU9,IF09,Y800 and Y8 support - and syªªnced with mpxp
alex
parents:
6018
diff
changeset
|
220 uint8_t *dest; |
528216496060
YVU9,IF09,Y800 and Y8 support - and syªªnced with mpxp
alex
parents:
6018
diff
changeset
|
221 int i; |
528216496060
YVU9,IF09,Y800 and Y8 support - and syªªnced with mpxp
alex
parents:
6018
diff
changeset
|
222 |
528216496060
YVU9,IF09,Y800 and Y8 support - and syªªnced with mpxp
alex
parents:
6018
diff
changeset
|
223 dest = vidix_mem + vidix_play.offsets[next_frame] + vidix_play.offset.y; |
528216496060
YVU9,IF09,Y800 and Y8 support - and syªªnced with mpxp
alex
parents:
6018
diff
changeset
|
224 dest += dstrides.y*y + x; |
528216496060
YVU9,IF09,Y800 and Y8 support - and syªªnced with mpxp
alex
parents:
6018
diff
changeset
|
225 src = image[0]; |
528216496060
YVU9,IF09,Y800 and Y8 support - and syªªnced with mpxp
alex
parents:
6018
diff
changeset
|
226 for(i=0;i<h;i++){ |
528216496060
YVU9,IF09,Y800 and Y8 support - and syªªnced with mpxp
alex
parents:
6018
diff
changeset
|
227 memcpy(dest,src,w); |
528216496060
YVU9,IF09,Y800 and Y8 support - and syªªnced with mpxp
alex
parents:
6018
diff
changeset
|
228 src+=stride[0]; |
528216496060
YVU9,IF09,Y800 and Y8 support - and syªªnced with mpxp
alex
parents:
6018
diff
changeset
|
229 dest += dstrides.y; |
528216496060
YVU9,IF09,Y800 and Y8 support - and syªªnced with mpxp
alex
parents:
6018
diff
changeset
|
230 } |
528216496060
YVU9,IF09,Y800 and Y8 support - and syªªnced with mpxp
alex
parents:
6018
diff
changeset
|
231 return 0; |
528216496060
YVU9,IF09,Y800 and Y8 support - and syªªnced with mpxp
alex
parents:
6018
diff
changeset
|
232 } |
528216496060
YVU9,IF09,Y800 and Y8 support - and syªªnced with mpxp
alex
parents:
6018
diff
changeset
|
233 |
4999 | 234 static uint32_t vidix_draw_slice_packed(uint8_t *image[], int stride[], int w,int h,int x,int y) |
4010 | 235 { |
236 uint8_t *src; | |
237 uint8_t *dest; | |
238 int i; | |
6550
991e03ca5ceb
added OSD support for yvu9/y800, corrected query_format \(added flag VFCAP_OSD\), fixed multifile support \(no more control infinite loop and destroying old window\) and some cosmetics
alex
parents:
6531
diff
changeset
|
239 |
4032 | 240 dest = vidix_mem + vidix_play.offsets[next_frame] + vidix_play.offset.y; |
4999 | 241 dest += dstrides.y*y + x; |
4010 | 242 src = image[0]; |
243 for(i=0;i<h;i++){ | |
4999 | 244 memcpy(dest,src,w*image_Bpp); |
4010 | 245 src+=stride[0]; |
4999 | 246 dest += dstrides.y; |
4010 | 247 } |
4240 | 248 return 0; |
4010 | 249 } |
250 | |
251 uint32_t vidix_draw_slice(uint8_t *image[], int stride[], int w,int h,int x,int y) | |
252 { | |
6550
991e03ca5ceb
added OSD support for yvu9/y800, corrected query_format \(added flag VFCAP_OSD\), fixed multifile support \(no more control infinite loop and destroying old window\) and some cosmetics
alex
parents:
6531
diff
changeset
|
253 UNUSED(image); |
991e03ca5ceb
added OSD support for yvu9/y800, corrected query_format \(added flag VFCAP_OSD\), fixed multifile support \(no more control infinite loop and destroying old window\) and some cosmetics
alex
parents:
6531
diff
changeset
|
254 UNUSED(stride); |
991e03ca5ceb
added OSD support for yvu9/y800, corrected query_format \(added flag VFCAP_OSD\), fixed multifile support \(no more control infinite loop and destroying old window\) and some cosmetics
alex
parents:
6531
diff
changeset
|
255 UNUSED(w); |
991e03ca5ceb
added OSD support for yvu9/y800, corrected query_format \(added flag VFCAP_OSD\), fixed multifile support \(no more control infinite loop and destroying old window\) and some cosmetics
alex
parents:
6531
diff
changeset
|
256 UNUSED(h); |
991e03ca5ceb
added OSD support for yvu9/y800, corrected query_format \(added flag VFCAP_OSD\), fixed multifile support \(no more control infinite loop and destroying old window\) and some cosmetics
alex
parents:
6531
diff
changeset
|
257 UNUSED(x); |
991e03ca5ceb
added OSD support for yvu9/y800, corrected query_format \(added flag VFCAP_OSD\), fixed multifile support \(no more control infinite loop and destroying old window\) and some cosmetics
alex
parents:
6531
diff
changeset
|
258 UNUSED(y); |
4454 | 259 printf("vosub_vidix: Error unoptimized draw_slice was called\nExiting..."); |
260 vidix_term(); | |
261 exit( EXIT_FAILURE ); | |
262 return 0; | |
4010 | 263 } |
264 | |
7685 | 265 static uint32_t vidix_draw_image(mp_image_t *mpi){ |
266 if(verbose > 1) printf("vosub_vidix: vidix_draw_image() was called\n"); | |
267 | |
268 // if -dr or -slices then do nothing: | |
269 if(mpi->flags&(MP_IMGFLAG_DIRECT|MP_IMGFLAG_DRAW_CALLBACK)) return VO_TRUE; | |
270 | |
271 vo_server->draw_slice(mpi->planes,mpi->stride, | |
272 vidix_play.src.w,vidix_play.src.h,vidix_play.src.x,vidix_play.src.y); | |
273 return VO_TRUE; | |
274 } | |
275 | |
4010 | 276 uint32_t vidix_draw_frame(uint8_t *image[]) |
277 { | |
7685 | 278 printf("vosub_vidix: vidix_draw_frame() was called!!!!\n"); |
279 return -1; | |
4010 | 280 } |
281 | |
282 void vidix_flip_page(void) | |
283 { | |
284 if(verbose > 1) printf("vosub_vidix: vidix_flip_page() was called\n"); | |
285 if(vo_doublebuffering) | |
286 { | |
4032 | 287 vdlPlaybackFrameSelect(vidix_handler,next_frame); |
4010 | 288 next_frame=(next_frame+1)%vidix_play.num_frames; |
289 } | |
290 } | |
291 | |
292 static void draw_alpha(int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride) | |
293 { | |
4032 | 294 uint32_t apitch,bespitch; |
4010 | 295 void *lvo_mem; |
4032 | 296 lvo_mem = vidix_mem + vidix_play.offsets[next_frame] + vidix_play.offset.y; |
297 apitch = vidix_play.dest.pitch.y-1; | |
4010 | 298 switch(vidix_play.fourcc){ |
299 case IMGFMT_YV12: | |
300 case IMGFMT_IYUV: | |
301 case IMGFMT_I420: | |
6550
991e03ca5ceb
added OSD support for yvu9/y800, corrected query_format \(added flag VFCAP_OSD\), fixed multifile support \(no more control infinite loop and destroying old window\) and some cosmetics
alex
parents:
6531
diff
changeset
|
302 case IMGFMT_YVU9: |
991e03ca5ceb
added OSD support for yvu9/y800, corrected query_format \(added flag VFCAP_OSD\), fixed multifile support \(no more control infinite loop and destroying old window\) and some cosmetics
alex
parents:
6531
diff
changeset
|
303 case IMGFMT_IF09: |
991e03ca5ceb
added OSD support for yvu9/y800, corrected query_format \(added flag VFCAP_OSD\), fixed multifile support \(no more control infinite loop and destroying old window\) and some cosmetics
alex
parents:
6531
diff
changeset
|
304 case IMGFMT_Y8: |
991e03ca5ceb
added OSD support for yvu9/y800, corrected query_format \(added flag VFCAP_OSD\), fixed multifile support \(no more control infinite loop and destroying old window\) and some cosmetics
alex
parents:
6531
diff
changeset
|
305 case IMGFMT_Y800: |
4745
398e3663ed71
Allow using direct rendering with any HW pitches (even on matrox g400).
nick
parents:
4744
diff
changeset
|
306 bespitch = (vidix_play.src.w + apitch) & (~apitch); |
4010 | 307 vo_draw_alpha_yv12(w,h,src,srca,stride,lvo_mem+bespitch*y0+x0,bespitch); |
308 break; | |
309 case IMGFMT_YUY2: | |
4745
398e3663ed71
Allow using direct rendering with any HW pitches (even on matrox g400).
nick
parents:
4744
diff
changeset
|
310 bespitch = (vidix_play.src.w*2 + apitch) & (~apitch); |
398e3663ed71
Allow using direct rendering with any HW pitches (even on matrox g400).
nick
parents:
4744
diff
changeset
|
311 vo_draw_alpha_yuy2(w,h,src,srca,stride,lvo_mem+bespitch*y0+2*x0,bespitch); |
4010 | 312 break; |
313 case IMGFMT_UYVY: | |
4745
398e3663ed71
Allow using direct rendering with any HW pitches (even on matrox g400).
nick
parents:
4744
diff
changeset
|
314 bespitch = (vidix_play.src.w*2 + apitch) & (~apitch); |
398e3663ed71
Allow using direct rendering with any HW pitches (even on matrox g400).
nick
parents:
4744
diff
changeset
|
315 vo_draw_alpha_yuy2(w,h,src,srca,stride,lvo_mem+bespitch*y0+2*x0+1,bespitch); |
4010 | 316 break; |
4430 | 317 case IMGFMT_RGB32: |
318 case IMGFMT_BGR32: | |
4745
398e3663ed71
Allow using direct rendering with any HW pitches (even on matrox g400).
nick
parents:
4744
diff
changeset
|
319 bespitch = (vidix_play.src.w*4 + apitch) & (~apitch); |
398e3663ed71
Allow using direct rendering with any HW pitches (even on matrox g400).
nick
parents:
4744
diff
changeset
|
320 vo_draw_alpha_rgb32(w,h,src,srca,stride,lvo_mem+y0*bespitch+4*x0,bespitch); |
4430 | 321 break; |
322 case IMGFMT_RGB24: | |
323 case IMGFMT_BGR24: | |
4745
398e3663ed71
Allow using direct rendering with any HW pitches (even on matrox g400).
nick
parents:
4744
diff
changeset
|
324 bespitch = (vidix_play.src.w*3 + apitch) & (~apitch); |
398e3663ed71
Allow using direct rendering with any HW pitches (even on matrox g400).
nick
parents:
4744
diff
changeset
|
325 vo_draw_alpha_rgb24(w,h,src,srca,stride,lvo_mem+y0*bespitch+3*x0,bespitch); |
4430 | 326 break; |
327 case IMGFMT_RGB16: | |
328 case IMGFMT_BGR16: | |
4745
398e3663ed71
Allow using direct rendering with any HW pitches (even on matrox g400).
nick
parents:
4744
diff
changeset
|
329 bespitch = (vidix_play.src.w*2 + apitch) & (~apitch); |
398e3663ed71
Allow using direct rendering with any HW pitches (even on matrox g400).
nick
parents:
4744
diff
changeset
|
330 vo_draw_alpha_rgb16(w,h,src,srca,stride,lvo_mem+y0*bespitch+2*x0,bespitch); |
4430 | 331 break; |
332 case IMGFMT_RGB15: | |
333 case IMGFMT_BGR15: | |
4745
398e3663ed71
Allow using direct rendering with any HW pitches (even on matrox g400).
nick
parents:
4744
diff
changeset
|
334 bespitch = (vidix_play.src.w*2 + apitch) & (~apitch); |
398e3663ed71
Allow using direct rendering with any HW pitches (even on matrox g400).
nick
parents:
4744
diff
changeset
|
335 vo_draw_alpha_rgb15(w,h,src,srca,stride,lvo_mem+y0*bespitch+2*x0,bespitch); |
4430 | 336 break; |
4010 | 337 default: |
6786 | 338 return; |
4010 | 339 } |
340 } | |
341 | |
342 void vidix_draw_osd(void) | |
343 { | |
344 if(verbose > 1) printf("vosub_vidix: vidix_draw_osd() was called\n"); | |
345 /* TODO: hw support */ | |
346 vo_draw_text(vidix_play.src.w,vidix_play.src.h,draw_alpha); | |
347 } | |
348 | |
349 uint32_t vidix_query_fourcc(uint32_t format) | |
350 { | |
351 if(verbose > 1) printf("vosub_vidix: query_format was called: %x (%s)\n",format,vo_format_name(format)); | |
352 vidix_fourcc.fourcc = format; | |
353 vdlQueryFourcc(vidix_handler,&vidix_fourcc); | |
5052
6f28d6ccbd91
Using yv12_to_yuy2 sw convertor for cards which have no native yv12 support
nick
parents:
5028
diff
changeset
|
354 if (vidix_fourcc.depth == VID_DEPTH_NONE) |
5566 | 355 return 0; |
7694
b64f14fdadfb
also set VFCAP_ACCEPT_STRIDE when draw_image() is implemented
arpi
parents:
7685
diff
changeset
|
356 return VFCAP_CSP_SUPPORTED|VFCAP_CSP_SUPPORTED_BY_HW|VFCAP_HWSCALE_UP|VFCAP_HWSCALE_DOWN|VFCAP_OSD|VFCAP_ACCEPT_STRIDE; |
4010 | 357 } |
4240 | 358 |
4255 | 359 int vidix_grkey_support(void) |
360 { | |
4270
178c84b1090e
clearing safely the buffer, queryfourcc returns 0x2 (hw accel, noconv.), setting eq only if drivers i able
alex
parents:
4255
diff
changeset
|
361 return(vidix_fourcc.flags & VID_CAP_COLORKEY); |
4255 | 362 } |
363 | |
4240 | 364 int vidix_grkey_get(vidix_grkey_t *gr_key) |
365 { | |
366 return(vdlGetGrKeys(vidix_handler, gr_key)); | |
367 } | |
368 | |
369 int vidix_grkey_set(const vidix_grkey_t *gr_key) | |
370 { | |
371 return(vdlSetGrKeys(vidix_handler, gr_key)); | |
372 } | |
4372 | 373 |
4379 | 374 |
375 static int vidix_get_video_eq(vidix_video_eq_t *info) | |
376 { | |
377 if(!video_on) return EPERM; | |
378 return vdlPlaybackGetEq(vidix_handler, info); | |
379 } | |
380 | |
381 static int vidix_set_video_eq(const vidix_video_eq_t *info) | |
382 { | |
383 if(!video_on) return EPERM; | |
384 return vdlPlaybackSetEq(vidix_handler, info); | |
385 } | |
386 | |
387 static int vidix_get_num_fx(unsigned *info) | |
388 { | |
389 if(!video_on) return EPERM; | |
390 return vdlQueryNumOemEffects(vidix_handler, info); | |
391 } | |
392 | |
393 static int vidix_get_oem_fx(vidix_oem_fx_t *info) | |
394 { | |
395 if(!video_on) return EPERM; | |
396 return vdlGetOemEffect(vidix_handler, info); | |
397 } | |
398 | |
399 static int vidix_set_oem_fx(const vidix_oem_fx_t *info) | |
400 { | |
401 if(!video_on) return EPERM; | |
402 return vdlSetOemEffect(vidix_handler, info); | |
403 } | |
404 | |
405 static int vidix_set_deint(const vidix_deinterlace_t *info) | |
406 { | |
407 if(!video_on) return EPERM; | |
408 return vdlPlaybackSetDeint(vidix_handler, info); | |
409 } | |
4454 | 410 |
5028 | 411 static int is_422_planes_eq=0; |
4454 | 412 int vidix_init(unsigned src_width,unsigned src_height, |
413 unsigned x_org,unsigned y_org,unsigned dst_width, | |
414 unsigned dst_height,unsigned format,unsigned dest_bpp, | |
7124
eca7dbad0166
finally removed query_vaa, bes_da and vo_tune_info - the obsoleted libvo api
alex
parents:
7026
diff
changeset
|
415 unsigned vid_w,unsigned vid_h) |
4454 | 416 { |
6550
991e03ca5ceb
added OSD support for yvu9/y800, corrected query_format \(added flag VFCAP_OSD\), fixed multifile support \(no more control infinite loop and destroying old window\) and some cosmetics
alex
parents:
6531
diff
changeset
|
417 size_t i; |
5028 | 418 int err; |
4999 | 419 uint32_t sstride,apitch; |
4454 | 420 if(verbose > 1) |
421 printf("vosub_vidix: vidix_init() was called\n" | |
422 "src_w=%u src_h=%u dest_x_y_w_h = %u %u %u %u\n" | |
423 "format=%s dest_bpp=%u vid_w=%u vid_h=%u\n" | |
424 ,src_width,src_height,x_org,y_org,dst_width,dst_height | |
425 ,vo_format_name(format),dest_bpp,vid_w,vid_h); | |
426 | |
7026
a3126e9099b4
should solve -vo vesa:vidix problem 'vosub_vidix: video server has
arpi
parents:
6806
diff
changeset
|
427 if(vidix_query_fourcc(format) == 0) |
a3126e9099b4
should solve -vo vesa:vidix problem 'vosub_vidix: video server has
arpi
parents:
6806
diff
changeset
|
428 { |
a3126e9099b4
should solve -vo vesa:vidix problem 'vosub_vidix: video server has
arpi
parents:
6806
diff
changeset
|
429 printf("vosub_vidix: unsupported fourcc for this vidix driver: %x (%s)\n", |
a3126e9099b4
should solve -vo vesa:vidix problem 'vosub_vidix: video server has
arpi
parents:
6806
diff
changeset
|
430 format,vo_format_name(format)); |
a3126e9099b4
should solve -vo vesa:vidix problem 'vosub_vidix: video server has
arpi
parents:
6806
diff
changeset
|
431 return -1; |
a3126e9099b4
should solve -vo vesa:vidix problem 'vosub_vidix: video server has
arpi
parents:
6806
diff
changeset
|
432 } |
a3126e9099b4
should solve -vo vesa:vidix problem 'vosub_vidix: video server has
arpi
parents:
6806
diff
changeset
|
433 |
4454 | 434 if(((vidix_cap.maxwidth != -1) && (vid_w > vidix_cap.maxwidth)) || |
435 ((vidix_cap.minwidth != -1) && (vid_w < vidix_cap.minwidth)) || | |
436 ((vidix_cap.maxheight != -1) && (vid_h > vidix_cap.maxheight)) || | |
437 ((vidix_cap.minwidth != -1 ) && (vid_h < vidix_cap.minheight))) | |
438 { | |
439 printf("vosub_vidix: video server has unsupported resolution (%dx%d), supported: %dx%d-%dx%d\n", | |
440 vid_w, vid_h, vidix_cap.minwidth, vidix_cap.minheight, | |
441 vidix_cap.maxwidth, vidix_cap.maxheight); | |
442 return -1; | |
443 } | |
444 | |
445 err = 0; | |
446 switch(dest_bpp) | |
447 { | |
448 case 1: err = ((vidix_fourcc.depth & VID_DEPTH_1BPP) != VID_DEPTH_1BPP); break; | |
449 case 2: err = ((vidix_fourcc.depth & VID_DEPTH_2BPP) != VID_DEPTH_2BPP); break; | |
450 case 4: err = ((vidix_fourcc.depth & VID_DEPTH_4BPP) != VID_DEPTH_4BPP); break; | |
451 case 8: err = ((vidix_fourcc.depth & VID_DEPTH_8BPP) != VID_DEPTH_8BPP); break; | |
452 case 12:err = ((vidix_fourcc.depth & VID_DEPTH_12BPP) != VID_DEPTH_12BPP); break; | |
4540 | 453 case 15:err = ((vidix_fourcc.depth & VID_DEPTH_15BPP) != VID_DEPTH_15BPP); break; |
4454 | 454 case 16:err = ((vidix_fourcc.depth & VID_DEPTH_16BPP) != VID_DEPTH_16BPP); break; |
455 case 24:err = ((vidix_fourcc.depth & VID_DEPTH_24BPP) != VID_DEPTH_24BPP); break; | |
456 case 32:err = ((vidix_fourcc.depth & VID_DEPTH_32BPP) != VID_DEPTH_32BPP); break; | |
457 default: err=1; break; | |
458 } | |
459 if(err) | |
460 { | |
461 printf("vosub_vidix: video server has unsupported color depth by vidix (%d)\n" | |
462 ,vidix_fourcc.depth); | |
463 return -1; | |
464 } | |
465 if((dst_width > src_width || dst_height > src_height) && (vidix_cap.flags & FLAG_UPSCALER) != FLAG_UPSCALER) | |
466 { | |
467 printf("vosub_vidix: vidix driver can't upscale image (%d%d -> %d%d)\n", | |
468 src_width, src_height, dst_width, dst_height); | |
469 return -1; | |
470 } | |
471 if((dst_width > src_width || dst_height > src_height) && (vidix_cap.flags & FLAG_DOWNSCALER) != FLAG_DOWNSCALER) | |
472 { | |
473 printf("vosub_vidix: vidix driver can't downscale image (%d%d -> %d%d)\n", | |
474 src_width, src_height, dst_width, dst_height); | |
475 return -1; | |
476 } | |
477 image_width = src_width; | |
478 image_height = src_height; | |
479 src_format = format; | |
5052
6f28d6ccbd91
Using yv12_to_yuy2 sw convertor for cards which have no native yv12 support
nick
parents:
5028
diff
changeset
|
480 if(forced_fourcc) format = forced_fourcc; |
4454 | 481 memset(&vidix_play,0,sizeof(vidix_playback_t)); |
482 vidix_play.fourcc = format; | |
483 vidix_play.capability = vidix_cap.flags; /* every ;) */ | |
484 vidix_play.blend_factor = 0; /* for now */ | |
485 /* display the full picture. | |
486 Nick: we could implement here zooming to a specified area -- alex */ | |
487 vidix_play.src.x = vidix_play.src.y = 0; | |
488 vidix_play.src.w = src_width; | |
489 vidix_play.src.h = src_height; | |
490 vidix_play.dest.x = x_org; | |
491 vidix_play.dest.y = y_org; | |
492 vidix_play.dest.w = dst_width; | |
493 vidix_play.dest.h = dst_height; | |
4929 | 494 vidix_play.num_frames=vo_doublebuffering?NUM_FRAMES-1:1; |
4454 | 495 vidix_play.src.pitch.y = vidix_play.src.pitch.u = vidix_play.src.pitch.v = 0; |
7124
eca7dbad0166
finally removed query_vaa, bes_da and vo_tune_info - the obsoleted libvo api
alex
parents:
7026
diff
changeset
|
496 |
4454 | 497 if((err=vdlConfigPlayback(vidix_handler,&vidix_play))!=0) |
498 { | |
499 printf("vosub_vidix: Can't configure playback: %s\n",strerror(err)); | |
500 return -1; | |
501 } | |
6550
991e03ca5ceb
added OSD support for yvu9/y800, corrected query_format \(added flag VFCAP_OSD\), fixed multifile support \(no more control infinite loop and destroying old window\) and some cosmetics
alex
parents:
6531
diff
changeset
|
502 if (verbose) printf("vosub_vidix: using %d buffer(s)\n", vidix_play.num_frames); |
4454 | 503 |
504 vidix_mem = vidix_play.dga_addr; | |
505 | |
506 /* select first frame */ | |
507 next_frame = 0; | |
508 // vdlPlaybackFrameSelect(vidix_handler,next_frame); | |
509 | |
510 /* clear every frame with correct address and frame_size */ | |
511 for (i = 0; i < vidix_play.num_frames; i++) | |
512 memset(vidix_mem + vidix_play.offsets[i], 0x80, | |
513 vidix_play.frame_size); | |
4999 | 514 switch(format) |
515 { | |
6550
991e03ca5ceb
added OSD support for yvu9/y800, corrected query_format \(added flag VFCAP_OSD\), fixed multifile support \(no more control infinite loop and destroying old window\) and some cosmetics
alex
parents:
6531
diff
changeset
|
516 case IMGFMT_YV12: |
991e03ca5ceb
added OSD support for yvu9/y800, corrected query_format \(added flag VFCAP_OSD\), fixed multifile support \(no more control infinite loop and destroying old window\) and some cosmetics
alex
parents:
6531
diff
changeset
|
517 case IMGFMT_I420: |
991e03ca5ceb
added OSD support for yvu9/y800, corrected query_format \(added flag VFCAP_OSD\), fixed multifile support \(no more control infinite loop and destroying old window\) and some cosmetics
alex
parents:
6531
diff
changeset
|
518 case IMGFMT_IYUV: |
6482
528216496060
YVU9,IF09,Y800 and Y8 support - and syªªnced with mpxp
alex
parents:
6018
diff
changeset
|
519 case IMGFMT_YVU9: |
4999 | 520 case IMGFMT_IF09: |
6550
991e03ca5ceb
added OSD support for yvu9/y800, corrected query_format \(added flag VFCAP_OSD\), fixed multifile support \(no more control infinite loop and destroying old window\) and some cosmetics
alex
parents:
6531
diff
changeset
|
521 case IMGFMT_Y800: |
991e03ca5ceb
added OSD support for yvu9/y800, corrected query_format \(added flag VFCAP_OSD\), fixed multifile support \(no more control infinite loop and destroying old window\) and some cosmetics
alex
parents:
6531
diff
changeset
|
522 case IMGFMT_Y8: |
4999 | 523 apitch = vidix_play.dest.pitch.y-1; |
524 dstrides.y = (image_width + apitch) & ~apitch; | |
525 apitch = vidix_play.dest.pitch.v-1; | |
526 dstrides.v = (image_width + apitch) & ~apitch; | |
527 apitch = vidix_play.dest.pitch.u-1; | |
528 dstrides.u = (image_width + apitch) & ~apitch; | |
529 image_Bpp=1; | |
530 break; | |
531 case IMGFMT_RGB32: | |
532 case IMGFMT_BGR32: | |
533 apitch = vidix_play.dest.pitch.y-1; | |
534 dstrides.y = (image_width*4 + apitch) & ~apitch; | |
535 dstrides.u = dstrides.v = 0; | |
536 image_Bpp=4; | |
537 break; | |
538 case IMGFMT_RGB24: | |
539 case IMGFMT_BGR24: | |
540 apitch = vidix_play.dest.pitch.y-1; | |
541 dstrides.y = (image_width*3 + apitch) & ~apitch; | |
542 dstrides.u = dstrides.v = 0; | |
543 image_Bpp=3; | |
544 break; | |
545 default: | |
546 apitch = vidix_play.dest.pitch.y-1; | |
547 dstrides.y = (image_width*2 + apitch) & ~apitch; | |
548 dstrides.u = dstrides.v = 0; | |
549 image_Bpp=2; | |
550 break; | |
551 } | |
4454 | 552 /* tune some info here */ |
6482
528216496060
YVU9,IF09,Y800 and Y8 support - and syªªnced with mpxp
alex
parents:
6018
diff
changeset
|
553 sstride = src_width*image_Bpp; |
5052
6f28d6ccbd91
Using yv12_to_yuy2 sw convertor for cards which have no native yv12 support
nick
parents:
5028
diff
changeset
|
554 if(!forced_fourcc) |
6f28d6ccbd91
Using yv12_to_yuy2 sw convertor for cards which have no native yv12 support
nick
parents:
5028
diff
changeset
|
555 { |
6f28d6ccbd91
Using yv12_to_yuy2 sw convertor for cards which have no native yv12 support
nick
parents:
5028
diff
changeset
|
556 is_422_planes_eq = sstride == dstrides.y; |
6482
528216496060
YVU9,IF09,Y800 and Y8 support - and syªªnced with mpxp
alex
parents:
6018
diff
changeset
|
557 |
5052
6f28d6ccbd91
Using yv12_to_yuy2 sw convertor for cards which have no native yv12 support
nick
parents:
5028
diff
changeset
|
558 if(src_format == IMGFMT_YV12 || src_format == IMGFMT_I420 || src_format == IMGFMT_IYUV) |
6f28d6ccbd91
Using yv12_to_yuy2 sw convertor for cards which have no native yv12 support
nick
parents:
5028
diff
changeset
|
559 vo_server->draw_slice = vidix_draw_slice_420; |
6482
528216496060
YVU9,IF09,Y800 and Y8 support - and syªªnced with mpxp
alex
parents:
6018
diff
changeset
|
560 else if (src_format == IMGFMT_YVU9 || src_format == IMGFMT_IF09) |
528216496060
YVU9,IF09,Y800 and Y8 support - and syªªnced with mpxp
alex
parents:
6018
diff
changeset
|
561 vo_server->draw_slice = vidix_draw_slice_410; |
7685 | 562 else vo_server->draw_slice = vidix_draw_slice_packed; |
5052
6f28d6ccbd91
Using yv12_to_yuy2 sw convertor for cards which have no native yv12 support
nick
parents:
5028
diff
changeset
|
563 } |
4454 | 564 return 0; |
565 } | |
566 | |
4991 | 567 static uint32_t vidix_get_image(mp_image_t *mpi) |
568 { | |
569 if(mpi->type==MP_IMGTYPE_STATIC && vidix_play.num_frames>1) return VO_FALSE; | |
570 if(mpi->flags&MP_IMGFLAG_READABLE) return VO_FALSE; /* slow video ram */ | |
7685 | 571 if(( (mpi->stride[0]==dstrides.y && (!(mpi->flags&MP_IMGFLAG_PLANAR) || |
572 (mpi->stride[1]==dstrides.u && mpi->stride[2]==dstrides.v)) ) | |
573 || (mpi->flags&(MP_IMGFLAG_ACCEPT_STRIDE|MP_IMGFLAG_ACCEPT_WIDTH))) && | |
6550
991e03ca5ceb
added OSD support for yvu9/y800, corrected query_format \(added flag VFCAP_OSD\), fixed multifile support \(no more control infinite loop and destroying old window\) and some cosmetics
alex
parents:
6531
diff
changeset
|
574 (!forced_fourcc && !(vidix_play.flags & VID_PLAY_INTERLEAVED_UV))) |
4991 | 575 { |
5373 | 576 if(mpi->flags&MP_IMGFLAG_ACCEPT_WIDTH){ |
577 // check if only width is enough to represent strides: | |
578 if(mpi->flags&MP_IMGFLAG_PLANAR){ | |
579 if((dstrides.y>>1)!=dstrides.v || dstrides.v!=dstrides.u) return VO_FALSE; | |
580 } else { | |
581 if(dstrides.y % (mpi->bpp/8)) return VO_FALSE; | |
582 } | |
583 } | |
5028 | 584 mpi->planes[0]=vidix_mem+vidix_play.offsets[next_frame]+vidix_play.offset.y; |
5373 | 585 mpi->width=mpi->stride[0]=dstrides.y; |
5028 | 586 if(mpi->flags&MP_IMGFLAG_PLANAR) |
587 { | |
588 mpi->planes[2]=vidix_mem+vidix_play.offsets[next_frame]+vidix_play.offset.v; | |
589 mpi->stride[2]=dstrides.v; | |
590 mpi->planes[1]=vidix_mem+vidix_play.offsets[next_frame]+vidix_play.offset.u; | |
591 mpi->stride[1]=dstrides.u; | |
5373 | 592 } else |
593 mpi->width/=mpi->bpp/8; | |
5028 | 594 mpi->flags|=MP_IMGFLAG_DIRECT; |
5373 | 595 return VO_TRUE; |
4991 | 596 } |
5373 | 597 return VO_FALSE; |
4991 | 598 } |
599 | |
4592
5fbfd8545c3b
query_ stuff replaced by new control() - patch by David Holm
arpi
parents:
4540
diff
changeset
|
600 uint32_t vidix_control(uint32_t request, void *data, ...) |
5fbfd8545c3b
query_ stuff replaced by new control() - patch by David Holm
arpi
parents:
4540
diff
changeset
|
601 { |
5fbfd8545c3b
query_ stuff replaced by new control() - patch by David Holm
arpi
parents:
4540
diff
changeset
|
602 switch (request) { |
5fbfd8545c3b
query_ stuff replaced by new control() - patch by David Holm
arpi
parents:
4540
diff
changeset
|
603 case VOCTRL_QUERY_FORMAT: |
5fbfd8545c3b
query_ stuff replaced by new control() - patch by David Holm
arpi
parents:
4540
diff
changeset
|
604 return vidix_query_fourcc(*((uint32_t*)data)); |
4991 | 605 case VOCTRL_GET_IMAGE: |
606 return vidix_get_image(data); | |
7685 | 607 case VOCTRL_DRAW_IMAGE: |
608 return vidix_draw_image(data); | |
5002 | 609 case VOCTRL_GET_FRAME_NUM: |
610 *(uint32_t *)data = next_frame; | |
611 return VO_TRUE; | |
612 case VOCTRL_SET_FRAME_NUM: | |
613 next_frame = *(uint32_t *)data; | |
614 return VO_TRUE; | |
615 case VOCTRL_GET_NUM_FRAMES: | |
616 *(uint32_t *)data = vidix_play.num_frames; | |
617 return VO_TRUE; | |
6786 | 618 case VOCTRL_SET_EQUALIZER: |
619 { | |
620 va_list ap; | |
621 int value; | |
622 vidix_video_eq_t info; | |
623 | |
624 if(!video_on) return VO_FALSE; | |
625 va_start(ap, data); | |
626 value = va_arg(ap, int); | |
627 va_end(ap); | |
628 | |
6806 | 629 // printf("vidix seteq %s -> %d \n",data,value); |
630 | |
6786 | 631 /* vidix eq ranges are -1000..1000 */ |
632 if (!strcasecmp(data, "brightness")) | |
633 { | |
634 info.brightness = value*10; | |
6806 | 635 info.cap = VEQ_CAP_BRIGHTNESS; |
6786 | 636 } |
637 else if (!strcasecmp(data, "contrast")) | |
638 { | |
639 info.contrast = value*10; | |
6806 | 640 info.cap = VEQ_CAP_CONTRAST; |
6786 | 641 } |
642 else if (!strcasecmp(data, "saturation")) | |
643 { | |
644 info.saturation = value*10; | |
6806 | 645 info.cap = VEQ_CAP_SATURATION; |
6786 | 646 } |
647 else if (!strcasecmp(data, "hue")) | |
648 { | |
649 info.hue = value*10; | |
6806 | 650 info.cap = VEQ_CAP_HUE; |
6786 | 651 } |
652 | |
653 if (vdlPlaybackSetEq(vidix_handler, &info) == 0) | |
654 return VO_TRUE; | |
655 return VO_FALSE; | |
656 } | |
657 case VOCTRL_GET_EQUALIZER: | |
658 { | |
659 va_list ap; | |
660 int *value; | |
661 vidix_video_eq_t info; | |
662 | |
663 if(!video_on) return VO_FALSE; | |
6806 | 664 if (vdlPlaybackGetEq(vidix_handler, &info) != 0) |
6786 | 665 return VO_FALSE; |
666 | |
667 va_start(ap, data); | |
6806 | 668 value = va_arg(ap, int*); |
6786 | 669 va_end(ap); |
670 | |
671 /* vidix eq ranges are -1000..1000 */ | |
672 if (!strcasecmp(data, "brightness")) | |
673 { | |
674 if (info.cap & VEQ_CAP_BRIGHTNESS) | |
675 *value = info.brightness/10; | |
676 } | |
677 else if (!strcasecmp(data, "contrast")) | |
678 { | |
679 if (info.cap & VEQ_CAP_CONTRAST) | |
680 *value = info.contrast/10; | |
681 } | |
682 else if (!strcasecmp(data, "saturation")) | |
683 { | |
684 if (info.cap & VEQ_CAP_SATURATION) | |
685 *value = info.saturation/10; | |
686 } | |
687 else if (!strcasecmp(data, "hue")) | |
688 { | |
689 if (info.cap & VEQ_CAP_HUE) | |
690 *value = info.hue/10; | |
691 } | |
692 | |
693 return VO_TRUE; | |
694 } | |
4592
5fbfd8545c3b
query_ stuff replaced by new control() - patch by David Holm
arpi
parents:
4540
diff
changeset
|
695 } |
6531 | 696 return VO_NOTIMPL; |
5319 | 697 // WARNING: we drop extra parameters (...) here! |
6531 | 698 // return server_control(request,data); //VO_NOTIMPL; |
4592
5fbfd8545c3b
query_ stuff replaced by new control() - patch by David Holm
arpi
parents:
4540
diff
changeset
|
699 } |
5fbfd8545c3b
query_ stuff replaced by new control() - patch by David Holm
arpi
parents:
4540
diff
changeset
|
700 |
4454 | 701 int vidix_preinit(const char *drvname,void *server) |
702 { | |
703 int err; | |
704 if(verbose > 1) printf("vosub_vidix: vidix_preinit(%s) was called\n",drvname); | |
705 if(vdlGetVersion() != VIDIX_VERSION) | |
706 { | |
707 printf("vosub_vidix: You have wrong version of VIDIX library\n"); | |
708 return -1; | |
709 } | |
5814 | 710 vidix_handler = vdlOpen(LIBDIR"/mplayer/vidix/", |
4454 | 711 drvname ? drvname[0] == ':' ? &drvname[1] : drvname[0] ? drvname : NULL : NULL, |
712 TYPE_OUTPUT, | |
713 verbose); | |
714 if(vidix_handler == NULL) | |
715 { | |
716 printf("vosub_vidix: Couldn't find working VIDIX driver\n"); | |
717 return -1; | |
718 } | |
719 if((err=vdlGetCapability(vidix_handler,&vidix_cap)) != 0) | |
720 { | |
721 printf("vosub_vidix: Couldn't get capability: %s\n",strerror(err)); | |
722 return -1; | |
723 } | |
6786 | 724 printf("VIDIX: Description: %s\n", vidix_cap.name); |
725 printf("VIDIX: Author: %s\n", vidix_cap.author); | |
4454 | 726 /* we are able to tune up this stuff depend on fourcc format */ |
727 ((vo_functions_t *)server)->draw_slice=vidix_draw_slice; | |
728 ((vo_functions_t *)server)->draw_frame=vidix_draw_frame; | |
729 ((vo_functions_t *)server)->flip_page=vidix_flip_page; | |
730 ((vo_functions_t *)server)->draw_osd=vidix_draw_osd; | |
6550
991e03ca5ceb
added OSD support for yvu9/y800, corrected query_format \(added flag VFCAP_OSD\), fixed multifile support \(no more control infinite loop and destroying old window\) and some cosmetics
alex
parents:
6531
diff
changeset
|
731 // server_control = ((vo_functions_t *)server)->control; |
991e03ca5ceb
added OSD support for yvu9/y800, corrected query_format \(added flag VFCAP_OSD\), fixed multifile support \(no more control infinite loop and destroying old window\) and some cosmetics
alex
parents:
6531
diff
changeset
|
732 // ((vo_functions_t *)server)->control=vidix_control; |
4454 | 733 vo_server = server; |
734 return 0; | |
735 } |