annotate libmpcodecs/vf_vo.c @ 36163:d13733fdf789

Avoid using swab() This is the only place where it is used and it is not available universally (missing e.g. on Android).
author reimar
date Thu, 09 May 2013 10:53:20 +0000
parents 899d817e56fc
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
30421
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 30065
diff changeset
1 /*
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 30065
diff changeset
2 * This file is part of MPlayer.
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 30065
diff changeset
3 *
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 30065
diff changeset
4 * MPlayer is free software; you can redistribute it and/or modify
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 30065
diff changeset
5 * it under the terms of the GNU General Public License as published by
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 30065
diff changeset
6 * the Free Software Foundation; either version 2 of the License, or
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 30065
diff changeset
7 * (at your option) any later version.
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 30065
diff changeset
8 *
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 30065
diff changeset
9 * MPlayer is distributed in the hope that it will be useful,
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 30065
diff changeset
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 30065
diff changeset
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 30065
diff changeset
12 * GNU General Public License for more details.
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 30065
diff changeset
13 *
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 30065
diff changeset
14 * You should have received a copy of the GNU General Public License along
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 30065
diff changeset
15 * with MPlayer; if not, write to the Free Software Foundation, Inc.,
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 30065
diff changeset
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 30065
diff changeset
17 */
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 30065
diff changeset
18
5507
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
19 #include <stdio.h>
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
20 #include <stdlib.h>
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
21 #include <string.h>
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
22
17012
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 15212
diff changeset
23 #include "config.h"
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 15212
diff changeset
24 #include "mp_msg.h"
31489
dc26022e9c27 Clean up sub-related extern declarations.
diego
parents: 31488
diff changeset
25 #include "mpcommon.h"
5607
1972c3475d93 mp_image.h and img_format.h moved to libmpcodecs
arpi
parents: 5565
diff changeset
26 #include "mp_image.h"
5507
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
27 #include "vf.h"
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
28
32467
fbe5c829c69b Move libvo/sub.[ch] from libvo to sub.
cigaes
parents: 32460
diff changeset
29 #include "sub/sub.h"
17012
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 15212
diff changeset
30 #include "libvo/video_out.h"
32460
d80bbc5868de Move eosd.[ch] to the sub directory.
cigaes
parents: 32391
diff changeset
31 #include "sub/eosd.h"
19576
3e7ce339d74b Add EOSD support to vf_vo.
eugeni
parents: 19463
diff changeset
32
5507
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
33 //===========================================================================//
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
34
20906
160974ca8bf2 Use vf control for reading pts from vf_vo
uau
parents: 20706
diff changeset
35 struct vf_priv_s {
19576
3e7ce339d74b Add EOSD support to vf_vo.
eugeni
parents: 19463
diff changeset
36 double pts;
25219
e82ecde2cbd4 Mark several uses of vo_functions_t as const to stop some of the current
reimar
parents: 23134
diff changeset
37 const vo_functions_t *vo;
19576
3e7ce339d74b Add EOSD support to vf_vo.
eugeni
parents: 19463
diff changeset
38 };
20906
160974ca8bf2 Use vf control for reading pts from vf_vo
uau
parents: 20706
diff changeset
39 #define video_out (vf->priv->vo)
5507
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
40
30642
a972c1a4a012 cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents: 30638
diff changeset
41 static int query_format(struct vf_instance *vf, unsigned int fmt); /* forward declaration */
a972c1a4a012 cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents: 30638
diff changeset
42 static void draw_slice(struct vf_instance *vf, unsigned char** src, int* stride, int w,int h, int x, int y);
7731
1f8961f2b34c compiler warning fixes
arpi
parents: 7687
diff changeset
43
30642
a972c1a4a012 cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents: 30638
diff changeset
44 static int config(struct vf_instance *vf,
5507
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
45 int width, int height, int d_width, int d_height,
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
46 unsigned int flags, unsigned int outfmt){
5559
7a73663095fc print VO info
arpi
parents: 5519
diff changeset
47
6197
48d0e89e8b21 report error if bad dimensions requested (<=0)
alex
parents: 6157
diff changeset
48 if ((width <= 0) || (height <= 0) || (d_width <= 0) || (d_height <= 0))
48d0e89e8b21 report error if bad dimensions requested (<=0)
alex
parents: 6157
diff changeset
49 {
48d0e89e8b21 report error if bad dimensions requested (<=0)
alex
parents: 6157
diff changeset
50 mp_msg(MSGT_CPLAYER, MSGL_ERR, "VO: invalid dimensions!\n");
48d0e89e8b21 report error if bad dimensions requested (<=0)
alex
parents: 6157
diff changeset
51 return 0;
48d0e89e8b21 report error if bad dimensions requested (<=0)
alex
parents: 6157
diff changeset
52 }
48d0e89e8b21 report error if bad dimensions requested (<=0)
alex
parents: 6157
diff changeset
53
8148
5b39e79af5fe removed get_info, using the same sheme as in libmpcodecs instead
alex
parents: 7731
diff changeset
54 if(video_out->info)
5b39e79af5fe removed get_info, using the same sheme as in libmpcodecs instead
alex
parents: 7731
diff changeset
55 { const vo_info_t *info = video_out->info;
5559
7a73663095fc print VO info
arpi
parents: 5519
diff changeset
56 mp_msg(MSGT_CPLAYER,MSGL_INFO,"VO: [%s] %dx%d => %dx%d %s %s%s%s%s\n",info->short_name,
7a73663095fc print VO info
arpi
parents: 5519
diff changeset
57 width, height,
7a73663095fc print VO info
arpi
parents: 5519
diff changeset
58 d_width, d_height,
7a73663095fc print VO info
arpi
parents: 5519
diff changeset
59 vo_format_name(outfmt),
15212
05aa13cdf92f replace VO and VF numeric flags with #defined identifiers
henry
parents: 10052
diff changeset
60 (flags&VOFLAG_FULLSCREEN)?" [fs]":"",
05aa13cdf92f replace VO and VF numeric flags with #defined identifiers
henry
parents: 10052
diff changeset
61 (flags&VOFLAG_MODESWITCHING)?" [vm]":"",
05aa13cdf92f replace VO and VF numeric flags with #defined identifiers
henry
parents: 10052
diff changeset
62 (flags&VOFLAG_SWSCALE)?" [zoom]":"",
05aa13cdf92f replace VO and VF numeric flags with #defined identifiers
henry
parents: 10052
diff changeset
63 (flags&VOFLAG_FLIPPING)?" [flip]":"");
5559
7a73663095fc print VO info
arpi
parents: 5519
diff changeset
64 mp_msg(MSGT_CPLAYER,MSGL_V,"VO: Description: %s\n",info->name);
7a73663095fc print VO info
arpi
parents: 5519
diff changeset
65 mp_msg(MSGT_CPLAYER,MSGL_V,"VO: Author: %s\n", info->author);
7a73663095fc print VO info
arpi
parents: 5519
diff changeset
66 if(info->comment && strlen(info->comment) > 0)
7a73663095fc print VO info
arpi
parents: 5519
diff changeset
67 mp_msg(MSGT_CPLAYER,MSGL_V,"VO: Comment: %s\n", info->comment);
7a73663095fc print VO info
arpi
parents: 5519
diff changeset
68 }
7a73663095fc print VO info
arpi
parents: 5519
diff changeset
69
7687
a9a19a991a70 support for VFCAP_ACCEPT_STRIDE in vo drivers
arpi
parents: 7368
diff changeset
70 // save vo's stride capability for the wanted colorspace:
23134
1de2a46a0987 Add -ass-hinting option for setting font hinting method.
eugeni
parents: 22232
diff changeset
71 vf->default_caps=query_format(vf,outfmt);
28611
00c0123b6df3 Add VOCAP_NOSLICES and use it to allow vo_vdpau to not support slices for
reimar
parents: 28546
diff changeset
72 vf->draw_slice = (vf->default_caps & VOCAP_NOSLICES) ? NULL : draw_slice;
7687
a9a19a991a70 support for VFCAP_ACCEPT_STRIDE in vo drivers
arpi
parents: 7368
diff changeset
73
22232
d0b60d14d8d7 Move common vo initialization code to video_out.c
reimar
parents: 21506
diff changeset
74 if(config_video_out(video_out,width,height,d_width,d_height,flags,"MPlayer",outfmt))
5507
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
75 return 0;
8148
5b39e79af5fe removed get_info, using the same sheme as in libmpcodecs instead
alex
parents: 7731
diff changeset
76
5511
7a24a067f0af vo_config_count now counts calls to vo->config()
arpi
parents: 5508
diff changeset
77 ++vo_config_count;
5507
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
78 return 1;
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
79 }
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
80
30642
a972c1a4a012 cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents: 30638
diff changeset
81 static int control(struct vf_instance *vf, int request, void* data)
6780
5bf3ed8a17c4 equalizer reworked
alex
parents: 6197
diff changeset
82 {
5643
3d9de27d9bd0 OSD handled by vf control()
arpi
parents: 5607
diff changeset
83 switch(request){
20973
c0bcec5150a3 Add deinterlace property, patch by Carl Eugen Hoyos
reimar
parents: 20906
diff changeset
84 case VFCTRL_GET_DEINTERLACE:
c0bcec5150a3 Add deinterlace property, patch by Carl Eugen Hoyos
reimar
parents: 20906
diff changeset
85 {
c0bcec5150a3 Add deinterlace property, patch by Carl Eugen Hoyos
reimar
parents: 20906
diff changeset
86 if(!video_out) return CONTROL_FALSE; // vo not configured?
c0bcec5150a3 Add deinterlace property, patch by Carl Eugen Hoyos
reimar
parents: 20906
diff changeset
87 return(video_out->control(VOCTRL_GET_DEINTERLACE, data)
c0bcec5150a3 Add deinterlace property, patch by Carl Eugen Hoyos
reimar
parents: 20906
diff changeset
88 == VO_TRUE) ? CONTROL_TRUE : CONTROL_FALSE;
c0bcec5150a3 Add deinterlace property, patch by Carl Eugen Hoyos
reimar
parents: 20906
diff changeset
89 }
c0bcec5150a3 Add deinterlace property, patch by Carl Eugen Hoyos
reimar
parents: 20906
diff changeset
90 case VFCTRL_SET_DEINTERLACE:
c0bcec5150a3 Add deinterlace property, patch by Carl Eugen Hoyos
reimar
parents: 20906
diff changeset
91 {
c0bcec5150a3 Add deinterlace property, patch by Carl Eugen Hoyos
reimar
parents: 20906
diff changeset
92 if(!video_out) return CONTROL_FALSE; // vo not configured?
c0bcec5150a3 Add deinterlace property, patch by Carl Eugen Hoyos
reimar
parents: 20906
diff changeset
93 return(video_out->control(VOCTRL_SET_DEINTERLACE, data)
c0bcec5150a3 Add deinterlace property, patch by Carl Eugen Hoyos
reimar
parents: 20906
diff changeset
94 == VO_TRUE) ? CONTROL_TRUE : CONTROL_FALSE;
c0bcec5150a3 Add deinterlace property, patch by Carl Eugen Hoyos
reimar
parents: 20906
diff changeset
95 }
5643
3d9de27d9bd0 OSD handled by vf control()
arpi
parents: 5607
diff changeset
96 case VFCTRL_DRAW_OSD:
6157
alex
parents: 6138
diff changeset
97 if(!vo_config_count) return CONTROL_FALSE; // vo not configured?
5643
3d9de27d9bd0 OSD handled by vf control()
arpi
parents: 5607
diff changeset
98 video_out->draw_osd();
3d9de27d9bd0 OSD handled by vf control()
arpi
parents: 5607
diff changeset
99 return CONTROL_TRUE;
10052
b358b7509e1a sort of a hack, but at least this lets the framerate-increasing
rfelker
parents: 9593
diff changeset
100 case VFCTRL_FLIP_PAGE:
b358b7509e1a sort of a hack, but at least this lets the framerate-increasing
rfelker
parents: 9593
diff changeset
101 {
b358b7509e1a sort of a hack, but at least this lets the framerate-increasing
rfelker
parents: 9593
diff changeset
102 if(!vo_config_count) return CONTROL_FALSE; // vo not configured?
b358b7509e1a sort of a hack, but at least this lets the framerate-increasing
rfelker
parents: 9593
diff changeset
103 video_out->flip_page();
b358b7509e1a sort of a hack, but at least this lets the framerate-increasing
rfelker
parents: 9593
diff changeset
104 return CONTROL_TRUE;
b358b7509e1a sort of a hack, but at least this lets the framerate-increasing
rfelker
parents: 9593
diff changeset
105 }
6780
5bf3ed8a17c4 equalizer reworked
alex
parents: 6197
diff changeset
106 case VFCTRL_SET_EQUALIZER:
5bf3ed8a17c4 equalizer reworked
alex
parents: 6197
diff changeset
107 {
5bf3ed8a17c4 equalizer reworked
alex
parents: 6197
diff changeset
108 if(!vo_config_count) return CONTROL_FALSE; // vo not configured?
33301
899d817e56fc Implement control() VOCTRL_SET/GET_EQUALIZER using a vf_equalize struct,
iive
parents: 32488
diff changeset
109 return (video_out->control(VOCTRL_SET_EQUALIZER, data) == VO_TRUE) ? CONTROL_TRUE : CONTROL_FALSE;
6780
5bf3ed8a17c4 equalizer reworked
alex
parents: 6197
diff changeset
110 }
5bf3ed8a17c4 equalizer reworked
alex
parents: 6197
diff changeset
111 case VFCTRL_GET_EQUALIZER:
5bf3ed8a17c4 equalizer reworked
alex
parents: 6197
diff changeset
112 {
5bf3ed8a17c4 equalizer reworked
alex
parents: 6197
diff changeset
113 if(!vo_config_count) return CONTROL_FALSE; // vo not configured?
33301
899d817e56fc Implement control() VOCTRL_SET/GET_EQUALIZER using a vf_equalize struct,
iive
parents: 32488
diff changeset
114 return (video_out->control(VOCTRL_GET_EQUALIZER, data) == VO_TRUE) ? CONTROL_TRUE : CONTROL_FALSE;
6780
5bf3ed8a17c4 equalizer reworked
alex
parents: 6197
diff changeset
115 }
27341
e7c989f7a7c9 Start unifying names of internal preprocessor directives.
diego
parents: 26754
diff changeset
116 #ifdef CONFIG_ASS
19576
3e7ce339d74b Add EOSD support to vf_vo.
eugeni
parents: 19463
diff changeset
117 case VFCTRL_INIT_EOSD:
3e7ce339d74b Add EOSD support to vf_vo.
eugeni
parents: 19463
diff changeset
118 {
20446
e8adc3778348 Split ass_configure() into several smaller functions.
eugeni
parents: 20197
diff changeset
119 return CONTROL_TRUE;
19576
3e7ce339d74b Add EOSD support to vf_vo.
eugeni
parents: 19463
diff changeset
120 }
3e7ce339d74b Add EOSD support to vf_vo.
eugeni
parents: 19463
diff changeset
121 case VFCTRL_DRAW_EOSD:
3e7ce339d74b Add EOSD support to vf_vo.
eugeni
parents: 19463
diff changeset
122 {
32391
b4c3659d16b1 Use a dynamic list for the sources of EOSD elements.
cigaes
parents: 31947
diff changeset
123 struct mp_eosd_image_list images;
b4c3659d16b1 Use a dynamic list for the sources of EOSD elements.
cigaes
parents: 31947
diff changeset
124 struct mp_eosd_settings res = {0};
20906
160974ca8bf2 Use vf control for reading pts from vf_vo
uau
parents: 20706
diff changeset
125 double pts = vf->priv->pts;
31927
6e0b5a97e00f EOSD/ASS code factorization
cigaes
parents: 31792
diff changeset
126 if (!vo_config_count) return CONTROL_FALSE;
32391
b4c3659d16b1 Use a dynamic list for the sources of EOSD elements.
cigaes
parents: 31947
diff changeset
127 res.unscaled = !!(vf->default_caps & VFCAP_EOSD_UNSCALED);
31927
6e0b5a97e00f EOSD/ASS code factorization
cigaes
parents: 31792
diff changeset
128 if (video_out->control(VOCTRL_GET_EOSD_RES, &res) == VO_TRUE)
32391
b4c3659d16b1 Use a dynamic list for the sources of EOSD elements.
cigaes
parents: 31947
diff changeset
129 eosd_configure(&res);
b4c3659d16b1 Use a dynamic list for the sources of EOSD elements.
cigaes
parents: 31947
diff changeset
130 eosd_render_frame(pts, &images);
21506
8174acbf0633 Speed up ASS subtitles display by detecting changes between two consecutive
eugeni
parents: 21427
diff changeset
131 return (video_out->control(VOCTRL_DRAW_EOSD, &images) == VO_TRUE) ? CONTROL_TRUE : CONTROL_FALSE;
19576
3e7ce339d74b Add EOSD support to vf_vo.
eugeni
parents: 19463
diff changeset
132 }
3e7ce339d74b Add EOSD support to vf_vo.
eugeni
parents: 19463
diff changeset
133 #endif
20906
160974ca8bf2 Use vf control for reading pts from vf_vo
uau
parents: 20706
diff changeset
134 case VFCTRL_GET_PTS:
160974ca8bf2 Use vf control for reading pts from vf_vo
uau
parents: 20706
diff changeset
135 {
160974ca8bf2 Use vf control for reading pts from vf_vo
uau
parents: 20706
diff changeset
136 *(double *)data = vf->priv->pts;
160974ca8bf2 Use vf control for reading pts from vf_vo
uau
parents: 20706
diff changeset
137 return CONTROL_TRUE;
160974ca8bf2 Use vf control for reading pts from vf_vo
uau
parents: 20706
diff changeset
138 }
5643
3d9de27d9bd0 OSD handled by vf control()
arpi
parents: 5607
diff changeset
139 }
5507
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
140 // return video_out->control(request,data);
5519
868c13f78f08 vf control codes added, autoq support
arpi
parents: 5511
diff changeset
141 return CONTROL_UNKNOWN;
5507
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
142 }
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
143
30642
a972c1a4a012 cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents: 30638
diff changeset
144 static int query_format(struct vf_instance *vf, unsigned int fmt){
5565
0b301fec999a capabilities support -> automatic insertion of scale, expand, pp
arpi
parents: 5559
diff changeset
145 int flags=video_out->control(VOCTRL_QUERY_FORMAT,&fmt);
0b301fec999a capabilities support -> automatic insertion of scale, expand, pp
arpi
parents: 5559
diff changeset
146 // draw_slice() accepts stride, draw_frame() doesn't:
0b301fec999a capabilities support -> automatic insertion of scale, expand, pp
arpi
parents: 5559
diff changeset
147 if(flags)
0b301fec999a capabilities support -> automatic insertion of scale, expand, pp
arpi
parents: 5559
diff changeset
148 if(fmt==IMGFMT_YV12 || fmt==IMGFMT_I420 || fmt==IMGFMT_IYUV)
0b301fec999a capabilities support -> automatic insertion of scale, expand, pp
arpi
parents: 5559
diff changeset
149 flags|=VFCAP_ACCEPT_STRIDE;
0b301fec999a capabilities support -> automatic insertion of scale, expand, pp
arpi
parents: 5559
diff changeset
150 return flags;
5507
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
151 }
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
152
30642
a972c1a4a012 cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents: 30638
diff changeset
153 static void get_image(struct vf_instance *vf,
5507
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
154 mp_image_t *mpi){
28546
e887c2dd6c62 Move direct-rendering hack from vo_xvmc to vf_vo, so it does not need to
reimar
parents: 27341
diff changeset
155 if(!vo_config_count) return;
e887c2dd6c62 Move direct-rendering hack from vo_xvmc to vf_vo, so it does not need to
reimar
parents: 27341
diff changeset
156 // GET_IMAGE is required for hardware-accelerated formats
e887c2dd6c62 Move direct-rendering hack from vo_xvmc to vf_vo, so it does not need to
reimar
parents: 27341
diff changeset
157 if(vo_directrendering ||
32488
49722126eba9 Add and use a IMGFMT_IS_HWACCEL define.
reimar
parents: 32467
diff changeset
158 IMGFMT_IS_HWACCEL(mpi->imgfmt))
5507
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
159 video_out->control(VOCTRL_GET_IMAGE,mpi);
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
160 }
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
161
30642
a972c1a4a012 cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents: 30638
diff changeset
162 static int put_image(struct vf_instance *vf,
17906
20aca9baf5d8 passing pts through the filter layer (lets see if pts or cola comes out at the end)
michael
parents: 17012
diff changeset
163 mp_image_t *mpi, double pts){
7368
a894e99c1e51 changing return type of put_image void->int
arpi
parents: 7220
diff changeset
164 if(!vo_config_count) return 0; // vo not configured?
18917
d9a75b26da6c Add a new video pts tracking mode, enabled by option -correct-pts.
uau
parents: 17906
diff changeset
165 // record pts (potentially modified by filters) for main loop
20906
160974ca8bf2 Use vf control for reading pts from vf_vo
uau
parents: 20706
diff changeset
166 vf->priv->pts = pts;
5507
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
167 // first check, maybe the vo/vf plugin implements draw_image using mpi:
7368
a894e99c1e51 changing return type of put_image void->int
arpi
parents: 7220
diff changeset
168 if(video_out->control(VOCTRL_DRAW_IMAGE,mpi)==VO_TRUE) return 1; // done.
5507
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
169 // nope, fallback to old draw_frame/draw_slice:
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
170 if(!(mpi->flags&(MP_IMGFLAG_DIRECT|MP_IMGFLAG_DRAW_CALLBACK))){
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
171 // blit frame:
7687
a9a19a991a70 support for VFCAP_ACCEPT_STRIDE in vo drivers
arpi
parents: 7368
diff changeset
172 // if(mpi->flags&MP_IMGFLAG_PLANAR)
a9a19a991a70 support for VFCAP_ACCEPT_STRIDE in vo drivers
arpi
parents: 7368
diff changeset
173 if(vf->default_caps&VFCAP_ACCEPT_STRIDE)
5507
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
174 video_out->draw_slice(mpi->planes,mpi->stride,mpi->w,mpi->h,mpi->x,mpi->y);
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
175 else
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
176 video_out->draw_frame(mpi->planes);
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
177 }
7368
a894e99c1e51 changing return type of put_image void->int
arpi
parents: 7220
diff changeset
178 return 1;
5507
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
179 }
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
180
30642
a972c1a4a012 cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents: 30638
diff changeset
181 static void start_slice(struct vf_instance *vf,
9560
ae2ce6ebc1fa Pass start slice to the vo it make dr + slice implemantation easier
albeu
parents: 8148
diff changeset
182 mp_image_t *mpi) {
ae2ce6ebc1fa Pass start slice to the vo it make dr + slice implemantation easier
albeu
parents: 8148
diff changeset
183 if(!vo_config_count) return; // vo not configured?
ae2ce6ebc1fa Pass start slice to the vo it make dr + slice implemantation easier
albeu
parents: 8148
diff changeset
184 video_out->control(VOCTRL_START_SLICE,mpi);
ae2ce6ebc1fa Pass start slice to the vo it make dr + slice implemantation easier
albeu
parents: 8148
diff changeset
185 }
ae2ce6ebc1fa Pass start slice to the vo it make dr + slice implemantation easier
albeu
parents: 8148
diff changeset
186
30642
a972c1a4a012 cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents: 30638
diff changeset
187 static void draw_slice(struct vf_instance *vf,
7220
e3ecccc7e505 warning fixes by Dominik Mierzejewski <dominik@rangers.eu.org>
arpi
parents: 7125
diff changeset
188 unsigned char** src, int* stride, int w,int h, int x, int y){
5511
7a24a067f0af vo_config_count now counts calls to vo->config()
arpi
parents: 5508
diff changeset
189 if(!vo_config_count) return; // vo not configured?
5507
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
190 video_out->draw_slice(src,stride,w,h,x,y);
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
191 }
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
192
30642
a972c1a4a012 cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents: 30638
diff changeset
193 static void uninit(struct vf_instance *vf)
19576
3e7ce339d74b Add EOSD support to vf_vo.
eugeni
parents: 19463
diff changeset
194 {
3e7ce339d74b Add EOSD support to vf_vo.
eugeni
parents: 19463
diff changeset
195 free(vf->priv);
3e7ce339d74b Add EOSD support to vf_vo.
eugeni
parents: 19463
diff changeset
196 }
5507
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
197 //===========================================================================//
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
198
30638
a7b908875c14 Rename open() vf initialization function to vf_open().
diego
parents: 30488
diff changeset
199 static int vf_open(vf_instance_t *vf, char *args){
5507
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
200 vf->config=config;
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
201 vf->control=control;
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
202 vf->query_format=query_format;
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
203 vf->get_image=get_image;
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
204 vf->put_image=put_image;
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
205 vf->draw_slice=draw_slice;
9560
ae2ce6ebc1fa Pass start slice to the vo it make dr + slice implemantation easier
albeu
parents: 8148
diff changeset
206 vf->start_slice=start_slice;
19576
3e7ce339d74b Add EOSD support to vf_vo.
eugeni
parents: 19463
diff changeset
207 vf->uninit=uninit;
3e7ce339d74b Add EOSD support to vf_vo.
eugeni
parents: 19463
diff changeset
208 vf->priv=calloc(1, sizeof(struct vf_priv_s));
25219
e82ecde2cbd4 Mark several uses of vo_functions_t as const to stop some of the current
reimar
parents: 23134
diff changeset
209 vf->priv->vo = (const vo_functions_t *)args;
5507
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
210 if(!video_out) return 0; // no vo ?
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
211 return 1;
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
212 }
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
213
25221
00fff9a3b735 Make all vf_info_t structs const
reimar
parents: 25219
diff changeset
214 const vf_info_t vf_info_vo = {
5507
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
215 "libvo wrapper",
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
216 "vo",
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
217 "A'rpi",
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
218 "for internal use",
30638
a7b908875c14 Rename open() vf initialization function to vf_open().
diego
parents: 30488
diff changeset
219 vf_open,
9593
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9560
diff changeset
220 NULL
5507
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
221 };
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
222
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
223 //===========================================================================//