Mercurial > mplayer.hg
annotate sub/vobsub.c @ 33259:04dc3e55cd90
Increase the maximum value of the DVB timeout to 240 seconds.
Some devices may need more time for the initial tune (e.g. firmware loading).
Let the user specify higher timeout value if there is need to.
The default remains 30 seconds.
author | iive |
---|---|
date | Sun, 01 May 2011 18:07:59 +0000 |
parents | aa82dfc7bd49 |
children | 45e772bf4d6a |
rev | line source |
---|---|
32459
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1 /* |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
2 * Some code freely inspired from VobSub <URL:http://vobsub.edensrising.com>, |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
3 * with kind permission from Gabest <gabest@freemail.hu> |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
4 * |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
5 * This file is part of MPlayer. |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
6 * |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
7 * MPlayer is free software; you can redistribute it and/or modify |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
8 * it under the terms of the GNU General Public License as published by |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
9 * the Free Software Foundation; either version 2 of the License, or |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
10 * (at your option) any later version. |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
11 * |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
12 * MPlayer is distributed in the hope that it will be useful, |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
15 * GNU General Public License for more details. |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
16 * |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
17 * You should have received a copy of the GNU General Public License along |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
18 * with MPlayer; if not, write to the Free Software Foundation, Inc., |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
19 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
20 */ |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
21 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
22 #include <ctype.h> |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
23 #include <errno.h> |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
24 #include <limits.h> |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
25 #include <stddef.h> |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
26 #include <stdio.h> |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
27 #include <stdlib.h> |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
28 #include <string.h> |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
29 #include <fcntl.h> |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
30 #include <unistd.h> |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
31 #include <sys/stat.h> |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
32 #include <sys/types.h> |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
33 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
34 #include "config.h" |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
35 #include "mpcommon.h" |
32464
22888a8cb312
Do not use a path for including files in the same directory.
reimar
parents:
32459
diff
changeset
|
36 #include "vobsub.h" |
22888a8cb312
Do not use a path for including files in the same directory.
reimar
parents:
32459
diff
changeset
|
37 #include "spudec.h" |
32459
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
38 #include "mp_msg.h" |
32588 | 39 #include "path.h" |
32464
22888a8cb312
Do not use a path for including files in the same directory.
reimar
parents:
32459
diff
changeset
|
40 #include "unrar_exec.h" |
32459
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
41 #include "libavutil/common.h" |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
42 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
43 // Record the original -vobsubid set by commandline, since vobsub_id will be |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
44 // overridden if slang match any of vobsub streams. |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
45 static int vobsubid = -2; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
46 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
47 /********************************************************************** |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
48 * RAR stream handling |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
49 * The RAR file must have the same basename as the file to open |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
50 **********************************************************************/ |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
51 #ifdef CONFIG_UNRAR_EXEC |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
52 typedef struct { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
53 FILE *file; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
54 unsigned char *data; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
55 unsigned long size; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
56 unsigned long pos; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
57 } rar_stream_t; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
58 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
59 static rar_stream_t *rar_open(const char *const filename, |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
60 const char *const mode) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
61 { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
62 rar_stream_t *stream; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
63 /* unrar_exec can only read */ |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
64 if (strcmp("r", mode) && strcmp("rb", mode)) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
65 errno = EINVAL; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
66 return NULL; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
67 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
68 stream = malloc(sizeof(rar_stream_t)); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
69 if (stream == NULL) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
70 return NULL; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
71 /* first try normal access */ |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
72 stream->file = fopen(filename, mode); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
73 if (stream->file == NULL) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
74 char *rar_filename; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
75 const char *p; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
76 int rc; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
77 /* Guess the RAR archive filename */ |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
78 rar_filename = NULL; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
79 p = strrchr(filename, '.'); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
80 if (p) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
81 ptrdiff_t l = p - filename; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
82 rar_filename = malloc(l + 5); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
83 if (rar_filename == NULL) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
84 free(stream); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
85 return NULL; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
86 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
87 strncpy(rar_filename, filename, l); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
88 strcpy(rar_filename + l, ".rar"); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
89 } else { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
90 rar_filename = malloc(strlen(filename) + 5); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
91 if (rar_filename == NULL) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
92 free(stream); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
93 return NULL; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
94 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
95 strcpy(rar_filename, filename); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
96 strcat(rar_filename, ".rar"); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
97 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
98 /* get rid of the path if there is any */ |
32588 | 99 p = mp_basename(filename); |
32459
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
100 rc = unrar_exec_get(&stream->data, &stream->size, p, rar_filename); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
101 if (!rc) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
102 /* There is no matching filename in the archive. However, sometimes |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
103 * the files we are looking for have been given arbitrary names in the archive. |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
104 * Let's look for a file with an exact match in the extension only. */ |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
105 int i, num_files, name_len; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
106 ArchiveList_struct *list, *lp; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
107 num_files = unrar_exec_list(rar_filename, &list); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
108 if (num_files > 0) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
109 char *demanded_ext; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
110 demanded_ext = strrchr (p, '.'); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
111 if (demanded_ext) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
112 int demanded_ext_len = strlen (demanded_ext); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
113 for (i = 0, lp = list; i < num_files; i++, lp = lp->next) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
114 name_len = strlen (lp->item.Name); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
115 if (name_len >= demanded_ext_len && !strcasecmp (lp->item.Name + name_len - demanded_ext_len, demanded_ext)) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
116 rc = unrar_exec_get(&stream->data, &stream->size, |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
117 lp->item.Name, rar_filename); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
118 if (rc) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
119 break; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
120 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
121 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
122 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
123 unrar_exec_freelist(list); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
124 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
125 if (!rc) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
126 free(rar_filename); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
127 free(stream); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
128 return NULL; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
129 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
130 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
131 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
132 free(rar_filename); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
133 stream->pos = 0; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
134 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
135 return stream; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
136 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
137 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
138 static int rar_close(rar_stream_t *stream) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
139 { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
140 if (stream->file) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
141 return fclose(stream->file); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
142 free(stream->data); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
143 return 0; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
144 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
145 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
146 static int rar_eof(rar_stream_t *stream) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
147 { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
148 if (stream->file) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
149 return feof(stream->file); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
150 return stream->pos >= stream->size; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
151 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
152 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
153 static long rar_tell(rar_stream_t *stream) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
154 { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
155 if (stream->file) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
156 return ftell(stream->file); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
157 return stream->pos; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
158 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
159 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
160 static int rar_seek(rar_stream_t *stream, long offset, int whence) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
161 { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
162 if (stream->file) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
163 return fseek(stream->file, offset, whence); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
164 switch (whence) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
165 case SEEK_SET: |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
166 if (offset < 0) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
167 errno = EINVAL; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
168 return -1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
169 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
170 stream->pos = offset; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
171 break; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
172 case SEEK_CUR: |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
173 if (offset < 0 && stream->pos < (unsigned long) -offset) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
174 errno = EINVAL; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
175 return -1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
176 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
177 stream->pos += offset; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
178 break; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
179 case SEEK_END: |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
180 if (offset < 0 && stream->size < (unsigned long) -offset) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
181 errno = EINVAL; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
182 return -1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
183 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
184 stream->pos = stream->size + offset; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
185 break; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
186 default: |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
187 errno = EINVAL; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
188 return -1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
189 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
190 return 0; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
191 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
192 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
193 static int rar_getc(rar_stream_t *stream) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
194 { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
195 if (stream->file) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
196 return getc(stream->file); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
197 if (rar_eof(stream)) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
198 return EOF; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
199 return stream->data[stream->pos++]; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
200 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
201 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
202 static size_t rar_read(void *ptr, size_t size, size_t nmemb, |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
203 rar_stream_t *stream) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
204 { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
205 size_t res; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
206 unsigned long remain; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
207 if (stream->file) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
208 return fread(ptr, size, nmemb, stream->file); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
209 if (rar_eof(stream)) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
210 return 0; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
211 res = size * nmemb; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
212 remain = stream->size - stream->pos; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
213 if (res > remain) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
214 res = remain / size * size; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
215 memcpy(ptr, stream->data + stream->pos, res); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
216 stream->pos += res; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
217 res /= size; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
218 return res; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
219 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
220 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
221 #else |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
222 typedef FILE rar_stream_t; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
223 #define rar_open fopen |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
224 #define rar_close fclose |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
225 #define rar_eof feof |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
226 #define rar_tell ftell |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
227 #define rar_seek fseek |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
228 #define rar_getc getc |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
229 #define rar_read fread |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
230 #endif |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
231 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
232 /**********************************************************************/ |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
233 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
234 static ssize_t vobsub_getline(char **lineptr, size_t *n, rar_stream_t *stream) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
235 { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
236 size_t res = 0; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
237 int c; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
238 if (*lineptr == NULL) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
239 *lineptr = malloc(4096); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
240 if (*lineptr) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
241 *n = 4096; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
242 } else if (*n == 0) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
243 char *tmp = realloc(*lineptr, 4096); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
244 if (tmp) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
245 *lineptr = tmp; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
246 *n = 4096; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
247 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
248 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
249 if (*lineptr == NULL || *n == 0) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
250 return -1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
251 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
252 for (c = rar_getc(stream); c != EOF; c = rar_getc(stream)) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
253 if (res + 1 >= *n) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
254 char *tmp = realloc(*lineptr, *n * 2); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
255 if (tmp == NULL) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
256 return -1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
257 *lineptr = tmp; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
258 *n *= 2; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
259 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
260 (*lineptr)[res++] = c; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
261 if (c == '\n') { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
262 (*lineptr)[res] = 0; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
263 return res; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
264 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
265 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
266 if (res == 0) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
267 return -1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
268 (*lineptr)[res] = 0; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
269 return res; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
270 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
271 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
272 /********************************************************************** |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
273 * MPEG parsing |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
274 **********************************************************************/ |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
275 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
276 typedef struct { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
277 rar_stream_t *stream; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
278 unsigned int pts; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
279 int aid; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
280 unsigned char *packet; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
281 unsigned int packet_reserve; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
282 unsigned int packet_size; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
283 int padding_was_here; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
284 int merge; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
285 } mpeg_t; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
286 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
287 static mpeg_t *mpeg_open(const char *filename) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
288 { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
289 mpeg_t *res = malloc(sizeof(mpeg_t)); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
290 int err = res == NULL; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
291 if (!err) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
292 res->pts = 0; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
293 res->aid = -1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
294 res->packet = NULL; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
295 res->packet_size = 0; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
296 res->packet_reserve = 0; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
297 res->padding_was_here = 1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
298 res->merge = 0; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
299 res->stream = rar_open(filename, "rb"); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
300 err = res->stream == NULL; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
301 if (err) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
302 perror("fopen Vobsub file failed"); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
303 if (err) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
304 free(res); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
305 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
306 return err ? NULL : res; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
307 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
308 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
309 static void mpeg_free(mpeg_t *mpeg) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
310 { |
32511
b39155e98ac3
Remove some useless NULL pointer checks before invoking free() on the pointer.
diego
parents:
32464
diff
changeset
|
311 free(mpeg->packet); |
32459
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
312 if (mpeg->stream) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
313 rar_close(mpeg->stream); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
314 free(mpeg); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
315 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
316 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
317 static int mpeg_eof(mpeg_t *mpeg) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
318 { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
319 return rar_eof(mpeg->stream); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
320 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
321 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
322 static off_t mpeg_tell(mpeg_t *mpeg) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
323 { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
324 return rar_tell(mpeg->stream); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
325 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
326 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
327 static int mpeg_run(mpeg_t *mpeg) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
328 { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
329 unsigned int len, idx, version; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
330 int c; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
331 /* Goto start of a packet, it starts with 0x000001?? */ |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
332 const unsigned char wanted[] = { 0, 0, 1 }; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
333 unsigned char buf[5]; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
334 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
335 mpeg->aid = -1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
336 mpeg->packet_size = 0; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
337 if (rar_read(buf, 4, 1, mpeg->stream) != 1) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
338 return -1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
339 while (memcmp(buf, wanted, sizeof(wanted)) != 0) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
340 c = rar_getc(mpeg->stream); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
341 if (c < 0) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
342 return -1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
343 memmove(buf, buf + 1, 3); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
344 buf[3] = c; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
345 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
346 switch (buf[3]) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
347 case 0xb9: /* System End Code */ |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
348 break; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
349 case 0xba: /* Packet start code */ |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
350 c = rar_getc(mpeg->stream); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
351 if (c < 0) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
352 return -1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
353 if ((c & 0xc0) == 0x40) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
354 version = 4; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
355 else if ((c & 0xf0) == 0x20) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
356 version = 2; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
357 else { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
358 mp_msg(MSGT_VOBSUB, MSGL_ERR, "VobSub: Unsupported MPEG version: 0x%02x\n", c); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
359 return -1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
360 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
361 if (version == 4) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
362 if (rar_seek(mpeg->stream, 9, SEEK_CUR)) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
363 return -1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
364 } else if (version == 2) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
365 if (rar_seek(mpeg->stream, 7, SEEK_CUR)) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
366 return -1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
367 } else |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
368 abort(); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
369 if (!mpeg->padding_was_here) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
370 mpeg->merge = 1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
371 break; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
372 case 0xbd: /* packet */ |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
373 if (rar_read(buf, 2, 1, mpeg->stream) != 1) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
374 return -1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
375 mpeg->padding_was_here = 0; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
376 len = buf[0] << 8 | buf[1]; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
377 idx = mpeg_tell(mpeg); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
378 c = rar_getc(mpeg->stream); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
379 if (c < 0) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
380 return -1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
381 if ((c & 0xC0) == 0x40) { /* skip STD scale & size */ |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
382 if (rar_getc(mpeg->stream) < 0) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
383 return -1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
384 c = rar_getc(mpeg->stream); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
385 if (c < 0) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
386 return -1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
387 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
388 if ((c & 0xf0) == 0x20) { /* System-1 stream timestamp */ |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
389 /* Do we need this? */ |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
390 abort(); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
391 } else if ((c & 0xf0) == 0x30) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
392 /* Do we need this? */ |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
393 abort(); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
394 } else if ((c & 0xc0) == 0x80) { /* System-2 (.VOB) stream */ |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
395 unsigned int pts_flags, hdrlen, dataidx; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
396 c = rar_getc(mpeg->stream); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
397 if (c < 0) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
398 return -1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
399 pts_flags = c; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
400 c = rar_getc(mpeg->stream); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
401 if (c < 0) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
402 return -1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
403 hdrlen = c; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
404 dataidx = mpeg_tell(mpeg) + hdrlen; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
405 if (dataidx > idx + len) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
406 mp_msg(MSGT_VOBSUB, MSGL_ERR, "Invalid header length: %d (total length: %d, idx: %d, dataidx: %d)\n", |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
407 hdrlen, len, idx, dataidx); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
408 return -1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
409 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
410 if ((pts_flags & 0xc0) == 0x80) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
411 if (rar_read(buf, 5, 1, mpeg->stream) != 1) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
412 return -1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
413 if (!(((buf[0] & 0xf0) == 0x20) && (buf[0] & 1) && (buf[2] & 1) && (buf[4] & 1))) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
414 mp_msg(MSGT_VOBSUB, MSGL_ERR, "vobsub PTS error: 0x%02x %02x%02x %02x%02x \n", |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
415 buf[0], buf[1], buf[2], buf[3], buf[4]); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
416 mpeg->pts = 0; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
417 } else |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
418 mpeg->pts = ((buf[0] & 0x0e) << 29 | buf[1] << 22 | (buf[2] & 0xfe) << 14 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
419 | buf[3] << 7 | (buf[4] >> 1)); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
420 } else /* if ((pts_flags & 0xc0) == 0xc0) */ { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
421 /* what's this? */ |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
422 /* abort(); */ |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
423 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
424 rar_seek(mpeg->stream, dataidx, SEEK_SET); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
425 mpeg->aid = rar_getc(mpeg->stream); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
426 if (mpeg->aid < 0) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
427 mp_msg(MSGT_VOBSUB, MSGL_ERR, "Bogus aid %d\n", mpeg->aid); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
428 return -1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
429 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
430 mpeg->packet_size = len - ((unsigned int) mpeg_tell(mpeg) - idx); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
431 if (mpeg->packet_reserve < mpeg->packet_size) { |
32511
b39155e98ac3
Remove some useless NULL pointer checks before invoking free() on the pointer.
diego
parents:
32464
diff
changeset
|
432 free(mpeg->packet); |
32459
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
433 mpeg->packet = malloc(mpeg->packet_size); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
434 if (mpeg->packet) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
435 mpeg->packet_reserve = mpeg->packet_size; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
436 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
437 if (mpeg->packet == NULL) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
438 mp_msg(MSGT_VOBSUB, MSGL_FATAL, "malloc failure"); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
439 mpeg->packet_reserve = 0; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
440 mpeg->packet_size = 0; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
441 return -1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
442 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
443 if (rar_read(mpeg->packet, mpeg->packet_size, 1, mpeg->stream) != 1) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
444 mp_msg(MSGT_VOBSUB, MSGL_ERR, "fread failure"); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
445 mpeg->packet_size = 0; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
446 return -1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
447 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
448 idx = len; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
449 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
450 break; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
451 case 0xbe: /* Padding */ |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
452 if (rar_read(buf, 2, 1, mpeg->stream) != 1) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
453 return -1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
454 len = buf[0] << 8 | buf[1]; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
455 if (len > 0 && rar_seek(mpeg->stream, len, SEEK_CUR)) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
456 return -1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
457 mpeg->padding_was_here = 1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
458 break; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
459 default: |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
460 if (0xc0 <= buf[3] && buf[3] < 0xf0) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
461 /* MPEG audio or video */ |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
462 if (rar_read(buf, 2, 1, mpeg->stream) != 1) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
463 return -1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
464 len = buf[0] << 8 | buf[1]; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
465 if (len > 0 && rar_seek(mpeg->stream, len, SEEK_CUR)) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
466 return -1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
467 } else { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
468 mp_msg(MSGT_VOBSUB, MSGL_ERR, "unknown header 0x%02X%02X%02X%02X\n", |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
469 buf[0], buf[1], buf[2], buf[3]); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
470 return -1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
471 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
472 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
473 return 0; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
474 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
475 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
476 /********************************************************************** |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
477 * Packet queue |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
478 **********************************************************************/ |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
479 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
480 typedef struct { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
481 unsigned int pts100; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
482 off_t filepos; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
483 unsigned int size; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
484 unsigned char *data; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
485 } packet_t; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
486 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
487 typedef struct { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
488 char *id; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
489 packet_t *packets; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
490 unsigned int packets_reserve; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
491 unsigned int packets_size; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
492 unsigned int current_index; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
493 } packet_queue_t; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
494 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
495 static void packet_construct(packet_t *pkt) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
496 { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
497 pkt->pts100 = 0; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
498 pkt->filepos = 0; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
499 pkt->size = 0; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
500 pkt->data = NULL; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
501 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
502 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
503 static void packet_destroy(packet_t *pkt) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
504 { |
32511
b39155e98ac3
Remove some useless NULL pointer checks before invoking free() on the pointer.
diego
parents:
32464
diff
changeset
|
505 free(pkt->data); |
32459
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
506 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
507 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
508 static void packet_queue_construct(packet_queue_t *queue) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
509 { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
510 queue->id = NULL; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
511 queue->packets = NULL; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
512 queue->packets_reserve = 0; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
513 queue->packets_size = 0; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
514 queue->current_index = 0; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
515 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
516 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
517 static void packet_queue_destroy(packet_queue_t *queue) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
518 { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
519 if (queue->packets) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
520 while (queue->packets_size--) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
521 packet_destroy(queue->packets + queue->packets_size); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
522 free(queue->packets); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
523 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
524 return; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
525 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
526 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
527 /* Make sure there is enough room for needed_size packets in the |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
528 packet queue. */ |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
529 static int packet_queue_ensure(packet_queue_t *queue, unsigned int needed_size) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
530 { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
531 if (queue->packets_reserve < needed_size) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
532 if (queue->packets) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
533 packet_t *tmp = realloc(queue->packets, 2 * queue->packets_reserve * sizeof(packet_t)); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
534 if (tmp == NULL) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
535 mp_msg(MSGT_VOBSUB, MSGL_FATAL, "realloc failure"); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
536 return -1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
537 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
538 queue->packets = tmp; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
539 queue->packets_reserve *= 2; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
540 } else { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
541 queue->packets = malloc(sizeof(packet_t)); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
542 if (queue->packets == NULL) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
543 mp_msg(MSGT_VOBSUB, MSGL_FATAL, "malloc failure"); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
544 return -1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
545 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
546 queue->packets_reserve = 1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
547 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
548 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
549 return 0; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
550 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
551 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
552 /* add one more packet */ |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
553 static int packet_queue_grow(packet_queue_t *queue) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
554 { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
555 if (packet_queue_ensure(queue, queue->packets_size + 1) < 0) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
556 return -1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
557 packet_construct(queue->packets + queue->packets_size); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
558 ++queue->packets_size; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
559 return 0; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
560 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
561 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
562 /* insert a new packet, duplicating pts from the current one */ |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
563 static int packet_queue_insert(packet_queue_t *queue) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
564 { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
565 packet_t *pkts; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
566 if (packet_queue_ensure(queue, queue->packets_size + 1) < 0) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
567 return -1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
568 /* XXX packet_size does not reflect the real thing here, it will be updated a bit later */ |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
569 memmove(queue->packets + queue->current_index + 2, |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
570 queue->packets + queue->current_index + 1, |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
571 sizeof(packet_t) * (queue->packets_size - queue->current_index - 1)); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
572 pkts = queue->packets + queue->current_index; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
573 ++queue->packets_size; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
574 ++queue->current_index; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
575 packet_construct(pkts + 1); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
576 pkts[1].pts100 = pkts[0].pts100; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
577 pkts[1].filepos = pkts[0].filepos; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
578 return 0; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
579 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
580 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
581 /********************************************************************** |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
582 * Vobsub |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
583 **********************************************************************/ |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
584 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
585 typedef struct { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
586 unsigned int palette[16]; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
587 int delay; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
588 unsigned int have_palette; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
589 unsigned int orig_frame_width, orig_frame_height; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
590 unsigned int origin_x, origin_y; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
591 /* index */ |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
592 packet_queue_t *spu_streams; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
593 unsigned int spu_streams_size; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
594 unsigned int spu_streams_current; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
595 unsigned int spu_valid_streams_size; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
596 } vobsub_t; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
597 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
598 /* Make sure that the spu stream idx exists. */ |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
599 static int vobsub_ensure_spu_stream(vobsub_t *vob, unsigned int index) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
600 { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
601 if (index >= vob->spu_streams_size) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
602 /* This is a new stream */ |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
603 if (vob->spu_streams) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
604 packet_queue_t *tmp = realloc(vob->spu_streams, (index + 1) * sizeof(packet_queue_t)); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
605 if (tmp == NULL) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
606 mp_msg(MSGT_VOBSUB, MSGL_ERR, "vobsub_ensure_spu_stream: realloc failure"); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
607 return -1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
608 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
609 vob->spu_streams = tmp; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
610 } else { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
611 vob->spu_streams = malloc((index + 1) * sizeof(packet_queue_t)); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
612 if (vob->spu_streams == NULL) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
613 mp_msg(MSGT_VOBSUB, MSGL_ERR, "vobsub_ensure_spu_stream: malloc failure"); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
614 return -1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
615 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
616 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
617 while (vob->spu_streams_size <= index) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
618 packet_queue_construct(vob->spu_streams + vob->spu_streams_size); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
619 ++vob->spu_streams_size; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
620 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
621 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
622 return 0; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
623 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
624 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
625 static int vobsub_add_id(vobsub_t *vob, const char *id, size_t idlen, |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
626 const unsigned int index) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
627 { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
628 if (vobsub_ensure_spu_stream(vob, index) < 0) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
629 return -1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
630 if (id && idlen) { |
32511
b39155e98ac3
Remove some useless NULL pointer checks before invoking free() on the pointer.
diego
parents:
32464
diff
changeset
|
631 free(vob->spu_streams[index].id); |
32459
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
632 vob->spu_streams[index].id = malloc(idlen + 1); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
633 if (vob->spu_streams[index].id == NULL) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
634 mp_msg(MSGT_VOBSUB, MSGL_FATAL, "vobsub_add_id: malloc failure"); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
635 return -1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
636 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
637 vob->spu_streams[index].id[idlen] = 0; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
638 memcpy(vob->spu_streams[index].id, id, idlen); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
639 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
640 vob->spu_streams_current = index; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
641 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_VOBSUB_ID=%d\n", index); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
642 if (id && idlen) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
643 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_VSID_%d_LANG=%s\n", index, vob->spu_streams[index].id); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
644 mp_msg(MSGT_VOBSUB, MSGL_V, "[vobsub] subtitle (vobsubid): %d language %s\n", |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
645 index, vob->spu_streams[index].id); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
646 return 0; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
647 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
648 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
649 static int vobsub_add_timestamp(vobsub_t *vob, off_t filepos, int ms) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
650 { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
651 packet_queue_t *queue; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
652 packet_t *pkt; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
653 if (vob->spu_streams == 0) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
654 mp_msg(MSGT_VOBSUB, MSGL_WARN, "[vobsub] warning, binning some index entries. Check your index file\n"); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
655 return -1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
656 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
657 queue = vob->spu_streams + vob->spu_streams_current; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
658 if (packet_queue_grow(queue) >= 0) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
659 pkt = queue->packets + (queue->packets_size - 1); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
660 pkt->filepos = filepos; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
661 pkt->pts100 = ms < 0 ? UINT_MAX : (unsigned int)ms * 90; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
662 return 0; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
663 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
664 return -1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
665 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
666 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
667 static int vobsub_parse_id(vobsub_t *vob, const char *line) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
668 { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
669 // id: xx, index: n |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
670 size_t idlen; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
671 const char *p, *q; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
672 p = line; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
673 while (isspace(*p)) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
674 ++p; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
675 q = p; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
676 while (isalpha(*q)) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
677 ++q; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
678 idlen = q - p; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
679 if (idlen == 0) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
680 return -1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
681 ++q; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
682 while (isspace(*q)) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
683 ++q; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
684 if (strncmp("index:", q, 6)) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
685 return -1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
686 q += 6; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
687 while (isspace(*q)) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
688 ++q; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
689 if (!isdigit(*q)) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
690 return -1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
691 return vobsub_add_id(vob, p, idlen, atoi(q)); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
692 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
693 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
694 static int vobsub_parse_timestamp(vobsub_t *vob, const char *line) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
695 { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
696 // timestamp: HH:MM:SS.mmm, filepos: 0nnnnnnnnn |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
697 const char *p; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
698 int h, m, s, ms; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
699 off_t filepos; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
700 while (isspace(*line)) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
701 ++line; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
702 p = line; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
703 while (isdigit(*p)) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
704 ++p; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
705 if (p - line != 2) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
706 return -1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
707 h = atoi(line); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
708 if (*p != ':') |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
709 return -1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
710 line = ++p; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
711 while (isdigit(*p)) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
712 ++p; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
713 if (p - line != 2) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
714 return -1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
715 m = atoi(line); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
716 if (*p != ':') |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
717 return -1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
718 line = ++p; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
719 while (isdigit(*p)) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
720 ++p; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
721 if (p - line != 2) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
722 return -1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
723 s = atoi(line); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
724 if (*p != ':') |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
725 return -1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
726 line = ++p; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
727 while (isdigit(*p)) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
728 ++p; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
729 if (p - line != 3) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
730 return -1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
731 ms = atoi(line); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
732 if (*p != ',') |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
733 return -1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
734 line = p + 1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
735 while (isspace(*line)) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
736 ++line; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
737 if (strncmp("filepos:", line, 8)) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
738 return -1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
739 line += 8; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
740 while (isspace(*line)) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
741 ++line; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
742 if (! isxdigit(*line)) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
743 return -1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
744 filepos = strtol(line, NULL, 16); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
745 return vobsub_add_timestamp(vob, filepos, vob->delay + ms + 1000 * (s + 60 * (m + 60 * h))); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
746 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
747 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
748 static int vobsub_parse_origin(vobsub_t *vob, const char *line) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
749 { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
750 // org: X,Y |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
751 char *p; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
752 while (isspace(*line)) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
753 ++line; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
754 if (!isdigit(*line)) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
755 return -1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
756 vob->origin_x = strtoul(line, &p, 10); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
757 if (*p != ',') |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
758 return -1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
759 ++p; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
760 vob->origin_y = strtoul(p, NULL, 10); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
761 return 0; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
762 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
763 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
764 unsigned int vobsub_palette_to_yuv(unsigned int pal) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
765 { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
766 int r, g, b, y, u, v; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
767 // Palette in idx file is not rgb value, it was calculated by wrong formula. |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
768 // Here's reversed formula of the one used to generate palette in idx file. |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
769 r = pal >> 16 & 0xff; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
770 g = pal >> 8 & 0xff; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
771 b = pal & 0xff; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
772 y = av_clip_uint8( 0.1494 * r + 0.6061 * g + 0.2445 * b); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
773 u = av_clip_uint8( 0.6066 * r - 0.4322 * g - 0.1744 * b + 128); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
774 v = av_clip_uint8(-0.08435 * r - 0.3422 * g + 0.4266 * b + 128); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
775 y = y * 219 / 255 + 16; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
776 return y << 16 | u << 8 | v; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
777 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
778 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
779 unsigned int vobsub_rgb_to_yuv(unsigned int rgb) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
780 { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
781 int r, g, b, y, u, v; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
782 r = rgb >> 16 & 0xff; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
783 g = rgb >> 8 & 0xff; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
784 b = rgb & 0xff; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
785 y = ( 0.299 * r + 0.587 * g + 0.114 * b) * 219 / 255 + 16.5; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
786 u = (-0.16874 * r - 0.33126 * g + 0.5 * b) * 224 / 255 + 128.5; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
787 v = ( 0.5 * r - 0.41869 * g - 0.08131 * b) * 224 / 255 + 128.5; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
788 return y << 16 | u << 8 | v; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
789 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
790 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
791 static int vobsub_parse_delay(vobsub_t *vob, const char *line) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
792 { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
793 int h, m, s, ms; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
794 int forward = 1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
795 if (*(line + 7) == '+') { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
796 forward = 1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
797 line++; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
798 } else if (*(line + 7) == '-') { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
799 forward = -1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
800 line++; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
801 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
802 mp_msg(MSGT_SPUDEC, MSGL_V, "forward=%d", forward); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
803 h = atoi(line + 7); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
804 mp_msg(MSGT_VOBSUB, MSGL_V, "h=%d,", h); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
805 m = atoi(line + 10); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
806 mp_msg(MSGT_VOBSUB, MSGL_V, "m=%d,", m); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
807 s = atoi(line + 13); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
808 mp_msg(MSGT_VOBSUB, MSGL_V, "s=%d,", s); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
809 ms = atoi(line + 16); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
810 mp_msg(MSGT_VOBSUB, MSGL_V, "ms=%d", ms); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
811 vob->delay = (ms + 1000 * (s + 60 * (m + 60 * h))) * forward; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
812 return 0; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
813 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
814 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
815 static int vobsub_set_lang(const char *line) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
816 { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
817 if (vobsub_id == -1) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
818 vobsub_id = atoi(line + 8); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
819 return 0; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
820 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
821 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
822 static int vobsub_parse_one_line(vobsub_t *vob, rar_stream_t *fd, |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
823 unsigned char **extradata, |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
824 unsigned int *extradata_len) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
825 { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
826 ssize_t line_size; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
827 int res = -1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
828 size_t line_reserve = 0; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
829 char *line = NULL; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
830 do { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
831 line_size = vobsub_getline(&line, &line_reserve, fd); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
832 if (line_size < 0 || line_size > 1000000 || |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
833 *extradata_len+line_size > 10000000) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
834 break; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
835 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
836 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
837 *extradata = realloc(*extradata, *extradata_len+line_size+1); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
838 memcpy(*extradata+*extradata_len, line, line_size); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
839 *extradata_len += line_size; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
840 (*extradata)[*extradata_len] = 0; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
841 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
842 if (*line == 0 || *line == '\r' || *line == '\n' || *line == '#') |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
843 continue; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
844 else if (strncmp("langidx:", line, 8) == 0) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
845 res = vobsub_set_lang(line); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
846 else if (strncmp("delay:", line, 6) == 0) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
847 res = vobsub_parse_delay(vob, line); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
848 else if (strncmp("id:", line, 3) == 0) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
849 res = vobsub_parse_id(vob, line + 3); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
850 else if (strncmp("org:", line, 4) == 0) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
851 res = vobsub_parse_origin(vob, line + 4); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
852 else if (strncmp("timestamp:", line, 10) == 0) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
853 res = vobsub_parse_timestamp(vob, line + 10); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
854 else { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
855 mp_msg(MSGT_VOBSUB, MSGL_V, "vobsub: ignoring %s", line); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
856 continue; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
857 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
858 if (res < 0) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
859 mp_msg(MSGT_VOBSUB, MSGL_ERR, "ERROR in %s", line); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
860 break; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
861 } while (1); |
32511
b39155e98ac3
Remove some useless NULL pointer checks before invoking free() on the pointer.
diego
parents:
32464
diff
changeset
|
862 free(line); |
32459
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
863 return res; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
864 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
865 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
866 int vobsub_parse_ifo(void* this, const char *const name, unsigned int *palette, |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
867 unsigned int *width, unsigned int *height, int force, |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
868 int sid, char *langid) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
869 { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
870 vobsub_t *vob = this; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
871 int res = -1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
872 rar_stream_t *fd = rar_open(name, "rb"); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
873 if (fd == NULL) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
874 if (force) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
875 mp_msg(MSGT_VOBSUB, MSGL_WARN, "VobSub: Can't open IFO file\n"); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
876 } else { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
877 // parse IFO header |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
878 unsigned char block[0x800]; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
879 const char *const ifo_magic = "DVDVIDEO-VTS"; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
880 if (rar_read(block, sizeof(block), 1, fd) != 1) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
881 if (force) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
882 mp_msg(MSGT_VOBSUB, MSGL_ERR, "VobSub: Can't read IFO header\n"); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
883 } else if (memcmp(block, ifo_magic, strlen(ifo_magic) + 1)) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
884 mp_msg(MSGT_VOBSUB, MSGL_ERR, "VobSub: Bad magic in IFO header\n"); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
885 else { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
886 unsigned long pgci_sector = block[0xcc] << 24 | block[0xcd] << 16 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
887 | block[0xce] << 8 | block[0xcf]; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
888 int standard = (block[0x200] & 0x30) >> 4; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
889 int resolution = (block[0x201] & 0x0c) >> 2; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
890 *height = standard ? 576 : 480; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
891 *width = 0; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
892 switch (resolution) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
893 case 0x0: |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
894 *width = 720; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
895 break; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
896 case 0x1: |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
897 *width = 704; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
898 break; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
899 case 0x2: |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
900 *width = 352; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
901 break; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
902 case 0x3: |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
903 *width = 352; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
904 *height /= 2; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
905 break; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
906 default: |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
907 mp_msg(MSGT_VOBSUB, MSGL_WARN, "Vobsub: Unknown resolution %d \n", resolution); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
908 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
909 if (langid && 0 <= sid && sid < 32) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
910 unsigned char *tmp = block + 0x256 + sid * 6 + 2; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
911 langid[0] = tmp[0]; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
912 langid[1] = tmp[1]; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
913 langid[2] = 0; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
914 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
915 if (rar_seek(fd, pgci_sector * sizeof(block), SEEK_SET) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
916 || rar_read(block, sizeof(block), 1, fd) != 1) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
917 mp_msg(MSGT_VOBSUB, MSGL_ERR, "VobSub: Can't read IFO PGCI\n"); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
918 else { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
919 unsigned long idx; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
920 unsigned long pgc_offset = block[0xc] << 24 | block[0xd] << 16 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
921 | block[0xe] << 8 | block[0xf]; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
922 for (idx = 0; idx < 16; ++idx) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
923 unsigned char *p = block + pgc_offset + 0xa4 + 4 * idx; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
924 palette[idx] = p[0] << 24 | p[1] << 16 | p[2] << 8 | p[3]; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
925 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
926 if (vob) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
927 vob->have_palette = 1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
928 res = 0; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
929 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
930 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
931 rar_close(fd); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
932 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
933 return res; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
934 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
935 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
936 void *vobsub_open(const char *const name, const char *const ifo, |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
937 const int force, void** spu) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
938 { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
939 unsigned char *extradata = NULL; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
940 unsigned int extradata_len = 0; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
941 vobsub_t *vob = calloc(1, sizeof(vobsub_t)); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
942 if (spu) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
943 *spu = NULL; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
944 if (vobsubid == -2) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
945 vobsubid = vobsub_id; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
946 if (vob) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
947 char *buf; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
948 buf = malloc(strlen(name) + 5); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
949 if (buf) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
950 rar_stream_t *fd; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
951 mpeg_t *mpg; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
952 /* read in the info file */ |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
953 if (!ifo) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
954 strcpy(buf, name); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
955 strcat(buf, ".ifo"); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
956 vobsub_parse_ifo(vob, buf, vob->palette, &vob->orig_frame_width, &vob->orig_frame_height, force, -1, NULL); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
957 } else |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
958 vobsub_parse_ifo(vob, ifo, vob->palette, &vob->orig_frame_width, &vob->orig_frame_height, force, -1, NULL); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
959 /* read in the index */ |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
960 strcpy(buf, name); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
961 strcat(buf, ".idx"); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
962 fd = rar_open(buf, "rb"); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
963 if (fd == NULL) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
964 if (force) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
965 mp_msg(MSGT_VOBSUB, MSGL_ERR, "VobSub: Can't open IDX file\n"); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
966 else { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
967 free(buf); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
968 free(vob); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
969 return NULL; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
970 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
971 } else { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
972 while (vobsub_parse_one_line(vob, fd, &extradata, &extradata_len) >= 0) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
973 /* NOOP */ ; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
974 rar_close(fd); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
975 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
976 if (spu) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
977 *spu = spudec_new_scaled(vob->palette, vob->orig_frame_width, vob->orig_frame_height, extradata, extradata_len); |
32511
b39155e98ac3
Remove some useless NULL pointer checks before invoking free() on the pointer.
diego
parents:
32464
diff
changeset
|
978 free(extradata); |
32459
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
979 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
980 /* read the indexed mpeg_stream */ |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
981 strcpy(buf, name); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
982 strcat(buf, ".sub"); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
983 mpg = mpeg_open(buf); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
984 if (mpg == NULL) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
985 if (force) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
986 mp_msg(MSGT_VOBSUB, MSGL_ERR, "VobSub: Can't open SUB file\n"); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
987 else { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
988 free(buf); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
989 free(vob); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
990 return NULL; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
991 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
992 } else { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
993 long last_pts_diff = 0; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
994 while (!mpeg_eof(mpg)) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
995 off_t pos = mpeg_tell(mpg); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
996 if (mpeg_run(mpg) < 0) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
997 if (!mpeg_eof(mpg)) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
998 mp_msg(MSGT_VOBSUB, MSGL_ERR, "VobSub: mpeg_run error\n"); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
999 break; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1000 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1001 if (mpg->packet_size) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1002 if ((mpg->aid & 0xe0) == 0x20) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1003 unsigned int sid = mpg->aid & 0x1f; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1004 if (vobsub_ensure_spu_stream(vob, sid) >= 0) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1005 packet_queue_t *queue = vob->spu_streams + sid; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1006 /* get the packet to fill */ |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1007 if (queue->packets_size == 0 && packet_queue_grow(queue) < 0) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1008 abort(); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1009 while (queue->current_index + 1 < queue->packets_size |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1010 && queue->packets[queue->current_index + 1].filepos <= pos) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1011 ++queue->current_index; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1012 if (queue->current_index < queue->packets_size) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1013 packet_t *pkt; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1014 if (queue->packets[queue->current_index].data) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1015 /* insert a new packet and fix the PTS ! */ |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1016 packet_queue_insert(queue); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1017 queue->packets[queue->current_index].pts100 = |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1018 mpg->pts + last_pts_diff; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1019 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1020 pkt = queue->packets + queue->current_index; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1021 if (pkt->pts100 != UINT_MAX) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1022 if (queue->packets_size > 1) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1023 last_pts_diff = pkt->pts100 - mpg->pts; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1024 else |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1025 pkt->pts100 = mpg->pts; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1026 if (mpg->merge && queue->current_index > 0) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1027 packet_t *last = &queue->packets[queue->current_index - 1]; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1028 pkt->pts100 = last->pts100; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1029 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1030 mpg->merge = 0; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1031 /* FIXME: should not use mpg_sub internal informations, make a copy */ |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1032 pkt->data = mpg->packet; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1033 pkt->size = mpg->packet_size; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1034 mpg->packet = NULL; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1035 mpg->packet_reserve = 0; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1036 mpg->packet_size = 0; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1037 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1038 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1039 } else |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1040 mp_msg(MSGT_VOBSUB, MSGL_WARN, "don't know what to do with subtitle #%u\n", sid); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1041 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1042 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1043 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1044 vob->spu_streams_current = vob->spu_streams_size; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1045 while (vob->spu_streams_current-- > 0) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1046 vob->spu_streams[vob->spu_streams_current].current_index = 0; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1047 if (vobsubid == vob->spu_streams_current || |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1048 vob->spu_streams[vob->spu_streams_current].packets_size > 0) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1049 ++vob->spu_valid_streams_size; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1050 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1051 mpeg_free(mpg); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1052 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1053 free(buf); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1054 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1055 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1056 return vob; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1057 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1058 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1059 void vobsub_close(void *this) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1060 { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1061 vobsub_t *vob = this; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1062 if (vob->spu_streams) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1063 while (vob->spu_streams_size--) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1064 packet_queue_destroy(vob->spu_streams + vob->spu_streams_size); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1065 free(vob->spu_streams); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1066 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1067 free(vob); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1068 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1069 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1070 unsigned int vobsub_get_indexes_count(void *vobhandle) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1071 { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1072 vobsub_t *vob = vobhandle; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1073 return vob->spu_valid_streams_size; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1074 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1075 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1076 char *vobsub_get_id(void *vobhandle, unsigned int index) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1077 { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1078 vobsub_t *vob = vobhandle; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1079 return (index < vob->spu_streams_size) ? vob->spu_streams[index].id : NULL; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1080 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1081 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1082 int vobsub_get_id_by_index(void *vobhandle, unsigned int index) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1083 { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1084 vobsub_t *vob = vobhandle; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1085 int i, j; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1086 if (vob == NULL) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1087 return -1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1088 for (i = 0, j = 0; i < vob->spu_streams_size; ++i) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1089 if (i == vobsubid || vob->spu_streams[i].packets_size > 0) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1090 if (j == index) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1091 return i; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1092 ++j; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1093 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1094 return -1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1095 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1096 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1097 int vobsub_get_index_by_id(void *vobhandle, int id) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1098 { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1099 vobsub_t *vob = vobhandle; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1100 int i, j; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1101 if (vob == NULL || id < 0 || id >= vob->spu_streams_size) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1102 return -1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1103 if (id != vobsubid && !vob->spu_streams[id].packets_size) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1104 return -1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1105 for (i = 0, j = 0; i < id; ++i) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1106 if (i == vobsubid || vob->spu_streams[i].packets_size > 0) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1107 ++j; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1108 return j; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1109 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1110 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1111 int vobsub_set_from_lang(void *vobhandle, unsigned char * lang) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1112 { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1113 int i; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1114 vobsub_t *vob= vobhandle; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1115 while (lang && strlen(lang) >= 2) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1116 for (i = 0; i < vob->spu_streams_size; i++) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1117 if (vob->spu_streams[i].id) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1118 if ((strncmp(vob->spu_streams[i].id, lang, 2) == 0)) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1119 vobsub_id = i; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1120 mp_msg(MSGT_VOBSUB, MSGL_INFO, "Selected VOBSUB language: %d language: %s\n", i, vob->spu_streams[i].id); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1121 return 0; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1122 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1123 lang+=2;while (lang[0]==',' || lang[0]==' ') ++lang; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1124 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1125 mp_msg(MSGT_VOBSUB, MSGL_WARN, "No matching VOBSUB language found!\n"); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1126 return -1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1127 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1128 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1129 /// make sure we seek to the first packet of packets having same pts values. |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1130 static void vobsub_queue_reseek(packet_queue_t *queue, unsigned int pts100) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1131 { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1132 int reseek_count = 0; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1133 unsigned int lastpts = 0; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1134 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1135 if (queue->current_index > 0 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1136 && (queue->packets[queue->current_index].pts100 == UINT_MAX |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1137 || queue->packets[queue->current_index].pts100 > pts100)) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1138 // possible pts seek previous, try to check it. |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1139 int i = 1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1140 while (queue->current_index >= i |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1141 && queue->packets[queue->current_index-i].pts100 == UINT_MAX) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1142 ++i; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1143 if (queue->current_index >= i |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1144 && queue->packets[queue->current_index-i].pts100 > pts100) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1145 // pts seek previous confirmed, reseek from beginning |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1146 queue->current_index = 0; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1147 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1148 while (queue->current_index < queue->packets_size |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1149 && queue->packets[queue->current_index].pts100 <= pts100) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1150 lastpts = queue->packets[queue->current_index].pts100; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1151 ++queue->current_index; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1152 ++reseek_count; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1153 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1154 while (reseek_count-- && --queue->current_index) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1155 if (queue->packets[queue->current_index-1].pts100 != UINT_MAX && |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1156 queue->packets[queue->current_index-1].pts100 != lastpts) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1157 break; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1158 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1159 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1160 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1161 int vobsub_get_packet(void *vobhandle, float pts, void** data, int* timestamp) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1162 { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1163 vobsub_t *vob = vobhandle; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1164 unsigned int pts100 = 90000 * pts; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1165 if (vob->spu_streams && 0 <= vobsub_id && (unsigned) vobsub_id < vob->spu_streams_size) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1166 packet_queue_t *queue = vob->spu_streams + vobsub_id; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1167 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1168 vobsub_queue_reseek(queue, pts100); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1169 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1170 while (queue->current_index < queue->packets_size) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1171 packet_t *pkt = queue->packets + queue->current_index; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1172 if (pkt->pts100 != UINT_MAX) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1173 if (pkt->pts100 <= pts100) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1174 ++queue->current_index; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1175 *data = pkt->data; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1176 *timestamp = pkt->pts100; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1177 return pkt->size; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1178 } else |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1179 break; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1180 else |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1181 ++queue->current_index; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1182 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1183 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1184 return -1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1185 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1186 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1187 int vobsub_get_next_packet(void *vobhandle, void** data, int* timestamp) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1188 { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1189 vobsub_t *vob = vobhandle; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1190 if (vob->spu_streams && 0 <= vobsub_id && (unsigned) vobsub_id < vob->spu_streams_size) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1191 packet_queue_t *queue = vob->spu_streams + vobsub_id; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1192 if (queue->current_index < queue->packets_size) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1193 packet_t *pkt = queue->packets + queue->current_index; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1194 ++queue->current_index; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1195 *data = pkt->data; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1196 *timestamp = pkt->pts100; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1197 return pkt->size; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1198 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1199 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1200 return -1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1201 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1202 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1203 void vobsub_seek(void * vobhandle, float pts) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1204 { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1205 vobsub_t * vob = vobhandle; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1206 packet_queue_t * queue; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1207 int seek_pts100 = pts * 90000; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1208 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1209 if (vob->spu_streams && 0 <= vobsub_id && (unsigned) vobsub_id < vob->spu_streams_size) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1210 /* do not seek if we don't know the id */ |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1211 if (vobsub_get_id(vob, vobsub_id) == NULL) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1212 return; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1213 queue = vob->spu_streams + vobsub_id; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1214 queue->current_index = 0; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1215 vobsub_queue_reseek(queue, seek_pts100); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1216 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1217 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1218 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1219 void vobsub_reset(void *vobhandle) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1220 { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1221 vobsub_t *vob = vobhandle; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1222 if (vob->spu_streams) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1223 unsigned int n = vob->spu_streams_size; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1224 while (n-- > 0) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1225 vob->spu_streams[n].current_index = 0; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1226 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1227 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1228 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1229 /********************************************************************** |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1230 * Vobsub output |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1231 **********************************************************************/ |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1232 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1233 typedef struct { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1234 FILE *fsub; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1235 FILE *fidx; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1236 unsigned int aid; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1237 } vobsub_out_t; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1238 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1239 static void create_idx(vobsub_out_t *me, const unsigned int *palette, |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1240 unsigned int orig_width, unsigned int orig_height) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1241 { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1242 int i; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1243 fprintf(me->fidx, |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1244 "# VobSub index file, v7 (do not modify this line!)\n" |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1245 "#\n" |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1246 "# Generated by %s\n" |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1247 "# See <URL:http://www.mplayerhq.hu/> for more information about MPlayer\n" |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1248 "# See <URL:http://wiki.multimedia.cx/index.php?title=VOBsub> for more information about Vobsub\n" |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1249 "#\n" |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1250 "size: %ux%u\n", |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1251 mplayer_version, orig_width, orig_height); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1252 if (palette) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1253 fputs("palette:", me->fidx); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1254 for (i = 0; i < 16; ++i) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1255 const double y = palette[i] >> 16 & 0xff, |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1256 u = (palette[i] >> 8 & 0xff) - 128.0, |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1257 v = (palette[i] & 0xff) - 128.0; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1258 if (i) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1259 putc(',', me->fidx); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1260 fprintf(me->fidx, " %02x%02x%02x", |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1261 av_clip_uint8(y + 1.4022 * u), |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1262 av_clip_uint8(y - 0.3456 * u - 0.7145 * v), |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1263 av_clip_uint8(y + 1.7710 * v)); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1264 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1265 putc('\n', me->fidx); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1266 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1267 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1268 fprintf(me->fidx, "# ON: displays only forced subtitles, OFF: shows everything\n" |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1269 "forced subs: OFF\n"); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1270 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1271 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1272 void *vobsub_out_open(const char *basename, const unsigned int *palette, |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1273 unsigned int orig_width, unsigned int orig_height, |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1274 const char *id, unsigned int index) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1275 { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1276 vobsub_out_t *result = NULL; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1277 char *filename; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1278 filename = malloc(strlen(basename) + 5); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1279 if (filename) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1280 result = malloc(sizeof(vobsub_out_t)); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1281 if (result) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1282 result->aid = index; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1283 strcpy(filename, basename); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1284 strcat(filename, ".sub"); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1285 result->fsub = fopen(filename, "ab"); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1286 if (result->fsub == NULL) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1287 perror("Error: vobsub_out_open subtitle file open failed"); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1288 strcpy(filename, basename); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1289 strcat(filename, ".idx"); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1290 result->fidx = fopen(filename, "ab"); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1291 if (result->fidx) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1292 if (ftell(result->fidx) == 0) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1293 create_idx(result, palette, orig_width, orig_height); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1294 /* Make the selected language the default language */ |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1295 fprintf(result->fidx, "\n# Language index in use\nlangidx: %u\n", index); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1296 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1297 fprintf(result->fidx, "\nid: %s, index: %u\n", id ? id : "xx", index); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1298 /* So that we can check the file now */ |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1299 fflush(result->fidx); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1300 } else |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1301 perror("Error: vobsub_out_open index file open failed"); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1302 free(filename); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1303 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1304 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1305 return result; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1306 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1307 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1308 void vobsub_out_close(void *me) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1309 { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1310 vobsub_out_t *vob = me; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1311 if (vob->fidx) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1312 fclose(vob->fidx); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1313 if (vob->fsub) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1314 fclose(vob->fsub); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1315 free(vob); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1316 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1317 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1318 void vobsub_out_output(void *me, const unsigned char *packet, |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1319 int len, double pts) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1320 { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1321 static double last_pts; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1322 static int last_pts_set = 0; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1323 vobsub_out_t *vob = me; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1324 if (vob->fsub) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1325 /* Windows' Vobsub require that every packet is exactly 2kB long */ |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1326 unsigned char buffer[2048]; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1327 unsigned char *p; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1328 int remain = 2048; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1329 /* Do not output twice a line with the same timestamp, this |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1330 breaks Windows' Vobsub */ |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1331 if (vob->fidx && (!last_pts_set || last_pts != pts)) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1332 static unsigned int last_h = 9999, last_m = 9999, last_s = 9999, last_ms = 9999; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1333 unsigned int h, m, ms; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1334 double s; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1335 s = pts; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1336 h = s / 3600; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1337 s -= h * 3600; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1338 m = s / 60; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1339 s -= m * 60; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1340 ms = (s - (unsigned int) s) * 1000; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1341 if (ms >= 1000) /* prevent overfolws or bad float stuff */ |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1342 ms = 0; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1343 if (h != last_h || m != last_m || (unsigned int) s != last_s || ms != last_ms) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1344 fprintf(vob->fidx, "timestamp: %02u:%02u:%02u:%03u, filepos: %09lx\n", |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1345 h, m, (unsigned int) s, ms, ftell(vob->fsub)); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1346 last_h = h; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1347 last_m = m; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1348 last_s = (unsigned int) s; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1349 last_ms = ms; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1350 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1351 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1352 last_pts = pts; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1353 last_pts_set = 1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1354 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1355 /* Packet start code: Windows' Vobsub needs this */ |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1356 p = buffer; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1357 *p++ = 0; /* 0x00 */ |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1358 *p++ = 0; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1359 *p++ = 1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1360 *p++ = 0xba; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1361 *p++ = 0x40; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1362 memset(p, 0, 9); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1363 p += 9; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1364 { /* Packet */ |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1365 static unsigned char last_pts[5] = { 0, 0, 0, 0, 0}; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1366 unsigned char now_pts[5]; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1367 int pts_len, pad_len, datalen = len; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1368 pts *= 90000; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1369 now_pts[0] = 0x21 | (((unsigned long)pts >> 29) & 0x0e); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1370 now_pts[1] = ((unsigned long)pts >> 22) & 0xff; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1371 now_pts[2] = 0x01 | (((unsigned long)pts >> 14) & 0xfe); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1372 now_pts[3] = ((unsigned long)pts >> 7) & 0xff; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1373 now_pts[4] = 0x01 | (((unsigned long)pts << 1) & 0xfe); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1374 pts_len = memcmp(last_pts, now_pts, sizeof(now_pts)) ? sizeof(now_pts) : 0; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1375 memcpy(last_pts, now_pts, sizeof(now_pts)); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1376 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1377 datalen += 3; /* Version, PTS_flags, pts_len */ |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1378 datalen += pts_len; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1379 datalen += 1; /* AID */ |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1380 pad_len = 2048 - (p - buffer) - 4 /* MPEG ID */ - 2 /* payload len */ - datalen; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1381 /* XXX - Go figure what should go here! In any case the |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1382 packet has to be completly filled. If I can fill it |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1383 with padding (0x000001be) latter I'll do that. But if |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1384 there is only room for 6 bytes then I can not write a |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1385 padding packet. So I add some padding in the PTS |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1386 field. This looks like a dirty kludge. Oh well... */ |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1387 if (pad_len < 0) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1388 /* Packet is too big. Let's try ommiting the PTS field */ |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1389 datalen -= pts_len; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1390 pts_len = 0; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1391 pad_len = 0; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1392 } else if (pad_len > 6) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1393 pad_len = 0; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1394 datalen += pad_len; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1395 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1396 *p++ = 0; /* 0x0e */ |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1397 *p++ = 0; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1398 *p++ = 1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1399 *p++ = 0xbd; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1400 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1401 *p++ = (datalen >> 8) & 0xff; /* length of payload */ |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1402 *p++ = datalen & 0xff; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1403 *p++ = 0x80; /* System-2 (.VOB) stream */ |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1404 *p++ = pts_len ? 0x80 : 0x00; /* pts_flags */ |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1405 *p++ = pts_len + pad_len; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1406 memcpy(p, now_pts, pts_len); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1407 p += pts_len; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1408 memset(p, 0, pad_len); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1409 p += pad_len; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1410 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1411 *p++ = 0x20 | vob->aid; /* aid */ |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1412 if (fwrite(buffer, p - buffer, 1, vob->fsub) != 1 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1413 || fwrite(packet, len, 1, vob->fsub) != 1) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1414 perror("ERROR: vobsub write failed"); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1415 else |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1416 remain -= p - buffer + len; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1417 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1418 /* Padding */ |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1419 if (remain >= 6) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1420 p = buffer; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1421 *p++ = 0x00; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1422 *p++ = 0x00; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1423 *p++ = 0x01; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1424 *p++ = 0xbe; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1425 *p++ = (remain - 6) >> 8; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1426 *p++ = (remain - 6) & 0xff; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1427 /* for better compression, blank this */ |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1428 memset(buffer + 6, 0, remain - (p - buffer)); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1429 if (fwrite(buffer, remain, 1, vob->fsub) != 1) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1430 perror("ERROR: vobsub padding write failed"); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1431 } else if (remain > 0) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1432 /* I don't know what to output. But anyway the block |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1433 needs to be 2KB big */ |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1434 memset(buffer, 0, remain); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1435 if (fwrite(buffer, remain, 1, vob->fsub) != 1) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1436 perror("ERROR: vobsub blank padding write failed"); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1437 } else if (remain < 0) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1438 fprintf(stderr, |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1439 "\nERROR: wrong thing happenned...\n" |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1440 " I wrote a %i data bytes spu packet and that's too long\n", len); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1441 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1442 } |