Mercurial > mplayer.hg
annotate libvo/vo_vdpau.c @ 32927:edb972e22021
Fix memory leak in appInitStruct().
The NumberOf{Main,Bar,Menu}Items members actually don't hold the
number of items but the last index used. Therefore, the last item
won't get freed so far.
To set the correct "number" for the global external variable prior
to using it, the function appResetStruct() has been added and is used
in appInitStruct() as well.
author | ib |
---|---|
date | Thu, 03 Mar 2011 13:45:30 +0000 |
parents | 8d6e84f970be |
children | 899d817e56fc |
rev | line source |
---|---|
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1 /* |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
2 * VDPAU video output driver |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
3 * |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
4 * Copyright (C) 2008 NVIDIA |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
5 * |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
6 * This file is part of MPlayer. |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
7 * |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
8 * MPlayer is free software; you can redistribute it and/or modify |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
9 * it under the terms of the GNU General Public License as published by |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
10 * the Free Software Foundation; either version 2 of the License, or |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
11 * (at your option) any later version. |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
12 * |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
13 * MPlayer is distributed in the hope that it will be useful, |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
16 * GNU General Public License for more details. |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
17 * |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
18 * You should have received a copy of the GNU General Public License along |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
19 * with MPlayer; if not, write to the Free Software Foundation, Inc., |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
20 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
21 */ |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
22 |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
23 /** |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
24 * \defgroup VDPAU_Presentation VDPAU Presentation |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
25 * \ingroup Decoder |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
26 * |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
27 * Actual decoding and presentation are implemented here. |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
28 * All necessary frame information is collected through |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
29 * the "vdpau_render_state" structure after parsing all headers |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
30 * etc. in libavcodec for different codecs. |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
31 * |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
32 * @{ |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
33 */ |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
34 |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
35 #include <stdio.h> |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
36 |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
37 #include "config.h" |
32461 | 38 #include "sub/ass_mp.h" |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
39 #include "mp_msg.h" |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
40 #include "video_out.h" |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
41 #include "video_out_internal.h" |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
42 #include "x11_common.h" |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
43 #include "aspect.h" |
32466
9e627a1793b1
Move font_load.[ch], font_load_ft.c and osd_font.h from libvo to sub.
cigaes
parents:
32461
diff
changeset
|
44 #include "sub/font_load.h" |
32467 | 45 #include "sub/sub.h" |
32460 | 46 #include "sub/eosd.h" |
28638
7b16ccf423b4
Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents:
28611
diff
changeset
|
47 #include "subopt-helper.h" |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
48 |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
49 #include "libavcodec/vdpau.h" |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
50 |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
51 #include "libavutil/common.h" |
28729 | 52 #include "libavutil/mathematics.h" |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
53 |
28675 | 54 |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
55 static vo_info_t info = { |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
56 "VDPAU with X11", |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
57 "vdpau", |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
58 "Rajib Mahapatra <rmahapatra@nvidia.com> and others", |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
59 "" |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
60 }; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
61 |
30925
f8939d5b14b5
Mark some more LIBVO_EXTERN declarations as const where possible.
reimar
parents:
30758
diff
changeset
|
62 const LIBVO_EXTERN(vdpau) |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
63 |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
64 #define CHECK_ST_ERROR(message) \ |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
65 if (vdp_st != VDP_STATUS_OK) { \ |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
66 mp_msg(MSGT_VO, MSGL_ERR, "[vdpau] %s: %s\n", \ |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
67 message, vdp_get_error_string(vdp_st)); \ |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
68 return -1; \ |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
69 } |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
70 |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
71 #define CHECK_ST_WARNING(message) \ |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
72 if (vdp_st != VDP_STATUS_OK) \ |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
73 mp_msg(MSGT_VO, MSGL_WARN, "[vdpau] %s: %s\n", \ |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
74 message, vdp_get_error_string(vdp_st)); |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
75 |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
76 /* number of video and output surfaces */ |
30006
73d653fd865f
Improve VDPAU render performance by increasing number of output surfaces.
cehoyos
parents:
29861
diff
changeset
|
77 #define NUM_OUTPUT_SURFACES 3 |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
78 #define MAX_VIDEO_SURFACES 50 |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
79 |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
80 /* number of palette entries */ |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
81 #define PALETTE_SIZE 256 |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
82 |
28675 | 83 /* Initial maximum number of EOSD surfaces */ |
84 #define EOSD_SURFACES_INITIAL 512 | |
85 | |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
86 /* |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
87 * Global variable declaration - VDPAU specific |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
88 */ |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
89 |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
90 /* Declaration for all variables of win_x11_init_vdpau_procs() and |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
91 * win_x11_init_vdpau_flip_queue() functions |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
92 */ |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
93 static VdpDevice vdp_device; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
94 static VdpGetProcAddress *vdp_get_proc_address; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
95 |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
96 static VdpPresentationQueueTarget vdp_flip_target; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
97 static VdpPresentationQueue vdp_flip_queue; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
98 |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
99 static VdpDeviceDestroy *vdp_device_destroy; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
100 static VdpVideoSurfaceCreate *vdp_video_surface_create; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
101 static VdpVideoSurfaceDestroy *vdp_video_surface_destroy; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
102 |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
103 static VdpGetErrorString *vdp_get_error_string; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
104 |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
105 /* May be used in software filtering/postprocessing options |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
106 * in MPlayer (./mplayer -vf ..) if we copy video_surface data to |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
107 * system memory. |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
108 */ |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
109 static VdpVideoSurfacePutBitsYCbCr *vdp_video_surface_put_bits_y_cb_cr; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
110 static VdpOutputSurfacePutBitsNative *vdp_output_surface_put_bits_native; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
111 |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
112 static VdpOutputSurfaceCreate *vdp_output_surface_create; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
113 static VdpOutputSurfaceDestroy *vdp_output_surface_destroy; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
114 |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
115 /* VideoMixer puts video_surface data on displayable output_surface. */ |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
116 static VdpVideoMixerCreate *vdp_video_mixer_create; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
117 static VdpVideoMixerDestroy *vdp_video_mixer_destroy; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
118 static VdpVideoMixerRender *vdp_video_mixer_render; |
28638
7b16ccf423b4
Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents:
28611
diff
changeset
|
119 static VdpVideoMixerSetFeatureEnables *vdp_video_mixer_set_feature_enables; |
7b16ccf423b4
Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents:
28611
diff
changeset
|
120 static VdpVideoMixerSetAttributeValues *vdp_video_mixer_set_attribute_values; |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
121 |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
122 static VdpPresentationQueueTargetDestroy *vdp_presentation_queue_target_destroy; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
123 static VdpPresentationQueueCreate *vdp_presentation_queue_create; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
124 static VdpPresentationQueueDestroy *vdp_presentation_queue_destroy; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
125 static VdpPresentationQueueDisplay *vdp_presentation_queue_display; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
126 static VdpPresentationQueueBlockUntilSurfaceIdle *vdp_presentation_queue_block_until_surface_idle; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
127 static VdpPresentationQueueTargetCreateX11 *vdp_presentation_queue_target_create_x11; |
31763
550ffba86d9c
Make the VDPAU background black instead of the default green.
cehoyos
parents:
31317
diff
changeset
|
128 static VdpPresentationQueueSetBackgroundColor *vdp_presentation_queue_set_background_color; |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
129 |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
130 static VdpOutputSurfaceRenderOutputSurface *vdp_output_surface_render_output_surface; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
131 static VdpOutputSurfacePutBitsIndexed *vdp_output_surface_put_bits_indexed; |
28675 | 132 static VdpOutputSurfaceRenderBitmapSurface *vdp_output_surface_render_bitmap_surface; |
133 | |
134 static VdpBitmapSurfaceCreate *vdp_bitmap_surface_create; | |
135 static VdpBitmapSurfaceDestroy *vdp_bitmap_surface_destroy; | |
136 static VdpBitmapSurfacePutBitsNative *vdp_bitmap_surface_putbits_native; | |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
137 |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
138 static VdpDecoderCreate *vdp_decoder_create; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
139 static VdpDecoderDestroy *vdp_decoder_destroy; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
140 static VdpDecoderRender *vdp_decoder_render; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
141 |
28725
b9c26620ada7
Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents:
28724
diff
changeset
|
142 static VdpGenerateCSCMatrix *vdp_generate_csc_matrix; |
29735 | 143 static VdpPreemptionCallbackRegister *vdp_preemption_callback_register; |
28725
b9c26620ada7
Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents:
28724
diff
changeset
|
144 |
28696
fdc03572004c
Change code to actually work when NUM_OUTPUT_SURFACES is changed.
reimar
parents:
28689
diff
changeset
|
145 /* output_surfaces[NUM_OUTPUT_SURFACES] is misused for OSD. */ |
fdc03572004c
Change code to actually work when NUM_OUTPUT_SURFACES is changed.
reimar
parents:
28689
diff
changeset
|
146 #define osd_surface output_surfaces[NUM_OUTPUT_SURFACES] |
fdc03572004c
Change code to actually work when NUM_OUTPUT_SURFACES is changed.
reimar
parents:
28689
diff
changeset
|
147 static VdpOutputSurface output_surfaces[NUM_OUTPUT_SURFACES + 1]; |
28933
b0badbd680c6
Initial support for advanced VDPAU deinterlacers (software-decoded video
cehoyos
parents:
28892
diff
changeset
|
148 static VdpVideoSurface deint_surfaces[3]; |
29017
c9a2d95c580a
New vdpau deinterlacing code needs one reference surface less.
cehoyos
parents:
29016
diff
changeset
|
149 static mp_image_t *deint_mpi[2]; |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
150 static int output_surface_width, output_surface_height; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
151 |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
152 static VdpVideoMixer video_mixer; |
28638
7b16ccf423b4
Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents:
28611
diff
changeset
|
153 static int deint; |
28709
4e89476f8952
Do not forget the chosen deinterlacer for -vo vdpau.
cehoyos
parents:
28708
diff
changeset
|
154 static int deint_type; |
28933
b0badbd680c6
Initial support for advanced VDPAU deinterlacers (software-decoded video
cehoyos
parents:
28892
diff
changeset
|
155 static int deint_counter; |
28638
7b16ccf423b4
Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents:
28611
diff
changeset
|
156 static int pullup; |
7b16ccf423b4
Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents:
28611
diff
changeset
|
157 static float denoise; |
7b16ccf423b4
Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents:
28611
diff
changeset
|
158 static float sharpen; |
29727 | 159 static int colorspace; |
28944
cb18135338dd
Add chroma-deint option to vo vdpau (nochroma-deint speeds up deinterlacing).
cehoyos
parents:
28936
diff
changeset
|
160 static int chroma_deint; |
29756 | 161 static int force_mixer; |
28684 | 162 static int top_field_first; |
29752 | 163 static int flip; |
29781
508417d485d6
Add new VDPAU feature high-quality-scaling (and require newer library).
cehoyos
parents:
29757
diff
changeset
|
164 static int hqscaling; |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
165 |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
166 static VdpDecoder decoder; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
167 static int decoder_max_refs; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
168 |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
169 static VdpRect src_rect_vid; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
170 static VdpRect out_rect_vid; |
28598
4172d83194f2
Extend calc_src_dst_rects to also calculate the border values needed for
reimar
parents:
28582
diff
changeset
|
171 static int border_x, border_y; |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
172 |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
173 static struct vdpau_render_state surface_render[MAX_VIDEO_SURFACES]; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
174 static int surface_num; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
175 static int vid_surface_num; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
176 static uint32_t vid_width, vid_height; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
177 static uint32_t image_format; |
29066
ab51a502ebb5
Add support for IMGFMT_YUY2 and IMGFMT_UYVY to vo vdpau.
cehoyos
parents:
29065
diff
changeset
|
178 static VdpChromaType vdp_chroma_type; |
ab51a502ebb5
Add support for IMGFMT_YUY2 and IMGFMT_UYVY to vo vdpau.
cehoyos
parents:
29065
diff
changeset
|
179 static VdpYCbCrFormat vdp_pixel_format; |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
180 |
29735 | 181 static volatile int is_preempted; |
182 | |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
183 /* draw_osd */ |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
184 static unsigned char *index_data; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
185 static int index_data_size; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
186 static uint32_t palette[PALETTE_SIZE]; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
187 |
28675 | 188 // EOSD |
189 // Pool of surfaces | |
190 struct { | |
191 VdpBitmapSurface surface; | |
192 int w; | |
193 int h; | |
194 char in_use; | |
195 } *eosd_surfaces; | |
196 | |
197 // List of surfaces to be rendered | |
198 struct { | |
199 VdpBitmapSurface surface; | |
200 VdpRect source; | |
201 VdpRect dest; | |
202 VdpColor color; | |
203 } *eosd_targets; | |
204 | |
205 static int eosd_render_count; | |
206 static int eosd_surface_count; | |
207 | |
28725
b9c26620ada7
Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents:
28724
diff
changeset
|
208 // Video equalizer |
b9c26620ada7
Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents:
28724
diff
changeset
|
209 static VdpProcamp procamp; |
b9c26620ada7
Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents:
28724
diff
changeset
|
210 |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
211 /* |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
212 * X11 specific |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
213 */ |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
214 static int visible_buf; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
215 static int int_pause; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
216 |
28805
b382d065ba53
As for vo_gl, do not rely on draw_osd to render EOSD.
reimar
parents:
28804
diff
changeset
|
217 static void draw_eosd(void); |
b382d065ba53
As for vo_gl, do not rely on draw_osd to render EOSD.
reimar
parents:
28804
diff
changeset
|
218 |
29016
8e95cca7c58d
Stephen Warren reported that VDPAU deinterlacing did not work correctly.
cehoyos
parents:
29005
diff
changeset
|
219 static void push_deint_surface(VdpVideoSurface surface) |
8e95cca7c58d
Stephen Warren reported that VDPAU deinterlacing did not work correctly.
cehoyos
parents:
29005
diff
changeset
|
220 { |
8e95cca7c58d
Stephen Warren reported that VDPAU deinterlacing did not work correctly.
cehoyos
parents:
29005
diff
changeset
|
221 deint_surfaces[2] = deint_surfaces[1]; |
8e95cca7c58d
Stephen Warren reported that VDPAU deinterlacing did not work correctly.
cehoyos
parents:
29005
diff
changeset
|
222 deint_surfaces[1] = deint_surfaces[0]; |
8e95cca7c58d
Stephen Warren reported that VDPAU deinterlacing did not work correctly.
cehoyos
parents:
29005
diff
changeset
|
223 deint_surfaces[0] = surface; |
8e95cca7c58d
Stephen Warren reported that VDPAU deinterlacing did not work correctly.
cehoyos
parents:
29005
diff
changeset
|
224 } |
8e95cca7c58d
Stephen Warren reported that VDPAU deinterlacing did not work correctly.
cehoyos
parents:
29005
diff
changeset
|
225 |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
226 static void video_to_output_surface(void) |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
227 { |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
228 VdpTime dummy; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
229 VdpStatus vdp_st; |
28684 | 230 int i; |
29026
17e9f67f086b
Simplify vdpau deinterlacing code and fix timing for deint=2.
cehoyos
parents:
29018
diff
changeset
|
231 if (vid_surface_num < 0) |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
232 return; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
233 |
29026
17e9f67f086b
Simplify vdpau deinterlacing code and fix timing for deint=2.
cehoyos
parents:
29018
diff
changeset
|
234 if (deint < 2 || deint_surfaces[0] == VDP_INVALID_HANDLE) |
17e9f67f086b
Simplify vdpau deinterlacing code and fix timing for deint=2.
cehoyos
parents:
29018
diff
changeset
|
235 push_deint_surface(surface_render[vid_surface_num].surface); |
17e9f67f086b
Simplify vdpau deinterlacing code and fix timing for deint=2.
cehoyos
parents:
29018
diff
changeset
|
236 |
28708 | 237 for (i = 0; i <= !!(deint > 1); i++) { |
28684 | 238 int field = VDP_VIDEO_MIXER_PICTURE_STRUCTURE_FRAME; |
239 VdpOutputSurface output_surface; | |
28724 | 240 if (i) { |
28805
b382d065ba53
As for vo_gl, do not rely on draw_osd to render EOSD.
reimar
parents:
28804
diff
changeset
|
241 draw_eosd(); |
28724 | 242 draw_osd(); |
28684 | 243 flip_page(); |
28724 | 244 } |
28684 | 245 if (deint) |
29026
17e9f67f086b
Simplify vdpau deinterlacing code and fix timing for deint=2.
cehoyos
parents:
29018
diff
changeset
|
246 field = (top_field_first == i) ^ (deint > 1) ? |
28684 | 247 VDP_VIDEO_MIXER_PICTURE_STRUCTURE_BOTTOM_FIELD: |
248 VDP_VIDEO_MIXER_PICTURE_STRUCTURE_TOP_FIELD; | |
249 output_surface = output_surfaces[surface_num]; | |
250 vdp_st = vdp_presentation_queue_block_until_surface_idle(vdp_flip_queue, | |
251 output_surface, | |
252 &dummy); | |
253 CHECK_ST_WARNING("Error when calling vdp_presentation_queue_block_until_surface_idle") | |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
254 |
28689 | 255 vdp_st = vdp_video_mixer_render(video_mixer, VDP_INVALID_HANDLE, 0, |
28933
b0badbd680c6
Initial support for advanced VDPAU deinterlacers (software-decoded video
cehoyos
parents:
28892
diff
changeset
|
256 field, 2, deint_surfaces + 1, |
b0badbd680c6
Initial support for advanced VDPAU deinterlacers (software-decoded video
cehoyos
parents:
28892
diff
changeset
|
257 deint_surfaces[0], |
b0badbd680c6
Initial support for advanced VDPAU deinterlacers (software-decoded video
cehoyos
parents:
28892
diff
changeset
|
258 1, &surface_render[vid_surface_num].surface, |
b0badbd680c6
Initial support for advanced VDPAU deinterlacers (software-decoded video
cehoyos
parents:
28892
diff
changeset
|
259 &src_rect_vid, |
28689 | 260 output_surface, |
261 NULL, &out_rect_vid, 0, NULL); | |
262 CHECK_ST_WARNING("Error when calling vdp_video_mixer_render") | |
29026
17e9f67f086b
Simplify vdpau deinterlacing code and fix timing for deint=2.
cehoyos
parents:
29018
diff
changeset
|
263 push_deint_surface(surface_render[vid_surface_num].surface); |
28684 | 264 } |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
265 } |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
266 |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
267 static void resize(void) |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
268 { |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
269 VdpStatus vdp_st; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
270 int i; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
271 struct vo_rect src_rect; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
272 struct vo_rect dst_rect; |
28598
4172d83194f2
Extend calc_src_dst_rects to also calculate the border values needed for
reimar
parents:
28582
diff
changeset
|
273 struct vo_rect borders; |
4172d83194f2
Extend calc_src_dst_rects to also calculate the border values needed for
reimar
parents:
28582
diff
changeset
|
274 calc_src_dst_rects(vid_width, vid_height, &src_rect, &dst_rect, &borders, NULL); |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
275 out_rect_vid.x0 = dst_rect.left; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
276 out_rect_vid.x1 = dst_rect.right; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
277 out_rect_vid.y0 = dst_rect.top; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
278 out_rect_vid.y1 = dst_rect.bottom; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
279 src_rect_vid.x0 = src_rect.left; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
280 src_rect_vid.x1 = src_rect.right; |
29752 | 281 src_rect_vid.y0 = flip ? src_rect.bottom : src_rect.top; |
282 src_rect_vid.y1 = flip ? src_rect.top : src_rect.bottom; | |
28598
4172d83194f2
Extend calc_src_dst_rects to also calculate the border values needed for
reimar
parents:
28582
diff
changeset
|
283 border_x = borders.left; |
4172d83194f2
Extend calc_src_dst_rects to also calculate the border values needed for
reimar
parents:
28582
diff
changeset
|
284 border_y = borders.top; |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
285 #ifdef CONFIG_FREETYPE |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
286 // adjust font size to display size |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
287 force_load_font = 1; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
288 #endif |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
289 vo_osd_changed(OSDTYPE_OSD); |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
290 |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
291 if (output_surface_width < vo_dwidth || output_surface_height < vo_dheight) { |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
292 if (output_surface_width < vo_dwidth) { |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
293 output_surface_width += output_surface_width >> 1; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
294 output_surface_width = FFMAX(output_surface_width, vo_dwidth); |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
295 } |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
296 if (output_surface_height < vo_dheight) { |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
297 output_surface_height += output_surface_height >> 1; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
298 output_surface_height = FFMAX(output_surface_height, vo_dheight); |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
299 } |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
300 // Creation of output_surfaces |
28696
fdc03572004c
Change code to actually work when NUM_OUTPUT_SURFACES is changed.
reimar
parents:
28689
diff
changeset
|
301 for (i = 0; i <= NUM_OUTPUT_SURFACES; i++) { |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
302 if (output_surfaces[i] != VDP_INVALID_HANDLE) |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
303 vdp_output_surface_destroy(output_surfaces[i]); |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
304 vdp_st = vdp_output_surface_create(vdp_device, VDP_RGBA_FORMAT_B8G8R8A8, |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
305 output_surface_width, output_surface_height, |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
306 &output_surfaces[i]); |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
307 CHECK_ST_WARNING("Error when calling vdp_output_surface_create") |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
308 mp_msg(MSGT_VO, MSGL_DBG2, "OUT CREATE: %u\n", output_surfaces[i]); |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
309 } |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
310 } |
29756 | 311 if (image_format == IMGFMT_BGRA) { |
312 vdp_st = vdp_output_surface_render_output_surface(output_surfaces[surface_num], | |
313 NULL, VDP_INVALID_HANDLE, | |
314 NULL, NULL, NULL, | |
315 VDP_OUTPUT_SURFACE_RENDER_ROTATE_0); | |
316 CHECK_ST_WARNING("Error when calling vdp_output_surface_render_output_surface") | |
317 vdp_st = vdp_output_surface_render_output_surface(output_surfaces[1 - surface_num], | |
318 NULL, VDP_INVALID_HANDLE, | |
319 NULL, NULL, NULL, | |
320 VDP_OUTPUT_SURFACE_RENDER_ROTATE_0); | |
321 CHECK_ST_WARNING("Error when calling vdp_output_surface_render_output_surface") | |
322 } else | |
29757 | 323 video_to_output_surface(); |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
324 if (visible_buf) |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
325 flip_page(); |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
326 } |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
327 |
29735 | 328 static void preemption_callback(VdpDevice device, void *context) |
329 { | |
330 mp_msg(MSGT_VO, MSGL_ERR, "[vdpau] Display preemption detected\n"); | |
331 is_preempted = 1; | |
332 } | |
333 | |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
334 /* Initialize vdp_get_proc_address, called from preinit() */ |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
335 static int win_x11_init_vdpau_procs(void) |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
336 { |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
337 VdpStatus vdp_st; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
338 |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
339 struct vdp_function { |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
340 const int id; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
341 void *pointer; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
342 }; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
343 |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
344 const struct vdp_function *dsc; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
345 |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
346 static const struct vdp_function vdp_func[] = { |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
347 {VDP_FUNC_ID_GET_ERROR_STRING, &vdp_get_error_string}, |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
348 {VDP_FUNC_ID_DEVICE_DESTROY, &vdp_device_destroy}, |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
349 {VDP_FUNC_ID_VIDEO_SURFACE_CREATE, &vdp_video_surface_create}, |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
350 {VDP_FUNC_ID_VIDEO_SURFACE_DESTROY, &vdp_video_surface_destroy}, |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
351 {VDP_FUNC_ID_VIDEO_SURFACE_PUT_BITS_Y_CB_CR, |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
352 &vdp_video_surface_put_bits_y_cb_cr}, |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
353 {VDP_FUNC_ID_OUTPUT_SURFACE_PUT_BITS_NATIVE, |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
354 &vdp_output_surface_put_bits_native}, |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
355 {VDP_FUNC_ID_OUTPUT_SURFACE_CREATE, &vdp_output_surface_create}, |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
356 {VDP_FUNC_ID_OUTPUT_SURFACE_DESTROY, &vdp_output_surface_destroy}, |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
357 {VDP_FUNC_ID_VIDEO_MIXER_CREATE, &vdp_video_mixer_create}, |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
358 {VDP_FUNC_ID_VIDEO_MIXER_DESTROY, &vdp_video_mixer_destroy}, |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
359 {VDP_FUNC_ID_VIDEO_MIXER_RENDER, &vdp_video_mixer_render}, |
28638
7b16ccf423b4
Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents:
28611
diff
changeset
|
360 {VDP_FUNC_ID_VIDEO_MIXER_SET_FEATURE_ENABLES, |
7b16ccf423b4
Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents:
28611
diff
changeset
|
361 &vdp_video_mixer_set_feature_enables}, |
7b16ccf423b4
Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents:
28611
diff
changeset
|
362 {VDP_FUNC_ID_VIDEO_MIXER_SET_ATTRIBUTE_VALUES, |
7b16ccf423b4
Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents:
28611
diff
changeset
|
363 &vdp_video_mixer_set_attribute_values}, |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
364 {VDP_FUNC_ID_PRESENTATION_QUEUE_TARGET_DESTROY, |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
365 &vdp_presentation_queue_target_destroy}, |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
366 {VDP_FUNC_ID_PRESENTATION_QUEUE_CREATE, &vdp_presentation_queue_create}, |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
367 {VDP_FUNC_ID_PRESENTATION_QUEUE_DESTROY, |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
368 &vdp_presentation_queue_destroy}, |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
369 {VDP_FUNC_ID_PRESENTATION_QUEUE_DISPLAY, |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
370 &vdp_presentation_queue_display}, |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
371 {VDP_FUNC_ID_PRESENTATION_QUEUE_BLOCK_UNTIL_SURFACE_IDLE, |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
372 &vdp_presentation_queue_block_until_surface_idle}, |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
373 {VDP_FUNC_ID_PRESENTATION_QUEUE_TARGET_CREATE_X11, |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
374 &vdp_presentation_queue_target_create_x11}, |
31763
550ffba86d9c
Make the VDPAU background black instead of the default green.
cehoyos
parents:
31317
diff
changeset
|
375 {VDP_FUNC_ID_PRESENTATION_QUEUE_SET_BACKGROUND_COLOR, |
550ffba86d9c
Make the VDPAU background black instead of the default green.
cehoyos
parents:
31317
diff
changeset
|
376 &vdp_presentation_queue_set_background_color}, |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
377 {VDP_FUNC_ID_OUTPUT_SURFACE_RENDER_OUTPUT_SURFACE, |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
378 &vdp_output_surface_render_output_surface}, |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
379 {VDP_FUNC_ID_OUTPUT_SURFACE_PUT_BITS_INDEXED, |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
380 &vdp_output_surface_put_bits_indexed}, |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
381 {VDP_FUNC_ID_DECODER_CREATE, &vdp_decoder_create}, |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
382 {VDP_FUNC_ID_DECODER_RENDER, &vdp_decoder_render}, |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
383 {VDP_FUNC_ID_DECODER_DESTROY, &vdp_decoder_destroy}, |
28675 | 384 {VDP_FUNC_ID_BITMAP_SURFACE_CREATE, &vdp_bitmap_surface_create}, |
385 {VDP_FUNC_ID_BITMAP_SURFACE_DESTROY, &vdp_bitmap_surface_destroy}, | |
386 {VDP_FUNC_ID_BITMAP_SURFACE_PUT_BITS_NATIVE, | |
387 &vdp_bitmap_surface_putbits_native}, | |
388 {VDP_FUNC_ID_OUTPUT_SURFACE_RENDER_BITMAP_SURFACE, | |
389 &vdp_output_surface_render_bitmap_surface}, | |
28725
b9c26620ada7
Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents:
28724
diff
changeset
|
390 {VDP_FUNC_ID_GENERATE_CSC_MATRIX, &vdp_generate_csc_matrix}, |
29735 | 391 {VDP_FUNC_ID_PREEMPTION_CALLBACK_REGISTER, |
392 &vdp_preemption_callback_register}, | |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
393 {0, NULL} |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
394 }; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
395 |
29861
356c49d60826
Do not dynamically load libvdpau.so.1, but link at compile time.
cehoyos
parents:
29843
diff
changeset
|
396 vdp_st = vdp_device_create_x11(mDisplay, mScreen, |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
397 &vdp_device, &vdp_get_proc_address); |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
398 if (vdp_st != VDP_STATUS_OK) { |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
399 mp_msg(MSGT_VO, MSGL_ERR, "[vdpau] Error when calling vdp_device_create_x11: %i\n", vdp_st); |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
400 return -1; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
401 } |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
402 |
29067
a560ab3e03e5
Make sure we do not accidentally use the vdp_get_error_string from the
reimar
parents:
29066
diff
changeset
|
403 vdp_get_error_string = NULL; |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
404 for (dsc = vdp_func; dsc->pointer; dsc++) { |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
405 vdp_st = vdp_get_proc_address(vdp_device, dsc->id, dsc->pointer); |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
406 if (vdp_st != VDP_STATUS_OK) { |
29713 | 407 mp_msg(MSGT_VO, MSGL_ERR, "[vdpau] Error when calling vdp_get_proc_address(function id %d): %s\n", |
408 dsc->id, vdp_get_error_string ? vdp_get_error_string(vdp_st) : "?"); | |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
409 return -1; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
410 } |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
411 } |
29735 | 412 vdp_st = vdp_preemption_callback_register(vdp_device, |
413 preemption_callback, NULL); | |
414 CHECK_ST_ERROR("Error when calling vdp_preemption_callback_register") | |
415 | |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
416 return 0; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
417 } |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
418 |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
419 /* Initialize vdpau_flip_queue, called from config() */ |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
420 static int win_x11_init_vdpau_flip_queue(void) |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
421 { |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
422 VdpStatus vdp_st; |
31767 | 423 // {0, 0, 0, 0} makes the video shine through any black window on top |
31766
1abfb1bfd2a6
Reduce probability that a window on top of VDPAU uses the overlay colour.
cehoyos
parents:
31765
diff
changeset
|
424 VdpColor vdp_bg = {0.01, 0.02, 0.03, 0}; |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
425 |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
426 vdp_st = vdp_presentation_queue_target_create_x11(vdp_device, vo_window, |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
427 &vdp_flip_target); |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
428 CHECK_ST_ERROR("Error when calling vdp_presentation_queue_target_create_x11") |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
429 |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
430 vdp_st = vdp_presentation_queue_create(vdp_device, vdp_flip_target, |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
431 &vdp_flip_queue); |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
432 CHECK_ST_ERROR("Error when calling vdp_presentation_queue_create") |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
433 |
31763
550ffba86d9c
Make the VDPAU background black instead of the default green.
cehoyos
parents:
31317
diff
changeset
|
434 vdp_st = vdp_presentation_queue_set_background_color(vdp_flip_queue, &vdp_bg); |
550ffba86d9c
Make the VDPAU background black instead of the default green.
cehoyos
parents:
31317
diff
changeset
|
435 CHECK_ST_ERROR("Error when calling vdp_presentation_queue_set_background_color") |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
436 return 0; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
437 } |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
438 |
29727 | 439 static int update_csc_matrix(void) |
440 { | |
441 VdpStatus vdp_st; | |
442 VdpCSCMatrix matrix; | |
443 static const VdpVideoMixerAttribute attributes[] = {VDP_VIDEO_MIXER_ATTRIBUTE_CSC_MATRIX}; | |
444 const void *attribute_values[] = {&matrix}; | |
29729 | 445 static const VdpColorStandard vdp_colors[] = {0, VDP_COLOR_STANDARD_ITUR_BT_601, VDP_COLOR_STANDARD_ITUR_BT_709, VDP_COLOR_STANDARD_SMPTE_240M}; |
446 static const char * const vdp_names[] = {NULL, "BT.601", "BT.709", "SMPTE-240M"}; | |
29727 | 447 int csp = colorspace; |
448 | |
449 if (!csp) | |
450 csp = vid_width >= 1280 || vid_height > 576 ? 2 : 1; | |
451 | |
452 mp_msg(MSGT_VO, MSGL_V, "[vdpau] Updating CSC matrix for %s\n", | |
453 vdp_names[csp]); | |
454 | |
455 vdp_st = vdp_generate_csc_matrix(&procamp, vdp_colors[csp], &matrix); | |
456 CHECK_ST_WARNING("Error when generating CSC matrix") | |
457 | |
458 vdp_st = vdp_video_mixer_set_attribute_values(video_mixer, 1, attributes, | |
459 attribute_values); | |
460 CHECK_ST_WARNING("Error when setting CSC matrix") | |
461 return VO_TRUE; | |
462 } | |
463 | |
29713 | 464 static int create_vdp_mixer(VdpChromaType vdp_chroma_type) |
465 { | |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
466 #define VDP_NUM_MIXER_PARAMETER 3 |
29781
508417d485d6
Add new VDPAU feature high-quality-scaling (and require newer library).
cehoyos
parents:
29757
diff
changeset
|
467 #define MAX_NUM_FEATURES 6 |
28638
7b16ccf423b4
Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents:
28611
diff
changeset
|
468 int i; |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
469 VdpStatus vdp_st; |
28638
7b16ccf423b4
Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents:
28611
diff
changeset
|
470 int feature_count = 0; |
7b16ccf423b4
Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents:
28611
diff
changeset
|
471 VdpVideoMixerFeature features[MAX_NUM_FEATURES]; |
7b16ccf423b4
Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents:
28611
diff
changeset
|
472 VdpBool feature_enables[MAX_NUM_FEATURES]; |
28658 | 473 static const VdpVideoMixerAttribute denoise_attrib[] = {VDP_VIDEO_MIXER_ATTRIBUTE_NOISE_REDUCTION_LEVEL}; |
28638
7b16ccf423b4
Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents:
28611
diff
changeset
|
474 const void * const denoise_value[] = {&denoise}; |
28658 | 475 static const VdpVideoMixerAttribute sharpen_attrib[] = {VDP_VIDEO_MIXER_ATTRIBUTE_SHARPNESS_LEVEL}; |
28638
7b16ccf423b4
Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents:
28611
diff
changeset
|
476 const void * const sharpen_value[] = {&sharpen}; |
28944
cb18135338dd
Add chroma-deint option to vo vdpau (nochroma-deint speeds up deinterlacing).
cehoyos
parents:
28936
diff
changeset
|
477 static const VdpVideoMixerAttribute skip_chroma_attrib[] = {VDP_VIDEO_MIXER_ATTRIBUTE_SKIP_CHROMA_DEINTERLACE}; |
cb18135338dd
Add chroma-deint option to vo vdpau (nochroma-deint speeds up deinterlacing).
cehoyos
parents:
28936
diff
changeset
|
478 const uint8_t skip_chroma_value = 1; |
cb18135338dd
Add chroma-deint option to vo vdpau (nochroma-deint speeds up deinterlacing).
cehoyos
parents:
28936
diff
changeset
|
479 const void * const skip_chroma_value_ptr[] = {&skip_chroma_value}; |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
480 static const VdpVideoMixerParameter parameters[VDP_NUM_MIXER_PARAMETER] = { |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
481 VDP_VIDEO_MIXER_PARAMETER_VIDEO_SURFACE_WIDTH, |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
482 VDP_VIDEO_MIXER_PARAMETER_VIDEO_SURFACE_HEIGHT, |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
483 VDP_VIDEO_MIXER_PARAMETER_CHROMA_TYPE |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
484 }; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
485 const void *const parameter_values[VDP_NUM_MIXER_PARAMETER] = { |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
486 &vid_width, |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
487 &vid_height, |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
488 &vdp_chroma_type |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
489 }; |
28934 | 490 features[feature_count++] = VDP_VIDEO_MIXER_FEATURE_DEINTERLACE_TEMPORAL; |
28708 | 491 if (deint == 4) |
28638
7b16ccf423b4
Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents:
28611
diff
changeset
|
492 features[feature_count++] = VDP_VIDEO_MIXER_FEATURE_DEINTERLACE_TEMPORAL_SPATIAL; |
7b16ccf423b4
Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents:
28611
diff
changeset
|
493 if (pullup) |
7b16ccf423b4
Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents:
28611
diff
changeset
|
494 features[feature_count++] = VDP_VIDEO_MIXER_FEATURE_INVERSE_TELECINE; |
7b16ccf423b4
Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents:
28611
diff
changeset
|
495 if (denoise) |
7b16ccf423b4
Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents:
28611
diff
changeset
|
496 features[feature_count++] = VDP_VIDEO_MIXER_FEATURE_NOISE_REDUCTION; |
7b16ccf423b4
Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents:
28611
diff
changeset
|
497 if (sharpen) |
7b16ccf423b4
Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents:
28611
diff
changeset
|
498 features[feature_count++] = VDP_VIDEO_MIXER_FEATURE_SHARPNESS; |
29781
508417d485d6
Add new VDPAU feature high-quality-scaling (and require newer library).
cehoyos
parents:
29757
diff
changeset
|
499 if (hqscaling) |
508417d485d6
Add new VDPAU feature high-quality-scaling (and require newer library).
cehoyos
parents:
29757
diff
changeset
|
500 features[feature_count++] = VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L1 + (hqscaling - 1); |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
501 |
28638
7b16ccf423b4
Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents:
28611
diff
changeset
|
502 vdp_st = vdp_video_mixer_create(vdp_device, feature_count, features, |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
503 VDP_NUM_MIXER_PARAMETER, |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
504 parameters, parameter_values, |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
505 &video_mixer); |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
506 CHECK_ST_ERROR("Error when calling vdp_video_mixer_create") |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
507 |
29713 | 508 for (i = 0; i < feature_count; i++) |
509 feature_enables[i] = VDP_TRUE; | |
28933
b0badbd680c6
Initial support for advanced VDPAU deinterlacers (software-decoded video
cehoyos
parents:
28892
diff
changeset
|
510 if (deint < 3) |
b0badbd680c6
Initial support for advanced VDPAU deinterlacers (software-decoded video
cehoyos
parents:
28892
diff
changeset
|
511 feature_enables[0] = VDP_FALSE; |
28638
7b16ccf423b4
Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents:
28611
diff
changeset
|
512 if (feature_count) |
7b16ccf423b4
Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents:
28611
diff
changeset
|
513 vdp_video_mixer_set_feature_enables(video_mixer, feature_count, features, feature_enables); |
7b16ccf423b4
Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents:
28611
diff
changeset
|
514 if (denoise) |
7b16ccf423b4
Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents:
28611
diff
changeset
|
515 vdp_video_mixer_set_attribute_values(video_mixer, 1, denoise_attrib, denoise_value); |
7b16ccf423b4
Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents:
28611
diff
changeset
|
516 if (sharpen) |
7b16ccf423b4
Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents:
28611
diff
changeset
|
517 vdp_video_mixer_set_attribute_values(video_mixer, 1, sharpen_attrib, sharpen_value); |
28944
cb18135338dd
Add chroma-deint option to vo vdpau (nochroma-deint speeds up deinterlacing).
cehoyos
parents:
28936
diff
changeset
|
518 if (!chroma_deint) |
cb18135338dd
Add chroma-deint option to vo vdpau (nochroma-deint speeds up deinterlacing).
cehoyos
parents:
28936
diff
changeset
|
519 vdp_video_mixer_set_attribute_values(video_mixer, 1, skip_chroma_attrib, skip_chroma_value_ptr); |
28638
7b16ccf423b4
Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents:
28611
diff
changeset
|
520 |
29727 | 521 update_csc_matrix(); |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
522 return 0; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
523 } |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
524 |
31975 | 525 static void mark_invalid(void) |
29713 | 526 { |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
527 int i; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
528 |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
529 decoder = VDP_INVALID_HANDLE; |
31975 | 530 video_mixer = VDP_INVALID_HANDLE; |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
531 |
28936
fd9de1e70d47
Move initialisation of deint_surfaces[] to free_video_specific().
cehoyos
parents:
28935
diff
changeset
|
532 for (i = 0; i < 3; i++) |
fd9de1e70d47
Move initialisation of deint_surfaces[] to free_video_specific().
cehoyos
parents:
28935
diff
changeset
|
533 deint_surfaces[i] = VDP_INVALID_HANDLE; |
fd9de1e70d47
Move initialisation of deint_surfaces[] to free_video_specific().
cehoyos
parents:
28935
diff
changeset
|
534 |
29017
c9a2d95c580a
New vdpau deinterlacing code needs one reference surface less.
cehoyos
parents:
29016
diff
changeset
|
535 for (i = 0; i < 2; i++) |
28956
6d0da4fd4544
Allow to use vdpau temporal deinterlacers with hardware accelerated decoding.
cehoyos
parents:
28944
diff
changeset
|
536 if (deint_mpi[i]) { |
6d0da4fd4544
Allow to use vdpau temporal deinterlacers with hardware accelerated decoding.
cehoyos
parents:
28944
diff
changeset
|
537 deint_mpi[i]->usage_count--; |
6d0da4fd4544
Allow to use vdpau temporal deinterlacers with hardware accelerated decoding.
cehoyos
parents:
28944
diff
changeset
|
538 deint_mpi[i] = NULL; |
6d0da4fd4544
Allow to use vdpau temporal deinterlacers with hardware accelerated decoding.
cehoyos
parents:
28944
diff
changeset
|
539 } |
31975 | 540 } |
541 | |
542 // Free everything specific to a certain video file | |
543 static void free_video_specific(void) | |
544 { | |
545 int i; | |
546 VdpStatus vdp_st; | |
547 | |
548 if (decoder != VDP_INVALID_HANDLE) | |
549 vdp_decoder_destroy(decoder); | |
550 decoder_max_refs = -1; | |
28956
6d0da4fd4544
Allow to use vdpau temporal deinterlacers with hardware accelerated decoding.
cehoyos
parents:
28944
diff
changeset
|
551 |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
552 for (i = 0; i < MAX_VIDEO_SURFACES; i++) { |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
553 if (surface_render[i].surface != VDP_INVALID_HANDLE) { |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
554 vdp_st = vdp_video_surface_destroy(surface_render[i].surface); |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
555 CHECK_ST_WARNING("Error when calling vdp_video_surface_destroy") |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
556 } |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
557 surface_render[i].surface = VDP_INVALID_HANDLE; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
558 } |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
559 |
28676
d5c295360163
Only check for vdp_video_mixer_destroy failure when we actually executed that function.
reimar
parents:
28675
diff
changeset
|
560 if (video_mixer != VDP_INVALID_HANDLE) { |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
561 vdp_st = vdp_video_mixer_destroy(video_mixer); |
28676
d5c295360163
Only check for vdp_video_mixer_destroy failure when we actually executed that function.
reimar
parents:
28675
diff
changeset
|
562 CHECK_ST_WARNING("Error when calling vdp_video_mixer_destroy") |
d5c295360163
Only check for vdp_video_mixer_destroy failure when we actually executed that function.
reimar
parents:
28675
diff
changeset
|
563 } |
31975 | 564 mark_invalid(); |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
565 } |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
566 |
29828
fe055da6637c
Fail in query_format() if a VDPAU decoder is not available.
cehoyos
parents:
29827
diff
changeset
|
567 static int create_vdp_decoder(uint32_t format, uint32_t width, uint32_t height, |
fe055da6637c
Fail in query_format() if a VDPAU decoder is not available.
cehoyos
parents:
29827
diff
changeset
|
568 int max_refs) |
28989 | 569 { |
570 VdpStatus vdp_st; | |
571 VdpDecoderProfile vdp_decoder_profile; | |
572 if (decoder != VDP_INVALID_HANDLE) | |
573 vdp_decoder_destroy(decoder); | |
29828
fe055da6637c
Fail in query_format() if a VDPAU decoder is not available.
cehoyos
parents:
29827
diff
changeset
|
574 switch (format) { |
29713 | 575 case IMGFMT_VDPAU_MPEG1: |
576 vdp_decoder_profile = VDP_DECODER_PROFILE_MPEG1; | |
577 break; | |
578 case IMGFMT_VDPAU_MPEG2: | |
579 vdp_decoder_profile = VDP_DECODER_PROFILE_MPEG2_MAIN; | |
580 break; | |
581 case IMGFMT_VDPAU_H264: | |
582 vdp_decoder_profile = VDP_DECODER_PROFILE_H264_HIGH; | |
583 mp_msg(MSGT_VO, MSGL_V, "[vdpau] Creating H264 hardware decoder for %d reference frames.\n", max_refs); | |
584 break; | |
585 case IMGFMT_VDPAU_WMV3: | |
586 vdp_decoder_profile = VDP_DECODER_PROFILE_VC1_MAIN; | |
587 break; | |
588 case IMGFMT_VDPAU_VC1: | |
589 vdp_decoder_profile = VDP_DECODER_PROFILE_VC1_ADVANCED; | |
590 break; | |
29843
f6d56a15f1d8
Support VDPAU hardware accelerated decoding of MPEG-4 ASP on capable
cehoyos
parents:
29830
diff
changeset
|
591 case IMGFMT_VDPAU_MPEG4: |
f6d56a15f1d8
Support VDPAU hardware accelerated decoding of MPEG-4 ASP on capable
cehoyos
parents:
29830
diff
changeset
|
592 vdp_decoder_profile = VDP_DECODER_PROFILE_MPEG4_PART2_ASP; |
f6d56a15f1d8
Support VDPAU hardware accelerated decoding of MPEG-4 ASP on capable
cehoyos
parents:
29830
diff
changeset
|
593 break; |
29827
d6d8b9d5a4fb
Add a default to switch(image_format), suppresses a warning after a future patch.
cehoyos
parents:
29781
diff
changeset
|
594 default: |
d6d8b9d5a4fb
Add a default to switch(image_format), suppresses a warning after a future patch.
cehoyos
parents:
29781
diff
changeset
|
595 goto err_out; |
28989 | 596 } |
597 vdp_st = vdp_decoder_create(vdp_device, vdp_decoder_profile, | |
29828
fe055da6637c
Fail in query_format() if a VDPAU decoder is not available.
cehoyos
parents:
29827
diff
changeset
|
598 width, height, max_refs, &decoder); |
28989 | 599 CHECK_ST_WARNING("Failed creating VDPAU decoder"); |
600 if (vdp_st != VDP_STATUS_OK) { | |
29827
d6d8b9d5a4fb
Add a default to switch(image_format), suppresses a warning after a future patch.
cehoyos
parents:
29781
diff
changeset
|
601 err_out: |
28989 | 602 decoder = VDP_INVALID_HANDLE; |
603 decoder_max_refs = 0; | |
28991 | 604 return 0; |
28989 | 605 } |
606 decoder_max_refs = max_refs; | |
28991 | 607 return 1; |
28989 | 608 } |
609 | |
29735 | 610 static void mark_vdpau_objects_uninitialized(void) |
611 { | |
612 int i; | |
613 | |
614 for (i = 0; i < MAX_VIDEO_SURFACES; i++) | |
615 surface_render[i].surface = VDP_INVALID_HANDLE; | |
616 vdp_flip_queue = VDP_INVALID_HANDLE; | |
617 vdp_flip_target = VDP_INVALID_HANDLE; | |
618 for (i = 0; i <= NUM_OUTPUT_SURFACES; i++) | |
619 output_surfaces[i] = VDP_INVALID_HANDLE; | |
620 vdp_device = VDP_INVALID_HANDLE; | |
621 for (i = 0; i < eosd_surface_count; i++) | |
622 eosd_surfaces[i].surface = VDP_INVALID_HANDLE; | |
623 output_surface_width = output_surface_height = -1; | |
624 eosd_render_count = 0; | |
625 visible_buf = 0; | |
31975 | 626 mark_invalid(); |
29735 | 627 } |
628 | |
629 static int handle_preemption(void) | |
630 { | |
631 if (!is_preempted) | |
632 return 0; | |
633 is_preempted = 0; | |
634 mp_msg(MSGT_VO, MSGL_INFO, "[vdpau] Attempting to recover from preemption.\n"); | |
635 mark_vdpau_objects_uninitialized(); | |
636 if (win_x11_init_vdpau_procs() < 0 || | |
637 win_x11_init_vdpau_flip_queue() < 0 || | |
638 create_vdp_mixer(vdp_chroma_type) < 0) { | |
639 mp_msg(MSGT_VO, MSGL_ERR, "[vdpau] Recovering from preemption failed\n"); | |
640 is_preempted = 1; | |
641 return -1; | |
642 } | |
643 resize(); | |
644 mp_msg(MSGT_VO, MSGL_INFO, "[vdpau] Recovered from display preemption.\n"); | |
645 return 1; | |
646 } | |
647 | |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
648 /* |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
649 * connect to X server, create and map window, initialize all |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
650 * VDPAU objects, create different surfaces etc. |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
651 */ |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
652 static int config(uint32_t width, uint32_t height, uint32_t d_width, |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
653 uint32_t d_height, uint32_t flags, char *title, |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
654 uint32_t format) |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
655 { |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
656 XVisualInfo vinfo; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
657 XSetWindowAttributes xswa; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
658 XWindowAttributes attribs; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
659 unsigned long xswamask; |
28936
fd9de1e70d47
Move initialisation of deint_surfaces[] to free_video_specific().
cehoyos
parents:
28935
diff
changeset
|
660 int depth; |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
661 |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
662 #ifdef CONFIG_XF86VM |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
663 int vm = flags & VOFLAG_MODESWITCHING; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
664 #endif |
29752 | 665 flip = flags & VOFLAG_FLIPPING; |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
666 |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
667 image_format = format; |
29005 | 668 vid_width = width; |
669 vid_height = height; | |
670 free_video_specific(); | |
29828
fe055da6637c
Fail in query_format() if a VDPAU decoder is not available.
cehoyos
parents:
29827
diff
changeset
|
671 if (IMGFMT_IS_VDPAU(image_format) |
fe055da6637c
Fail in query_format() if a VDPAU decoder is not available.
cehoyos
parents:
29827
diff
changeset
|
672 && !create_vdp_decoder(image_format, vid_width, vid_height, 2)) |
29005 | 673 return -1; |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
674 |
29713 | 675 int_pause = 0; |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
676 visible_buf = 0; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
677 |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
678 { |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
679 #ifdef CONFIG_XF86VM |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
680 if (vm) |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
681 vo_vm_switch(); |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
682 else |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
683 #endif |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
684 XGetWindowAttributes(mDisplay, DefaultRootWindow(mDisplay), &attribs); |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
685 depth = attribs.depth; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
686 if (depth != 15 && depth != 16 && depth != 24 && depth != 32) |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
687 depth = 24; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
688 XMatchVisualInfo(mDisplay, mScreen, depth, TrueColor, &vinfo); |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
689 |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
690 xswa.background_pixel = 0; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
691 xswa.border_pixel = 0; |
29234
6c47111fe28e
Do not use flag CWBackPixel when calling vo_x11_create_vo_window():
cehoyos
parents:
29070
diff
changeset
|
692 /* Do not use CWBackPixel: It leads to VDPAU errors after |
6c47111fe28e
Do not use flag CWBackPixel when calling vo_x11_create_vo_window():
cehoyos
parents:
29070
diff
changeset
|
693 aspect ratio changes. */ |
6c47111fe28e
Do not use flag CWBackPixel when calling vo_x11_create_vo_window():
cehoyos
parents:
29070
diff
changeset
|
694 xswamask = CWBorderPixel; |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
695 |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
696 vo_x11_create_vo_window(&vinfo, vo_dx, vo_dy, d_width, d_height, |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
697 flags, CopyFromParent, "vdpau", title); |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
698 XChangeWindowAttributes(mDisplay, vo_window, xswamask, &xswa); |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
699 |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
700 #ifdef CONFIG_XF86VM |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
701 if (vm) { |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
702 /* Grab the mouse pointer in our window */ |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
703 if (vo_grabpointer) |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
704 XGrabPointer(mDisplay, vo_window, True, 0, |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
705 GrabModeAsync, GrabModeAsync, |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
706 vo_window, None, CurrentTime); |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
707 XSetInputFocus(mDisplay, vo_window, RevertToNone, CurrentTime); |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
708 } |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
709 #endif |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
710 } |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
711 |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
712 if ((flags & VOFLAG_FULLSCREEN) && WinID <= 0) |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
713 vo_fs = 1; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
714 |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
715 /* -----VDPAU related code here -------- */ |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
716 if (vdp_flip_queue == VDP_INVALID_HANDLE && win_x11_init_vdpau_flip_queue()) |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
717 return -1; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
718 |
29066
ab51a502ebb5
Add support for IMGFMT_YUY2 and IMGFMT_UYVY to vo vdpau.
cehoyos
parents:
29065
diff
changeset
|
719 vdp_chroma_type = VDP_CHROMA_TYPE_420; |
ab51a502ebb5
Add support for IMGFMT_YUY2 and IMGFMT_UYVY to vo vdpau.
cehoyos
parents:
29065
diff
changeset
|
720 switch (image_format) { |
29713 | 721 case IMGFMT_YV12: |
722 case IMGFMT_I420: | |
723 case IMGFMT_IYUV: | |
724 vdp_pixel_format = VDP_YCBCR_FORMAT_YV12; | |
725 break; | |
726 case IMGFMT_NV12: | |
727 vdp_pixel_format = VDP_YCBCR_FORMAT_NV12; | |
728 break; | |
729 case IMGFMT_YUY2: | |
730 vdp_pixel_format = VDP_YCBCR_FORMAT_YUYV; | |
731 vdp_chroma_type = VDP_CHROMA_TYPE_422; | |
732 break; | |
733 case IMGFMT_UYVY: | |
734 vdp_pixel_format = VDP_YCBCR_FORMAT_UYVY; | |
735 vdp_chroma_type = VDP_CHROMA_TYPE_422; | |
29066
ab51a502ebb5
Add support for IMGFMT_YUY2 and IMGFMT_UYVY to vo vdpau.
cehoyos
parents:
29065
diff
changeset
|
736 } |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
737 if (create_vdp_mixer(vdp_chroma_type)) |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
738 return -1; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
739 |
29713 | 740 surface_num = 0; |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
741 vid_surface_num = -1; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
742 resize(); |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
743 |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
744 return 0; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
745 } |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
746 |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
747 static void check_events(void) |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
748 { |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
749 int e = vo_x11_check_events(mDisplay); |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
750 |
29735 | 751 if (handle_preemption() < 0) |
752 return; | |
753 | |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
754 if (e & VO_EVENT_RESIZE) |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
755 resize(); |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
756 |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
757 if ((e & VO_EVENT_EXPOSE || e & VO_EVENT_RESIZE) && int_pause) { |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
758 /* did we already draw a buffer */ |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
759 if (visible_buf) { |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
760 /* redraw the last visible buffer */ |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
761 VdpStatus vdp_st; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
762 vdp_st = vdp_presentation_queue_display(vdp_flip_queue, |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
763 output_surfaces[surface_num], |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
764 vo_dwidth, vo_dheight, |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
765 0); |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
766 CHECK_ST_WARNING("Error when calling vdp_presentation_queue_display") |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
767 } |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
768 } |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
769 } |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
770 |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
771 static void draw_osd_I8A8(int x0,int y0, int w,int h, unsigned char *src, |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
772 unsigned char *srca, int stride) |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
773 { |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
774 VdpOutputSurface output_surface = output_surfaces[surface_num]; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
775 VdpStatus vdp_st; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
776 int i, j; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
777 int pitch; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
778 int index_data_size_required; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
779 VdpRect output_indexed_rect_vid; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
780 VdpOutputSurfaceRenderBlendState blend_state; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
781 |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
782 if (!w || !h) |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
783 return; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
784 |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
785 index_data_size_required = 2*w*h; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
786 if (index_data_size < index_data_size_required) { |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
787 index_data = realloc(index_data, index_data_size_required); |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
788 index_data_size = index_data_size_required; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
789 } |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
790 |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
791 // index_data creation, component order - I, A, I, A, ..... |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
792 for (i = 0; i < h; i++) |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
793 for (j = 0; j < w; j++) { |
29713 | 794 index_data[i*2*w + j*2] = src [i*stride + j]; |
795 index_data[i*2*w + j*2 + 1] = -srca[i*stride + j]; | |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
796 } |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
797 |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
798 output_indexed_rect_vid.x0 = x0; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
799 output_indexed_rect_vid.y0 = y0; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
800 output_indexed_rect_vid.x1 = x0 + w; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
801 output_indexed_rect_vid.y1 = y0 + h; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
802 |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
803 pitch = w*2; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
804 |
28696
fdc03572004c
Change code to actually work when NUM_OUTPUT_SURFACES is changed.
reimar
parents:
28689
diff
changeset
|
805 // write source_data to osd_surface. |
fdc03572004c
Change code to actually work when NUM_OUTPUT_SURFACES is changed.
reimar
parents:
28689
diff
changeset
|
806 vdp_st = vdp_output_surface_put_bits_indexed(osd_surface, |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
807 VDP_INDEXED_FORMAT_I8A8, |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
808 (const void *const*)&index_data, |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
809 &pitch, |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
810 &output_indexed_rect_vid, |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
811 VDP_COLOR_TABLE_FORMAT_B8G8R8X8, |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
812 (void *)palette); |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
813 CHECK_ST_WARNING("Error when calling vdp_output_surface_put_bits_indexed") |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
814 |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
815 blend_state.struct_version = VDP_OUTPUT_SURFACE_RENDER_BLEND_STATE_VERSION; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
816 blend_state.blend_factor_source_color = VDP_OUTPUT_SURFACE_RENDER_BLEND_FACTOR_ONE; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
817 blend_state.blend_factor_source_alpha = VDP_OUTPUT_SURFACE_RENDER_BLEND_FACTOR_ONE; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
818 blend_state.blend_factor_destination_color = VDP_OUTPUT_SURFACE_RENDER_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
819 blend_state.blend_factor_destination_alpha = VDP_OUTPUT_SURFACE_RENDER_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
820 blend_state.blend_equation_color = VDP_OUTPUT_SURFACE_RENDER_BLEND_EQUATION_ADD; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
821 blend_state.blend_equation_alpha = VDP_OUTPUT_SURFACE_RENDER_BLEND_EQUATION_ADD; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
822 |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
823 vdp_st = vdp_output_surface_render_output_surface(output_surface, |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
824 &output_indexed_rect_vid, |
28696
fdc03572004c
Change code to actually work when NUM_OUTPUT_SURFACES is changed.
reimar
parents:
28689
diff
changeset
|
825 osd_surface, |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
826 &output_indexed_rect_vid, |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
827 NULL, |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
828 &blend_state, |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
829 VDP_OUTPUT_SURFACE_RENDER_ROTATE_0); |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
830 CHECK_ST_WARNING("Error when calling vdp_output_surface_render_output_surface") |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
831 } |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
832 |
29713 | 833 static void draw_eosd(void) |
834 { | |
28675 | 835 VdpStatus vdp_st; |
836 VdpOutputSurface output_surface = output_surfaces[surface_num]; | |
837 VdpOutputSurfaceRenderBlendState blend_state; | |
838 int i; | |
839 | |
840 blend_state.struct_version = VDP_OUTPUT_SURFACE_RENDER_BLEND_STATE_VERSION; | |
841 blend_state.blend_factor_source_color = VDP_OUTPUT_SURFACE_RENDER_BLEND_FACTOR_SRC_ALPHA; | |
842 blend_state.blend_factor_source_alpha = VDP_OUTPUT_SURFACE_RENDER_BLEND_FACTOR_ONE; | |
843 blend_state.blend_factor_destination_color = VDP_OUTPUT_SURFACE_RENDER_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA; | |
844 blend_state.blend_factor_destination_alpha = VDP_OUTPUT_SURFACE_RENDER_BLEND_FACTOR_SRC_ALPHA; | |
845 blend_state.blend_equation_color = VDP_OUTPUT_SURFACE_RENDER_BLEND_EQUATION_ADD; | |
846 blend_state.blend_equation_alpha = VDP_OUTPUT_SURFACE_RENDER_BLEND_EQUATION_ADD; | |
847 | |
29713 | 848 for (i = 0; i < eosd_render_count; i++) { |
28675 | 849 vdp_st = vdp_output_surface_render_bitmap_surface( |
850 output_surface, &eosd_targets[i].dest, | |
851 eosd_targets[i].surface, &eosd_targets[i].source, | |
852 &eosd_targets[i].color, &blend_state, | |
853 VDP_OUTPUT_SURFACE_RENDER_ROTATE_0); | |
854 CHECK_ST_WARNING("EOSD: Error when rendering") | |
855 } | |
856 } | |
857 | |
32391
b4c3659d16b1
Use a dynamic list for the sources of EOSD elements.
cigaes
parents:
32209
diff
changeset
|
858 static void generate_eosd(struct mp_eosd_image_list *imgs) |
29713 | 859 { |
28675 | 860 VdpStatus vdp_st; |
861 VdpRect destRect; | |
862 int j, found; | |
32391
b4c3659d16b1
Use a dynamic list for the sources of EOSD elements.
cigaes
parents:
32209
diff
changeset
|
863 struct mp_eosd_image *img = eosd_image_first(imgs); |
b4c3659d16b1
Use a dynamic list for the sources of EOSD elements.
cigaes
parents:
32209
diff
changeset
|
864 struct mp_eosd_image *i; |
28675 | 865 |
866 // Nothing changed, no need to redraw | |
867 if (imgs->changed == 0) | |
28807
338065cac802
Remove duplicate OSD drawing introduced due to a conflict between r28840 and r28839.
reimar
parents:
28805
diff
changeset
|
868 return; |
28675 | 869 eosd_render_count = 0; |
870 // There's nothing to render! | |
871 if (!img) | |
872 return; | |
873 | |
874 if (imgs->changed == 1) | |
875 goto eosd_skip_upload; | |
876 | |
29713 | 877 for (j = 0; j < eosd_surface_count; j++) |
28675 | 878 eosd_surfaces[j].in_use = 0; |
879 | |
32391
b4c3659d16b1
Use a dynamic list for the sources of EOSD elements.
cigaes
parents:
32209
diff
changeset
|
880 for (i = img; i; i = eosd_image_next(imgs)) { |
28675 | 881 // Try to reuse a suitable surface |
882 found = -1; | |
29713 | 883 for (j = 0; j < eosd_surface_count; j++) { |
28675 | 884 if (eosd_surfaces[j].surface != VDP_INVALID_HANDLE && !eosd_surfaces[j].in_use && |
885 eosd_surfaces[j].w >= i->w && eosd_surfaces[j].h >= i->h) { | |
886 found = j; | |
887 break; | |
888 } | |
889 } | |
890 // None found, allocate a new surface | |
891 if (found < 0) { | |
29713 | 892 for (j = 0; j < eosd_surface_count; j++) { |
28675 | 893 if (!eosd_surfaces[j].in_use) { |
894 if (eosd_surfaces[j].surface != VDP_INVALID_HANDLE) | |
895 vdp_bitmap_surface_destroy(eosd_surfaces[j].surface); | |
896 found = j; | |
897 break; | |
898 } | |
899 } | |
900 // Allocate new space for surface/target arrays | |
901 if (found < 0) { | |
902 j = found = eosd_surface_count; | |
903 eosd_surface_count = eosd_surface_count ? eosd_surface_count*2 : EOSD_SURFACES_INITIAL; | |
904 eosd_surfaces = realloc(eosd_surfaces, eosd_surface_count * sizeof(*eosd_surfaces)); | |
905 eosd_targets = realloc(eosd_targets, eosd_surface_count * sizeof(*eosd_targets)); | |
29713 | 906 for (j = found; j < eosd_surface_count; j++) { |
28675 | 907 eosd_surfaces[j].surface = VDP_INVALID_HANDLE; |
908 eosd_surfaces[j].in_use = 0; | |
909 } | |
910 } | |
911 vdp_st = vdp_bitmap_surface_create(vdp_device, VDP_RGBA_FORMAT_A8, | |
912 i->w, i->h, VDP_TRUE, &eosd_surfaces[found].surface); | |
913 CHECK_ST_WARNING("EOSD: error when creating surface") | |
914 eosd_surfaces[found].w = i->w; | |
915 eosd_surfaces[found].h = i->h; | |
916 } | |
917 eosd_surfaces[found].in_use = 1; | |
918 eosd_targets[eosd_render_count].surface = eosd_surfaces[found].surface; | |
919 destRect.x0 = 0; | |
920 destRect.y0 = 0; | |
921 destRect.x1 = i->w; | |
922 destRect.y1 = i->h; | |
923 vdp_st = vdp_bitmap_surface_putbits_native(eosd_targets[eosd_render_count].surface, | |
924 (const void *) &i->bitmap, &i->stride, &destRect); | |
925 CHECK_ST_WARNING("EOSD: putbits failed") | |
926 eosd_render_count++; | |
927 } | |
928 | |
929 eosd_skip_upload: | |
930 eosd_render_count = 0; | |
32391
b4c3659d16b1
Use a dynamic list for the sources of EOSD elements.
cigaes
parents:
32209
diff
changeset
|
931 for (i = eosd_image_first(imgs); i; i = eosd_image_next(imgs)) { |
28675 | 932 // Render dest, color, etc. |
29713 | 933 eosd_targets[eosd_render_count].color.alpha = 1.0 - ((i->color >> 0) & 0xff) / 255.0; |
934 eosd_targets[eosd_render_count].color.blue = ((i->color >> 8) & 0xff) / 255.0; | |
935 eosd_targets[eosd_render_count].color.green = ((i->color >> 16) & 0xff) / 255.0; | |
936 eosd_targets[eosd_render_count].color.red = ((i->color >> 24) & 0xff) / 255.0; | |
937 eosd_targets[eosd_render_count].dest.x0 = i->dst_x; | |
938 eosd_targets[eosd_render_count].dest.y0 = i->dst_y; | |
939 eosd_targets[eosd_render_count].dest.x1 = i->w + i->dst_x; | |
940 eosd_targets[eosd_render_count].dest.y1 = i->h + i->dst_y; | |
941 eosd_targets[eosd_render_count].source.x0 = 0; | |
942 eosd_targets[eosd_render_count].source.y0 = 0; | |
943 eosd_targets[eosd_render_count].source.x1 = i->w; | |
944 eosd_targets[eosd_render_count].source.y1 = i->h; | |
28675 | 945 eosd_render_count++; |
946 } | |
947 } | |
948 | |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
949 static void draw_osd(void) |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
950 { |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
951 mp_msg(MSGT_VO, MSGL_DBG2, "DRAW_OSD\n"); |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
952 |
29735 | 953 if (handle_preemption() < 0) |
954 return; | |
955 | |
28598
4172d83194f2
Extend calc_src_dst_rects to also calculate the border values needed for
reimar
parents:
28582
diff
changeset
|
956 vo_draw_text_ext(vo_dwidth, vo_dheight, border_x, border_y, border_x, border_y, |
4172d83194f2
Extend calc_src_dst_rects to also calculate the border values needed for
reimar
parents:
28582
diff
changeset
|
957 vid_width, vid_height, draw_osd_I8A8); |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
958 } |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
959 |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
960 static void flip_page(void) |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
961 { |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
962 VdpStatus vdp_st; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
963 mp_msg(MSGT_VO, MSGL_DBG2, "\nFLIP_PAGE VID:%u -> OUT:%u\n", |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
964 surface_render[vid_surface_num].surface, output_surfaces[surface_num]); |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
965 |
29735 | 966 if (handle_preemption() < 0) |
967 return; | |
968 | |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
969 vdp_st = vdp_presentation_queue_display(vdp_flip_queue, output_surfaces[surface_num], |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
970 vo_dwidth, vo_dheight, |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
971 0); |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
972 CHECK_ST_WARNING("Error when calling vdp_presentation_queue_display") |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
973 |
28696
fdc03572004c
Change code to actually work when NUM_OUTPUT_SURFACES is changed.
reimar
parents:
28689
diff
changeset
|
974 surface_num = (surface_num + 1) % NUM_OUTPUT_SURFACES; |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
975 visible_buf = 1; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
976 } |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
977 |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
978 static int draw_slice(uint8_t *image[], int stride[], int w, int h, |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
979 int x, int y) |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
980 { |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
981 VdpStatus vdp_st; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
982 struct vdpau_render_state *rndr = (struct vdpau_render_state *)image[0]; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
983 int max_refs = image_format == IMGFMT_VDPAU_H264 ? rndr->info.h264.num_ref_frames : 2; |
29735 | 984 |
985 if (handle_preemption() < 0) | |
986 return VO_TRUE; | |
987 | |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
988 if (!IMGFMT_IS_VDPAU(image_format)) |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
989 return VO_FALSE; |
28989 | 990 if ((decoder == VDP_INVALID_HANDLE || decoder_max_refs < max_refs) |
29828
fe055da6637c
Fail in query_format() if a VDPAU decoder is not available.
cehoyos
parents:
29827
diff
changeset
|
991 && !create_vdp_decoder(image_format, vid_width, vid_height, max_refs)) |
28989 | 992 return VO_FALSE; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29234
diff
changeset
|
993 |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
994 vdp_st = vdp_decoder_render(decoder, rndr->surface, (void *)&rndr->info, rndr->bitstream_buffers_used, rndr->bitstream_buffers); |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
995 CHECK_ST_WARNING("Failed VDPAU decoder rendering"); |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
996 return VO_TRUE; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
997 } |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
998 |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
999 |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1000 static int draw_frame(uint8_t *src[]) |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1001 { |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1002 return VO_ERROR; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1003 } |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1004 |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1005 static struct vdpau_render_state *get_surface(int number) |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1006 { |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1007 if (number > MAX_VIDEO_SURFACES) |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1008 return NULL; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1009 if (surface_render[number].surface == VDP_INVALID_HANDLE) { |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1010 VdpStatus vdp_st; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1011 vdp_st = vdp_video_surface_create(vdp_device, vdp_chroma_type, |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1012 vid_width, vid_height, |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1013 &surface_render[number].surface); |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1014 CHECK_ST_WARNING("Error when calling vdp_video_surface_create") |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1015 if (vdp_st != VDP_STATUS_OK) |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1016 return NULL; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1017 } |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1018 mp_msg(MSGT_VO, MSGL_DBG2, "VID CREATE: %u\n", surface_render[number].surface); |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1019 return &surface_render[number]; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1020 } |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1021 |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1022 static uint32_t draw_image(mp_image_t *mpi) |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1023 { |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1024 if (IMGFMT_IS_VDPAU(image_format)) { |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1025 struct vdpau_render_state *rndr = mpi->priv; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1026 vid_surface_num = rndr - surface_render; |
30009 | 1027 mpi->usage_count++; |
1028 if (deint_mpi[1]) | |
1029 deint_mpi[1]->usage_count--; | |
1030 deint_mpi[1] = deint_mpi[0]; | |
1031 deint_mpi[0] = mpi; | |
29756 | 1032 } else if (image_format == IMGFMT_BGRA) { |
1033 VdpStatus vdp_st; | |
1034 VdpRect r = {0, 0, vid_width, vid_height}; | |
1035 vdp_st = vdp_output_surface_put_bits_native(output_surfaces[2], | |
1036 (void const*const*)mpi->planes, | |
1037 mpi->stride, &r); | |
1038 CHECK_ST_ERROR("Error when calling vdp_output_surface_put_bits_native") | |
1039 vdp_st = vdp_output_surface_render_output_surface(output_surfaces[surface_num], | |
1040 &out_rect_vid, | |
1041 output_surfaces[2], | |
1042 &src_rect_vid, NULL, NULL, | |
1043 VDP_OUTPUT_SURFACE_RENDER_ROTATE_0); | |
1044 CHECK_ST_ERROR("Error when calling vdp_output_surface_render_output_surface") | |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1045 } else if (!(mpi->flags & MP_IMGFLAG_DRAW_CALLBACK)) { |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1046 VdpStatus vdp_st; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1047 void *destdata[3] = {mpi->planes[0], mpi->planes[2], mpi->planes[1]}; |
28933
b0badbd680c6
Initial support for advanced VDPAU deinterlacers (software-decoded video
cehoyos
parents:
28892
diff
changeset
|
1048 struct vdpau_render_state *rndr = get_surface(deint_counter); |
29018
b04ff8b244bb
New VDPAU deinterlacing code needs one reference surface less for software decoding.
cehoyos
parents:
29017
diff
changeset
|
1049 deint_counter = (deint_counter + 1) % 3; |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1050 vid_surface_num = rndr - surface_render; |
29070 | 1051 if (image_format == IMGFMT_NV12) |
1052 destdata[1] = destdata[2]; | |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1053 vdp_st = vdp_video_surface_put_bits_y_cb_cr(rndr->surface, |
29066
ab51a502ebb5
Add support for IMGFMT_YUY2 and IMGFMT_UYVY to vo vdpau.
cehoyos
parents:
29065
diff
changeset
|
1054 vdp_pixel_format, |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1055 (const void *const*)destdata, |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1056 mpi->stride); // pitch |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1057 CHECK_ST_ERROR("Error when calling vdp_video_surface_put_bits_y_cb_cr") |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1058 } |
29054
d865fa57c316
10l: Don't use MP_IMGFIELD_TOP_FIRST if MP_IMGFIELD_ORDERED is not set.
cehoyos
parents:
29026
diff
changeset
|
1059 if (mpi->fields & MP_IMGFIELD_ORDERED) |
29055 | 1060 top_field_first = !!(mpi->fields & MP_IMGFIELD_TOP_FIRST); |
29054
d865fa57c316
10l: Don't use MP_IMGFIELD_TOP_FIRST if MP_IMGFIELD_ORDERED is not set.
cehoyos
parents:
29026
diff
changeset
|
1061 else |
d865fa57c316
10l: Don't use MP_IMGFIELD_TOP_FIRST if MP_IMGFIELD_ORDERED is not set.
cehoyos
parents:
29026
diff
changeset
|
1062 top_field_first = 1; |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1063 |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1064 video_to_output_surface(); |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1065 return VO_TRUE; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1066 } |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1067 |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1068 static uint32_t get_image(mp_image_t *mpi) |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1069 { |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1070 struct vdpau_render_state *rndr; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1071 |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1072 // no dr for non-decoding for now |
29716 | 1073 if (!IMGFMT_IS_VDPAU(image_format)) |
1074 return VO_FALSE; | |
1075 if (mpi->type != MP_IMGTYPE_NUMBERED) | |
1076 return VO_FALSE; | |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1077 |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1078 rndr = get_surface(mpi->number); |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1079 if (!rndr) { |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1080 mp_msg(MSGT_VO, MSGL_ERR, "[vdpau] no surfaces available in get_image\n"); |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1081 // TODO: this probably breaks things forever, provide a dummy buffer? |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1082 return VO_FALSE; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1083 } |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1084 mpi->flags |= MP_IMGFLAG_DIRECT; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1085 mpi->stride[0] = mpi->stride[1] = mpi->stride[2] = 0; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1086 mpi->planes[0] = mpi->planes[1] = mpi->planes[2] = NULL; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1087 // hack to get around a check and to avoid a special-case in vd_ffmpeg.c |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1088 mpi->planes[0] = (void *)rndr; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1089 mpi->num_planes = 1; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1090 mpi->priv = rndr; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1091 return VO_TRUE; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1092 } |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1093 |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1094 static int query_format(uint32_t format) |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1095 { |
29752 | 1096 int default_flags = VFCAP_CSP_SUPPORTED | VFCAP_CSP_SUPPORTED_BY_HW | VFCAP_HWSCALE_UP | VFCAP_HWSCALE_DOWN | VFCAP_OSD | VFCAP_EOSD | VFCAP_EOSD_UNSCALED | VFCAP_FLIP; |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1097 switch (format) { |
29756 | 1098 case IMGFMT_BGRA: |
1099 if (force_mixer) | |
1100 return 0; | |
29713 | 1101 case IMGFMT_YV12: |
1102 case IMGFMT_I420: | |
1103 case IMGFMT_IYUV: | |
1104 case IMGFMT_NV12: | |
1105 case IMGFMT_YUY2: | |
1106 case IMGFMT_UYVY: | |
1107 return default_flags | VOCAP_NOSLICES; | |
1108 case IMGFMT_VDPAU_MPEG1: | |
1109 case IMGFMT_VDPAU_MPEG2: | |
1110 case IMGFMT_VDPAU_H264: | |
1111 case IMGFMT_VDPAU_WMV3: | |
1112 case IMGFMT_VDPAU_VC1: | |
29843
f6d56a15f1d8
Support VDPAU hardware accelerated decoding of MPEG-4 ASP on capable
cehoyos
parents:
29830
diff
changeset
|
1113 case IMGFMT_VDPAU_MPEG4: |
29830
9fcc27d1fe1f
100: Fix function parameters when calling create_vdp_decoder() from query_format().
cehoyos
parents:
29829
diff
changeset
|
1114 if (create_vdp_decoder(format, 48, 48, 2)) |
29829 | 1115 return default_flags; |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1116 } |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1117 return 0; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1118 } |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1119 |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1120 static void DestroyVdpauObjects(void) |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1121 { |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1122 int i; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1123 VdpStatus vdp_st; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1124 |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1125 free_video_specific(); |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1126 |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1127 vdp_st = vdp_presentation_queue_destroy(vdp_flip_queue); |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1128 CHECK_ST_WARNING("Error when calling vdp_presentation_queue_destroy") |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1129 |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1130 vdp_st = vdp_presentation_queue_target_destroy(vdp_flip_target); |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1131 CHECK_ST_WARNING("Error when calling vdp_presentation_queue_target_destroy") |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1132 |
28696
fdc03572004c
Change code to actually work when NUM_OUTPUT_SURFACES is changed.
reimar
parents:
28689
diff
changeset
|
1133 for (i = 0; i <= NUM_OUTPUT_SURFACES; i++) { |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1134 vdp_st = vdp_output_surface_destroy(output_surfaces[i]); |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1135 output_surfaces[i] = VDP_INVALID_HANDLE; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1136 CHECK_ST_WARNING("Error when calling vdp_output_surface_destroy") |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1137 } |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1138 |
28675 | 1139 for (i = 0; i<eosd_surface_count; i++) { |
1140 if (eosd_surfaces[i].surface != VDP_INVALID_HANDLE) { | |
1141 vdp_st = vdp_bitmap_surface_destroy(eosd_surfaces[i].surface); | |
1142 CHECK_ST_WARNING("Error when calling vdp_bitmap_surface_destroy") | |
1143 } | |
1144 eosd_surfaces[i].surface = VDP_INVALID_HANDLE; | |
1145 } | |
1146 | |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1147 vdp_st = vdp_device_destroy(vdp_device); |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1148 CHECK_ST_WARNING("Error when calling vdp_device_destroy") |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1149 } |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1150 |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1151 static void uninit(void) |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1152 { |
29751
593354e0500d
Free memory allocated in ff_vdpau_add_data_chunk() on uninit.
cehoyos
parents:
29735
diff
changeset
|
1153 int i; |
593354e0500d
Free memory allocated in ff_vdpau_add_data_chunk() on uninit.
cehoyos
parents:
29735
diff
changeset
|
1154 |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1155 if (!vo_config_count) |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1156 return; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1157 visible_buf = 0; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1158 |
29751
593354e0500d
Free memory allocated in ff_vdpau_add_data_chunk() on uninit.
cehoyos
parents:
29735
diff
changeset
|
1159 for (i = 0; i < MAX_VIDEO_SURFACES; i++) { |
593354e0500d
Free memory allocated in ff_vdpau_add_data_chunk() on uninit.
cehoyos
parents:
29735
diff
changeset
|
1160 // Allocated in ff_vdpau_add_data_chunk() |
593354e0500d
Free memory allocated in ff_vdpau_add_data_chunk() on uninit.
cehoyos
parents:
29735
diff
changeset
|
1161 av_freep(&surface_render[i].bitstream_buffers); |
593354e0500d
Free memory allocated in ff_vdpau_add_data_chunk() on uninit.
cehoyos
parents:
29735
diff
changeset
|
1162 surface_render[i].bitstream_buffers_allocated = 0; |
593354e0500d
Free memory allocated in ff_vdpau_add_data_chunk() on uninit.
cehoyos
parents:
29735
diff
changeset
|
1163 } |
593354e0500d
Free memory allocated in ff_vdpau_add_data_chunk() on uninit.
cehoyos
parents:
29735
diff
changeset
|
1164 |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1165 /* Destroy all vdpau objects */ |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1166 DestroyVdpauObjects(); |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1167 |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1168 free(index_data); |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1169 index_data = NULL; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1170 |
28675 | 1171 free(eosd_surfaces); |
1172 eosd_surfaces = NULL; | |
1173 free(eosd_targets); | |
1174 eosd_targets = NULL; | |
1175 | |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1176 #ifdef CONFIG_XF86VM |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1177 vo_vm_close(); |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1178 #endif |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1179 vo_x11_uninit(); |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1180 } |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1181 |
28828
56eee6ffba9b
Make data related to suboption parsing const in libvo
reimar
parents:
28807
diff
changeset
|
1182 static const opt_t subopts[] = { |
28638
7b16ccf423b4
Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents:
28611
diff
changeset
|
1183 {"deint", OPT_ARG_INT, &deint, (opt_test_f)int_non_neg}, |
28944
cb18135338dd
Add chroma-deint option to vo vdpau (nochroma-deint speeds up deinterlacing).
cehoyos
parents:
28936
diff
changeset
|
1184 {"chroma-deint", OPT_ARG_BOOL, &chroma_deint, NULL}, |
28638
7b16ccf423b4
Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents:
28611
diff
changeset
|
1185 {"pullup", OPT_ARG_BOOL, &pullup, NULL}, |
7b16ccf423b4
Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents:
28611
diff
changeset
|
1186 {"denoise", OPT_ARG_FLOAT, &denoise, NULL}, |
7b16ccf423b4
Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents:
28611
diff
changeset
|
1187 {"sharpen", OPT_ARG_FLOAT, &sharpen, NULL}, |
29727 | 1188 {"colorspace", OPT_ARG_INT, &colorspace, NULL}, |
29756 | 1189 {"force-mixer", OPT_ARG_BOOL, &force_mixer, NULL}, |
29781
508417d485d6
Add new VDPAU feature high-quality-scaling (and require newer library).
cehoyos
parents:
29757
diff
changeset
|
1190 {"hqscaling", OPT_ARG_INT, &hqscaling, (opt_test_f)int_non_neg}, |
28638
7b16ccf423b4
Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents:
28611
diff
changeset
|
1191 {NULL} |
7b16ccf423b4
Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents:
28611
diff
changeset
|
1192 }; |
7b16ccf423b4
Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents:
28611
diff
changeset
|
1193 |
7b16ccf423b4
Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents:
28611
diff
changeset
|
1194 static const char help_msg[] = |
7b16ccf423b4
Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents:
28611
diff
changeset
|
1195 "\n-vo vdpau command line help:\n" |
7b16ccf423b4
Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents:
28611
diff
changeset
|
1196 "Example: mplayer -vo vdpau:deint=2\n" |
7b16ccf423b4
Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents:
28611
diff
changeset
|
1197 "\nOptions:\n" |
28707
a81065b771e7
Document that all vdpau deinterlacers respect -field-dominance.
cehoyos
parents:
28702
diff
changeset
|
1198 " deint (all modes > 0 respect -field-dominance)\n" |
28638
7b16ccf423b4
Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents:
28611
diff
changeset
|
1199 " 0: no deinterlacing\n" |
28708 | 1200 " 1: only show first field\n" |
28956
6d0da4fd4544
Allow to use vdpau temporal deinterlacers with hardware accelerated decoding.
cehoyos
parents:
28944
diff
changeset
|
1201 " 2: bob deinterlacing\n" |
6d0da4fd4544
Allow to use vdpau temporal deinterlacers with hardware accelerated decoding.
cehoyos
parents:
28944
diff
changeset
|
1202 " 3: temporal deinterlacing (resource-hungry)\n" |
6d0da4fd4544
Allow to use vdpau temporal deinterlacers with hardware accelerated decoding.
cehoyos
parents:
28944
diff
changeset
|
1203 " 4: temporal-spatial deinterlacing (very resource-hungry)\n" |
28944
cb18135338dd
Add chroma-deint option to vo vdpau (nochroma-deint speeds up deinterlacing).
cehoyos
parents:
28936
diff
changeset
|
1204 " chroma-deint\n" |
cb18135338dd
Add chroma-deint option to vo vdpau (nochroma-deint speeds up deinterlacing).
cehoyos
parents:
28936
diff
changeset
|
1205 " Operate on luma and chroma when using temporal deinterlacing (default)\n" |
cb18135338dd
Add chroma-deint option to vo vdpau (nochroma-deint speeds up deinterlacing).
cehoyos
parents:
28936
diff
changeset
|
1206 " Use nochroma-deint to speed up temporal deinterlacing\n" |
28638
7b16ccf423b4
Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents:
28611
diff
changeset
|
1207 " pullup\n" |
30758
33765d7d6e0a
Documentation: Add linebreak and try to be less ambiguous.
cehoyos
parents:
30462
diff
changeset
|
1208 " Try to skip deinterlacing for progressive frames\n" |
33765d7d6e0a
Documentation: Add linebreak and try to be less ambiguous.
cehoyos
parents:
30462
diff
changeset
|
1209 " (needs at least temporal deinterlacing, useful for telecined content)\n" |
28638
7b16ccf423b4
Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents:
28611
diff
changeset
|
1210 " denoise\n" |
7b16ccf423b4
Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents:
28611
diff
changeset
|
1211 " Apply denoising, argument is strength from 0.0 to 1.0\n" |
7b16ccf423b4
Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents:
28611
diff
changeset
|
1212 " sharpen\n" |
7b16ccf423b4
Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents:
28611
diff
changeset
|
1213 " Apply sharpening or softening, argument is strength from -1.0 to 1.0\n" |
29727 | 1214 " colorspace\n" |
1215 " 0: guess based on video resolution\n" | |
1216 " 1: ITU-R BT.601 (default)\n" | |
1217 " 2: ITU-R BT.709\n" | |
29729 | 1218 " 3: SMPTE-240M\n" |
29781
508417d485d6
Add new VDPAU feature high-quality-scaling (and require newer library).
cehoyos
parents:
29757
diff
changeset
|
1219 " hqscaling\n" |
508417d485d6
Add new VDPAU feature high-quality-scaling (and require newer library).
cehoyos
parents:
29757
diff
changeset
|
1220 " 0: default VDPAU scaler\n" |
508417d485d6
Add new VDPAU feature high-quality-scaling (and require newer library).
cehoyos
parents:
29757
diff
changeset
|
1221 " 1-9: high quality VDPAU scaler (needs capable hardware)\n" |
29756 | 1222 " force-mixer\n" |
1223 " Use the VDPAU mixer (default)\n" | |
1224 " Use noforce-mixer to allow BGRA output (disables all above options)\n" | |
28638
7b16ccf423b4
Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents:
28611
diff
changeset
|
1225 ; |
7b16ccf423b4
Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents:
28611
diff
changeset
|
1226 |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1227 static int preinit(const char *arg) |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1228 { |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1229 int i; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1230 |
28638
7b16ccf423b4
Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents:
28611
diff
changeset
|
1231 deint = 0; |
28709
4e89476f8952
Do not forget the chosen deinterlacer for -vo vdpau.
cehoyos
parents:
28708
diff
changeset
|
1232 deint_type = 3; |
28933
b0badbd680c6
Initial support for advanced VDPAU deinterlacers (software-decoded video
cehoyos
parents:
28892
diff
changeset
|
1233 deint_counter = 0; |
29017
c9a2d95c580a
New vdpau deinterlacing code needs one reference surface less.
cehoyos
parents:
29016
diff
changeset
|
1234 deint_mpi[0] = deint_mpi[1] = NULL; |
28944
cb18135338dd
Add chroma-deint option to vo vdpau (nochroma-deint speeds up deinterlacing).
cehoyos
parents:
28936
diff
changeset
|
1235 chroma_deint = 1; |
29713 | 1236 pullup = 0; |
28638
7b16ccf423b4
Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents:
28611
diff
changeset
|
1237 denoise = 0; |
7b16ccf423b4
Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents:
28611
diff
changeset
|
1238 sharpen = 0; |
29727 | 1239 colorspace = 1; |
29756 | 1240 force_mixer = 1; |
29781
508417d485d6
Add new VDPAU feature high-quality-scaling (and require newer library).
cehoyos
parents:
29757
diff
changeset
|
1241 hqscaling = 0; |
28638
7b16ccf423b4
Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents:
28611
diff
changeset
|
1242 if (subopt_parse(arg, subopts) != 0) { |
7b16ccf423b4
Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents:
28611
diff
changeset
|
1243 mp_msg(MSGT_VO, MSGL_FATAL, help_msg); |
7b16ccf423b4
Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents:
28611
diff
changeset
|
1244 return -1; |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1245 } |
28709
4e89476f8952
Do not forget the chosen deinterlacer for -vo vdpau.
cehoyos
parents:
28708
diff
changeset
|
1246 if (deint) |
4e89476f8952
Do not forget the chosen deinterlacer for -vo vdpau.
cehoyos
parents:
28708
diff
changeset
|
1247 deint_type = deint; |
29729 | 1248 if (colorspace < 0 || colorspace > 3) { |
29727 | 1249 mp_msg(MSGT_VO, MSGL_WARN, "[vdpau] Invalid color space specified, " |
1250 "using BT.601\n"); | |
1251 colorspace = 1; | |
1252 } | |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1253 |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1254 if (!vo_init() || win_x11_init_vdpau_procs()) |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1255 return -1; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1256 |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1257 decoder = VDP_INVALID_HANDLE; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1258 for (i = 0; i < MAX_VIDEO_SURFACES; i++) |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1259 surface_render[i].surface = VDP_INVALID_HANDLE; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1260 video_mixer = VDP_INVALID_HANDLE; |
28774
95123b577ad0
Make sure all output_surfaces are initialized in preinit.
reimar
parents:
28729
diff
changeset
|
1261 for (i = 0; i <= NUM_OUTPUT_SURFACES; i++) |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1262 output_surfaces[i] = VDP_INVALID_HANDLE; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1263 vdp_flip_queue = VDP_INVALID_HANDLE; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1264 output_surface_width = output_surface_height = -1; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1265 |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1266 // full grayscale palette. |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1267 for (i = 0; i < PALETTE_SIZE; ++i) |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1268 palette[i] = (i << 16) | (i << 8) | i; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1269 index_data = NULL; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1270 index_data_size = 0; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1271 |
28675 | 1272 eosd_surface_count = eosd_render_count = 0; |
1273 eosd_surfaces = NULL; | |
1274 eosd_targets = NULL; | |
1275 | |
28725
b9c26620ada7
Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents:
28724
diff
changeset
|
1276 procamp.struct_version = VDP_PROCAMP_VERSION; |
b9c26620ada7
Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents:
28724
diff
changeset
|
1277 procamp.brightness = 0.0; |
b9c26620ada7
Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents:
28724
diff
changeset
|
1278 procamp.contrast = 1.0; |
b9c26620ada7
Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents:
28724
diff
changeset
|
1279 procamp.saturation = 1.0; |
b9c26620ada7
Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents:
28724
diff
changeset
|
1280 procamp.hue = 0.0; |
b9c26620ada7
Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents:
28724
diff
changeset
|
1281 |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1282 return 0; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1283 } |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1284 |
29713 | 1285 static int get_equalizer(char *name, int *value) |
1286 { | |
28725
b9c26620ada7
Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents:
28724
diff
changeset
|
1287 if (!strcasecmp(name, "brightness")) |
b9c26620ada7
Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents:
28724
diff
changeset
|
1288 *value = procamp.brightness * 100; |
b9c26620ada7
Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents:
28724
diff
changeset
|
1289 else if (!strcasecmp(name, "contrast")) |
b9c26620ada7
Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents:
28724
diff
changeset
|
1290 *value = (procamp.contrast-1.0) * 100; |
b9c26620ada7
Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents:
28724
diff
changeset
|
1291 else if (!strcasecmp(name, "saturation")) |
b9c26620ada7
Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents:
28724
diff
changeset
|
1292 *value = (procamp.saturation-1.0) * 100; |
b9c26620ada7
Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents:
28724
diff
changeset
|
1293 else if (!strcasecmp(name, "hue")) |
28729 | 1294 *value = procamp.hue * 100 / M_PI; |
28725
b9c26620ada7
Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents:
28724
diff
changeset
|
1295 else |
b9c26620ada7
Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents:
28724
diff
changeset
|
1296 return VO_NOTIMPL; |
b9c26620ada7
Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents:
28724
diff
changeset
|
1297 return VO_TRUE; |
b9c26620ada7
Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents:
28724
diff
changeset
|
1298 } |
b9c26620ada7
Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents:
28724
diff
changeset
|
1299 |
29713 | 1300 static int set_equalizer(char *name, int value) |
1301 { | |
28725
b9c26620ada7
Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents:
28724
diff
changeset
|
1302 if (!strcasecmp(name, "brightness")) |
b9c26620ada7
Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents:
28724
diff
changeset
|
1303 procamp.brightness = value / 100.0; |
b9c26620ada7
Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents:
28724
diff
changeset
|
1304 else if (!strcasecmp(name, "contrast")) |
b9c26620ada7
Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents:
28724
diff
changeset
|
1305 procamp.contrast = value / 100.0 + 1.0; |
b9c26620ada7
Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents:
28724
diff
changeset
|
1306 else if (!strcasecmp(name, "saturation")) |
b9c26620ada7
Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents:
28724
diff
changeset
|
1307 procamp.saturation = value / 100.0 + 1.0; |
b9c26620ada7
Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents:
28724
diff
changeset
|
1308 else if (!strcasecmp(name, "hue")) |
28729 | 1309 procamp.hue = value / 100.0 * M_PI; |
28725
b9c26620ada7
Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents:
28724
diff
changeset
|
1310 else |
b9c26620ada7
Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents:
28724
diff
changeset
|
1311 return VO_NOTIMPL; |
b9c26620ada7
Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents:
28724
diff
changeset
|
1312 |
29727 | 1313 return update_csc_matrix(); |
28725
b9c26620ada7
Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents:
28724
diff
changeset
|
1314 } |
b9c26620ada7
Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents:
28724
diff
changeset
|
1315 |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1316 static int control(uint32_t request, void *data, ...) |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1317 { |
29735 | 1318 if (handle_preemption() < 0) |
1319 return VO_FALSE; | |
1320 | |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1321 switch (request) { |
29713 | 1322 case VOCTRL_GET_DEINTERLACE: |
1323 *(int*)data = deint; | |
1324 return VO_TRUE; | |
1325 case VOCTRL_SET_DEINTERLACE: | |
29756 | 1326 if (image_format == IMGFMT_BGRA) |
1327 return VO_NOTIMPL; | |
29713 | 1328 deint = *(int*)data; |
1329 if (deint) | |
1330 deint = deint_type; | |
1331 if (deint_type > 2) { | |
1332 VdpStatus vdp_st; | |
1333 VdpVideoMixerFeature features[1] = | |
1334 {deint_type == 3 ? | |
1335 VDP_VIDEO_MIXER_FEATURE_DEINTERLACE_TEMPORAL : | |
1336 VDP_VIDEO_MIXER_FEATURE_DEINTERLACE_TEMPORAL_SPATIAL}; | |
1337 VdpBool feature_enables[1] = {deint ? VDP_TRUE : VDP_FALSE}; | |
1338 vdp_st = vdp_video_mixer_set_feature_enables(video_mixer, 1, | |
1339 features, | |
1340 feature_enables); | |
1341 CHECK_ST_WARNING("Error changing deinterlacing settings") | |
1342 } | |
1343 return VO_TRUE; | |
1344 case VOCTRL_PAUSE: | |
29717
afc8b80eb027
cosmetics: Remove some pointless parentheses from return calls.
diego
parents:
29716
diff
changeset
|
1345 return int_pause = 1; |
29713 | 1346 case VOCTRL_RESUME: |
29717
afc8b80eb027
cosmetics: Remove some pointless parentheses from return calls.
diego
parents:
29716
diff
changeset
|
1347 return int_pause = 0; |
29713 | 1348 case VOCTRL_QUERY_FORMAT: |
1349 return query_format(*(uint32_t *)data); | |
1350 case VOCTRL_GET_IMAGE: | |
1351 return get_image(data); | |
1352 case VOCTRL_DRAW_IMAGE: | |
1353 return draw_image(data); | |
1354 case VOCTRL_GUISUPPORT: | |
1355 return VO_TRUE; | |
1356 case VOCTRL_BORDER: | |
1357 vo_x11_border(); | |
1358 resize(); | |
1359 return VO_TRUE; | |
1360 case VOCTRL_FULLSCREEN: | |
1361 vo_x11_fullscreen(); | |
1362 resize(); | |
1363 return VO_TRUE; | |
1364 case VOCTRL_GET_PANSCAN: | |
1365 return VO_TRUE; | |
1366 case VOCTRL_SET_PANSCAN: | |
1367 resize(); | |
1368 return VO_TRUE; | |
1369 case VOCTRL_SET_EQUALIZER: { | |
1370 va_list ap; | |
1371 int value; | |
29756 | 1372 if (image_format == IMGFMT_BGRA) |
1373 return VO_NOTIMPL; | |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1374 |
29713 | 1375 va_start(ap, data); |
1376 value = va_arg(ap, int); | |
1377 | |
1378 va_end(ap); | |
1379 return set_equalizer(data, value); | |
1380 } | |
1381 case VOCTRL_GET_EQUALIZER: { | |
1382 va_list ap; | |
1383 int *value; | |
1384 | |
1385 va_start(ap, data); | |
1386 value = va_arg(ap, int *); | |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1387 |
29713 | 1388 va_end(ap); |
1389 return get_equalizer(data, value); | |
1390 } | |
1391 case VOCTRL_ONTOP: | |
1392 vo_x11_ontop(); | |
1393 return VO_TRUE; | |
1394 case VOCTRL_UPDATE_SCREENINFO: | |
1395 update_xinerama_info(); | |
1396 return VO_TRUE; | |
1397 case VOCTRL_DRAW_EOSD: | |
1398 if (!data) | |
1399 return VO_FALSE; | |
1400 generate_eosd(data); | |
1401 draw_eosd(); | |
1402 return VO_TRUE; | |
1403 case VOCTRL_GET_EOSD_RES: { | |
32391
b4c3659d16b1
Use a dynamic list for the sources of EOSD elements.
cigaes
parents:
32209
diff
changeset
|
1404 struct mp_eosd_settings *r = data; |
29713 | 1405 r->mt = r->mb = r->ml = r->mr = 0; |
30065
d5d20b8256b7
Some ugly hacks to make compiling against a newer external version of libass work.
reimar
parents:
30063
diff
changeset
|
1406 r->srcw = vid_width; r->srch = vid_height; |
29713 | 1407 if (vo_fs) { |
1408 r->w = vo_screenwidth; | |
1409 r->h = vo_screenheight; | |
1410 r->ml = r->mr = border_x; | |
1411 r->mt = r->mb = border_y; | |
1412 } else { | |
1413 r->w = vo_dwidth; | |
1414 r->h = vo_dheight; | |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1415 } |
29713 | 1416 return VO_TRUE; |
1417 } | |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1418 } |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1419 return VO_NOTIMPL; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1420 } |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1421 |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff
changeset
|
1422 /* @} */ |