Mercurial > mplayer.hg
annotate libass/ass_utils.c @ 29385:f9ae25067fe0
Fix 24bit audio playback.
The reordering channels code had reoccurring bug
where in switch(samplesize) block the
case 3 (3 bytes) doesn't end with break;
leading to execution of the next case 4 too.
This mangles the already processed data and
causes massive memory corruption.
author | iive |
---|---|
date | Sun, 19 Jul 2009 09:55:29 +0000 |
parents | 0f1b5b68af32 |
children | 48d020c5ceca |
rev | line source |
---|---|
20008
fa122b7c71c6
Add copyright notice and vim/emacs comments to libass and vf_ass.c.
eugeni
parents:
19405
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:
19405
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:
19405
diff
changeset
|
3 /* |
26723 | 4 * Copyright (C) 2006 Evgeniy Stepanov <eugeni.stepanov@gmail.com> |
5 * | |
26738
588ce97b44f2
Speak of libass instead of MPlayer in the libass license headers.
diego
parents:
26723
diff
changeset
|
6 * This file is part of libass. |
26723 | 7 * |
26738
588ce97b44f2
Speak of libass instead of MPlayer in the libass license headers.
diego
parents:
26723
diff
changeset
|
8 * libass is free software; you can redistribute it and/or modify |
26723 | 9 * it under the terms of the GNU General Public License as published by |
10 * the Free Software Foundation; either version 2 of the License, or | |
11 * (at your option) any later version. | |
12 * | |
26738
588ce97b44f2
Speak of libass instead of MPlayer in the libass license headers.
diego
parents:
26723
diff
changeset
|
13 * libass is distributed in the hope that it will be useful, |
26723 | 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
16 * GNU General Public License for more details. | |
17 * | |
18 * You should have received a copy of the GNU General Public License along | |
26738
588ce97b44f2
Speak of libass instead of MPlayer in the libass license headers.
diego
parents:
26723
diff
changeset
|
19 * with libass; if not, write to the Free Software Foundation, Inc., |
26723 | 20 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
21 */ | |
20008
fa122b7c71c6
Add copyright notice and vim/emacs comments to libass and vf_ass.c.
eugeni
parents:
19405
diff
changeset
|
22 |
18937 | 23 #include "config.h" |
24 | |
25 #include <stdlib.h> | |
19405 | 26 #include <inttypes.h> |
26034 | 27 #include <ft2build.h> |
28 #include FT_GLYPH_H | |
18937 | 29 |
21026
d138463e820b
Collect all includes of mplayer headers in libass in a single file (mputils.h).
eugeni
parents:
20629
diff
changeset
|
30 #include "mputils.h" |
18937 | 31 #include "ass_utils.h" |
32 | |
28718 | 33 int mystrtoi(char** p, int* res) |
18937 | 34 { |
28717
7bbe6626f0e0
Support fractional arguments for some override tags.
eugeni
parents:
26738
diff
changeset
|
35 // NOTE: base argument is ignored, but not used in libass anyway |
7bbe6626f0e0
Support fractional arguments for some override tags.
eugeni
parents:
26738
diff
changeset
|
36 double temp_res; |
18937 | 37 char* start = *p; |
28717
7bbe6626f0e0
Support fractional arguments for some override tags.
eugeni
parents:
26738
diff
changeset
|
38 temp_res = strtod(*p, p); |
7bbe6626f0e0
Support fractional arguments for some override tags.
eugeni
parents:
26738
diff
changeset
|
39 *res = (int) (temp_res + 0.5); |
7bbe6626f0e0
Support fractional arguments for some override tags.
eugeni
parents:
26738
diff
changeset
|
40 if (*p != start) return 1; |
7bbe6626f0e0
Support fractional arguments for some override tags.
eugeni
parents:
26738
diff
changeset
|
41 else return 0; |
7bbe6626f0e0
Support fractional arguments for some override tags.
eugeni
parents:
26738
diff
changeset
|
42 } |
7bbe6626f0e0
Support fractional arguments for some override tags.
eugeni
parents:
26738
diff
changeset
|
43 |
28718 | 44 int mystrtoll(char** p, long long* res) |
28717
7bbe6626f0e0
Support fractional arguments for some override tags.
eugeni
parents:
26738
diff
changeset
|
45 { |
7bbe6626f0e0
Support fractional arguments for some override tags.
eugeni
parents:
26738
diff
changeset
|
46 double temp_res; |
7bbe6626f0e0
Support fractional arguments for some override tags.
eugeni
parents:
26738
diff
changeset
|
47 char* start = *p; |
7bbe6626f0e0
Support fractional arguments for some override tags.
eugeni
parents:
26738
diff
changeset
|
48 temp_res = strtod(*p, p); |
7bbe6626f0e0
Support fractional arguments for some override tags.
eugeni
parents:
26738
diff
changeset
|
49 *res = (long long) (temp_res + 0.5); |
18937 | 50 if (*p != start) return 1; |
51 else return 0; | |
52 } | |
53 | |
54 int mystrtou32(char** p, int base, uint32_t* res) | |
55 { | |
56 char* start = *p; | |
57 *res = strtoll(*p, p, base); | |
58 if (*p != start) return 1; | |
59 else return 0; | |
60 } | |
61 | |
62 int mystrtod(char** p, double* res) | |
63 { | |
64 char* start = *p; | |
65 *res = strtod(*p, p); | |
66 if (*p != start) return 1; | |
67 else return 0; | |
68 } | |
69 | |
70 int strtocolor(char** q, uint32_t* res) | |
71 { | |
72 uint32_t color = 0; | |
73 int result; | |
74 char* p = *q; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28785
diff
changeset
|
75 |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28785
diff
changeset
|
76 if (*p == '&') ++p; |
20629
e8885ec63928
Introduce MSGT_ASS, use it for all libass messages.
eugeni
parents:
20503
diff
changeset
|
77 else mp_msg(MSGT_ASS, MSGL_DBG2, "suspicious color format: \"%s\"\n", p); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28785
diff
changeset
|
78 |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28785
diff
changeset
|
79 if (*p == 'H' || *p == 'h') { |
18937 | 80 ++p; |
81 result = mystrtou32(&p, 16, &color); | |
82 } else { | |
19003 | 83 result = mystrtou32(&p, 0, &color); |
18937 | 84 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28785
diff
changeset
|
85 |
18937 | 86 { |
87 unsigned char* tmp = (unsigned char*)(&color); | |
88 unsigned char b; | |
89 b = tmp[0]; tmp[0] = tmp[3]; tmp[3] = b; | |
90 b = tmp[1]; tmp[1] = tmp[2]; tmp[2] = b; | |
91 } | |
92 if (*p == '&') ++p; | |
93 *q = p; | |
94 | |
95 *res = color; | |
96 return result; | |
97 } | |
98 | |
28785 | 99 // Return a boolean value for a string |
100 char parse_bool(char* str) { | |
101 while (*str == ' ' || *str == '\t') | |
102 str++; | |
103 if (!strncasecmp(str, "yes", 3)) | |
104 return 1; | |
105 else if (strtol(str, NULL, 10) > 0) | |
106 return 1; | |
107 return 0; | |
108 } | |
109 | |
26036
8d8c52a169ad
Comment out dump_glyph(): it is unused and, as it is now, breaks compilation.
eugeni
parents:
26034
diff
changeset
|
110 #if 0 |
26034 | 111 static void sprint_tag(uint32_t tag, char* dst) |
112 { | |
113 dst[0] = (tag >> 24) & 0xFF; | |
114 dst[1] = (tag >> 16) & 0xFF; | |
115 dst[2] = (tag >> 8) & 0xFF; | |
116 dst[3] = tag & 0xFF; | |
117 dst[4] = 0; | |
118 } | |
119 | |
120 void dump_glyph(FT_Glyph g) | |
121 { | |
122 char tag[5]; | |
123 int i; | |
124 FT_OutlineGlyph og = (FT_OutlineGlyph)g; | |
125 FT_Outline* o = &(og->outline); | |
126 sprint_tag(g->format, tag); | |
127 printf("glyph: %p \n", g); | |
128 printf("format: %s \n", tag); | |
129 printf("outline: %p \n", o); | |
130 printf("contours: %d, points: %d, points ptr: %p \n", o->n_contours, o->n_points, o->points); | |
131 for (i = 0; i < o->n_points; ++i) { | |
132 printf(" point %f, %f \n", d6_to_double(o->points[i].x), d6_to_double(o->points[i].y)); | |
133 } | |
134 } | |
26036
8d8c52a169ad
Comment out dump_glyph(): it is unused and, as it is now, breaks compilation.
eugeni
parents:
26034
diff
changeset
|
135 #endif |