annotate libvo/vo_vdpau.c @ 28992:947ef23ba798

Test if create_vdp_decoder() might succeed by calling it from config() with a small value for max_reference_frames. This does not make automatic recovery by using software decoder possible, but lets MPlayer fail more graciously on - actually existing - buggy hardware that does not support certain H264 widths when using hardware accelerated decoding (784, 864, 944, 1024, 1808, 1888 pixels on NVIDIA G98) and if the user tries to hardware-decode more samples at the same time than supported. Might break playback of H264 Intra-Only samples on hardware with very little video memory.
author cehoyos
date Sat, 21 Mar 2009 20:11:05 +0000
parents 8cf16b1d8dde
children 56d2b2886a28
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>
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
36 #include <dlfcn.h>
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"
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
39 #include "mp_msg.h"
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
40 #include "video_out.h"
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
41 #include "video_out_internal.h"
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
42 #include "x11_common.h"
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
43 #include "aspect.h"
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
44 #include "sub.h"
28638
7b16ccf423b4 Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents: 28611
diff changeset
45 #include "subopt-helper.h"
28582
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
46
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
47 #include "libavcodec/vdpau.h"
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
48
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
49 #include "gui/interface.h"
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
50
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
51 #include "libavutil/common.h"
28729
bbf7f7100e91 Use M_PI for pi.
cehoyos
parents: 28728
diff changeset
52 #include "libavutil/mathematics.h"
28582
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
53
28675
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
54 #include "libass/ass.h"
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
55 #include "libass/ass_mp.h"
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
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
64 LIBVO_EXTERN(vdpau)
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 */
28696
fdc03572004c Change code to actually work when NUM_OUTPUT_SURFACES is changed.
reimar
parents: 28689
diff changeset
79 #define NUM_OUTPUT_SURFACES 2
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 VdpDeviceCreateX11 *vdp_device_create;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
97 static VdpGetProcAddress *vdp_get_proc_address;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
98
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
99 static VdpPresentationQueueTarget vdp_flip_target;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
100 static VdpPresentationQueue vdp_flip_queue;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
101
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
102 static VdpDeviceDestroy *vdp_device_destroy;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
103 static VdpVideoSurfaceCreate *vdp_video_surface_create;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
104 static VdpVideoSurfaceDestroy *vdp_video_surface_destroy;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
105
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
106 static VdpGetErrorString *vdp_get_error_string;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
107
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
108 /* May be used in software filtering/postprocessing options
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
109 * 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
110 * system memory.
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
111 */
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
112 static VdpVideoSurfacePutBitsYCbCr *vdp_video_surface_put_bits_y_cb_cr;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
113 static VdpOutputSurfacePutBitsNative *vdp_output_surface_put_bits_native;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
114
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
115 static VdpOutputSurfaceCreate *vdp_output_surface_create;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
116 static VdpOutputSurfaceDestroy *vdp_output_surface_destroy;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
117
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
118 /* VideoMixer puts video_surface data on displayable output_surface. */
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
119 static VdpVideoMixerCreate *vdp_video_mixer_create;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
120 static VdpVideoMixerDestroy *vdp_video_mixer_destroy;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
121 static VdpVideoMixerRender *vdp_video_mixer_render;
28638
7b16ccf423b4 Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents: 28611
diff changeset
122 static VdpVideoMixerSetFeatureEnables *vdp_video_mixer_set_feature_enables;
7b16ccf423b4 Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents: 28611
diff changeset
123 static VdpVideoMixerSetAttributeValues *vdp_video_mixer_set_attribute_values;
28582
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
124
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
125 static VdpPresentationQueueTargetDestroy *vdp_presentation_queue_target_destroy;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
126 static VdpPresentationQueueCreate *vdp_presentation_queue_create;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
127 static VdpPresentationQueueDestroy *vdp_presentation_queue_destroy;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
128 static VdpPresentationQueueDisplay *vdp_presentation_queue_display;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
129 static VdpPresentationQueueBlockUntilSurfaceIdle *vdp_presentation_queue_block_until_surface_idle;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
130 static VdpPresentationQueueTargetCreateX11 *vdp_presentation_queue_target_create_x11;
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;
b9c26620ada7 Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents: 28724
diff changeset
145
28582
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
146 static void *vdpau_lib_handle;
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];
28933
b0badbd680c6 Initial support for advanced VDPAU deinterlacers (software-decoded video
cehoyos
parents: 28892
diff changeset
150 static VdpVideoSurface deint_surfaces[3];
28956
6d0da4fd4544 Allow to use vdpau temporal deinterlacers with hardware accelerated decoding.
cehoyos
parents: 28944
diff changeset
151 static mp_image_t *deint_mpi[3];
28582
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
152 static int output_surface_width, output_surface_height;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
153
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
154 static VdpVideoMixer video_mixer;
28638
7b16ccf423b4 Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents: 28611
diff changeset
155 static int deint;
28709
4e89476f8952 Do not forget the chosen deinterlacer for -vo vdpau.
cehoyos
parents: 28708
diff changeset
156 static int deint_type;
28933
b0badbd680c6 Initial support for advanced VDPAU deinterlacers (software-decoded video
cehoyos
parents: 28892
diff changeset
157 static int deint_counter;
28956
6d0da4fd4544 Allow to use vdpau temporal deinterlacers with hardware accelerated decoding.
cehoyos
parents: 28944
diff changeset
158 static int deint_buffer_past_frames;
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;
28944
cb18135338dd Add chroma-deint option to vo vdpau (nochroma-deint speeds up deinterlacing).
cehoyos
parents: 28936
diff changeset
162 static int chroma_deint;
28684
75aebdf41ee9 Enable Bob de-interlacing for VDPAU.
cehoyos
parents: 28676
diff changeset
163 static int top_field_first;
28582
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
164
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
165 static VdpDecoder decoder;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
166 static int decoder_max_refs;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
167
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
168 static VdpRect src_rect_vid;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
169 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
170 static int border_x, border_y;
28582
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 struct vdpau_render_state surface_render[MAX_VIDEO_SURFACES];
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
173 static int surface_num;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
174 static int vid_surface_num;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
175 static uint32_t vid_width, vid_height;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
176 static uint32_t image_format;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
177 static const VdpChromaType vdp_chroma_type = VDP_CHROMA_TYPE_420;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
178
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
179 /* draw_osd */
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
180 static unsigned char *index_data;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
181 static int index_data_size;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
182 static uint32_t palette[PALETTE_SIZE];
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
183
28675
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
184 // EOSD
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
185 // Pool of surfaces
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
186 struct {
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
187 VdpBitmapSurface surface;
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
188 int w;
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
189 int h;
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
190 char in_use;
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
191 } *eosd_surfaces;
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
192
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
193 // List of surfaces to be rendered
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
194 struct {
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
195 VdpBitmapSurface surface;
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
196 VdpRect source;
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
197 VdpRect dest;
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
198 VdpColor color;
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
199 } *eosd_targets;
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
200
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
201 static int eosd_render_count;
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
202 static int eosd_surface_count;
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
203
28725
b9c26620ada7 Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents: 28724
diff changeset
204 // Video equalizer
b9c26620ada7 Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents: 28724
diff changeset
205 static VdpProcamp procamp;
b9c26620ada7 Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents: 28724
diff changeset
206
28582
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
207 /*
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
208 * X11 specific
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
209 */
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
210 static int visible_buf;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
211 static int int_pause;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
212
28805
b382d065ba53 As for vo_gl, do not rely on draw_osd to render EOSD.
reimar
parents: 28804
diff changeset
213 static void draw_eosd(void);
b382d065ba53 As for vo_gl, do not rely on draw_osd to render EOSD.
reimar
parents: 28804
diff changeset
214
28582
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
215 static void video_to_output_surface(void)
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 VdpTime dummy;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
218 VdpStatus vdp_st;
28684
75aebdf41ee9 Enable Bob de-interlacing for VDPAU.
cehoyos
parents: 28676
diff changeset
219 int i;
28933
b0badbd680c6 Initial support for advanced VDPAU deinterlacers (software-decoded video
cehoyos
parents: 28892
diff changeset
220 if (vid_surface_num < 0 || deint_surfaces[0] == VDP_INVALID_HANDLE)
28582
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
221 return;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
222
28708
ebd393e9f567 Add one-field-only output for -vo vdpau.
cehoyos
parents: 28707
diff changeset
223 for (i = 0; i <= !!(deint > 1); i++) {
28684
75aebdf41ee9 Enable Bob de-interlacing for VDPAU.
cehoyos
parents: 28676
diff changeset
224 int field = VDP_VIDEO_MIXER_PICTURE_STRUCTURE_FRAME;
75aebdf41ee9 Enable Bob de-interlacing for VDPAU.
cehoyos
parents: 28676
diff changeset
225 VdpOutputSurface output_surface;
28724
307da077861c Fix OSD for vo vdpau:deint>1.
cehoyos
parents: 28723
diff changeset
226 if (i) {
28805
b382d065ba53 As for vo_gl, do not rely on draw_osd to render EOSD.
reimar
parents: 28804
diff changeset
227 draw_eosd();
28724
307da077861c Fix OSD for vo vdpau:deint>1.
cehoyos
parents: 28723
diff changeset
228 draw_osd();
28684
75aebdf41ee9 Enable Bob de-interlacing for VDPAU.
cehoyos
parents: 28676
diff changeset
229 flip_page();
28724
307da077861c Fix OSD for vo vdpau:deint>1.
cehoyos
parents: 28723
diff changeset
230 }
28684
75aebdf41ee9 Enable Bob de-interlacing for VDPAU.
cehoyos
parents: 28676
diff changeset
231 if (deint)
75aebdf41ee9 Enable Bob de-interlacing for VDPAU.
cehoyos
parents: 28676
diff changeset
232 field = top_field_first == i ?
75aebdf41ee9 Enable Bob de-interlacing for VDPAU.
cehoyos
parents: 28676
diff changeset
233 VDP_VIDEO_MIXER_PICTURE_STRUCTURE_BOTTOM_FIELD:
75aebdf41ee9 Enable Bob de-interlacing for VDPAU.
cehoyos
parents: 28676
diff changeset
234 VDP_VIDEO_MIXER_PICTURE_STRUCTURE_TOP_FIELD;
75aebdf41ee9 Enable Bob de-interlacing for VDPAU.
cehoyos
parents: 28676
diff changeset
235 output_surface = output_surfaces[surface_num];
75aebdf41ee9 Enable Bob de-interlacing for VDPAU.
cehoyos
parents: 28676
diff changeset
236 vdp_st = vdp_presentation_queue_block_until_surface_idle(vdp_flip_queue,
75aebdf41ee9 Enable Bob de-interlacing for VDPAU.
cehoyos
parents: 28676
diff changeset
237 output_surface,
75aebdf41ee9 Enable Bob de-interlacing for VDPAU.
cehoyos
parents: 28676
diff changeset
238 &dummy);
75aebdf41ee9 Enable Bob de-interlacing for VDPAU.
cehoyos
parents: 28676
diff changeset
239 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
240
28689
1189f633ca32 Cosmetics: Fix indentation and line length.
cehoyos
parents: 28684
diff changeset
241 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
242 field, 2, deint_surfaces + 1,
b0badbd680c6 Initial support for advanced VDPAU deinterlacers (software-decoded video
cehoyos
parents: 28892
diff changeset
243 deint_surfaces[0],
b0badbd680c6 Initial support for advanced VDPAU deinterlacers (software-decoded video
cehoyos
parents: 28892
diff changeset
244 1, &surface_render[vid_surface_num].surface,
b0badbd680c6 Initial support for advanced VDPAU deinterlacers (software-decoded video
cehoyos
parents: 28892
diff changeset
245 &src_rect_vid,
28689
1189f633ca32 Cosmetics: Fix indentation and line length.
cehoyos
parents: 28684
diff changeset
246 output_surface,
1189f633ca32 Cosmetics: Fix indentation and line length.
cehoyos
parents: 28684
diff changeset
247 NULL, &out_rect_vid, 0, NULL);
1189f633ca32 Cosmetics: Fix indentation and line length.
cehoyos
parents: 28684
diff changeset
248 CHECK_ST_WARNING("Error when calling vdp_video_mixer_render")
28684
75aebdf41ee9 Enable Bob de-interlacing for VDPAU.
cehoyos
parents: 28676
diff changeset
249 }
28582
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
250 }
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
251
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
252 static void resize(void)
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
253 {
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
254 VdpStatus vdp_st;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
255 int i;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
256 struct vo_rect src_rect;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
257 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
258 struct vo_rect borders;
4172d83194f2 Extend calc_src_dst_rects to also calculate the border values needed for
reimar
parents: 28582
diff changeset
259 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
260 out_rect_vid.x0 = dst_rect.left;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
261 out_rect_vid.x1 = dst_rect.right;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
262 out_rect_vid.y0 = dst_rect.top;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
263 out_rect_vid.y1 = dst_rect.bottom;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
264 src_rect_vid.x0 = src_rect.left;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
265 src_rect_vid.x1 = src_rect.right;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
266 src_rect_vid.y0 = src_rect.top;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
267 src_rect_vid.y1 = src_rect.bottom;
28598
4172d83194f2 Extend calc_src_dst_rects to also calculate the border values needed for
reimar
parents: 28582
diff changeset
268 border_x = borders.left;
4172d83194f2 Extend calc_src_dst_rects to also calculate the border values needed for
reimar
parents: 28582
diff changeset
269 border_y = borders.top;
28582
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
270 #ifdef CONFIG_FREETYPE
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
271 // adjust font size to display size
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
272 force_load_font = 1;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
273 #endif
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
274 vo_osd_changed(OSDTYPE_OSD);
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
275
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
276 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
277 if (output_surface_width < vo_dwidth) {
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
278 output_surface_width += output_surface_width >> 1;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
279 output_surface_width = FFMAX(output_surface_width, vo_dwidth);
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
280 }
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
281 if (output_surface_height < vo_dheight) {
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
282 output_surface_height += output_surface_height >> 1;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
283 output_surface_height = FFMAX(output_surface_height, vo_dheight);
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 // Creation of output_surfaces
28696
fdc03572004c Change code to actually work when NUM_OUTPUT_SURFACES is changed.
reimar
parents: 28689
diff changeset
286 for (i = 0; i <= NUM_OUTPUT_SURFACES; i++) {
28582
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
287 if (output_surfaces[i] != VDP_INVALID_HANDLE)
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
288 vdp_output_surface_destroy(output_surfaces[i]);
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
289 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
290 output_surface_width, output_surface_height,
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
291 &output_surfaces[i]);
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
292 CHECK_ST_WARNING("Error when calling vdp_output_surface_create")
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
293 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
294 }
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
295 }
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
296 video_to_output_surface();
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
297 if (visible_buf)
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
298 flip_page();
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
299 }
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
300
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
301 /* Initialize vdp_get_proc_address, called from preinit() */
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
302 static int win_x11_init_vdpau_procs(void)
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
303 {
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
304 VdpStatus vdp_st;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
305
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
306 struct vdp_function {
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
307 const int id;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
308 void *pointer;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
309 };
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
310
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
311 const struct vdp_function *dsc;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
312
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
313 static const struct vdp_function vdp_func[] = {
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
314 {VDP_FUNC_ID_GET_ERROR_STRING, &vdp_get_error_string},
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
315 {VDP_FUNC_ID_DEVICE_DESTROY, &vdp_device_destroy},
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
316 {VDP_FUNC_ID_VIDEO_SURFACE_CREATE, &vdp_video_surface_create},
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
317 {VDP_FUNC_ID_VIDEO_SURFACE_DESTROY, &vdp_video_surface_destroy},
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
318 {VDP_FUNC_ID_VIDEO_SURFACE_PUT_BITS_Y_CB_CR,
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
319 &vdp_video_surface_put_bits_y_cb_cr},
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
320 {VDP_FUNC_ID_OUTPUT_SURFACE_PUT_BITS_NATIVE,
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
321 &vdp_output_surface_put_bits_native},
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
322 {VDP_FUNC_ID_OUTPUT_SURFACE_CREATE, &vdp_output_surface_create},
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
323 {VDP_FUNC_ID_OUTPUT_SURFACE_DESTROY, &vdp_output_surface_destroy},
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
324 {VDP_FUNC_ID_VIDEO_MIXER_CREATE, &vdp_video_mixer_create},
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
325 {VDP_FUNC_ID_VIDEO_MIXER_DESTROY, &vdp_video_mixer_destroy},
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
326 {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
327 {VDP_FUNC_ID_VIDEO_MIXER_SET_FEATURE_ENABLES,
7b16ccf423b4 Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents: 28611
diff changeset
328 &vdp_video_mixer_set_feature_enables},
7b16ccf423b4 Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents: 28611
diff changeset
329 {VDP_FUNC_ID_VIDEO_MIXER_SET_ATTRIBUTE_VALUES,
7b16ccf423b4 Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents: 28611
diff changeset
330 &vdp_video_mixer_set_attribute_values},
28582
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
331 {VDP_FUNC_ID_PRESENTATION_QUEUE_TARGET_DESTROY,
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
332 &vdp_presentation_queue_target_destroy},
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
333 {VDP_FUNC_ID_PRESENTATION_QUEUE_CREATE, &vdp_presentation_queue_create},
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
334 {VDP_FUNC_ID_PRESENTATION_QUEUE_DESTROY,
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
335 &vdp_presentation_queue_destroy},
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
336 {VDP_FUNC_ID_PRESENTATION_QUEUE_DISPLAY,
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
337 &vdp_presentation_queue_display},
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
338 {VDP_FUNC_ID_PRESENTATION_QUEUE_BLOCK_UNTIL_SURFACE_IDLE,
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
339 &vdp_presentation_queue_block_until_surface_idle},
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
340 {VDP_FUNC_ID_PRESENTATION_QUEUE_TARGET_CREATE_X11,
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
341 &vdp_presentation_queue_target_create_x11},
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
342 {VDP_FUNC_ID_OUTPUT_SURFACE_RENDER_OUTPUT_SURFACE,
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
343 &vdp_output_surface_render_output_surface},
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
344 {VDP_FUNC_ID_OUTPUT_SURFACE_PUT_BITS_INDEXED,
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
345 &vdp_output_surface_put_bits_indexed},
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
346 {VDP_FUNC_ID_DECODER_CREATE, &vdp_decoder_create},
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
347 {VDP_FUNC_ID_DECODER_RENDER, &vdp_decoder_render},
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
348 {VDP_FUNC_ID_DECODER_DESTROY, &vdp_decoder_destroy},
28675
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
349 {VDP_FUNC_ID_BITMAP_SURFACE_CREATE, &vdp_bitmap_surface_create},
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
350 {VDP_FUNC_ID_BITMAP_SURFACE_DESTROY, &vdp_bitmap_surface_destroy},
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
351 {VDP_FUNC_ID_BITMAP_SURFACE_PUT_BITS_NATIVE,
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
352 &vdp_bitmap_surface_putbits_native},
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
353 {VDP_FUNC_ID_OUTPUT_SURFACE_RENDER_BITMAP_SURFACE,
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
354 &vdp_output_surface_render_bitmap_surface},
28725
b9c26620ada7 Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents: 28724
diff changeset
355 {VDP_FUNC_ID_GENERATE_CSC_MATRIX, &vdp_generate_csc_matrix},
28582
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
356 {0, NULL}
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
357 };
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
358
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
359 vdp_st = vdp_device_create(mDisplay, mScreen,
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
360 &vdp_device, &vdp_get_proc_address);
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
361 if (vdp_st != VDP_STATUS_OK) {
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
362 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
363 return -1;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
364 }
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
365
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
366 for (dsc = vdp_func; dsc->pointer; dsc++) {
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
367 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
368 if (vdp_st != VDP_STATUS_OK) {
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
369 mp_msg(MSGT_VO, MSGL_ERR, "[vdpau] Error when calling vdp_get_proc_address(function id %d): %s\n", dsc->id, vdp_get_error_string ? vdp_get_error_string(vdp_st) : "?");
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
370 return -1;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
371 }
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
372 }
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
373 return 0;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
374 }
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
375
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
376 /* Initialize vdpau_flip_queue, called from config() */
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
377 static int win_x11_init_vdpau_flip_queue(void)
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
378 {
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
379 VdpStatus vdp_st;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
380
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
381 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
382 &vdp_flip_target);
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
383 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
384
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
385 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
386 &vdp_flip_queue);
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
387 CHECK_ST_ERROR("Error when calling vdp_presentation_queue_create")
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
388
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
389 return 0;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
390 }
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
391
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
392 static int create_vdp_mixer(VdpChromaType vdp_chroma_type) {
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
393 #define VDP_NUM_MIXER_PARAMETER 3
28638
7b16ccf423b4 Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents: 28611
diff changeset
394 #define MAX_NUM_FEATURES 5
7b16ccf423b4 Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents: 28611
diff changeset
395 int i;
28582
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
396 VdpStatus vdp_st;
28638
7b16ccf423b4 Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents: 28611
diff changeset
397 int feature_count = 0;
7b16ccf423b4 Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents: 28611
diff changeset
398 VdpVideoMixerFeature features[MAX_NUM_FEATURES];
7b16ccf423b4 Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents: 28611
diff changeset
399 VdpBool feature_enables[MAX_NUM_FEATURES];
28658
94fcc9e0449b Add forgotten type to variable declaration.
reimar
parents: 28639
diff changeset
400 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
401 const void * const denoise_value[] = {&denoise};
28658
94fcc9e0449b Add forgotten type to variable declaration.
reimar
parents: 28639
diff changeset
402 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
403 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
404 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
405 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
406 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
407 static const VdpVideoMixerParameter parameters[VDP_NUM_MIXER_PARAMETER] = {
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
408 VDP_VIDEO_MIXER_PARAMETER_VIDEO_SURFACE_WIDTH,
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
409 VDP_VIDEO_MIXER_PARAMETER_VIDEO_SURFACE_HEIGHT,
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
410 VDP_VIDEO_MIXER_PARAMETER_CHROMA_TYPE
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 const void *const parameter_values[VDP_NUM_MIXER_PARAMETER] = {
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
413 &vid_width,
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
414 &vid_height,
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
415 &vdp_chroma_type
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
416 };
28934
e8c117f5758a Cosmetics: Fix whitespace.
cehoyos
parents: 28933
diff changeset
417 features[feature_count++] = VDP_VIDEO_MIXER_FEATURE_DEINTERLACE_TEMPORAL;
28708
ebd393e9f567 Add one-field-only output for -vo vdpau.
cehoyos
parents: 28707
diff changeset
418 if (deint == 4)
28638
7b16ccf423b4 Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents: 28611
diff changeset
419 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
420 if (pullup)
7b16ccf423b4 Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents: 28611
diff changeset
421 features[feature_count++] = VDP_VIDEO_MIXER_FEATURE_INVERSE_TELECINE;
7b16ccf423b4 Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents: 28611
diff changeset
422 if (denoise)
7b16ccf423b4 Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents: 28611
diff changeset
423 features[feature_count++] = VDP_VIDEO_MIXER_FEATURE_NOISE_REDUCTION;
7b16ccf423b4 Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents: 28611
diff changeset
424 if (sharpen)
7b16ccf423b4 Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents: 28611
diff changeset
425 features[feature_count++] = VDP_VIDEO_MIXER_FEATURE_SHARPNESS;
28582
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
426
28638
7b16ccf423b4 Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents: 28611
diff changeset
427 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
428 VDP_NUM_MIXER_PARAMETER,
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
429 parameters, parameter_values,
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
430 &video_mixer);
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
431 CHECK_ST_ERROR("Error when calling vdp_video_mixer_create")
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
432
28638
7b16ccf423b4 Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents: 28611
diff changeset
433 for (i = 0; i < feature_count; i++) feature_enables[i] = VDP_TRUE;
28933
b0badbd680c6 Initial support for advanced VDPAU deinterlacers (software-decoded video
cehoyos
parents: 28892
diff changeset
434 if (deint < 3)
b0badbd680c6 Initial support for advanced VDPAU deinterlacers (software-decoded video
cehoyos
parents: 28892
diff changeset
435 feature_enables[0] = VDP_FALSE;
28638
7b16ccf423b4 Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents: 28611
diff changeset
436 if (feature_count)
7b16ccf423b4 Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents: 28611
diff changeset
437 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
438 if (denoise)
7b16ccf423b4 Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents: 28611
diff changeset
439 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
440 if (sharpen)
7b16ccf423b4 Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents: 28611
diff changeset
441 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
442 if (!chroma_deint)
cb18135338dd Add chroma-deint option to vo vdpau (nochroma-deint speeds up deinterlacing).
cehoyos
parents: 28936
diff changeset
443 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
444
28582
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
445 return 0;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
446 }
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
447
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
448 // Free everything specific to a certain video file
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
449 static void free_video_specific(void) {
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
450 int i;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
451 VdpStatus vdp_st;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
452
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
453 if (decoder != VDP_INVALID_HANDLE)
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
454 vdp_decoder_destroy(decoder);
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
455 decoder = VDP_INVALID_HANDLE;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
456 decoder_max_refs = -1;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
457
28936
fd9de1e70d47 Move initialisation of deint_surfaces[] to free_video_specific().
cehoyos
parents: 28935
diff changeset
458 for (i = 0; i < 3; i++)
fd9de1e70d47 Move initialisation of deint_surfaces[] to free_video_specific().
cehoyos
parents: 28935
diff changeset
459 deint_surfaces[i] = VDP_INVALID_HANDLE;
fd9de1e70d47 Move initialisation of deint_surfaces[] to free_video_specific().
cehoyos
parents: 28935
diff changeset
460
28956
6d0da4fd4544 Allow to use vdpau temporal deinterlacers with hardware accelerated decoding.
cehoyos
parents: 28944
diff changeset
461 for (i = 0; i < 3; i++)
6d0da4fd4544 Allow to use vdpau temporal deinterlacers with hardware accelerated decoding.
cehoyos
parents: 28944
diff changeset
462 if (deint_mpi[i]) {
6d0da4fd4544 Allow to use vdpau temporal deinterlacers with hardware accelerated decoding.
cehoyos
parents: 28944
diff changeset
463 deint_mpi[i]->usage_count--;
6d0da4fd4544 Allow to use vdpau temporal deinterlacers with hardware accelerated decoding.
cehoyos
parents: 28944
diff changeset
464 deint_mpi[i] = NULL;
6d0da4fd4544 Allow to use vdpau temporal deinterlacers with hardware accelerated decoding.
cehoyos
parents: 28944
diff changeset
465 }
6d0da4fd4544 Allow to use vdpau temporal deinterlacers with hardware accelerated decoding.
cehoyos
parents: 28944
diff changeset
466
28582
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
467 for (i = 0; i < MAX_VIDEO_SURFACES; i++) {
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
468 if (surface_render[i].surface != VDP_INVALID_HANDLE) {
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
469 vdp_st = vdp_video_surface_destroy(surface_render[i].surface);
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
470 CHECK_ST_WARNING("Error when calling vdp_video_surface_destroy")
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
471 }
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
472 surface_render[i].surface = VDP_INVALID_HANDLE;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
473 }
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
474
28676
d5c295360163 Only check for vdp_video_mixer_destroy failure when we actually executed that function.
reimar
parents: 28675
diff changeset
475 if (video_mixer != VDP_INVALID_HANDLE) {
28582
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
476 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
477 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
478 }
28582
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
479 video_mixer = VDP_INVALID_HANDLE;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
480 }
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
481
28989
aa1e43639e47 Factorize create_vdp_decoder().
cehoyos
parents: 28956
diff changeset
482 static int create_vdp_decoder(int max_refs)
aa1e43639e47 Factorize create_vdp_decoder().
cehoyos
parents: 28956
diff changeset
483 {
aa1e43639e47 Factorize create_vdp_decoder().
cehoyos
parents: 28956
diff changeset
484 VdpStatus vdp_st;
aa1e43639e47 Factorize create_vdp_decoder().
cehoyos
parents: 28956
diff changeset
485 VdpDecoderProfile vdp_decoder_profile;
aa1e43639e47 Factorize create_vdp_decoder().
cehoyos
parents: 28956
diff changeset
486 if (decoder != VDP_INVALID_HANDLE)
aa1e43639e47 Factorize create_vdp_decoder().
cehoyos
parents: 28956
diff changeset
487 vdp_decoder_destroy(decoder);
aa1e43639e47 Factorize create_vdp_decoder().
cehoyos
parents: 28956
diff changeset
488 switch (image_format) {
aa1e43639e47 Factorize create_vdp_decoder().
cehoyos
parents: 28956
diff changeset
489 case IMGFMT_VDPAU_MPEG1:
aa1e43639e47 Factorize create_vdp_decoder().
cehoyos
parents: 28956
diff changeset
490 vdp_decoder_profile = VDP_DECODER_PROFILE_MPEG1;
aa1e43639e47 Factorize create_vdp_decoder().
cehoyos
parents: 28956
diff changeset
491 break;
aa1e43639e47 Factorize create_vdp_decoder().
cehoyos
parents: 28956
diff changeset
492 case IMGFMT_VDPAU_MPEG2:
aa1e43639e47 Factorize create_vdp_decoder().
cehoyos
parents: 28956
diff changeset
493 vdp_decoder_profile = VDP_DECODER_PROFILE_MPEG2_MAIN;
aa1e43639e47 Factorize create_vdp_decoder().
cehoyos
parents: 28956
diff changeset
494 break;
aa1e43639e47 Factorize create_vdp_decoder().
cehoyos
parents: 28956
diff changeset
495 case IMGFMT_VDPAU_H264:
aa1e43639e47 Factorize create_vdp_decoder().
cehoyos
parents: 28956
diff changeset
496 vdp_decoder_profile = VDP_DECODER_PROFILE_H264_HIGH;
aa1e43639e47 Factorize create_vdp_decoder().
cehoyos
parents: 28956
diff changeset
497 mp_msg(MSGT_VO, MSGL_V, "[vdpau] Creating H264 hardware decoder for %d reference frames.\n", max_refs);
aa1e43639e47 Factorize create_vdp_decoder().
cehoyos
parents: 28956
diff changeset
498 break;
aa1e43639e47 Factorize create_vdp_decoder().
cehoyos
parents: 28956
diff changeset
499 case IMGFMT_VDPAU_WMV3:
aa1e43639e47 Factorize create_vdp_decoder().
cehoyos
parents: 28956
diff changeset
500 vdp_decoder_profile = VDP_DECODER_PROFILE_VC1_MAIN;
aa1e43639e47 Factorize create_vdp_decoder().
cehoyos
parents: 28956
diff changeset
501 break;
aa1e43639e47 Factorize create_vdp_decoder().
cehoyos
parents: 28956
diff changeset
502 case IMGFMT_VDPAU_VC1:
aa1e43639e47 Factorize create_vdp_decoder().
cehoyos
parents: 28956
diff changeset
503 vdp_decoder_profile = VDP_DECODER_PROFILE_VC1_ADVANCED;
aa1e43639e47 Factorize create_vdp_decoder().
cehoyos
parents: 28956
diff changeset
504 break;
aa1e43639e47 Factorize create_vdp_decoder().
cehoyos
parents: 28956
diff changeset
505 }
aa1e43639e47 Factorize create_vdp_decoder().
cehoyos
parents: 28956
diff changeset
506 vdp_st = vdp_decoder_create(vdp_device, vdp_decoder_profile,
aa1e43639e47 Factorize create_vdp_decoder().
cehoyos
parents: 28956
diff changeset
507 vid_width, vid_height, max_refs, &decoder);
aa1e43639e47 Factorize create_vdp_decoder().
cehoyos
parents: 28956
diff changeset
508 CHECK_ST_WARNING("Failed creating VDPAU decoder");
aa1e43639e47 Factorize create_vdp_decoder().
cehoyos
parents: 28956
diff changeset
509 if (vdp_st != VDP_STATUS_OK) {
aa1e43639e47 Factorize create_vdp_decoder().
cehoyos
parents: 28956
diff changeset
510 decoder = VDP_INVALID_HANDLE;
aa1e43639e47 Factorize create_vdp_decoder().
cehoyos
parents: 28956
diff changeset
511 decoder_max_refs = 0;
28991
8cf16b1d8dde Change return value for create_vdp_decoder().
cehoyos
parents: 28989
diff changeset
512 return 0;
28989
aa1e43639e47 Factorize create_vdp_decoder().
cehoyos
parents: 28956
diff changeset
513 }
aa1e43639e47 Factorize create_vdp_decoder().
cehoyos
parents: 28956
diff changeset
514 decoder_max_refs = max_refs;
28991
8cf16b1d8dde Change return value for create_vdp_decoder().
cehoyos
parents: 28989
diff changeset
515 return 1;
28989
aa1e43639e47 Factorize create_vdp_decoder().
cehoyos
parents: 28956
diff changeset
516 }
aa1e43639e47 Factorize create_vdp_decoder().
cehoyos
parents: 28956
diff changeset
517
28582
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
518 /*
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
519 * connect to X server, create and map window, initialize all
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
520 * VDPAU objects, create different surfaces etc.
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
521 */
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
522 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
523 uint32_t d_height, uint32_t flags, char *title,
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
524 uint32_t format)
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
525 {
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
526 XVisualInfo vinfo;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
527 XSetWindowAttributes xswa;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
528 XWindowAttributes attribs;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
529 unsigned long xswamask;
28936
fd9de1e70d47 Move initialisation of deint_surfaces[] to free_video_specific().
cehoyos
parents: 28935
diff changeset
530 int depth;
28582
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
531
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
532 #ifdef CONFIG_XF86VM
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
533 int vm = flags & VOFLAG_MODESWITCHING;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
534 #endif
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
535
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
536 image_format = format;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
537
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
538 int_pause = 0;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
539 visible_buf = 0;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
540
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
541 #ifdef CONFIG_GUI
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
542 if (use_gui)
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
543 guiGetEvent(guiSetShVideo, 0); // the GUI will set up / resize our window
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
544 else
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
545 #endif
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
546 {
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
547 #ifdef CONFIG_XF86VM
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
548 if (vm)
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
549 vo_vm_switch();
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
550 else
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
551 #endif
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
552 XGetWindowAttributes(mDisplay, DefaultRootWindow(mDisplay), &attribs);
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
553 depth = attribs.depth;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
554 if (depth != 15 && depth != 16 && depth != 24 && depth != 32)
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
555 depth = 24;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
556 XMatchVisualInfo(mDisplay, mScreen, depth, TrueColor, &vinfo);
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
557
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
558 xswa.background_pixel = 0;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
559 xswa.border_pixel = 0;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
560 xswamask = CWBackPixel | CWBorderPixel;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
561
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
562 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
563 flags, CopyFromParent, "vdpau", title);
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
564 XChangeWindowAttributes(mDisplay, vo_window, xswamask, &xswa);
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
565
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
566 #ifdef CONFIG_XF86VM
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
567 if (vm) {
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
568 /* Grab the mouse pointer in our window */
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
569 if (vo_grabpointer)
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
570 XGrabPointer(mDisplay, vo_window, True, 0,
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
571 GrabModeAsync, GrabModeAsync,
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
572 vo_window, None, CurrentTime);
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
573 XSetInputFocus(mDisplay, vo_window, RevertToNone, CurrentTime);
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
574 }
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
575 #endif
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
576 }
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
577
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
578 if ((flags & VOFLAG_FULLSCREEN) && WinID <= 0)
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
579 vo_fs = 1;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
580
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
581 /* -----VDPAU related code here -------- */
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 free_video_specific();
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 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
586 return -1;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
587
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
588 // video width and height
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
589 vid_width = width;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
590 vid_height = height;
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 if (create_vdp_mixer(vdp_chroma_type))
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
593 return -1;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
594
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
595 surface_num = 0;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
596 vid_surface_num = -1;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
597 resize();
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
598
28992
947ef23ba798 Test if create_vdp_decoder() might succeed by calling it from config()
cehoyos
parents: 28991
diff changeset
599 if (!create_vdp_decoder(2))
947ef23ba798 Test if create_vdp_decoder() might succeed by calling it from config()
cehoyos
parents: 28991
diff changeset
600 return -1;
947ef23ba798 Test if create_vdp_decoder() might succeed by calling it from config()
cehoyos
parents: 28991
diff changeset
601
28582
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
602 return 0;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
603 }
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
604
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
605 static void check_events(void)
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
606 {
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
607 int e = vo_x11_check_events(mDisplay);
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
608
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
609 if (e & VO_EVENT_RESIZE)
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
610 resize();
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
611
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
612 if ((e & VO_EVENT_EXPOSE || e & VO_EVENT_RESIZE) && int_pause) {
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
613 /* did we already draw a buffer */
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
614 if (visible_buf) {
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
615 /* redraw the last visible buffer */
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
616 VdpStatus vdp_st;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
617 vdp_st = vdp_presentation_queue_display(vdp_flip_queue,
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
618 output_surfaces[surface_num],
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
619 vo_dwidth, vo_dheight,
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
620 0);
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
621 CHECK_ST_WARNING("Error when calling vdp_presentation_queue_display")
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
622 }
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
623 }
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
624 }
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
625
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
626 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
627 unsigned char *srca, int stride)
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
628 {
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
629 VdpOutputSurface output_surface = output_surfaces[surface_num];
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
630 VdpStatus vdp_st;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
631 int i, j;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
632 int pitch;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
633 int index_data_size_required;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
634 VdpRect output_indexed_rect_vid;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
635 VdpOutputSurfaceRenderBlendState blend_state;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
636
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
637 if (!w || !h)
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
638 return;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
639
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
640 index_data_size_required = 2*w*h;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
641 if (index_data_size < index_data_size_required) {
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
642 index_data = realloc(index_data, index_data_size_required);
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
643 index_data_size = index_data_size_required;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
644 }
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
645
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
646 // index_data creation, component order - I, A, I, A, .....
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
647 for (i = 0; i < h; i++)
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
648 for (j = 0; j < w; j++) {
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
649 index_data[i*2*w + j*2] = src [i*stride+j];
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
650 index_data[i*2*w + j*2 + 1] = -srca[i*stride+j];
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
651 }
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
652
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
653 output_indexed_rect_vid.x0 = x0;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
654 output_indexed_rect_vid.y0 = y0;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
655 output_indexed_rect_vid.x1 = x0 + w;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
656 output_indexed_rect_vid.y1 = y0 + h;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
657
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
658 pitch = w*2;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
659
28696
fdc03572004c Change code to actually work when NUM_OUTPUT_SURFACES is changed.
reimar
parents: 28689
diff changeset
660 // write source_data to osd_surface.
fdc03572004c Change code to actually work when NUM_OUTPUT_SURFACES is changed.
reimar
parents: 28689
diff changeset
661 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
662 VDP_INDEXED_FORMAT_I8A8,
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
663 (const void *const*)&index_data,
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
664 &pitch,
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
665 &output_indexed_rect_vid,
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
666 VDP_COLOR_TABLE_FORMAT_B8G8R8X8,
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
667 (void *)palette);
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
668 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
669
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
670 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
671 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
672 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
673 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
674 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
675 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
676 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
677
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
678 vdp_st = vdp_output_surface_render_output_surface(output_surface,
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
679 &output_indexed_rect_vid,
28696
fdc03572004c Change code to actually work when NUM_OUTPUT_SURFACES is changed.
reimar
parents: 28689
diff changeset
680 osd_surface,
28582
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
681 &output_indexed_rect_vid,
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
682 NULL,
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
683 &blend_state,
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
684 VDP_OUTPUT_SURFACE_RENDER_ROTATE_0);
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
685 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
686 }
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
687
28675
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
688 static void draw_eosd(void) {
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
689 VdpStatus vdp_st;
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
690 VdpOutputSurface output_surface = output_surfaces[surface_num];
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
691 VdpOutputSurfaceRenderBlendState blend_state;
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
692 int i;
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
693
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
694 blend_state.struct_version = VDP_OUTPUT_SURFACE_RENDER_BLEND_STATE_VERSION;
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
695 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
696 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
697 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
698 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
699 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
700 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
701
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
702 for (i=0; i<eosd_render_count; i++) {
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
703 vdp_st = vdp_output_surface_render_bitmap_surface(
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
704 output_surface, &eosd_targets[i].dest,
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
705 eosd_targets[i].surface, &eosd_targets[i].source,
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
706 &eosd_targets[i].color, &blend_state,
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
707 VDP_OUTPUT_SURFACE_RENDER_ROTATE_0);
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
708 CHECK_ST_WARNING("EOSD: Error when rendering")
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
709 }
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
710 }
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
711
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
712 static void generate_eosd(mp_eosd_images_t *imgs) {
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
713 VdpStatus vdp_st;
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
714 VdpRect destRect;
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
715 int j, found;
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
716 ass_image_t *img = imgs->imgs;
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
717 ass_image_t *i;
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
718
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
719 // Nothing changed, no need to redraw
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
720 if (imgs->changed == 0)
28807
338065cac802 Remove duplicate OSD drawing introduced due to a conflict between r28840 and r28839.
reimar
parents: 28805
diff changeset
721 return;
28675
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
722 eosd_render_count = 0;
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
723 // There's nothing to render!
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
724 if (!img)
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
725 return;
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
726
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
727 if (imgs->changed == 1)
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
728 goto eosd_skip_upload;
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
729
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
730 for (j=0; j<eosd_surface_count; j++)
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
731 eosd_surfaces[j].in_use = 0;
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
732
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
733 for (i = img; i; i = i->next) {
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
734 // Try to reuse a suitable surface
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
735 found = -1;
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
736 for (j=0; j<eosd_surface_count; j++) {
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
737 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
738 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
739 found = j;
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
740 break;
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
741 }
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
742 }
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
743 // None found, allocate a new surface
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
744 if (found < 0) {
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
745 for (j=0; j<eosd_surface_count; j++) {
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
746 if (!eosd_surfaces[j].in_use) {
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
747 if (eosd_surfaces[j].surface != VDP_INVALID_HANDLE)
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
748 vdp_bitmap_surface_destroy(eosd_surfaces[j].surface);
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
749 found = j;
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
750 break;
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
751 }
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
752 }
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
753 // Allocate new space for surface/target arrays
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
754 if (found < 0) {
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
755 j = found = eosd_surface_count;
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
756 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
757 eosd_surfaces = realloc(eosd_surfaces, eosd_surface_count * sizeof(*eosd_surfaces));
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
758 eosd_targets = realloc(eosd_targets, eosd_surface_count * sizeof(*eosd_targets));
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
759 for(j=found; j<eosd_surface_count; j++) {
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
760 eosd_surfaces[j].surface = VDP_INVALID_HANDLE;
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
761 eosd_surfaces[j].in_use = 0;
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
762 }
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
763 }
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
764 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
765 i->w, i->h, VDP_TRUE, &eosd_surfaces[found].surface);
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
766 CHECK_ST_WARNING("EOSD: error when creating surface")
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
767 eosd_surfaces[found].w = i->w;
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
768 eosd_surfaces[found].h = i->h;
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
769 }
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
770 eosd_surfaces[found].in_use = 1;
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
771 eosd_targets[eosd_render_count].surface = eosd_surfaces[found].surface;
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
772 destRect.x0 = 0;
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
773 destRect.y0 = 0;
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
774 destRect.x1 = i->w;
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
775 destRect.y1 = i->h;
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
776 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
777 (const void *) &i->bitmap, &i->stride, &destRect);
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
778 CHECK_ST_WARNING("EOSD: putbits failed")
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
779 eosd_render_count++;
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
780 }
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
781
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
782 eosd_skip_upload:
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
783 eosd_render_count = 0;
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
784 for (i = img; i; i = i->next) {
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
785 // Render dest, color, etc.
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
786 eosd_targets[eosd_render_count].color.alpha = 1.0 - ((i->color >> 0) & 0xff) / 255.0;
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
787 eosd_targets[eosd_render_count].color.blue = ((i->color >> 8) & 0xff) / 255.0;
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
788 eosd_targets[eosd_render_count].color.green = ((i->color >> 16) & 0xff) / 255.0;
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
789 eosd_targets[eosd_render_count].color.red = ((i->color >> 24) & 0xff) / 255.0;
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
790 eosd_targets[eosd_render_count].dest.x0 = i->dst_x;
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
791 eosd_targets[eosd_render_count].dest.y0 = i->dst_y;
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
792 eosd_targets[eosd_render_count].dest.x1 = i->w + i->dst_x;
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
793 eosd_targets[eosd_render_count].dest.y1 = i->h + i->dst_y;
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
794 eosd_targets[eosd_render_count].source.x0 = 0;
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
795 eosd_targets[eosd_render_count].source.y0 = 0;
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
796 eosd_targets[eosd_render_count].source.x1 = i->w;
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
797 eosd_targets[eosd_render_count].source.y1 = i->h;
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
798 eosd_render_count++;
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
799 }
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
800 }
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
801
28582
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
802 static void draw_osd(void)
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
803 {
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
804 mp_msg(MSGT_VO, MSGL_DBG2, "DRAW_OSD\n");
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
805
28598
4172d83194f2 Extend calc_src_dst_rects to also calculate the border values needed for
reimar
parents: 28582
diff changeset
806 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
807 vid_width, vid_height, draw_osd_I8A8);
28582
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 flip_page(void)
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
811 {
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
812 VdpStatus vdp_st;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
813 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
814 surface_render[vid_surface_num].surface, output_surfaces[surface_num]);
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
815
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
816 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
817 vo_dwidth, vo_dheight,
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
818 0);
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
819 CHECK_ST_WARNING("Error when calling vdp_presentation_queue_display")
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
820
28696
fdc03572004c Change code to actually work when NUM_OUTPUT_SURFACES is changed.
reimar
parents: 28689
diff changeset
821 surface_num = (surface_num + 1) % NUM_OUTPUT_SURFACES;
28582
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
822 visible_buf = 1;
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
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
825 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
826 int x, int y)
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
827 {
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
828 VdpStatus vdp_st;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
829 struct vdpau_render_state *rndr = (struct vdpau_render_state *)image[0];
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
830 int max_refs = image_format == IMGFMT_VDPAU_H264 ? rndr->info.h264.num_ref_frames : 2;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
831 if (!IMGFMT_IS_VDPAU(image_format))
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
832 return VO_FALSE;
28989
aa1e43639e47 Factorize create_vdp_decoder().
cehoyos
parents: 28956
diff changeset
833 if ((decoder == VDP_INVALID_HANDLE || decoder_max_refs < max_refs)
28991
8cf16b1d8dde Change return value for create_vdp_decoder().
cehoyos
parents: 28989
diff changeset
834 && !create_vdp_decoder(max_refs))
28989
aa1e43639e47 Factorize create_vdp_decoder().
cehoyos
parents: 28956
diff changeset
835 return VO_FALSE;
aa1e43639e47 Factorize create_vdp_decoder().
cehoyos
parents: 28956
diff changeset
836
28582
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
837 vdp_st = vdp_decoder_render(decoder, rndr->surface, (void *)&rndr->info, rndr->bitstream_buffers_used, rndr->bitstream_buffers);
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
838 CHECK_ST_WARNING("Failed VDPAU decoder rendering");
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
839 return VO_TRUE;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
840 }
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
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
843 static int draw_frame(uint8_t *src[])
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
844 {
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
845 return VO_ERROR;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
846 }
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
847
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
848 static struct vdpau_render_state *get_surface(int number)
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
849 {
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
850 if (number > MAX_VIDEO_SURFACES)
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
851 return NULL;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
852 if (surface_render[number].surface == VDP_INVALID_HANDLE) {
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
853 VdpStatus vdp_st;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
854 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
855 vid_width, vid_height,
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
856 &surface_render[number].surface);
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
857 CHECK_ST_WARNING("Error when calling vdp_video_surface_create")
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
858 if (vdp_st != VDP_STATUS_OK)
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
859 return NULL;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
860 }
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
861 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
862 return &surface_render[number];
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
863 }
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
864
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
865 static uint32_t draw_image(mp_image_t *mpi)
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
866 {
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
867 if (IMGFMT_IS_VDPAU(image_format)) {
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
868 struct vdpau_render_state *rndr = mpi->priv;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
869 vid_surface_num = rndr - surface_render;
28956
6d0da4fd4544 Allow to use vdpau temporal deinterlacers with hardware accelerated decoding.
cehoyos
parents: 28944
diff changeset
870 if (deint_buffer_past_frames) {
6d0da4fd4544 Allow to use vdpau temporal deinterlacers with hardware accelerated decoding.
cehoyos
parents: 28944
diff changeset
871 mpi->usage_count++;
6d0da4fd4544 Allow to use vdpau temporal deinterlacers with hardware accelerated decoding.
cehoyos
parents: 28944
diff changeset
872 if (deint_mpi[2])
6d0da4fd4544 Allow to use vdpau temporal deinterlacers with hardware accelerated decoding.
cehoyos
parents: 28944
diff changeset
873 deint_mpi[2]->usage_count--;
6d0da4fd4544 Allow to use vdpau temporal deinterlacers with hardware accelerated decoding.
cehoyos
parents: 28944
diff changeset
874 deint_mpi[2] = deint_mpi[1];
6d0da4fd4544 Allow to use vdpau temporal deinterlacers with hardware accelerated decoding.
cehoyos
parents: 28944
diff changeset
875 deint_mpi[1] = deint_mpi[0];
6d0da4fd4544 Allow to use vdpau temporal deinterlacers with hardware accelerated decoding.
cehoyos
parents: 28944
diff changeset
876 deint_mpi[0] = mpi;
6d0da4fd4544 Allow to use vdpau temporal deinterlacers with hardware accelerated decoding.
cehoyos
parents: 28944
diff changeset
877 }
28582
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
878 } else if (!(mpi->flags & MP_IMGFLAG_DRAW_CALLBACK)) {
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
879 VdpStatus vdp_st;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
880 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
881 struct vdpau_render_state *rndr = get_surface(deint_counter);
b0badbd680c6 Initial support for advanced VDPAU deinterlacers (software-decoded video
cehoyos
parents: 28892
diff changeset
882 deint_counter = (deint_counter + 1) & 3;
28582
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
883 vid_surface_num = rndr - surface_render;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
884 vdp_st = vdp_video_surface_put_bits_y_cb_cr(rndr->surface,
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
885 VDP_YCBCR_FORMAT_YV12,
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
886 (const void *const*)destdata,
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
887 mpi->stride); // pitch
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
888 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
889 }
28684
75aebdf41ee9 Enable Bob de-interlacing for VDPAU.
cehoyos
parents: 28676
diff changeset
890 top_field_first = !!(mpi->fields & MP_IMGFIELD_TOP_FIRST);
28582
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
891
28933
b0badbd680c6 Initial support for advanced VDPAU deinterlacers (software-decoded video
cehoyos
parents: 28892
diff changeset
892 if (deint < 3)
b0badbd680c6 Initial support for advanced VDPAU deinterlacers (software-decoded video
cehoyos
parents: 28892
diff changeset
893 deint_surfaces[0] = surface_render[vid_surface_num].surface;
28582
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
894 video_to_output_surface();
28933
b0badbd680c6 Initial support for advanced VDPAU deinterlacers (software-decoded video
cehoyos
parents: 28892
diff changeset
895 deint_surfaces[2] = deint_surfaces[1];
b0badbd680c6 Initial support for advanced VDPAU deinterlacers (software-decoded video
cehoyos
parents: 28892
diff changeset
896 deint_surfaces[1] = deint_surfaces[0];
b0badbd680c6 Initial support for advanced VDPAU deinterlacers (software-decoded video
cehoyos
parents: 28892
diff changeset
897 deint_surfaces[0] = surface_render[vid_surface_num].surface;
28582
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
898 return VO_TRUE;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
899 }
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
900
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
901 static uint32_t get_image(mp_image_t *mpi)
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
902 {
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
903 struct vdpau_render_state *rndr;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
904
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
905 // no dr for non-decoding for now
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
906 if (!IMGFMT_IS_VDPAU(image_format)) return VO_FALSE;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
907 if (mpi->type != MP_IMGTYPE_NUMBERED) return VO_FALSE;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
908
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
909 rndr = get_surface(mpi->number);
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
910 if (!rndr) {
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
911 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
912 // TODO: this probably breaks things forever, provide a dummy buffer?
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
913 return VO_FALSE;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
914 }
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
915 mpi->flags |= MP_IMGFLAG_DIRECT;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
916 mpi->stride[0] = mpi->stride[1] = mpi->stride[2] = 0;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
917 mpi->planes[0] = mpi->planes[1] = mpi->planes[2] = NULL;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
918 // 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
919 mpi->planes[0] = (void *)rndr;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
920 mpi->num_planes = 1;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
921 mpi->priv = rndr;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
922 return VO_TRUE;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
923 }
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
924
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
925 static int query_format(uint32_t format)
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
926 {
28675
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
927 int default_flags = VFCAP_CSP_SUPPORTED | VFCAP_CSP_SUPPORTED_BY_HW | VFCAP_HWSCALE_UP | VFCAP_HWSCALE_DOWN | VFCAP_OSD | VFCAP_EOSD | VFCAP_EOSD_UNSCALED;
28582
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
928 switch (format) {
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
929 case IMGFMT_YV12:
28611
00c0123b6df3 Add VOCAP_NOSLICES and use it to allow vo_vdpau to not support slices for
reimar
parents: 28598
diff changeset
930 return default_flags | VOCAP_NOSLICES;
28582
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
931 case IMGFMT_VDPAU_MPEG1:
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
932 case IMGFMT_VDPAU_MPEG2:
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
933 case IMGFMT_VDPAU_H264:
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
934 case IMGFMT_VDPAU_WMV3:
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
935 case IMGFMT_VDPAU_VC1:
28611
00c0123b6df3 Add VOCAP_NOSLICES and use it to allow vo_vdpau to not support slices for
reimar
parents: 28598
diff changeset
936 return default_flags;
28582
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
937 }
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
938 return 0;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
939 }
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
940
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
941 static void DestroyVdpauObjects(void)
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
942 {
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
943 int i;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
944 VdpStatus vdp_st;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
945
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
946 free_video_specific();
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
947
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
948 vdp_st = vdp_presentation_queue_destroy(vdp_flip_queue);
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
949 CHECK_ST_WARNING("Error when calling vdp_presentation_queue_destroy")
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
950
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
951 vdp_st = vdp_presentation_queue_target_destroy(vdp_flip_target);
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
952 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
953
28696
fdc03572004c Change code to actually work when NUM_OUTPUT_SURFACES is changed.
reimar
parents: 28689
diff changeset
954 for (i = 0; i <= NUM_OUTPUT_SURFACES; i++) {
28582
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
955 vdp_st = vdp_output_surface_destroy(output_surfaces[i]);
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
956 output_surfaces[i] = VDP_INVALID_HANDLE;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
957 CHECK_ST_WARNING("Error when calling vdp_output_surface_destroy")
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
958 }
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
959
28675
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
960 for (i = 0; i<eosd_surface_count; i++) {
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
961 if (eosd_surfaces[i].surface != VDP_INVALID_HANDLE) {
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
962 vdp_st = vdp_bitmap_surface_destroy(eosd_surfaces[i].surface);
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
963 CHECK_ST_WARNING("Error when calling vdp_bitmap_surface_destroy")
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
964 }
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
965 eosd_surfaces[i].surface = VDP_INVALID_HANDLE;
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
28582
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
968 vdp_st = vdp_device_destroy(vdp_device);
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
969 CHECK_ST_WARNING("Error when calling vdp_device_destroy")
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
970 }
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
971
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
972 static void uninit(void)
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
973 {
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
974 if (!vo_config_count)
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
975 return;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
976 visible_buf = 0;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
977
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
978 /* Destroy all vdpau objects */
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
979 DestroyVdpauObjects();
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
980
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
981 free(index_data);
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
982 index_data = NULL;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
983
28675
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
984 free(eosd_surfaces);
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
985 eosd_surfaces = NULL;
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
986 free(eosd_targets);
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
987 eosd_targets = NULL;
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
988
28582
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
989 #ifdef CONFIG_XF86VM
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
990 vo_vm_close();
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
991 #endif
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
992 vo_x11_uninit();
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
993
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
994 dlclose(vdpau_lib_handle);
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
995 }
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
996
28828
56eee6ffba9b Make data related to suboption parsing const in libvo
reimar
parents: 28807
diff changeset
997 static const opt_t subopts[] = {
28638
7b16ccf423b4 Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents: 28611
diff changeset
998 {"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
999 {"chroma-deint", OPT_ARG_BOOL, &chroma_deint, NULL},
28638
7b16ccf423b4 Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents: 28611
diff changeset
1000 {"pullup", OPT_ARG_BOOL, &pullup, NULL},
7b16ccf423b4 Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents: 28611
diff changeset
1001 {"denoise", OPT_ARG_FLOAT, &denoise, NULL},
7b16ccf423b4 Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents: 28611
diff changeset
1002 {"sharpen", OPT_ARG_FLOAT, &sharpen, NULL},
7b16ccf423b4 Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents: 28611
diff changeset
1003 {NULL}
7b16ccf423b4 Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents: 28611
diff changeset
1004 };
7b16ccf423b4 Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents: 28611
diff changeset
1005
7b16ccf423b4 Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents: 28611
diff changeset
1006 static const char help_msg[] =
7b16ccf423b4 Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents: 28611
diff changeset
1007 "\n-vo vdpau command line help:\n"
7b16ccf423b4 Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents: 28611
diff changeset
1008 "Example: mplayer -vo vdpau:deint=2\n"
7b16ccf423b4 Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents: 28611
diff changeset
1009 "\nOptions:\n"
28707
a81065b771e7 Document that all vdpau deinterlacers respect -field-dominance.
cehoyos
parents: 28702
diff changeset
1010 " deint (all modes > 0 respect -field-dominance)\n"
28638
7b16ccf423b4 Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents: 28611
diff changeset
1011 " 0: no deinterlacing\n"
28708
ebd393e9f567 Add one-field-only output for -vo vdpau.
cehoyos
parents: 28707
diff changeset
1012 " 1: only show first field\n"
28956
6d0da4fd4544 Allow to use vdpau temporal deinterlacers with hardware accelerated decoding.
cehoyos
parents: 28944
diff changeset
1013 " 2: bob deinterlacing\n"
6d0da4fd4544 Allow to use vdpau temporal deinterlacers with hardware accelerated decoding.
cehoyos
parents: 28944
diff changeset
1014 " 3: temporal deinterlacing (resource-hungry)\n"
6d0da4fd4544 Allow to use vdpau temporal deinterlacers with hardware accelerated decoding.
cehoyos
parents: 28944
diff changeset
1015 " 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
1016 " chroma-deint\n"
cb18135338dd Add chroma-deint option to vo vdpau (nochroma-deint speeds up deinterlacing).
cehoyos
parents: 28936
diff changeset
1017 " 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
1018 " 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
1019 " pullup\n"
28935
521e61715851 Update -vo vdpau command line help.
cehoyos
parents: 28934
diff changeset
1020 " Try to apply inverse-telecine (needs temporal deinterlacing)\n"
28638
7b16ccf423b4 Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents: 28611
diff changeset
1021 " denoise\n"
7b16ccf423b4 Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents: 28611
diff changeset
1022 " 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
1023 " sharpen\n"
7b16ccf423b4 Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents: 28611
diff changeset
1024 " Apply sharpening or softening, argument is strength from -1.0 to 1.0\n"
7b16ccf423b4 Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents: 28611
diff changeset
1025 ;
7b16ccf423b4 Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents: 28611
diff changeset
1026
28582
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1027 static int preinit(const char *arg)
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1028 {
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1029 int i;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1030 static const char *vdpaulibrary = "libvdpau.so.1";
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1031 static const char *vdpau_device_create = "vdp_device_create_x11";
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1032
28638
7b16ccf423b4 Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents: 28611
diff changeset
1033 deint = 0;
28709
4e89476f8952 Do not forget the chosen deinterlacer for -vo vdpau.
cehoyos
parents: 28708
diff changeset
1034 deint_type = 3;
28933
b0badbd680c6 Initial support for advanced VDPAU deinterlacers (software-decoded video
cehoyos
parents: 28892
diff changeset
1035 deint_counter = 0;
28956
6d0da4fd4544 Allow to use vdpau temporal deinterlacers with hardware accelerated decoding.
cehoyos
parents: 28944
diff changeset
1036 deint_buffer_past_frames = 0;
6d0da4fd4544 Allow to use vdpau temporal deinterlacers with hardware accelerated decoding.
cehoyos
parents: 28944
diff changeset
1037 deint_mpi[0] = deint_mpi[1] = deint_mpi[2] = NULL;
28944
cb18135338dd Add chroma-deint option to vo vdpau (nochroma-deint speeds up deinterlacing).
cehoyos
parents: 28936
diff changeset
1038 chroma_deint = 1;
28638
7b16ccf423b4 Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents: 28611
diff changeset
1039 pullup = 0;
7b16ccf423b4 Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents: 28611
diff changeset
1040 denoise = 0;
7b16ccf423b4 Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents: 28611
diff changeset
1041 sharpen = 0;
7b16ccf423b4 Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents: 28611
diff changeset
1042 if (subopt_parse(arg, subopts) != 0) {
7b16ccf423b4 Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents: 28611
diff changeset
1043 mp_msg(MSGT_VO, MSGL_FATAL, help_msg);
7b16ccf423b4 Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
reimar
parents: 28611
diff changeset
1044 return -1;
28582
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1045 }
28709
4e89476f8952 Do not forget the chosen deinterlacer for -vo vdpau.
cehoyos
parents: 28708
diff changeset
1046 if (deint)
4e89476f8952 Do not forget the chosen deinterlacer for -vo vdpau.
cehoyos
parents: 28708
diff changeset
1047 deint_type = deint;
28956
6d0da4fd4544 Allow to use vdpau temporal deinterlacers with hardware accelerated decoding.
cehoyos
parents: 28944
diff changeset
1048 if (deint > 2)
6d0da4fd4544 Allow to use vdpau temporal deinterlacers with hardware accelerated decoding.
cehoyos
parents: 28944
diff changeset
1049 deint_buffer_past_frames = 1;
28582
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1050
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1051 vdpau_lib_handle = dlopen(vdpaulibrary, RTLD_LAZY);
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1052 if (!vdpau_lib_handle) {
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1053 mp_msg(MSGT_VO, MSGL_ERR, "[vdpau] Could not open dynamic library %s\n",
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1054 vdpaulibrary);
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1055 return -1;
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 vdp_device_create = dlsym(vdpau_lib_handle, vdpau_device_create);
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1058 if (!vdp_device_create) {
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1059 mp_msg(MSGT_VO, MSGL_ERR, "[vdpau] Could not find function %s in %s\n",
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1060 vdpau_device_create, vdpaulibrary);
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1061 return -1;
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 (!vo_init() || win_x11_init_vdpau_procs())
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1064 return -1;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1065
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1066 decoder = VDP_INVALID_HANDLE;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1067 for (i = 0; i < MAX_VIDEO_SURFACES; i++)
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1068 surface_render[i].surface = VDP_INVALID_HANDLE;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1069 video_mixer = VDP_INVALID_HANDLE;
28774
95123b577ad0 Make sure all output_surfaces are initialized in preinit.
reimar
parents: 28729
diff changeset
1070 for (i = 0; i <= NUM_OUTPUT_SURFACES; i++)
28582
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1071 output_surfaces[i] = VDP_INVALID_HANDLE;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1072 vdp_flip_queue = VDP_INVALID_HANDLE;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1073 output_surface_width = output_surface_height = -1;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1074
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1075 // full grayscale palette.
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1076 for (i = 0; i < PALETTE_SIZE; ++i)
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1077 palette[i] = (i << 16) | (i << 8) | i;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1078 index_data = NULL;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1079 index_data_size = 0;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1080
28675
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
1081 eosd_surface_count = eosd_render_count = 0;
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
1082 eosd_surfaces = NULL;
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
1083 eosd_targets = NULL;
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
1084
28725
b9c26620ada7 Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents: 28724
diff changeset
1085 procamp.struct_version = VDP_PROCAMP_VERSION;
b9c26620ada7 Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents: 28724
diff changeset
1086 procamp.brightness = 0.0;
b9c26620ada7 Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents: 28724
diff changeset
1087 procamp.contrast = 1.0;
b9c26620ada7 Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents: 28724
diff changeset
1088 procamp.saturation = 1.0;
b9c26620ada7 Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents: 28724
diff changeset
1089 procamp.hue = 0.0;
b9c26620ada7 Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents: 28724
diff changeset
1090
28582
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1091 return 0;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1092 }
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1093
28725
b9c26620ada7 Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents: 28724
diff changeset
1094 static int get_equalizer(char *name, int *value) {
b9c26620ada7 Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents: 28724
diff changeset
1095 if (!strcasecmp(name, "brightness"))
b9c26620ada7 Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents: 28724
diff changeset
1096 *value = procamp.brightness * 100;
b9c26620ada7 Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents: 28724
diff changeset
1097 else if (!strcasecmp(name, "contrast"))
b9c26620ada7 Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents: 28724
diff changeset
1098 *value = (procamp.contrast-1.0) * 100;
b9c26620ada7 Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents: 28724
diff changeset
1099 else if (!strcasecmp(name, "saturation"))
b9c26620ada7 Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents: 28724
diff changeset
1100 *value = (procamp.saturation-1.0) * 100;
b9c26620ada7 Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents: 28724
diff changeset
1101 else if (!strcasecmp(name, "hue"))
28729
bbf7f7100e91 Use M_PI for pi.
cehoyos
parents: 28728
diff changeset
1102 *value = procamp.hue * 100 / M_PI;
28725
b9c26620ada7 Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents: 28724
diff changeset
1103 else
b9c26620ada7 Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents: 28724
diff changeset
1104 return VO_NOTIMPL;
b9c26620ada7 Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents: 28724
diff changeset
1105 return VO_TRUE;
b9c26620ada7 Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents: 28724
diff changeset
1106 }
b9c26620ada7 Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents: 28724
diff changeset
1107
b9c26620ada7 Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents: 28724
diff changeset
1108 static int set_equalizer(char *name, int value) {
b9c26620ada7 Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents: 28724
diff changeset
1109 VdpStatus vdp_st;
b9c26620ada7 Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents: 28724
diff changeset
1110 VdpCSCMatrix matrix;
28728
c9b2f40aaf18 Make VdpVideoMixerAttribute attributes[] static const.
cehoyos
parents: 28725
diff changeset
1111 static const VdpVideoMixerAttribute attributes[] = {VDP_VIDEO_MIXER_ATTRIBUTE_CSC_MATRIX};
28725
b9c26620ada7 Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents: 28724
diff changeset
1112 const void *attribute_values[] = {&matrix};
b9c26620ada7 Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents: 28724
diff changeset
1113
b9c26620ada7 Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents: 28724
diff changeset
1114 if (!strcasecmp(name, "brightness"))
b9c26620ada7 Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents: 28724
diff changeset
1115 procamp.brightness = value / 100.0;
b9c26620ada7 Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents: 28724
diff changeset
1116 else if (!strcasecmp(name, "contrast"))
b9c26620ada7 Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents: 28724
diff changeset
1117 procamp.contrast = value / 100.0 + 1.0;
b9c26620ada7 Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents: 28724
diff changeset
1118 else if (!strcasecmp(name, "saturation"))
b9c26620ada7 Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents: 28724
diff changeset
1119 procamp.saturation = value / 100.0 + 1.0;
b9c26620ada7 Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents: 28724
diff changeset
1120 else if (!strcasecmp(name, "hue"))
28729
bbf7f7100e91 Use M_PI for pi.
cehoyos
parents: 28728
diff changeset
1121 procamp.hue = value / 100.0 * M_PI;
28725
b9c26620ada7 Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents: 28724
diff changeset
1122 else
b9c26620ada7 Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents: 28724
diff changeset
1123 return VO_NOTIMPL;
b9c26620ada7 Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents: 28724
diff changeset
1124
b9c26620ada7 Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents: 28724
diff changeset
1125 vdp_st = vdp_generate_csc_matrix(&procamp, VDP_COLOR_STANDARD_ITUR_BT_601,
b9c26620ada7 Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents: 28724
diff changeset
1126 &matrix);
b9c26620ada7 Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents: 28724
diff changeset
1127 CHECK_ST_WARNING("Error when generating CSC matrix")
b9c26620ada7 Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents: 28724
diff changeset
1128 vdp_st = vdp_video_mixer_set_attribute_values(video_mixer, 1, attributes,
b9c26620ada7 Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents: 28724
diff changeset
1129 attribute_values);
b9c26620ada7 Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents: 28724
diff changeset
1130 CHECK_ST_WARNING("Error when setting CSC matrix")
b9c26620ada7 Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents: 28724
diff changeset
1131 return VO_TRUE;
b9c26620ada7 Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents: 28724
diff changeset
1132 }
b9c26620ada7 Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents: 28724
diff changeset
1133
28582
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1134 static int control(uint32_t request, void *data, ...)
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1135 {
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1136 switch (request) {
28701
fc457469ed7b Support "D" to (de-)activate deinterlacing when using vo vdpau.
cehoyos
parents: 28699
diff changeset
1137 case VOCTRL_GET_DEINTERLACE:
fc457469ed7b Support "D" to (de-)activate deinterlacing when using vo vdpau.
cehoyos
parents: 28699
diff changeset
1138 *(int*)data = deint;
fc457469ed7b Support "D" to (de-)activate deinterlacing when using vo vdpau.
cehoyos
parents: 28699
diff changeset
1139 return VO_TRUE;
fc457469ed7b Support "D" to (de-)activate deinterlacing when using vo vdpau.
cehoyos
parents: 28699
diff changeset
1140 case VOCTRL_SET_DEINTERLACE:
fc457469ed7b Support "D" to (de-)activate deinterlacing when using vo vdpau.
cehoyos
parents: 28699
diff changeset
1141 deint = *(int*)data;
28709
4e89476f8952 Do not forget the chosen deinterlacer for -vo vdpau.
cehoyos
parents: 28708
diff changeset
1142 if (deint)
4e89476f8952 Do not forget the chosen deinterlacer for -vo vdpau.
cehoyos
parents: 28708
diff changeset
1143 deint = deint_type;
28933
b0badbd680c6 Initial support for advanced VDPAU deinterlacers (software-decoded video
cehoyos
parents: 28892
diff changeset
1144 if (deint_type > 2) {
b0badbd680c6 Initial support for advanced VDPAU deinterlacers (software-decoded video
cehoyos
parents: 28892
diff changeset
1145 VdpStatus vdp_st;
b0badbd680c6 Initial support for advanced VDPAU deinterlacers (software-decoded video
cehoyos
parents: 28892
diff changeset
1146 VdpVideoMixerFeature features[1] =
b0badbd680c6 Initial support for advanced VDPAU deinterlacers (software-decoded video
cehoyos
parents: 28892
diff changeset
1147 {deint_type == 3 ?
b0badbd680c6 Initial support for advanced VDPAU deinterlacers (software-decoded video
cehoyos
parents: 28892
diff changeset
1148 VDP_VIDEO_MIXER_FEATURE_DEINTERLACE_TEMPORAL :
b0badbd680c6 Initial support for advanced VDPAU deinterlacers (software-decoded video
cehoyos
parents: 28892
diff changeset
1149 VDP_VIDEO_MIXER_FEATURE_DEINTERLACE_TEMPORAL_SPATIAL};
b0badbd680c6 Initial support for advanced VDPAU deinterlacers (software-decoded video
cehoyos
parents: 28892
diff changeset
1150 VdpBool feature_enables[1] = {deint ? VDP_TRUE : VDP_FALSE};
b0badbd680c6 Initial support for advanced VDPAU deinterlacers (software-decoded video
cehoyos
parents: 28892
diff changeset
1151 vdp_st = vdp_video_mixer_set_feature_enables(video_mixer, 1,
b0badbd680c6 Initial support for advanced VDPAU deinterlacers (software-decoded video
cehoyos
parents: 28892
diff changeset
1152 features,
b0badbd680c6 Initial support for advanced VDPAU deinterlacers (software-decoded video
cehoyos
parents: 28892
diff changeset
1153 feature_enables);
b0badbd680c6 Initial support for advanced VDPAU deinterlacers (software-decoded video
cehoyos
parents: 28892
diff changeset
1154 CHECK_ST_WARNING("Error changing deinterlacing settings")
28956
6d0da4fd4544 Allow to use vdpau temporal deinterlacers with hardware accelerated decoding.
cehoyos
parents: 28944
diff changeset
1155 deint_buffer_past_frames = 1;
28933
b0badbd680c6 Initial support for advanced VDPAU deinterlacers (software-decoded video
cehoyos
parents: 28892
diff changeset
1156 }
28701
fc457469ed7b Support "D" to (de-)activate deinterlacing when using vo vdpau.
cehoyos
parents: 28699
diff changeset
1157 return VO_TRUE;
28582
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1158 case VOCTRL_PAUSE:
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1159 return (int_pause = 1);
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1160 case VOCTRL_RESUME:
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1161 return (int_pause = 0);
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1162 case VOCTRL_QUERY_FORMAT:
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1163 return query_format(*(uint32_t *)data);
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1164 case VOCTRL_GET_IMAGE:
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1165 return get_image(data);
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1166 case VOCTRL_DRAW_IMAGE:
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1167 return draw_image(data);
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1168 case VOCTRL_GUISUPPORT:
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1169 return VO_TRUE;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1170 case VOCTRL_BORDER:
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1171 vo_x11_border();
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1172 resize();
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1173 return VO_TRUE;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1174 case VOCTRL_FULLSCREEN:
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1175 vo_x11_fullscreen();
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1176 resize();
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1177 return VO_TRUE;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1178 case VOCTRL_GET_PANSCAN:
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1179 return VO_TRUE;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1180 case VOCTRL_SET_PANSCAN:
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1181 resize();
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1182 return VO_TRUE;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1183 case VOCTRL_SET_EQUALIZER: {
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1184 va_list ap;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1185 int value;
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 va_start(ap, data);
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1188 value = va_arg(ap, int);
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1189
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1190 va_end(ap);
28725
b9c26620ada7 Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents: 28724
diff changeset
1191 return set_equalizer(data, value);
28582
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1192 }
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1193 case VOCTRL_GET_EQUALIZER: {
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1194 va_list ap;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1195 int *value;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1196
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1197 va_start(ap, data);
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1198 value = va_arg(ap, int *);
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1199
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1200 va_end(ap);
28725
b9c26620ada7 Support brightness, contrast, hue and saturation adjustments via
cehoyos
parents: 28724
diff changeset
1201 return get_equalizer(data, value);
28582
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1202 }
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1203 case VOCTRL_ONTOP:
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1204 vo_x11_ontop();
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1205 return VO_TRUE;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1206 case VOCTRL_UPDATE_SCREENINFO:
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1207 update_xinerama_info();
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1208 return VO_TRUE;
28675
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
1209 case VOCTRL_DRAW_EOSD:
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
1210 if (!data)
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
1211 return VO_FALSE;
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
1212 generate_eosd(data);
28804
5ccdec6c14f0 Draw EOSD with VOCTRL_DRAW_EOSD instead of along with OSD.
greg
parents: 28774
diff changeset
1213 draw_eosd();
28675
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
1214 return VO_TRUE;
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
1215 case VOCTRL_GET_EOSD_RES: {
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
1216 mp_eosd_res_t *r = data;
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
1217 r->mt = r->mb = r->ml = r->mr = 0;
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
1218 if (vo_fs) {
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
1219 r->w = vo_screenwidth;
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
1220 r->h = vo_screenheight;
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
1221 r->ml = r->mr = border_x;
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
1222 r->mt = r->mb = border_y;
28699
1b516f954faa 10l: Add missing braces for VOCTRL_GET_EOSD_RES.
cehoyos
parents: 28696
diff changeset
1223 } else {
1b516f954faa 10l: Add missing braces for VOCTRL_GET_EOSD_RES.
cehoyos
parents: 28696
diff changeset
1224 r->w = vo_dwidth;
1b516f954faa 10l: Add missing braces for VOCTRL_GET_EOSD_RES.
cehoyos
parents: 28696
diff changeset
1225 r->h = vo_dheight;
1b516f954faa 10l: Add missing braces for VOCTRL_GET_EOSD_RES.
cehoyos
parents: 28696
diff changeset
1226 }
28675
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
1227 return VO_TRUE;
5cc6dc932017 EOSD/ASS support for vo_vdpau.c
reimar
parents: 28658
diff changeset
1228 }
28582
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1229 }
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1230 return VO_NOTIMPL;
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1231 }
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1232
4d64f83e2fac Add support for VDPAU video out, including hardware decoding.
reimar
parents:
diff changeset
1233 /* @} */