Mercurial > mplayer.hg
annotate libmpcodecs/vf_ass.c @ 35033:387485e3956a
vf_ass: Improve format query.
The output format should always match the input format
for this filter, and we should set the EOSD capability.
This also simplifies adding support for more formats.
Patch by Xidorn Quan [quanxunzhen gmail com].
author | reimar |
---|---|
date | Wed, 29 Aug 2012 16:06:26 +0000 |
parents | e8af23854aa1 |
children | 848835e1b053 |
rev | line source |
---|---|
20008
fa122b7c71c6
Add copyright notice and vim/emacs comments to libass and vf_ass.c.
eugeni
parents:
19563
diff
changeset
|
1 /* |
26727 | 2 * Copyright (C) 2006 Evgeniy Stepanov <eugeni.stepanov@gmail.com> |
3 * | |
4 * This file is part of MPlayer. | |
5 * | |
6 * MPlayer is free software; you can redistribute it and/or modify | |
7 * it under the terms of the GNU General Public License as published by | |
8 * the Free Software Foundation; either version 2 of the License, or | |
9 * (at your option) any later version. | |
10 * | |
11 * MPlayer is distributed in the hope that it will be useful, | |
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
14 * GNU General Public License for more details. | |
15 * | |
16 * You should have received a copy of the GNU General Public License along | |
17 * with MPlayer; if not, write to the Free Software Foundation, Inc., | |
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | |
19 */ | |
20008
fa122b7c71c6
Add copyright notice and vim/emacs comments to libass and vf_ass.c.
eugeni
parents:
19563
diff
changeset
|
20 |
18937 | 21 #include "config.h" |
22 | |
23 #include <stdio.h> | |
24 #include <stdlib.h> | |
25 #include <string.h> | |
24545
9e5126679d44
Replace stdint.h #include by functionally equivalent inttypes.h.
diego
parents:
23134
diff
changeset
|
26 #include <inttypes.h> |
18937 | 27 #include <assert.h> |
28 | |
29 #include "config.h" | |
30 #include "mp_msg.h" | |
31 #include "help_mp.h" | |
31489 | 32 #include "mpcommon.h" |
18937 | 33 #include "img_format.h" |
34 #include "mp_image.h" | |
30653
3d23e24c5c60
Declare externally used variables from vd.c as extern in vd.h.
diego
parents:
30642
diff
changeset
|
35 #include "vd.h" |
18937 | 36 #include "vf.h" |
37 | |
38 #include "libvo/fastmemcpy.h" | |
32467 | 39 #include "sub/sub.h" |
18937 | 40 #include "m_option.h" |
41 #include "m_struct.h" | |
42 | |
32461 | 43 #include "sub/ass_mp.h" |
32460 | 44 #include "sub/eosd.h" |
18937 | 45 |
46 #define _r(c) ((c)>>24) | |
47 #define _g(c) (((c)>>16)&0xFF) | |
48 #define _b(c) (((c)>>8)&0xFF) | |
49 #define _a(c) ((c)&0xFF) | |
32096 | 50 #define rgba2y(c) ( (( 263*_r(c) + 516*_g(c) + 100*_b(c)) >> 10) + 16 ) |
18937 | 51 #define rgba2u(c) ( ((-152*_r(c) - 298*_g(c) + 450*_b(c)) >> 10) + 128 ) |
52 #define rgba2v(c) ( (( 450*_r(c) - 376*_g(c) - 73*_b(c)) >> 10) + 128 ) | |
53 | |
54 | |
24969
c2b7ba444ade
begin moving const filter data to .text/.rodata sections
rfelker
parents:
24545
diff
changeset
|
55 static const struct vf_priv_s { |
32096 | 56 int outh, outw; |
18937 | 57 |
32096 | 58 unsigned int outfmt; |
18937 | 59 |
32096 | 60 // 1 = auto-added filter: insert only if chain does not support EOSD already |
61 // 0 = insert always | |
62 int auto_insert; | |
18937 | 63 |
32096 | 64 unsigned char *planes[3]; |
65 unsigned char *dirty_rows; | |
24969
c2b7ba444ade
begin moving const filter data to .text/.rodata sections
rfelker
parents:
24545
diff
changeset
|
66 } vf_priv_dflt; |
18937 | 67 |
68 | |
30642
a972c1a4a012
cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents:
30638
diff
changeset
|
69 static int config(struct vf_instance *vf, |
32096 | 70 int width, int height, int d_width, int d_height, |
71 unsigned int flags, unsigned int outfmt) | |
18937 | 72 { |
32391
b4c3659d16b1
Use a dynamic list for the sources of EOSD elements.
cigaes
parents:
32261
diff
changeset
|
73 struct mp_eosd_settings res = {0}; |
31927 | 74 |
32096 | 75 if (outfmt == IMGFMT_IF09) |
76 return 0; | |
18937 | 77 |
35033 | 78 vf->priv->outfmt = outfmt; |
32096 | 79 vf->priv->outh = height + ass_top_margin + ass_bottom_margin; |
80 vf->priv->outw = width; | |
18937 | 81 |
32096 | 82 if (!opt_screen_size_x && !opt_screen_size_y) { |
83 d_width = d_width * vf->priv->outw / width; | |
84 d_height = d_height * vf->priv->outh / height; | |
85 } | |
18937 | 86 |
32096 | 87 vf->priv->planes[1] = malloc(vf->priv->outw * vf->priv->outh); |
88 vf->priv->planes[2] = malloc(vf->priv->outw * vf->priv->outh); | |
89 vf->priv->dirty_rows = malloc(vf->priv->outh); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26727
diff
changeset
|
90 |
32096 | 91 res.w = vf->priv->outw; |
92 res.h = vf->priv->outh; | |
93 res.srcw = width; | |
94 res.srch = height; | |
95 res.mt = ass_top_margin; | |
96 res.mb = ass_bottom_margin; | |
32391
b4c3659d16b1
Use a dynamic list for the sources of EOSD elements.
cigaes
parents:
32261
diff
changeset
|
97 eosd_configure(&res); |
18937 | 98 |
32096 | 99 return vf_next_config(vf, vf->priv->outw, vf->priv->outh, d_width, |
100 d_height, flags, outfmt); | |
18937 | 101 } |
102 | |
30642
a972c1a4a012
cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents:
30638
diff
changeset
|
103 static void get_image(struct vf_instance *vf, mp_image_t *mpi) |
18937 | 104 { |
32096 | 105 if (mpi->type == MP_IMGTYPE_IPB) |
106 return; | |
107 if (mpi->flags & MP_IMGFLAG_PRESERVE) | |
108 return; | |
109 if (mpi->imgfmt != vf->priv->outfmt) | |
110 return; // colorspace differ | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26727
diff
changeset
|
111 |
32096 | 112 // width never changes, always try full DR |
113 mpi->priv = vf->dmpi = vf_get_image(vf->next, mpi->imgfmt, mpi->type, | |
114 mpi->flags | MP_IMGFLAG_READABLE, | |
34882
649d4cad4619
Request a sufficiently large image for direct rendering.
reimar
parents:
34863
diff
changeset
|
115 FFMAX(mpi->width, vf->priv->outw), |
649d4cad4619
Request a sufficiently large image for direct rendering.
reimar
parents:
34863
diff
changeset
|
116 FFMAX(mpi->height, vf->priv->outh)); |
18937 | 117 |
32096 | 118 if ( (vf->dmpi->flags & MP_IMGFLAG_DRAW_CALLBACK) && |
119 !(vf->dmpi->flags & MP_IMGFLAG_DIRECT)) { | |
120 mp_msg(MSGT_ASS, MSGL_INFO, MSGTR_MPCODECS_FullDRNotPossible); | |
121 return; | |
122 } | |
123 // set up mpi as a cropped-down image of dmpi: | |
124 if (mpi->flags & MP_IMGFLAG_PLANAR) { | |
125 mpi->planes[0] = vf->dmpi->planes[0] + ass_top_margin * vf->dmpi->stride[0]; | |
126 mpi->planes[1] = vf->dmpi->planes[1] + (ass_top_margin >> mpi->chroma_y_shift) * vf->dmpi->stride[1]; | |
127 mpi->planes[2] = vf->dmpi->planes[2] + (ass_top_margin >> mpi->chroma_y_shift) * vf->dmpi->stride[2]; | |
128 mpi->stride[1] = vf->dmpi->stride[1]; | |
129 mpi->stride[2] = vf->dmpi->stride[2]; | |
130 } else { | |
131 mpi->planes[0] = vf->dmpi->planes[0] + ass_top_margin * vf->dmpi->stride[0]; | |
132 } | |
133 mpi->stride[0] = vf->dmpi->stride[0]; | |
134 mpi->width = vf->dmpi->width; | |
135 mpi->flags |= MP_IMGFLAG_DIRECT; | |
136 mpi->flags &= ~MP_IMGFLAG_DRAW_CALLBACK; | |
137 // vf->dmpi->flags &= ~MP_IMGFLAG_DRAW_CALLBACK; | |
18937 | 138 } |
139 | |
140 static void blank(mp_image_t *mpi, int y1, int y2) | |
141 { | |
32096 | 142 int color[3] = { 16, 128, 128 }; // black (YUV) |
143 int y; | |
144 unsigned char *dst; | |
145 int chroma_rows = (y2 - y1) >> mpi->chroma_y_shift; | |
18937 | 146 |
32096 | 147 dst = mpi->planes[0] + y1 * mpi->stride[0]; |
148 for (y = 0; y < y2 - y1; ++y) { | |
149 memset(dst, color[0], mpi->w); | |
150 dst += mpi->stride[0]; | |
151 } | |
152 dst = mpi->planes[1] + (y1 >> mpi->chroma_y_shift) * mpi->stride[1]; | |
153 for (y = 0; y < chroma_rows; ++y) { | |
154 memset(dst, color[1], mpi->chroma_width); | |
155 dst += mpi->stride[1]; | |
156 } | |
157 dst = mpi->planes[2] + (y1 >> mpi->chroma_y_shift) * mpi->stride[2]; | |
158 for (y = 0; y < chroma_rows; ++y) { | |
159 memset(dst, color[2], mpi->chroma_width); | |
160 dst += mpi->stride[2]; | |
161 } | |
18937 | 162 } |
163 | |
30642
a972c1a4a012
cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents:
30638
diff
changeset
|
164 static int prepare_image(struct vf_instance *vf, mp_image_t *mpi) |
18937 | 165 { |
32096 | 166 if (mpi->flags & MP_IMGFLAG_DIRECT || |
167 mpi->flags & MP_IMGFLAG_DRAW_CALLBACK) { | |
168 vf->dmpi = mpi->priv; | |
169 if (!vf->dmpi) { | |
170 mp_msg(MSGT_ASS, MSGL_WARN, MSGTR_MPCODECS_FunWhydowegetNULL); | |
171 return 0; | |
172 } | |
173 mpi->priv = NULL; | |
174 // we've used DR, so we're ready... | |
175 if (ass_top_margin) | |
176 blank(vf->dmpi, 0, ass_top_margin); | |
177 if (ass_bottom_margin) | |
178 blank(vf->dmpi, vf->priv->outh - ass_bottom_margin, vf->priv->outh); | |
179 if (!(mpi->flags & MP_IMGFLAG_PLANAR)) | |
180 vf->dmpi->planes[1] = mpi->planes[1]; // passthrough rgb8 palette | |
181 return 0; | |
182 } | |
183 // hope we'll get DR buffer: | |
184 vf->dmpi = vf_get_image(vf->next, vf->priv->outfmt, MP_IMGTYPE_TEMP, | |
185 MP_IMGFLAG_ACCEPT_STRIDE | MP_IMGFLAG_READABLE, | |
186 vf->priv->outw, vf->priv->outh); | |
18937 | 187 |
32096 | 188 // copy mpi->dmpi... |
189 if (mpi->flags & MP_IMGFLAG_PLANAR) { | |
190 memcpy_pic(vf->dmpi->planes[0] + ass_top_margin * vf->dmpi->stride[0], | |
191 mpi->planes[0], | |
192 mpi->w, | |
193 mpi->h, | |
194 vf->dmpi->stride[0], | |
195 mpi->stride[0]); | |
196 memcpy_pic(vf->dmpi->planes[1] + (ass_top_margin >> mpi->chroma_y_shift) * vf->dmpi->stride[1], | |
197 mpi->planes[1], | |
198 mpi->w >> mpi->chroma_x_shift, | |
199 mpi->h >> mpi->chroma_y_shift, | |
200 vf->dmpi->stride[1], | |
201 mpi->stride[1]); | |
202 memcpy_pic(vf->dmpi->planes[2] + (ass_top_margin >> mpi->chroma_y_shift) * vf->dmpi->stride[2], | |
203 mpi->planes[2], | |
204 mpi->w >> mpi->chroma_x_shift, | |
205 mpi->h >> mpi->chroma_y_shift, | |
206 vf->dmpi->stride[2], | |
207 mpi->stride[2]); | |
208 } else { | |
209 memcpy_pic(vf->dmpi->planes[0] + ass_top_margin * vf->dmpi->stride[0], | |
210 mpi->planes[0], | |
211 mpi->w * (vf->dmpi->bpp / 8), | |
212 mpi->h, | |
213 vf->dmpi->stride[0], | |
214 mpi->stride[0]); | |
215 vf->dmpi->planes[1] = mpi->planes[1]; // passthrough rgb8 palette | |
216 } | |
217 if (ass_top_margin) | |
218 blank(vf->dmpi, 0, ass_top_margin); | |
219 if (ass_bottom_margin) | |
220 blank(vf->dmpi, vf->priv->outh - ass_bottom_margin, vf->priv->outh); | |
221 return 0; | |
18937 | 222 } |
223 | |
224 /** | |
225 * \brief Copy specified rows from render_context.dmpi to render_context.planes, upsampling to 4:4:4 | |
226 */ | |
32096 | 227 static void copy_from_image(struct vf_instance *vf, int first_row, |
228 int last_row) | |
18937 | 229 { |
32096 | 230 int pl; |
231 int i, j, k; | |
232 unsigned char val; | |
233 int chroma_rows; | |
18937 | 234 |
32096 | 235 first_row -= (first_row % 2); |
236 last_row += (last_row % 2); | |
237 chroma_rows = (last_row - first_row) / 2; | |
18937 | 238 |
32096 | 239 assert(first_row >= 0); |
240 assert(first_row <= last_row); | |
241 assert(last_row <= vf->priv->outh); | |
29383
e9cab9f6ed62
Make sure clip coordinates are inside the screen area.
eugeni
parents:
29263
diff
changeset
|
242 |
32096 | 243 for (pl = 1; pl < 3; ++pl) { |
244 int dst_stride = vf->priv->outw; | |
245 int src_stride = vf->dmpi->stride[pl]; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26727
diff
changeset
|
246 |
32096 | 247 unsigned char *src = vf->dmpi->planes[pl] + (first_row / 2) * src_stride; |
248 unsigned char *dst = vf->priv->planes[pl] + first_row * dst_stride; | |
249 unsigned char *dst_next = dst + dst_stride; | |
250 for (i = 0; i < chroma_rows; ++i) { | |
251 if ((vf->priv->dirty_rows[first_row + i * 2 ] == 0) || | |
252 (vf->priv->dirty_rows[first_row + i * 2 + 1] == 0)) { | |
253 for (j = 0, k = 0; j < vf->dmpi->chroma_width; ++j, k += 2) { | |
254 val = *(src + j); | |
255 *(dst + k ) = val; | |
256 *(dst + k + 1) = val; | |
257 *(dst_next + k ) = val; | |
258 *(dst_next + k + 1) = val; | |
259 } | |
260 } | |
261 src += src_stride; | |
262 dst = dst_next + dst_stride; | |
263 dst_next = dst + dst_stride; | |
264 } | |
265 } | |
266 for (i = first_row; i < last_row; ++i) | |
267 vf->priv->dirty_rows[i] = 1; | |
18937 | 268 } |
269 | |
270 /** | |
271 * \brief Copy all previously copied rows back to render_context.dmpi | |
272 */ | |
30642
a972c1a4a012
cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents:
30638
diff
changeset
|
273 static void copy_to_image(struct vf_instance *vf) |
18937 | 274 { |
32096 | 275 int pl; |
276 int i, j, k; | |
277 for (pl = 1; pl < 3; ++pl) { | |
278 int dst_stride = vf->dmpi->stride[pl]; | |
279 int src_stride = vf->priv->outw; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26727
diff
changeset
|
280 |
32096 | 281 unsigned char *dst = vf->dmpi->planes[pl]; |
282 unsigned char *src = vf->priv->planes[pl]; | |
283 unsigned char *src_next = vf->priv->planes[pl] + src_stride; | |
34885 | 284 for (i = 0; i < vf->priv->outh / 2; ++i) { |
32096 | 285 if ((vf->priv->dirty_rows[i * 2] == 1)) { |
286 assert(vf->priv->dirty_rows[i * 2 + 1] == 1); | |
287 for (j = 0, k = 0; j < vf->dmpi->chroma_width; ++j, k += 2) { | |
288 unsigned val = 0; | |
289 val += *(src + k); | |
290 val += *(src + k + 1); | |
291 val += *(src_next + k); | |
292 val += *(src_next + k + 1); | |
293 *(dst + j) = val >> 2; | |
294 } | |
295 } | |
296 dst += dst_stride; | |
297 src = src_next + src_stride; | |
298 src_next = src + src_stride; | |
299 } | |
300 } | |
18937 | 301 } |
302 | |
32096 | 303 static void my_draw_bitmap(struct vf_instance *vf, unsigned char *bitmap, |
304 int bitmap_w, int bitmap_h, int stride, | |
305 int dst_x, int dst_y, unsigned color) | |
18937 | 306 { |
32096 | 307 unsigned char y = rgba2y(color); |
308 unsigned char u = rgba2u(color); | |
309 unsigned char v = rgba2v(color); | |
32261 | 310 unsigned opacity = 255 - _a(color); |
32096 | 311 unsigned char *src, *dsty, *dstu, *dstv; |
312 int i, j; | |
313 mp_image_t *dmpi = vf->dmpi; | |
18937 | 314 |
32261 | 315 opacity = (0x10203 * opacity + 0x80) >> 8; /* 0x10203 = (1<<32)/(255*255) */ |
316 /* 0 <= opacity <= 0x10101 */ | |
32096 | 317 src = bitmap; |
318 dsty = dmpi->planes[0] + dst_x + dst_y * dmpi->stride[0]; | |
319 dstu = vf->priv->planes[1] + dst_x + dst_y * vf->priv->outw; | |
320 dstv = vf->priv->planes[2] + dst_x + dst_y * vf->priv->outw; | |
321 for (i = 0; i < bitmap_h; ++i) { | |
322 for (j = 0; j < bitmap_w; ++j) { | |
32226
808e9d7eef5d
vf_ass: skip alpha blending for pixels where alpha is zero.
cigaes
parents:
32209
diff
changeset
|
323 unsigned k = src[j]; |
808e9d7eef5d
vf_ass: skip alpha blending for pixels where alpha is zero.
cigaes
parents:
32209
diff
changeset
|
324 if (!k) |
808e9d7eef5d
vf_ass: skip alpha blending for pixels where alpha is zero.
cigaes
parents:
32209
diff
changeset
|
325 continue; |
32261 | 326 k *= opacity; /* 0 <= k <= 0xFFFFFF */ |
327 dsty[j] = (k * y + (0xFFFFFF - k) * dsty[j] + 0x800000) >> 24; | |
328 dstu[j] = (k * u + (0xFFFFFF - k) * dstu[j] + 0x800000) >> 24; | |
329 dstv[j] = (k * v + (0xFFFFFF - k) * dstv[j] + 0x800000) >> 24; | |
32096 | 330 } |
331 src += stride; | |
332 dsty += dmpi->stride[0]; | |
333 dstu += vf->priv->outw; | |
334 dstv += vf->priv->outw; | |
335 } | |
18937 | 336 } |
337 | |
32391
b4c3659d16b1
Use a dynamic list for the sources of EOSD elements.
cigaes
parents:
32261
diff
changeset
|
338 static void render_frame(struct vf_instance *vf, mp_image_t *mpi, |
b4c3659d16b1
Use a dynamic list for the sources of EOSD elements.
cigaes
parents:
32261
diff
changeset
|
339 struct mp_eosd_image_list *images) |
18937 | 340 { |
32391
b4c3659d16b1
Use a dynamic list for the sources of EOSD elements.
cigaes
parents:
32261
diff
changeset
|
341 struct mp_eosd_image *img; |
b4c3659d16b1
Use a dynamic list for the sources of EOSD elements.
cigaes
parents:
32261
diff
changeset
|
342 img = eosd_image_first(images); |
b4c3659d16b1
Use a dynamic list for the sources of EOSD elements.
cigaes
parents:
32261
diff
changeset
|
343 if (!img) |
b4c3659d16b1
Use a dynamic list for the sources of EOSD elements.
cigaes
parents:
32261
diff
changeset
|
344 return; |
32096 | 345 memset(vf->priv->dirty_rows, 0, vf->priv->outh); // reset dirty rows |
346 while (img) { | |
347 copy_from_image(vf, img->dst_y, img->dst_y + img->h); | |
348 my_draw_bitmap(vf, img->bitmap, img->w, img->h, img->stride, | |
349 img->dst_x, img->dst_y, img->color); | |
32391
b4c3659d16b1
Use a dynamic list for the sources of EOSD elements.
cigaes
parents:
32261
diff
changeset
|
350 img = eosd_image_next(images); |
32096 | 351 } |
352 copy_to_image(vf); | |
18937 | 353 } |
354 | |
30642
a972c1a4a012
cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents:
30638
diff
changeset
|
355 static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts) |
18937 | 356 { |
32391
b4c3659d16b1
Use a dynamic list for the sources of EOSD elements.
cigaes
parents:
32261
diff
changeset
|
357 struct mp_eosd_image_list images; |
b4c3659d16b1
Use a dynamic list for the sources of EOSD elements.
cigaes
parents:
32261
diff
changeset
|
358 eosd_render_frame(pts, &images); |
32096 | 359 prepare_image(vf, mpi); |
32391
b4c3659d16b1
Use a dynamic list for the sources of EOSD elements.
cigaes
parents:
32261
diff
changeset
|
360 render_frame(vf, mpi, &images); |
32096 | 361 return vf_next_put_image(vf, vf->dmpi, pts); |
18937 | 362 } |
363 | |
30642
a972c1a4a012
cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents:
30638
diff
changeset
|
364 static int query_format(struct vf_instance *vf, unsigned int fmt) |
18937 | 365 { |
32096 | 366 switch (fmt) { |
367 case IMGFMT_YV12: | |
368 case IMGFMT_I420: | |
369 case IMGFMT_IYUV: | |
35033 | 370 return vf_next_query_format(vf, fmt) | VFCAP_EOSD; |
32096 | 371 } |
372 return 0; | |
18937 | 373 } |
374 | |
375 static int control(vf_instance_t *vf, int request, void *data) | |
376 { | |
32096 | 377 switch (request) { |
378 case VFCTRL_INIT_EOSD: | |
379 return CONTROL_TRUE; | |
380 case VFCTRL_DRAW_EOSD: | |
381 return CONTROL_TRUE; | |
382 } | |
383 return vf_next_control(vf, request, data); | |
18937 | 384 } |
385 | |
30642
a972c1a4a012
cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents:
30638
diff
changeset
|
386 static void uninit(struct vf_instance *vf) |
18937 | 387 { |
32537
8fa2f43cb760
Remove most of the NULL pointer check before free all over the code
cboesch
parents:
32467
diff
changeset
|
388 free(vf->priv->planes[1]); |
8fa2f43cb760
Remove most of the NULL pointer check before free all over the code
cboesch
parents:
32467
diff
changeset
|
389 free(vf->priv->planes[2]); |
8fa2f43cb760
Remove most of the NULL pointer check before free all over the code
cboesch
parents:
32467
diff
changeset
|
390 free(vf->priv->dirty_rows); |
18937 | 391 } |
392 | |
32096 | 393 static const unsigned int fmt_list[] = { |
394 IMGFMT_YV12, | |
395 IMGFMT_I420, | |
396 IMGFMT_IYUV, | |
397 0 | |
18937 | 398 }; |
399 | |
30638
a7b908875c14
Rename open() vf initialization function to vf_open().
diego
parents:
30633
diff
changeset
|
400 static int vf_open(vf_instance_t *vf, char *args) |
18937 | 401 { |
32096 | 402 int flags; |
35033 | 403 unsigned outfmt = vf_match_csp(&vf->next, fmt_list, IMGFMT_YV12); |
404 if (outfmt) | |
405 flags = vf_next_query_format(vf, outfmt); | |
406 if (!outfmt || (vf->priv->auto_insert && flags & VFCAP_EOSD)) { | |
32096 | 407 uninit(vf); |
408 return 0; | |
409 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26727
diff
changeset
|
410 |
32096 | 411 if (vf->priv->auto_insert) |
412 mp_msg(MSGT_ASS, MSGL_INFO, "[ass] auto-open\n"); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26727
diff
changeset
|
413 |
32096 | 414 vf->config = config; |
415 vf->query_format = query_format; | |
416 vf->uninit = uninit; | |
417 vf->control = control; | |
418 vf->get_image = get_image; | |
419 vf->put_image = put_image; | |
420 vf->default_caps = VFCAP_EOSD; | |
421 return 1; | |
18937 | 422 } |
423 | |
424 #define ST_OFF(f) M_ST_OFF(struct vf_priv_s,f) | |
24969
c2b7ba444ade
begin moving const filter data to .text/.rodata sections
rfelker
parents:
24545
diff
changeset
|
425 static const m_option_t vf_opts_fields[] = { |
32096 | 426 {"auto", ST_OFF(auto_insert), CONF_TYPE_FLAG, 0, 0, 1, NULL}, |
427 {NULL, NULL, 0, 0, 0, 0, NULL} | |
18937 | 428 }; |
429 | |
24969
c2b7ba444ade
begin moving const filter data to .text/.rodata sections
rfelker
parents:
24545
diff
changeset
|
430 static const m_struct_t vf_opts = { |
32096 | 431 "ass", |
432 sizeof(struct vf_priv_s), | |
433 &vf_priv_dflt, | |
434 vf_opts_fields | |
18937 | 435 }; |
436 | |
24969
c2b7ba444ade
begin moving const filter data to .text/.rodata sections
rfelker
parents:
24545
diff
changeset
|
437 const vf_info_t vf_info_ass = { |
32096 | 438 "Render ASS/SSA subtitles", |
439 "ass", | |
440 "Evgeniy Stepanov", | |
441 "", | |
442 vf_open, | |
443 &vf_opts | |
18937 | 444 }; |