Mercurial > mplayer.hg
annotate libmpcodecs/vf_ass.c @ 31824:e26b1c667fd8
Add const to avoid warnings.
The const on the return type is not correct compared to the real win32 API
functions, but that really does not matter for us, avoiding the warning is
more useful.
author | reimar |
---|---|
date | Mon, 02 Aug 2010 17:32:42 +0000 |
parents | 55dacfca4a43 |
children | 6e0b5a97e00f |
rev | line source |
---|---|
20008
fa122b7c71c6
Add copyright notice and vim/emacs comments to libass and vf_ass.c.
eugeni
parents:
19563
diff
changeset
|
1 // -*- c-basic-offset: 8; indent-tabs-mode: t -*- |
fa122b7c71c6
Add copyright notice and vim/emacs comments to libass and vf_ass.c.
eugeni
parents:
19563
diff
changeset
|
2 // vim:ts=8:sw=8:noet:ai: |
fa122b7c71c6
Add copyright notice and vim/emacs comments to libass and vf_ass.c.
eugeni
parents:
19563
diff
changeset
|
3 /* |
26727 | 4 * Copyright (C) 2006 Evgeniy Stepanov <eugeni.stepanov@gmail.com> |
5 * | |
6 * This file is part of MPlayer. | |
7 * | |
8 * MPlayer is free software; you can redistribute it and/or modify | |
9 * it under the terms of the GNU General Public License as published by | |
10 * the Free Software Foundation; either version 2 of the License, or | |
11 * (at your option) any later version. | |
12 * | |
13 * MPlayer is distributed in the hope that it will be useful, | |
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
16 * GNU General Public License for more details. | |
17 * | |
18 * You should have received a copy of the GNU General Public License along | |
19 * with MPlayer; if not, write to the Free Software Foundation, Inc., | |
20 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | |
21 */ | |
20008
fa122b7c71c6
Add copyright notice and vim/emacs comments to libass and vf_ass.c.
eugeni
parents:
19563
diff
changeset
|
22 |
18937 | 23 #include "config.h" |
24 | |
25 #include <stdio.h> | |
26 #include <stdlib.h> | |
27 #include <string.h> | |
24545
9e5126679d44
Replace stdint.h #include by functionally equivalent inttypes.h.
diego
parents:
23134
diff
changeset
|
28 #include <inttypes.h> |
18937 | 29 #include <assert.h> |
30 | |
31 #include "config.h" | |
32 #include "mp_msg.h" | |
33 #include "help_mp.h" | |
31489 | 34 #include "mpcommon.h" |
18937 | 35 #include "img_format.h" |
36 #include "mp_image.h" | |
30653
3d23e24c5c60
Declare externally used variables from vd.c as extern in vd.h.
diego
parents:
30642
diff
changeset
|
37 #include "vd.h" |
18937 | 38 #include "vf.h" |
39 | |
40 #include "libvo/fastmemcpy.h" | |
31488
4b738166e825
Add libvo/sub.h #include instead of declaring sub_visibility extern.
diego
parents:
31238
diff
changeset
|
41 #include "libvo/sub.h" |
18937 | 42 #include "m_option.h" |
43 #include "m_struct.h" | |
44 | |
45 #include "libass/ass_mp.h" | |
46 | |
47 #define _r(c) ((c)>>24) | |
48 #define _g(c) (((c)>>16)&0xFF) | |
49 #define _b(c) (((c)>>8)&0xFF) | |
50 #define _a(c) ((c)&0xFF) | |
51 #define rgba2y(c) ( (( 263*_r(c) + 516*_g(c) + 100*_b(c)) >> 10) + 16 ) | |
52 #define rgba2u(c) ( ((-152*_r(c) - 298*_g(c) + 450*_b(c)) >> 10) + 128 ) | |
53 #define rgba2v(c) ( (( 450*_r(c) - 376*_g(c) - 73*_b(c)) >> 10) + 128 ) | |
54 | |
55 | |
24969
c2b7ba444ade
begin moving const filter data to .text/.rodata sections
rfelker
parents:
24545
diff
changeset
|
56 static const struct vf_priv_s { |
18937 | 57 int outh, outw; |
58 | |
59 unsigned int outfmt; | |
60 | |
61 // 1 = auto-added filter: insert only if chain does not support EOSD already | |
62 // 0 = insert always | |
63 int auto_insert; | |
64 | |
31792
55dacfca4a43
Rename libass types to match upstream libass >= 0.9.7
greg
parents:
31688
diff
changeset
|
65 ASS_Renderer* ass_priv; |
18937 | 66 |
67 unsigned char* planes[3]; | |
68 unsigned char* dirty_rows; | |
24969
c2b7ba444ade
begin moving const filter data to .text/.rodata sections
rfelker
parents:
24545
diff
changeset
|
69 } vf_priv_dflt; |
18937 | 70 |
71 | |
30642
a972c1a4a012
cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents:
30638
diff
changeset
|
72 static int config(struct vf_instance *vf, |
18937 | 73 int width, int height, int d_width, int d_height, |
74 unsigned int flags, unsigned int outfmt) | |
75 { | |
76 if (outfmt == IMGFMT_IF09) return 0; | |
77 | |
78 vf->priv->outh = height + ass_top_margin + ass_bottom_margin; | |
79 vf->priv->outw = width; | |
80 | |
81 if(!opt_screen_size_x && !opt_screen_size_y){ | |
82 d_width = d_width * vf->priv->outw / width; | |
83 d_height = d_height * vf->priv->outh / height; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26727
diff
changeset
|
84 } |
18937 | 85 |
19065
26ed3fcd5cd4
drops casts from void * on malloc/calloc, leftover on libmpcodecs
reynaldo
parents:
18937
diff
changeset
|
86 vf->priv->planes[1] = malloc(vf->priv->outw * vf->priv->outh); |
26ed3fcd5cd4
drops casts from void * on malloc/calloc, leftover on libmpcodecs
reynaldo
parents:
18937
diff
changeset
|
87 vf->priv->planes[2] = malloc(vf->priv->outw * vf->priv->outh); |
26ed3fcd5cd4
drops casts from void * on malloc/calloc, leftover on libmpcodecs
reynaldo
parents:
18937
diff
changeset
|
88 vf->priv->dirty_rows = malloc(vf->priv->outh); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26727
diff
changeset
|
89 |
18937 | 90 if (vf->priv->ass_priv) { |
23134
1de2a46a0987
Add -ass-hinting option for setting font hinting method.
eugeni
parents:
22027
diff
changeset
|
91 ass_configure(vf->priv->ass_priv, vf->priv->outw, vf->priv->outh, 0); |
30488 | 92 ass_set_aspect_ratio(vf->priv->ass_priv, 1, 1); |
18937 | 93 } |
94 | |
95 return vf_next_config(vf, vf->priv->outw, vf->priv->outh, d_width, d_height, flags, outfmt); | |
96 } | |
97 | |
30642
a972c1a4a012
cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents:
30638
diff
changeset
|
98 static void get_image(struct vf_instance *vf, mp_image_t *mpi) |
18937 | 99 { |
100 if(mpi->type == MP_IMGTYPE_IPB) return; | |
101 if(mpi->flags & MP_IMGFLAG_PRESERVE) return; | |
102 if(mpi->imgfmt != vf->priv->outfmt) return; // colorspace differ | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26727
diff
changeset
|
103 |
18937 | 104 // width never changes, always try full DR |
105 mpi->priv = vf->dmpi = vf_get_image(vf->next, mpi->imgfmt, | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26727
diff
changeset
|
106 mpi->type, mpi->flags | MP_IMGFLAG_READABLE, |
18937 | 107 vf->priv->outw, |
108 vf->priv->outh); | |
109 | |
110 if((vf->dmpi->flags & MP_IMGFLAG_DRAW_CALLBACK) && | |
111 !(vf->dmpi->flags & MP_IMGFLAG_DIRECT)){ | |
20629
e8885ec63928
Introduce MSGT_ASS, use it for all libass messages.
eugeni
parents:
20477
diff
changeset
|
112 mp_msg(MSGT_ASS, MSGL_INFO, MSGTR_MPCODECS_FullDRNotPossible); |
18937 | 113 return; |
114 } | |
115 | |
116 // set up mpi as a cropped-down image of dmpi: | |
117 if(mpi->flags&MP_IMGFLAG_PLANAR){ | |
118 mpi->planes[0]=vf->dmpi->planes[0] + ass_top_margin * vf->dmpi->stride[0]; | |
119 mpi->planes[1]=vf->dmpi->planes[1] + (ass_top_margin >> mpi->chroma_y_shift) * vf->dmpi->stride[1]; | |
120 mpi->planes[2]=vf->dmpi->planes[2] + (ass_top_margin >> mpi->chroma_y_shift) * vf->dmpi->stride[2]; | |
121 mpi->stride[1]=vf->dmpi->stride[1]; | |
122 mpi->stride[2]=vf->dmpi->stride[2]; | |
123 } else { | |
124 mpi->planes[0]=vf->dmpi->planes[0] + ass_top_margin * vf->dmpi->stride[0]; | |
125 } | |
126 mpi->stride[0]=vf->dmpi->stride[0]; | |
127 mpi->width=vf->dmpi->width; | |
128 mpi->flags|=MP_IMGFLAG_DIRECT; | |
129 mpi->flags&=~MP_IMGFLAG_DRAW_CALLBACK; | |
130 // vf->dmpi->flags&=~MP_IMGFLAG_DRAW_CALLBACK; | |
131 } | |
132 | |
133 static void blank(mp_image_t *mpi, int y1, int y2) | |
134 { | |
135 int color[3] = {16, 128, 128}; // black (YUV) | |
136 int y; | |
137 unsigned char* dst; | |
138 int chroma_rows = (y2 - y1) >> mpi->chroma_y_shift; | |
139 | |
140 dst = mpi->planes[0] + y1 * mpi->stride[0]; | |
141 for (y = 0; y < y2 - y1; ++y) { | |
142 memset(dst, color[0], mpi->w); | |
143 dst += mpi->stride[0]; | |
144 } | |
145 dst = mpi->planes[1] + (y1 >> mpi->chroma_y_shift) * mpi->stride[1]; | |
146 for (y = 0; y < chroma_rows ; ++y) { | |
147 memset(dst, color[1], mpi->chroma_width); | |
148 dst += mpi->stride[1]; | |
149 } | |
150 dst = mpi->planes[2] + (y1 >> mpi->chroma_y_shift) * mpi->stride[2]; | |
151 for (y = 0; y < chroma_rows ; ++y) { | |
152 memset(dst, color[2], mpi->chroma_width); | |
153 dst += mpi->stride[2]; | |
154 } | |
155 } | |
156 | |
30642
a972c1a4a012
cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents:
30638
diff
changeset
|
157 static int prepare_image(struct vf_instance *vf, mp_image_t *mpi) |
18937 | 158 { |
159 if(mpi->flags&MP_IMGFLAG_DIRECT || mpi->flags&MP_IMGFLAG_DRAW_CALLBACK){ | |
160 vf->dmpi = mpi->priv; | |
20629
e8885ec63928
Introduce MSGT_ASS, use it for all libass messages.
eugeni
parents:
20477
diff
changeset
|
161 if (!vf->dmpi) { mp_msg(MSGT_ASS, MSGL_WARN, MSGTR_MPCODECS_FunWhydowegetNULL); return 0; } |
18937 | 162 mpi->priv = NULL; |
163 // we've used DR, so we're ready... | |
164 if (ass_top_margin) | |
165 blank(vf->dmpi, 0, ass_top_margin); | |
166 if (ass_bottom_margin) | |
167 blank(vf->dmpi, vf->priv->outh - ass_bottom_margin, vf->priv->outh); | |
168 if(!(mpi->flags&MP_IMGFLAG_PLANAR)) | |
169 vf->dmpi->planes[1] = mpi->planes[1]; // passthrough rgb8 palette | |
170 return 0; | |
171 } | |
172 | |
173 // hope we'll get DR buffer: | |
174 vf->dmpi = vf_get_image(vf->next, vf->priv->outfmt, | |
20656
839c48c35ce8
ass renderer absolutely needs readable target mpi.
reimar
parents:
20629
diff
changeset
|
175 MP_IMGTYPE_TEMP, MP_IMGFLAG_ACCEPT_STRIDE | MP_IMGFLAG_READABLE, |
18937 | 176 vf->priv->outw, vf->priv->outh); |
177 | |
178 // copy mpi->dmpi... | |
179 if(mpi->flags&MP_IMGFLAG_PLANAR){ | |
180 memcpy_pic(vf->dmpi->planes[0] + ass_top_margin * vf->dmpi->stride[0], | |
181 mpi->planes[0], mpi->w, mpi->h, | |
182 vf->dmpi->stride[0], mpi->stride[0]); | |
183 memcpy_pic(vf->dmpi->planes[1] + (ass_top_margin >> mpi->chroma_y_shift) * vf->dmpi->stride[1], | |
184 mpi->planes[1], mpi->w >> mpi->chroma_x_shift, mpi->h >> mpi->chroma_y_shift, | |
185 vf->dmpi->stride[1], mpi->stride[1]); | |
186 memcpy_pic(vf->dmpi->planes[2] + (ass_top_margin >> mpi->chroma_y_shift) * vf->dmpi->stride[2], | |
187 mpi->planes[2], mpi->w >> mpi->chroma_x_shift, mpi->h >> mpi->chroma_y_shift, | |
188 vf->dmpi->stride[2], mpi->stride[2]); | |
189 } else { | |
190 memcpy_pic(vf->dmpi->planes[0] + ass_top_margin * vf->dmpi->stride[0], | |
191 mpi->planes[0], mpi->w*(vf->dmpi->bpp/8), mpi->h, | |
192 vf->dmpi->stride[0], mpi->stride[0]); | |
193 vf->dmpi->planes[1] = mpi->planes[1]; // passthrough rgb8 palette | |
194 } | |
195 if (ass_top_margin) | |
196 blank(vf->dmpi, 0, ass_top_margin); | |
197 if (ass_bottom_margin) | |
198 blank(vf->dmpi, vf->priv->outh - ass_bottom_margin, vf->priv->outh); | |
199 return 0; | |
200 } | |
201 | |
202 /** | |
203 * \brief Copy specified rows from render_context.dmpi to render_context.planes, upsampling to 4:4:4 | |
204 */ | |
30642
a972c1a4a012
cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents:
30638
diff
changeset
|
205 static void copy_from_image(struct vf_instance *vf, int first_row, int last_row) |
18937 | 206 { |
207 int pl; | |
208 int i, j, k; | |
209 unsigned char val; | |
210 int chroma_rows; | |
211 | |
212 first_row -= (first_row % 2); | |
213 last_row += (last_row % 2); | |
214 chroma_rows = (last_row - first_row) / 2; | |
215 | |
29383
e9cab9f6ed62
Make sure clip coordinates are inside the screen area.
eugeni
parents:
29263
diff
changeset
|
216 assert(first_row >= 0); |
e9cab9f6ed62
Make sure clip coordinates are inside the screen area.
eugeni
parents:
29263
diff
changeset
|
217 assert(first_row <= last_row); |
29406
e1c1e13cb646
Fix stupid, off-by-one, mistakes in assert() expressions.
eugeni
parents:
29383
diff
changeset
|
218 assert(last_row <= vf->priv->outh); |
29383
e9cab9f6ed62
Make sure clip coordinates are inside the screen area.
eugeni
parents:
29263
diff
changeset
|
219 |
18937 | 220 for (pl = 1; pl < 3; ++pl) { |
21154 | 221 int dst_stride = vf->priv->outw; |
18937 | 222 int src_stride = vf->dmpi->stride[pl]; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26727
diff
changeset
|
223 |
18937 | 224 unsigned char* src = vf->dmpi->planes[pl] + (first_row/2) * src_stride; |
225 unsigned char* dst = vf->priv->planes[pl] + first_row * dst_stride; | |
226 unsigned char* dst_next = dst + dst_stride; | |
227 for(i = 0; i < chroma_rows; ++i) | |
228 { | |
229 if ((vf->priv->dirty_rows[first_row + i*2] == 0) || | |
230 (vf->priv->dirty_rows[first_row + i*2 + 1] == 0)) { | |
231 for (j = 0, k = 0; j < vf->dmpi->chroma_width; ++j, k+=2) { | |
232 val = *(src + j); | |
233 *(dst + k) = val; | |
234 *(dst + k + 1) = val; | |
235 *(dst_next + k) = val; | |
236 *(dst_next + k + 1) = val; | |
237 } | |
238 } | |
239 src += src_stride; | |
240 dst = dst_next + dst_stride; | |
241 dst_next = dst + dst_stride; | |
242 } | |
243 } | |
244 for (i = first_row; i < last_row; ++i) | |
245 vf->priv->dirty_rows[i] = 1; | |
246 } | |
247 | |
248 /** | |
249 * \brief Copy all previously copied rows back to render_context.dmpi | |
250 */ | |
30642
a972c1a4a012
cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents:
30638
diff
changeset
|
251 static void copy_to_image(struct vf_instance *vf) |
18937 | 252 { |
253 int pl; | |
254 int i, j, k; | |
255 for (pl = 1; pl < 3; ++pl) { | |
256 int dst_stride = vf->dmpi->stride[pl]; | |
21154 | 257 int src_stride = vf->priv->outw; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26727
diff
changeset
|
258 |
18937 | 259 unsigned char* dst = vf->dmpi->planes[pl]; |
260 unsigned char* src = vf->priv->planes[pl]; | |
261 unsigned char* src_next = vf->priv->planes[pl] + src_stride; | |
262 for(i = 0; i < vf->dmpi->chroma_height; ++i) | |
263 { | |
264 if ((vf->priv->dirty_rows[i*2] == 1)) { | |
265 assert(vf->priv->dirty_rows[i*2 + 1] == 1); | |
266 for (j = 0, k = 0; j < vf->dmpi->chroma_width; ++j, k+=2) { | |
267 unsigned val = 0; | |
268 val += *(src + k); | |
269 val += *(src + k + 1); | |
270 val += *(src_next + k); | |
271 val += *(src_next + k + 1); | |
272 *(dst + j) = val >> 2; | |
273 } | |
274 } | |
275 dst += dst_stride; | |
276 src = src_next + src_stride; | |
277 src_next = src + src_stride; | |
278 } | |
279 } | |
280 } | |
281 | |
30642
a972c1a4a012
cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents:
30638
diff
changeset
|
282 static void my_draw_bitmap(struct vf_instance *vf, unsigned char* bitmap, int bitmap_w, int bitmap_h, int stride, int dst_x, int dst_y, unsigned color) |
18937 | 283 { |
284 unsigned char y = rgba2y(color); | |
285 unsigned char u = rgba2u(color); | |
286 unsigned char v = rgba2v(color); | |
287 unsigned char opacity = 255 - _a(color); | |
20012 | 288 unsigned char *src, *dsty, *dstu, *dstv; |
18937 | 289 int i, j; |
290 mp_image_t* dmpi = vf->dmpi; | |
291 | |
292 src = bitmap; | |
20012 | 293 dsty = dmpi->planes[0] + dst_x + dst_y * dmpi->stride[0]; |
21154 | 294 dstu = vf->priv->planes[1] + dst_x + dst_y * vf->priv->outw; |
295 dstv = vf->priv->planes[2] + dst_x + dst_y * vf->priv->outw; | |
18937 | 296 for (i = 0; i < bitmap_h; ++i) { |
297 for (j = 0; j < bitmap_w; ++j) { | |
20012 | 298 unsigned k = ((unsigned)src[j]) * opacity / 255; |
299 dsty[j] = (k*y + (255-k)*dsty[j]) / 255; | |
300 dstu[j] = (k*u + (255-k)*dstu[j]) / 255; | |
301 dstv[j] = (k*v + (255-k)*dstv[j]) / 255; | |
18937 | 302 } |
20012 | 303 src += stride; |
304 dsty += dmpi->stride[0]; | |
21154 | 305 dstu += vf->priv->outw; |
306 dstv += vf->priv->outw; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26727
diff
changeset
|
307 } |
18937 | 308 } |
309 | |
31792
55dacfca4a43
Rename libass types to match upstream libass >= 0.9.7
greg
parents:
31688
diff
changeset
|
310 static int render_frame(struct vf_instance *vf, mp_image_t *mpi, const ASS_Image* img) |
18937 | 311 { |
312 if (img) { | |
313 memset(vf->priv->dirty_rows, 0, vf->priv->outh); // reset dirty rows | |
314 while (img) { | |
315 copy_from_image(vf, img->dst_y, img->dst_y + img->h); | |
316 my_draw_bitmap(vf, img->bitmap, img->w, img->h, img->stride, | |
317 img->dst_x, img->dst_y, img->color); | |
318 img = img->next; | |
319 } | |
320 copy_to_image(vf); | |
321 } | |
322 return 0; | |
323 } | |
324 | |
30642
a972c1a4a012
cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents:
30638
diff
changeset
|
325 static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts) |
18937 | 326 { |
31792
55dacfca4a43
Rename libass types to match upstream libass >= 0.9.7
greg
parents:
31688
diff
changeset
|
327 ASS_Image* images = 0; |
18937 | 328 if (sub_visibility && vf->priv->ass_priv && ass_track && (pts != MP_NOPTS_VALUE)) |
25813 | 329 images = ass_mp_render_frame(vf->priv->ass_priv, ass_track, (pts+sub_delay) * 1000 + .5, NULL); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26727
diff
changeset
|
330 |
18937 | 331 prepare_image(vf, mpi); |
332 if (images) render_frame(vf, mpi, images); | |
333 | |
334 return vf_next_put_image(vf, vf->dmpi, pts); | |
335 } | |
336 | |
30642
a972c1a4a012
cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents:
30638
diff
changeset
|
337 static int query_format(struct vf_instance *vf, unsigned int fmt) |
18937 | 338 { |
339 switch(fmt){ | |
340 case IMGFMT_YV12: | |
341 case IMGFMT_I420: | |
342 case IMGFMT_IYUV: | |
343 return vf_next_query_format(vf, vf->priv->outfmt); | |
344 } | |
345 return 0; | |
346 } | |
347 | |
348 static int control(vf_instance_t *vf, int request, void *data) | |
349 { | |
19521 | 350 switch (request) { |
351 case VFCTRL_INIT_EOSD: | |
31792
55dacfca4a43
Rename libass types to match upstream libass >= 0.9.7
greg
parents:
31688
diff
changeset
|
352 vf->priv->ass_priv = ass_renderer_init((ASS_Library*)data); |
20706
6ae01628975f
Initialize fontconfig in VFCTRL_INIT_EOSD handler.
eugeni
parents:
20656
diff
changeset
|
353 if (!vf->priv->ass_priv) return CONTROL_FALSE; |
6ae01628975f
Initialize fontconfig in VFCTRL_INIT_EOSD handler.
eugeni
parents:
20656
diff
changeset
|
354 ass_configure_fonts(vf->priv->ass_priv); |
6ae01628975f
Initialize fontconfig in VFCTRL_INIT_EOSD handler.
eugeni
parents:
20656
diff
changeset
|
355 return CONTROL_TRUE; |
19521 | 356 case VFCTRL_DRAW_EOSD: |
357 if (vf->priv->ass_priv) return CONTROL_TRUE; | |
358 break; | |
18937 | 359 } |
360 return vf_next_control(vf, request, data); | |
361 } | |
362 | |
30642
a972c1a4a012
cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents:
30638
diff
changeset
|
363 static void uninit(struct vf_instance *vf) |
18937 | 364 { |
365 if (vf->priv->ass_priv) | |
20477 | 366 ass_renderer_done(vf->priv->ass_priv); |
18937 | 367 if (vf->priv->planes[1]) |
368 free(vf->priv->planes[1]); | |
369 if (vf->priv->planes[2]) | |
370 free(vf->priv->planes[2]); | |
371 if (vf->priv->dirty_rows) | |
372 free(vf->priv->dirty_rows); | |
373 } | |
374 | |
24969
c2b7ba444ade
begin moving const filter data to .text/.rodata sections
rfelker
parents:
24545
diff
changeset
|
375 static const unsigned int fmt_list[]={ |
18937 | 376 IMGFMT_YV12, |
377 IMGFMT_I420, | |
378 IMGFMT_IYUV, | |
379 0 | |
380 }; | |
381 | |
30638
a7b908875c14
Rename open() vf initialization function to vf_open().
diego
parents:
30633
diff
changeset
|
382 static int vf_open(vf_instance_t *vf, char *args) |
18937 | 383 { |
384 int flags; | |
385 vf->priv->outfmt = vf_match_csp(&vf->next,fmt_list,IMGFMT_YV12); | |
386 if (vf->priv->outfmt) | |
387 flags = vf_next_query_format(vf, vf->priv->outfmt); | |
388 if (!vf->priv->outfmt || (vf->priv->auto_insert && flags&VFCAP_EOSD)) | |
389 { | |
390 uninit(vf); | |
391 return 0; | |
392 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26727
diff
changeset
|
393 |
18937 | 394 if (vf->priv->auto_insert) |
20629
e8885ec63928
Introduce MSGT_ASS, use it for all libass messages.
eugeni
parents:
20477
diff
changeset
|
395 mp_msg(MSGT_ASS, MSGL_INFO, "[ass] auto-open\n"); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26727
diff
changeset
|
396 |
18937 | 397 vf->config = config; |
398 vf->query_format = query_format; | |
399 vf->uninit = uninit; | |
400 vf->control = control; | |
401 vf->get_image = get_image; | |
402 vf->put_image = put_image; | |
403 vf->default_caps=VFCAP_EOSD; | |
404 return 1; | |
405 } | |
406 | |
407 #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
|
408 static const m_option_t vf_opts_fields[] = { |
18937 | 409 {"auto", ST_OFF(auto_insert), CONF_TYPE_FLAG, 0 , 0, 1, NULL}, |
410 { NULL, NULL, 0, 0, 0, 0, NULL } | |
411 }; | |
412 | |
24969
c2b7ba444ade
begin moving const filter data to .text/.rodata sections
rfelker
parents:
24545
diff
changeset
|
413 static const m_struct_t vf_opts = { |
18937 | 414 "ass", |
415 sizeof(struct vf_priv_s), | |
416 &vf_priv_dflt, | |
417 vf_opts_fields | |
418 }; | |
419 | |
24969
c2b7ba444ade
begin moving const filter data to .text/.rodata sections
rfelker
parents:
24545
diff
changeset
|
420 const vf_info_t vf_info_ass = { |
18937 | 421 "Render ASS/SSA subtitles", |
422 "ass", | |
423 "Evgeniy Stepanov", | |
424 "", | |
30638
a7b908875c14
Rename open() vf initialization function to vf_open().
diego
parents:
30633
diff
changeset
|
425 vf_open, |
18937 | 426 &vf_opts |
427 }; |