annotate libass/ass_utils.h @ 35171:75e4ee082dd2

mp_property_deinterlace: Improve OSD feedback Do not show wrong OSD if setting of property deinterlace fails or is not supported by current video chain. This was particularly misleading because if you e.g. were using mplayer without a deinterlacing filter and your vo didn't have deinterlacing support. The OSD output of the property would appear like it got stuck at "enabled". Patch by Vicente Sendra >visenri yahoo.es< with a few changes by me.
author al
date Sun, 21 Oct 2012 19:01:48 +0000
parents 88eebbbbd6a0
children 49fc594fda43
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: 18937
diff changeset
1 /*
26723
0f892cd714b2 Use standard license header.
diego
parents: 26138
diff changeset
2 * Copyright (C) 2006 Evgeniy Stepanov <eugeni.stepanov@gmail.com>
0f892cd714b2 Use standard license header.
diego
parents: 26138
diff changeset
3 *
26738
588ce97b44f2 Speak of libass instead of MPlayer in the libass license headers.
diego
parents: 26723
diff changeset
4 * This file is part of libass.
26723
0f892cd714b2 Use standard license header.
diego
parents: 26138
diff changeset
5 *
34011
88eebbbbd6a0 Update included libass copy to 0.9.13 release.
reimar
parents: 30200
diff changeset
6 * Permission to use, copy, modify, and distribute this software for any
88eebbbbd6a0 Update included libass copy to 0.9.13 release.
reimar
parents: 30200
diff changeset
7 * purpose with or without fee is hereby granted, provided that the above
88eebbbbd6a0 Update included libass copy to 0.9.13 release.
reimar
parents: 30200
diff changeset
8 * copyright notice and this permission notice appear in all copies.
26723
0f892cd714b2 Use standard license header.
diego
parents: 26138
diff changeset
9 *
34011
88eebbbbd6a0 Update included libass copy to 0.9.13 release.
reimar
parents: 30200
diff changeset
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
88eebbbbd6a0 Update included libass copy to 0.9.13 release.
reimar
parents: 30200
diff changeset
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
88eebbbbd6a0 Update included libass copy to 0.9.13 release.
reimar
parents: 30200
diff changeset
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
88eebbbbd6a0 Update included libass copy to 0.9.13 release.
reimar
parents: 30200
diff changeset
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
88eebbbbd6a0 Update included libass copy to 0.9.13 release.
reimar
parents: 30200
diff changeset
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
88eebbbbd6a0 Update included libass copy to 0.9.13 release.
reimar
parents: 30200
diff changeset
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
88eebbbbd6a0 Update included libass copy to 0.9.13 release.
reimar
parents: 30200
diff changeset
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
26723
0f892cd714b2 Use standard license header.
diego
parents: 26138
diff changeset
17 */
20008
fa122b7c71c6 Add copyright notice and vim/emacs comments to libass and vf_ass.c.
eugeni
parents: 18937
diff changeset
18
25897
aaebaf255b23 Consistently give all libass multiple inclusion guards a LIBASS_ prefix.
diego
parents: 25535
diff changeset
19 #ifndef LIBASS_UTILS_H
aaebaf255b23 Consistently give all libass multiple inclusion guards a LIBASS_ prefix.
diego
parents: 25535
diff changeset
20 #define LIBASS_UTILS_H
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
21
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
22 #include <stdio.h>
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
23 #include <stdarg.h>
26138
74055622161d Add missing header #includes to fix 'make checkheaders'.
diego
parents: 26036
diff changeset
24 #include <stdint.h>
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
25 #include <stdlib.h>
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
26 #include <string.h>
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
27 #include <assert.h>
26138
74055622161d Add missing header #includes to fix 'make checkheaders'.
diego
parents: 26036
diff changeset
28
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
29 #ifdef CONFIG_ENCA
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
30 #include <enca.h>
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
31 #endif
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
32
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
33 #include "ass.h"
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
34
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
35 #define MSGL_FATAL 0
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
36 #define MSGL_ERR 1
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
37 #define MSGL_WARN 2
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
38 #define MSGL_INFO 4
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
39 #define MSGL_V 6
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
40 #define MSGL_DBG2 7
22213
66abe12ad374 Move conversions between 16.16, 26.6 fixed point and int, double to separate
eugeni
parents: 20503
diff changeset
41
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
42 #define FFMAX(a,b) ((a) > (b) ? (a) : (b))
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
43 #define FFMIN(a,b) ((a) > (b) ? (b) : (a))
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
44 #define FFMINMAX(c,a,b) FFMIN(FFMAX(c, a), b)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
45
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
46 int mystrtoi(char **p, int *res);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
47 int mystrtoll(char **p, long long *res);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
48 int mystrtou32(char **p, int base, uint32_t *res);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
49 int mystrtod(char **p, double *res);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
50 int strtocolor(ASS_Library *library, char **q, uint32_t *res, int hex);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
51 char parse_bool(char *str);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
52 unsigned ass_utf8_get_char(char **str);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
53 void ass_msg(ASS_Library *priv, int lvl, char *fmt, ...);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
54 #ifdef CONFIG_ENCA
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
55 void *ass_guess_buffer_cp(ASS_Library *library, unsigned char *buffer,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
56 int buflen, char *preferred_language,
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
57 char *fallback);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
58 #endif
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
59
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
60 /* defined in ass_strtod.c */
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
61 double ass_strtod(const char *string, char **endPtr);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
62
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
63 static inline int d6_to_int(int x)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
64 {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
65 return (x + 32) >> 6;
22213
66abe12ad374 Move conversions between 16.16, 26.6 fixed point and int, double to separate
eugeni
parents: 20503
diff changeset
66 }
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
67 static inline int d16_to_int(int x)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
68 {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
69 return (x + 32768) >> 16;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
70 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
71 static inline int int_to_d6(int x)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
72 {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
73 return x << 6;
22213
66abe12ad374 Move conversions between 16.16, 26.6 fixed point and int, double to separate
eugeni
parents: 20503
diff changeset
74 }
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
75 static inline int int_to_d16(int x)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
76 {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
77 return x << 16;
22213
66abe12ad374 Move conversions between 16.16, 26.6 fixed point and int, double to separate
eugeni
parents: 20503
diff changeset
78 }
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
79 static inline int d16_to_d6(int x)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
80 {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
81 return (x + 512) >> 10;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
82 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
83 static inline int d6_to_d16(int x)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
84 {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
85 return x << 10;
22213
66abe12ad374 Move conversions between 16.16, 26.6 fixed point and int, double to separate
eugeni
parents: 20503
diff changeset
86 }
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
87 static inline double d6_to_double(int x)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
88 {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
89 return x / 64.;
22213
66abe12ad374 Move conversions between 16.16, 26.6 fixed point and int, double to separate
eugeni
parents: 20503
diff changeset
90 }
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
91 static inline int double_to_d6(double x)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
92 {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
93 return (int) (x * 64);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
94 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
95 static inline double d16_to_double(int x)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
96 {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
97 return ((double) x) / 0x10000;
22213
66abe12ad374 Move conversions between 16.16, 26.6 fixed point and int, double to separate
eugeni
parents: 20503
diff changeset
98 }
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
99 static inline int double_to_d16(double x)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
100 {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
101 return (int) (x * 0x10000);
23299
0ee56ec36a40 Limit ass_font_set_transform to nonrotating transformations.
eugeni
parents: 22213
diff changeset
102 }
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
103 static inline double d22_to_double(int x)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
104 {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
105 return ((double) x) / 0x400000;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
106 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
107 static inline int double_to_d22(double x)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
108 {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
109 return (int) (x * 0x400000);
23299
0ee56ec36a40 Limit ass_font_set_transform to nonrotating transformations.
eugeni
parents: 22213
diff changeset
110 }
22213
66abe12ad374 Move conversions between 16.16, 26.6 fixed point and int, double to separate
eugeni
parents: 20503
diff changeset
111
30200
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
112 // Calculate cache key for a rotational angle in degrees
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
113 static inline int rot_key(double a)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
114 {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
115 const int m = double_to_d22(360.0);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
116 return double_to_d22(a) % m;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
117 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
118
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
119 #define FNV1_32A_INIT (unsigned)0x811c9dc5
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
120
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
121 static inline unsigned fnv_32a_buf(void *buf, size_t len, unsigned hval)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
122 {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
123 unsigned char *bp = buf;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
124 unsigned char *be = bp + len;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
125 while (bp < be) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
126 hval ^= (unsigned) *bp++;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
127 hval +=
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
128 (hval << 1) + (hval << 4) + (hval << 7) + (hval << 8) +
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
129 (hval << 24);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
130 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
131 return hval;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
132 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
133 static inline unsigned fnv_32a_str(char *str, unsigned hval)
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
134 {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
135 unsigned char *s = (unsigned char *) str;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
136 while (*s) {
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
137 hval ^= (unsigned) *s++;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
138 hval +=
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
139 (hval << 1) + (hval << 4) + (hval << 7) + (hval << 8) +
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
140 (hval << 24);
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
141 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
142 return hval;
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
143 }
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
144
48d020c5ceca Update internal libass copy to commit 8db4a5
greg
parents: 28785
diff changeset
145 #endif /* LIBASS_UTILS_H */