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