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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
82601a38e2a7 Use standard license headers.
diego
parents: 25813
diff changeset
4 * Copyright (C) 2006 Evgeniy Stepanov <eugeni.stepanov@gmail.com>
82601a38e2a7 Use standard license headers.
diego
parents: 25813
diff changeset
5 *
82601a38e2a7 Use standard license headers.
diego
parents: 25813
diff changeset
6 * This file is part of MPlayer.
82601a38e2a7 Use standard license headers.
diego
parents: 25813
diff changeset
7 *
82601a38e2a7 Use standard license headers.
diego
parents: 25813
diff changeset
8 * MPlayer is free software; you can redistribute it and/or modify
82601a38e2a7 Use standard license headers.
diego
parents: 25813
diff changeset
9 * it under the terms of the GNU General Public License as published by
82601a38e2a7 Use standard license headers.
diego
parents: 25813
diff changeset
10 * the Free Software Foundation; either version 2 of the License, or
82601a38e2a7 Use standard license headers.
diego
parents: 25813
diff changeset
11 * (at your option) any later version.
82601a38e2a7 Use standard license headers.
diego
parents: 25813
diff changeset
12 *
82601a38e2a7 Use standard license headers.
diego
parents: 25813
diff changeset
13 * MPlayer is distributed in the hope that it will be useful,
82601a38e2a7 Use standard license headers.
diego
parents: 25813
diff changeset
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
82601a38e2a7 Use standard license headers.
diego
parents: 25813
diff changeset
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
82601a38e2a7 Use standard license headers.
diego
parents: 25813
diff changeset
16 * GNU General Public License for more details.
82601a38e2a7 Use standard license headers.
diego
parents: 25813
diff changeset
17 *
82601a38e2a7 Use standard license headers.
diego
parents: 25813
diff changeset
18 * You should have received a copy of the GNU General Public License along
82601a38e2a7 Use standard license headers.
diego
parents: 25813
diff changeset
19 * with MPlayer; if not, write to the Free Software Foundation, Inc.,
82601a38e2a7 Use standard license headers.
diego
parents: 25813
diff changeset
20 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
82601a38e2a7 Use standard license headers.
diego
parents: 25813
diff changeset
21 */
20008
fa122b7c71c6 Add copyright notice and vim/emacs comments to libass and vf_ass.c.
eugeni
parents: 19563
diff changeset
22
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
23 #include "config.h"
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
24
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
25 #include <stdio.h>
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
26 #include <stdlib.h>
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
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
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
29 #include <assert.h>
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
30
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
31 #include "config.h"
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
32 #include "mp_msg.h"
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
33 #include "help_mp.h"
31489
dc26022e9c27 Clean up sub-related extern declarations.
diego
parents: 31488
diff changeset
34 #include "mpcommon.h"
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
35 #include "img_format.h"
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
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
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
38 #include "vf.h"
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
39
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
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
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
42 #include "m_option.h"
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
43 #include "m_struct.h"
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
44
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
45 #include "libass/ass_mp.h"
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
46
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
47 #define _r(c) ((c)>>24)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
48 #define _g(c) (((c)>>16)&0xFF)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
49 #define _b(c) (((c)>>8)&0xFF)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
50 #define _a(c) ((c)&0xFF)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
51 #define rgba2y(c) ( (( 263*_r(c) + 516*_g(c) + 100*_b(c)) >> 10) + 16 )
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
52 #define rgba2u(c) ( ((-152*_r(c) - 298*_g(c) + 450*_b(c)) >> 10) + 128 )
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
53 #define rgba2v(c) ( (( 450*_r(c) - 376*_g(c) - 73*_b(c)) >> 10) + 128 )
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
54
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
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
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
57 int outh, outw;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
58
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
59 unsigned int outfmt;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
60
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
61 // 1 = auto-added filter: insert only if chain does not support EOSD already
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
62 // 0 = insert always
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
63 int auto_insert;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
64
31792
55dacfca4a43 Rename libass types to match upstream libass >= 0.9.7
greg
parents: 31688
diff changeset
65 ASS_Renderer* ass_priv;
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
66
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
67 unsigned char* planes[3];
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
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
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
70
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
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
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
73 int width, int height, int d_width, int d_height,
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
74 unsigned int flags, unsigned int outfmt)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
75 {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
76 if (outfmt == IMGFMT_IF09) return 0;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
77
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
78 vf->priv->outh = height + ass_top_margin + ass_bottom_margin;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
79 vf->priv->outw = width;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
80
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
81 if(!opt_screen_size_x && !opt_screen_size_y){
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
82 d_width = d_width * vf->priv->outw / width;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
83 d_height = d_height * vf->priv->outh / height;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 26727
diff changeset
84 }
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
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
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
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
595410bd114e libass: fix PAR correction
greg
parents: 30065
diff changeset
92 ass_set_aspect_ratio(vf->priv->ass_priv, 1, 1);
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
93 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
94
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
95 return vf_next_config(vf, vf->priv->outw, vf->priv->outh, d_width, d_height, flags, outfmt);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
96 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
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
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
99 {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
100 if(mpi->type == MP_IMGTYPE_IPB) return;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
101 if(mpi->flags & MP_IMGFLAG_PRESERVE) return;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
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
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
104 // width never changes, always try full DR
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
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
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
107 vf->priv->outw,
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
108 vf->priv->outh);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
109
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
110 if((vf->dmpi->flags & MP_IMGFLAG_DRAW_CALLBACK) &&
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
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
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
113 return;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
114 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
115
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
116 // set up mpi as a cropped-down image of dmpi:
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
117 if(mpi->flags&MP_IMGFLAG_PLANAR){
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
118 mpi->planes[0]=vf->dmpi->planes[0] + ass_top_margin * vf->dmpi->stride[0];
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
119 mpi->planes[1]=vf->dmpi->planes[1] + (ass_top_margin >> mpi->chroma_y_shift) * vf->dmpi->stride[1];
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
120 mpi->planes[2]=vf->dmpi->planes[2] + (ass_top_margin >> mpi->chroma_y_shift) * vf->dmpi->stride[2];
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
121 mpi->stride[1]=vf->dmpi->stride[1];
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
122 mpi->stride[2]=vf->dmpi->stride[2];
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
123 } else {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
124 mpi->planes[0]=vf->dmpi->planes[0] + ass_top_margin * vf->dmpi->stride[0];
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
125 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
126 mpi->stride[0]=vf->dmpi->stride[0];
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
127 mpi->width=vf->dmpi->width;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
128 mpi->flags|=MP_IMGFLAG_DIRECT;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
129 mpi->flags&=~MP_IMGFLAG_DRAW_CALLBACK;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
130 // vf->dmpi->flags&=~MP_IMGFLAG_DRAW_CALLBACK;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
131 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
132
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
133 static void blank(mp_image_t *mpi, int y1, int y2)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
134 {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
135 int color[3] = {16, 128, 128}; // black (YUV)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
136 int y;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
137 unsigned char* dst;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
138 int chroma_rows = (y2 - y1) >> mpi->chroma_y_shift;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
139
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
140 dst = mpi->planes[0] + y1 * mpi->stride[0];
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
141 for (y = 0; y < y2 - y1; ++y) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
142 memset(dst, color[0], mpi->w);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
143 dst += mpi->stride[0];
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
144 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
145 dst = mpi->planes[1] + (y1 >> mpi->chroma_y_shift) * mpi->stride[1];
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
146 for (y = 0; y < chroma_rows ; ++y) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
147 memset(dst, color[1], mpi->chroma_width);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
148 dst += mpi->stride[1];
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
149 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
150 dst = mpi->planes[2] + (y1 >> mpi->chroma_y_shift) * mpi->stride[2];
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
151 for (y = 0; y < chroma_rows ; ++y) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
152 memset(dst, color[2], mpi->chroma_width);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
153 dst += mpi->stride[2];
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
154 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
155 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
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
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
158 {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
159 if(mpi->flags&MP_IMGFLAG_DIRECT || mpi->flags&MP_IMGFLAG_DRAW_CALLBACK){
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
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
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
162 mpi->priv = NULL;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
163 // we've used DR, so we're ready...
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
164 if (ass_top_margin)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
165 blank(vf->dmpi, 0, ass_top_margin);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
166 if (ass_bottom_margin)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
167 blank(vf->dmpi, vf->priv->outh - ass_bottom_margin, vf->priv->outh);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
168 if(!(mpi->flags&MP_IMGFLAG_PLANAR))
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
169 vf->dmpi->planes[1] = mpi->planes[1]; // passthrough rgb8 palette
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
170 return 0;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
171 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
172
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
173 // hope we'll get DR buffer:
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
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
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
176 vf->priv->outw, vf->priv->outh);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
177
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
178 // copy mpi->dmpi...
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
179 if(mpi->flags&MP_IMGFLAG_PLANAR){
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
180 memcpy_pic(vf->dmpi->planes[0] + ass_top_margin * vf->dmpi->stride[0],
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
181 mpi->planes[0], mpi->w, mpi->h,
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
182 vf->dmpi->stride[0], mpi->stride[0]);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
183 memcpy_pic(vf->dmpi->planes[1] + (ass_top_margin >> mpi->chroma_y_shift) * vf->dmpi->stride[1],
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
184 mpi->planes[1], mpi->w >> mpi->chroma_x_shift, mpi->h >> mpi->chroma_y_shift,
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
185 vf->dmpi->stride[1], mpi->stride[1]);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
186 memcpy_pic(vf->dmpi->planes[2] + (ass_top_margin >> mpi->chroma_y_shift) * vf->dmpi->stride[2],
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
187 mpi->planes[2], mpi->w >> mpi->chroma_x_shift, mpi->h >> mpi->chroma_y_shift,
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
188 vf->dmpi->stride[2], mpi->stride[2]);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
189 } else {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
190 memcpy_pic(vf->dmpi->planes[0] + ass_top_margin * vf->dmpi->stride[0],
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
191 mpi->planes[0], mpi->w*(vf->dmpi->bpp/8), mpi->h,
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
192 vf->dmpi->stride[0], mpi->stride[0]);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
193 vf->dmpi->planes[1] = mpi->planes[1]; // passthrough rgb8 palette
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
194 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
195 if (ass_top_margin)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
196 blank(vf->dmpi, 0, ass_top_margin);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
197 if (ass_bottom_margin)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
198 blank(vf->dmpi, vf->priv->outh - ass_bottom_margin, vf->priv->outh);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
199 return 0;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
200 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
201
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
202 /**
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
203 * \brief Copy specified rows from render_context.dmpi to render_context.planes, upsampling to 4:4:4
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
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
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
206 {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
207 int pl;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
208 int i, j, k;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
209 unsigned char val;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
210 int chroma_rows;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
211
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
212 first_row -= (first_row % 2);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
213 last_row += (last_row % 2);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
214 chroma_rows = (last_row - first_row) / 2;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
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
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
220 for (pl = 1; pl < 3; ++pl) {
21154
1ac5087585f6 Fix incorrect stride used in vf_ass.
eugeni
parents: 20706
diff changeset
221 int dst_stride = vf->priv->outw;
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
222 int src_stride = vf->dmpi->stride[pl];
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 26727
diff changeset
223
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
224 unsigned char* src = vf->dmpi->planes[pl] + (first_row/2) * src_stride;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
225 unsigned char* dst = vf->priv->planes[pl] + first_row * dst_stride;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
226 unsigned char* dst_next = dst + dst_stride;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
227 for(i = 0; i < chroma_rows; ++i)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
228 {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
229 if ((vf->priv->dirty_rows[first_row + i*2] == 0) ||
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
230 (vf->priv->dirty_rows[first_row + i*2 + 1] == 0)) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
231 for (j = 0, k = 0; j < vf->dmpi->chroma_width; ++j, k+=2) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
232 val = *(src + j);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
233 *(dst + k) = val;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
234 *(dst + k + 1) = val;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
235 *(dst_next + k) = val;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
236 *(dst_next + k + 1) = val;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
237 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
238 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
239 src += src_stride;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
240 dst = dst_next + dst_stride;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
241 dst_next = dst + dst_stride;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
242 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
243 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
244 for (i = first_row; i < last_row; ++i)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
245 vf->priv->dirty_rows[i] = 1;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
246 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
247
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
248 /**
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
249 * \brief Copy all previously copied rows back to render_context.dmpi
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
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
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
252 {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
253 int pl;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
254 int i, j, k;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
255 for (pl = 1; pl < 3; ++pl) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
256 int dst_stride = vf->dmpi->stride[pl];
21154
1ac5087585f6 Fix incorrect stride used in vf_ass.
eugeni
parents: 20706
diff changeset
257 int src_stride = vf->priv->outw;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 26727
diff changeset
258
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
259 unsigned char* dst = vf->dmpi->planes[pl];
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
260 unsigned char* src = vf->priv->planes[pl];
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
261 unsigned char* src_next = vf->priv->planes[pl] + src_stride;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
262 for(i = 0; i < vf->dmpi->chroma_height; ++i)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
263 {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
264 if ((vf->priv->dirty_rows[i*2] == 1)) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
265 assert(vf->priv->dirty_rows[i*2 + 1] == 1);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
266 for (j = 0, k = 0; j < vf->dmpi->chroma_width; ++j, k+=2) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
267 unsigned val = 0;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
268 val += *(src + k);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
269 val += *(src + k + 1);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
270 val += *(src_next + k);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
271 val += *(src_next + k + 1);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
272 *(dst + j) = val >> 2;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
273 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
274 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
275 dst += dst_stride;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
276 src = src_next + src_stride;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
277 src_next = src + src_stride;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
278 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
279 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
280 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
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
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
283 {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
284 unsigned char y = rgba2y(color);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
285 unsigned char u = rgba2u(color);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
286 unsigned char v = rgba2v(color);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
287 unsigned char opacity = 255 - _a(color);
20012
9a2462925e07 Simplify and optimize bitmap blending.
eugeni
parents: 20008
diff changeset
288 unsigned char *src, *dsty, *dstu, *dstv;
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
289 int i, j;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
290 mp_image_t* dmpi = vf->dmpi;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
291
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
292 src = bitmap;
20012
9a2462925e07 Simplify and optimize bitmap blending.
eugeni
parents: 20008
diff changeset
293 dsty = dmpi->planes[0] + dst_x + dst_y * dmpi->stride[0];
21154
1ac5087585f6 Fix incorrect stride used in vf_ass.
eugeni
parents: 20706
diff changeset
294 dstu = vf->priv->planes[1] + dst_x + dst_y * vf->priv->outw;
1ac5087585f6 Fix incorrect stride used in vf_ass.
eugeni
parents: 20706
diff changeset
295 dstv = vf->priv->planes[2] + dst_x + dst_y * vf->priv->outw;
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
296 for (i = 0; i < bitmap_h; ++i) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
297 for (j = 0; j < bitmap_w; ++j) {
20012
9a2462925e07 Simplify and optimize bitmap blending.
eugeni
parents: 20008
diff changeset
298 unsigned k = ((unsigned)src[j]) * opacity / 255;
9a2462925e07 Simplify and optimize bitmap blending.
eugeni
parents: 20008
diff changeset
299 dsty[j] = (k*y + (255-k)*dsty[j]) / 255;
9a2462925e07 Simplify and optimize bitmap blending.
eugeni
parents: 20008
diff changeset
300 dstu[j] = (k*u + (255-k)*dstu[j]) / 255;
9a2462925e07 Simplify and optimize bitmap blending.
eugeni
parents: 20008
diff changeset
301 dstv[j] = (k*v + (255-k)*dstv[j]) / 255;
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
302 }
20012
9a2462925e07 Simplify and optimize bitmap blending.
eugeni
parents: 20008
diff changeset
303 src += stride;
9a2462925e07 Simplify and optimize bitmap blending.
eugeni
parents: 20008
diff changeset
304 dsty += dmpi->stride[0];
21154
1ac5087585f6 Fix incorrect stride used in vf_ass.
eugeni
parents: 20706
diff changeset
305 dstu += vf->priv->outw;
1ac5087585f6 Fix incorrect stride used in vf_ass.
eugeni
parents: 20706
diff changeset
306 dstv += vf->priv->outw;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 26727
diff changeset
307 }
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
308 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
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
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
311 {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
312 if (img) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
313 memset(vf->priv->dirty_rows, 0, vf->priv->outh); // reset dirty rows
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
314 while (img) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
315 copy_from_image(vf, img->dst_y, img->dst_y + img->h);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
316 my_draw_bitmap(vf, img->bitmap, img->w, img->h, img->stride,
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
317 img->dst_x, img->dst_y, img->color);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
318 img = img->next;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
319 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
320 copy_to_image(vf);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
321 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
322 return 0;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
323 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
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
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
326 {
31792
55dacfca4a43 Rename libass types to match upstream libass >= 0.9.7
greg
parents: 31688
diff changeset
327 ASS_Image* images = 0;
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
328 if (sub_visibility && vf->priv->ass_priv && ass_track && (pts != MP_NOPTS_VALUE))
25813
ba7bd4f7e322 Add global ass_force_reload flag.
eugeni
parents: 24969
diff changeset
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
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
331 prepare_image(vf, mpi);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
332 if (images) render_frame(vf, mpi, images);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
333
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
334 return vf_next_put_image(vf, vf->dmpi, pts);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
335 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
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
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
338 {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
339 switch(fmt){
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
340 case IMGFMT_YV12:
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
341 case IMGFMT_I420:
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
342 case IMGFMT_IYUV:
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
343 return vf_next_query_format(vf, vf->priv->outfmt);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
344 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
345 return 0;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
346 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
347
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
348 static int control(vf_instance_t *vf, int request, void *data)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
349 {
19521
0be2d3583f4f Add VFCTRL_DRAW_EOSD.
eugeni
parents: 19517
diff changeset
350 switch (request) {
0be2d3583f4f Add VFCTRL_DRAW_EOSD.
eugeni
parents: 19517
diff changeset
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
0be2d3583f4f Add VFCTRL_DRAW_EOSD.
eugeni
parents: 19517
diff changeset
356 case VFCTRL_DRAW_EOSD:
0be2d3583f4f Add VFCTRL_DRAW_EOSD.
eugeni
parents: 19517
diff changeset
357 if (vf->priv->ass_priv) return CONTROL_TRUE;
0be2d3583f4f Add VFCTRL_DRAW_EOSD.
eugeni
parents: 19517
diff changeset
358 break;
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
359 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
360 return vf_next_control(vf, request, data);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
361 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
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
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
364 {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
365 if (vf->priv->ass_priv)
20477
de4a66d99f41 Libass interface reworked:
eugeni
parents: 20446
diff changeset
366 ass_renderer_done(vf->priv->ass_priv);
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
367 if (vf->priv->planes[1])
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
368 free(vf->priv->planes[1]);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
369 if (vf->priv->planes[2])
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
370 free(vf->priv->planes[2]);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
371 if (vf->priv->dirty_rows)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
372 free(vf->priv->dirty_rows);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
373 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
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
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
376 IMGFMT_YV12,
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
377 IMGFMT_I420,
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
378 IMGFMT_IYUV,
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
379 0
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
380 };
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
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
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
383 {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
384 int flags;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
385 vf->priv->outfmt = vf_match_csp(&vf->next,fmt_list,IMGFMT_YV12);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
386 if (vf->priv->outfmt)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
387 flags = vf_next_query_format(vf, vf->priv->outfmt);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
388 if (!vf->priv->outfmt || (vf->priv->auto_insert && flags&VFCAP_EOSD))
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
389 {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
390 uninit(vf);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
391 return 0;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
392 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 26727
diff changeset
393
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
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
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
397 vf->config = config;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
398 vf->query_format = query_format;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
399 vf->uninit = uninit;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
400 vf->control = control;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
401 vf->get_image = get_image;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
402 vf->put_image = put_image;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
403 vf->default_caps=VFCAP_EOSD;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
404 return 1;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
405 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
406
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
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
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
409 {"auto", ST_OFF(auto_insert), CONF_TYPE_FLAG, 0 , 0, 1, NULL},
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
410 { NULL, NULL, 0, 0, 0, 0, NULL }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
411 };
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
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
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
414 "ass",
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
415 sizeof(struct vf_priv_s),
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
416 &vf_priv_dflt,
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
417 vf_opts_fields
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
418 };
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
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
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
421 "Render ASS/SSA subtitles",
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
422 "ass",
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
423 "Evgeniy Stepanov",
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
424 "",
30638
a7b908875c14 Rename open() vf initialization function to vf_open().
diego
parents: 30633
diff changeset
425 vf_open,
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
426 &vf_opts
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
427 };