Mercurial > mplayer.hg
annotate libvo/vo_xvmc.c @ 35833:dbfedb331095
Keep GUI history untouched upon file select "Cancel".
Currently, when "Cancel" is selected in the file select menu, the
GUI history can be modified nevertheless. Presuming that "Cancel"
shall discard changes, the history should be kept unchanged, too.
Patch by Hans-Dieter Kosch, hdkosch kabelbw de.
author | ib |
---|---|
date | Thu, 28 Feb 2013 11:19:59 +0000 |
parents | 33e13b4ddfcb |
children | 1994a2fd15f4 |
rev | line source |
---|---|
28446
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28251
diff
changeset
|
1 /* |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28251
diff
changeset
|
2 * This file is part of MPlayer. |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28251
diff
changeset
|
3 * |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28251
diff
changeset
|
4 * MPlayer is free software; you can redistribute it and/or modify |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28251
diff
changeset
|
5 * it under the terms of the GNU General Public License as published by |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28251
diff
changeset
|
6 * the Free Software Foundation; either version 2 of the License, or |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28251
diff
changeset
|
7 * (at your option) any later version. |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28251
diff
changeset
|
8 * |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28251
diff
changeset
|
9 * MPlayer is distributed in the hope that it will be useful, |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28251
diff
changeset
|
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28251
diff
changeset
|
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28251
diff
changeset
|
12 * GNU General Public License for more details. |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28251
diff
changeset
|
13 * |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28251
diff
changeset
|
14 * You should have received a copy of the GNU General Public License along |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28251
diff
changeset
|
15 * with MPlayer; if not, write to the Free Software Foundation, Inc., |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28251
diff
changeset
|
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28251
diff
changeset
|
17 */ |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28251
diff
changeset
|
18 |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
19 #include <stdlib.h> |
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
20 #include <stdio.h> |
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
21 #include <string.h> |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
22 #include <unistd.h> |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
23 |
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
24 #include "config.h" |
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
25 #include "mp_msg.h" |
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
26 #include "video_out.h" |
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
27 #include "video_out_internal.h" |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
28 #include "osdep/timer.h" |
33301
899d817e56fc
Implement control() VOCTRL_SET/GET_EQUALIZER using a vf_equalize struct,
iive
parents:
33261
diff
changeset
|
29 #include "libmpcodecs/vf.h" |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
30 |
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
31 #include <X11/Xlib.h> |
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
32 #include <X11/Xutil.h> |
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
33 #include <X11/Xatom.h> |
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
34 |
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
35 #ifdef HAVE_SHM |
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
36 #include <sys/ipc.h> |
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
37 #include <sys/shm.h> |
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
38 #include <X11/extensions/XShm.h> |
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
39 #endif |
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
40 |
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
41 #include <X11/extensions/Xv.h> |
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
42 #include <X11/extensions/Xvlib.h> |
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
43 #include <X11/extensions/XvMClib.h> |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
44 |
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
45 #include "x11_common.h" |
28640 | 46 #include "libavcodec/avcodec.h" |
28522
fee39b6b62ea
Remove local copy of xvmc_render.h, it is now an installed header in FFmpeg.
diego
parents:
28511
diff
changeset
|
47 #include "libavcodec/xvmc.h" |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
48 |
32467 | 49 #include "sub/sub.h" |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
50 #include "aspect.h" |
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
51 |
14742 | 52 #include "subopt-helper.h" |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
53 |
22461
c54ad95f852a
Factor out some duplicated code in vo_xv and vo_xvmc
reimar
parents:
22257
diff
changeset
|
54 #include "libavutil/common.h" |
c54ad95f852a
Factor out some duplicated code in vo_xv and vo_xvmc
reimar
parents:
22257
diff
changeset
|
55 |
24595 | 56 //no chance for xinerama to be supported in the near future |
27377
d58d06eafe83
Change a bunch of X11-specific preprocessor directives.
diego
parents:
27343
diff
changeset
|
57 #undef CONFIG_XINERAMA |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
58 |
28569
fb881ea1a985
whitespace cosmetics: Remove all tabs and trailing whitespace.
diego
parents:
28568
diff
changeset
|
59 #undef NDEBUG |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
60 #include <assert.h> |
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
61 |
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
62 |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
63 static int benchmark; |
14742 | 64 static int use_sleep; |
15102
1d3ba9fb75cd
incorporate all image drawing in single function and use fixed vo_xv_draw_colorkey() for proper key drawing.
iive
parents:
15060
diff
changeset
|
65 static int first_frame;//draw colorkey on first frame |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
66 static int use_queue; |
14742 | 67 static int xv_port_request = 0; |
28569
fb881ea1a985
whitespace cosmetics: Remove all tabs and trailing whitespace.
diego
parents:
28568
diff
changeset
|
68 static int xv_adaptor = -1; |
20244 | 69 static int bob_deinterlace; |
70 static int top_field_first; | |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
71 |
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
72 static int image_width,image_height; |
22257
f979aa12d8cc
Don't free and then allocate surfaces when config() is called again with same resolution and format.
iive
parents:
22246
diff
changeset
|
73 static int image_format; |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
74 |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
75 #define NO_SUBPICTURE 0 |
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
76 #define OVERLAY_SUBPICTURE 1 |
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
77 #define BLEND_SUBPICTURE 2 |
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
78 #define BACKEND_SUBPICTURE 3 |
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
79 |
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
80 static int subpicture_mode; |
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
81 static int subpicture_alloc; |
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
82 static XvMCSubpicture subpicture; |
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
83 static XvImageFormatValues subpicture_info; |
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
84 static int subpicture_clear_color;//transparent color for the subpicture or color key for overlay |
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
85 |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
86 static XvMCSurfaceInfo surface_info; |
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
87 static XvMCContext ctx; |
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
88 static XvMCBlockArray data_blocks; |
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
89 static XvMCMacroBlockArray mv_blocks; |
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
90 |
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
91 #define MAX_SURFACES 8 |
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
92 static int number_of_surfaces=0; |
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
93 static XvMCSurface surface_array[MAX_SURFACES]; |
33247
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
94 struct xvmc_render{ |
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
95 struct xvmc_pix_fmt shared; |
33195
2f560e361175
Quick hack to fix compilation. Testing and improvements welcome.
reimar
parents:
32467
diff
changeset
|
96 #define STATE_DISPLAY_PENDING 1 /** the surface should be shown, the video driver manipulates this */ |
2f560e361175
Quick hack to fix compilation. Testing and improvements welcome.
reimar
parents:
32467
diff
changeset
|
97 #define STATE_PREDICTION 2 /** the surface is needed for prediction, the codec manipulates this */ |
2f560e361175
Quick hack to fix compilation. Testing and improvements welcome.
reimar
parents:
32467
diff
changeset
|
98 #define STATE_OSD_SOURCE 4 /** the surface is needed for subpicture rendering */ |
2f560e361175
Quick hack to fix compilation. Testing and improvements welcome.
reimar
parents:
32467
diff
changeset
|
99 int state; |
2f560e361175
Quick hack to fix compilation. Testing and improvements welcome.
reimar
parents:
32467
diff
changeset
|
100 void *p_osd_target_surface_render; |
33197 | 101 mp_image_t *mpi; |
33247
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
102 }; |
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
103 static struct xvmc_render *surface_render; |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
104 |
33247
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
105 static struct xvmc_render *p_render_surface_to_show = NULL; |
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
106 static struct xvmc_render *p_render_surface_visible = NULL; |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
107 |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
108 //display queue, kinda render ahead |
33247
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
109 static struct xvmc_render *show_queue[MAX_SURFACES]; |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
110 static int free_element; |
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
111 |
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
112 |
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
113 static void (*draw_osd_fnc)(int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride); |
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
114 static void (*clear_osd_fnc)(int x0,int y0, int w,int h); |
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
115 static void (*init_osd_fnc)(void); |
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
116 |
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
117 static void draw_osd_AI44(int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride); |
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
118 static void draw_osd_IA44(int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride); |
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
119 static void clear_osd_subpic(int x0,int y0, int w,int h); |
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
120 static void init_osd_yuv_pal(void); |
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
121 |
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
122 |
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
123 static const struct{ |
28642 | 124 int id;//id as xvimages or as mplayer RGB|{8,15,16,24,32} |
30933
d3dc11568f7e
Use (void) instead of () to indicate a parameterless function, fixes:
diego
parents:
30612
diff
changeset
|
125 void (* init_func_ptr)(void); |
33208
60448677bf63
Specific function argument types for function pointers.
reimar
parents:
33207
diff
changeset
|
126 void (* draw_func_ptr)(int, int, int, int, unsigned char *, unsigned char *, int); |
60448677bf63
Specific function argument types for function pointers.
reimar
parents:
33207
diff
changeset
|
127 void (* clear_func_ptr)(int, int, int, int); |
28642 | 128 } osd_render[]={ |
129 {0x34344149,init_osd_yuv_pal,draw_osd_AI44,clear_osd_subpic}, | |
130 {0x34344941,init_osd_yuv_pal,draw_osd_IA44,clear_osd_subpic}, | |
131 {0,NULL,NULL,NULL} | |
132 }; | |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
133 |
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
134 static void xvmc_free(void); |
22257
f979aa12d8cc
Don't free and then allocate surfaces when config() is called again with same resolution and format.
iive
parents:
22246
diff
changeset
|
135 static void xvmc_clean_surfaces(void); |
28232
8df85ad26746
Add missing 'void' keyword to parameterless function declarations.
diego
parents:
28202
diff
changeset
|
136 static int count_free_surfaces(void); |
33247
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
137 static struct xvmc_render *find_free_surface(void); |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
138 |
25216 | 139 static const vo_info_t info = { |
28642 | 140 "XVideo Motion Compensation", |
141 "xvmc", | |
142 "Ivan Kalvachev <iive@users.sf.net>", | |
143 "" | |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
144 }; |
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
145 |
25220
c9e9ac2008c2
Mark the vo_functions_t definitions as const where possible.
reimar
parents:
25216
diff
changeset
|
146 const LIBVO_EXTERN(xvmc); |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
147 |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
148 //shm stuff from vo_xv |
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
149 #ifdef HAVE_SHM |
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
150 static XShmSegmentInfo Shminfo; |
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
151 static int Shmem_Flag; |
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
152 #endif |
33209 | 153 static XvImage * xvimage; |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
154 |
33247
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
155 static void add_state(struct xvmc_render *cur_render, int flags) |
33195
2f560e361175
Quick hack to fix compilation. Testing and improvements welcome.
reimar
parents:
32467
diff
changeset
|
156 { |
33197 | 157 int bit; |
33247
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
158 if (cur_render->mpi) { |
33197 | 159 for (bit = 1; flags >= bit; bit <<= 1) { |
33247
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
160 if (flags & ~cur_render->state & bit) |
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
161 cur_render->mpi->usage_count++; |
33197 | 162 } |
163 } | |
33247
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
164 cur_render->state |= flags; |
33197 | 165 } |
166 | |
33247
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
167 static void remove_state(struct xvmc_render *cur_render, int flags) |
33197 | 168 { |
169 int bit; | |
33247
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
170 if (cur_render->mpi) { |
33197 | 171 for (bit = 1; flags >= bit; bit <<= 1) { |
33247
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
172 if (flags & cur_render->state & bit) |
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
173 cur_render->mpi->usage_count--; |
33197 | 174 } |
175 } | |
33247
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
176 cur_render->state &= ~flags; |
33197 | 177 } |
178 | |
33247
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
179 static int in_use(struct xvmc_render *cur_render) |
33197 | 180 { |
33247
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
181 return cur_render->state || (cur_render->mpi && cur_render->mpi->usage_count); |
33197 | 182 } |
183 | |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
184 static void allocate_xvimage(int xvimage_width,int xvimage_height,int xv_format) |
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
185 { |
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
186 /* |
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
187 * allocate XvImages. FIXME: no error checking, without |
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
188 * mit-shm this will bomb... trzing to fix ::atmos |
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
189 */ |
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
190 #ifdef HAVE_SHM |
28642 | 191 if ( mLocalDisplay && XShmQueryExtension( mDisplay ) ) Shmem_Flag = 1; |
192 else | |
193 { | |
194 Shmem_Flag = 0; | |
28645 | 195 mp_msg(MSGT_VO,MSGL_WARN, "Shared memory not supported\nReverting to normal Xv\n" ); |
28642 | 196 } |
197 if ( Shmem_Flag ) | |
198 { | |
199 xvimage = (XvImage *) XvShmCreateImage(mDisplay, xv_port, xv_format, | |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
200 NULL, xvimage_width, xvimage_height, &Shminfo); |
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
201 |
28642 | 202 Shminfo.shmid = shmget(IPC_PRIVATE, xvimage->data_size, IPC_CREAT | 0777); |
203 Shminfo.shmaddr = (char *) shmat(Shminfo.shmid, 0, 0); | |
204 Shminfo.readOnly = False; | |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
205 |
28642 | 206 xvimage->data = Shminfo.shmaddr; |
207 XShmAttach(mDisplay, &Shminfo); | |
208 XSync(mDisplay, False); | |
209 shmctl(Shminfo.shmid, IPC_RMID, 0); | |
210 } | |
211 else | |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
212 #endif |
28642 | 213 { |
214 xvimage = (XvImage *) XvCreateImage(mDisplay, xv_port, xv_format, NULL, xvimage_width, xvimage_height); | |
215 xvimage->data = malloc(xvimage->data_size); | |
216 XSync(mDisplay,False); | |
217 } | |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
218 // memset(xvimage->data,128,xvimage->data_size); |
28642 | 219 return; |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
220 } |
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
221 |
28232
8df85ad26746
Add missing 'void' keyword to parameterless function declarations.
diego
parents:
28202
diff
changeset
|
222 static void deallocate_xvimage(void) |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
223 { |
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
224 #ifdef HAVE_SHM |
28642 | 225 if ( Shmem_Flag ) |
226 { | |
227 XShmDetach( mDisplay,&Shminfo ); | |
228 shmdt( Shminfo.shmaddr ); | |
229 } | |
230 else | |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
231 #endif |
28642 | 232 { |
233 free(xvimage->data); | |
234 } | |
235 XFree(xvimage); | |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
236 |
28642 | 237 XSync(mDisplay, False); |
238 return; | |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
239 } |
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
240 //end of vo_xv shm/xvimage code |
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
241 |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
242 static int xvmc_check_surface_format(uint32_t format, XvMCSurfaceInfo * surf_info){ |
28642 | 243 if ( format == IMGFMT_XVMC_IDCT_MPEG2 ){ |
244 if( surf_info->mc_type != (XVMC_IDCT|XVMC_MPEG_2) ) return -1; | |
245 if( surf_info->chroma_format != XVMC_CHROMA_FORMAT_420 ) return -1; | |
246 return 0; | |
247 } | |
248 if ( format == IMGFMT_XVMC_MOCO_MPEG2 ){ | |
249 if(surf_info->mc_type != XVMC_MPEG_2) return -1; | |
250 if(surf_info->chroma_format != XVMC_CHROMA_FORMAT_420) return -1; | |
251 return 0; | |
252 } | |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
253 return -1;//fail |
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
254 } |
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
255 |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
256 //print all info needed to add new format |
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
257 static void print_xvimage_format_values(XvImageFormatValues *xifv){ |
28643
fcc8d7b273d4
Cosmetics part2. Indent local variable definitions like the rest of the code.
iive
parents:
28642
diff
changeset
|
258 int i; |
28930
abdc27586f35
Fix warning: Add forgotten 'int' to variable declaration.
iive
parents:
28919
diff
changeset
|
259 const int msgl=MSGL_DBG4; |
28643
fcc8d7b273d4
Cosmetics part2. Indent local variable definitions like the rest of the code.
iive
parents:
28642
diff
changeset
|
260 |
28645 | 261 mp_msg(MSGT_VO,msgl,"Format_ID = 0x%X\n",xifv->id); |
28569
fb881ea1a985
whitespace cosmetics: Remove all tabs and trailing whitespace.
diego
parents:
28568
diff
changeset
|
262 |
28645 | 263 mp_msg(MSGT_VO,msgl," type = "); |
264 if(xifv->type == XvRGB) mp_msg(MSGT_VO,msgl,"RGB\n"); | |
265 else if(xifv->type == XvYUV) mp_msg(MSGT_VO,msgl,"YUV\n"); | |
266 else mp_msg(MSGT_VO,msgl,"Unknown\n"); | |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
267 |
28645 | 268 mp_msg(MSGT_VO,msgl," byte_order = "); |
269 if(xifv->byte_order == LSBFirst) mp_msg(MSGT_VO,msgl,"LSB First\n"); | |
35189
33e13b4ddfcb
Fix copy-paste error found by Coverity (yes, it really has a
reimar
parents:
33434
diff
changeset
|
270 else if(xifv->byte_order == MSBFirst) mp_msg(MSGT_VO,msgl,"MSB First\n"); |
28645 | 271 else mp_msg(MSGT_VO,msgl,"Unknown\n");//yes Linux support other types too |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
272 |
28645 | 273 mp_msg(MSGT_VO,msgl," guid = "); |
28642 | 274 for(i=0;i<16;i++) |
28645 | 275 mp_msg(MSGT_VO,msgl,"%02X ",(unsigned char)xifv->guid[i]); |
276 mp_msg(MSGT_VO,msgl,"\n"); | |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
277 |
28645 | 278 mp_msg(MSGT_VO,msgl," bits_per_pixel = %d\n",xifv->bits_per_pixel); |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
279 |
28645 | 280 mp_msg(MSGT_VO,msgl," format = "); |
281 if(xifv->format == XvPacked) mp_msg(MSGT_VO,msgl,"XvPacked\n"); | |
282 else if(xifv->format == XvPlanar) mp_msg(MSGT_VO,msgl,"XvPlanar\n"); | |
283 else mp_msg(MSGT_VO,msgl,"Unknown\n"); | |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
284 |
28645 | 285 mp_msg(MSGT_VO,msgl," num_planes = %d\n",xifv->num_planes); |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
286 |
28642 | 287 if(xifv->type == XvRGB){ |
28645 | 288 mp_msg(MSGT_VO,msgl," red_mask = %0X\n", xifv->red_mask); |
289 mp_msg(MSGT_VO,msgl," green_mask = %0X\n",xifv->green_mask); | |
290 mp_msg(MSGT_VO,msgl," blue_mask = %0X\n", xifv->blue_mask); | |
28642 | 291 } |
292 if(xifv->type == XvYUV){ | |
28645 | 293 mp_msg(MSGT_VO,msgl," y_sample_bits = %d\n u_sample_bits = %d\n v_sample_bits = %d\n", |
28642 | 294 xifv->y_sample_bits,xifv->u_sample_bits,xifv->v_sample_bits); |
28645 | 295 mp_msg(MSGT_VO,msgl," horz_y_period = %d\n horz_u_period = %d\n horz_v_period = %d\n", |
28642 | 296 xifv->horz_y_period,xifv->horz_u_period,xifv->horz_v_period); |
28645 | 297 mp_msg(MSGT_VO,msgl," vert_y_period = %d\n vert_u_period = %d\n vert_v_period = %d\n", |
28642 | 298 xifv->vert_y_period,xifv->vert_u_period,xifv->vert_v_period); |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
299 |
28645 | 300 mp_msg(MSGT_VO,msgl," component_order = "); |
28642 | 301 for(i=0;i<32;i++) |
302 if(xifv->component_order[i]>=32) | |
28645 | 303 mp_msg(MSGT_VO,msgl,"%c",xifv->component_order[i]); |
304 mp_msg(MSGT_VO,msgl,"\n"); | |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
305 |
28645 | 306 mp_msg(MSGT_VO,msgl," scanline = "); |
307 if(xifv->scanline_order == XvTopToBottom) mp_msg(MSGT_VO,msgl,"XvTopToBottom\n"); | |
308 else if(xifv->scanline_order == XvBottomToTop) mp_msg(MSGT_VO,msgl,"XvBottomToTop\n"); | |
309 else mp_msg(MSGT_VO,msgl,"Unknown\n"); | |
28642 | 310 } |
28645 | 311 mp_msg(MSGT_VO,msgl,"\n"); |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
312 } |
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
313 |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
314 // WARNING This function may changes xv_port and surface_info! |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
315 static int xvmc_find_surface_by_format(int format,int width,int height, |
28642 | 316 XvMCSurfaceInfo * surf_info,int query){ |
28643
fcc8d7b273d4
Cosmetics part2. Indent local variable definitions like the rest of the code.
iive
parents:
28642
diff
changeset
|
317 int rez; |
fcc8d7b273d4
Cosmetics part2. Indent local variable definitions like the rest of the code.
iive
parents:
28642
diff
changeset
|
318 XvAdaptorInfo * ai; |
fcc8d7b273d4
Cosmetics part2. Indent local variable definitions like the rest of the code.
iive
parents:
28642
diff
changeset
|
319 int num_adaptors,i; |
fcc8d7b273d4
Cosmetics part2. Indent local variable definitions like the rest of the code.
iive
parents:
28642
diff
changeset
|
320 unsigned long p; |
fcc8d7b273d4
Cosmetics part2. Indent local variable definitions like the rest of the code.
iive
parents:
28642
diff
changeset
|
321 int s,mc_surf_num; |
fcc8d7b273d4
Cosmetics part2. Indent local variable definitions like the rest of the code.
iive
parents:
28642
diff
changeset
|
322 XvMCSurfaceInfo * mc_surf_list; |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
323 |
28642 | 324 rez = XvQueryAdaptors(mDisplay,DefaultRootWindow(mDisplay),&num_adaptors,&ai); |
325 if( rez != Success ) return -1; | |
28644 | 326 mp_msg(MSGT_VO,MSGL_DBG3,"vo_xvmc: Querying %d adaptors\n",num_adaptors); |
28642 | 327 for(i=0; i<num_adaptors; i++) |
328 { | |
329 /* check if adaptor number has been specified */ | |
330 if (xv_adaptor != -1 && xv_adaptor != i) | |
331 continue; | |
31834
64ba1daa147a
various spelling fixes, found by the Debian QA tool 'lintian'
siretart
parents:
31316
diff
changeset
|
332 mp_msg(MSGT_VO,MSGL_DBG3,"vo_xvmc: Querying adaptor #%d\n",i); |
28642 | 333 if( ai[i].type == 0 ) continue;// we need at least dummy type! |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
334 //probing ports |
28642 | 335 for(p=ai[i].base_id; p<ai[i].base_id+ai[i].num_ports; p++) |
336 { | |
28644 | 337 mp_msg(MSGT_VO,MSGL_DBG3,"vo_xvmc: probing port #%ld\n",p); |
28642 | 338 mc_surf_list = XvMCListSurfaceTypes(mDisplay,p,&mc_surf_num); |
339 if( mc_surf_list == NULL || mc_surf_num == 0){ | |
28644 | 340 mp_msg(MSGT_VO,MSGL_DBG3,"vo_xvmc: No XvMC supported. \n"); |
28642 | 341 continue; |
342 } | |
28644 | 343 mp_msg(MSGT_VO,MSGL_DBG3,"vo_xvmc: XvMC list have %d surfaces\n",mc_surf_num); |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
344 //we have XvMC list! |
28642 | 345 for(s=0; s<mc_surf_num; s++) |
346 { | |
347 if( width > mc_surf_list[s].max_width ) continue; | |
348 if( height > mc_surf_list[s].max_height ) continue; | |
349 if( xvmc_check_surface_format(format,&mc_surf_list[s])<0 ) continue; | |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
350 //we have match! |
28642 | 351 /* respect the users wish */ |
352 if ( xv_port_request != 0 && xv_port_request != p ) | |
353 { | |
354 continue; | |
355 } | |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
356 |
28642 | 357 if(!query){ |
358 rez = XvGrabPort(mDisplay,p,CurrentTime); | |
359 if(rez != Success){ | |
28644 | 360 mp_msg(MSGT_VO,MSGL_DBG3,"vo_xvmc: Fail to grab port %ld\n",p); |
28642 | 361 continue; |
362 } | |
28645 | 363 mp_msg(MSGT_VO,MSGL_INFO,"vo_xvmc: Using Xv Adaptor #%d (%s)\n", i, ai[i].name); |
364 mp_msg(MSGT_VO,MSGL_INFO,"vo_xvmc: Port %ld grabed\n",p); | |
28642 | 365 xv_port = p; |
366 } | |
367 goto surface_found; | |
368 }//for mc surf | |
369 XFree(mc_surf_list);//if mc_surf_num==0 is list==NULL ? | |
370 }//for ports | |
371 }//for adaptors | |
372 XvFreeAdaptorInfo(ai); | |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
373 |
28645 | 374 if(!query) mp_msg(MSGT_VO,MSGL_ERR,"vo_xvmc: Could not find free matching surface. Sorry.\n"); |
28642 | 375 return 0; |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
376 |
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
377 // somebody know cleaner way to escape from 3 internal loops? |
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
378 surface_found: |
28642 | 379 XvFreeAdaptorInfo(ai); |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
380 |
28642 | 381 memcpy(surf_info,&mc_surf_list[s],sizeof(XvMCSurfaceInfo)); |
28644 | 382 mp_msg(MSGT_VO, query?MSGL_INFO:MSGL_DBG3, |
383 "vo_xvmc: Found matching surface with id=%X on %ld port at %d adapter\n", | |
28642 | 384 mc_surf_list[s].surface_type_id,p,i); |
385 return mc_surf_list[s].surface_type_id; | |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
386 } |
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
387 |
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
388 static uint32_t xvmc_draw_image(mp_image_t *mpi){ |
33247
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
389 struct xvmc_render *rndr; |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
390 |
28642 | 391 assert(mpi!=NULL); |
392 assert(mpi->flags &MP_IMGFLAG_DIRECT); | |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
393 // assert(mpi->flags &MP_IMGFLAGS_DRAWBACK); |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
394 |
33247
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
395 rndr = (struct xvmc_render*)mpi->priv; //there is copy in plane[2] |
28642 | 396 assert( rndr != NULL ); |
33247
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
397 assert( rndr->shared.xvmc_id == AV_XVMC_ID ); |
28644 | 398 mp_msg(MSGT_VO,MSGL_DBG4,"vo_xvmc: draw_image(show rndr=%p)\n",rndr); |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
399 // the surface have passed vf system without been skiped, it will be displayed |
33197 | 400 add_state(rndr, STATE_DISPLAY_PENDING); |
28642 | 401 p_render_surface_to_show = rndr; |
402 top_field_first = mpi->fields & MP_IMGFIELD_TOP_FIRST; | |
403 return VO_TRUE; | |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
404 } |
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
405 |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
15866
diff
changeset
|
406 static int preinit(const char *arg){ |
28643
fcc8d7b273d4
Cosmetics part2. Indent local variable definitions like the rest of the code.
iive
parents:
28642
diff
changeset
|
407 int xv_version,xv_release,xv_request_base,xv_event_base,xv_error_base; |
fcc8d7b273d4
Cosmetics part2. Indent local variable definitions like the rest of the code.
iive
parents:
28642
diff
changeset
|
408 int mc_eventBase,mc_errorBase; |
fcc8d7b273d4
Cosmetics part2. Indent local variable definitions like the rest of the code.
iive
parents:
28642
diff
changeset
|
409 int mc_ver,mc_rev; |
fcc8d7b273d4
Cosmetics part2. Indent local variable definitions like the rest of the code.
iive
parents:
28642
diff
changeset
|
410 strarg_t ck_src_arg = { 0, NULL }; |
fcc8d7b273d4
Cosmetics part2. Indent local variable definitions like the rest of the code.
iive
parents:
28642
diff
changeset
|
411 strarg_t ck_method_arg = { 0, NULL }; |
28828
56eee6ffba9b
Make data related to suboption parsing const in libvo
reimar
parents:
28645
diff
changeset
|
412 const opt_t subopts [] = |
28643
fcc8d7b273d4
Cosmetics part2. Indent local variable definitions like the rest of the code.
iive
parents:
28642
diff
changeset
|
413 { |
28642 | 414 /* name arg type arg var test */ |
30122
1772a5171ac7
Fix function declarations to avoid casting function pointers.
reimar
parents:
28930
diff
changeset
|
415 { "port", OPT_ARG_INT, &xv_port_request, int_pos }, |
1772a5171ac7
Fix function declarations to avoid casting function pointers.
reimar
parents:
28930
diff
changeset
|
416 { "adaptor", OPT_ARG_INT, &xv_adaptor, int_non_neg }, |
28642 | 417 { "ck", OPT_ARG_STR, &ck_src_arg, xv_test_ck }, |
418 { "ck-method", OPT_ARG_STR, &ck_method_arg, xv_test_ckm }, | |
419 { "benchmark", OPT_ARG_BOOL, &benchmark, NULL }, | |
420 { "sleep", OPT_ARG_BOOL, &use_sleep, NULL }, | |
421 { "queue", OPT_ARG_BOOL, &use_queue, NULL }, | |
422 { "bobdeint", OPT_ARG_BOOL, &bob_deinterlace, NULL }, | |
423 { NULL } | |
28643
fcc8d7b273d4
Cosmetics part2. Indent local variable definitions like the rest of the code.
iive
parents:
28642
diff
changeset
|
424 }; |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
425 |
28642 | 426 //Obtain display handler |
427 if (!vo_init()) return -1;//vo_xv | |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
428 |
28642 | 429 //XvMC is subdivision of XVideo |
430 if (Success != XvQueryExtension(mDisplay,&xv_version,&xv_release,&xv_request_base, | |
431 &xv_event_base,&xv_error_base) ){ | |
432 mp_msg(MSGT_VO,MSGL_ERR,"Sorry, Xv(MC) not supported by this X11 version/driver\n"); | |
433 mp_msg(MSGT_VO,MSGL_ERR,"********** Try with -vo x11 or -vo sdl ***********\n"); | |
434 return -1; | |
435 } | |
28645 | 436 mp_msg(MSGT_VO,MSGL_INFO,"vo_xvmc: X-Video extension %d.%d\n",xv_version,xv_release); |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
437 |
28642 | 438 if( True != XvMCQueryExtension(mDisplay,&mc_eventBase,&mc_errorBase) ){ |
28645 | 439 mp_msg(MSGT_VO,MSGL_ERR,"vo_xvmc: No X-Video MotionCompensation Extension on %s\n", |
28642 | 440 XDisplayName(NULL)); |
441 return -1; | |
442 } | |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
443 |
28642 | 444 if(Success == XvMCQueryVersion(mDisplay, &mc_ver, &mc_rev) ){ |
28645 | 445 mp_msg(MSGT_VO,MSGL_INFO,"vo_xvmc: X-Video MotionCompensation Extension version %i.%i\n", |
28569
fb881ea1a985
whitespace cosmetics: Remove all tabs and trailing whitespace.
diego
parents:
28568
diff
changeset
|
446 mc_ver,mc_rev); |
28642 | 447 } |
448 else{ | |
28645 | 449 mp_msg(MSGT_VO,MSGL_ERR,"vo_xvmc: Error querying version info!\n"); |
28642 | 450 return -1; |
451 } | |
452 surface_render = NULL; | |
453 xv_port = 0; | |
454 number_of_surfaces = 0; | |
455 subpicture_alloc = 0; | |
28569
fb881ea1a985
whitespace cosmetics: Remove all tabs and trailing whitespace.
diego
parents:
28568
diff
changeset
|
456 |
28642 | 457 benchmark = 0; //disable PutImageto allow faster display than screen refresh |
458 use_sleep = 0; | |
459 use_queue = 0; | |
460 bob_deinterlace = 0; | |
14742 | 461 |
28642 | 462 /* parse suboptions */ |
463 if ( subopt_parse( arg, subopts ) != 0 ) | |
464 { | |
465 return -1; | |
466 } | |
14742 | 467 |
28642 | 468 xv_setup_colorkeyhandling( ck_method_arg.str, ck_src_arg.str ); |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
469 |
28642 | 470 return 0; |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
471 } |
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
472 |
22246 | 473 static int config(uint32_t width, uint32_t height, |
28569
fb881ea1a985
whitespace cosmetics: Remove all tabs and trailing whitespace.
diego
parents:
28568
diff
changeset
|
474 uint32_t d_width, uint32_t d_height, |
fb881ea1a985
whitespace cosmetics: Remove all tabs and trailing whitespace.
diego
parents:
28568
diff
changeset
|
475 uint32_t flags, char *title, uint32_t format){ |
28643
fcc8d7b273d4
Cosmetics part2. Indent local variable definitions like the rest of the code.
iive
parents:
28642
diff
changeset
|
476 int i,mode_id,rez; |
fcc8d7b273d4
Cosmetics part2. Indent local variable definitions like the rest of the code.
iive
parents:
28642
diff
changeset
|
477 int numblocks,blocks_per_macroblock;//bpmb we have 6,8,12 |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
478 |
22246 | 479 //from vo_xv |
28643
fcc8d7b273d4
Cosmetics part2. Indent local variable definitions like the rest of the code.
iive
parents:
28642
diff
changeset
|
480 XVisualInfo vinfo; |
fcc8d7b273d4
Cosmetics part2. Indent local variable definitions like the rest of the code.
iive
parents:
28642
diff
changeset
|
481 XSetWindowAttributes xswa; |
fcc8d7b273d4
Cosmetics part2. Indent local variable definitions like the rest of the code.
iive
parents:
28642
diff
changeset
|
482 XWindowAttributes attribs; |
fcc8d7b273d4
Cosmetics part2. Indent local variable definitions like the rest of the code.
iive
parents:
28642
diff
changeset
|
483 unsigned long xswamask; |
fcc8d7b273d4
Cosmetics part2. Indent local variable definitions like the rest of the code.
iive
parents:
28642
diff
changeset
|
484 int depth; |
27377
d58d06eafe83
Change a bunch of X11-specific preprocessor directives.
diego
parents:
27343
diff
changeset
|
485 #ifdef CONFIG_XF86VM |
28643
fcc8d7b273d4
Cosmetics part2. Indent local variable definitions like the rest of the code.
iive
parents:
28642
diff
changeset
|
486 int vm = flags & VOFLAG_MODESWITCHING; |
22246 | 487 #endif |
488 //end of vo_xv | |
489 | |
28642 | 490 if( !IMGFMT_IS_XVMC(format) ) |
491 { | |
492 assert(0);//should never happen, abort on debug or | |
493 return 1;//return error on relese | |
494 } | |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
495 |
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
496 // Find free port that supports MC, by querying adaptors |
28642 | 497 if( xv_port != 0 || number_of_surfaces != 0 ){ |
498 if( height==image_height && width==image_width && image_format==format){ | |
499 xvmc_clean_surfaces(); | |
500 goto skip_surface_allocation; | |
501 } | |
502 xvmc_free(); | |
503 }; | |
504 numblocks=((width+15)/16)*((height+15)/16); | |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
505 // Find Supported Surface Type |
28642 | 506 mode_id = xvmc_find_surface_by_format(format,width,height,&surface_info,0);//false=1 to grab port, not query |
507 if ( mode_id == 0 ) | |
508 { | |
509 return -1; | |
510 } | |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
511 |
28642 | 512 rez = XvMCCreateContext(mDisplay, xv_port,mode_id,width,height,XVMC_DIRECT,&ctx); |
513 if( rez != Success ){ | |
28645 | 514 mp_msg(MSGT_VO,MSGL_ERR,"vo_xvmc: XvMCCreateContext failed with error %d\n",rez); |
28642 | 515 return -1; |
516 } | |
517 if( ctx.flags & XVMC_DIRECT ){ | |
28645 | 518 mp_msg(MSGT_VO,MSGL_INFO,"vo_xvmc: Allocated Direct Context\n"); |
28642 | 519 }else{ |
28645 | 520 mp_msg(MSGT_VO,MSGL_INFO,"vo_xvmc: Allocated Indirect Context!\n"); |
28642 | 521 } |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
522 |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
523 |
28642 | 524 blocks_per_macroblock = 6; |
525 if(surface_info.chroma_format == XVMC_CHROMA_FORMAT_422) | |
526 blocks_per_macroblock = 8; | |
527 if(surface_info.chroma_format == XVMC_CHROMA_FORMAT_444) | |
528 blocks_per_macroblock = 12; | |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
529 |
28642 | 530 rez = XvMCCreateBlocks(mDisplay,&ctx,numblocks*blocks_per_macroblock,&data_blocks); |
531 if( rez != Success ){ | |
532 XvMCDestroyContext(mDisplay,&ctx); | |
533 return -1; | |
534 } | |
28645 | 535 mp_msg(MSGT_VO,MSGL_INFO,"vo_xvmc: data_blocks allocated\n"); |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
536 |
28642 | 537 rez = XvMCCreateMacroBlocks(mDisplay,&ctx,numblocks,&mv_blocks); |
538 if( rez != Success ){ | |
539 XvMCDestroyBlocks(mDisplay,&data_blocks); | |
540 XvMCDestroyContext(mDisplay,&ctx); | |
541 return -1; | |
542 } | |
28645 | 543 mp_msg(MSGT_VO,MSGL_INFO,"vo_xvmc: mv_blocks allocated\n"); |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
544 |
28642 | 545 if(surface_render==NULL) |
33247
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
546 surface_render = malloc(MAX_SURFACES * sizeof(struct xvmc_render)); //easy mem debug |
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
547 memset(surface_render, 0, MAX_SURFACES * sizeof(struct xvmc_render)); |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
548 |
28642 | 549 for(i=0; i<MAX_SURFACES; i++){ |
550 rez=XvMCCreateSurface(mDisplay,&ctx,&surface_array[i]); | |
551 if( rez != Success ) | |
552 break; | |
33247
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
553 surface_render[i].shared.xvmc_id = AV_XVMC_ID; |
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
554 surface_render[i].shared.data_blocks = data_blocks.blocks; |
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
555 surface_render[i].shared.mv_blocks = mv_blocks.macro_blocks; |
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
556 surface_render[i].shared.allocated_mv_blocks = numblocks; |
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
557 surface_render[i].shared.allocated_data_blocks = numblocks*blocks_per_macroblock; |
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
558 surface_render[i].shared.idct = (surface_info.mc_type & XVMC_IDCT) == XVMC_IDCT; |
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
559 surface_render[i].shared.unsigned_intra = (surface_info.flags & XVMC_INTRA_UNSIGNED) == XVMC_INTRA_UNSIGNED; |
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
560 surface_render[i].shared.p_surface = &surface_array[i]; |
28644 | 561 mp_msg(MSGT_VO,MSGL_DBG4,"vo_xvmc: surface[%d] = %p .rndr=%p\n", |
562 i,&surface_array[i], &surface_render[i]); | |
28642 | 563 } |
564 number_of_surfaces = i; | |
565 if( number_of_surfaces < 4 ){// +2 I or P and +2 for B (to avoid visible motion drawing) | |
28645 | 566 mp_msg(MSGT_VO,MSGL_ERR,"vo_xvmc: Unable to allocate at least 4 Surfaces\n"); |
28642 | 567 uninit(); |
568 return -1; | |
569 } | |
28645 | 570 mp_msg(MSGT_VO,MSGL_INFO,"vo_xvmc: Motion Compensation context allocated - %d surfaces\n", |
28642 | 571 number_of_surfaces); |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
572 |
28642 | 573 //debug |
28645 | 574 mp_msg(MSGT_VO,MSGL_INFO,"vo_xvmc: idct=%d unsigned_intra=%d\n", |
28642 | 575 (surface_info.mc_type & XVMC_IDCT) == XVMC_IDCT, |
576 (surface_info.flags & XVMC_INTRA_UNSIGNED) == XVMC_INTRA_UNSIGNED); | |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
577 |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
578 // Find way to display OSD & subtitle |
28645 | 579 mp_msg(MSGT_VO,MSGL_INFO,"vo_xvmc: looking for OSD support\n"); |
28642 | 580 subpicture_mode = NO_SUBPICTURE; |
581 if(surface_info.flags & XVMC_OVERLAID_SURFACE) | |
582 subpicture_mode = OVERLAY_SUBPICTURE; | |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
583 |
28642 | 584 if(surface_info.subpicture_max_width != 0 && |
585 surface_info.subpicture_max_height != 0 ){ | |
586 int s,k,num_subpic; | |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
587 |
28642 | 588 XvImageFormatValues * xvfmv; |
589 xvfmv = XvMCListSubpictureTypes(mDisplay, xv_port, | |
590 surface_info.surface_type_id, &num_subpic); | |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
591 |
28642 | 592 if(num_subpic != 0 && xvfmv != NULL){ |
593 if( mp_msg_test(MSGT_VO,MSGL_DBG4) ){//Print all subpicture types for debug | |
594 for(s=0;s<num_subpic;s++) | |
595 print_xvimage_format_values(&xvfmv[s]); | |
596 } | |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
597 |
28642 | 598 for(s=0;s<num_subpic;s++){ |
599 for(k=0;osd_render[k].draw_func_ptr!=NULL;k++){ | |
600 if(xvfmv[s].id == osd_render[k].id) | |
601 { | |
602 init_osd_fnc = osd_render[k].init_func_ptr; | |
603 draw_osd_fnc = osd_render[k].draw_func_ptr; | |
604 clear_osd_fnc = osd_render[k].clear_func_ptr; | |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
605 |
28642 | 606 subpicture_mode = BLEND_SUBPICTURE; |
607 subpicture_info = xvfmv[s]; | |
28645 | 608 mp_msg(MSGT_VO,MSGL_INFO," Subpicture id 0x%08X\n",subpicture_info.id); |
28642 | 609 goto found_subpic; |
610 } | |
611 } | |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
612 } |
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
613 found_subpic: |
28642 | 614 XFree(xvfmv); |
615 } | |
616 //Blend2 supicture is always possible, blend1 only at backend | |
617 if( (subpicture_mode == BLEND_SUBPICTURE) && | |
618 (surface_info.flags & XVMC_BACKEND_SUBPICTURE) ) | |
619 { | |
620 subpicture_mode = BACKEND_SUBPICTURE; | |
621 } | |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
622 |
28642 | 623 } |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
624 |
28642 | 625 switch(subpicture_mode){ |
626 case NO_SUBPICTURE: | |
28645 | 627 mp_msg(MSGT_VO,MSGL_WARN,"vo_xvmc: No OSD support for this mode\n"); |
28642 | 628 break; |
629 case OVERLAY_SUBPICTURE: | |
28645 | 630 mp_msg(MSGT_VO,MSGL_WARN,"vo_xvmc: OSD support via color key tricks\n"); |
631 mp_msg(MSGT_VO,MSGL_WARN,"vo_xvmc: not yet implemented:(\n"); | |
28642 | 632 break; |
633 case BLEND_SUBPICTURE: | |
28645 | 634 mp_msg(MSGT_VO,MSGL_INFO,"vo_xvmc: OSD support by additional frontend rendering\n"); |
28642 | 635 break; |
636 case BACKEND_SUBPICTURE: | |
28645 | 637 mp_msg(MSGT_VO,MSGL_INFO,"vo_xvmc: OSD support by backend rendering (fast)\n"); |
638 mp_msg(MSGT_VO,MSGL_INFO,"vo_xvmc: Please send feedback to confirm that it works,otherwise send bugreport!\n"); | |
28642 | 639 break; |
640 } | |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
641 |
14742 | 642 //take keycolor value and choose method for handling it |
28642 | 643 if ( !vo_xv_init_colorkey() ) |
644 { | |
645 return -1; // bail out, colorkey setup failed | |
646 } | |
14742 | 647 |
28642 | 648 vo_xv_enable_vsync();//it won't break anything |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
649 |
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
650 //taken from vo_xv |
28642 | 651 image_height = height; |
652 image_width = width; | |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
653 |
22257
f979aa12d8cc
Don't free and then allocate surfaces when config() is called again with same resolution and format.
iive
parents:
22246
diff
changeset
|
654 skip_surface_allocation: |
f979aa12d8cc
Don't free and then allocate surfaces when config() is called again with same resolution and format.
iive
parents:
22246
diff
changeset
|
655 |
28642 | 656 { |
27377
d58d06eafe83
Change a bunch of X11-specific preprocessor directives.
diego
parents:
27343
diff
changeset
|
657 #ifdef CONFIG_XF86VM |
28642 | 658 if ( vm ) |
659 { | |
660 vo_vm_switch(); | |
661 } | |
662 // else | |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
663 #endif |
28642 | 664 XGetWindowAttributes(mDisplay, DefaultRootWindow(mDisplay), &attribs); |
665 depth=attribs.depth; | |
666 if (depth != 15 && depth != 16 && depth != 24 && depth != 32) depth = 24; | |
667 XMatchVisualInfo(mDisplay, mScreen, depth, TrueColor, &vinfo); | |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
668 |
33434 | 669 xswa.border_pixel = 0; |
670 xswamask = CWBorderPixel; | |
671 if (xv_ck_info.method == CK_METHOD_BACKGROUND){ | |
28642 | 672 xswa.background_pixel = xv_colorkey; |
33434 | 673 xswamask |= CWBackPixel; |
674 } | |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
675 |
28642 | 676 vo_x11_create_vo_window(&vinfo, vo_dx, vo_dy, d_width, d_height, flags, |
677 CopyFromParent, "xvmc", title); | |
678 XChangeWindowAttributes(mDisplay, vo_window, xswamask, &xswa); | |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
679 |
27377
d58d06eafe83
Change a bunch of X11-specific preprocessor directives.
diego
parents:
27343
diff
changeset
|
680 #ifdef CONFIG_XF86VM |
28642 | 681 if ( vm ) |
682 { | |
683 /* Grab the mouse pointer in our window */ | |
684 if(vo_grabpointer) | |
685 XGrabPointer(mDisplay, vo_window, True, 0, | |
686 GrabModeAsync, GrabModeAsync, | |
687 vo_window, None, CurrentTime ); | |
688 XSetInputFocus(mDisplay, vo_window, RevertToNone, CurrentTime); | |
689 } | |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
690 #endif |
28642 | 691 } |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
692 |
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
693 //end vo_xv |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
694 |
28642 | 695 /* store image dimesions for displaying */ |
696 p_render_surface_visible = NULL; | |
697 p_render_surface_to_show = NULL; | |
22246 | 698 |
28642 | 699 free_element = 0; |
700 first_frame = 1; | |
22246 | 701 |
28642 | 702 image_format=format; |
703 return 0; | |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
704 } |
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
705 |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
15866
diff
changeset
|
706 static int draw_frame(uint8_t *srcp[]){ |
28642 | 707 assert(0); |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
708 } |
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
709 |
28232
8df85ad26746
Add missing 'void' keyword to parameterless function declarations.
diego
parents:
28202
diff
changeset
|
710 static void init_osd_yuv_pal(void) { |
28642 | 711 char * palette; |
712 int rez; | |
713 int i,j; | |
714 int snum,seb; | |
715 int Y,U,V; | |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
716 |
28642 | 717 subpicture_clear_color = 0; |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
718 |
28642 | 719 if(subpicture.num_palette_entries > 0){ |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
720 |
28642 | 721 snum = subpicture.num_palette_entries; |
722 seb = subpicture.entry_bytes; | |
723 palette = malloc(snum*seb);//check fail | |
724 if(palette == NULL) return; | |
725 for(i=0; i<snum; i++){ | |
726 // 0-black max-white the other are gradients | |
727 Y = i*(1 << subpicture_info.y_sample_bits)/snum;//snum=2;->(0),(1*(1<<1)/2) | |
728 U = 1 << (subpicture_info.u_sample_bits - 1); | |
729 V = 1 << (subpicture_info.v_sample_bits - 1); | |
730 for(j=0; j<seb; j++) | |
731 switch(subpicture.component_order[j]){ | |
732 case 'U': palette[i*seb+j] = U; break; | |
733 case 'V': palette[i*seb+j] = V; break; | |
734 case 'Y': | |
735 default: | |
736 palette[i*seb+j] = Y; break; | |
737 } | |
738 } | |
739 rez = XvMCSetSubpicturePalette(mDisplay, &subpicture, palette); | |
740 if(rez!=Success){ | |
28645 | 741 mp_msg(MSGT_VO,MSGL_ERR,"vo_xvmc: Setting palette failed.\n"); |
28642 | 742 } |
743 free(palette); | |
744 } | |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
745 } |
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
746 |
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
747 static void clear_osd_subpic(int x0, int y0, int w, int h){ |
28643
fcc8d7b273d4
Cosmetics part2. Indent local variable definitions like the rest of the code.
iive
parents:
28642
diff
changeset
|
748 int rez; |
fcc8d7b273d4
Cosmetics part2. Indent local variable definitions like the rest of the code.
iive
parents:
28642
diff
changeset
|
749 |
28642 | 750 rez=XvMCClearSubpicture(mDisplay, &subpicture, |
751 x0, y0, w,h, | |
752 subpicture_clear_color); | |
753 if(rez != Success) | |
28645 | 754 mp_msg(MSGT_VO,MSGL_ERR,"vo_xvmc: XvMCClearSubpicture failed!\n"); |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
755 } |
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
756 |
28232
8df85ad26746
Add missing 'void' keyword to parameterless function declarations.
diego
parents:
28202
diff
changeset
|
757 static void OSD_init(void) { |
28643
fcc8d7b273d4
Cosmetics part2. Indent local variable definitions like the rest of the code.
iive
parents:
28642
diff
changeset
|
758 unsigned short osd_height, osd_width; |
fcc8d7b273d4
Cosmetics part2. Indent local variable definitions like the rest of the code.
iive
parents:
28642
diff
changeset
|
759 int rez; |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
760 |
28642 | 761 if(subpicture_alloc){ |
28644 | 762 mp_msg(MSGT_VO,MSGL_DBG4,"vo_xvmc: destroying subpicture\n"); |
28642 | 763 XvMCDestroySubpicture(mDisplay,&subpicture); |
764 deallocate_xvimage(); | |
765 subpicture_alloc = 0; | |
766 } | |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
767 |
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
768 /* if(surface_info.flags & XVMC_SUBPICTURE_INDEPENDENT_SCALING){ |
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
769 osd_width = vo_dwidth; |
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
770 osd_height = vo_dheight; |
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
771 }else*/ |
28642 | 772 { |
773 osd_width = image_width; | |
774 osd_height = image_height; | |
775 } | |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
776 |
28642 | 777 if(osd_width > surface_info.subpicture_max_width) |
778 osd_width = surface_info.subpicture_max_width; | |
779 if(osd_height > surface_info.subpicture_max_height) | |
780 osd_height = surface_info.subpicture_max_height; | |
781 if(osd_width == 0 || osd_height == 0) | |
782 return;//if called before window size is known | |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
783 |
28644 | 784 mp_msg(MSGT_VO,MSGL_DBG4,"vo_xvmc: creating subpicture (%d,%d) format %X\n", |
28642 | 785 osd_width,osd_height,subpicture_info.id); |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
786 |
28642 | 787 rez = XvMCCreateSubpicture(mDisplay,&ctx,&subpicture, |
788 osd_width,osd_height,subpicture_info.id); | |
789 if(rez != Success){ | |
790 subpicture_mode = NO_SUBPICTURE; | |
28645 | 791 mp_msg(MSGT_VO,MSGL_WARN,"vo_xvmc: Create Subpicture failed, OSD disabled\n"); |
28642 | 792 return; |
793 } | |
794 if( mp_msg_test(MSGT_VO,MSGL_DBG4) ){ | |
795 int i; | |
28645 | 796 mp_msg(MSGT_VO,MSGL_DBG4,"vo_xvmc: Created Subpicture:\n"); |
797 mp_msg(MSGT_VO,MSGL_DBG4," xvimage_id=0x%X\n",subpicture.xvimage_id); | |
798 mp_msg(MSGT_VO,MSGL_DBG4," width=%d\n",subpicture.width); | |
799 mp_msg(MSGT_VO,MSGL_DBG4," height=%d\n",subpicture.height); | |
800 mp_msg(MSGT_VO,MSGL_DBG4," num_palette_entries=0x%X\n",subpicture.num_palette_entries); | |
801 mp_msg(MSGT_VO,MSGL_DBG4," entry_bytes=0x%X\n",subpicture.entry_bytes); | |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
802 |
28645 | 803 mp_msg(MSGT_VO,MSGL_DBG4," component_order=\""); |
28642 | 804 for(i=0; i<4; i++) |
805 if(subpicture.component_order[i] >= 32) | |
28645 | 806 mp_msg(MSGT_VO,MSGL_DBG4,"%c", subpicture.component_order[i]); |
807 mp_msg(MSGT_VO,MSGL_DBG4,"\"\n"); | |
28642 | 808 } |
28569
fb881ea1a985
whitespace cosmetics: Remove all tabs and trailing whitespace.
diego
parents:
28568
diff
changeset
|
809 |
28642 | 810 //call init for the surface type |
811 init_osd_fnc();//init palete,clear color etc ... | |
28644 | 812 mp_msg(MSGT_VO,MSGL_DBG4,"vo_xvmc: clearing subpicture\n"); |
28642 | 813 clear_osd_fnc(0, 0, subpicture.width, subpicture.height); |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
814 |
28642 | 815 allocate_xvimage(subpicture.width, subpicture.height, subpicture_info.id); |
816 subpicture_alloc = 1; | |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
817 } |
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
818 |
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
819 static void draw_osd_IA44(int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride){ |
28643
fcc8d7b273d4
Cosmetics part2. Indent local variable definitions like the rest of the code.
iive
parents:
28642
diff
changeset
|
820 int ox,oy; |
fcc8d7b273d4
Cosmetics part2. Indent local variable definitions like the rest of the code.
iive
parents:
28642
diff
changeset
|
821 int rez; |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
822 |
28644 | 823 mp_msg(MSGT_VO,MSGL_DBG4,"vo_xvmc:composite AI44 subpicture (%d,%d - %d,%d)\n",x0,y0,w,h); |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
824 |
28642 | 825 for(ox=0; ox<w; ox++){ |
826 for(oy=0; oy<h; oy++){ | |
827 xvimage->data[oy*xvimage->width+ox] = (src[oy*stride+ox]>>4) | ((0-srca[oy*stride+ox])&0xf0); | |
828 } | |
829 } | |
830 rez = XvMCCompositeSubpicture(mDisplay, &subpicture, xvimage, 0, 0, | |
831 w,h,x0,y0); | |
832 if(rez != Success){ | |
28645 | 833 mp_msg(MSGT_VO,MSGL_WARN,"vo_xvmc: composite subpicture failed\n"); |
28642 | 834 assert(0); |
835 } | |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
836 } |
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
837 |
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
838 static void draw_osd_AI44(int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride){ |
28643
fcc8d7b273d4
Cosmetics part2. Indent local variable definitions like the rest of the code.
iive
parents:
28642
diff
changeset
|
839 int ox,oy; |
fcc8d7b273d4
Cosmetics part2. Indent local variable definitions like the rest of the code.
iive
parents:
28642
diff
changeset
|
840 int rez; |
fcc8d7b273d4
Cosmetics part2. Indent local variable definitions like the rest of the code.
iive
parents:
28642
diff
changeset
|
841 |
28644 | 842 mp_msg(MSGT_VO,MSGL_DBG4,"vo_xvmc:composite AI44 subpicture (%d,%d - %d,%d)\n",x0,y0,w,h); |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
843 |
28642 | 844 for(ox=0; ox<w; ox++){ |
845 for(oy=0; oy<h; oy++){ | |
846 xvimage->data[oy*xvimage->width+ox] = (src[oy*stride+ox]&0xf0) | (((0-srca[oy*stride+ox])>>4)&0xf); | |
847 } | |
848 } | |
849 rez = XvMCCompositeSubpicture(mDisplay, &subpicture, xvimage, 0, 0, | |
850 w,h,x0,y0); | |
851 if(rez != Success){ | |
28645 | 852 mp_msg(MSGT_VO,MSGL_WARN,"vo_xvmc: composite subpicture failed\n"); |
28642 | 853 assert(0); |
854 } | |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
855 } |
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
856 |
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
857 static void draw_osd(void){ |
33247
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
858 struct xvmc_render *osd_rndr; |
28643
fcc8d7b273d4
Cosmetics part2. Indent local variable definitions like the rest of the code.
iive
parents:
28642
diff
changeset
|
859 int osd_has_changed; |
fcc8d7b273d4
Cosmetics part2. Indent local variable definitions like the rest of the code.
iive
parents:
28642
diff
changeset
|
860 int have_osd_to_draw; |
fcc8d7b273d4
Cosmetics part2. Indent local variable definitions like the rest of the code.
iive
parents:
28642
diff
changeset
|
861 int rez; |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
862 |
28644 | 863 mp_msg(MSGT_VO,MSGL_DBG4,"vo_xvmc: draw_osd ,OSD_mode=%d, surface_to_show=%p\n", |
28642 | 864 subpicture_mode,p_render_surface_to_show); |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
865 |
28642 | 866 if(subpicture_mode == BLEND_SUBPICTURE || |
867 subpicture_mode == BACKEND_SUBPICTURE ){ | |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
868 |
28642 | 869 if(!subpicture_alloc) //allocate subpicture when dimensions are known |
870 OSD_init(); | |
871 if(!subpicture_alloc) | |
872 return;//dimensions still unknown. | |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
873 |
28642 | 874 osd_has_changed = vo_update_osd(subpicture.width, subpicture.height); |
875 have_osd_to_draw = vo_osd_check_range_update(0, 0, subpicture.width, | |
28569
fb881ea1a985
whitespace cosmetics: Remove all tabs and trailing whitespace.
diego
parents:
28568
diff
changeset
|
876 subpicture.height); |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
877 |
28642 | 878 if(!have_osd_to_draw) |
879 return;//nothing to draw,no subpic, no blend | |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
880 |
28642 | 881 if(osd_has_changed){ |
882 //vo_remove_text(subpicture.width, subpicture.height,clear_osd_fnc) | |
883 clear_osd_fnc(0,0,subpicture.width,subpicture.height); | |
884 vo_draw_text(subpicture.width, subpicture.height, draw_osd_fnc); | |
885 } | |
886 XvMCSyncSubpicture(mDisplay,&subpicture);//todo usleeep wait! | |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
887 |
28642 | 888 if(subpicture_mode == BLEND_SUBPICTURE){ |
889 osd_rndr = find_free_surface(); | |
890 if(osd_rndr == NULL) | |
891 return;// no free surface to draw OSD in | |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
892 |
28642 | 893 rez = XvMCBlendSubpicture2(mDisplay, |
33247
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
894 p_render_surface_to_show->shared.p_surface, osd_rndr->shared.p_surface, |
28642 | 895 &subpicture, |
896 0, 0, subpicture.width, subpicture.height, | |
897 0, 0, image_width, image_height); | |
898 if(rez!=Success){ | |
28645 | 899 mp_msg(MSGT_VO,MSGL_WARN,"vo_xvmc: BlendSubpicture failed rez=%d\n",rez); |
28642 | 900 assert(0); |
901 return; | |
902 } | |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
903 // XvMCFlushSurface(mDisplay,osd_rndr->p_surface);//fixme- should I? |
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
904 |
28642 | 905 //When replaceing the surface with osd one, save the flags too! |
33247
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
906 osd_rndr->shared.picture_structure = p_render_surface_to_show->shared.picture_structure; |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
907 //add more if needed osd_rndr-> = p_render_surface_to_show->; |
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
908 |
33197 | 909 add_state(p_render_surface_to_show, STATE_OSD_SOURCE); |
910 remove_state(p_render_surface_to_show, STATE_DISPLAY_PENDING); | |
33247
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
911 p_render_surface_to_show->p_osd_target_surface_render = osd_rndr; |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
912 |
28642 | 913 p_render_surface_to_show = osd_rndr; |
33197 | 914 add_state(p_render_surface_to_show, STATE_DISPLAY_PENDING); |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
915 |
28644 | 916 mp_msg(MSGT_VO,MSGL_DBG4,"vo_xvmc:draw_osd: surface_to_show changed to %p\n",osd_rndr); |
28642 | 917 }//endof if(BLEND) |
918 if(subpicture_mode == BACKEND_SUBPICTURE){ | |
919 rez = XvMCBlendSubpicture(mDisplay, | |
33247
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
920 p_render_surface_to_show->shared.p_surface, |
28642 | 921 &subpicture, |
922 0, 0, subpicture.width, subpicture.height, | |
923 0, 0, image_width, image_height); | |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
924 |
28642 | 925 } |
28569
fb881ea1a985
whitespace cosmetics: Remove all tabs and trailing whitespace.
diego
parents:
28568
diff
changeset
|
926 |
28642 | 927 }//if(BLEND||BACKEND) |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
928 } |
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
929 |
10452 | 930 static void xvmc_sync_surface(XvMCSurface * srf){ |
28643
fcc8d7b273d4
Cosmetics part2. Indent local variable definitions like the rest of the code.
iive
parents:
28642
diff
changeset
|
931 int status,rez; |
fcc8d7b273d4
Cosmetics part2. Indent local variable definitions like the rest of the code.
iive
parents:
28642
diff
changeset
|
932 |
28642 | 933 rez = XvMCGetSurfaceStatus(mDisplay,srf,&status); |
934 assert(rez==Success); | |
935 if((status & XVMC_RENDERING) == 0) | |
936 return;//surface is already complete | |
937 if(use_sleep){ | |
938 rez = XvMCFlushSurface(mDisplay, srf); | |
939 assert(rez==Success); | |
10452 | 940 |
28642 | 941 do{ |
942 usec_sleep(1000);//1ms (may be 20ms on linux) | |
943 XvMCGetSurfaceStatus(mDisplay,srf,&status); | |
944 } while (status & XVMC_RENDERING); | |
945 return;//done | |
946 } | |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
947 |
28642 | 948 XvMCSyncSurface(mDisplay, srf); |
10452 | 949 } |
950 | |
33247
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
951 static void put_xvmc_image(struct xvmc_render *p_render_surface, |
28569
fb881ea1a985
whitespace cosmetics: Remove all tabs and trailing whitespace.
diego
parents:
28568
diff
changeset
|
952 int draw_ck){ |
28643
fcc8d7b273d4
Cosmetics part2. Indent local variable definitions like the rest of the code.
iive
parents:
28642
diff
changeset
|
953 int rez; |
fcc8d7b273d4
Cosmetics part2. Indent local variable definitions like the rest of the code.
iive
parents:
28642
diff
changeset
|
954 struct vo_rect src_rect, dst_rect; |
fcc8d7b273d4
Cosmetics part2. Indent local variable definitions like the rest of the code.
iive
parents:
28642
diff
changeset
|
955 int i; |
15060 | 956 |
28642 | 957 if(p_render_surface == NULL) |
958 return; | |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
959 |
28642 | 960 calc_src_dst_rects(image_width, image_height, &src_rect, &dst_rect, NULL, NULL); |
28569
fb881ea1a985
whitespace cosmetics: Remove all tabs and trailing whitespace.
diego
parents:
28568
diff
changeset
|
961 |
28642 | 962 if(draw_ck) |
963 vo_xv_draw_colorkey(dst_rect.left, dst_rect.top, dst_rect.width, dst_rect.height); | |
15102
1d3ba9fb75cd
incorporate all image drawing in single function and use fixed vo_xv_draw_colorkey() for proper key drawing.
iive
parents:
15060
diff
changeset
|
964 |
28642 | 965 if(benchmark) |
966 return; | |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
967 |
28642 | 968 for (i = 1; i <= bob_deinterlace + 1; i++) { |
969 int field = top_field_first ? i : i ^ 3; | |
33247
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
970 rez = XvMCPutSurface(mDisplay, p_render_surface->shared.p_surface, |
28642 | 971 vo_window, |
972 src_rect.left, src_rect.top, src_rect.width, src_rect.height, | |
973 dst_rect.left, dst_rect.top, dst_rect.width, dst_rect.height, | |
974 bob_deinterlace ? field : 3); | |
975 if(rez != Success){ | |
28645 | 976 mp_msg(MSGT_VO,MSGL_ERR,"vo_xvmc: PutSurface failer, critical error %d!\n",rez); |
28642 | 977 assert(0); |
978 } | |
979 } | |
980 XFlush(mDisplay); | |
15060 | 981 } |
982 | |
983 static void flip_page(void){ | |
28643
fcc8d7b273d4
Cosmetics part2. Indent local variable definitions like the rest of the code.
iive
parents:
28642
diff
changeset
|
984 int i,cfs; |
15060 | 985 |
28644 | 986 mp_msg(MSGT_VO,MSGL_DBG4,"vo_xvmc: flip_page show(rndr=%p)\n\n",p_render_surface_to_show); |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
987 |
28642 | 988 if(p_render_surface_to_show == NULL) return; |
33247
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
989 assert( p_render_surface_to_show->shared.xvmc_id == AV_XVMC_ID ); |
10452 | 990 //fixme assert( p_render_surface_to_show != p_render_surface_visible); |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
991 |
28642 | 992 if(use_queue){ |
993 // fill the queue until only n free surfaces remain | |
994 // after that start displaying | |
995 cfs = count_free_surfaces(); | |
996 show_queue[free_element++] = p_render_surface_to_show; | |
997 if(cfs > 3){//well have 3 free surfaces after add queue | |
998 if(free_element > 1)//a little voodoo magic | |
33247
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
999 xvmc_sync_surface(show_queue[0]->shared.p_surface); |
28642 | 1000 return; |
1001 } | |
1002 p_render_surface_to_show=show_queue[0]; | |
28644 | 1003 mp_msg(MSGT_VO,MSGL_DBG5,"vo_xvmc: flip_queue free_element=%d\n",free_element); |
28642 | 1004 free_element--; |
1005 for(i=0; i<free_element; i++){ | |
1006 show_queue[i] = show_queue[i+1]; | |
1007 } | |
1008 show_queue[free_element] = NULL; | |
1009 } | |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
1010 |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
1011 // make sure the rendering is done |
33247
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
1012 xvmc_sync_surface(p_render_surface_to_show->shared.p_surface); |
10452 | 1013 |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
1014 //the visible surface won't be displayed anymore, mark it as free |
28642 | 1015 if(p_render_surface_visible != NULL) |
33197 | 1016 remove_state(p_render_surface_visible, STATE_DISPLAY_PENDING); |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
1017 |
33195
2f560e361175
Quick hack to fix compilation. Testing and improvements welcome.
reimar
parents:
32467
diff
changeset
|
1018 //!!fixme assert(p_render_surface_to_show->state & STATE_DISPLAY_PENDING); |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
1019 |
28642 | 1020 //show it, displaying is always vsynced, so skip it for benchmark |
1021 put_xvmc_image(p_render_surface_to_show,first_frame); | |
1022 first_frame=0;//make sure we won't draw it anymore | |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
1023 |
28642 | 1024 p_render_surface_visible = p_render_surface_to_show; |
1025 p_render_surface_to_show = NULL; | |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
1026 } |
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
1027 |
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
1028 static void check_events(void){ |
28643
fcc8d7b273d4
Cosmetics part2. Indent local variable definitions like the rest of the code.
iive
parents:
28642
diff
changeset
|
1029 int e=vo_x11_check_events(mDisplay); |
fcc8d7b273d4
Cosmetics part2. Indent local variable definitions like the rest of the code.
iive
parents:
28642
diff
changeset
|
1030 |
28642 | 1031 if(e&VO_EVENT_RESIZE) |
1032 { | |
1033 e |= VO_EVENT_EXPOSE; | |
1034 } | |
1035 if ( e & VO_EVENT_EXPOSE ) | |
1036 { | |
1037 put_xvmc_image(p_render_surface_visible,1); | |
1038 } | |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
1039 } |
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
1040 |
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
1041 static void xvmc_free(void){ |
28643
fcc8d7b273d4
Cosmetics part2. Indent local variable definitions like the rest of the code.
iive
parents:
28642
diff
changeset
|
1042 int i; |
fcc8d7b273d4
Cosmetics part2. Indent local variable definitions like the rest of the code.
iive
parents:
28642
diff
changeset
|
1043 |
28642 | 1044 if( subpicture_alloc ){ |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
1045 |
28642 | 1046 XvMCDestroySubpicture(mDisplay,&subpicture); |
1047 deallocate_xvimage(); | |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
1048 |
28642 | 1049 subpicture_alloc = 0; |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
1050 |
28644 | 1051 mp_msg(MSGT_VO,MSGL_DBG4,"vo_xvmc: subpicture destroyed\n"); |
28642 | 1052 } |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
1053 |
28642 | 1054 if( number_of_surfaces ){ |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
1055 |
28642 | 1056 XvMCDestroyMacroBlocks(mDisplay,&mv_blocks); |
1057 XvMCDestroyBlocks(mDisplay,&data_blocks); | |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
1058 |
28642 | 1059 for(i=0; i<number_of_surfaces; i++) |
1060 { | |
1061 XvMCHideSurface(mDisplay,&surface_array[i]);//it doesn't hurt, I hope | |
1062 XvMCDestroySurface(mDisplay,&surface_array[i]); | |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
1063 |
33247
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
1064 if( (surface_render[i].state != 0) && |
28642 | 1065 (p_render_surface_visible != &surface_render[i]) ) |
28645 | 1066 mp_msg(MSGT_VO,MSGL_INFO,"vo_xvmc::uninit surface_render[%d].status=%d\n",i, |
33247
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
1067 surface_render[i].state); |
28642 | 1068 } |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
1069 |
33247
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
1070 memset(surface_render, 0, MAX_SURFACES * sizeof(struct xvmc_render)); //for debugging |
28642 | 1071 free(surface_render);surface_render=NULL; |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
1072 |
28642 | 1073 XvMCDestroyContext(mDisplay,&ctx); |
1074 number_of_surfaces = 0; | |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
1075 |
28644 | 1076 mp_msg(MSGT_VO,MSGL_DBG4,"vo_xvmc: Context sucessfuly freed\n"); |
28642 | 1077 } |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
1078 |
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
1079 |
28642 | 1080 if( xv_port !=0 ){ |
1081 XvUngrabPort(mDisplay,xv_port,CurrentTime); | |
1082 xv_port = 0; | |
28644 | 1083 mp_msg(MSGT_VO,MSGL_DBG4,"vo_xvmc: xv_port sucessfuly ungrabed\n"); |
28642 | 1084 } |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
1085 } |
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
1086 |
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
1087 static void uninit(void){ |
28644 | 1088 mp_msg(MSGT_VO,MSGL_DBG4,"vo_xvmc: uninit called\n"); |
28642 | 1089 xvmc_free(); |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
1090 //from vo_xv |
27377
d58d06eafe83
Change a bunch of X11-specific preprocessor directives.
diego
parents:
27343
diff
changeset
|
1091 #ifdef CONFIG_XF86VM |
28642 | 1092 vo_vm_close(); |
15211 | 1093 #endif |
28642 | 1094 vo_x11_uninit(); |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
1095 } |
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
1096 |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
15866
diff
changeset
|
1097 static int query_format(uint32_t format){ |
28643
fcc8d7b273d4
Cosmetics part2. Indent local variable definitions like the rest of the code.
iive
parents:
28642
diff
changeset
|
1098 uint32_t flags; |
fcc8d7b273d4
Cosmetics part2. Indent local variable definitions like the rest of the code.
iive
parents:
28642
diff
changeset
|
1099 XvMCSurfaceInfo qsurface_info; |
fcc8d7b273d4
Cosmetics part2. Indent local variable definitions like the rest of the code.
iive
parents:
28642
diff
changeset
|
1100 int mode_id; |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
1101 |
28644 | 1102 mp_msg(MSGT_VO,MSGL_DBG4,"vo_xvmc: query_format=%X\n",format); |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
1103 |
28642 | 1104 if(!IMGFMT_IS_XVMC(format)) return 0;// no caps supported |
31834
64ba1daa147a
various spelling fixes, found by the Debian QA tool 'lintian'
siretart
parents:
31316
diff
changeset
|
1105 mode_id = xvmc_find_surface_by_format(format, 16, 16, &qsurface_info, 1);//true=1 - querying |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
1106 |
28642 | 1107 if( mode_id == 0 ) return 0; |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
1108 |
28642 | 1109 flags = VFCAP_CSP_SUPPORTED | |
1110 VFCAP_CSP_SUPPORTED_BY_HW | | |
1111 VFCAP_ACCEPT_STRIDE; | |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
1112 |
28642 | 1113 if( (qsurface_info.subpicture_max_width != 0) && |
1114 (qsurface_info.subpicture_max_height != 0) ) | |
1115 flags|=VFCAP_OSD; | |
1116 return flags; | |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
1117 } |
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
1118 |
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
1119 |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
15866
diff
changeset
|
1120 static int draw_slice(uint8_t *image[], int stride[], |
28569
fb881ea1a985
whitespace cosmetics: Remove all tabs and trailing whitespace.
diego
parents:
28568
diff
changeset
|
1121 int w, int h, int x, int y){ |
33247
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
1122 struct xvmc_render *rndr; |
28643
fcc8d7b273d4
Cosmetics part2. Indent local variable definitions like the rest of the code.
iive
parents:
28642
diff
changeset
|
1123 int rez; |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
1124 |
28644 | 1125 mp_msg(MSGT_VO,MSGL_DBG4,"vo_xvmc: draw_slice y=%d\n",y); |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
1126 |
33247
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
1127 rndr = (struct xvmc_render*)image[2]; //this is copy of priv-ate |
28642 | 1128 assert( rndr != NULL ); |
33247
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
1129 assert( rndr->shared.xvmc_id == AV_XVMC_ID ); |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
1130 |
33247
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
1131 rez = XvMCRenderSurface(mDisplay,&ctx,rndr->shared.picture_structure, |
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
1132 rndr->shared.p_surface, |
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
1133 rndr->shared.p_past_surface, |
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
1134 rndr->shared.p_future_surface, |
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
1135 rndr->shared.flags, |
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
1136 rndr->shared.filled_mv_blocks_num,rndr->shared.start_mv_blocks_num, |
28642 | 1137 &mv_blocks,&data_blocks); |
1138 if(rez != Success) | |
1139 { | |
1140 int i; | |
28645 | 1141 mp_msg(MSGT_VO,MSGL_ERR,"vo_xvmc::slice: RenderSirface returned %d\n",rez); |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
1142 |
28645 | 1143 mp_msg(MSGT_VO,MSGL_ERR,"vo_xvmc::slice: pict=%d,flags=%x,start_blocks=%d,num_blocks=%d\n", |
33247
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
1144 rndr->shared.picture_structure,rndr->shared.flags,rndr->shared.start_mv_blocks_num, |
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
1145 rndr->shared.filled_mv_blocks_num); |
28645 | 1146 mp_msg(MSGT_VO,MSGL_ERR,"vo_xvmc::slice: this_surf=%p, past_surf=%p, future_surf=%p\n", |
33247
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
1147 rndr->shared.p_surface,rndr->shared.p_past_surface,rndr->shared.p_future_surface); |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
1148 |
33247
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
1149 for(i=0; i<rndr->shared.filled_mv_blocks_num; i++){ |
28642 | 1150 XvMCMacroBlock* testblock; |
1151 testblock = &mv_blocks.macro_blocks[i]; | |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
1152 |
28645 | 1153 mp_msg(MSGT_VO,MSGL_ERR,"vo_xvmc::slice: mv_block - x=%d,y=%d,mb_type=0x%x,mv_type=0x%x,mv_field_select=%d\n", |
28642 | 1154 testblock->x,testblock->y,testblock->macroblock_type, |
1155 testblock->motion_type,testblock->motion_vertical_field_select); | |
28645 | 1156 mp_msg(MSGT_VO,MSGL_ERR,"vo_xvmc::slice: dct_type=%d,data_index=0x%x,cbp=%d,pad0=%d\n", |
28642 | 1157 testblock->dct_type,testblock->index,testblock->coded_block_pattern, |
1158 testblock->pad0); | |
28645 | 1159 mp_msg(MSGT_VO,MSGL_ERR,"vo_xvmc::slice: PMV[0][0][0/1]=(%d,%d)\n", |
28642 | 1160 testblock->PMV[0][0][0],testblock->PMV[0][0][1]); |
1161 } | |
1162 } | |
1163 assert(rez==Success); | |
28644 | 1164 mp_msg(MSGT_VO,MSGL_DBG4,"vo_xvmc: flush surface\n"); |
33247
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
1165 rez = XvMCFlushSurface(mDisplay, rndr->shared.p_surface); |
28642 | 1166 assert(rez==Success); |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
1167 |
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
1168 // rndr->start_mv_blocks_num += rndr->filled_mv_blocks_num; |
33247
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
1169 rndr->shared.start_mv_blocks_num = 0; |
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
1170 rndr->shared.filled_mv_blocks_num = 0; |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
1171 |
33247
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
1172 rndr->shared.next_free_data_block_num = 0; |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
1173 |
28642 | 1174 return VO_TRUE; |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
1175 } |
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
1176 |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
1177 //XvMCHide hides the surface on next retrace, so |
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
1178 //check if the surface is not still displaying |
33247
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
1179 static void check_osd_source(struct xvmc_render *src_rndr) { |
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
1180 struct xvmc_render *osd_rndr; |
28643
fcc8d7b273d4
Cosmetics part2. Indent local variable definitions like the rest of the code.
iive
parents:
28642
diff
changeset
|
1181 int stat; |
fcc8d7b273d4
Cosmetics part2. Indent local variable definitions like the rest of the code.
iive
parents:
28642
diff
changeset
|
1182 |
28642 | 1183 //If this is source surface, check does the OSD rendering is compleate |
33247
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
1184 if(src_rndr->state & STATE_OSD_SOURCE){ |
31834
64ba1daa147a
various spelling fixes, found by the Debian QA tool 'lintian'
siretart
parents:
31316
diff
changeset
|
1185 mp_msg(MSGT_VO,MSGL_DBG4,"vo_xvmc: OSD surface=%p querying\n",src_rndr); |
33247
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
1186 osd_rndr = src_rndr->p_osd_target_surface_render; |
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
1187 XvMCGetSurfaceStatus(mDisplay, osd_rndr->shared.p_surface, &stat); |
28642 | 1188 if(!(stat & XVMC_RENDERING)) |
33197 | 1189 remove_state(src_rndr, STATE_OSD_SOURCE); |
28642 | 1190 } |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
1191 } |
28232
8df85ad26746
Add missing 'void' keyword to parameterless function declarations.
diego
parents:
28202
diff
changeset
|
1192 static int count_free_surfaces(void) { |
28643
fcc8d7b273d4
Cosmetics part2. Indent local variable definitions like the rest of the code.
iive
parents:
28642
diff
changeset
|
1193 int i,num; |
fcc8d7b273d4
Cosmetics part2. Indent local variable definitions like the rest of the code.
iive
parents:
28642
diff
changeset
|
1194 |
28642 | 1195 num=0; |
1196 for(i=0; i<number_of_surfaces; i++){ | |
1197 check_osd_source(&surface_render[i]); | |
33197 | 1198 if(!in_use(surface_render + i)) |
28642 | 1199 num++; |
1200 } | |
1201 return num; | |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
1202 } |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
1203 |
33247
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
1204 static struct xvmc_render *find_free_surface(void) { |
28643
fcc8d7b273d4
Cosmetics part2. Indent local variable definitions like the rest of the code.
iive
parents:
28642
diff
changeset
|
1205 int i,t; |
fcc8d7b273d4
Cosmetics part2. Indent local variable definitions like the rest of the code.
iive
parents:
28642
diff
changeset
|
1206 int stat; |
33247
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
1207 struct xvmc_render *visible_rndr; |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
1208 |
28642 | 1209 visible_rndr = NULL; |
1210 for(i=0; i<number_of_surfaces; i++){ | |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
1211 |
28642 | 1212 check_osd_source(&surface_render[i]); |
33197 | 1213 if( !in_use(surface_render + i)){ |
33247
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
1214 XvMCGetSurfaceStatus(mDisplay, surface_render[i].shared.p_surface,&stat); |
28642 | 1215 if( (stat & XVMC_DISPLAYING) == 0 ) |
1216 return &surface_render[i]; | |
1217 visible_rndr = &surface_render[i];// remember it, use as last resort | |
1218 } | |
1219 } | |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
1220 |
28642 | 1221 //all surfaces are busy, but there is one that will be free |
1222 //on next monitor retrace, we just have to wait | |
1223 if(visible_rndr != NULL){ | |
28645 | 1224 mp_msg(MSGT_VO,MSGL_INFO,"vo_xvmc: waiting retrace\n"); |
28642 | 1225 for(t=0;t<1000;t++){ |
1226 usec_sleep(1000);//1ms | |
33247
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
1227 XvMCGetSurfaceStatus(mDisplay, visible_rndr->shared.p_surface,&stat); |
28642 | 1228 if( (stat & XVMC_DISPLAYING) == 0 ) |
1229 return visible_rndr; | |
1230 } | |
1231 } | |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
1232 //todo remove when stable |
28645 | 1233 mp_msg(MSGT_VO,MSGL_WARN,"vo_xvmc: no free surfaces, this should not happen in g1\n"); |
28642 | 1234 for(i=0;i<number_of_surfaces;i++) |
33247
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
1235 mp_msg(MSGT_VO,MSGL_WARN,"vo_xvmc: surface[%d].state=%d\n",i,surface_render[i].state); |
28642 | 1236 return NULL; |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
1237 } |
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
1238 |
22257
f979aa12d8cc
Don't free and then allocate surfaces when config() is called again with same resolution and format.
iive
parents:
22246
diff
changeset
|
1239 static void xvmc_clean_surfaces(void){ |
28643
fcc8d7b273d4
Cosmetics part2. Indent local variable definitions like the rest of the code.
iive
parents:
28642
diff
changeset
|
1240 int i; |
22257
f979aa12d8cc
Don't free and then allocate surfaces when config() is called again with same resolution and format.
iive
parents:
22246
diff
changeset
|
1241 |
28642 | 1242 for(i=0; i<number_of_surfaces; i++){ |
22257
f979aa12d8cc
Don't free and then allocate surfaces when config() is called again with same resolution and format.
iive
parents:
22246
diff
changeset
|
1243 |
33197 | 1244 remove_state(surface_render + i, STATE_DISPLAY_PENDING | STATE_OSD_SOURCE); |
33247
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
1245 surface_render[i].p_osd_target_surface_render=NULL; |
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
1246 if(surface_render[i].state != 0){ |
28642 | 1247 mp_msg(MSGT_VO,MSGL_WARN,"vo_xvmc: surface[%d].state=%d\n", |
33247
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
1248 i,surface_render[i].state); |
28642 | 1249 } |
1250 } | |
1251 free_element=0;//clean up the queue | |
22257
f979aa12d8cc
Don't free and then allocate surfaces when config() is called again with same resolution and format.
iive
parents:
22246
diff
changeset
|
1252 } |
f979aa12d8cc
Don't free and then allocate surfaces when config() is called again with same resolution and format.
iive
parents:
22246
diff
changeset
|
1253 |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
1254 static uint32_t get_image(mp_image_t *mpi){ |
33247
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
1255 struct xvmc_render *rndr; |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
1256 |
28642 | 1257 rndr = find_free_surface(); |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
1258 |
28642 | 1259 if(rndr == NULL){ |
28645 | 1260 mp_msg(MSGT_VO,MSGL_ERR,"vo_xvmc: get_image failed\n"); |
28642 | 1261 return VO_FALSE; |
1262 } | |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
1263 |
33247
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
1264 assert(rndr->shared.start_mv_blocks_num == 0); |
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
1265 assert(rndr->shared.filled_mv_blocks_num == 0); |
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
1266 assert(rndr->shared.next_free_data_block_num == 0); |
10452 | 1267 |
28642 | 1268 mpi->flags |= MP_IMGFLAG_DIRECT; |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
1269 //keep strides 0 to avoid field manipulations |
28642 | 1270 mpi->stride[0] = 0; |
1271 mpi->stride[1] = 0; | |
33261
fc608eb62185
10l. Don't set stride info if it would panic the decoder.
iive
parents:
33247
diff
changeset
|
1272 mpi->stride[2] = 0; |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
1273 |
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
1274 // these are shared!! so watch out |
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
1275 // do call RenderSurface before overwriting |
28642 | 1276 mpi->planes[0] = (char*)data_blocks.blocks; |
1277 mpi->planes[1] = (char*)mv_blocks.macro_blocks; | |
1278 mpi->priv = | |
1279 mpi->planes[2] = (char*)rndr; | |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
1280 |
33247
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
1281 rndr->shared.picture_structure = 0; |
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
1282 rndr->shared.flags = 0; |
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
1283 rndr->state = 0; |
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
1284 rndr->mpi = mpi; |
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
1285 rndr->shared.start_mv_blocks_num = 0; |
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
1286 rndr->shared.filled_mv_blocks_num = 0; |
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
1287 rndr->shared.next_free_data_block_num = 0; |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
1288 |
28644 | 1289 mp_msg(MSGT_VO,MSGL_DBG4,"vo_xvmc: get_image: rndr=%p (surface=%p) \n", |
33247
a2483e1a3db3
Use xvmc_render struct to hold both xvmc_pix_fmt shared struct and the
iive
parents:
33209
diff
changeset
|
1290 rndr,rndr->shared.p_surface); |
28569
fb881ea1a985
whitespace cosmetics: Remove all tabs and trailing whitespace.
diego
parents:
28568
diff
changeset
|
1291 return VO_TRUE; |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
1292 } |
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
1293 |
33305
ddb45e9443ec
Remove the variable arguments from the libvo control() functions.
iive
parents:
33301
diff
changeset
|
1294 static int control(uint32_t request, void *data) |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
1295 { |
28642 | 1296 switch (request){ |
1297 case VOCTRL_GET_DEINTERLACE: | |
1298 *(int*)data = bob_deinterlace; | |
1299 return VO_TRUE; | |
1300 case VOCTRL_SET_DEINTERLACE: | |
1301 bob_deinterlace = *(int*)data; | |
1302 return VO_TRUE; | |
1303 case VOCTRL_QUERY_FORMAT: | |
1304 return query_format(*((uint32_t*)data)); | |
1305 case VOCTRL_DRAW_IMAGE: | |
1306 return xvmc_draw_image((mp_image_t *)data); | |
1307 case VOCTRL_GET_IMAGE: | |
1308 return get_image((mp_image_t *)data); | |
1309 //vo_xv | |
1310 case VOCTRL_GUISUPPORT: | |
1311 return VO_TRUE; | |
1312 case VOCTRL_ONTOP: | |
1313 vo_x11_ontop(); | |
1314 return VO_TRUE; | |
1315 case VOCTRL_FULLSCREEN: | |
1316 vo_x11_fullscreen(); | |
1317 // indended, fallthrough to update panscan on fullscreen/windowed switch | |
1318 case VOCTRL_SET_PANSCAN: | |
1319 if ( ( vo_fs && ( vo_panscan != vo_panscan_amount ) ) || ( !vo_fs && vo_panscan_amount ) ) | |
1320 { | |
1321 int old_y = vo_panscan_y; | |
1322 panscan_calc(); | |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
1323 |
28642 | 1324 if(old_y != vo_panscan_y) |
1325 { | |
1326 //this also draws the colorkey | |
1327 put_xvmc_image(p_render_surface_visible,1); | |
1328 } | |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
1329 } |
28642 | 1330 return VO_TRUE; |
1331 case VOCTRL_GET_PANSCAN: | |
1332 if ( !vo_config_count || !vo_fs ) return VO_FALSE; | |
1333 return VO_TRUE; | |
1334 case VOCTRL_SET_EQUALIZER: | |
1335 { | |
33301
899d817e56fc
Implement control() VOCTRL_SET/GET_EQUALIZER using a vf_equalize struct,
iive
parents:
33261
diff
changeset
|
1336 vf_equalizer_t *eq=data; |
899d817e56fc
Implement control() VOCTRL_SET/GET_EQUALIZER using a vf_equalize struct,
iive
parents:
33261
diff
changeset
|
1337 return vo_xv_set_eq(xv_port, eq->item, eq->value); |
28642 | 1338 } |
10698
7ab88b24cb81
OSD support, optinal queue, optional use of sleep(), and benchmark mode
iive
parents:
10608
diff
changeset
|
1339 |
28642 | 1340 case VOCTRL_GET_EQUALIZER: |
1341 { | |
33301
899d817e56fc
Implement control() VOCTRL_SET/GET_EQUALIZER using a vf_equalize struct,
iive
parents:
33261
diff
changeset
|
1342 vf_equalizer_t *eq=data; |
899d817e56fc
Implement control() VOCTRL_SET/GET_EQUALIZER using a vf_equalize struct,
iive
parents:
33261
diff
changeset
|
1343 return vo_xv_get_eq(xv_port, eq->item, &eq->value); |
28642 | 1344 } |
1345 case VOCTRL_UPDATE_SCREENINFO: | |
1346 update_xinerama_info(); | |
1347 return VO_TRUE; | |
1348 } | |
28643
fcc8d7b273d4
Cosmetics part2. Indent local variable definitions like the rest of the code.
iive
parents:
28642
diff
changeset
|
1349 return VO_NOTIMPL; |
10360
b79a4c15d081
Initial version of XVideo Motion Compensation video driver/render
iive
parents:
diff
changeset
|
1350 } |