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