Mercurial > mplayer.hg
annotate libmpcodecs/vf.c @ 12337:6f1b4c989914
soft skipping for mencoder. rather than skipping decoding/filtering
frames that will be skipped, mencoded tells vf_softskip (if present)
that it should drop the next frame. this allows filters that need to
see every input frame (inverse telecine, denoise3d, ...) to see
skipped frames before they get dropped.
in principle, a smarter softskip filter could be written that would
buffer frames and choose to drop the one with least change, rather
than strictly dropping the next one.
author | rfelker |
---|---|
date | Wed, 28 Apr 2004 04:29:17 +0000 |
parents | eeddcef4fb08 |
children | 7ddeffd0dbda |
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 |
7127 | 5 #include "../config.h" |
6188 | 6 #ifdef HAVE_MALLOC_H |
7 #include <malloc.h> | |
8 #endif | |
9 | |
5507
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
10 #include "../mp_msg.h" |
6994 | 11 #include "../help_mp.h" |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9532
diff
changeset
|
12 #include "../m_option.h" |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9532
diff
changeset
|
13 #include "../m_struct.h" |
6994 | 14 |
5507
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
15 |
5607 | 16 #include "img_format.h" |
17 #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
|
18 #include "vf.h" |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
19 |
10140
30cad6ad9dbc
fix segfaults with slices. support slice rendering into a filter even
rfelker
parents:
10006
diff
changeset
|
20 #include "../libvo/fastmemcpy.h" |
30cad6ad9dbc
fix segfaults with slices. support slice rendering into a filter even
rfelker
parents:
10006
diff
changeset
|
21 |
5507
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
22 extern vf_info_t vf_info_vo; |
6820
a99c7700e4f1
New plugin to test crop parameters. Arguments are the same as for the
kmkaplan
parents:
6708
diff
changeset
|
23 extern vf_info_t vf_info_rectangle; |
9832 | 24 #ifndef HAVE_NO_POSIX_SELECT |
7855 | 25 extern vf_info_t vf_info_bmovl; |
9832 | 26 #endif |
5507
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
27 extern vf_info_t vf_info_crop; |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
28 extern vf_info_t vf_info_expand; |
11141 | 29 #ifdef FF_POSTPROCESS |
5512 | 30 extern vf_info_t vf_info_pp; |
11141 | 31 #endif |
5522 | 32 extern vf_info_t vf_info_scale; |
5845 | 33 #ifdef USE_LIBFAME |
5536 | 34 extern vf_info_t vf_info_fame; |
5845 | 35 #endif |
5539 | 36 extern vf_info_t vf_info_format; |
11927 | 37 extern vf_info_t vf_info_noformat; |
5539 | 38 extern vf_info_t vf_info_yuy2; |
5557 | 39 extern vf_info_t vf_info_flip; |
5594 | 40 extern vf_info_t vf_info_rgb2bgr; |
5696 | 41 extern vf_info_t vf_info_rotate; |
5763 | 42 extern vf_info_t vf_info_mirror; |
5774 | 43 extern vf_info_t vf_info_palette; |
5873 | 44 extern vf_info_t vf_info_lavc; |
11662
173f22eb0505
vf_zrmjpeg MJPEG encoding filter, works together with vo_zr2. Only YV12
rik
parents:
11600
diff
changeset
|
45 extern vf_info_t vf_info_zrmjpeg; |
6000
34e396477d36
passthru mode for filters which don't alter image just config parameters (query_format/control/config)
arpi
parents:
5874
diff
changeset
|
46 extern vf_info_t vf_info_dvbscale; |
6061 | 47 extern vf_info_t vf_info_cropdetect; |
6278 | 48 extern vf_info_t vf_info_test; |
6424 | 49 extern vf_info_t vf_info_noise; |
6486 | 50 extern vf_info_t vf_info_yvu9; |
6859 | 51 extern vf_info_t vf_info_lavcdeint; |
7062
9eae15166ebb
soft video equalizer filter, currently supports brightness and
rfelker
parents:
6997
diff
changeset
|
52 extern vf_info_t vf_info_eq; |
7517
9d433771b6d0
-vf eq2, LUT-based brightness/contrast/gamma correction (Y-only)
arpi
parents:
7369
diff
changeset
|
53 extern vf_info_t vf_info_eq2; |
7155
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
7127
diff
changeset
|
54 extern vf_info_t vf_info_halfpack; |
7369
b34b005ab4f8
drop-deinterlace (dint) filter by Andriy N. Gritsenko <andrej@lucky.net>
arpi
parents:
7368
diff
changeset
|
55 extern vf_info_t vf_info_dint; |
7755
7637b72ef1f9
new filter: 1bpp - converts 1bpp image to yuv/rgb 8/16/32 bpp
arpi
parents:
7697
diff
changeset
|
56 extern vf_info_t vf_info_1bpp; |
7919 | 57 extern vf_info_t vf_info_2xsai; |
7966
a03235a5f395
new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
7919
diff
changeset
|
58 extern vf_info_t vf_info_unsharp; |
8002 | 59 extern vf_info_t vf_info_swapuv; |
8004
30789258ca66
(de)interleave filter (can be used to split/merge an interlaced image so other non interlaced filters an be used with idividual fields)
michael
parents:
8002
diff
changeset
|
60 extern vf_info_t vf_info_il; |
11242
34770e3d9654
fast deinterleaver (= il filter with stride/width/height tricks)
michael
parents:
11141
diff
changeset
|
61 extern vf_info_t vf_info_fil; |
8010 | 62 extern vf_info_t vf_info_boxblur; |
8100 | 63 extern vf_info_t vf_info_sab; |
8106 | 64 extern vf_info_t vf_info_smartblur; |
8112 | 65 extern vf_info_t vf_info_perspective; |
9404
7a43a52b9f60
down3dright filter by kabi (converts between 2 common stereoscopic systems)
michael
parents:
9179
diff
changeset
|
66 extern vf_info_t vf_info_down3dright; |
9072
d7237ee9db7f
new video filter to extract a single field using stride arithmetic,
rfelker
parents:
8631
diff
changeset
|
67 extern vf_info_t vf_info_field; |
9179
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
9072
diff
changeset
|
68 extern vf_info_t vf_info_denoise3d; |
9441
85fa92f14e99
vf_hqdn3d: High-Quality version of the denoise3d filter
arpi
parents:
9404
diff
changeset
|
69 extern vf_info_t vf_info_hqdn3d; |
9467
9fae4150ec43
experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
9441
diff
changeset
|
70 extern vf_info_t vf_info_detc; |
9468
356963ad4784
filter for applying 3:2 telecine to 23.976 fps progressive material.
rfelker
parents:
9467
diff
changeset
|
71 extern vf_info_t vf_info_telecine; |
10571
07cfe1e1a2c9
'tinterlace' filter (partial inverse of tfields) by Not Zed <notzed@ximian.com> (with minor fixes for current cvs by me)
alex
parents:
10510
diff
changeset
|
72 extern vf_info_t vf_info_tinterlace; |
9514 | 73 extern vf_info_t vf_info_tfields; |
9933
3548701a13fe
1. new alternate approach to inverse telecine! much better!
rfelker
parents:
9832
diff
changeset
|
74 extern vf_info_t vf_info_ivtc; |
3548701a13fe
1. new alternate approach to inverse telecine! much better!
rfelker
parents:
9832
diff
changeset
|
75 extern vf_info_t vf_info_ilpack; |
10006 | 76 extern vf_info_t vf_info_dsize; |
10150
b34ede44dada
new filter for dropping (near-)duplicate frames. can be used to fix
rfelker
parents:
10140
diff
changeset
|
77 extern vf_info_t vf_info_decimate; |
10510
73b3e4336cd4
Add mpeg2_flags to mp_image_t, copy flags in vd_libmpeg2.c,
ranma
parents:
10424
diff
changeset
|
78 extern vf_info_t vf_info_softpulldown; |
10664
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
10663
diff
changeset
|
79 extern vf_info_t vf_info_pullup; |
11600
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
11536
diff
changeset
|
80 extern vf_info_t vf_info_filmdint; |
10751 | 81 extern vf_info_t vf_info_framestep; |
82 extern vf_info_t vf_info_tile; | |
10809 | 83 extern vf_info_t vf_info_delogo; |
11249 | 84 extern vf_info_t vf_info_hue; |
11277 | 85 extern vf_info_t vf_info_spp; |
11536 | 86 extern vf_info_t vf_info_yuvcsp; |
11869 | 87 extern vf_info_t vf_info_kerndeint; |
11894
4c24bad2a86b
rgb test pattern generator, so we could change everything to match alex's definition of rgb/bgr
michael
parents:
11869
diff
changeset
|
88 extern vf_info_t vf_info_rgbtest; |
11921 | 89 extern vf_info_t vf_info_qp; |
12081
e34700c872ac
vf_phase filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
11998
diff
changeset
|
90 extern vf_info_t vf_info_phase; |
12225
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
12081
diff
changeset
|
91 extern vf_info_t vf_info_divtc; |
12334
eeddcef4fb08
"hard" frame duplication for mencoder. this finally makes it possible
rfelker
parents:
12225
diff
changeset
|
92 extern vf_info_t vf_info_harddup; |
12337
6f1b4c989914
soft skipping for mencoder. rather than skipping decoding/filtering
rfelker
parents:
12334
diff
changeset
|
93 extern vf_info_t vf_info_softskip; |
5507
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
94 |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
95 // list of available filters: |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
96 static vf_info_t* filter_list[]={ |
6820
a99c7700e4f1
New plugin to test crop parameters. Arguments are the same as for the
kmkaplan
parents:
6708
diff
changeset
|
97 &vf_info_rectangle, |
9832 | 98 #ifndef HAVE_NO_POSIX_SELECT |
7855 | 99 &vf_info_bmovl, |
9832 | 100 #endif |
5507
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
101 &vf_info_crop, |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
102 &vf_info_expand, |
11141 | 103 #ifdef FF_POSTPROCESS |
5512 | 104 &vf_info_pp, |
9531
46340b0f5a91
fix for a couple of linking problems patch by (Ambrose Li <a.c.li at ieee dot org>)
michael
parents:
9514
diff
changeset
|
105 #endif |
5522 | 106 &vf_info_scale, |
5507
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
107 // &vf_info_osd, |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
108 &vf_info_vo, |
5845 | 109 #ifdef USE_LIBFAME |
5536 | 110 &vf_info_fame, |
5845 | 111 #endif |
5539 | 112 &vf_info_format, |
11927 | 113 &vf_info_noformat, |
5539 | 114 &vf_info_yuy2, |
5557 | 115 &vf_info_flip, |
5594 | 116 &vf_info_rgb2bgr, |
5696 | 117 &vf_info_rotate, |
5763 | 118 &vf_info_mirror, |
5774 | 119 &vf_info_palette, |
5874 | 120 #ifdef USE_LIBAVCODEC |
5873 | 121 &vf_info_lavc, |
6859 | 122 &vf_info_lavcdeint, |
5874 | 123 #endif |
11662
173f22eb0505
vf_zrmjpeg MJPEG encoding filter, works together with vo_zr2. Only YV12
rik
parents:
11600
diff
changeset
|
124 #ifdef HAVE_ZR |
173f22eb0505
vf_zrmjpeg MJPEG encoding filter, works together with vo_zr2. Only YV12
rik
parents:
11600
diff
changeset
|
125 &vf_info_zrmjpeg, |
173f22eb0505
vf_zrmjpeg MJPEG encoding filter, works together with vo_zr2. Only YV12
rik
parents:
11600
diff
changeset
|
126 #endif |
6000
34e396477d36
passthru mode for filters which don't alter image just config parameters (query_format/control/config)
arpi
parents:
5874
diff
changeset
|
127 &vf_info_dvbscale, |
6061 | 128 &vf_info_cropdetect, |
6278 | 129 &vf_info_test, |
6424 | 130 &vf_info_noise, |
6486 | 131 &vf_info_yvu9, |
7062
9eae15166ebb
soft video equalizer filter, currently supports brightness and
rfelker
parents:
6997
diff
changeset
|
132 &vf_info_eq, |
7517
9d433771b6d0
-vf eq2, LUT-based brightness/contrast/gamma correction (Y-only)
arpi
parents:
7369
diff
changeset
|
133 &vf_info_eq2, |
7155
66019eb62edc
"halfpack" (yuv planar 4:2:0 -> packed 4:2:2, half height) video filter
rfelker
parents:
7127
diff
changeset
|
134 &vf_info_halfpack, |
7369
b34b005ab4f8
drop-deinterlace (dint) filter by Andriy N. Gritsenko <andrej@lucky.net>
arpi
parents:
7368
diff
changeset
|
135 &vf_info_dint, |
7755
7637b72ef1f9
new filter: 1bpp - converts 1bpp image to yuv/rgb 8/16/32 bpp
arpi
parents:
7697
diff
changeset
|
136 &vf_info_1bpp, |
7919 | 137 &vf_info_2xsai, |
7966
a03235a5f395
new video filter: unsharp - does image (l/c/l+c) sharping/bluring
arpi
parents:
7919
diff
changeset
|
138 &vf_info_unsharp, |
8002 | 139 &vf_info_swapuv, |
8004
30789258ca66
(de)interleave filter (can be used to split/merge an interlaced image so other non interlaced filters an be used with idividual fields)
michael
parents:
8002
diff
changeset
|
140 &vf_info_il, |
11242
34770e3d9654
fast deinterleaver (= il filter with stride/width/height tricks)
michael
parents:
11141
diff
changeset
|
141 &vf_info_fil, |
8010 | 142 &vf_info_boxblur, |
8100 | 143 &vf_info_sab, |
8106 | 144 &vf_info_smartblur, |
8112 | 145 &vf_info_perspective, |
9404
7a43a52b9f60
down3dright filter by kabi (converts between 2 common stereoscopic systems)
michael
parents:
9179
diff
changeset
|
146 &vf_info_down3dright, |
9072
d7237ee9db7f
new video filter to extract a single field using stride arithmetic,
rfelker
parents:
8631
diff
changeset
|
147 &vf_info_field, |
9179
e93a0dd3ed56
new video filter: denoise3d - temporal&spatial noise reduction
arpi
parents:
9072
diff
changeset
|
148 &vf_info_denoise3d, |
9441
85fa92f14e99
vf_hqdn3d: High-Quality version of the denoise3d filter
arpi
parents:
9404
diff
changeset
|
149 &vf_info_hqdn3d, |
9467
9fae4150ec43
experimental de-telecine filter. not documented or configurable yet,
rfelker
parents:
9441
diff
changeset
|
150 &vf_info_detc, |
9468
356963ad4784
filter for applying 3:2 telecine to 23.976 fps progressive material.
rfelker
parents:
9467
diff
changeset
|
151 &vf_info_telecine, |
10571
07cfe1e1a2c9
'tinterlace' filter (partial inverse of tfields) by Not Zed <notzed@ximian.com> (with minor fixes for current cvs by me)
alex
parents:
10510
diff
changeset
|
152 &vf_info_tinterlace, |
9514 | 153 &vf_info_tfields, |
9933
3548701a13fe
1. new alternate approach to inverse telecine! much better!
rfelker
parents:
9832
diff
changeset
|
154 &vf_info_ivtc, |
3548701a13fe
1. new alternate approach to inverse telecine! much better!
rfelker
parents:
9832
diff
changeset
|
155 &vf_info_ilpack, |
10006 | 156 &vf_info_dsize, |
10150
b34ede44dada
new filter for dropping (near-)duplicate frames. can be used to fix
rfelker
parents:
10140
diff
changeset
|
157 &vf_info_decimate, |
10510
73b3e4336cd4
Add mpeg2_flags to mp_image_t, copy flags in vd_libmpeg2.c,
ranma
parents:
10424
diff
changeset
|
158 &vf_info_softpulldown, |
10664
d47ca466c97b
pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
10663
diff
changeset
|
159 &vf_info_pullup, |
11600
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
11536
diff
changeset
|
160 &vf_info_filmdint, |
10751 | 161 &vf_info_framestep, |
162 &vf_info_tile, | |
10809 | 163 &vf_info_delogo, |
11249 | 164 &vf_info_hue, |
11277 | 165 #ifdef USE_LIBAVCODEC |
166 &vf_info_spp, | |
167 #endif | |
11536 | 168 &vf_info_yuvcsp, |
11869 | 169 &vf_info_kerndeint, |
11894
4c24bad2a86b
rgb test pattern generator, so we could change everything to match alex's definition of rgb/bgr
michael
parents:
11869
diff
changeset
|
170 &vf_info_rgbtest, |
11998 | 171 #ifdef USE_LIBAVCODEC |
11921 | 172 &vf_info_qp, |
11998 | 173 #endif |
12081
e34700c872ac
vf_phase filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
11998
diff
changeset
|
174 &vf_info_phase, |
12225
eb79a6192b2b
New filter by Ville Saari (114263 at foo dot bar dot org)
rfelker
parents:
12081
diff
changeset
|
175 &vf_info_divtc, |
12334
eeddcef4fb08
"hard" frame duplication for mencoder. this finally makes it possible
rfelker
parents:
12225
diff
changeset
|
176 &vf_info_harddup, |
12337
6f1b4c989914
soft skipping for mencoder. rather than skipping decoding/filtering
rfelker
parents:
12334
diff
changeset
|
177 &vf_info_softskip, |
5507
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
178 NULL |
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 |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9532
diff
changeset
|
181 // For the vf option |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9532
diff
changeset
|
182 m_obj_settings_t* vf_settings = NULL; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9532
diff
changeset
|
183 // For the vop option |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9532
diff
changeset
|
184 m_obj_settings_t* vo_plugin_args = NULL; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9532
diff
changeset
|
185 m_obj_list_t vf_obj_list = { |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9532
diff
changeset
|
186 (void**)filter_list, |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9532
diff
changeset
|
187 M_ST_OFF(vf_info_t,name), |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9532
diff
changeset
|
188 M_ST_OFF(vf_info_t,info), |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9532
diff
changeset
|
189 M_ST_OFF(vf_info_t,opts) |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9532
diff
changeset
|
190 }; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9532
diff
changeset
|
191 |
5507
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
192 //============================================================================ |
5661 | 193 // mpi stuff: |
5507
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
194 |
5661 | 195 void vf_mpi_clear(mp_image_t* mpi,int x0,int y0,int w,int h){ |
196 int y; | |
197 if(mpi->flags&MP_IMGFLAG_PLANAR){ | |
5668 | 198 y0&=~1;h+=h&1; |
5663 | 199 if(x0==0 && w==mpi->width){ |
5661 | 200 // full width clear: |
201 memset(mpi->planes[0]+mpi->stride[0]*y0,0,mpi->stride[0]*h); | |
6539
79b536a37e40
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6524
diff
changeset
|
202 memset(mpi->planes[1]+mpi->stride[1]*(y0>>mpi->chroma_y_shift),128,mpi->stride[1]*(h>>mpi->chroma_y_shift)); |
79b536a37e40
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6524
diff
changeset
|
203 memset(mpi->planes[2]+mpi->stride[2]*(y0>>mpi->chroma_y_shift),128,mpi->stride[2]*(h>>mpi->chroma_y_shift)); |
5668 | 204 } else |
5661 | 205 for(y=y0;y<y0+h;y+=2){ |
206 memset(mpi->planes[0]+x0+mpi->stride[0]*y,0,w); | |
207 memset(mpi->planes[0]+x0+mpi->stride[0]*(y+1),0,w); | |
6539
79b536a37e40
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6524
diff
changeset
|
208 memset(mpi->planes[1]+(x0>>mpi->chroma_x_shift)+mpi->stride[1]*(y>>mpi->chroma_y_shift),128,(w>>mpi->chroma_x_shift)); |
79b536a37e40
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6524
diff
changeset
|
209 memset(mpi->planes[2]+(x0>>mpi->chroma_x_shift)+mpi->stride[2]*(y>>mpi->chroma_y_shift),128,(w>>mpi->chroma_x_shift)); |
5661 | 210 } |
5668 | 211 return; |
5661 | 212 } |
213 // packed: | |
214 for(y=y0;y<y0+h;y++){ | |
215 unsigned char* dst=mpi->planes[0]+mpi->stride[0]*y+(mpi->bpp>>3)*x0; | |
216 if(mpi->flags&MP_IMGFLAG_YUV){ | |
6138
523014df7d32
big cosmetics patch, cleanup of messages printed by mplayer and libs.
arpi
parents:
6081
diff
changeset
|
217 unsigned int* p=(unsigned int*) dst; |
5661 | 218 int size=(mpi->bpp>>3)*w/4; |
219 int i; | |
220 if(mpi->flags&MP_IMGFLAG_SWAPPED){ | |
221 for(i=0;i<size;i+=4) p[i]=p[i+1]=p[i+2]=p[i+3]=0x00800080; | |
222 for(;i<size;i++) p[i]=0x00800080; | |
223 } else { | |
224 for(i=0;i<size;i+=4) p[i]=p[i+1]=p[i+2]=p[i+3]=0x80008000; | |
225 for(;i<size;i++) p[i]=0x80008000; | |
226 } | |
227 } else | |
228 memset(dst,0,(mpi->bpp>>3)*w); | |
229 } | |
230 } | |
5507
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
231 |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
232 mp_image_t* vf_get_image(vf_instance_t* vf, unsigned int outfmt, int mp_imgtype, int mp_imgflag, int w, int h){ |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
233 mp_image_t* mpi=NULL; |
6875 | 234 int w2=(mp_imgflag&MP_IMGFLAG_ACCEPT_ALIGNED_STRIDE)?((w+15)&(~15)):w; |
6000
34e396477d36
passthru mode for filters which don't alter image just config parameters (query_format/control/config)
arpi
parents:
5874
diff
changeset
|
235 |
34e396477d36
passthru mode for filters which don't alter image just config parameters (query_format/control/config)
arpi
parents:
5874
diff
changeset
|
236 if(vf->put_image==vf_next_put_image){ |
34e396477d36
passthru mode for filters which don't alter image just config parameters (query_format/control/config)
arpi
parents:
5874
diff
changeset
|
237 // passthru mode, if the plugin uses the fallback/default put_image() code |
34e396477d36
passthru mode for filters which don't alter image just config parameters (query_format/control/config)
arpi
parents:
5874
diff
changeset
|
238 return vf_get_image(vf->next,outfmt,mp_imgtype,mp_imgflag,w,h); |
34e396477d36
passthru mode for filters which don't alter image just config parameters (query_format/control/config)
arpi
parents:
5874
diff
changeset
|
239 } |
34e396477d36
passthru mode for filters which don't alter image just config parameters (query_format/control/config)
arpi
parents:
5874
diff
changeset
|
240 |
5507
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
241 // Note: we should call libvo first to check if it supports direct rendering |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
242 // and if not, then fallback to software buffers: |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
243 switch(mp_imgtype){ |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
244 case MP_IMGTYPE_EXPORT: |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
245 if(!vf->imgctx.export_images[0]) vf->imgctx.export_images[0]=new_mp_image(w2,h); |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
246 mpi=vf->imgctx.export_images[0]; |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
247 break; |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
248 case MP_IMGTYPE_STATIC: |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
249 if(!vf->imgctx.static_images[0]) vf->imgctx.static_images[0]=new_mp_image(w2,h); |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
250 mpi=vf->imgctx.static_images[0]; |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
251 break; |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
252 case MP_IMGTYPE_TEMP: |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
253 if(!vf->imgctx.temp_images[0]) vf->imgctx.temp_images[0]=new_mp_image(w2,h); |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
254 mpi=vf->imgctx.temp_images[0]; |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
255 break; |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
256 case MP_IMGTYPE_IPB: |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
257 if(!(mp_imgflag&MP_IMGFLAG_READABLE)){ // B frame: |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
258 if(!vf->imgctx.temp_images[0]) vf->imgctx.temp_images[0]=new_mp_image(w2,h); |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
259 mpi=vf->imgctx.temp_images[0]; |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
260 break; |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
261 } |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
262 case MP_IMGTYPE_IP: |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
263 if(!vf->imgctx.static_images[vf->imgctx.static_idx]) vf->imgctx.static_images[vf->imgctx.static_idx]=new_mp_image(w2,h); |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
264 mpi=vf->imgctx.static_images[vf->imgctx.static_idx]; |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
265 vf->imgctx.static_idx^=1; |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
266 break; |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
267 } |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
268 if(mpi){ |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
269 mpi->type=mp_imgtype; |
10424 | 270 mpi->w=w; mpi->h=h; |
6875 | 271 // keep buffer allocation status & color flags only: |
272 // mpi->flags&=~(MP_IMGFLAG_PRESERVE|MP_IMGFLAG_READABLE|MP_IMGFLAG_DIRECT); | |
273 mpi->flags&=MP_IMGFLAG_ALLOCATED|MP_IMGFLAG_TYPE_DISPLAYED|MP_IMGFLAGMASK_COLORS; | |
274 // accept restrictions & draw_slice flags only: | |
275 mpi->flags|=mp_imgflag&(MP_IMGFLAGMASK_RESTRICTIONS|MP_IMGFLAG_DRAW_CALLBACK); | |
5507
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
276 if(!vf->draw_slice) mpi->flags&=~MP_IMGFLAG_DRAW_CALLBACK; |
8631 | 277 if(mpi->width!=w2 || mpi->height!=h){ |
278 // printf("vf.c: MPI parameters changed! %dx%d -> %dx%d \n", mpi->width,mpi->height,w2,h); | |
5507
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
279 if(mpi->flags&MP_IMGFLAG_ALLOCATED){ |
8631 | 280 if(mpi->width<w2 || mpi->height<h){ |
281 // need to re-allocate buffer memory: | |
282 free(mpi->planes[0]); | |
283 mpi->flags&=~MP_IMGFLAG_ALLOCATED; | |
284 printf("vf.c: have to REALLOCATE buffer memory :(\n"); | |
285 } | |
10424 | 286 // } else { |
287 } { | |
9532 | 288 mpi->width=w2; mpi->chroma_width=(w2 + (1<<mpi->chroma_x_shift) - 1)>>mpi->chroma_x_shift; |
289 mpi->height=h; mpi->chroma_height=(h + (1<<mpi->chroma_y_shift) - 1)>>mpi->chroma_y_shift; | |
5507
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
290 } |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
291 } |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
292 if(!mpi->bpp) mp_image_setfmt(mpi,outfmt); |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
293 if(!(mpi->flags&MP_IMGFLAG_ALLOCATED) && mpi->type>MP_IMGTYPE_EXPORT){ |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
294 |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
295 // check libvo first! |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
296 if(vf->get_image) vf->get_image(vf,mpi); |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
297 |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
298 if(!(mpi->flags&MP_IMGFLAG_DIRECT)){ |
6524 | 299 // non-direct and not yet allocated image. allocate it! |
6875 | 300 |
301 // check if codec prefer aligned stride: | |
302 if(mp_imgflag&MP_IMGFLAG_PREFER_ALIGNED_STRIDE){ | |
303 int align=(mpi->flags&MP_IMGFLAG_PLANAR && | |
304 mpi->flags&MP_IMGFLAG_YUV) ? | |
305 (8<<mpi->chroma_x_shift)-1 : 15; // -- maybe FIXME | |
7697
a3c57c0c4ae2
don't honor stride hints if the next filter(chain) doesn't support stride
arpi
parents:
7517
diff
changeset
|
306 w2=((w+align)&(~align)); |
a3c57c0c4ae2
don't honor stride hints if the next filter(chain) doesn't support stride
arpi
parents:
7517
diff
changeset
|
307 if(mpi->width!=w2){ |
a3c57c0c4ae2
don't honor stride hints if the next filter(chain) doesn't support stride
arpi
parents:
7517
diff
changeset
|
308 // we have to change width... check if we CAN co it: |
a3c57c0c4ae2
don't honor stride hints if the next filter(chain) doesn't support stride
arpi
parents:
7517
diff
changeset
|
309 int flags=vf->query_format(vf,outfmt); // should not fail |
a3c57c0c4ae2
don't honor stride hints if the next filter(chain) doesn't support stride
arpi
parents:
7517
diff
changeset
|
310 if(!(flags&3)) mp_msg(MSGT_DECVIDEO,MSGL_WARN,"??? vf_get_image{vf->query_format(outfmt)} failed!\n"); |
a3c57c0c4ae2
don't honor stride hints if the next filter(chain) doesn't support stride
arpi
parents:
7517
diff
changeset
|
311 // printf("query -> 0x%X \n",flags); |
a3c57c0c4ae2
don't honor stride hints if the next filter(chain) doesn't support stride
arpi
parents:
7517
diff
changeset
|
312 if(flags&VFCAP_ACCEPT_STRIDE){ |
a3c57c0c4ae2
don't honor stride hints if the next filter(chain) doesn't support stride
arpi
parents:
7517
diff
changeset
|
313 mpi->width=w2; |
9532 | 314 mpi->chroma_width=(w2 + (1<<mpi->chroma_x_shift) - 1)>>mpi->chroma_x_shift; |
7697
a3c57c0c4ae2
don't honor stride hints if the next filter(chain) doesn't support stride
arpi
parents:
7517
diff
changeset
|
315 } |
a3c57c0c4ae2
don't honor stride hints if the next filter(chain) doesn't support stride
arpi
parents:
7517
diff
changeset
|
316 } |
6875 | 317 } |
318 | |
6524 | 319 // IF09 - allocate space for 4. plane delta info - unused |
6539
79b536a37e40
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6524
diff
changeset
|
320 if (mpi->imgfmt == IMGFMT_IF09) |
79b536a37e40
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6524
diff
changeset
|
321 { |
6524 | 322 mpi->planes[0]=memalign(64, mpi->bpp*mpi->width*(mpi->height+2)/8+ |
6539
79b536a37e40
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6524
diff
changeset
|
323 mpi->chroma_width*mpi->chroma_height); |
10163 | 324 /* export delta table */ |
10165
b78e3adeb850
it's still a 10l bug + 10l to me for commiting sh*t first time, and originally I wrote that tooo, so now I'm at about 1000litres? And anyway, this code isn't used :)) No, Rich, no, I will not upload a clip showing me drinking that much cola :)<EOF>
alex
parents:
10163
diff
changeset
|
325 mpi->planes[3]=mpi->planes[0]+(mpi->width*mpi->height)+2*(mpi->chroma_width*mpi->chroma_height); |
6539
79b536a37e40
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6524
diff
changeset
|
326 } |
6524 | 327 else |
328 mpi->planes[0]=memalign(64, mpi->bpp*mpi->width*(mpi->height+2)/8); | |
5507
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
329 if(mpi->flags&MP_IMGFLAG_PLANAR){ |
6524 | 330 // YV12/I420/YVU9/IF09. feel free to add other planar formats here... |
10424 | 331 //if(!mpi->stride[0]) |
332 mpi->stride[0]=mpi->width; | |
333 //if(!mpi->stride[1]) | |
334 mpi->stride[1]=mpi->stride[2]=mpi->chroma_width; | |
5507
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
335 if(mpi->flags&MP_IMGFLAG_SWAPPED){ |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
336 // I420/IYUV (Y,U,V) |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
337 mpi->planes[1]=mpi->planes[0]+mpi->width*mpi->height; |
6539
79b536a37e40
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6524
diff
changeset
|
338 mpi->planes[2]=mpi->planes[1]+mpi->chroma_width*mpi->chroma_height; |
5507
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
339 } else { |
6539
79b536a37e40
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6524
diff
changeset
|
340 // YV12,YVU9,IF09 (Y,V,U) |
5507
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
341 mpi->planes[2]=mpi->planes[0]+mpi->width*mpi->height; |
6539
79b536a37e40
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6524
diff
changeset
|
342 mpi->planes[1]=mpi->planes[2]+mpi->chroma_width*mpi->chroma_height; |
5507
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
343 } |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
344 } else { |
10424 | 345 //if(!mpi->stride[0]) |
346 mpi->stride[0]=mpi->width*mpi->bpp/8; | |
5507
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
347 } |
8631 | 348 // printf("clearing img!\n"); |
5663 | 349 vf_mpi_clear(mpi,0,0,mpi->width,mpi->height); |
5507
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
350 mpi->flags|=MP_IMGFLAG_ALLOCATED; |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
351 } |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
352 } |
9490
48ac3ce565ab
start_slice() added - similar to get_image(), but is called when using slices
arpi
parents:
9468
diff
changeset
|
353 if(mpi->flags&MP_IMGFLAG_DRAW_CALLBACK) |
48ac3ce565ab
start_slice() added - similar to get_image(), but is called when using slices
arpi
parents:
9468
diff
changeset
|
354 if(vf->start_slice) vf->start_slice(vf,mpi); |
5507
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
355 if(!(mpi->flags&MP_IMGFLAG_TYPE_DISPLAYED)){ |
9490
48ac3ce565ab
start_slice() added - similar to get_image(), but is called when using slices
arpi
parents:
9468
diff
changeset
|
356 mp_msg(MSGT_DECVIDEO,MSGL_V,"*** [%s] %s%s mp_image_t, %dx%dx%dbpp %s %s, %d bytes\n", |
5507
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
357 vf->info->name, |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
358 (mpi->type==MP_IMGTYPE_EXPORT)?"Exporting": |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
359 ((mpi->flags&MP_IMGFLAG_DIRECT)?"Direct Rendering":"Allocating"), |
9490
48ac3ce565ab
start_slice() added - similar to get_image(), but is called when using slices
arpi
parents:
9468
diff
changeset
|
360 (mpi->flags&MP_IMGFLAG_DRAW_CALLBACK)?" (slices)":"", |
5507
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
361 mpi->width,mpi->height,mpi->bpp, |
6708
8058078f1248
support for external pp by divx4. some fixes/cosmetics?
alex
parents:
6539
diff
changeset
|
362 (mpi->flags&MP_IMGFLAG_YUV)?"YUV":((mpi->flags&MP_IMGFLAG_SWAPPED)?"BGR":"RGB"), |
5507
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
363 (mpi->flags&MP_IMGFLAG_PLANAR)?"planar":"packed", |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
364 mpi->bpp*mpi->width*mpi->height/8); |
6539
79b536a37e40
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6524
diff
changeset
|
365 mp_msg(MSGT_DECVIDEO,MSGL_DBG2,"(imgfmt: %x, planes: %x,%x,%x strides: %d,%d,%d, chroma: %dx%d, shift: h:%d,v:%d)\n", |
6486 | 366 mpi->imgfmt, mpi->planes[0], mpi->planes[1], mpi->planes[2], |
6539
79b536a37e40
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6524
diff
changeset
|
367 mpi->stride[0], mpi->stride[1], mpi->stride[2], |
79b536a37e40
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6524
diff
changeset
|
368 mpi->chroma_width, mpi->chroma_height, mpi->chroma_x_shift, mpi->chroma_y_shift); |
5507
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
369 mpi->flags|=MP_IMGFLAG_TYPE_DISPLAYED; |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
370 } |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
371 |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
372 } |
8631 | 373 // printf("\rVF_MPI: %p %p %p %d %d %d \n", |
374 // mpi->planes[0],mpi->planes[1],mpi->planes[2], | |
375 // mpi->stride[0],mpi->stride[1],mpi->stride[2]); | |
5507
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
376 return mpi; |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
377 } |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
378 |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
379 //============================================================================ |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
380 |
7979
64f468cbedcd
The default query_format shouldn't accept IMGFMT_MPEGPES
albeu
parents:
7966
diff
changeset
|
381 // By default vf doesn't accept MPEGPES |
64f468cbedcd
The default query_format shouldn't accept IMGFMT_MPEGPES
albeu
parents:
7966
diff
changeset
|
382 static int vf_default_query_format(struct vf_instance_s* vf, unsigned int fmt){ |
64f468cbedcd
The default query_format shouldn't accept IMGFMT_MPEGPES
albeu
parents:
7966
diff
changeset
|
383 if(fmt == IMGFMT_MPEGPES) return 0; |
64f468cbedcd
The default query_format shouldn't accept IMGFMT_MPEGPES
albeu
parents:
7966
diff
changeset
|
384 return vf_next_query_format(vf,fmt); |
64f468cbedcd
The default query_format shouldn't accept IMGFMT_MPEGPES
albeu
parents:
7966
diff
changeset
|
385 } |
64f468cbedcd
The default query_format shouldn't accept IMGFMT_MPEGPES
albeu
parents:
7966
diff
changeset
|
386 |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9532
diff
changeset
|
387 vf_instance_t* vf_open_plugin(vf_info_t** filter_list, vf_instance_t* next, char *name, char **args){ |
5507
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
388 vf_instance_t* vf; |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
389 int i; |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
390 for(i=0;;i++){ |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
391 if(!filter_list[i]){ |
6993 | 392 mp_msg(MSGT_VFILTER,MSGL_ERR,MSGTR_CouldNotFindVideoFilter,name); |
5507
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
393 return NULL; // no such filter! |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
394 } |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
395 if(!strcmp(filter_list[i]->name,name)) break; |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
396 } |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
397 vf=malloc(sizeof(vf_instance_t)); |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
398 memset(vf,0,sizeof(vf_instance_t)); |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
399 vf->info=filter_list[i]; |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
400 vf->next=next; |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
401 vf->config=vf_next_config; |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
402 vf->control=vf_next_control; |
7979
64f468cbedcd
The default query_format shouldn't accept IMGFMT_MPEGPES
albeu
parents:
7966
diff
changeset
|
403 vf->query_format=vf_default_query_format; |
5507
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
404 vf->put_image=vf_next_put_image; |
5565
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5557
diff
changeset
|
405 vf->default_caps=VFCAP_ACCEPT_STRIDE; |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5557
diff
changeset
|
406 vf->default_reqs=0; |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9532
diff
changeset
|
407 if(vf->info->opts) { // vf_vo get some special argument |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9532
diff
changeset
|
408 m_struct_t* st = vf->info->opts; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9532
diff
changeset
|
409 void* vf_priv = m_struct_alloc(st); |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9532
diff
changeset
|
410 int n; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9532
diff
changeset
|
411 for(n = 0 ; args && args[2*n] ; n++) |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9532
diff
changeset
|
412 m_struct_set(st,vf_priv,args[2*n],args[2*n+1]); |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9532
diff
changeset
|
413 vf->priv = vf_priv; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9532
diff
changeset
|
414 args = NULL; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9532
diff
changeset
|
415 } else // Otherwise we should have the '_oldargs_' |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9532
diff
changeset
|
416 if(args && !strcmp(args[0],"_oldargs_")) |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9532
diff
changeset
|
417 args = (char**)args[1]; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9532
diff
changeset
|
418 else |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9532
diff
changeset
|
419 args = NULL; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9532
diff
changeset
|
420 if(vf->info->open(vf,(char*)args)>0) return vf; // Success! |
5507
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
421 free(vf); |
6993 | 422 mp_msg(MSGT_VFILTER,MSGL_ERR,MSGTR_CouldNotOpenVideoFilter,name); |
5507
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
423 return NULL; |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
424 } |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
425 |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9532
diff
changeset
|
426 vf_instance_t* vf_open_filter(vf_instance_t* next, char *name, char **args){ |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9532
diff
changeset
|
427 if(args && strcmp(args[0],"_oldargs_")) { |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9532
diff
changeset
|
428 int i,l = 0; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9532
diff
changeset
|
429 for(i = 0 ; args && args[2*i] ; i++) |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9532
diff
changeset
|
430 l += 1 + strlen(args[2*i]) + 1 + strlen(args[2*i+1]); |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9532
diff
changeset
|
431 l += strlen(name); |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9532
diff
changeset
|
432 { |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9532
diff
changeset
|
433 char str[l+1]; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9532
diff
changeset
|
434 char* p = str; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9532
diff
changeset
|
435 p += sprintf(str,"%s",name); |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9532
diff
changeset
|
436 for(i = 0 ; args && args[2*i] ; i++) |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9532
diff
changeset
|
437 p += sprintf(p," %s=%s",args[2*i],args[2*i+1]); |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9532
diff
changeset
|
438 mp_msg(MSGT_VFILTER,MSGL_INFO,MSGTR_OpeningVideoFilter "[%s]\n",str); |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9532
diff
changeset
|
439 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9532
diff
changeset
|
440 } else if(strcmp(name,"vo")) { |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9532
diff
changeset
|
441 if(args && strcmp(args[0],"_oldargs_") == 0) |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9532
diff
changeset
|
442 mp_msg(MSGT_VFILTER,MSGL_INFO,MSGTR_OpeningVideoFilter |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9532
diff
changeset
|
443 "[%s=%s]\n", name,args[1]); |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9532
diff
changeset
|
444 else |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9532
diff
changeset
|
445 mp_msg(MSGT_VFILTER,MSGL_INFO,MSGTR_OpeningVideoFilter |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9532
diff
changeset
|
446 "[%s]\n", name); |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9532
diff
changeset
|
447 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9532
diff
changeset
|
448 return vf_open_plugin(filter_list,next,name,args); |
5550 | 449 } |
450 | |
5507
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
451 //============================================================================ |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
452 |
5565
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5557
diff
changeset
|
453 unsigned int vf_match_csp(vf_instance_t** vfp,unsigned int* list,unsigned int preferred){ |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5557
diff
changeset
|
454 vf_instance_t* vf=*vfp; |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5557
diff
changeset
|
455 unsigned int* p; |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5557
diff
changeset
|
456 unsigned int best=0; |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5557
diff
changeset
|
457 int ret; |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5557
diff
changeset
|
458 if((p=list)) while(*p){ |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5557
diff
changeset
|
459 ret=vf->query_format(vf,*p); |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5557
diff
changeset
|
460 mp_msg(MSGT_VFILTER,MSGL_V,"[%s] query(%s) -> %d\n",vf->info->name,vo_format_name(*p),ret&3); |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5557
diff
changeset
|
461 if(ret&2){ best=*p; break;} // no conversion -> bingo! |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5557
diff
changeset
|
462 if(ret&1 && !best) best=*p; // best with conversion |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5557
diff
changeset
|
463 ++p; |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5557
diff
changeset
|
464 } |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5557
diff
changeset
|
465 if(best) return best; // bingo, they have common csp! |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5557
diff
changeset
|
466 // ok, then try with scale: |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5557
diff
changeset
|
467 if(vf->info == &vf_info_scale) return 0; // avoid infinite recursion! |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5557
diff
changeset
|
468 vf=vf_open_filter(vf,"scale",NULL); |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5557
diff
changeset
|
469 if(!vf) return 0; // failed to init "scale" |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5557
diff
changeset
|
470 // try the preferred csp first: |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5557
diff
changeset
|
471 if(preferred && vf->query_format(vf,preferred)) best=preferred; else |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5557
diff
changeset
|
472 // try the list again, now with "scaler" : |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5557
diff
changeset
|
473 if((p=list)) while(*p){ |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5557
diff
changeset
|
474 ret=vf->query_format(vf,*p); |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5557
diff
changeset
|
475 mp_msg(MSGT_VFILTER,MSGL_V,"[%s] query(%s) -> %d\n",vf->info->name,vo_format_name(*p),ret&3); |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5557
diff
changeset
|
476 if(ret&2){ best=*p; break;} // no conversion -> bingo! |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5557
diff
changeset
|
477 if(ret&1 && !best) best=*p; // best with conversion |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5557
diff
changeset
|
478 ++p; |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5557
diff
changeset
|
479 } |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5557
diff
changeset
|
480 if(best) *vfp=vf; // else uninit vf !FIXME! |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5557
diff
changeset
|
481 return best; |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5557
diff
changeset
|
482 } |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5557
diff
changeset
|
483 |
9934 | 484 void vf_clone_mpi_attributes(mp_image_t* dst, mp_image_t* src){ |
485 dst->pict_type= src->pict_type; | |
10663 | 486 dst->fields = src->fields; |
9934 | 487 dst->qscale_type= src->qscale_type; |
488 if(dst->width == src->width && dst->height == src->height){ | |
489 dst->qstride= src->qstride; | |
490 dst->qscale= src->qscale; | |
491 } | |
492 } | |
493 | |
5507
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
494 int vf_next_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
|
495 int width, int height, int d_width, int d_height, |
5565
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5557
diff
changeset
|
496 unsigned int voflags, unsigned int outfmt){ |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5557
diff
changeset
|
497 int miss; |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5557
diff
changeset
|
498 int flags=vf->next->query_format(vf->next,outfmt); |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5557
diff
changeset
|
499 if(!flags){ |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5557
diff
changeset
|
500 // hmm. colorspace mismatch!!! |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5557
diff
changeset
|
501 // let's insert the 'scale' filter, it does the job for us: |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5557
diff
changeset
|
502 vf_instance_t* vf2; |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5557
diff
changeset
|
503 if(vf->next->info==&vf_info_scale) return 0; // scale->scale |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5557
diff
changeset
|
504 vf2=vf_open_filter(vf->next,"scale",NULL); |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5557
diff
changeset
|
505 if(!vf2) return 0; // shouldn't happen! |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5557
diff
changeset
|
506 vf->next=vf2; |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5557
diff
changeset
|
507 flags=vf->next->query_format(vf->next,outfmt); |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5557
diff
changeset
|
508 if(!flags){ |
6993 | 509 mp_msg(MSGT_VFILTER,MSGL_ERR,MSGTR_CannotFindColorspace); |
5565
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5557
diff
changeset
|
510 return 0; // FAIL |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5557
diff
changeset
|
511 } |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5557
diff
changeset
|
512 } |
6138
523014df7d32
big cosmetics patch, cleanup of messages printed by mplayer and libs.
arpi
parents:
6081
diff
changeset
|
513 mp_msg(MSGT_VFILTER,MSGL_V,"REQ: flags=0x%X req=0x%X \n",flags,vf->default_reqs); |
5565
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5557
diff
changeset
|
514 miss=vf->default_reqs - (flags&vf->default_reqs); |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5557
diff
changeset
|
515 if(miss&VFCAP_ACCEPT_STRIDE){ |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5557
diff
changeset
|
516 // vf requires stride support but vf->next doesn't support it! |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5557
diff
changeset
|
517 // let's insert the 'expand' filter, it does the job for us: |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5557
diff
changeset
|
518 vf_instance_t* vf2=vf_open_filter(vf->next,"expand",NULL); |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5557
diff
changeset
|
519 if(!vf2) return 0; // shouldn't happen! |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5557
diff
changeset
|
520 vf->next=vf2; |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5557
diff
changeset
|
521 } |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5557
diff
changeset
|
522 return vf->next->config(vf->next,width,height,d_width,d_height,voflags,outfmt); |
5507
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
523 } |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
524 |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
525 int vf_next_control(struct vf_instance_s* vf, int request, void* data){ |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
526 return vf->next->control(vf->next,request,data); |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
527 } |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
528 |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
529 int vf_next_query_format(struct vf_instance_s* vf, unsigned int fmt){ |
5565
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5557
diff
changeset
|
530 int flags=vf->next->query_format(vf->next,fmt); |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5557
diff
changeset
|
531 if(flags) flags|=vf->default_caps; |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5557
diff
changeset
|
532 return flags; |
5507
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
533 } |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
534 |
7368 | 535 int vf_next_put_image(struct vf_instance_s* vf,mp_image_t *mpi){ |
536 return vf->next->put_image(vf->next,mpi); | |
5507
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
537 } |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
538 |
8367 | 539 void vf_next_draw_slice(struct vf_instance_s* vf,unsigned char** src, int * stride,int w, int h, int x, int y){ |
10140
30cad6ad9dbc
fix segfaults with slices. support slice rendering into a filter even
rfelker
parents:
10006
diff
changeset
|
540 if (vf->next->draw_slice) { |
30cad6ad9dbc
fix segfaults with slices. support slice rendering into a filter even
rfelker
parents:
10006
diff
changeset
|
541 vf->next->draw_slice(vf->next,src,stride,w,h,x,y); |
30cad6ad9dbc
fix segfaults with slices. support slice rendering into a filter even
rfelker
parents:
10006
diff
changeset
|
542 return; |
30cad6ad9dbc
fix segfaults with slices. support slice rendering into a filter even
rfelker
parents:
10006
diff
changeset
|
543 } |
30cad6ad9dbc
fix segfaults with slices. support slice rendering into a filter even
rfelker
parents:
10006
diff
changeset
|
544 if (!vf->dmpi) { |
30cad6ad9dbc
fix segfaults with slices. support slice rendering into a filter even
rfelker
parents:
10006
diff
changeset
|
545 mp_msg(MSGT_VFILTER,MSGL_ERR,"draw_slice: dmpi not stored by vf_%s\n", vf->info->name); |
30cad6ad9dbc
fix segfaults with slices. support slice rendering into a filter even
rfelker
parents:
10006
diff
changeset
|
546 return; |
30cad6ad9dbc
fix segfaults with slices. support slice rendering into a filter even
rfelker
parents:
10006
diff
changeset
|
547 } |
30cad6ad9dbc
fix segfaults with slices. support slice rendering into a filter even
rfelker
parents:
10006
diff
changeset
|
548 if (!(vf->dmpi->flags & MP_IMGFLAG_PLANAR)) { |
30cad6ad9dbc
fix segfaults with slices. support slice rendering into a filter even
rfelker
parents:
10006
diff
changeset
|
549 memcpy_pic(vf->dmpi->planes[0]+y*vf->dmpi->stride[0]+vf->dmpi->bpp/8*x, |
10239 | 550 src[0], vf->dmpi->bpp/8*w, h, vf->dmpi->stride[0], stride[0]); |
10140
30cad6ad9dbc
fix segfaults with slices. support slice rendering into a filter even
rfelker
parents:
10006
diff
changeset
|
551 return; |
30cad6ad9dbc
fix segfaults with slices. support slice rendering into a filter even
rfelker
parents:
10006
diff
changeset
|
552 } |
30cad6ad9dbc
fix segfaults with slices. support slice rendering into a filter even
rfelker
parents:
10006
diff
changeset
|
553 memcpy_pic(vf->dmpi->planes[0]+y*vf->dmpi->stride[0]+x, src[0], |
30cad6ad9dbc
fix segfaults with slices. support slice rendering into a filter even
rfelker
parents:
10006
diff
changeset
|
554 w, h, vf->dmpi->stride[0], stride[0]); |
30cad6ad9dbc
fix segfaults with slices. support slice rendering into a filter even
rfelker
parents:
10006
diff
changeset
|
555 memcpy_pic(vf->dmpi->planes[1]+(y>>vf->dmpi->chroma_y_shift)*vf->dmpi->stride[1]+(x>>vf->dmpi->chroma_x_shift), |
30cad6ad9dbc
fix segfaults with slices. support slice rendering into a filter even
rfelker
parents:
10006
diff
changeset
|
556 src[1], w>>vf->dmpi->chroma_x_shift, h>>vf->dmpi->chroma_y_shift, vf->dmpi->stride[1], stride[1]); |
30cad6ad9dbc
fix segfaults with slices. support slice rendering into a filter even
rfelker
parents:
10006
diff
changeset
|
557 memcpy_pic(vf->dmpi->planes[2]+(y>>vf->dmpi->chroma_y_shift)*vf->dmpi->stride[2]+(x>>vf->dmpi->chroma_x_shift), |
30cad6ad9dbc
fix segfaults with slices. support slice rendering into a filter even
rfelker
parents:
10006
diff
changeset
|
558 src[2], w>>vf->dmpi->chroma_x_shift, h>>vf->dmpi->chroma_y_shift, vf->dmpi->stride[2], stride[2]); |
8367 | 559 } |
560 | |
5507
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
561 //============================================================================ |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
562 |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
563 vf_instance_t* append_filters(vf_instance_t* last){ |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9532
diff
changeset
|
564 vf_instance_t* vf; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9532
diff
changeset
|
565 int i; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9532
diff
changeset
|
566 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9532
diff
changeset
|
567 // -vf take precedence over -vop |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9532
diff
changeset
|
568 if(vf_settings) { |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9532
diff
changeset
|
569 // We want to add them in the 'right order' |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9532
diff
changeset
|
570 for(i = 0 ; vf_settings[i].name ; i++) |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9532
diff
changeset
|
571 /* NOP */; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9532
diff
changeset
|
572 for(i-- ; i >= 0 ; i--) { |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9532
diff
changeset
|
573 //printf("Open filter %s\n",vf_settings[i].name); |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9532
diff
changeset
|
574 vf = vf_open_filter(last,vf_settings[i].name,vf_settings[i].attribs); |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9532
diff
changeset
|
575 if(vf) last=vf; |
5507
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
576 } |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9532
diff
changeset
|
577 } else if(vo_plugin_args) { |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9532
diff
changeset
|
578 for(i = 0 ; vo_plugin_args[i].name ; i++) { |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9532
diff
changeset
|
579 vf = vf_open_filter(last,vo_plugin_args[i].name, |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9532
diff
changeset
|
580 vo_plugin_args[i].attribs); |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9532
diff
changeset
|
581 if(vf) last=vf; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9532
diff
changeset
|
582 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9532
diff
changeset
|
583 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9532
diff
changeset
|
584 return last; |
5507
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
585 } |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
586 |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
587 //============================================================================ |
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
diff
changeset
|
588 |
5737 | 589 void vf_uninit_filter(vf_instance_t* vf){ |
590 if(vf->uninit) vf->uninit(vf); | |
591 free_mp_image(vf->imgctx.static_images[0]); | |
592 free_mp_image(vf->imgctx.static_images[1]); | |
593 free_mp_image(vf->imgctx.temp_images[0]); | |
594 free_mp_image(vf->imgctx.export_images[0]); | |
595 free(vf); | |
596 } | |
597 | |
598 void vf_uninit_filter_chain(vf_instance_t* vf){ | |
599 while(vf){ | |
600 vf_instance_t* next=vf->next; | |
601 vf_uninit_filter(vf); | |
602 vf=next; | |
603 } | |
604 } | |
6081
47d6a4b0f971
-vop help, patch by Julian J. M. <bandit@telecable.es>
arpi
parents:
6061
diff
changeset
|
605 |
47d6a4b0f971
-vop help, patch by Julian J. M. <bandit@telecable.es>
arpi
parents:
6061
diff
changeset
|
606 void vf_list_plugins(){ |
47d6a4b0f971
-vop help, patch by Julian J. M. <bandit@telecable.es>
arpi
parents:
6061
diff
changeset
|
607 int i=0; |
47d6a4b0f971
-vop help, patch by Julian J. M. <bandit@telecable.es>
arpi
parents:
6061
diff
changeset
|
608 while(filter_list[i]){ |
47d6a4b0f971
-vop help, patch by Julian J. M. <bandit@telecable.es>
arpi
parents:
6061
diff
changeset
|
609 mp_msg(MSGT_VFILTER,MSGL_INFO,"\t%-10s: %s\n",filter_list[i]->name,filter_list[i]->info); |
47d6a4b0f971
-vop help, patch by Julian J. M. <bandit@telecable.es>
arpi
parents:
6061
diff
changeset
|
610 i++; |
47d6a4b0f971
-vop help, patch by Julian J. M. <bandit@telecable.es>
arpi
parents:
6061
diff
changeset
|
611 } |
47d6a4b0f971
-vop help, patch by Julian J. M. <bandit@telecable.es>
arpi
parents:
6061
diff
changeset
|
612 } |