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