annotate libass/ass_library.c @ 25661:293aeec83153

Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with an almost-trivial implementation. This allows making the builtin codec structs const, and it also makes clearer that this "selected" status is not used outside the init functions.
author reimar
date Sat, 12 Jan 2008 14:05:46 +0000
parents a09381e1a325
children 0f892cd714b2
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
20477
de4a66d99f41 Libass interface reworked:
eugeni
parents:
diff changeset
1 // -*- c-basic-offset: 8; indent-tabs-mode: t -*-
de4a66d99f41 Libass interface reworked:
eugeni
parents:
diff changeset
2 // vim:ts=8:sw=8:noet:ai:
de4a66d99f41 Libass interface reworked:
eugeni
parents:
diff changeset
3 /*
de4a66d99f41 Libass interface reworked:
eugeni
parents:
diff changeset
4 Copyright (C) 2006 Evgeniy Stepanov <eugeni.stepanov@gmail.com>
de4a66d99f41 Libass interface reworked:
eugeni
parents:
diff changeset
5
de4a66d99f41 Libass interface reworked:
eugeni
parents:
diff changeset
6 This program is free software; you can redistribute it and/or modify
de4a66d99f41 Libass interface reworked:
eugeni
parents:
diff changeset
7 it under the terms of the GNU General Public License as published by
de4a66d99f41 Libass interface reworked:
eugeni
parents:
diff changeset
8 the Free Software Foundation; either version 2 of the License, or
de4a66d99f41 Libass interface reworked:
eugeni
parents:
diff changeset
9 (at your option) any later version.
de4a66d99f41 Libass interface reworked:
eugeni
parents:
diff changeset
10
de4a66d99f41 Libass interface reworked:
eugeni
parents:
diff changeset
11 This program is distributed in the hope that it will be useful,
de4a66d99f41 Libass interface reworked:
eugeni
parents:
diff changeset
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
de4a66d99f41 Libass interface reworked:
eugeni
parents:
diff changeset
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
de4a66d99f41 Libass interface reworked:
eugeni
parents:
diff changeset
14 GNU General Public License for more details.
de4a66d99f41 Libass interface reworked:
eugeni
parents:
diff changeset
15
de4a66d99f41 Libass interface reworked:
eugeni
parents:
diff changeset
16 You should have received a copy of the GNU General Public License
de4a66d99f41 Libass interface reworked:
eugeni
parents:
diff changeset
17 along with this program; if not, write to the Free Software
de4a66d99f41 Libass interface reworked:
eugeni
parents:
diff changeset
18 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
de4a66d99f41 Libass interface reworked:
eugeni
parents:
diff changeset
19 */
de4a66d99f41 Libass interface reworked:
eugeni
parents:
diff changeset
20
de4a66d99f41 Libass interface reworked:
eugeni
parents:
diff changeset
21 #include <inttypes.h>
de4a66d99f41 Libass interface reworked:
eugeni
parents:
diff changeset
22 #include <stdio.h>
de4a66d99f41 Libass interface reworked:
eugeni
parents:
diff changeset
23 #include <stdlib.h>
de4a66d99f41 Libass interface reworked:
eugeni
parents:
diff changeset
24 #include <string.h>
de4a66d99f41 Libass interface reworked:
eugeni
parents:
diff changeset
25
de4a66d99f41 Libass interface reworked:
eugeni
parents:
diff changeset
26 #include "ass.h"
de4a66d99f41 Libass interface reworked:
eugeni
parents:
diff changeset
27 #include "ass_library.h"
de4a66d99f41 Libass interface reworked:
eugeni
parents:
diff changeset
28
de4a66d99f41 Libass interface reworked:
eugeni
parents:
diff changeset
29
de4a66d99f41 Libass interface reworked:
eugeni
parents:
diff changeset
30 ass_library_t* ass_library_init(void)
de4a66d99f41 Libass interface reworked:
eugeni
parents:
diff changeset
31 {
de4a66d99f41 Libass interface reworked:
eugeni
parents:
diff changeset
32 return calloc(1, sizeof(ass_library_t));
de4a66d99f41 Libass interface reworked:
eugeni
parents:
diff changeset
33 }
de4a66d99f41 Libass interface reworked:
eugeni
parents:
diff changeset
34
de4a66d99f41 Libass interface reworked:
eugeni
parents:
diff changeset
35 void ass_library_done(ass_library_t* priv)
de4a66d99f41 Libass interface reworked:
eugeni
parents:
diff changeset
36 {
21497
4a4af5271542 Also free ass_library_t members in ass_library_done
reimar
parents: 21458
diff changeset
37 if (priv) {
4a4af5271542 Also free ass_library_t members in ass_library_done
reimar
parents: 21458
diff changeset
38 ass_set_fonts_dir(priv, NULL);
4a4af5271542 Also free ass_library_t members in ass_library_done
reimar
parents: 21458
diff changeset
39 ass_set_style_overrides(priv, NULL);
25613
f00333e3facf Copy font data to ass_library instead of referencing demuxer-owned memory.
eugeni
parents: 21497
diff changeset
40 ass_clear_fonts(priv);
21497
4a4af5271542 Also free ass_library_t members in ass_library_done
reimar
parents: 21458
diff changeset
41 free(priv);
4a4af5271542 Also free ass_library_t members in ass_library_done
reimar
parents: 21458
diff changeset
42 }
20477
de4a66d99f41 Libass interface reworked:
eugeni
parents:
diff changeset
43 }
de4a66d99f41 Libass interface reworked:
eugeni
parents:
diff changeset
44
de4a66d99f41 Libass interface reworked:
eugeni
parents:
diff changeset
45 void ass_set_fonts_dir(ass_library_t* priv, const char* fonts_dir)
de4a66d99f41 Libass interface reworked:
eugeni
parents:
diff changeset
46 {
de4a66d99f41 Libass interface reworked:
eugeni
parents:
diff changeset
47 if (priv->fonts_dir)
de4a66d99f41 Libass interface reworked:
eugeni
parents:
diff changeset
48 free(priv->fonts_dir);
de4a66d99f41 Libass interface reworked:
eugeni
parents:
diff changeset
49
de4a66d99f41 Libass interface reworked:
eugeni
parents:
diff changeset
50 priv->fonts_dir = fonts_dir ? strdup(fonts_dir) : 0;
de4a66d99f41 Libass interface reworked:
eugeni
parents:
diff changeset
51 }
de4a66d99f41 Libass interface reworked:
eugeni
parents:
diff changeset
52
de4a66d99f41 Libass interface reworked:
eugeni
parents:
diff changeset
53 void ass_set_extract_fonts(ass_library_t* priv, int extract)
de4a66d99f41 Libass interface reworked:
eugeni
parents:
diff changeset
54 {
de4a66d99f41 Libass interface reworked:
eugeni
parents:
diff changeset
55 priv->extract_fonts = !!extract;
de4a66d99f41 Libass interface reworked:
eugeni
parents:
diff changeset
56 }
de4a66d99f41 Libass interface reworked:
eugeni
parents:
diff changeset
57
de4a66d99f41 Libass interface reworked:
eugeni
parents:
diff changeset
58 void ass_set_style_overrides(ass_library_t* priv, char** list)
de4a66d99f41 Libass interface reworked:
eugeni
parents:
diff changeset
59 {
de4a66d99f41 Libass interface reworked:
eugeni
parents:
diff changeset
60 char** p;
de4a66d99f41 Libass interface reworked:
eugeni
parents:
diff changeset
61 char** q;
de4a66d99f41 Libass interface reworked:
eugeni
parents:
diff changeset
62 int cnt;
de4a66d99f41 Libass interface reworked:
eugeni
parents:
diff changeset
63
de4a66d99f41 Libass interface reworked:
eugeni
parents:
diff changeset
64 if (priv->style_overrides) {
de4a66d99f41 Libass interface reworked:
eugeni
parents:
diff changeset
65 for (p = priv->style_overrides; *p; ++p)
de4a66d99f41 Libass interface reworked:
eugeni
parents:
diff changeset
66 free(*p);
de4a66d99f41 Libass interface reworked:
eugeni
parents:
diff changeset
67 free(priv->style_overrides);
de4a66d99f41 Libass interface reworked:
eugeni
parents:
diff changeset
68 }
de4a66d99f41 Libass interface reworked:
eugeni
parents:
diff changeset
69
de4a66d99f41 Libass interface reworked:
eugeni
parents:
diff changeset
70 if (!list) return;
de4a66d99f41 Libass interface reworked:
eugeni
parents:
diff changeset
71
de4a66d99f41 Libass interface reworked:
eugeni
parents:
diff changeset
72 for (p = list, cnt = 0; *p; ++p, ++cnt) {}
de4a66d99f41 Libass interface reworked:
eugeni
parents:
diff changeset
73
20722
2edba6772316 Bugfix: when copying ass_force_style_list, ending 0 was left out.
eugeni
parents: 20477
diff changeset
74 priv->style_overrides = malloc((cnt + 1) * sizeof(char*));
20477
de4a66d99f41 Libass interface reworked:
eugeni
parents:
diff changeset
75 for (p = list, q = priv->style_overrides; *p; ++p, ++q)
de4a66d99f41 Libass interface reworked:
eugeni
parents:
diff changeset
76 *q = strdup(*p);
20722
2edba6772316 Bugfix: when copying ass_force_style_list, ending 0 was left out.
eugeni
parents: 20477
diff changeset
77 priv->style_overrides[cnt] = NULL;
20477
de4a66d99f41 Libass interface reworked:
eugeni
parents:
diff changeset
78 }
21458
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 20722
diff changeset
79
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 20722
diff changeset
80 static void grow_array(void **array, int nelem, size_t elsize)
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 20722
diff changeset
81 {
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 20722
diff changeset
82 if (!(nelem & 31))
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 20722
diff changeset
83 *array = realloc(*array, (nelem + 32) * elsize);
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 20722
diff changeset
84 }
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 20722
diff changeset
85
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 20722
diff changeset
86 void ass_add_font(ass_library_t* priv, char* name, char* data, int size)
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 20722
diff changeset
87 {
25613
f00333e3facf Copy font data to ass_library instead of referencing demuxer-owned memory.
eugeni
parents: 21497
diff changeset
88 int idx = priv->num_fontdata;
f00333e3facf Copy font data to ass_library instead of referencing demuxer-owned memory.
eugeni
parents: 21497
diff changeset
89 if (!name || !data || !size)
f00333e3facf Copy font data to ass_library instead of referencing demuxer-owned memory.
eugeni
parents: 21497
diff changeset
90 return;
21458
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 20722
diff changeset
91 grow_array((void**)&priv->fontdata, priv->num_fontdata, sizeof(*priv->fontdata));
25613
f00333e3facf Copy font data to ass_library instead of referencing demuxer-owned memory.
eugeni
parents: 21497
diff changeset
92
25616
042b545d588e No need to reinvent strdup...
eugeni
parents: 25613
diff changeset
93 priv->fontdata[idx].name = strdup(name);
25613
f00333e3facf Copy font data to ass_library instead of referencing demuxer-owned memory.
eugeni
parents: 21497
diff changeset
94
f00333e3facf Copy font data to ass_library instead of referencing demuxer-owned memory.
eugeni
parents: 21497
diff changeset
95 priv->fontdata[idx].data = malloc(size);
f00333e3facf Copy font data to ass_library instead of referencing demuxer-owned memory.
eugeni
parents: 21497
diff changeset
96 memcpy(priv->fontdata[idx].data, data, size);
f00333e3facf Copy font data to ass_library instead of referencing demuxer-owned memory.
eugeni
parents: 21497
diff changeset
97
f00333e3facf Copy font data to ass_library instead of referencing demuxer-owned memory.
eugeni
parents: 21497
diff changeset
98 priv->fontdata[idx].size = size;
f00333e3facf Copy font data to ass_library instead of referencing demuxer-owned memory.
eugeni
parents: 21497
diff changeset
99
21458
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 20722
diff changeset
100 priv->num_fontdata ++;
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 20722
diff changeset
101 }
7af6c25a0cfc Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents: 20722
diff changeset
102
25613
f00333e3facf Copy font data to ass_library instead of referencing demuxer-owned memory.
eugeni
parents: 21497
diff changeset
103 void ass_clear_fonts(ass_library_t* priv)
f00333e3facf Copy font data to ass_library instead of referencing demuxer-owned memory.
eugeni
parents: 21497
diff changeset
104 {
f00333e3facf Copy font data to ass_library instead of referencing demuxer-owned memory.
eugeni
parents: 21497
diff changeset
105 int i;
f00333e3facf Copy font data to ass_library instead of referencing demuxer-owned memory.
eugeni
parents: 21497
diff changeset
106 for (i = 0; i < priv->num_fontdata; ++i) {
f00333e3facf Copy font data to ass_library instead of referencing demuxer-owned memory.
eugeni
parents: 21497
diff changeset
107 free(priv->fontdata[i].name);
f00333e3facf Copy font data to ass_library instead of referencing demuxer-owned memory.
eugeni
parents: 21497
diff changeset
108 free(priv->fontdata[i].data);
f00333e3facf Copy font data to ass_library instead of referencing demuxer-owned memory.
eugeni
parents: 21497
diff changeset
109 }
25621
a09381e1a325 Fix ass_clear_fonts not deallocating fontdata.
eugeni
parents: 25616
diff changeset
110 free(priv->fontdata);
a09381e1a325 Fix ass_clear_fonts not deallocating fontdata.
eugeni
parents: 25616
diff changeset
111 priv->fontdata = NULL;
a09381e1a325 Fix ass_clear_fonts not deallocating fontdata.
eugeni
parents: 25616
diff changeset
112 priv->num_fontdata = 0;
25613
f00333e3facf Copy font data to ass_library instead of referencing demuxer-owned memory.
eugeni
parents: 21497
diff changeset
113 }