annotate libvo/vo_vdpau.c @ 36332:9de70162224b

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