annotate sub/vobsub.c @ 35553:29f2de5e63d6

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