annotate libvo/vosub_vidix.c @ 5206:2ca5a9bfaa98

allow sh_audio struct to be initialized by demuxer, add parsing of mp4 esds header to mov demuxer, init faad from info from mov header
author atmos4
date Tue, 19 Mar 2002 21:48:55 +0000
parents 6f28d6ccbd91
children 83e6e16e9670
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4010
938d37ad4f85 preliminary version
nick
parents:
diff changeset
1 /*
938d37ad4f85 preliminary version
nick
parents:
diff changeset
2 * vosub_vidix.c
938d37ad4f85 preliminary version
nick
parents:
diff changeset
3 *
938d37ad4f85 preliminary version
nick
parents:
diff changeset
4 * Copyright (C) Nick Kurshev <nickols_k@mail.ru> - 2002
4280
a5f11106ef5e added support for unlimited video resolution (-1)
alex
parents: 4270
diff changeset
5 * Copyright (C) Alex Beregszaszi
4010
938d37ad4f85 preliminary version
nick
parents:
diff changeset
6 *
938d37ad4f85 preliminary version
nick
parents:
diff changeset
7 * You can redistribute this file under terms and conditions
938d37ad4f85 preliminary version
nick
parents:
diff changeset
8 * of GNU General Public licence v2.
938d37ad4f85 preliminary version
nick
parents:
diff changeset
9 *
938d37ad4f85 preliminary version
nick
parents:
diff changeset
10 * This file contains vidix interface to any mplayer's VO plugin.
938d37ad4f85 preliminary version
nick
parents:
diff changeset
11 * (Partly based on vesa_lvo.c from mplayer's package)
938d37ad4f85 preliminary version
nick
parents:
diff changeset
12 */
938d37ad4f85 preliminary version
nick
parents:
diff changeset
13
938d37ad4f85 preliminary version
nick
parents:
diff changeset
14 #include <inttypes.h>
938d37ad4f85 preliminary version
nick
parents:
diff changeset
15 #include <sys/ioctl.h>
938d37ad4f85 preliminary version
nick
parents:
diff changeset
16 #include <unistd.h>
938d37ad4f85 preliminary version
nick
parents:
diff changeset
17 #include <fcntl.h>
938d37ad4f85 preliminary version
nick
parents:
diff changeset
18 #include <sys/mman.h>
938d37ad4f85 preliminary version
nick
parents:
diff changeset
19 #include <stdio.h>
938d37ad4f85 preliminary version
nick
parents:
diff changeset
20 #include <stdlib.h>
938d37ad4f85 preliminary version
nick
parents:
diff changeset
21 #include <string.h>
4372
9b6430df4de5 improvements
nick
parents: 4362
diff changeset
22 #include <errno.h>
4010
938d37ad4f85 preliminary version
nick
parents:
diff changeset
23
938d37ad4f85 preliminary version
nick
parents:
diff changeset
24 #include "config.h"
938d37ad4f85 preliminary version
nick
parents:
diff changeset
25
938d37ad4f85 preliminary version
nick
parents:
diff changeset
26 #include "vosub_vidix.h"
938d37ad4f85 preliminary version
nick
parents:
diff changeset
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
938d37ad4f85 preliminary version
nick
parents:
diff changeset
29 #include "fastmemcpy.h"
938d37ad4f85 preliminary version
nick
parents:
diff changeset
30 #include "osd.h"
938d37ad4f85 preliminary version
nick
parents:
diff changeset
31 #include "video_out.h"
4991
ad943b99610a VOCTRL_GET_IMAGE (untested but should work)
nick
parents: 4929
diff changeset
32 #include "../mp_image.h"
ad943b99610a VOCTRL_GET_IMAGE (untested but should work)
nick
parents: 4929
diff changeset
33
4010
938d37ad4f85 preliminary version
nick
parents:
diff changeset
34
4929
939eacee89ab Use as much buffers as possible
nick
parents: 4895
diff changeset
35 #define NUM_FRAMES VID_PLAY_MAXFRAMES /* Temporary: driver will overwrite it */
4010
938d37ad4f85 preliminary version
nick
parents:
diff changeset
36 #define UNUSED(x) ((void)(x)) /* Removes warning about unused arguments */
938d37ad4f85 preliminary version
nick
parents:
diff changeset
37
938d37ad4f85 preliminary version
nick
parents:
diff changeset
38 static VDL_HANDLE vidix_handler = NULL;
938d37ad4f85 preliminary version
nick
parents:
diff changeset
39 static uint8_t *vidix_mem = NULL;
938d37ad4f85 preliminary version
nick
parents:
diff changeset
40 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
41 static unsigned image_Bpp,image_height,image_width,src_format,forced_fourcc=0;
4010
938d37ad4f85 preliminary version
nick
parents:
diff changeset
42 extern int verbose;
4372
9b6430df4de5 improvements
nick
parents: 4362
diff changeset
43 static int video_on=0;
4010
938d37ad4f85 preliminary version
nick
parents:
diff changeset
44
938d37ad4f85 preliminary version
nick
parents:
diff changeset
45 static vidix_capability_t vidix_cap;
938d37ad4f85 preliminary version
nick
parents:
diff changeset
46 static vidix_playback_t vidix_play;
938d37ad4f85 preliminary version
nick
parents:
diff changeset
47 static vidix_fourcc_t vidix_fourcc;
4454
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
48 static vo_functions_t * vo_server;
4999
7f1fa1db24b4 Optimization and get_image fixes (still untested)
nick
parents: 4991
diff changeset
49 static vidix_yuv_t dstrides;
4739
a2df307ed979 Screenshot on the fly
nick
parents: 4654
diff changeset
50 static uint32_t (*server_control)(uint32_t request, void *data, ...);
a2df307ed979 Screenshot on the fly
nick
parents: 4654
diff changeset
51
4372
9b6430df4de5 improvements
nick
parents: 4362
diff changeset
52 static int vidix_get_bes_da(bes_da_t *);
4379
7a4837091398 provide full vaa interface
nick
parents: 4372
diff changeset
53 static int vidix_get_video_eq(vidix_video_eq_t *info);
7a4837091398 provide full vaa interface
nick
parents: 4372
diff changeset
54 static int vidix_set_video_eq(const vidix_video_eq_t *info);
7a4837091398 provide full vaa interface
nick
parents: 4372
diff changeset
55 static int vidix_get_num_fx(unsigned *info);
7a4837091398 provide full vaa interface
nick
parents: 4372
diff changeset
56 static int vidix_get_oem_fx(vidix_oem_fx_t *info);
7a4837091398 provide full vaa interface
nick
parents: 4372
diff changeset
57 static int vidix_set_oem_fx(const vidix_oem_fx_t *info);
7a4837091398 provide full vaa interface
nick
parents: 4372
diff changeset
58 static int vidix_set_deint(const vidix_deinterlace_t *info);
4372
9b6430df4de5 improvements
nick
parents: 4362
diff changeset
59
9b6430df4de5 improvements
nick
parents: 4362
diff changeset
60 static void vidix_query_vaa(vo_vaa_t *vaa)
9b6430df4de5 improvements
nick
parents: 4362
diff changeset
61 {
9b6430df4de5 improvements
nick
parents: 4362
diff changeset
62 memset(vaa,0,sizeof(vo_vaa_t));
9b6430df4de5 improvements
nick
parents: 4362
diff changeset
63 vaa->query_bes_da=vidix_get_bes_da;
4379
7a4837091398 provide full vaa interface
nick
parents: 4372
diff changeset
64 vaa->get_video_eq=vidix_get_video_eq;
7a4837091398 provide full vaa interface
nick
parents: 4372
diff changeset
65 vaa->set_video_eq=vidix_set_video_eq;
7a4837091398 provide full vaa interface
nick
parents: 4372
diff changeset
66 vaa->get_num_fx=vidix_get_num_fx;
7a4837091398 provide full vaa interface
nick
parents: 4372
diff changeset
67 vaa->get_oem_fx=vidix_get_oem_fx;
7a4837091398 provide full vaa interface
nick
parents: 4372
diff changeset
68 vaa->set_oem_fx=vidix_set_oem_fx;
7a4837091398 provide full vaa interface
nick
parents: 4372
diff changeset
69 vaa->set_deint=vidix_set_deint;
4372
9b6430df4de5 improvements
nick
parents: 4362
diff changeset
70 }
9b6430df4de5 improvements
nick
parents: 4362
diff changeset
71
4229
9a33ad2f3547 gamma correction support
nick
parents: 4198
diff changeset
72 extern int vo_gamma_brightness;
9a33ad2f3547 gamma correction support
nick
parents: 4198
diff changeset
73 extern int vo_gamma_saturation;
9a33ad2f3547 gamma correction support
nick
parents: 4198
diff changeset
74 extern int vo_gamma_contrast;
9a33ad2f3547 gamma correction support
nick
parents: 4198
diff changeset
75 extern int vo_gamma_hue;
4317
0cf9e05f6de2 intense -> intensity
nick
parents: 4280
diff changeset
76 extern int vo_gamma_red_intensity;
0cf9e05f6de2 intense -> intensity
nick
parents: 4280
diff changeset
77 extern int vo_gamma_green_intensity;
0cf9e05f6de2 intense -> intensity
nick
parents: 4280
diff changeset
78 extern int vo_gamma_blue_intensity;
4229
9a33ad2f3547 gamma correction support
nick
parents: 4198
diff changeset
79
4240
a7d6ea555c2e added colorkey handling
alex
parents: 4234
diff changeset
80 static vidix_video_eq_t vid_eq;
4229
9a33ad2f3547 gamma correction support
nick
parents: 4198
diff changeset
81
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 int vidix_start(void)
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 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
85 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
86 {
178c84b1090e clearing safely the buffer, queryfourcc returns 0x2 (hw accel, noconv.), setting eq only if drivers i able
alex
parents: 4255
diff changeset
87 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
88 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
89 }
4379
7a4837091398 provide full vaa interface
nick
parents: 4372
diff changeset
90 video_on=1;
4270
178c84b1090e clearing safely the buffer, queryfourcc returns 0x2 (hw accel, noconv.), setting eq only if drivers i able
alex
parents: 4255
diff changeset
91 if (vidix_cap.flags & FLAG_EQUALIZER)
4229
9a33ad2f3547 gamma correction support
nick
parents: 4198
diff changeset
92 {
4270
178c84b1090e clearing safely the buffer, queryfourcc returns 0x2 (hw accel, noconv.), setting eq only if drivers i able
alex
parents: 4255
diff changeset
93 if(verbose > 1)
178c84b1090e clearing safely the buffer, queryfourcc returns 0x2 (hw accel, noconv.), setting eq only if drivers i able
alex
parents: 4255
diff changeset
94 {
178c84b1090e clearing safely the buffer, queryfourcc returns 0x2 (hw accel, noconv.), setting eq only if drivers i able
alex
parents: 4255
diff changeset
95 printf("vosub_vidix: vo_gamma_brightness=%i\n"
4229
9a33ad2f3547 gamma correction support
nick
parents: 4198
diff changeset
96 "vosub_vidix: vo_gamma_saturation=%i\n"
9a33ad2f3547 gamma correction support
nick
parents: 4198
diff changeset
97 "vosub_vidix: vo_gamma_contrast=%i\n"
9a33ad2f3547 gamma correction support
nick
parents: 4198
diff changeset
98 "vosub_vidix: vo_gamma_hue=%i\n"
4317
0cf9e05f6de2 intense -> intensity
nick
parents: 4280
diff changeset
99 "vosub_vidix: vo_gamma_red_intensity=%i\n"
0cf9e05f6de2 intense -> intensity
nick
parents: 4280
diff changeset
100 "vosub_vidix: vo_gamma_green_intensity=%i\n"
0cf9e05f6de2 intense -> intensity
nick
parents: 4280
diff changeset
101 "vosub_vidix: vo_gamma_blue_intensity=%i\n"
4229
9a33ad2f3547 gamma correction support
nick
parents: 4198
diff changeset
102 ,vo_gamma_brightness
9a33ad2f3547 gamma correction support
nick
parents: 4198
diff changeset
103 ,vo_gamma_saturation
9a33ad2f3547 gamma correction support
nick
parents: 4198
diff changeset
104 ,vo_gamma_contrast
9a33ad2f3547 gamma correction support
nick
parents: 4198
diff changeset
105 ,vo_gamma_hue
4317
0cf9e05f6de2 intense -> intensity
nick
parents: 4280
diff changeset
106 ,vo_gamma_red_intensity
0cf9e05f6de2 intense -> intensity
nick
parents: 4280
diff changeset
107 ,vo_gamma_green_intensity
0cf9e05f6de2 intense -> intensity
nick
parents: 4280
diff changeset
108 ,vo_gamma_blue_intensity);
4270
178c84b1090e clearing safely the buffer, queryfourcc returns 0x2 (hw accel, noconv.), setting eq only if drivers i able
alex
parents: 4255
diff changeset
109 }
4317
0cf9e05f6de2 intense -> intensity
nick
parents: 4280
diff changeset
110 /* To use full set of vid_eq.cap */
4379
7a4837091398 provide full vaa interface
nick
parents: 4372
diff changeset
111 if(vidix_get_video_eq(&vid_eq) == 0)
4317
0cf9e05f6de2 intense -> intensity
nick
parents: 4280
diff changeset
112 {
0cf9e05f6de2 intense -> intensity
nick
parents: 4280
diff changeset
113 vid_eq.brightness = vo_gamma_brightness;
0cf9e05f6de2 intense -> intensity
nick
parents: 4280
diff changeset
114 vid_eq.saturation = vo_gamma_saturation;
0cf9e05f6de2 intense -> intensity
nick
parents: 4280
diff changeset
115 vid_eq.contrast = vo_gamma_contrast;
0cf9e05f6de2 intense -> intensity
nick
parents: 4280
diff changeset
116 vid_eq.hue = vo_gamma_hue;
0cf9e05f6de2 intense -> intensity
nick
parents: 4280
diff changeset
117 vid_eq.red_intensity = vo_gamma_red_intensity;
0cf9e05f6de2 intense -> intensity
nick
parents: 4280
diff changeset
118 vid_eq.green_intensity = vo_gamma_green_intensity;
0cf9e05f6de2 intense -> intensity
nick
parents: 4280
diff changeset
119 vid_eq.blue_intensity = vo_gamma_blue_intensity;
0cf9e05f6de2 intense -> intensity
nick
parents: 4280
diff changeset
120 vid_eq.flags = VEQ_FLG_ITU_R_BT_601;
4379
7a4837091398 provide full vaa interface
nick
parents: 4372
diff changeset
121 vidix_set_video_eq(&vid_eq);
4317
0cf9e05f6de2 intense -> intensity
nick
parents: 4280
diff changeset
122 }
4198
7e2bf04c9a7c added vidix_start() and vidix_stop() for better runtime-resize support ;)
alex
parents: 4138
diff changeset
123 }
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
124 return 0;
4198
7e2bf04c9a7c added vidix_start() and vidix_stop() for better runtime-resize support ;)
alex
parents: 4138
diff changeset
125 }
7e2bf04c9a7c added vidix_start() and vidix_stop() for better runtime-resize support ;)
alex
parents: 4138
diff changeset
126
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
127 int vidix_stop(void)
4198
7e2bf04c9a7c added vidix_start() and vidix_stop() for better runtime-resize support ;)
alex
parents: 4138
diff changeset
128 {
7e2bf04c9a7c added vidix_start() and vidix_stop() for better runtime-resize support ;)
alex
parents: 4138
diff changeset
129 int err;
7e2bf04c9a7c added vidix_start() and vidix_stop() for better runtime-resize support ;)
alex
parents: 4138
diff changeset
130 if((err=vdlPlaybackOff(vidix_handler))!=0)
7e2bf04c9a7c added vidix_start() and vidix_stop() for better runtime-resize support ;)
alex
parents: 4138
diff changeset
131 {
7e2bf04c9a7c added vidix_start() and vidix_stop() for better runtime-resize support ;)
alex
parents: 4138
diff changeset
132 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
133 return -1;
4198
7e2bf04c9a7c added vidix_start() and vidix_stop() for better runtime-resize support ;)
alex
parents: 4138
diff changeset
134 }
4372
9b6430df4de5 improvements
nick
parents: 4362
diff changeset
135 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
136 return 0;
4198
7e2bf04c9a7c added vidix_start() and vidix_stop() for better runtime-resize support ;)
alex
parents: 4138
diff changeset
137 }
7e2bf04c9a7c added vidix_start() and vidix_stop() for better runtime-resize support ;)
alex
parents: 4138
diff changeset
138
4010
938d37ad4f85 preliminary version
nick
parents:
diff changeset
139 void vidix_term( void )
938d37ad4f85 preliminary version
nick
parents:
diff changeset
140 {
938d37ad4f85 preliminary version
nick
parents:
diff changeset
141 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
142 vidix_stop();
4010
938d37ad4f85 preliminary version
nick
parents:
diff changeset
143 vdlClose(vidix_handler);
938d37ad4f85 preliminary version
nick
parents:
diff changeset
144 }
938d37ad4f85 preliminary version
nick
parents:
diff changeset
145
5052
6f28d6ccbd91 Using yv12_to_yuy2 sw convertor for cards which have no native yv12 support
nick
parents: 5028
diff changeset
146 static uint32_t vidix_draw_slice_swYV12(uint8_t *image[], int stride[], int w,int h,int x,int y)
6f28d6ccbd91 Using yv12_to_yuy2 sw convertor for cards which have no native yv12 support
nick
parents: 5028
diff changeset
147 {
6f28d6ccbd91 Using yv12_to_yuy2 sw convertor for cards which have no native yv12 support
nick
parents: 5028
diff changeset
148 uint8_t *dest;
6f28d6ccbd91 Using yv12_to_yuy2 sw convertor for cards which have no native yv12 support
nick
parents: 5028
diff changeset
149 dest = vidix_mem + vidix_play.offsets[next_frame] + vidix_play.offset.y;
6f28d6ccbd91 Using yv12_to_yuy2 sw convertor for cards which have no native yv12 support
nick
parents: 5028
diff changeset
150 dest += dstrides.y*y + x;
6f28d6ccbd91 Using yv12_to_yuy2 sw convertor for cards which have no native yv12 support
nick
parents: 5028
diff changeset
151 yv12toyuy2(image[0], image[1], image[2], dest, w, h, stride[0], stride[1],dstrides.y);
6f28d6ccbd91 Using yv12_to_yuy2 sw convertor for cards which have no native yv12 support
nick
parents: 5028
diff changeset
152 return 0;
6f28d6ccbd91 Using yv12_to_yuy2 sw convertor for cards which have no native yv12 support
nick
parents: 5028
diff changeset
153 }
6f28d6ccbd91 Using yv12_to_yuy2 sw convertor for cards which have no native yv12 support
nick
parents: 5028
diff changeset
154
4430
b4cc68c448db IMGFMT_RGBxx experimental support
nick
parents: 4379
diff changeset
155 static uint32_t vidix_draw_slice_420(uint8_t *image[], int stride[], int w,int h,int x,int y)
4010
938d37ad4f85 preliminary version
nick
parents:
diff changeset
156 {
938d37ad4f85 preliminary version
nick
parents:
diff changeset
157 uint8_t *src;
938d37ad4f85 preliminary version
nick
parents:
diff changeset
158 uint8_t *dest;
938d37ad4f85 preliminary version
nick
parents:
diff changeset
159 int i;
4324
09f15844c960 don't render UV planes if interleaved (also add support later)
alex
parents: 4317
diff changeset
160
09f15844c960 don't render UV planes if interleaved (also add support later)
alex
parents: 4317
diff changeset
161 /* Plane Y */
4032
076c6c29e693 OSD support
nick
parents: 4031
diff changeset
162 dest = vidix_mem + vidix_play.offsets[next_frame] + vidix_play.offset.y;
4999
7f1fa1db24b4 Optimization and get_image fixes (still untested)
nick
parents: 4991
diff changeset
163 dest += dstrides.y*y + x;
4010
938d37ad4f85 preliminary version
nick
parents:
diff changeset
164 src = image[0];
938d37ad4f85 preliminary version
nick
parents:
diff changeset
165 for(i=0;i<h;i++){
938d37ad4f85 preliminary version
nick
parents:
diff changeset
166 memcpy(dest,src,w);
938d37ad4f85 preliminary version
nick
parents:
diff changeset
167 src+=stride[0];
4999
7f1fa1db24b4 Optimization and get_image fixes (still untested)
nick
parents: 4991
diff changeset
168 dest += dstrides.y;
4010
938d37ad4f85 preliminary version
nick
parents:
diff changeset
169 }
938d37ad4f85 preliminary version
nick
parents:
diff changeset
170
4324
09f15844c960 don't render UV planes if interleaved (also add support later)
alex
parents: 4317
diff changeset
171 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
172 {
4744
da595f0e882e vidix interleaved U V planes (for g200) by Attila Kinali <kinali@gmx.net>
nick
parents: 4741
diff changeset
173 int hi,wi;
da595f0e882e vidix interleaved U V planes (for g200) by Attila Kinali <kinali@gmx.net>
nick
parents: 4741
diff changeset
174 uint8_t *src2;
da595f0e882e vidix interleaved U V planes (for g200) by Attila Kinali <kinali@gmx.net>
nick
parents: 4741
diff changeset
175 dest = vidix_mem + vidix_play.offsets[next_frame] + vidix_play.offset.v;
4999
7f1fa1db24b4 Optimization and get_image fixes (still untested)
nick
parents: 4991
diff changeset
176 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
177 h/=2;
da595f0e882e vidix interleaved U V planes (for g200) by Attila Kinali <kinali@gmx.net>
nick
parents: 4741
diff changeset
178 w/=2;
da595f0e882e vidix interleaved U V planes (for g200) by Attila Kinali <kinali@gmx.net>
nick
parents: 4741
diff changeset
179 src = image[1];
da595f0e882e vidix interleaved U V planes (for g200) by Attila Kinali <kinali@gmx.net>
nick
parents: 4741
diff changeset
180 src2 = image[2];
da595f0e882e vidix interleaved U V planes (for g200) by Attila Kinali <kinali@gmx.net>
nick
parents: 4741
diff changeset
181 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
182 {
da595f0e882e vidix interleaved U V planes (for g200) by Attila Kinali <kinali@gmx.net>
nick
parents: 4741
diff changeset
183 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
184 {
da595f0e882e vidix interleaved U V planes (for g200) by Attila Kinali <kinali@gmx.net>
nick
parents: 4741
diff changeset
185 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
186 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
187 }
4999
7f1fa1db24b4 Optimization and get_image fixes (still untested)
nick
parents: 4991
diff changeset
188 dest += dstrides.y;
4744
da595f0e882e vidix interleaved U V planes (for g200) by Attila Kinali <kinali@gmx.net>
nick
parents: 4741
diff changeset
189 src += stride[1];
4999
7f1fa1db24b4 Optimization and get_image fixes (still untested)
nick
parents: 4991
diff changeset
190 src2+= stride[2];
7f1fa1db24b4 Optimization and get_image fixes (still untested)
nick
parents: 4991
diff changeset
191 }
7f1fa1db24b4 Optimization and get_image fixes (still untested)
nick
parents: 4991
diff changeset
192 }
7f1fa1db24b4 Optimization and get_image fixes (still untested)
nick
parents: 4991
diff changeset
193 else
7f1fa1db24b4 Optimization and get_image fixes (still untested)
nick
parents: 4991
diff changeset
194 {
4744
da595f0e882e vidix interleaved U V planes (for g200) by Attila Kinali <kinali@gmx.net>
nick
parents: 4741
diff changeset
195 /* Plane V */
da595f0e882e vidix interleaved U V planes (for g200) by Attila Kinali <kinali@gmx.net>
nick
parents: 4741
diff changeset
196 dest = vidix_mem + vidix_play.offsets[next_frame] + vidix_play.offset.v;
4999
7f1fa1db24b4 Optimization and get_image fixes (still untested)
nick
parents: 4991
diff changeset
197 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
198 src = image[1];
da595f0e882e vidix interleaved U V planes (for g200) by Attila Kinali <kinali@gmx.net>
nick
parents: 4741
diff changeset
199 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
200 memcpy(dest,src,w/2);
da595f0e882e vidix interleaved U V planes (for g200) by Attila Kinali <kinali@gmx.net>
nick
parents: 4741
diff changeset
201 src+=stride[1];
4999
7f1fa1db24b4 Optimization and get_image fixes (still untested)
nick
parents: 4991
diff changeset
202 dest+=dstrides.v/2;
4744
da595f0e882e vidix interleaved U V planes (for g200) by Attila Kinali <kinali@gmx.net>
nick
parents: 4741
diff changeset
203 }
4324
09f15844c960 don't render UV planes if interleaved (also add support later)
alex
parents: 4317
diff changeset
204
4744
da595f0e882e vidix interleaved U V planes (for g200) by Attila Kinali <kinali@gmx.net>
nick
parents: 4741
diff changeset
205 /* Plane U */
da595f0e882e vidix interleaved U V planes (for g200) by Attila Kinali <kinali@gmx.net>
nick
parents: 4741
diff changeset
206 dest = vidix_mem + vidix_play.offsets[next_frame] + vidix_play.offset.u;
4999
7f1fa1db24b4 Optimization and get_image fixes (still untested)
nick
parents: 4991
diff changeset
207 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
208 src = image[2];
da595f0e882e vidix interleaved U V planes (for g200) by Attila Kinali <kinali@gmx.net>
nick
parents: 4741
diff changeset
209 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
210 memcpy(dest,src,w/2);
da595f0e882e vidix interleaved U V planes (for g200) by Attila Kinali <kinali@gmx.net>
nick
parents: 4741
diff changeset
211 src+=stride[2];
4999
7f1fa1db24b4 Optimization and get_image fixes (still untested)
nick
parents: 4991
diff changeset
212 dest += dstrides.u/2;
4744
da595f0e882e vidix interleaved U V planes (for g200) by Attila Kinali <kinali@gmx.net>
nick
parents: 4741
diff changeset
213 }
da595f0e882e vidix interleaved U V planes (for g200) by Attila Kinali <kinali@gmx.net>
nick
parents: 4741
diff changeset
214 return 0;
4999
7f1fa1db24b4 Optimization and get_image fixes (still untested)
nick
parents: 4991
diff changeset
215 }
4010
938d37ad4f85 preliminary version
nick
parents:
diff changeset
216 }
938d37ad4f85 preliminary version
nick
parents:
diff changeset
217
4999
7f1fa1db24b4 Optimization and get_image fixes (still untested)
nick
parents: 4991
diff changeset
218 static uint32_t vidix_draw_slice_packed(uint8_t *image[], int stride[], int w,int h,int x,int y)
4010
938d37ad4f85 preliminary version
nick
parents:
diff changeset
219 {
938d37ad4f85 preliminary version
nick
parents:
diff changeset
220 uint8_t *src;
938d37ad4f85 preliminary version
nick
parents:
diff changeset
221 uint8_t *dest;
938d37ad4f85 preliminary version
nick
parents:
diff changeset
222 int i;
4032
076c6c29e693 OSD support
nick
parents: 4031
diff changeset
223 dest = vidix_mem + vidix_play.offsets[next_frame] + vidix_play.offset.y;
4999
7f1fa1db24b4 Optimization and get_image fixes (still untested)
nick
parents: 4991
diff changeset
224 dest += dstrides.y*y + x;
4010
938d37ad4f85 preliminary version
nick
parents:
diff changeset
225 src = image[0];
938d37ad4f85 preliminary version
nick
parents:
diff changeset
226 for(i=0;i<h;i++){
4999
7f1fa1db24b4 Optimization and get_image fixes (still untested)
nick
parents: 4991
diff changeset
227 memcpy(dest,src,w*image_Bpp);
4010
938d37ad4f85 preliminary version
nick
parents:
diff changeset
228 src+=stride[0];
4999
7f1fa1db24b4 Optimization and get_image fixes (still untested)
nick
parents: 4991
diff changeset
229 dest += dstrides.y;
4010
938d37ad4f85 preliminary version
nick
parents:
diff changeset
230 }
4240
a7d6ea555c2e added colorkey handling
alex
parents: 4234
diff changeset
231 return 0;
4010
938d37ad4f85 preliminary version
nick
parents:
diff changeset
232 }
938d37ad4f85 preliminary version
nick
parents:
diff changeset
233
4999
7f1fa1db24b4 Optimization and get_image fixes (still untested)
nick
parents: 4991
diff changeset
234 static uint32_t vidix_draw_slice_packed_fast(uint8_t *image[], int stride[], int w,int h,int x,int y)
4454
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
235 {
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
236 uint8_t *src;
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
237 uint8_t *dest;
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
238 int i;
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
239 dest = vidix_mem + vidix_play.offsets[next_frame] + vidix_play.offset.y;
4999
7f1fa1db24b4 Optimization and get_image fixes (still untested)
nick
parents: 4991
diff changeset
240 dest += dstrides.y*y + x;
4430
b4cc68c448db IMGFMT_RGBxx experimental support
nick
parents: 4379
diff changeset
241 src = image[0];
4999
7f1fa1db24b4 Optimization and get_image fixes (still untested)
nick
parents: 4991
diff changeset
242 memcpy(dest,src,h*dstrides.y);
4454
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
243 return 0;
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
244 }
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
245
4010
938d37ad4f85 preliminary version
nick
parents:
diff changeset
246 uint32_t vidix_draw_slice(uint8_t *image[], int stride[], int w,int h,int x,int y)
938d37ad4f85 preliminary version
nick
parents:
diff changeset
247 {
4454
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
248 printf("vosub_vidix: Error unoptimized draw_slice was called\nExiting...");
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
249 vidix_term();
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
250 exit( EXIT_FAILURE );
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
251 return 0;
4010
938d37ad4f85 preliminary version
nick
parents:
diff changeset
252 }
938d37ad4f85 preliminary version
nick
parents:
diff changeset
253
938d37ad4f85 preliminary version
nick
parents:
diff changeset
254 uint32_t vidix_draw_frame(uint8_t *image[])
938d37ad4f85 preliminary version
nick
parents:
diff changeset
255 {
4454
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
256 int stride[1];
4010
938d37ad4f85 preliminary version
nick
parents:
diff changeset
257 if(verbose > 1) printf("vosub_vidix: vidix_draw_frame() was called\n");
938d37ad4f85 preliminary version
nick
parents:
diff changeset
258 /* Note it's very strange but sometime for YUY2 draw_frame is called */
938d37ad4f85 preliminary version
nick
parents:
diff changeset
259 if(src_format == IMGFMT_YV12 || src_format == IMGFMT_I420 || src_format == IMGFMT_IYUV)
4442
49c410f359e0 return error if unknown depth given. more informative error messages. dont exit if draw_frame was called with Planar YUV, only warn the user
alex
parents: 4434
diff changeset
260 printf("vosub_vidix: draw_frame for YUV420 called, frame cannot be written\n");
4010
938d37ad4f85 preliminary version
nick
parents:
diff changeset
261 else
4430
b4cc68c448db IMGFMT_RGBxx experimental support
nick
parents: 4379
diff changeset
262 if(src_format == IMGFMT_RGB32 || src_format == IMGFMT_BGR32)
b4cc68c448db IMGFMT_RGBxx experimental support
nick
parents: 4379
diff changeset
263 stride[0] = vidix_play.src.w*4;
b4cc68c448db IMGFMT_RGBxx experimental support
nick
parents: 4379
diff changeset
264 else
b4cc68c448db IMGFMT_RGBxx experimental support
nick
parents: 4379
diff changeset
265 if(src_format == IMGFMT_RGB24 || src_format == IMGFMT_BGR24)
b4cc68c448db IMGFMT_RGBxx experimental support
nick
parents: 4379
diff changeset
266 stride[0] = vidix_play.src.w*3;
b4cc68c448db IMGFMT_RGBxx experimental support
nick
parents: 4379
diff changeset
267 else
4010
938d37ad4f85 preliminary version
nick
parents:
diff changeset
268 stride[0] = vidix_play.src.w*2;
4454
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
269 return vo_server->draw_slice(image,stride,vidix_play.src.w,vidix_play.src.h,
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
270 vidix_play.src.x,vidix_play.src.y);
4010
938d37ad4f85 preliminary version
nick
parents:
diff changeset
271 }
938d37ad4f85 preliminary version
nick
parents:
diff changeset
272
938d37ad4f85 preliminary version
nick
parents:
diff changeset
273 void vidix_flip_page(void)
938d37ad4f85 preliminary version
nick
parents:
diff changeset
274 {
938d37ad4f85 preliminary version
nick
parents:
diff changeset
275 if(verbose > 1) printf("vosub_vidix: vidix_flip_page() was called\n");
938d37ad4f85 preliminary version
nick
parents:
diff changeset
276 if(vo_doublebuffering)
938d37ad4f85 preliminary version
nick
parents:
diff changeset
277 {
4032
076c6c29e693 OSD support
nick
parents: 4031
diff changeset
278 vdlPlaybackFrameSelect(vidix_handler,next_frame);
4010
938d37ad4f85 preliminary version
nick
parents:
diff changeset
279 next_frame=(next_frame+1)%vidix_play.num_frames;
938d37ad4f85 preliminary version
nick
parents:
diff changeset
280 }
938d37ad4f85 preliminary version
nick
parents:
diff changeset
281 }
938d37ad4f85 preliminary version
nick
parents:
diff changeset
282
938d37ad4f85 preliminary version
nick
parents:
diff changeset
283 static void draw_alpha_null(int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride)
938d37ad4f85 preliminary version
nick
parents:
diff changeset
284 {
938d37ad4f85 preliminary version
nick
parents:
diff changeset
285 UNUSED(x0);
938d37ad4f85 preliminary version
nick
parents:
diff changeset
286 UNUSED(y0);
938d37ad4f85 preliminary version
nick
parents:
diff changeset
287 UNUSED(w);
938d37ad4f85 preliminary version
nick
parents:
diff changeset
288 UNUSED(h);
938d37ad4f85 preliminary version
nick
parents:
diff changeset
289 UNUSED(src);
938d37ad4f85 preliminary version
nick
parents:
diff changeset
290 UNUSED(srca);
938d37ad4f85 preliminary version
nick
parents:
diff changeset
291 UNUSED(stride);
938d37ad4f85 preliminary version
nick
parents:
diff changeset
292 }
938d37ad4f85 preliminary version
nick
parents:
diff changeset
293
938d37ad4f85 preliminary version
nick
parents:
diff changeset
294 static void draw_alpha(int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride)
938d37ad4f85 preliminary version
nick
parents:
diff changeset
295 {
4032
076c6c29e693 OSD support
nick
parents: 4031
diff changeset
296 uint32_t apitch,bespitch;
4010
938d37ad4f85 preliminary version
nick
parents:
diff changeset
297 void *lvo_mem;
4032
076c6c29e693 OSD support
nick
parents: 4031
diff changeset
298 lvo_mem = vidix_mem + vidix_play.offsets[next_frame] + vidix_play.offset.y;
076c6c29e693 OSD support
nick
parents: 4031
diff changeset
299 apitch = vidix_play.dest.pitch.y-1;
4010
938d37ad4f85 preliminary version
nick
parents:
diff changeset
300 switch(vidix_play.fourcc){
938d37ad4f85 preliminary version
nick
parents:
diff changeset
301 case IMGFMT_YV12:
938d37ad4f85 preliminary version
nick
parents:
diff changeset
302 case IMGFMT_IYUV:
938d37ad4f85 preliminary version
nick
parents:
diff changeset
303 case IMGFMT_I420:
4745
398e3663ed71 Allow using direct rendering with any HW pitches (even on matrox g400).
nick
parents: 4744
diff changeset
304 bespitch = (vidix_play.src.w + apitch) & (~apitch);
4010
938d37ad4f85 preliminary version
nick
parents:
diff changeset
305 vo_draw_alpha_yv12(w,h,src,srca,stride,lvo_mem+bespitch*y0+x0,bespitch);
938d37ad4f85 preliminary version
nick
parents:
diff changeset
306 break;
938d37ad4f85 preliminary version
nick
parents:
diff changeset
307 case IMGFMT_YUY2:
4745
398e3663ed71 Allow using direct rendering with any HW pitches (even on matrox g400).
nick
parents: 4744
diff changeset
308 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
309 vo_draw_alpha_yuy2(w,h,src,srca,stride,lvo_mem+bespitch*y0+2*x0,bespitch);
4010
938d37ad4f85 preliminary version
nick
parents:
diff changeset
310 break;
938d37ad4f85 preliminary version
nick
parents:
diff changeset
311 case IMGFMT_UYVY:
4745
398e3663ed71 Allow using direct rendering with any HW pitches (even on matrox g400).
nick
parents: 4744
diff changeset
312 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
313 vo_draw_alpha_yuy2(w,h,src,srca,stride,lvo_mem+bespitch*y0+2*x0+1,bespitch);
4010
938d37ad4f85 preliminary version
nick
parents:
diff changeset
314 break;
4430
b4cc68c448db IMGFMT_RGBxx experimental support
nick
parents: 4379
diff changeset
315 case IMGFMT_RGB32:
b4cc68c448db IMGFMT_RGBxx experimental support
nick
parents: 4379
diff changeset
316 case IMGFMT_BGR32:
4745
398e3663ed71 Allow using direct rendering with any HW pitches (even on matrox g400).
nick
parents: 4744
diff changeset
317 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
318 vo_draw_alpha_rgb32(w,h,src,srca,stride,lvo_mem+y0*bespitch+4*x0,bespitch);
4430
b4cc68c448db IMGFMT_RGBxx experimental support
nick
parents: 4379
diff changeset
319 break;
b4cc68c448db IMGFMT_RGBxx experimental support
nick
parents: 4379
diff changeset
320 case IMGFMT_RGB24:
b4cc68c448db IMGFMT_RGBxx experimental support
nick
parents: 4379
diff changeset
321 case IMGFMT_BGR24:
4745
398e3663ed71 Allow using direct rendering with any HW pitches (even on matrox g400).
nick
parents: 4744
diff changeset
322 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
323 vo_draw_alpha_rgb24(w,h,src,srca,stride,lvo_mem+y0*bespitch+3*x0,bespitch);
4430
b4cc68c448db IMGFMT_RGBxx experimental support
nick
parents: 4379
diff changeset
324 break;
b4cc68c448db IMGFMT_RGBxx experimental support
nick
parents: 4379
diff changeset
325 case IMGFMT_RGB16:
b4cc68c448db IMGFMT_RGBxx experimental support
nick
parents: 4379
diff changeset
326 case IMGFMT_BGR16:
4745
398e3663ed71 Allow using direct rendering with any HW pitches (even on matrox g400).
nick
parents: 4744
diff changeset
327 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
328 vo_draw_alpha_rgb16(w,h,src,srca,stride,lvo_mem+y0*bespitch+2*x0,bespitch);
4430
b4cc68c448db IMGFMT_RGBxx experimental support
nick
parents: 4379
diff changeset
329 break;
b4cc68c448db IMGFMT_RGBxx experimental support
nick
parents: 4379
diff changeset
330 case IMGFMT_RGB15:
b4cc68c448db IMGFMT_RGBxx experimental support
nick
parents: 4379
diff changeset
331 case IMGFMT_BGR15:
4745
398e3663ed71 Allow using direct rendering with any HW pitches (even on matrox g400).
nick
parents: 4744
diff changeset
332 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
333 vo_draw_alpha_rgb15(w,h,src,srca,stride,lvo_mem+y0*bespitch+2*x0,bespitch);
4430
b4cc68c448db IMGFMT_RGBxx experimental support
nick
parents: 4379
diff changeset
334 break;
4010
938d37ad4f85 preliminary version
nick
parents:
diff changeset
335 default:
938d37ad4f85 preliminary version
nick
parents:
diff changeset
336 draw_alpha_null(x0,y0,w,h,src,srca,stride);
938d37ad4f85 preliminary version
nick
parents:
diff changeset
337 }
938d37ad4f85 preliminary version
nick
parents:
diff changeset
338 }
938d37ad4f85 preliminary version
nick
parents:
diff changeset
339
938d37ad4f85 preliminary version
nick
parents:
diff changeset
340 void vidix_draw_osd(void)
938d37ad4f85 preliminary version
nick
parents:
diff changeset
341 {
938d37ad4f85 preliminary version
nick
parents:
diff changeset
342 if(verbose > 1) printf("vosub_vidix: vidix_draw_osd() was called\n");
938d37ad4f85 preliminary version
nick
parents:
diff changeset
343 /* TODO: hw support */
938d37ad4f85 preliminary version
nick
parents:
diff changeset
344 vo_draw_text(vidix_play.src.w,vidix_play.src.h,draw_alpha);
938d37ad4f85 preliminary version
nick
parents:
diff changeset
345 }
938d37ad4f85 preliminary version
nick
parents:
diff changeset
346
938d37ad4f85 preliminary version
nick
parents:
diff changeset
347 uint32_t vidix_query_fourcc(uint32_t format)
938d37ad4f85 preliminary version
nick
parents:
diff changeset
348 {
938d37ad4f85 preliminary version
nick
parents:
diff changeset
349 if(verbose > 1) printf("vosub_vidix: query_format was called: %x (%s)\n",format,vo_format_name(format));
938d37ad4f85 preliminary version
nick
parents:
diff changeset
350 vidix_fourcc.fourcc = format;
938d37ad4f85 preliminary version
nick
parents:
diff changeset
351 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
352 if (vidix_fourcc.depth == VID_DEPTH_NONE)
6f28d6ccbd91 Using yv12_to_yuy2 sw convertor for cards which have no native yv12 support
nick
parents: 5028
diff changeset
353 {
6f28d6ccbd91 Using yv12_to_yuy2 sw convertor for cards which have no native yv12 support
nick
parents: 5028
diff changeset
354 if(format == IMGFMT_YV12)
6f28d6ccbd91 Using yv12_to_yuy2 sw convertor for cards which have no native yv12 support
nick
parents: 5028
diff changeset
355 {
6f28d6ccbd91 Using yv12_to_yuy2 sw convertor for cards which have no native yv12 support
nick
parents: 5028
diff changeset
356 vidix_fourcc.fourcc = IMGFMT_YUY2;
6f28d6ccbd91 Using yv12_to_yuy2 sw convertor for cards which have no native yv12 support
nick
parents: 5028
diff changeset
357 vdlQueryFourcc(vidix_handler,&vidix_fourcc);
6f28d6ccbd91 Using yv12_to_yuy2 sw convertor for cards which have no native yv12 support
nick
parents: 5028
diff changeset
358 if (vidix_fourcc.depth == VID_DEPTH_NONE) return 0;
6f28d6ccbd91 Using yv12_to_yuy2 sw convertor for cards which have no native yv12 support
nick
parents: 5028
diff changeset
359 else
6f28d6ccbd91 Using yv12_to_yuy2 sw convertor for cards which have no native yv12 support
nick
parents: 5028
diff changeset
360 {
6f28d6ccbd91 Using yv12_to_yuy2 sw convertor for cards which have no native yv12 support
nick
parents: 5028
diff changeset
361 vo_server->draw_slice = vidix_draw_slice_swYV12;
6f28d6ccbd91 Using yv12_to_yuy2 sw convertor for cards which have no native yv12 support
nick
parents: 5028
diff changeset
362 forced_fourcc=IMGFMT_YUY2;
6f28d6ccbd91 Using yv12_to_yuy2 sw convertor for cards which have no native yv12 support
nick
parents: 5028
diff changeset
363 printf("vosub_vidix: WARNING!!! Using YV12 to YUY2 SW convertion\n");
6f28d6ccbd91 Using yv12_to_yuy2 sw convertor for cards which have no native yv12 support
nick
parents: 5028
diff changeset
364 return 0x02;
6f28d6ccbd91 Using yv12_to_yuy2 sw convertor for cards which have no native yv12 support
nick
parents: 5028
diff changeset
365 }
6f28d6ccbd91 Using yv12_to_yuy2 sw convertor for cards which have no native yv12 support
nick
parents: 5028
diff changeset
366 }
6f28d6ccbd91 Using yv12_to_yuy2 sw convertor for cards which have no native yv12 support
nick
parents: 5028
diff changeset
367 return 0 ;
6f28d6ccbd91 Using yv12_to_yuy2 sw convertor for cards which have no native yv12 support
nick
parents: 5028
diff changeset
368 }
6f28d6ccbd91 Using yv12_to_yuy2 sw convertor for cards which have no native yv12 support
nick
parents: 5028
diff changeset
369 return 0x2; /* hw support without conversion */
4010
938d37ad4f85 preliminary version
nick
parents:
diff changeset
370 }
4240
a7d6ea555c2e added colorkey handling
alex
parents: 4234
diff changeset
371
4255
5a4a4b272d10 vidix_grkey_support checking for colorkeying
alex
parents: 4240
diff changeset
372 int vidix_grkey_support(void)
5a4a4b272d10 vidix_grkey_support checking for colorkeying
alex
parents: 4240
diff changeset
373 {
4270
178c84b1090e clearing safely the buffer, queryfourcc returns 0x2 (hw accel, noconv.), setting eq only if drivers i able
alex
parents: 4255
diff changeset
374 return(vidix_fourcc.flags & VID_CAP_COLORKEY);
4255
5a4a4b272d10 vidix_grkey_support checking for colorkeying
alex
parents: 4240
diff changeset
375 }
5a4a4b272d10 vidix_grkey_support checking for colorkeying
alex
parents: 4240
diff changeset
376
4240
a7d6ea555c2e added colorkey handling
alex
parents: 4234
diff changeset
377 int vidix_grkey_get(vidix_grkey_t *gr_key)
a7d6ea555c2e added colorkey handling
alex
parents: 4234
diff changeset
378 {
a7d6ea555c2e added colorkey handling
alex
parents: 4234
diff changeset
379 return(vdlGetGrKeys(vidix_handler, gr_key));
a7d6ea555c2e added colorkey handling
alex
parents: 4234
diff changeset
380 }
a7d6ea555c2e added colorkey handling
alex
parents: 4234
diff changeset
381
a7d6ea555c2e added colorkey handling
alex
parents: 4234
diff changeset
382 int vidix_grkey_set(const vidix_grkey_t *gr_key)
a7d6ea555c2e added colorkey handling
alex
parents: 4234
diff changeset
383 {
a7d6ea555c2e added colorkey handling
alex
parents: 4234
diff changeset
384 return(vdlSetGrKeys(vidix_handler, gr_key));
a7d6ea555c2e added colorkey handling
alex
parents: 4234
diff changeset
385 }
4372
9b6430df4de5 improvements
nick
parents: 4362
diff changeset
386
9b6430df4de5 improvements
nick
parents: 4362
diff changeset
387 static int vidix_get_bes_da(bes_da_t *info)
9b6430df4de5 improvements
nick
parents: 4362
diff changeset
388 {
9b6430df4de5 improvements
nick
parents: 4362
diff changeset
389 if(!video_on) return EPERM;
9b6430df4de5 improvements
nick
parents: 4362
diff changeset
390 info->dest.x = vidix_play.src.x;
9b6430df4de5 improvements
nick
parents: 4362
diff changeset
391 info->dest.y = vidix_play.src.y;
9b6430df4de5 improvements
nick
parents: 4362
diff changeset
392 info->dest.w = vidix_play.src.w;
9b6430df4de5 improvements
nick
parents: 4362
diff changeset
393 info->dest.h = vidix_play.src.h;
9b6430df4de5 improvements
nick
parents: 4362
diff changeset
394 info->dest.pitch.y = vidix_play.dest.pitch.y;
9b6430df4de5 improvements
nick
parents: 4362
diff changeset
395 info->dest.pitch.u = vidix_play.dest.pitch.u;
9b6430df4de5 improvements
nick
parents: 4362
diff changeset
396 info->dest.pitch.v = vidix_play.dest.pitch.v;
9b6430df4de5 improvements
nick
parents: 4362
diff changeset
397 info->flags = vidix_play.flags;
9b6430df4de5 improvements
nick
parents: 4362
diff changeset
398 info->frame_size = vidix_play.frame_size;
9b6430df4de5 improvements
nick
parents: 4362
diff changeset
399 info->num_frames = vidix_play.num_frames;
9b6430df4de5 improvements
nick
parents: 4362
diff changeset
400 memcpy(info->offsets,vidix_play.offsets,sizeof(unsigned)*vidix_play.num_frames);
9b6430df4de5 improvements
nick
parents: 4362
diff changeset
401 memcpy(&info->offset,&vidix_play.offset,sizeof(vidix_yuv_t));
9b6430df4de5 improvements
nick
parents: 4362
diff changeset
402 info->dga_addr = vidix_play.dga_addr;
9b6430df4de5 improvements
nick
parents: 4362
diff changeset
403 return 0;
9b6430df4de5 improvements
nick
parents: 4362
diff changeset
404 }
4379
7a4837091398 provide full vaa interface
nick
parents: 4372
diff changeset
405
7a4837091398 provide full vaa interface
nick
parents: 4372
diff changeset
406 static int vidix_get_video_eq(vidix_video_eq_t *info)
7a4837091398 provide full vaa interface
nick
parents: 4372
diff changeset
407 {
7a4837091398 provide full vaa interface
nick
parents: 4372
diff changeset
408 if(!video_on) return EPERM;
7a4837091398 provide full vaa interface
nick
parents: 4372
diff changeset
409 return vdlPlaybackGetEq(vidix_handler, info);
7a4837091398 provide full vaa interface
nick
parents: 4372
diff changeset
410 }
7a4837091398 provide full vaa interface
nick
parents: 4372
diff changeset
411
7a4837091398 provide full vaa interface
nick
parents: 4372
diff changeset
412 static int vidix_set_video_eq(const vidix_video_eq_t *info)
7a4837091398 provide full vaa interface
nick
parents: 4372
diff changeset
413 {
7a4837091398 provide full vaa interface
nick
parents: 4372
diff changeset
414 if(!video_on) return EPERM;
7a4837091398 provide full vaa interface
nick
parents: 4372
diff changeset
415 return vdlPlaybackSetEq(vidix_handler, info);
7a4837091398 provide full vaa interface
nick
parents: 4372
diff changeset
416 }
7a4837091398 provide full vaa interface
nick
parents: 4372
diff changeset
417
7a4837091398 provide full vaa interface
nick
parents: 4372
diff changeset
418 static int vidix_get_num_fx(unsigned *info)
7a4837091398 provide full vaa interface
nick
parents: 4372
diff changeset
419 {
7a4837091398 provide full vaa interface
nick
parents: 4372
diff changeset
420 if(!video_on) return EPERM;
7a4837091398 provide full vaa interface
nick
parents: 4372
diff changeset
421 return vdlQueryNumOemEffects(vidix_handler, info);
7a4837091398 provide full vaa interface
nick
parents: 4372
diff changeset
422 }
7a4837091398 provide full vaa interface
nick
parents: 4372
diff changeset
423
7a4837091398 provide full vaa interface
nick
parents: 4372
diff changeset
424 static int vidix_get_oem_fx(vidix_oem_fx_t *info)
7a4837091398 provide full vaa interface
nick
parents: 4372
diff changeset
425 {
7a4837091398 provide full vaa interface
nick
parents: 4372
diff changeset
426 if(!video_on) return EPERM;
7a4837091398 provide full vaa interface
nick
parents: 4372
diff changeset
427 return vdlGetOemEffect(vidix_handler, info);
7a4837091398 provide full vaa interface
nick
parents: 4372
diff changeset
428 }
7a4837091398 provide full vaa interface
nick
parents: 4372
diff changeset
429
7a4837091398 provide full vaa interface
nick
parents: 4372
diff changeset
430 static int vidix_set_oem_fx(const vidix_oem_fx_t *info)
7a4837091398 provide full vaa interface
nick
parents: 4372
diff changeset
431 {
7a4837091398 provide full vaa interface
nick
parents: 4372
diff changeset
432 if(!video_on) return EPERM;
7a4837091398 provide full vaa interface
nick
parents: 4372
diff changeset
433 return vdlSetOemEffect(vidix_handler, info);
7a4837091398 provide full vaa interface
nick
parents: 4372
diff changeset
434 }
7a4837091398 provide full vaa interface
nick
parents: 4372
diff changeset
435
7a4837091398 provide full vaa interface
nick
parents: 4372
diff changeset
436 static int vidix_set_deint(const vidix_deinterlace_t *info)
7a4837091398 provide full vaa interface
nick
parents: 4372
diff changeset
437 {
7a4837091398 provide full vaa interface
nick
parents: 4372
diff changeset
438 if(!video_on) return EPERM;
7a4837091398 provide full vaa interface
nick
parents: 4372
diff changeset
439 return vdlPlaybackSetDeint(vidix_handler, info);
7a4837091398 provide full vaa interface
nick
parents: 4372
diff changeset
440 }
4454
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
441
5028
ddc28e9aa726 fixed strides for packed fourccs
nick
parents: 5002
diff changeset
442 static int is_422_planes_eq=0;
4454
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
443 int vidix_init(unsigned src_width,unsigned src_height,
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
444 unsigned x_org,unsigned y_org,unsigned dst_width,
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
445 unsigned dst_height,unsigned format,unsigned dest_bpp,
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
446 unsigned vid_w,unsigned vid_h,const void *info)
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
447 {
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
448 size_t i,awidth;
5028
ddc28e9aa726 fixed strides for packed fourccs
nick
parents: 5002
diff changeset
449 int err;
4999
7f1fa1db24b4 Optimization and get_image fixes (still untested)
nick
parents: 4991
diff changeset
450 uint32_t sstride,apitch;
4454
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
451 if(verbose > 1)
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
452 printf("vosub_vidix: vidix_init() was called\n"
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
453 "src_w=%u src_h=%u dest_x_y_w_h = %u %u %u %u\n"
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
454 "format=%s dest_bpp=%u vid_w=%u vid_h=%u\n"
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
455 ,src_width,src_height,x_org,y_org,dst_width,dst_height
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
456 ,vo_format_name(format),dest_bpp,vid_w,vid_h);
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
457
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
458 if(((vidix_cap.maxwidth != -1) && (vid_w > vidix_cap.maxwidth)) ||
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
459 ((vidix_cap.minwidth != -1) && (vid_w < vidix_cap.minwidth)) ||
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
460 ((vidix_cap.maxheight != -1) && (vid_h > vidix_cap.maxheight)) ||
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
461 ((vidix_cap.minwidth != -1 ) && (vid_h < vidix_cap.minheight)))
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
462 {
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
463 printf("vosub_vidix: video server has unsupported resolution (%dx%d), supported: %dx%d-%dx%d\n",
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
464 vid_w, vid_h, vidix_cap.minwidth, vidix_cap.minheight,
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
465 vidix_cap.maxwidth, vidix_cap.maxheight);
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
466 return -1;
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
467 }
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
468
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
469 err = 0;
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
470 switch(dest_bpp)
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
471 {
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
472 case 1: err = ((vidix_fourcc.depth & VID_DEPTH_1BPP) != VID_DEPTH_1BPP); break;
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
473 case 2: err = ((vidix_fourcc.depth & VID_DEPTH_2BPP) != VID_DEPTH_2BPP); break;
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
474 case 4: err = ((vidix_fourcc.depth & VID_DEPTH_4BPP) != VID_DEPTH_4BPP); break;
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
475 case 8: err = ((vidix_fourcc.depth & VID_DEPTH_8BPP) != VID_DEPTH_8BPP); break;
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
476 case 12:err = ((vidix_fourcc.depth & VID_DEPTH_12BPP) != VID_DEPTH_12BPP); break;
4540
cb255a42aa5e Enable 15bpp on server
nick
parents: 4454
diff changeset
477 case 15:err = ((vidix_fourcc.depth & VID_DEPTH_15BPP) != VID_DEPTH_15BPP); break;
4454
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
478 case 16:err = ((vidix_fourcc.depth & VID_DEPTH_16BPP) != VID_DEPTH_16BPP); break;
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
479 case 24:err = ((vidix_fourcc.depth & VID_DEPTH_24BPP) != VID_DEPTH_24BPP); break;
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
480 case 32:err = ((vidix_fourcc.depth & VID_DEPTH_32BPP) != VID_DEPTH_32BPP); break;
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
481 default: err=1; break;
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
482 }
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
483 if(err)
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
484 {
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
485 printf("vosub_vidix: video server has unsupported color depth by vidix (%d)\n"
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
486 ,vidix_fourcc.depth);
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
487 return -1;
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
488 }
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
489 if((dst_width > src_width || dst_height > src_height) && (vidix_cap.flags & FLAG_UPSCALER) != FLAG_UPSCALER)
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
490 {
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
491 printf("vosub_vidix: vidix driver can't upscale image (%d%d -> %d%d)\n",
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
492 src_width, src_height, dst_width, dst_height);
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
493 return -1;
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
494 }
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
495 if((dst_width > src_width || dst_height > src_height) && (vidix_cap.flags & FLAG_DOWNSCALER) != FLAG_DOWNSCALER)
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
496 {
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
497 printf("vosub_vidix: vidix driver can't downscale image (%d%d -> %d%d)\n",
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
498 src_width, src_height, dst_width, dst_height);
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
499 return -1;
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
500 }
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
501 image_width = src_width;
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
502 image_height = src_height;
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
503 src_format = format;
5052
6f28d6ccbd91 Using yv12_to_yuy2 sw convertor for cards which have no native yv12 support
nick
parents: 5028
diff changeset
504 if(forced_fourcc) format = forced_fourcc;
4454
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
505 memset(&vidix_play,0,sizeof(vidix_playback_t));
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
506 vidix_play.fourcc = format;
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
507 vidix_play.capability = vidix_cap.flags; /* every ;) */
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
508 vidix_play.blend_factor = 0; /* for now */
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
509 /* display the full picture.
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
510 Nick: we could implement here zooming to a specified area -- alex */
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
511 vidix_play.src.x = vidix_play.src.y = 0;
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
512 vidix_play.src.w = src_width;
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
513 vidix_play.src.h = src_height;
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
514 vidix_play.dest.x = x_org;
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
515 vidix_play.dest.y = y_org;
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
516 vidix_play.dest.w = dst_width;
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
517 vidix_play.dest.h = dst_height;
4929
939eacee89ab Use as much buffers as possible
nick
parents: 4895
diff changeset
518 vidix_play.num_frames=vo_doublebuffering?NUM_FRAMES-1:1;
4454
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
519 vidix_play.src.pitch.y = vidix_play.src.pitch.u = vidix_play.src.pitch.v = 0;
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
520 if(info)
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
521 {
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
522 switch(((const vo_tune_info_t *)info)->pitch[0])
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
523 {
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
524 case 2:
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
525 case 4:
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
526 case 8:
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
527 case 16:
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
528 case 32:
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
529 case 64:
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
530 case 128:
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
531 case 256: vidix_play.src.pitch.y = ((const vo_tune_info_t *)info)->pitch[0];
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
532 break;
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
533 default: break;
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
534 }
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
535 switch(((const vo_tune_info_t *)info)->pitch[1])
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
536 {
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
537 case 2:
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
538 case 4:
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
539 case 8:
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
540 case 16:
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
541 case 32:
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
542 case 64:
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
543 case 128:
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
544 case 256: vidix_play.src.pitch.u = ((const vo_tune_info_t *)info)->pitch[1];
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
545 break;
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
546 default: break;
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
547 }
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
548 switch(((const vo_tune_info_t *)info)->pitch[2])
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
549 {
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
550 case 2:
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
551 case 4:
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
552 case 8:
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
553 case 16:
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
554 case 32:
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
555 case 64:
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
556 case 128:
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
557 case 256: vidix_play.src.pitch.v = ((const vo_tune_info_t *)info)->pitch[2];
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
558 break;
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
559 default: break;
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
560 }
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
561 }
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
562 if((err=vdlConfigPlayback(vidix_handler,&vidix_play))!=0)
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
563 {
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
564 printf("vosub_vidix: Can't configure playback: %s\n",strerror(err));
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
565 return -1;
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
566 }
4895
e0f8928a4f6b print the number of buffers used
michael
parents: 4745
diff changeset
567 printf("vosub_vidix: using %d buffers\n", vidix_play.num_frames);
4454
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
568
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
569 vidix_mem = vidix_play.dga_addr;
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
570
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
571 /* select first frame */
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
572 next_frame = 0;
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
573 // vdlPlaybackFrameSelect(vidix_handler,next_frame);
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
574
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
575 /* clear every frame with correct address and frame_size */
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
576 for (i = 0; i < vidix_play.num_frames; i++)
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
577 memset(vidix_mem + vidix_play.offsets[i], 0x80,
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
578 vidix_play.frame_size);
4999
7f1fa1db24b4 Optimization and get_image fixes (still untested)
nick
parents: 4991
diff changeset
579 switch(format)
7f1fa1db24b4 Optimization and get_image fixes (still untested)
nick
parents: 4991
diff changeset
580 {
7f1fa1db24b4 Optimization and get_image fixes (still untested)
nick
parents: 4991
diff changeset
581 /*
7f1fa1db24b4 Optimization and get_image fixes (still untested)
nick
parents: 4991
diff changeset
582 case IMGFMT_YV09:
7f1fa1db24b4 Optimization and get_image fixes (still untested)
nick
parents: 4991
diff changeset
583 case IMGFMT_IF09:
7f1fa1db24b4 Optimization and get_image fixes (still untested)
nick
parents: 4991
diff changeset
584 */
7f1fa1db24b4 Optimization and get_image fixes (still untested)
nick
parents: 4991
diff changeset
585 case IMGFMT_I420:
7f1fa1db24b4 Optimization and get_image fixes (still untested)
nick
parents: 4991
diff changeset
586 case IMGFMT_IYUV:
7f1fa1db24b4 Optimization and get_image fixes (still untested)
nick
parents: 4991
diff changeset
587 case IMGFMT_YV12:
7f1fa1db24b4 Optimization and get_image fixes (still untested)
nick
parents: 4991
diff changeset
588 apitch = vidix_play.dest.pitch.y-1;
7f1fa1db24b4 Optimization and get_image fixes (still untested)
nick
parents: 4991
diff changeset
589 dstrides.y = (image_width + apitch) & ~apitch;
7f1fa1db24b4 Optimization and get_image fixes (still untested)
nick
parents: 4991
diff changeset
590 apitch = vidix_play.dest.pitch.v-1;
7f1fa1db24b4 Optimization and get_image fixes (still untested)
nick
parents: 4991
diff changeset
591 dstrides.v = (image_width + apitch) & ~apitch;
7f1fa1db24b4 Optimization and get_image fixes (still untested)
nick
parents: 4991
diff changeset
592 apitch = vidix_play.dest.pitch.u-1;
7f1fa1db24b4 Optimization and get_image fixes (still untested)
nick
parents: 4991
diff changeset
593 dstrides.u = (image_width + apitch) & ~apitch;
7f1fa1db24b4 Optimization and get_image fixes (still untested)
nick
parents: 4991
diff changeset
594 image_Bpp=1;
7f1fa1db24b4 Optimization and get_image fixes (still untested)
nick
parents: 4991
diff changeset
595 break;
7f1fa1db24b4 Optimization and get_image fixes (still untested)
nick
parents: 4991
diff changeset
596 case IMGFMT_RGB32:
7f1fa1db24b4 Optimization and get_image fixes (still untested)
nick
parents: 4991
diff changeset
597 case IMGFMT_BGR32:
7f1fa1db24b4 Optimization and get_image fixes (still untested)
nick
parents: 4991
diff changeset
598 apitch = vidix_play.dest.pitch.y-1;
7f1fa1db24b4 Optimization and get_image fixes (still untested)
nick
parents: 4991
diff changeset
599 dstrides.y = (image_width*4 + apitch) & ~apitch;
7f1fa1db24b4 Optimization and get_image fixes (still untested)
nick
parents: 4991
diff changeset
600 dstrides.u = dstrides.v = 0;
7f1fa1db24b4 Optimization and get_image fixes (still untested)
nick
parents: 4991
diff changeset
601 image_Bpp=4;
7f1fa1db24b4 Optimization and get_image fixes (still untested)
nick
parents: 4991
diff changeset
602 break;
7f1fa1db24b4 Optimization and get_image fixes (still untested)
nick
parents: 4991
diff changeset
603 case IMGFMT_RGB24:
7f1fa1db24b4 Optimization and get_image fixes (still untested)
nick
parents: 4991
diff changeset
604 case IMGFMT_BGR24:
7f1fa1db24b4 Optimization and get_image fixes (still untested)
nick
parents: 4991
diff changeset
605 apitch = vidix_play.dest.pitch.y-1;
7f1fa1db24b4 Optimization and get_image fixes (still untested)
nick
parents: 4991
diff changeset
606 dstrides.y = (image_width*3 + apitch) & ~apitch;
7f1fa1db24b4 Optimization and get_image fixes (still untested)
nick
parents: 4991
diff changeset
607 dstrides.u = dstrides.v = 0;
7f1fa1db24b4 Optimization and get_image fixes (still untested)
nick
parents: 4991
diff changeset
608 image_Bpp=3;
7f1fa1db24b4 Optimization and get_image fixes (still untested)
nick
parents: 4991
diff changeset
609 break;
7f1fa1db24b4 Optimization and get_image fixes (still untested)
nick
parents: 4991
diff changeset
610 default:
7f1fa1db24b4 Optimization and get_image fixes (still untested)
nick
parents: 4991
diff changeset
611 apitch = vidix_play.dest.pitch.y-1;
7f1fa1db24b4 Optimization and get_image fixes (still untested)
nick
parents: 4991
diff changeset
612 dstrides.y = (image_width*2 + apitch) & ~apitch;
7f1fa1db24b4 Optimization and get_image fixes (still untested)
nick
parents: 4991
diff changeset
613 dstrides.u = dstrides.v = 0;
7f1fa1db24b4 Optimization and get_image fixes (still untested)
nick
parents: 4991
diff changeset
614 image_Bpp=2;
7f1fa1db24b4 Optimization and get_image fixes (still untested)
nick
parents: 4991
diff changeset
615 break;
7f1fa1db24b4 Optimization and get_image fixes (still untested)
nick
parents: 4991
diff changeset
616 }
4454
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
617 /* tune some info here */
4745
398e3663ed71 Allow using direct rendering with any HW pitches (even on matrox g400).
nick
parents: 4744
diff changeset
618 sstride = src_width*2;
5052
6f28d6ccbd91 Using yv12_to_yuy2 sw convertor for cards which have no native yv12 support
nick
parents: 5028
diff changeset
619 if(!forced_fourcc)
6f28d6ccbd91 Using yv12_to_yuy2 sw convertor for cards which have no native yv12 support
nick
parents: 5028
diff changeset
620 {
6f28d6ccbd91 Using yv12_to_yuy2 sw convertor for cards which have no native yv12 support
nick
parents: 5028
diff changeset
621 is_422_planes_eq = sstride == dstrides.y;
6f28d6ccbd91 Using yv12_to_yuy2 sw convertor for cards which have no native yv12 support
nick
parents: 5028
diff changeset
622 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
623 vo_server->draw_slice = vidix_draw_slice_420;
6f28d6ccbd91 Using yv12_to_yuy2 sw convertor for cards which have no native yv12 support
nick
parents: 5028
diff changeset
624 else vo_server->draw_slice =
6f28d6ccbd91 Using yv12_to_yuy2 sw convertor for cards which have no native yv12 support
nick
parents: 5028
diff changeset
625 is_422_planes_eq ?
6f28d6ccbd91 Using yv12_to_yuy2 sw convertor for cards which have no native yv12 support
nick
parents: 5028
diff changeset
626 vidix_draw_slice_packed_fast:
6f28d6ccbd91 Using yv12_to_yuy2 sw convertor for cards which have no native yv12 support
nick
parents: 5028
diff changeset
627 vidix_draw_slice_packed;
6f28d6ccbd91 Using yv12_to_yuy2 sw convertor for cards which have no native yv12 support
nick
parents: 5028
diff changeset
628 }
4454
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
629 return 0;
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
630 }
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
631
4991
ad943b99610a VOCTRL_GET_IMAGE (untested but should work)
nick
parents: 4929
diff changeset
632 static uint32_t vidix_get_image(mp_image_t *mpi)
ad943b99610a VOCTRL_GET_IMAGE (untested but should work)
nick
parents: 4929
diff changeset
633 {
ad943b99610a VOCTRL_GET_IMAGE (untested but should work)
nick
parents: 4929
diff changeset
634 if(mpi->type==MP_IMGTYPE_STATIC && vidix_play.num_frames>1) return VO_FALSE;
ad943b99610a VOCTRL_GET_IMAGE (untested but should work)
nick
parents: 4929
diff changeset
635 if(mpi->flags&MP_IMGFLAG_READABLE) return VO_FALSE; /* slow video ram */
5052
6f28d6ccbd91 Using yv12_to_yuy2 sw convertor for cards which have no native yv12 support
nick
parents: 5028
diff changeset
636 if((is_422_planes_eq || (mpi->flags&(MP_IMGFLAG_ACCEPT_STRIDE|MP_IMGFLAG_ACCEPT_WIDTH)) &&
6f28d6ccbd91 Using yv12_to_yuy2 sw convertor for cards which have no native yv12 support
nick
parents: 5028
diff changeset
637 !forced_fourcc && !(vidix_play.flags & VID_PLAY_INTERLEAVED_UV)))
4991
ad943b99610a VOCTRL_GET_IMAGE (untested but should work)
nick
parents: 4929
diff changeset
638 {
5028
ddc28e9aa726 fixed strides for packed fourccs
nick
parents: 5002
diff changeset
639 mpi->planes[0]=vidix_mem+vidix_play.offsets[next_frame]+vidix_play.offset.y;
ddc28e9aa726 fixed strides for packed fourccs
nick
parents: 5002
diff changeset
640 mpi->stride[0]=dstrides.y;
ddc28e9aa726 fixed strides for packed fourccs
nick
parents: 5002
diff changeset
641 if(mpi->flags&MP_IMGFLAG_PLANAR)
ddc28e9aa726 fixed strides for packed fourccs
nick
parents: 5002
diff changeset
642 {
ddc28e9aa726 fixed strides for packed fourccs
nick
parents: 5002
diff changeset
643 mpi->planes[2]=vidix_mem+vidix_play.offsets[next_frame]+vidix_play.offset.v;
ddc28e9aa726 fixed strides for packed fourccs
nick
parents: 5002
diff changeset
644 mpi->stride[2]=dstrides.v;
ddc28e9aa726 fixed strides for packed fourccs
nick
parents: 5002
diff changeset
645 mpi->planes[1]=vidix_mem+vidix_play.offsets[next_frame]+vidix_play.offset.u;
ddc28e9aa726 fixed strides for packed fourccs
nick
parents: 5002
diff changeset
646 mpi->stride[1]=dstrides.u;
ddc28e9aa726 fixed strides for packed fourccs
nick
parents: 5002
diff changeset
647 }
ddc28e9aa726 fixed strides for packed fourccs
nick
parents: 5002
diff changeset
648 mpi->flags|=MP_IMGFLAG_DIRECT;
4991
ad943b99610a VOCTRL_GET_IMAGE (untested but should work)
nick
parents: 4929
diff changeset
649 }
ad943b99610a VOCTRL_GET_IMAGE (untested but should work)
nick
parents: 4929
diff changeset
650 return VO_TRUE;
ad943b99610a VOCTRL_GET_IMAGE (untested but should work)
nick
parents: 4929
diff changeset
651 }
ad943b99610a VOCTRL_GET_IMAGE (untested but should work)
nick
parents: 4929
diff changeset
652
4592
5fbfd8545c3b query_ stuff replaced by new control() - patch by David Holm
arpi
parents: 4540
diff changeset
653 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
654 {
5fbfd8545c3b query_ stuff replaced by new control() - patch by David Holm
arpi
parents: 4540
diff changeset
655 switch (request) {
5fbfd8545c3b query_ stuff replaced by new control() - patch by David Holm
arpi
parents: 4540
diff changeset
656 case VOCTRL_QUERY_VAA:
5fbfd8545c3b query_ stuff replaced by new control() - patch by David Holm
arpi
parents: 4540
diff changeset
657 vidix_query_vaa((vo_vaa_t*)data);
5fbfd8545c3b query_ stuff replaced by new control() - patch by David Holm
arpi
parents: 4540
diff changeset
658 return VO_TRUE;
5fbfd8545c3b query_ stuff replaced by new control() - patch by David Holm
arpi
parents: 4540
diff changeset
659 case VOCTRL_QUERY_FORMAT:
5fbfd8545c3b query_ stuff replaced by new control() - patch by David Holm
arpi
parents: 4540
diff changeset
660 return vidix_query_fourcc(*((uint32_t*)data));
4739
a2df307ed979 Screenshot on the fly
nick
parents: 4654
diff changeset
661 case VOCTRL_SCREENSHOT:
a2df307ed979 Screenshot on the fly
nick
parents: 4654
diff changeset
662 return (*server_control)(request,data);
4991
ad943b99610a VOCTRL_GET_IMAGE (untested but should work)
nick
parents: 4929
diff changeset
663 case VOCTRL_GET_IMAGE:
ad943b99610a VOCTRL_GET_IMAGE (untested but should work)
nick
parents: 4929
diff changeset
664 return vidix_get_image(data);
5002
70751bbd6404 voctls for decoding ahead
nick
parents: 4999
diff changeset
665 case VOCTRL_GET_FRAME_NUM:
70751bbd6404 voctls for decoding ahead
nick
parents: 4999
diff changeset
666 *(uint32_t *)data = next_frame;
70751bbd6404 voctls for decoding ahead
nick
parents: 4999
diff changeset
667 return VO_TRUE;
70751bbd6404 voctls for decoding ahead
nick
parents: 4999
diff changeset
668 case VOCTRL_SET_FRAME_NUM:
70751bbd6404 voctls for decoding ahead
nick
parents: 4999
diff changeset
669 next_frame = *(uint32_t *)data;
70751bbd6404 voctls for decoding ahead
nick
parents: 4999
diff changeset
670 return VO_TRUE;
70751bbd6404 voctls for decoding ahead
nick
parents: 4999
diff changeset
671 case VOCTRL_GET_NUM_FRAMES:
70751bbd6404 voctls for decoding ahead
nick
parents: 4999
diff changeset
672 *(uint32_t *)data = vidix_play.num_frames;
70751bbd6404 voctls for decoding ahead
nick
parents: 4999
diff changeset
673 return VO_TRUE;
4592
5fbfd8545c3b query_ stuff replaced by new control() - patch by David Holm
arpi
parents: 4540
diff changeset
674 }
5fbfd8545c3b query_ stuff replaced by new control() - patch by David Holm
arpi
parents: 4540
diff changeset
675 return VO_NOTIMPL;
5fbfd8545c3b query_ stuff replaced by new control() - patch by David Holm
arpi
parents: 4540
diff changeset
676 }
5fbfd8545c3b query_ stuff replaced by new control() - patch by David Holm
arpi
parents: 4540
diff changeset
677
4454
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
678 int vidix_preinit(const char *drvname,void *server)
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
679 {
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
680 int err;
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
681 if(verbose > 1) printf("vosub_vidix: vidix_preinit(%s) was called\n",drvname);
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
682 if(vdlGetVersion() != VIDIX_VERSION)
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
683 {
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
684 printf("vosub_vidix: You have wrong version of VIDIX library\n");
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
685 return -1;
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
686 }
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
687 vidix_handler = vdlOpen(LIBDIR"/vidix/",
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
688 drvname ? drvname[0] == ':' ? &drvname[1] : drvname[0] ? drvname : NULL : NULL,
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
689 TYPE_OUTPUT,
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
690 verbose);
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
691 if(vidix_handler == NULL)
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
692 {
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
693 printf("vosub_vidix: Couldn't find working VIDIX driver\n");
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
694 return -1;
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
695 }
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
696 if((err=vdlGetCapability(vidix_handler,&vidix_cap)) != 0)
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
697 {
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
698 printf("vosub_vidix: Couldn't get capability: %s\n",strerror(err));
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
699 return -1;
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
700 }
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
701 printf("vosub_vidix: Using: %s by %s\n",vidix_cap.name,vidix_cap.author);
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
702 /* we are able to tune up this stuff depend on fourcc format */
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
703 ((vo_functions_t *)server)->draw_slice=vidix_draw_slice;
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
704 ((vo_functions_t *)server)->draw_frame=vidix_draw_frame;
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
705 ((vo_functions_t *)server)->flip_page=vidix_flip_page;
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
706 ((vo_functions_t *)server)->draw_osd=vidix_draw_osd;
4739
a2df307ed979 Screenshot on the fly
nick
parents: 4654
diff changeset
707 server_control = ((vo_functions_t *)server)->control;
4592
5fbfd8545c3b query_ stuff replaced by new control() - patch by David Holm
arpi
parents: 4540
diff changeset
708 ((vo_functions_t *)server)->control=vidix_control;
4454
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
709 vo_server = server;
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
710 return 0;
c58106c9e2af Optimizing with use new tune info
nick
parents: 4442
diff changeset
711 }