annotate libmpcodecs/vf_vo.c @ 24576:6704a924d4aa

According to MSDN a thread must call CoUninitialize once for each successful call it has made to CoInitialize or CoInitializeEx, including any call that returns S_FALSE. Only the CoUninitialize call corresponding to the CoInitialize or CoInitializeEx call that initialized the library can close it. patch by Gianluigi Tiesi, mplayer netfarm it
author diego
date Sun, 23 Sep 2007 20:37:33 +0000
parents 1de2a46a0987
children e82ecde2cbd4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5507
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
1 #include <stdio.h>
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
2 #include <stdlib.h>
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
3 #include <string.h>
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
4
17012
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 15212
diff changeset
5 #include "config.h"
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 15212
diff changeset
6 #include "mp_msg.h"
5507
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
7
5607
1972c3475d93 mp_image.h and img_format.h moved to libmpcodecs
arpi
parents: 5565
diff changeset
8 #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
9 #include "vf.h"
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
10
17012
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 15212
diff changeset
11 #include "libvo/video_out.h"
5507
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
12
19576
3e7ce339d74b Add EOSD support to vf_vo.
eugeni
parents: 19463
diff changeset
13 #ifdef USE_ASS
3e7ce339d74b Add EOSD support to vf_vo.
eugeni
parents: 19463
diff changeset
14 #include "libass/ass.h"
3e7ce339d74b Add EOSD support to vf_vo.
eugeni
parents: 19463
diff changeset
15 #include "libass/ass_mp.h"
3e7ce339d74b Add EOSD support to vf_vo.
eugeni
parents: 19463
diff changeset
16 extern ass_track_t* ass_track;
3e7ce339d74b Add EOSD support to vf_vo.
eugeni
parents: 19463
diff changeset
17 #endif
3e7ce339d74b Add EOSD support to vf_vo.
eugeni
parents: 19463
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 //===========================================================================//
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
20
19576
3e7ce339d74b Add EOSD support to vf_vo.
eugeni
parents: 19463
diff changeset
21 extern int sub_visibility;
20197
acc196e4b3cc Fix typo in sub_delay external specification.
eugeni
parents: 19582
diff changeset
22 extern float sub_delay;
19576
3e7ce339d74b Add EOSD support to vf_vo.
eugeni
parents: 19463
diff changeset
23
20906
160974ca8bf2 Use vf control for reading pts from vf_vo
uau
parents: 20706
diff changeset
24 struct vf_priv_s {
19576
3e7ce339d74b Add EOSD support to vf_vo.
eugeni
parents: 19463
diff changeset
25 double pts;
3e7ce339d74b Add EOSD support to vf_vo.
eugeni
parents: 19463
diff changeset
26 vo_functions_t *vo;
3e7ce339d74b Add EOSD support to vf_vo.
eugeni
parents: 19463
diff changeset
27 #ifdef USE_ASS
20477
de4a66d99f41 Libass interface reworked:
eugeni
parents: 20446
diff changeset
28 ass_renderer_t* ass_priv;
21506
8174acbf0633 Speed up ASS subtitles display by detecting changes between two consecutive
eugeni
parents: 21427
diff changeset
29 int prev_visibility;
19576
3e7ce339d74b Add EOSD support to vf_vo.
eugeni
parents: 19463
diff changeset
30 #endif
3e7ce339d74b Add EOSD support to vf_vo.
eugeni
parents: 19463
diff changeset
31 };
20906
160974ca8bf2 Use vf control for reading pts from vf_vo
uau
parents: 20706
diff changeset
32 #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
33
7731
1f8961f2b34c compiler warning fixes
arpi
parents: 7687
diff changeset
34 static int query_format(struct vf_instance_s* vf, unsigned int fmt); /* forward declaration */
1f8961f2b34c compiler warning fixes
arpi
parents: 7687
diff changeset
35
5507
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
36 static int config(struct vf_instance_s* vf,
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
37 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
38 unsigned int flags, unsigned int outfmt){
5559
7a73663095fc print VO info
arpi
parents: 5519
diff changeset
39
6197
48d0e89e8b21 report error if bad dimensions requested (<=0)
alex
parents: 6157
diff changeset
40 if ((width <= 0) || (height <= 0) || (d_width <= 0) || (d_height <= 0))
48d0e89e8b21 report error if bad dimensions requested (<=0)
alex
parents: 6157
diff changeset
41 {
48d0e89e8b21 report error if bad dimensions requested (<=0)
alex
parents: 6157
diff changeset
42 mp_msg(MSGT_CPLAYER, MSGL_ERR, "VO: invalid dimensions!\n");
48d0e89e8b21 report error if bad dimensions requested (<=0)
alex
parents: 6157
diff changeset
43 return 0;
48d0e89e8b21 report error if bad dimensions requested (<=0)
alex
parents: 6157
diff changeset
44 }
48d0e89e8b21 report error if bad dimensions requested (<=0)
alex
parents: 6157
diff changeset
45
8148
5b39e79af5fe removed get_info, using the same sheme as in libmpcodecs instead
alex
parents: 7731
diff changeset
46 if(video_out->info)
5b39e79af5fe removed get_info, using the same sheme as in libmpcodecs instead
alex
parents: 7731
diff changeset
47 { const vo_info_t *info = video_out->info;
5559
7a73663095fc print VO info
arpi
parents: 5519
diff changeset
48 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
49 width, height,
7a73663095fc print VO info
arpi
parents: 5519
diff changeset
50 d_width, d_height,
7a73663095fc print VO info
arpi
parents: 5519
diff changeset
51 vo_format_name(outfmt),
15212
05aa13cdf92f replace VO and VF numeric flags with #defined identifiers
henry
parents: 10052
diff changeset
52 (flags&VOFLAG_FULLSCREEN)?" [fs]":"",
05aa13cdf92f replace VO and VF numeric flags with #defined identifiers
henry
parents: 10052
diff changeset
53 (flags&VOFLAG_MODESWITCHING)?" [vm]":"",
05aa13cdf92f replace VO and VF numeric flags with #defined identifiers
henry
parents: 10052
diff changeset
54 (flags&VOFLAG_SWSCALE)?" [zoom]":"",
05aa13cdf92f replace VO and VF numeric flags with #defined identifiers
henry
parents: 10052
diff changeset
55 (flags&VOFLAG_FLIPPING)?" [flip]":"");
5559
7a73663095fc print VO info
arpi
parents: 5519
diff changeset
56 mp_msg(MSGT_CPLAYER,MSGL_V,"VO: Description: %s\n",info->name);
7a73663095fc print VO info
arpi
parents: 5519
diff changeset
57 mp_msg(MSGT_CPLAYER,MSGL_V,"VO: Author: %s\n", info->author);
7a73663095fc print VO info
arpi
parents: 5519
diff changeset
58 if(info->comment && strlen(info->comment) > 0)
7a73663095fc print VO info
arpi
parents: 5519
diff changeset
59 mp_msg(MSGT_CPLAYER,MSGL_V,"VO: Comment: %s\n", info->comment);
7a73663095fc print VO info
arpi
parents: 5519
diff changeset
60 }
7a73663095fc print VO info
arpi
parents: 5519
diff changeset
61
7687
a9a19a991a70 support for VFCAP_ACCEPT_STRIDE in vo drivers
arpi
parents: 7368
diff changeset
62 // 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
63 vf->default_caps=query_format(vf,outfmt);
7687
a9a19a991a70 support for VFCAP_ACCEPT_STRIDE in vo drivers
arpi
parents: 7368
diff changeset
64
22232
d0b60d14d8d7 Move common vo initialization code to video_out.c
reimar
parents: 21506
diff changeset
65 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
66 return 0;
8148
5b39e79af5fe removed get_info, using the same sheme as in libmpcodecs instead
alex
parents: 7731
diff changeset
67
19576
3e7ce339d74b Add EOSD support to vf_vo.
eugeni
parents: 19463
diff changeset
68 #ifdef USE_ASS
20446
e8adc3778348 Split ass_configure() into several smaller functions.
eugeni
parents: 20197
diff changeset
69 if (vf->priv->ass_priv)
23134
1de2a46a0987 Add -ass-hinting option for setting font hinting method.
eugeni
parents: 22232
diff changeset
70 ass_configure(vf->priv->ass_priv, width, height, !!(vf->default_caps & VFCAP_EOSD_UNSCALED));
19576
3e7ce339d74b Add EOSD support to vf_vo.
eugeni
parents: 19463
diff changeset
71 #endif
3e7ce339d74b Add EOSD support to vf_vo.
eugeni
parents: 19463
diff changeset
72
5511
7a24a067f0af vo_config_count now counts calls to vo->config()
arpi
parents: 5508
diff changeset
73 ++vo_config_count;
5507
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
74 return 1;
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
75 }
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
76
6832
54578e5a8050 ... removed from vf's control(), sing struct for equalizer. based on patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>
arpi
parents: 6786
diff changeset
77 static int control(struct vf_instance_s* vf, int request, void* data)
6780
5bf3ed8a17c4 equalizer reworked
alex
parents: 6197
diff changeset
78 {
5643
3d9de27d9bd0 OSD handled by vf control()
arpi
parents: 5607
diff changeset
79 switch(request){
20973
c0bcec5150a3 Add deinterlace property, patch by Carl Eugen Hoyos
reimar
parents: 20906
diff changeset
80 case VFCTRL_GET_DEINTERLACE:
c0bcec5150a3 Add deinterlace property, patch by Carl Eugen Hoyos
reimar
parents: 20906
diff changeset
81 {
c0bcec5150a3 Add deinterlace property, patch by Carl Eugen Hoyos
reimar
parents: 20906
diff changeset
82 if(!video_out) return CONTROL_FALSE; // vo not configured?
c0bcec5150a3 Add deinterlace property, patch by Carl Eugen Hoyos
reimar
parents: 20906
diff changeset
83 return(video_out->control(VOCTRL_GET_DEINTERLACE, data)
c0bcec5150a3 Add deinterlace property, patch by Carl Eugen Hoyos
reimar
parents: 20906
diff changeset
84 == VO_TRUE) ? CONTROL_TRUE : CONTROL_FALSE;
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 case VFCTRL_SET_DEINTERLACE:
c0bcec5150a3 Add deinterlace property, patch by Carl Eugen Hoyos
reimar
parents: 20906
diff changeset
87 {
c0bcec5150a3 Add deinterlace property, patch by Carl Eugen Hoyos
reimar
parents: 20906
diff changeset
88 if(!video_out) return CONTROL_FALSE; // vo not configured?
c0bcec5150a3 Add deinterlace property, patch by Carl Eugen Hoyos
reimar
parents: 20906
diff changeset
89 return(video_out->control(VOCTRL_SET_DEINTERLACE, data)
c0bcec5150a3 Add deinterlace property, patch by Carl Eugen Hoyos
reimar
parents: 20906
diff changeset
90 == VO_TRUE) ? CONTROL_TRUE : CONTROL_FALSE;
c0bcec5150a3 Add deinterlace property, patch by Carl Eugen Hoyos
reimar
parents: 20906
diff changeset
91 }
5643
3d9de27d9bd0 OSD handled by vf control()
arpi
parents: 5607
diff changeset
92 case VFCTRL_DRAW_OSD:
6157
alex
parents: 6138
diff changeset
93 if(!vo_config_count) return CONTROL_FALSE; // vo not configured?
5643
3d9de27d9bd0 OSD handled by vf control()
arpi
parents: 5607
diff changeset
94 video_out->draw_osd();
3d9de27d9bd0 OSD handled by vf control()
arpi
parents: 5607
diff changeset
95 return CONTROL_TRUE;
10052
b358b7509e1a sort of a hack, but at least this lets the framerate-increasing
rfelker
parents: 9593
diff changeset
96 case VFCTRL_FLIP_PAGE:
b358b7509e1a sort of a hack, but at least this lets the framerate-increasing
rfelker
parents: 9593
diff changeset
97 {
b358b7509e1a sort of a hack, but at least this lets the framerate-increasing
rfelker
parents: 9593
diff changeset
98 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
99 video_out->flip_page();
b358b7509e1a sort of a hack, but at least this lets the framerate-increasing
rfelker
parents: 9593
diff changeset
100 return CONTROL_TRUE;
b358b7509e1a sort of a hack, but at least this lets the framerate-increasing
rfelker
parents: 9593
diff changeset
101 }
6780
5bf3ed8a17c4 equalizer reworked
alex
parents: 6197
diff changeset
102 case VFCTRL_SET_EQUALIZER:
5bf3ed8a17c4 equalizer reworked
alex
parents: 6197
diff changeset
103 {
6832
54578e5a8050 ... removed from vf's control(), sing struct for equalizer. based on patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>
arpi
parents: 6786
diff changeset
104 vf_equalizer_t *eq=data;
6780
5bf3ed8a17c4 equalizer reworked
alex
parents: 6197
diff changeset
105 if(!vo_config_count) return CONTROL_FALSE; // vo not configured?
6832
54578e5a8050 ... removed from vf's control(), sing struct for equalizer. based on patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>
arpi
parents: 6786
diff changeset
106 return((video_out->control(VOCTRL_SET_EQUALIZER, eq->item, eq->value) == VO_TRUE) ? CONTROL_TRUE : CONTROL_FALSE);
6780
5bf3ed8a17c4 equalizer reworked
alex
parents: 6197
diff changeset
107 }
5bf3ed8a17c4 equalizer reworked
alex
parents: 6197
diff changeset
108 case VFCTRL_GET_EQUALIZER:
5bf3ed8a17c4 equalizer reworked
alex
parents: 6197
diff changeset
109 {
6832
54578e5a8050 ... removed from vf's control(), sing struct for equalizer. based on patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>
arpi
parents: 6786
diff changeset
110 vf_equalizer_t *eq=data;
6780
5bf3ed8a17c4 equalizer reworked
alex
parents: 6197
diff changeset
111 if(!vo_config_count) return CONTROL_FALSE; // vo not configured?
6832
54578e5a8050 ... removed from vf's control(), sing struct for equalizer. based on patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>
arpi
parents: 6786
diff changeset
112 return((video_out->control(VOCTRL_GET_EQUALIZER, eq->item, &eq->value) == VO_TRUE) ? CONTROL_TRUE : CONTROL_FALSE);
6780
5bf3ed8a17c4 equalizer reworked
alex
parents: 6197
diff changeset
113 }
19576
3e7ce339d74b Add EOSD support to vf_vo.
eugeni
parents: 19463
diff changeset
114 #ifdef USE_ASS
3e7ce339d74b Add EOSD support to vf_vo.
eugeni
parents: 19463
diff changeset
115 case VFCTRL_INIT_EOSD:
3e7ce339d74b Add EOSD support to vf_vo.
eugeni
parents: 19463
diff changeset
116 {
20477
de4a66d99f41 Libass interface reworked:
eugeni
parents: 20446
diff changeset
117 vf->priv->ass_priv = ass_renderer_init((ass_library_t*)data);
20446
e8adc3778348 Split ass_configure() into several smaller functions.
eugeni
parents: 20197
diff changeset
118 if (!vf->priv->ass_priv) return CONTROL_FALSE;
20706
6ae01628975f Initialize fontconfig in VFCTRL_INIT_EOSD handler.
eugeni
parents: 20477
diff changeset
119 ass_configure_fonts(vf->priv->ass_priv);
21506
8174acbf0633 Speed up ASS subtitles display by detecting changes between two consecutive
eugeni
parents: 21427
diff changeset
120 vf->priv->prev_visibility = 0;
20446
e8adc3778348 Split ass_configure() into several smaller functions.
eugeni
parents: 20197
diff changeset
121 return CONTROL_TRUE;
19576
3e7ce339d74b Add EOSD support to vf_vo.
eugeni
parents: 19463
diff changeset
122 }
3e7ce339d74b Add EOSD support to vf_vo.
eugeni
parents: 19463
diff changeset
123 case VFCTRL_DRAW_EOSD:
3e7ce339d74b Add EOSD support to vf_vo.
eugeni
parents: 19463
diff changeset
124 {
21506
8174acbf0633 Speed up ASS subtitles display by detecting changes between two consecutive
eugeni
parents: 21427
diff changeset
125 mp_eosd_images_t images = {NULL, 2};
20906
160974ca8bf2 Use vf control for reading pts from vf_vo
uau
parents: 20706
diff changeset
126 double pts = vf->priv->pts;
19576
3e7ce339d74b Add EOSD support to vf_vo.
eugeni
parents: 19463
diff changeset
127 if (!vo_config_count || !vf->priv->ass_priv) return CONTROL_FALSE;
3e7ce339d74b Add EOSD support to vf_vo.
eugeni
parents: 19463
diff changeset
128 if (sub_visibility && vf->priv->ass_priv && ass_track && (pts != MP_NOPTS_VALUE)) {
3e7ce339d74b Add EOSD support to vf_vo.
eugeni
parents: 19463
diff changeset
129 mp_eosd_res_t res;
3e7ce339d74b Add EOSD support to vf_vo.
eugeni
parents: 19463
diff changeset
130 memset(&res, 0, sizeof(res));
3e7ce339d74b Add EOSD support to vf_vo.
eugeni
parents: 19463
diff changeset
131 if (video_out->control(VOCTRL_GET_EOSD_RES, &res) == VO_TRUE) {
20446
e8adc3778348 Split ass_configure() into several smaller functions.
eugeni
parents: 20197
diff changeset
132 ass_set_frame_size(vf->priv->ass_priv, res.w, res.h);
e8adc3778348 Split ass_configure() into several smaller functions.
eugeni
parents: 20197
diff changeset
133 ass_set_margins(vf->priv->ass_priv, res.mt, res.mb, res.ml, res.mr);
21427
c37fae0e2b5a Set video aspect ratio for libass in vf_vo.
eugeni
parents: 21161
diff changeset
134 ass_set_aspect_ratio(vf->priv->ass_priv, (double)res.w / res.h);
19576
3e7ce339d74b Add EOSD support to vf_vo.
eugeni
parents: 19463
diff changeset
135 }
3e7ce339d74b Add EOSD support to vf_vo.
eugeni
parents: 19463
diff changeset
136
21506
8174acbf0633 Speed up ASS subtitles display by detecting changes between two consecutive
eugeni
parents: 21427
diff changeset
137 images.imgs = ass_render_frame(vf->priv->ass_priv, ass_track, (pts+sub_delay) * 1000 + .5, &images.changed);
8174acbf0633 Speed up ASS subtitles display by detecting changes between two consecutive
eugeni
parents: 21427
diff changeset
138 if (!vf->priv->prev_visibility)
8174acbf0633 Speed up ASS subtitles display by detecting changes between two consecutive
eugeni
parents: 21427
diff changeset
139 images.changed = 2;
8174acbf0633 Speed up ASS subtitles display by detecting changes between two consecutive
eugeni
parents: 21427
diff changeset
140 vf->priv->prev_visibility = 1;
8174acbf0633 Speed up ASS subtitles display by detecting changes between two consecutive
eugeni
parents: 21427
diff changeset
141 } else
8174acbf0633 Speed up ASS subtitles display by detecting changes between two consecutive
eugeni
parents: 21427
diff changeset
142 vf->priv->prev_visibility = 0;
8174acbf0633 Speed up ASS subtitles display by detecting changes between two consecutive
eugeni
parents: 21427
diff changeset
143 vf->priv->prev_visibility = sub_visibility;
8174acbf0633 Speed up ASS subtitles display by detecting changes between two consecutive
eugeni
parents: 21427
diff changeset
144 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
145 }
3e7ce339d74b Add EOSD support to vf_vo.
eugeni
parents: 19463
diff changeset
146 #endif
20906
160974ca8bf2 Use vf control for reading pts from vf_vo
uau
parents: 20706
diff changeset
147 case VFCTRL_GET_PTS:
160974ca8bf2 Use vf control for reading pts from vf_vo
uau
parents: 20706
diff changeset
148 {
160974ca8bf2 Use vf control for reading pts from vf_vo
uau
parents: 20706
diff changeset
149 *(double *)data = vf->priv->pts;
160974ca8bf2 Use vf control for reading pts from vf_vo
uau
parents: 20706
diff changeset
150 return CONTROL_TRUE;
160974ca8bf2 Use vf control for reading pts from vf_vo
uau
parents: 20706
diff changeset
151 }
5643
3d9de27d9bd0 OSD handled by vf control()
arpi
parents: 5607
diff changeset
152 }
5507
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
153 // return video_out->control(request,data);
5519
868c13f78f08 vf control codes added, autoq support
arpi
parents: 5511
diff changeset
154 return CONTROL_UNKNOWN;
5507
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
155 }
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
156
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
157 static int query_format(struct vf_instance_s* vf, unsigned int fmt){
5565
0b301fec999a capabilities support -> automatic insertion of scale, expand, pp
arpi
parents: 5559
diff changeset
158 int flags=video_out->control(VOCTRL_QUERY_FORMAT,&fmt);
0b301fec999a capabilities support -> automatic insertion of scale, expand, pp
arpi
parents: 5559
diff changeset
159 // draw_slice() accepts stride, draw_frame() doesn't:
0b301fec999a capabilities support -> automatic insertion of scale, expand, pp
arpi
parents: 5559
diff changeset
160 if(flags)
0b301fec999a capabilities support -> automatic insertion of scale, expand, pp
arpi
parents: 5559
diff changeset
161 if(fmt==IMGFMT_YV12 || fmt==IMGFMT_I420 || fmt==IMGFMT_IYUV)
0b301fec999a capabilities support -> automatic insertion of scale, expand, pp
arpi
parents: 5559
diff changeset
162 flags|=VFCAP_ACCEPT_STRIDE;
0b301fec999a capabilities support -> automatic insertion of scale, expand, pp
arpi
parents: 5559
diff changeset
163 return flags;
5507
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
164 }
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
165
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
166 static void get_image(struct vf_instance_s* vf,
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
167 mp_image_t *mpi){
5511
7a24a067f0af vo_config_count now counts calls to vo->config()
arpi
parents: 5508
diff changeset
168 if(vo_directrendering && vo_config_count)
5507
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
169 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
170 }
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
171
7368
a894e99c1e51 changing return type of put_image void->int
arpi
parents: 7220
diff changeset
172 static int put_image(struct vf_instance_s* 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
173 mp_image_t *mpi, double pts){
7368
a894e99c1e51 changing return type of put_image void->int
arpi
parents: 7220
diff changeset
174 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
175 // 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
176 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
177 // 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
178 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
179 // 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
180 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
181 // blit frame:
7687
a9a19a991a70 support for VFCAP_ACCEPT_STRIDE in vo drivers
arpi
parents: 7368
diff changeset
182 // if(mpi->flags&MP_IMGFLAG_PLANAR)
a9a19a991a70 support for VFCAP_ACCEPT_STRIDE in vo drivers
arpi
parents: 7368
diff changeset
183 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
184 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
185 else
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
186 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
187 }
7368
a894e99c1e51 changing return type of put_image void->int
arpi
parents: 7220
diff changeset
188 return 1;
5507
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
189 }
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
190
9560
ae2ce6ebc1fa Pass start slice to the vo it make dr + slice implemantation easier
albeu
parents: 8148
diff changeset
191 static void start_slice(struct vf_instance_s* vf,
ae2ce6ebc1fa Pass start slice to the vo it make dr + slice implemantation easier
albeu
parents: 8148
diff changeset
192 mp_image_t *mpi) {
ae2ce6ebc1fa Pass start slice to the vo it make dr + slice implemantation easier
albeu
parents: 8148
diff changeset
193 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
194 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
195 }
ae2ce6ebc1fa Pass start slice to the vo it make dr + slice implemantation easier
albeu
parents: 8148
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 static void draw_slice(struct vf_instance_s* vf,
7220
e3ecccc7e505 warning fixes by Dominik Mierzejewski <dominik@rangers.eu.org>
arpi
parents: 7125
diff changeset
198 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
199 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
200 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
201 }
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
202
19576
3e7ce339d74b Add EOSD support to vf_vo.
eugeni
parents: 19463
diff changeset
203 static void uninit(struct vf_instance_s* vf)
3e7ce339d74b Add EOSD support to vf_vo.
eugeni
parents: 19463
diff changeset
204 {
3e7ce339d74b Add EOSD support to vf_vo.
eugeni
parents: 19463
diff changeset
205 if (vf->priv) {
19582
52a319698894 fix build failure when ASS is disabled
aurel
parents: 19576
diff changeset
206 #ifdef USE_ASS
19576
3e7ce339d74b Add EOSD support to vf_vo.
eugeni
parents: 19463
diff changeset
207 if (vf->priv->ass_priv)
20477
de4a66d99f41 Libass interface reworked:
eugeni
parents: 20446
diff changeset
208 ass_renderer_done(vf->priv->ass_priv);
19582
52a319698894 fix build failure when ASS is disabled
aurel
parents: 19576
diff changeset
209 #endif
19576
3e7ce339d74b Add EOSD support to vf_vo.
eugeni
parents: 19463
diff changeset
210 free(vf->priv);
3e7ce339d74b Add EOSD support to vf_vo.
eugeni
parents: 19463
diff changeset
211 }
3e7ce339d74b Add EOSD support to vf_vo.
eugeni
parents: 19463
diff changeset
212 }
5507
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
213 //===========================================================================//
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
214
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
215 static int open(vf_instance_t *vf, char* args){
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
216 vf->config=config;
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
217 vf->control=control;
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
218 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
219 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
220 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
221 vf->draw_slice=draw_slice;
9560
ae2ce6ebc1fa Pass start slice to the vo it make dr + slice implemantation easier
albeu
parents: 8148
diff changeset
222 vf->start_slice=start_slice;
19576
3e7ce339d74b Add EOSD support to vf_vo.
eugeni
parents: 19463
diff changeset
223 vf->uninit=uninit;
3e7ce339d74b Add EOSD support to vf_vo.
eugeni
parents: 19463
diff changeset
224 vf->priv=calloc(1, sizeof(struct vf_priv_s));
20906
160974ca8bf2 Use vf control for reading pts from vf_vo
uau
parents: 20706
diff changeset
225 vf->priv->vo = (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
226 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
227 // if(video_out->preinit(args)) return 0; // preinit failed
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
228 return 1;
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
229 }
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
230
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
231 vf_info_t vf_info_vo = {
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
232 "libvo wrapper",
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
233 "vo",
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
234 "A'rpi",
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
235 "for internal use",
9593
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9560
diff changeset
236 open,
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9560
diff changeset
237 NULL
5507
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
238 };
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
239
d0d029fda134 video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff changeset
240 //===========================================================================//