annotate libmpcodecs/vf_ass.c @ 32972:fbaae7fe1a13

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