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