Mercurial > mplayer.hg
annotate vobsub.c @ 26883:a365271c97a5
Revert commit r26897.
XviD is the correct spelling of the codec.
You can see it written in the codec own
documentation and header files.
Prefered name capitalization confirmed
in conversation with XviD developer (prunedtree).
author | iive |
---|---|
date | Wed, 28 May 2008 23:04:41 +0000 |
parents | 99458e732ebd |
children | e7c989f7a7c9 |
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" | |
25361
f95cd1391ea0
Support using unrar executable to access rar-compressed vobsub files.
ulion
parents:
25322
diff
changeset
|
23 #ifdef USE_UNRAR_EXEC |
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 **********************************************************************/ |
25440
ae7399c268fe
Remove internal unrarlib copy, the new unrarexec code is a strict superset.
diego
parents:
25432
diff
changeset
|
37 #ifdef USE_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; |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
468 |
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 { | |
566 if (packet_queue_ensure(queue, queue->packets_size + 1) < 0) | |
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 unsigned int cuspal[4]; |
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5563
diff
changeset
|
600 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
|
601 unsigned int custom; |
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5563
diff
changeset
|
602 unsigned int have_palette; |
5388
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
603 unsigned int orig_frame_width, orig_frame_height; |
5563 | 604 unsigned int origin_x, origin_y; |
10917
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
10893
diff
changeset
|
605 unsigned int forced_subs; |
4080 | 606 /* index */ |
607 packet_queue_t *spu_streams; | |
608 unsigned int spu_streams_size; | |
609 unsigned int spu_streams_current; | |
25251
80804f0631f4
Skip empty vobsub streams when selecting subtitles.
ulion
parents:
25249
diff
changeset
|
610 unsigned int spu_valid_streams_size; |
4080 | 611 } vobsub_t; |
612 | |
4085 | 613 /* Make sure that the spu stream idx exists. */ |
4080 | 614 static int |
4085 | 615 vobsub_ensure_spu_stream(vobsub_t *vob, unsigned int index) |
4080 | 616 { |
617 if (index >= vob->spu_streams_size) { | |
618 /* This is a new stream */ | |
619 if (vob->spu_streams) { | |
620 packet_queue_t *tmp = realloc(vob->spu_streams, (index + 1) * sizeof(packet_queue_t)); | |
621 if (tmp == NULL) { | |
6110 | 622 mp_msg(MSGT_VOBSUB,MSGL_ERR,"vobsub_ensure_spu_stream: realloc failure"); |
4080 | 623 return -1; |
624 } | |
625 vob->spu_streams = tmp; | |
626 } | |
627 else { | |
628 vob->spu_streams = malloc((index + 1) * sizeof(packet_queue_t)); | |
629 if (vob->spu_streams == NULL) { | |
6110 | 630 mp_msg(MSGT_VOBSUB,MSGL_ERR,"vobsub_ensure_spu_stream: malloc failure"); |
4080 | 631 return -1; |
632 } | |
633 } | |
634 while (vob->spu_streams_size <= index) { | |
635 packet_queue_construct(vob->spu_streams + vob->spu_streams_size); | |
636 ++vob->spu_streams_size; | |
637 } | |
638 } | |
4085 | 639 return 0; |
640 } | |
641 | |
642 static int | |
643 vobsub_add_id(vobsub_t *vob, const char *id, size_t idlen, const unsigned int index) | |
644 { | |
645 if (vobsub_ensure_spu_stream(vob, index) < 0) | |
646 return -1; | |
4080 | 647 if (id && idlen) { |
648 if (vob->spu_streams[index].id) | |
649 free(vob->spu_streams[index].id); | |
650 vob->spu_streams[index].id = malloc(idlen + 1); | |
651 if (vob->spu_streams[index].id == NULL) { | |
6110 | 652 mp_msg(MSGT_VOBSUB,MSGL_FATAL,"vobsub_add_id: malloc failure"); |
4080 | 653 return -1; |
654 } | |
655 vob->spu_streams[index].id[idlen] = 0; | |
656 memcpy(vob->spu_streams[index].id, id, idlen); | |
657 } | |
658 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
|
659 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
|
660 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
|
661 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_VSID_%d_LANG=%s\n", index, vob->spu_streams[index].id); |
8027 | 662 mp_msg(MSGT_VOBSUB,MSGL_V,"[vobsub] subtitle (vobsubid): %d language %s\n", |
4080 | 663 index, vob->spu_streams[index].id); |
664 return 0; | |
665 } | |
666 | |
667 static int | |
7417
c477dae38383
Fix support for negative "delay:" directive in .idx file.
kmkaplan
parents:
6831
diff
changeset
|
668 vobsub_add_timestamp(vobsub_t *vob, off_t filepos, int ms) |
4080 | 669 { |
670 packet_queue_t *queue; | |
671 packet_t *pkt; | |
672 if (vob->spu_streams == 0) { | |
6110 | 673 mp_msg(MSGT_VOBSUB,MSGL_WARN,"[vobsub] warning, binning some index entries. Check your index file\n"); |
4080 | 674 return -1; |
675 } | |
676 queue = vob->spu_streams + vob->spu_streams_current; | |
677 if (packet_queue_grow(queue) >= 0) { | |
678 pkt = queue->packets + (queue->packets_size - 1); | |
679 pkt->filepos = filepos; | |
7417
c477dae38383
Fix support for negative "delay:" directive in .idx file.
kmkaplan
parents:
6831
diff
changeset
|
680 pkt->pts100 = ms < 0 ? UINT_MAX : (unsigned int)ms * 90; |
4080 | 681 return 0; |
682 } | |
683 return -1; | |
684 } | |
685 | |
686 static int | |
687 vobsub_parse_id(vobsub_t *vob, const char *line) | |
688 { | |
689 // id: xx, index: n | |
690 size_t idlen; | |
691 const char *p, *q; | |
692 p = line; | |
693 while (isspace(*p)) | |
694 ++p; | |
695 q = p; | |
696 while (isalpha(*q)) | |
697 ++q; | |
698 idlen = q - p; | |
699 if (idlen == 0) | |
700 return -1; | |
701 ++q; | |
702 while (isspace(*q)) | |
703 ++q; | |
704 if (strncmp("index:", q, 6)) | |
705 return -1; | |
706 q += 6; | |
707 while (isspace(*q)) | |
708 ++q; | |
709 if (!isdigit(*q)) | |
710 return -1; | |
711 return vobsub_add_id(vob, p, idlen, atoi(q)); | |
712 } | |
713 | |
714 static int | |
715 vobsub_parse_timestamp(vobsub_t *vob, const char *line) | |
716 { | |
717 // timestamp: HH:MM:SS.mmm, filepos: 0nnnnnnnnn | |
718 const char *p; | |
719 int h, m, s, ms; | |
720 off_t filepos; | |
721 while (isspace(*line)) | |
722 ++line; | |
723 p = line; | |
724 while (isdigit(*p)) | |
725 ++p; | |
726 if (p - line != 2) | |
727 return -1; | |
728 h = atoi(line); | |
729 if (*p != ':') | |
730 return -1; | |
731 line = ++p; | |
732 while (isdigit(*p)) | |
733 ++p; | |
734 if (p - line != 2) | |
735 return -1; | |
736 m = atoi(line); | |
737 if (*p != ':') | |
738 return -1; | |
739 line = ++p; | |
740 while (isdigit(*p)) | |
741 ++p; | |
742 if (p - line != 2) | |
743 return -1; | |
744 s = atoi(line); | |
745 if (*p != ':') | |
746 return -1; | |
747 line = ++p; | |
748 while (isdigit(*p)) | |
749 ++p; | |
750 if (p - line != 3) | |
751 return -1; | |
752 ms = atoi(line); | |
753 if (*p != ',') | |
754 return -1; | |
755 line = p + 1; | |
756 while (isspace(*line)) | |
757 ++line; | |
758 if (strncmp("filepos:", line, 8)) | |
759 return -1; | |
760 line += 8; | |
761 while (isspace(*line)) | |
762 ++line; | |
763 if (! isxdigit(*line)) | |
764 return -1; | |
765 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
|
766 return vobsub_add_timestamp(vob, filepos, vob->delay + ms + 1000 * (s + 60 * (m + 60 * h))); |
4080 | 767 } |
768 | |
769 static int | |
5388
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
770 vobsub_parse_size(vobsub_t *vob, const char *line) |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
771 { |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
772 // size: WWWxHHH |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
773 char *p; |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
774 while (isspace(*line)) |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
775 ++line; |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
776 if (!isdigit(*line)) |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
777 return -1; |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
778 vob->orig_frame_width = strtoul(line, &p, 10); |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
779 if (*p != 'x') |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
780 return -1; |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
781 ++p; |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
782 vob->orig_frame_height = strtoul(p, NULL, 10); |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
783 return 0; |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
784 } |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
785 |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
786 static int |
5563 | 787 vobsub_parse_origin(vobsub_t *vob, const char *line) |
788 { | |
789 // org: X,Y | |
790 char *p; | |
791 while (isspace(*line)) | |
792 ++line; | |
793 if (!isdigit(*line)) | |
794 return -1; | |
795 vob->origin_x = strtoul(line, &p, 10); | |
796 if (*p != ',') | |
797 return -1; | |
798 ++p; | |
799 vob->origin_y = strtoul(p, NULL, 10); | |
800 return 0; | |
801 } | |
802 | |
25292
a6a49a7a4be0
Move vobsub palette->yuv convert code into a common function.
ulion
parents:
25289
diff
changeset
|
803 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
|
804 { |
a6a49a7a4be0
Move vobsub palette->yuv convert code into a common function.
ulion
parents:
25289
diff
changeset
|
805 int r, g, b, y, u, v; |
a6a49a7a4be0
Move vobsub palette->yuv convert code into a common function.
ulion
parents:
25289
diff
changeset
|
806 // Palette in idx file is not rgb value, it was calculated by wrong forumla. |
a6a49a7a4be0
Move vobsub palette->yuv convert code into a common function.
ulion
parents:
25289
diff
changeset
|
807 // Here's reversed forumla of the one used to generate palette in idx file. |
a6a49a7a4be0
Move vobsub palette->yuv convert code into a common function.
ulion
parents:
25289
diff
changeset
|
808 r = pal >> 16 & 0xff; |
a6a49a7a4be0
Move vobsub palette->yuv convert code into a common function.
ulion
parents:
25289
diff
changeset
|
809 g = pal >> 8 & 0xff; |
a6a49a7a4be0
Move vobsub palette->yuv convert code into a common function.
ulion
parents:
25289
diff
changeset
|
810 b = pal & 0xff; |
a6a49a7a4be0
Move vobsub palette->yuv convert code into a common function.
ulion
parents:
25289
diff
changeset
|
811 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
|
812 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
|
813 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
|
814 y = y * 219 / 255 + 16; |
a6a49a7a4be0
Move vobsub palette->yuv convert code into a common function.
ulion
parents:
25289
diff
changeset
|
815 return y << 16 | u << 8 | v; |
a6a49a7a4be0
Move vobsub palette->yuv convert code into a common function.
ulion
parents:
25289
diff
changeset
|
816 } |
a6a49a7a4be0
Move vobsub palette->yuv convert code into a common function.
ulion
parents:
25289
diff
changeset
|
817 |
25298
23894348d1e5
Convert vobsub custom colors from rgb to yuv using a common function.
ulion
parents:
25294
diff
changeset
|
818 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
|
819 { |
23894348d1e5
Convert vobsub custom colors from rgb to yuv using a common function.
ulion
parents:
25294
diff
changeset
|
820 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
|
821 r = rgb >> 16 & 0xff; |
23894348d1e5
Convert vobsub custom colors from rgb to yuv using a common function.
ulion
parents:
25294
diff
changeset
|
822 g = rgb >> 8 & 0xff; |
23894348d1e5
Convert vobsub custom colors from rgb to yuv using a common function.
ulion
parents:
25294
diff
changeset
|
823 b = rgb & 0xff; |
23894348d1e5
Convert vobsub custom colors from rgb to yuv using a common function.
ulion
parents:
25294
diff
changeset
|
824 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
|
825 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
|
826 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
|
827 return y << 16 | u << 8 | v; |
23894348d1e5
Convert vobsub custom colors from rgb to yuv using a common function.
ulion
parents:
25294
diff
changeset
|
828 } |
23894348d1e5
Convert vobsub custom colors from rgb to yuv using a common function.
ulion
parents:
25294
diff
changeset
|
829 |
5563 | 830 static int |
5388
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
831 vobsub_parse_palette(vobsub_t *vob, const char *line) |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
832 { |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
833 // palette: XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
834 unsigned int n; |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
835 n = 0; |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
836 while (1) { |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
837 const char *p; |
25292
a6a49a7a4be0
Move vobsub palette->yuv convert code into a common function.
ulion
parents:
25289
diff
changeset
|
838 int tmp; |
5388
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
839 while (isspace(*line)) |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
840 ++line; |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
841 p = line; |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
842 while (isxdigit(*p)) |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
843 ++p; |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
844 if (p - line != 6) |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
845 return -1; |
6831 | 846 tmp = strtoul(line, NULL, 16); |
25292
a6a49a7a4be0
Move vobsub palette->yuv convert code into a common function.
ulion
parents:
25289
diff
changeset
|
847 vob->palette[n++] = vobsub_palette_to_yuv(tmp); |
5388
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
848 if (n == 16) |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
849 break; |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
850 if (*p == ',') |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
851 ++p; |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
852 line = p; |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
853 } |
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
|
854 vob->have_palette = 1; |
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5563
diff
changeset
|
855 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
|
856 } |
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5563
diff
changeset
|
857 |
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5563
diff
changeset
|
858 static int |
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5563
diff
changeset
|
859 vobsub_parse_custom(vobsub_t *vob, const char *line) |
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5563
diff
changeset
|
860 { |
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5563
diff
changeset
|
861 //custom colors: OFF/ON(0/1) |
5839 | 862 if ((strncmp("ON", line + 15, 2) == 0)||strncmp("1", line + 15, 1) == 0) |
5833
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5563
diff
changeset
|
863 vob->custom=1; |
5839 | 864 else if ((strncmp("OFF", line + 15, 3) == 0)||strncmp("0", line + 15, 1) == 0) |
5833
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5563
diff
changeset
|
865 vob->custom=0; |
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5563
diff
changeset
|
866 else |
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5563
diff
changeset
|
867 return -1; |
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5563
diff
changeset
|
868 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
|
869 } |
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5563
diff
changeset
|
870 |
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5563
diff
changeset
|
871 static int |
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5563
diff
changeset
|
872 vobsub_parse_cuspal(vobsub_t *vob, const char *line) |
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5563
diff
changeset
|
873 { |
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5563
diff
changeset
|
874 //colors: XXXXXX, XXXXXX, XXXXXX, XXXXXX |
25249
d0d928c92833
Fix custom palette format from rgb to yuv, we use it as yuv in the spudec.
ulion
parents:
25169
diff
changeset
|
875 unsigned int n, tmp; |
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
|
876 n = 0; |
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5563
diff
changeset
|
877 line += 40; |
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5563
diff
changeset
|
878 while(1){ |
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5563
diff
changeset
|
879 const char *p; |
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5563
diff
changeset
|
880 while (isspace(*line)) |
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5563
diff
changeset
|
881 ++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
|
882 p=line; |
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5563
diff
changeset
|
883 while (isxdigit(*p)) |
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5563
diff
changeset
|
884 ++p; |
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5563
diff
changeset
|
885 if (p - line !=6) |
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5563
diff
changeset
|
886 return -1; |
25249
d0d928c92833
Fix custom palette format from rgb to yuv, we use it as yuv in the spudec.
ulion
parents:
25169
diff
changeset
|
887 tmp = strtoul(line, NULL, 16); |
25432 | 888 vob->cuspal[n++] |= vobsub_rgb_to_yuv(tmp); |
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
|
889 if (n==4) |
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5563
diff
changeset
|
890 break; |
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5563
diff
changeset
|
891 if(*p == ',') |
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5563
diff
changeset
|
892 ++p; |
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5563
diff
changeset
|
893 line = p; |
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5563
diff
changeset
|
894 } |
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5563
diff
changeset
|
895 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
|
896 } |
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5563
diff
changeset
|
897 |
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5563
diff
changeset
|
898 static int |
25432 | 899 vobsub_parse_tridx(vobsub_t *vob, const char *line) |
5833
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5563
diff
changeset
|
900 { |
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5563
diff
changeset
|
901 //tridx: XXXX |
25432 | 902 int tridx, i; |
903 tridx = strtoul((line + 26), NULL, 2); | |
904 for (i = 0; i < 4; ++i) | |
905 if ((tridx << i) & 0x08) | |
906 vob->cuspal[i] |= 1 << 31; | |
6110 | 907 return tridx; |
5833
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5563
diff
changeset
|
908 } |
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5563
diff
changeset
|
909 |
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5563
diff
changeset
|
910 static int |
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5563
diff
changeset
|
911 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
|
912 { |
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5563
diff
changeset
|
913 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
|
914 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
|
915 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
|
916 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
|
917 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
|
918 } |
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5563
diff
changeset
|
919 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
|
920 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
|
921 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
|
922 } |
6110 | 923 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
|
924 h = atoi(line + 7); |
6110 | 925 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
|
926 m = atoi(line + 10); |
6110 | 927 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
|
928 s = atoi(line + 13); |
6110 | 929 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
|
930 ms = atoi(line + 16); |
6110 | 931 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
|
932 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
|
933 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
|
934 } |
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5563
diff
changeset
|
935 |
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5563
diff
changeset
|
936 static int |
6110 | 937 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
|
938 { |
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5563
diff
changeset
|
939 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
|
940 vobsub_id = atoi(line + 8); |
5388
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
941 return 0; |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
942 } |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
943 |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
944 static int |
10917
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
10893
diff
changeset
|
945 vobsub_parse_forced_subs(vobsub_t *vob, const char *line) |
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
10893
diff
changeset
|
946 { |
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
10893
diff
changeset
|
947 const char *p; |
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
10893
diff
changeset
|
948 |
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
10893
diff
changeset
|
949 p = line; |
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
10893
diff
changeset
|
950 while (isspace(*p)) |
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
10893
diff
changeset
|
951 ++p; |
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
10893
diff
changeset
|
952 |
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
10893
diff
changeset
|
953 if (strncasecmp("on",p,2) == 0){ |
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
10893
diff
changeset
|
954 vob->forced_subs=~0; |
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
10893
diff
changeset
|
955 return 0; |
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
10893
diff
changeset
|
956 } else if (strncasecmp("off",p,3) == 0){ |
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
10893
diff
changeset
|
957 vob->forced_subs=0; |
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
10893
diff
changeset
|
958 return 0; |
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
10893
diff
changeset
|
959 } |
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
10893
diff
changeset
|
960 |
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
10893
diff
changeset
|
961 return -1; |
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
10893
diff
changeset
|
962 } |
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
10893
diff
changeset
|
963 |
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
10893
diff
changeset
|
964 static int |
7446
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
965 vobsub_parse_one_line(vobsub_t *vob, rar_stream_t *fd) |
4080 | 966 { |
967 ssize_t line_size; | |
968 int res = -1; | |
6163
141a082e6da6
applied 64bit patch from Ulrich Hecht <uli at suse dot de>
alex
parents:
6110
diff
changeset
|
969 size_t line_reserve = 0; |
4080 | 970 char *line = NULL; |
14237
cb14ee6b0944
fix memleak in idx parser. patch by elupus [elupus {at] ecce <dot) se]
reimar
parents:
14046
diff
changeset
|
971 do { |
17527 | 972 line_size = vobsub_getline(&line, &line_reserve, fd); |
4080 | 973 if (line_size < 0) { |
974 break; | |
975 } | |
976 if (*line == 0 || *line == '\r' || *line == '\n' || *line == '#') | |
977 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
|
978 else if (strncmp("langidx:", line, 8) == 0) |
6110 | 979 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
|
980 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
|
981 res = vobsub_parse_delay(vob, line); |
4080 | 982 else if (strncmp("id:", line, 3) == 0) |
983 res = vobsub_parse_id(vob, line + 3); | |
5388
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
984 else if (strncmp("palette:", line, 8) == 0) |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
985 res = vobsub_parse_palette(vob, line + 8); |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
986 else if (strncmp("size:", line, 5) == 0) |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
987 res = vobsub_parse_size(vob, line + 5); |
5563 | 988 else if (strncmp("org:", line, 4) == 0) |
989 res = vobsub_parse_origin(vob, line + 4); | |
4080 | 990 else if (strncmp("timestamp:", line, 10) == 0) |
991 res = vobsub_parse_timestamp(vob, line + 10); | |
5833
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5563
diff
changeset
|
992 else if (strncmp("custom colors:", line, 14) == 0) |
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5563
diff
changeset
|
993 //custom colors: ON/OFF, tridx: XXXX, colors: XXXXXX, XXXXXX, XXXXXX,XXXXXX |
25432 | 994 res = vobsub_parse_cuspal(vob, line) + vobsub_parse_tridx(vob, line) + vobsub_parse_custom(vob, line); |
10917
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
10893
diff
changeset
|
995 else if (strncmp("forced subs:", line, 12) == 0) |
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
10893
diff
changeset
|
996 res = vobsub_parse_forced_subs(vob, line + 12); |
4080 | 997 else { |
8027 | 998 mp_msg(MSGT_VOBSUB,MSGL_V, "vobsub: ignoring %s", line); |
4080 | 999 continue; |
1000 } | |
1001 if (res < 0) | |
6110 | 1002 mp_msg(MSGT_VOBSUB,MSGL_ERR, "ERROR in %s", line); |
4080 | 1003 break; |
1004 } while (1); | |
14237
cb14ee6b0944
fix memleak in idx parser. patch by elupus [elupus {at] ecce <dot) se]
reimar
parents:
14046
diff
changeset
|
1005 if (line) |
cb14ee6b0944
fix memleak in idx parser. patch by elupus [elupus {at] ecce <dot) se]
reimar
parents:
14046
diff
changeset
|
1006 free(line); |
4080 | 1007 return res; |
1008 } | |
1009 | |
5388
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
1010 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
|
1011 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
|
1012 int sid, char *langid) |
5388
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
1013 { |
6110 | 1014 vobsub_t *vob = (vobsub_t*)this; |
5388
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
1015 int res = -1; |
7446
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
1016 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
|
1017 if (fd == NULL) { |
412ff784c971
Avoid bogus file not found message if vobsub isn'T forced (autodetect).
atmos4
parents:
5839
diff
changeset
|
1018 if (force) |
25169
db94ecd7e7f1
Even when vobsub is forced, .ifo file is still not necessary,
ulion
parents:
25119
diff
changeset
|
1019 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
|
1020 } else { |
5388
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
1021 // parse IFO header |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
1022 unsigned char block[0x800]; |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
1023 const char *const ifo_magic = "DVDVIDEO-VTS"; |
7446
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
1024 if (rar_read(block, sizeof(block), 1, fd) != 1) { |
5388
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
1025 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
|
1026 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
|
1027 } 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
|
1028 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
|
1029 else { |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
1030 unsigned long pgci_sector = block[0xcc] << 24 | block[0xcd] << 16 |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
1031 | block[0xce] << 8 | block[0xcf]; |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
1032 int standard = (block[0x200] & 0x30) >> 4; |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
1033 int resolution = (block[0x201] & 0x0c) >> 2; |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
1034 *height = standard ? 576 : 480; |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
1035 *width = 0; |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
1036 switch (resolution) { |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
1037 case 0x0: |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
1038 *width = 720; |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
1039 break; |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
1040 case 0x1: |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
1041 *width = 704; |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
1042 break; |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
1043 case 0x2: |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
1044 *width = 352; |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
1045 break; |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
1046 case 0x3: |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
1047 *width = 352; |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
1048 *height /= 2; |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
1049 break; |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
1050 default: |
6110 | 1051 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
|
1052 } |
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
|
1053 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
|
1054 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
|
1055 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
|
1056 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
|
1057 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
|
1058 } |
7446
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
1059 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
|
1060 || 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
|
1061 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
|
1062 else { |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
1063 unsigned long idx; |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
1064 unsigned long pgc_offset = block[0xc] << 24 | block[0xd] << 16 |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
1065 | block[0xe] << 8 | block[0xf]; |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
1066 for (idx = 0; idx < 16; ++idx) { |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
1067 unsigned char *p = block + pgc_offset + 0xa4 + 4 * idx; |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
1068 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
|
1069 } |
6110 | 1070 if(vob) |
1071 vob->have_palette = 1; | |
5388
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
1072 res = 0; |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
1073 } |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
1074 } |
7446
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
1075 rar_close(fd); |
5388
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
1076 } |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
1077 return res; |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
1078 } |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
1079 |
4080 | 1080 void * |
6110 | 1081 vobsub_open(const char *const name,const char *const ifo,const int force,void** spu) |
4080 | 1082 { |
25431
40bda123d2e7
Use calloc instead of malloc when allocate vobsub_t.
ulion
parents:
25361
diff
changeset
|
1083 vobsub_t *vob = calloc(1, sizeof(vobsub_t)); |
6110 | 1084 if(spu) |
1085 *spu = NULL; | |
25251
80804f0631f4
Skip empty vobsub streams when selecting subtitles.
ulion
parents:
25249
diff
changeset
|
1086 if (vobsubid == -2) |
80804f0631f4
Skip empty vobsub streams when selecting subtitles.
ulion
parents:
25249
diff
changeset
|
1087 vobsubid = vobsub_id; |
4080 | 1088 if (vob) { |
1089 char *buf; | |
19074
d385666efa27
removes unused parentheses lefted behind in the r19075 sizeof(char) cleanups, noticed by dalias
reynaldo
parents:
19070
diff
changeset
|
1090 buf = malloc(strlen(name) + 5); |
4080 | 1091 if (buf) { |
7446
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
1092 rar_stream_t *fd; |
4080 | 1093 mpeg_t *mpg; |
5388
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
1094 /* read in the info file */ |
6110 | 1095 if(!ifo) { |
1096 strcpy(buf, name); | |
1097 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
|
1098 vobsub_parse_ifo(vob,buf, vob->palette, &vob->orig_frame_width, &vob->orig_frame_height, force, -1, NULL); |
6110 | 1099 } 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
|
1100 vobsub_parse_ifo(vob,ifo, vob->palette, &vob->orig_frame_width, &vob->orig_frame_height, force, -1, NULL); |
4080 | 1101 /* read in the index */ |
1102 strcpy(buf, name); | |
1103 strcat(buf, ".idx"); | |
7446
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
1104 fd = rar_open(buf, "rb"); |
4787 | 1105 if (fd == NULL) { |
1106 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
|
1107 mp_msg(MSGT_VOBSUB,MSGL_ERR,"VobSub: Can't open IDX file\n"); |
6110 | 1108 else { |
1109 free(buf); | |
1110 free(vob); | |
1111 return NULL; | |
1112 } | |
4787 | 1113 } else { |
4080 | 1114 while (vobsub_parse_one_line(vob, fd) >= 0) |
1115 /* NOOP */ ; | |
7446
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
1116 rar_close(fd); |
4080 | 1117 } |
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
|
1118 /* if no palette in .idx then use custom colors */ |
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5563
diff
changeset
|
1119 if ((vob->custom == 0)&&(vob->have_palette!=1)) |
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5563
diff
changeset
|
1120 vob->custom = 1; |
6110 | 1121 if (spu && vob->orig_frame_width && vob->orig_frame_height) |
1122 *spu = spudec_new_scaled_vobsub(vob->palette, vob->cuspal, vob->custom, vob->orig_frame_width, vob->orig_frame_height); | |
4080 | 1123 |
1124 /* read the indexed mpeg_stream */ | |
1125 strcpy(buf, name); | |
1126 strcat(buf, ".sub"); | |
1127 mpg = mpeg_open(buf); | |
4787 | 1128 if (mpg == NULL) { |
6110 | 1129 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
|
1130 mp_msg(MSGT_VOBSUB,MSGL_ERR,"VobSub: Can't open SUB file\n"); |
6110 | 1131 else { |
1132 | |
1133 free(buf); | |
1134 free(vob); | |
1135 return NULL; | |
1136 } | |
4787 | 1137 } else { |
4080 | 1138 long last_pts_diff = 0; |
1139 while (!mpeg_eof(mpg)) { | |
1140 off_t pos = mpeg_tell(mpg); | |
1141 if (mpeg_run(mpg) < 0) { | |
1142 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
|
1143 mp_msg(MSGT_VOBSUB,MSGL_ERR,"VobSub: mpeg_run error\n"); |
4080 | 1144 break; |
1145 } | |
1146 if (mpg->packet_size) { | |
1147 if ((mpg->aid & 0xe0) == 0x20) { | |
1148 unsigned int sid = mpg->aid & 0x1f; | |
4085 | 1149 if (vobsub_ensure_spu_stream(vob, sid) >= 0) { |
4080 | 1150 packet_queue_t *queue = vob->spu_streams + sid; |
1151 /* get the packet to fill */ | |
4085 | 1152 if (queue->packets_size == 0 && packet_queue_grow(queue) < 0) |
1153 abort(); | |
4080 | 1154 while (queue->current_index + 1 < queue->packets_size |
1155 && queue->packets[queue->current_index + 1].filepos <= pos) | |
1156 ++queue->current_index; | |
1157 if (queue->current_index < queue->packets_size) { | |
1158 packet_t *pkt; | |
1159 if (queue->packets[queue->current_index].data) { | |
1160 /* insert a new packet and fix the PTS ! */ | |
1161 packet_queue_insert(queue); | |
1162 queue->packets[queue->current_index].pts100 = | |
1163 mpg->pts + last_pts_diff; | |
1164 } | |
1165 pkt = queue->packets + queue->current_index; | |
7417
c477dae38383
Fix support for negative "delay:" directive in .idx file.
kmkaplan
parents:
6831
diff
changeset
|
1166 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
|
1167 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
|
1168 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
|
1169 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
|
1170 pkt->pts100 = mpg->pts; |
4080 | 1171 /* FIXME: should not use mpg_sub internal informations, make a copy */ |
1172 pkt->data = mpg->packet; | |
1173 pkt->size = mpg->packet_size; | |
1174 mpg->packet = NULL; | |
1175 mpg->packet_reserve = 0; | |
1176 mpg->packet_size = 0; | |
7417
c477dae38383
Fix support for negative "delay:" directive in .idx file.
kmkaplan
parents:
6831
diff
changeset
|
1177 } |
4080 | 1178 } |
1179 } | |
1180 else | |
6110 | 1181 mp_msg(MSGT_VOBSUB,MSGL_WARN, "don't know what to do with subtitle #%u\n", sid); |
4080 | 1182 } |
1183 } | |
1184 } | |
1185 vob->spu_streams_current = vob->spu_streams_size; | |
25251
80804f0631f4
Skip empty vobsub streams when selecting subtitles.
ulion
parents:
25249
diff
changeset
|
1186 while (vob->spu_streams_current-- > 0) { |
4080 | 1187 vob->spu_streams[vob->spu_streams_current].current_index = 0; |
25251
80804f0631f4
Skip empty vobsub streams when selecting subtitles.
ulion
parents:
25249
diff
changeset
|
1188 if (vobsubid == vob->spu_streams_current || |
80804f0631f4
Skip empty vobsub streams when selecting subtitles.
ulion
parents:
25249
diff
changeset
|
1189 vob->spu_streams[vob->spu_streams_current].packets_size > 0) |
80804f0631f4
Skip empty vobsub streams when selecting subtitles.
ulion
parents:
25249
diff
changeset
|
1190 ++vob->spu_valid_streams_size; |
80804f0631f4
Skip empty vobsub streams when selecting subtitles.
ulion
parents:
25249
diff
changeset
|
1191 } |
4080 | 1192 mpeg_free(mpg); |
1193 } | |
1194 free(buf); | |
1195 } | |
1196 } | |
1197 return vob; | |
1198 } | |
1199 | |
1200 void | |
1201 vobsub_close(void *this) | |
1202 { | |
1203 vobsub_t *vob = (vobsub_t *)this; | |
1204 if (vob->spu_streams) { | |
1205 while (vob->spu_streams_size--) | |
1206 packet_queue_destroy(vob->spu_streams + vob->spu_streams_size); | |
1207 free(vob->spu_streams); | |
1208 } | |
1209 free(vob); | |
1210 } | |
1211 | |
7780
9806d65986e4
Mplayer can switch between subtitles of different languages during
kmkaplan
parents:
7446
diff
changeset
|
1212 unsigned int |
9806d65986e4
Mplayer can switch between subtitles of different languages during
kmkaplan
parents:
7446
diff
changeset
|
1213 vobsub_get_indexes_count(void *vobhandle) |
9806d65986e4
Mplayer can switch between subtitles of different languages during
kmkaplan
parents:
7446
diff
changeset
|
1214 { |
9806d65986e4
Mplayer can switch between subtitles of different languages during
kmkaplan
parents:
7446
diff
changeset
|
1215 vobsub_t *vob = (vobsub_t *) vobhandle; |
25251
80804f0631f4
Skip empty vobsub streams when selecting subtitles.
ulion
parents:
25249
diff
changeset
|
1216 return vob->spu_valid_streams_size; |
7780
9806d65986e4
Mplayer can switch between subtitles of different languages during
kmkaplan
parents:
7446
diff
changeset
|
1217 } |
9806d65986e4
Mplayer can switch between subtitles of different languages during
kmkaplan
parents:
7446
diff
changeset
|
1218 |
9806d65986e4
Mplayer can switch between subtitles of different languages during
kmkaplan
parents:
7446
diff
changeset
|
1219 char * |
9806d65986e4
Mplayer can switch between subtitles of different languages during
kmkaplan
parents:
7446
diff
changeset
|
1220 vobsub_get_id(void *vobhandle, unsigned int index) |
9806d65986e4
Mplayer can switch between subtitles of different languages during
kmkaplan
parents:
7446
diff
changeset
|
1221 { |
9806d65986e4
Mplayer can switch between subtitles of different languages during
kmkaplan
parents:
7446
diff
changeset
|
1222 vobsub_t *vob = (vobsub_t *) vobhandle; |
9806d65986e4
Mplayer can switch between subtitles of different languages during
kmkaplan
parents:
7446
diff
changeset
|
1223 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
|
1224 } |
9806d65986e4
Mplayer can switch between subtitles of different languages during
kmkaplan
parents:
7446
diff
changeset
|
1225 |
25251
80804f0631f4
Skip empty vobsub streams when selecting subtitles.
ulion
parents:
25249
diff
changeset
|
1226 int vobsub_get_id_by_index(void *vobhandle, unsigned int index) |
80804f0631f4
Skip empty vobsub streams when selecting subtitles.
ulion
parents:
25249
diff
changeset
|
1227 { |
80804f0631f4
Skip empty vobsub streams when selecting subtitles.
ulion
parents:
25249
diff
changeset
|
1228 vobsub_t *vob = vobhandle; |
80804f0631f4
Skip empty vobsub streams when selecting subtitles.
ulion
parents:
25249
diff
changeset
|
1229 int i, j; |
80804f0631f4
Skip empty vobsub streams when selecting subtitles.
ulion
parents:
25249
diff
changeset
|
1230 if (vob == NULL) |
80804f0631f4
Skip empty vobsub streams when selecting subtitles.
ulion
parents:
25249
diff
changeset
|
1231 return -1; |
80804f0631f4
Skip empty vobsub streams when selecting subtitles.
ulion
parents:
25249
diff
changeset
|
1232 for (i = 0, j = 0; i < vob->spu_streams_size; ++i) |
80804f0631f4
Skip empty vobsub streams when selecting subtitles.
ulion
parents:
25249
diff
changeset
|
1233 if (i == vobsubid || vob->spu_streams[i].packets_size > 0) { |
80804f0631f4
Skip empty vobsub streams when selecting subtitles.
ulion
parents:
25249
diff
changeset
|
1234 if (j == index) |
80804f0631f4
Skip empty vobsub streams when selecting subtitles.
ulion
parents:
25249
diff
changeset
|
1235 return i; |
80804f0631f4
Skip empty vobsub streams when selecting subtitles.
ulion
parents:
25249
diff
changeset
|
1236 ++j; |
80804f0631f4
Skip empty vobsub streams when selecting subtitles.
ulion
parents:
25249
diff
changeset
|
1237 } |
80804f0631f4
Skip empty vobsub streams when selecting subtitles.
ulion
parents:
25249
diff
changeset
|
1238 return -1; |
80804f0631f4
Skip empty vobsub streams when selecting subtitles.
ulion
parents:
25249
diff
changeset
|
1239 } |
80804f0631f4
Skip empty vobsub streams when selecting subtitles.
ulion
parents:
25249
diff
changeset
|
1240 |
80804f0631f4
Skip empty vobsub streams when selecting subtitles.
ulion
parents:
25249
diff
changeset
|
1241 int vobsub_get_index_by_id(void *vobhandle, int id) |
80804f0631f4
Skip empty vobsub streams when selecting subtitles.
ulion
parents:
25249
diff
changeset
|
1242 { |
80804f0631f4
Skip empty vobsub streams when selecting subtitles.
ulion
parents:
25249
diff
changeset
|
1243 vobsub_t *vob = vobhandle; |
80804f0631f4
Skip empty vobsub streams when selecting subtitles.
ulion
parents:
25249
diff
changeset
|
1244 int i, j; |
80804f0631f4
Skip empty vobsub streams when selecting subtitles.
ulion
parents:
25249
diff
changeset
|
1245 if (vob == NULL || id < 0 || id >= vob->spu_streams_size) |
80804f0631f4
Skip empty vobsub streams when selecting subtitles.
ulion
parents:
25249
diff
changeset
|
1246 return -1; |
80804f0631f4
Skip empty vobsub streams when selecting subtitles.
ulion
parents:
25249
diff
changeset
|
1247 if (id != vobsubid && !vob->spu_streams[id].packets_size) |
80804f0631f4
Skip empty vobsub streams when selecting subtitles.
ulion
parents:
25249
diff
changeset
|
1248 return -1; |
80804f0631f4
Skip empty vobsub streams when selecting subtitles.
ulion
parents:
25249
diff
changeset
|
1249 for (i = 0, j = 0; i < id; ++i) |
80804f0631f4
Skip empty vobsub streams when selecting subtitles.
ulion
parents:
25249
diff
changeset
|
1250 if (i == vobsubid || vob->spu_streams[i].packets_size > 0) |
80804f0631f4
Skip empty vobsub streams when selecting subtitles.
ulion
parents:
25249
diff
changeset
|
1251 ++j; |
80804f0631f4
Skip empty vobsub streams when selecting subtitles.
ulion
parents:
25249
diff
changeset
|
1252 return j; |
80804f0631f4
Skip empty vobsub streams when selecting subtitles.
ulion
parents:
25249
diff
changeset
|
1253 } |
80804f0631f4
Skip empty vobsub streams when selecting subtitles.
ulion
parents:
25249
diff
changeset
|
1254 |
10917
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
10893
diff
changeset
|
1255 unsigned int |
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
10893
diff
changeset
|
1256 vobsub_get_forced_subs_flag(void const * const vobhandle) |
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
10893
diff
changeset
|
1257 { |
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
10893
diff
changeset
|
1258 if (vobhandle) |
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
10893
diff
changeset
|
1259 return ((vobsub_t*) vobhandle)->forced_subs; |
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
10893
diff
changeset
|
1260 else |
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
10893
diff
changeset
|
1261 return 0; |
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
10893
diff
changeset
|
1262 } |
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
10893
diff
changeset
|
1263 |
6110 | 1264 int |
8535
bc7bd163fff9
Here is the patch to make vobsub subtitle use -slang option, I have not made a
arpi
parents:
8203
diff
changeset
|
1265 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
|
1266 { |
bc7bd163fff9
Here is the patch to make vobsub subtitle use -slang option, I have not made a
arpi
parents:
8203
diff
changeset
|
1267 int i; |
bc7bd163fff9
Here is the patch to make vobsub subtitle use -slang option, I have not made a
arpi
parents:
8203
diff
changeset
|
1268 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
|
1269 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
|
1270 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
|
1271 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
|
1272 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
|
1273 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
|
1274 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
|
1275 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
|
1276 } |
bc7bd163fff9
Here is the patch to make vobsub subtitle use -slang option, I have not made a
arpi
parents:
8203
diff
changeset
|
1277 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
|
1278 } |
11695 | 1279 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
|
1280 return -1; |
bc7bd163fff9
Here is the patch to make vobsub subtitle use -slang option, I have not made a
arpi
parents:
8203
diff
changeset
|
1281 } |
25322
078bdfd44751
Fix spudec to display current vobsub immediately after a seek.
ulion
parents:
25298
diff
changeset
|
1282 |
25791
5448bd27b954
Fix vobsub_seek use same reseek method as vobsub_get_packet did.
ulion
parents:
25746
diff
changeset
|
1283 /// 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
|
1284 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
|
1285 int reseek_count = 0; |
078bdfd44751
Fix spudec to display current vobsub immediately after a seek.
ulion
parents:
25298
diff
changeset
|
1286 unsigned int lastpts = 0; |
26733
99458e732ebd
Add detection code for abnormal pts jump when seeking previous.
ulion
parents:
26732
diff
changeset
|
1287 |
99458e732ebd
Add detection code for abnormal pts jump when seeking previous.
ulion
parents:
26732
diff
changeset
|
1288 if (queue->current_index > 0 |
99458e732ebd
Add detection code for abnormal pts jump when seeking previous.
ulion
parents:
26732
diff
changeset
|
1289 && (queue->packets[queue->current_index].pts100 == UINT_MAX |
99458e732ebd
Add detection code for abnormal pts jump when seeking previous.
ulion
parents:
26732
diff
changeset
|
1290 || queue->packets[queue->current_index].pts100 > pts100)) { |
99458e732ebd
Add detection code for abnormal pts jump when seeking previous.
ulion
parents:
26732
diff
changeset
|
1291 // possible pts seek previous, try to check it. |
99458e732ebd
Add detection code for abnormal pts jump when seeking previous.
ulion
parents:
26732
diff
changeset
|
1292 int i = 1; |
99458e732ebd
Add detection code for abnormal pts jump when seeking previous.
ulion
parents:
26732
diff
changeset
|
1293 while (queue->current_index >= i |
99458e732ebd
Add detection code for abnormal pts jump when seeking previous.
ulion
parents:
26732
diff
changeset
|
1294 && 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
|
1295 ++i; |
99458e732ebd
Add detection code for abnormal pts jump when seeking previous.
ulion
parents:
26732
diff
changeset
|
1296 if (queue->current_index >= i |
99458e732ebd
Add detection code for abnormal pts jump when seeking previous.
ulion
parents:
26732
diff
changeset
|
1297 && queue->packets[queue->current_index-i].pts100 > pts100) |
99458e732ebd
Add detection code for abnormal pts jump when seeking previous.
ulion
parents:
26732
diff
changeset
|
1298 // pts seek previous confirmed, reseek from beginning |
99458e732ebd
Add detection code for abnormal pts jump when seeking previous.
ulion
parents:
26732
diff
changeset
|
1299 queue->current_index = 0; |
99458e732ebd
Add detection code for abnormal pts jump when seeking previous.
ulion
parents:
26732
diff
changeset
|
1300 } |
25322
078bdfd44751
Fix spudec to display current vobsub immediately after a seek.
ulion
parents:
25298
diff
changeset
|
1301 while (queue->current_index < queue->packets_size |
078bdfd44751
Fix spudec to display current vobsub immediately after a seek.
ulion
parents:
25298
diff
changeset
|
1302 && queue->packets[queue->current_index].pts100 <= pts100) { |
078bdfd44751
Fix spudec to display current vobsub immediately after a seek.
ulion
parents:
25298
diff
changeset
|
1303 lastpts = queue->packets[queue->current_index].pts100; |
078bdfd44751
Fix spudec to display current vobsub immediately after a seek.
ulion
parents:
25298
diff
changeset
|
1304 ++queue->current_index; |
078bdfd44751
Fix spudec to display current vobsub immediately after a seek.
ulion
parents:
25298
diff
changeset
|
1305 ++reseek_count; |
078bdfd44751
Fix spudec to display current vobsub immediately after a seek.
ulion
parents:
25298
diff
changeset
|
1306 } |
25746
330af0160c2d
Fix code to prevent from accessing queue->packets[-1].pts that causes a crash.
ulion
parents:
25443
diff
changeset
|
1307 while (reseek_count-- && --queue->current_index) { |
25322
078bdfd44751
Fix spudec to display current vobsub immediately after a seek.
ulion
parents:
25298
diff
changeset
|
1308 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
|
1309 queue->packets[queue->current_index-1].pts100 != lastpts) |
078bdfd44751
Fix spudec to display current vobsub immediately after a seek.
ulion
parents:
25298
diff
changeset
|
1310 break; |
078bdfd44751
Fix spudec to display current vobsub immediately after a seek.
ulion
parents:
25298
diff
changeset
|
1311 } |
25791
5448bd27b954
Fix vobsub_seek use same reseek method as vobsub_get_packet did.
ulion
parents:
25746
diff
changeset
|
1312 } |
5448bd27b954
Fix vobsub_seek use same reseek method as vobsub_get_packet did.
ulion
parents:
25746
diff
changeset
|
1313 |
5448bd27b954
Fix vobsub_seek use same reseek method as vobsub_get_packet did.
ulion
parents:
25746
diff
changeset
|
1314 int |
5448bd27b954
Fix vobsub_seek use same reseek method as vobsub_get_packet did.
ulion
parents:
25746
diff
changeset
|
1315 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
|
1316 vobsub_t *vob = (vobsub_t *)vobhandle; |
5448bd27b954
Fix vobsub_seek use same reseek method as vobsub_get_packet did.
ulion
parents:
25746
diff
changeset
|
1317 unsigned int pts100 = 90000 * pts; |
5448bd27b954
Fix vobsub_seek use same reseek method as vobsub_get_packet did.
ulion
parents:
25746
diff
changeset
|
1318 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
|
1319 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
|
1320 |
5448bd27b954
Fix vobsub_seek use same reseek method as vobsub_get_packet did.
ulion
parents:
25746
diff
changeset
|
1321 vobsub_queue_reseek(queue, pts100); |
25322
078bdfd44751
Fix spudec to display current vobsub immediately after a seek.
ulion
parents:
25298
diff
changeset
|
1322 |
6110 | 1323 while (queue->current_index < queue->packets_size) { |
1324 packet_t *pkt = queue->packets + queue->current_index; | |
7417
c477dae38383
Fix support for negative "delay:" directive in .idx file.
kmkaplan
parents:
6831
diff
changeset
|
1325 if (pkt->pts100 != UINT_MAX) |
6110 | 1326 if (pkt->pts100 <= pts100) { |
1327 ++queue->current_index; | |
1328 *data = pkt->data; | |
1329 *timestamp = pkt->pts100; | |
1330 return pkt->size; | |
1331 } else break; | |
7417
c477dae38383
Fix support for negative "delay:" directive in .idx file.
kmkaplan
parents:
6831
diff
changeset
|
1332 else |
c477dae38383
Fix support for negative "delay:" directive in .idx file.
kmkaplan
parents:
6831
diff
changeset
|
1333 ++queue->current_index; |
4080 | 1334 } |
6110 | 1335 } |
1336 return -1; | |
4080 | 1337 } |
1338 | |
6829 | 1339 int |
1340 vobsub_get_next_packet(void *vobhandle, void** data, int* timestamp) | |
1341 { | |
1342 vobsub_t *vob = (vobsub_t *)vobhandle; | |
1343 if (vob->spu_streams && 0 <= vobsub_id && (unsigned) vobsub_id < vob->spu_streams_size) { | |
1344 packet_queue_t *queue = vob->spu_streams + vobsub_id; | |
1345 if (queue->current_index < queue->packets_size) { | |
1346 packet_t *pkt = queue->packets + queue->current_index; | |
1347 ++queue->current_index; | |
1348 *data = pkt->data; | |
1349 *timestamp = pkt->pts100; | |
1350 return pkt->size; | |
1351 } | |
1352 } | |
1353 return -1; | |
1354 } | |
1355 | |
11589 | 1356 void vobsub_seek(void * vobhandle, float pts) |
1357 { | |
1358 vobsub_t * vob = (vobsub_t *)vobhandle; | |
1359 packet_queue_t * queue; | |
26732 | 1360 int seek_pts100 = pts * 90000; |
11589 | 1361 |
1362 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
|
1363 /* 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
|
1364 if (vobsub_get_id(vob, vobsub_id) == NULL) |
4afcdb7b8aab
fix the crash when seek with 'unknown' subtitles, hopefully...
luran
parents:
11695
diff
changeset
|
1365 return; |
11589 | 1366 queue = vob->spu_streams + vobsub_id; |
1367 queue->current_index = 0; | |
25791
5448bd27b954
Fix vobsub_seek use same reseek method as vobsub_get_packet did.
ulion
parents:
25746
diff
changeset
|
1368 vobsub_queue_reseek(queue, seek_pts100); |
11589 | 1369 } |
1370 } | |
1371 | |
4080 | 1372 void |
1373 vobsub_reset(void *vobhandle) | |
1374 { | |
1375 vobsub_t *vob = (vobsub_t *)vobhandle; | |
1376 if (vob->spu_streams) { | |
1377 unsigned int n = vob->spu_streams_size; | |
1378 while (n-- > 0) | |
1379 vob->spu_streams[n].current_index = 0; | |
1380 } | |
1381 } | |
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
|
1382 |
f8551f89dd48
MEncoder vobsub ripping support, currently not compatible with windows vobsub, some bugs to be fixed. However it already works with mplayer, so it's a start.
atmos4
parents:
6163
diff
changeset
|
1383 /********************************************************************** |
f8551f89dd48
MEncoder vobsub ripping support, currently not compatible with windows vobsub, some bugs to be fixed. However it already works with mplayer, so it's a start.
atmos4
parents:
6163
diff
changeset
|
1384 * 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
|
1385 **********************************************************************/ |
f8551f89dd48
MEncoder vobsub ripping support, currently not compatible with windows vobsub, some bugs to be fixed. However it already works with mplayer, so it's a start.
atmos4
parents:
6163
diff
changeset
|
1386 |
f8551f89dd48
MEncoder vobsub ripping support, currently not compatible with windows vobsub, some bugs to be fixed. However it already works with mplayer, so it's a start.
atmos4
parents:
6163
diff
changeset
|
1387 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
|
1388 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
|
1389 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
|
1390 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
|
1391 } 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
|
1392 |
f8551f89dd48
MEncoder vobsub ripping support, currently not compatible with windows vobsub, some bugs to be fixed. However it already works with mplayer, so it's a start.
atmos4
parents:
6163
diff
changeset
|
1393 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
|
1394 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
|
1395 { |
f8551f89dd48
MEncoder vobsub ripping support, currently not compatible with windows vobsub, some bugs to be fixed. However it already works with mplayer, so it's a start.
atmos4
parents:
6163
diff
changeset
|
1396 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
|
1397 fprintf(me->fidx, |
6706
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1398 "# 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
|
1399 "#\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
|
1400 "# 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
|
1401 "# 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
|
1402 "# 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
|
1403 "#\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
|
1404 "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
|
1405 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
|
1406 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
|
1407 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
|
1408 for (i = 0; i < 16; ++i) { |
6831 | 1409 const double y = palette[i] >> 16 & 0xff, |
1410 u = (palette[i] >> 8 & 0xff) - 128.0, | |
1411 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
|
1412 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
|
1413 putc(',', me->fidx); |
6831 | 1414 fprintf(me->fidx, " %02x%02x%02x", |
22377
fd54975f9135
Use libavutil's av_clip* instead of unreadable MIN/MAX chaos.
reimar
parents:
21444
diff
changeset
|
1415 av_clip_uint8(y + 1.4022 * u), |
fd54975f9135
Use libavutil's av_clip* instead of unreadable MIN/MAX chaos.
reimar
parents:
21444
diff
changeset
|
1416 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
|
1417 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
|
1418 } |
f8551f89dd48
MEncoder vobsub ripping support, currently not compatible with windows vobsub, some bugs to be fixed. However it already works with mplayer, so it's a start.
atmos4
parents:
6163
diff
changeset
|
1419 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
|
1420 } |
10917
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
10893
diff
changeset
|
1421 |
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
10893
diff
changeset
|
1422 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
|
1423 "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
|
1424 } |
f8551f89dd48
MEncoder vobsub ripping support, currently not compatible with windows vobsub, some bugs to be fixed. However it already works with mplayer, so it's a start.
atmos4
parents:
6163
diff
changeset
|
1425 |
f8551f89dd48
MEncoder vobsub ripping support, currently not compatible with windows vobsub, some bugs to be fixed. However it already works with mplayer, so it's a start.
atmos4
parents:
6163
diff
changeset
|
1426 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
|
1427 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
|
1428 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
|
1429 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
|
1430 { |
f8551f89dd48
MEncoder vobsub ripping support, currently not compatible with windows vobsub, some bugs to be fixed. However it already works with mplayer, so it's a start.
atmos4
parents:
6163
diff
changeset
|
1431 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
|
1432 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
|
1433 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
|
1434 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
|
1435 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
|
1436 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
|
1437 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
|
1438 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
|
1439 strcat(filename, ".sub"); |
21444
ce7567436cb0
Open vobsub output files in binary mode, otherwise the OS might
reimar
parents:
20096
diff
changeset
|
1440 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
|
1441 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
|
1442 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
|
1443 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
|
1444 strcat(filename, ".idx"); |
21444
ce7567436cb0
Open vobsub output files in binary mode, otherwise the OS might
reimar
parents:
20096
diff
changeset
|
1445 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
|
1446 if (result->fidx) { |
8014
3d6904cee13e
The first language ripped is set as the default language
arpi
parents:
7780
diff
changeset
|
1447 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
|
1448 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
|
1449 /* Make the selected language the default language */ |
3d6904cee13e
The first language ripped is set as the default language
arpi
parents:
7780
diff
changeset
|
1450 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
|
1451 } |
6674
f8551f89dd48
MEncoder vobsub ripping support, currently not compatible with windows vobsub, some bugs to be fixed. However it already works with mplayer, so it's a start.
atmos4
parents:
6163
diff
changeset
|
1452 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
|
1453 /* So that we can check the file now */ |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1454 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
|
1455 } |
f8551f89dd48
MEncoder vobsub ripping support, currently not compatible with windows vobsub, some bugs to be fixed. However it already works with mplayer, so it's a start.
atmos4
parents:
6163
diff
changeset
|
1456 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
|
1457 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
|
1458 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
|
1459 } |
f8551f89dd48
MEncoder vobsub ripping support, currently not compatible with windows vobsub, some bugs to be fixed. However it already works with mplayer, so it's a start.
atmos4
parents:
6163
diff
changeset
|
1460 } |
f8551f89dd48
MEncoder vobsub ripping support, currently not compatible with windows vobsub, some bugs to be fixed. However it already works with mplayer, so it's a start.
atmos4
parents:
6163
diff
changeset
|
1461 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
|
1462 } |
f8551f89dd48
MEncoder vobsub ripping support, currently not compatible with windows vobsub, some bugs to be fixed. However it already works with mplayer, so it's a start.
atmos4
parents:
6163
diff
changeset
|
1463 |
f8551f89dd48
MEncoder vobsub ripping support, currently not compatible with windows vobsub, some bugs to be fixed. However it already works with mplayer, so it's a start.
atmos4
parents:
6163
diff
changeset
|
1464 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
|
1465 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
|
1466 { |
f8551f89dd48
MEncoder vobsub ripping support, currently not compatible with windows vobsub, some bugs to be fixed. However it already works with mplayer, so it's a start.
atmos4
parents:
6163
diff
changeset
|
1467 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
|
1468 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
|
1469 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
|
1470 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
|
1471 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
|
1472 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
|
1473 } |
f8551f89dd48
MEncoder vobsub ripping support, currently not compatible with windows vobsub, some bugs to be fixed. However it already works with mplayer, so it's a start.
atmos4
parents:
6163
diff
changeset
|
1474 |
f8551f89dd48
MEncoder vobsub ripping support, currently not compatible with windows vobsub, some bugs to be fixed. However it already works with mplayer, so it's a start.
atmos4
parents:
6163
diff
changeset
|
1475 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
|
1476 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
|
1477 { |
6706
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1478 static double last_pts; |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1479 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
|
1480 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
|
1481 if (vob->fsub) { |
6706
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1482 /* 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
|
1483 unsigned char buffer[2048]; |
6706
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1484 unsigned char *p; |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1485 int remain = 2048; |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1486 /* 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
|
1487 breaks Windows' Vobsub */ |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1488 if (vob->fidx && (!last_pts_set || last_pts != pts)) { |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1489 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
|
1490 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
|
1491 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
|
1492 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
|
1493 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
|
1494 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
|
1495 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
|
1496 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
|
1497 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
|
1498 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
|
1499 ms = 0; |
6706
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1500 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
|
1501 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
|
1502 h, m, (unsigned int) s, ms, ftell(vob->fsub)); |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1503 last_h = h; |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1504 last_m = m; |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1505 last_s = (unsigned int) s; |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1506 last_ms = ms; |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1507 } |
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
|
1508 } |
6706
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1509 last_pts = pts; |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1510 last_pts_set = 1; |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1511 |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1512 /* Packet start code: Windows' Vobsub needs this */ |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1513 p = buffer; |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1514 *p++ = 0; /* 0x00 */ |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1515 *p++ = 0; |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1516 *p++ = 1; |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1517 *p++ = 0xba; |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1518 *p++ = 0x40; |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1519 memset(p, 0, 9); |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1520 p += 9; |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1521 { /* Packet */ |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1522 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
|
1523 unsigned char now_pts[5]; |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1524 int pts_len, pad_len, datalen = len; |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1525 pts *= 90000; |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1526 now_pts[0] = 0x21 | (((unsigned long)pts >> 29) & 0x0e); |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1527 now_pts[1] = ((unsigned long)pts >> 22) & 0xff; |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1528 now_pts[2] = 0x01 | (((unsigned long)pts >> 14) & 0xfe); |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1529 now_pts[3] = ((unsigned long)pts >> 7) & 0xff; |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1530 now_pts[4] = 0x01 | (((unsigned long)pts << 1) & 0xfe); |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1531 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
|
1532 memcpy(last_pts, now_pts, sizeof(now_pts)); |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1533 |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1534 datalen += 3; /* Version, PTS_flags, pts_len */ |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1535 datalen += pts_len; |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1536 datalen += 1; /* AID */ |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1537 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
|
1538 /* 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
|
1539 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
|
1540 with padding (0x000001be) latter I'll do that. But if |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1541 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
|
1542 padding packet. So I add some padding in the PTS |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1543 field. This looks like a dirty kludge. Oh well... */ |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1544 if (pad_len < 0) { |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1545 /* 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
|
1546 datalen -= pts_len; |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1547 pts_len = 0; |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1548 pad_len = 0; |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1549 } |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1550 else if (pad_len > 6) |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1551 pad_len = 0; |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1552 datalen += pad_len; |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1553 |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1554 *p++ = 0; /* 0x0e */ |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1555 *p++ = 0; |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1556 *p++ = 1; |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1557 *p++ = 0xbd; |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1558 |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1559 *p++ = (datalen >> 8) & 0xff; /* length of payload */ |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1560 *p++ = datalen & 0xff; |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1561 *p++ = 0x80; /* System-2 (.VOB) stream */ |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1562 *p++ = pts_len ? 0x80 : 0x00; /* pts_flags */ |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1563 *p++ = pts_len + pad_len; |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1564 memcpy(p, now_pts, pts_len); |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1565 p += pts_len; |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1566 memset(p, 0, pad_len); |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1567 p += pad_len; |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1568 } |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1569 *p++ = 0x20 | vob->aid; /* aid */ |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1570 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
|
1571 || 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
|
1572 perror("ERROR: vobsub write failed"); |
6706
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1573 else |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1574 remain -= p - buffer + len; |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1575 |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1576 /* Padding */ |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1577 if (remain >= 6) { |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1578 p = buffer; |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1579 *p++ = 0x00; |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1580 *p++ = 0x00; |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1581 *p++ = 0x01; |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1582 *p++ = 0xbe; |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1583 *p++ = (remain - 6) >> 8; |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1584 *p++ = (remain - 6) & 0xff; |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1585 /* for better compression, blank this */ |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1586 memset(buffer + 6, 0, remain - (p - buffer)); |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1587 if (fwrite(buffer, remain, 1, vob->fsub) != 1) |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1588 perror("ERROR: vobsub padding write failed"); |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1589 } |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1590 else if (remain > 0) { |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1591 /* 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
|
1592 needs to be 2KB big */ |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1593 memset(buffer, 0, remain); |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1594 if (fwrite(buffer, remain, 1, vob->fsub) != 1) |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1595 perror("ERROR: vobsub blank padding write failed"); |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1596 } |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1597 else if (remain < 0) |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1598 fprintf(stderr, |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1599 "\nERROR: wrong thing happenned...\n" |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1600 " 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
|
1601 } |
f8551f89dd48
MEncoder vobsub ripping support, currently not compatible with windows vobsub, some bugs to be fixed. However it already works with mplayer, so it's a start.
atmos4
parents:
6163
diff
changeset
|
1602 } |