Mercurial > mplayer.hg
annotate vobsub.c @ 22153:0cf24df5d97b
Revert part of commit r22170.
FFmpeg lavcodecs version is still
(or according to ffmpeg commit r7868, it's back to)
49.3.0, so global variables are not yet directly accessable (if ever).
author | iive |
---|---|
date | Wed, 07 Feb 2007 12:31:37 +0000 |
parents | ce7567436cb0 |
children | fd54975f9135 |
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" | |
7446
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
23 #ifdef USE_UNRARLIB |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
24 #include "unrarlib.h" |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
25 #endif |
4080 | 26 |
6831 | 27 #define MIN(a, b) ((a)<(b)?(a):(b)) |
28 #define MAX(a, b) ((a)>(b)?(a):(b)) | |
29 | |
4080 | 30 extern int vobsub_id; |
31 | |
7446
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
32 /********************************************************************** |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
33 * RAR stream handling |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
34 * 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
|
35 * See <URL:http://www.unrarlib.org/> |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
36 **********************************************************************/ |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
37 #ifdef USE_UNRARLIB |
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; |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
48 /* unrarlib can only read */ |
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; |
7446
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
61 int rc; |
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 } |
3af4919d9c5f
When you called mplayer with the absolute path to the video and the VOBSUB
arpi
parents:
8027
diff
changeset
|
90 rc = urarlib_get(&stream->data, &stream->size, (char*) 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. */ |
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
|
95 int i, num_files, name_len; |
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; |
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
|
97 /* the cast in the next line is a hack to overcome a design flaw (IMHO) in unrarlib */ |
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 num_files = urarlib_list (rar_filename, (ArchiveList_struct *)&list); |
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 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
|
100 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
|
101 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
|
102 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
|
103 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
|
104 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
|
105 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
|
106 if (name_len >= demanded_ext_len && !strcasecmp (lp->item.Name + name_len - demanded_ext_len, 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
|
107 if ((rc = urarlib_get(&stream->data, &stream->size, lp->item.Name, 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
|
108 break; |
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 } |
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
|
112 } |
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 urarlib_freelist (list); |
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 } |
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 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
|
116 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
|
117 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
|
118 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
|
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 } |
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
|
121 |
7446
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
122 free(rar_filename); |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
123 stream->pos = 0; |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
124 } |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
125 return stream; |
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 |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
128 static int |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
129 rar_close(rar_stream_t *stream) |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
130 { |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
131 if (stream->file) |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
132 return fclose(stream->file); |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
133 free(stream->data); |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
134 return 0; |
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 |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
137 static int |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
138 rar_eof(rar_stream_t *stream) |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
139 { |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
140 if (stream->file) |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
141 return feof(stream->file); |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
142 return stream->pos >= stream->size; |
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 |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
145 static long |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
146 rar_tell(rar_stream_t *stream) |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
147 { |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
148 if (stream->file) |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
149 return ftell(stream->file); |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
150 return stream->pos; |
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 |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
153 static int |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
154 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
|
155 { |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
156 if (stream->file) |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
157 return fseek(stream->file, offset, whence); |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
158 switch (whence) { |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
159 case SEEK_SET: |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
160 if (offset < 0) { |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
161 errno = EINVAL; |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
162 return -1; |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
163 } |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
164 stream->pos = offset; |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
165 break; |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
166 case SEEK_CUR: |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
167 if (offset < 0 && stream->pos < (unsigned long) -offset) { |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
168 errno = EINVAL; |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
169 return -1; |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
170 } |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
171 stream->pos += offset; |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
172 break; |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
173 case SEEK_END: |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
174 if (offset < 0 && stream->size < (unsigned long) -offset) { |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
175 errno = EINVAL; |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
176 return -1; |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
177 } |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
178 stream->pos = stream->size + offset; |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
179 break; |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
180 default: |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
181 errno = EINVAL; |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
182 return -1; |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
183 } |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
184 return 0; |
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 |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
187 static int |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
188 rar_getc(rar_stream_t *stream) |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
189 { |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
190 if (stream->file) |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
191 return getc(stream->file); |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
192 if (rar_eof(stream)) |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
193 return EOF; |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
194 return stream->data[stream->pos++]; |
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 |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
197 static size_t |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
198 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
|
199 { |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
200 size_t res; |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
201 unsigned long remain; |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
202 if (stream->file) |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
203 return fread(ptr, size, nmemb, stream->file); |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
204 if (rar_eof(stream)) |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
205 return 0; |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
206 res = size * nmemb; |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
207 remain = stream->size - stream->pos; |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
208 if (res > remain) |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
209 res = remain / size * size; |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
210 memcpy(ptr, stream->data + stream->pos, res); |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
211 stream->pos += res; |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
212 res /= size; |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
213 return res; |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
214 } |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
215 |
4080 | 216 #else |
7446
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
217 typedef FILE rar_stream_t; |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
218 #define rar_open fopen |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
219 #define rar_close fclose |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
220 #define rar_eof feof |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
221 #define rar_tell ftell |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
222 #define rar_seek fseek |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
223 #define rar_getc getc |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
224 #define rar_read fread |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
225 #endif |
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 /**********************************************************************/ |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
228 |
4080 | 229 static ssize_t |
17527 | 230 vobsub_getline(char **lineptr, size_t *n, rar_stream_t *stream) |
4080 | 231 { |
232 size_t res = 0; | |
233 int c; | |
234 if (*lineptr == NULL) { | |
235 *lineptr = malloc(4096); | |
236 if (*lineptr) | |
237 *n = 4096; | |
238 } | |
239 else if (*n == 0) { | |
240 char *tmp = realloc(*lineptr, 4096); | |
241 if (tmp) { | |
242 *lineptr = tmp; | |
243 *n = 4096; | |
244 } | |
245 } | |
246 if (*lineptr == NULL || *n == 0) | |
247 return -1; | |
248 | |
7446
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
249 for (c = rar_getc(stream); c != EOF; c = rar_getc(stream)) { |
4080 | 250 if (res + 1 >= *n) { |
251 char *tmp = realloc(*lineptr, *n * 2); | |
252 if (tmp == NULL) | |
253 return -1; | |
254 *lineptr = tmp; | |
255 *n *= 2; | |
256 } | |
257 (*lineptr)[res++] = c; | |
258 if (c == '\n') { | |
259 (*lineptr)[res] = 0; | |
260 return res; | |
261 } | |
262 } | |
263 if (res == 0) | |
264 return -1; | |
265 (*lineptr)[res] = 0; | |
266 return res; | |
267 } | |
268 | |
269 /********************************************************************** | |
270 * MPEG parsing | |
271 **********************************************************************/ | |
272 | |
273 typedef struct { | |
7446
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
274 rar_stream_t *stream; |
4080 | 275 unsigned int pts; |
276 int aid; | |
277 unsigned char *packet; | |
278 unsigned int packet_reserve; | |
279 unsigned int packet_size; | |
280 } mpeg_t; | |
281 | |
282 static mpeg_t * | |
283 mpeg_open(const char *filename) | |
284 { | |
285 mpeg_t *res = malloc(sizeof(mpeg_t)); | |
286 int err = res == NULL; | |
287 if (!err) { | |
288 res->pts = 0; | |
289 res->aid = -1; | |
290 res->packet = NULL; | |
291 res->packet_size = 0; | |
292 res->packet_reserve = 0; | |
10893 | 293 res->stream = rar_open(filename, "rb"); |
6773
24f3276523af
Remove depency on libmpdemux streams, use ANSI IO instead.
kmkaplan
parents:
6706
diff
changeset
|
294 err = res->stream == NULL; |
24f3276523af
Remove depency on libmpdemux streams, use ANSI IO instead.
kmkaplan
parents:
6706
diff
changeset
|
295 if (err) |
24f3276523af
Remove depency on libmpdemux streams, use ANSI IO instead.
kmkaplan
parents:
6706
diff
changeset
|
296 perror("fopen Vobsub file failed"); |
4080 | 297 if (err) |
298 free(res); | |
299 } | |
300 return err ? NULL : res; | |
301 } | |
302 | |
303 static void | |
304 mpeg_free(mpeg_t *mpeg) | |
305 { | |
306 if (mpeg->packet) | |
307 free(mpeg->packet); | |
6773
24f3276523af
Remove depency on libmpdemux streams, use ANSI IO instead.
kmkaplan
parents:
6706
diff
changeset
|
308 if (mpeg->stream) |
7446
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
309 rar_close(mpeg->stream); |
4080 | 310 free(mpeg); |
311 } | |
312 | |
313 static int | |
314 mpeg_eof(mpeg_t *mpeg) | |
315 { | |
7446
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
316 return rar_eof(mpeg->stream); |
4080 | 317 } |
318 | |
319 static off_t | |
320 mpeg_tell(mpeg_t *mpeg) | |
321 { | |
7446
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
322 return rar_tell(mpeg->stream); |
4080 | 323 } |
324 | |
325 static int | |
326 mpeg_run(mpeg_t *mpeg) | |
327 { | |
328 unsigned int len, idx, version; | |
329 int c; | |
330 /* Goto start of a packet, it starts with 0x000001?? */ | |
331 const unsigned char wanted[] = { 0, 0, 1 }; | |
332 unsigned char buf[5]; | |
333 | |
334 mpeg->aid = -1; | |
335 mpeg->packet_size = 0; | |
7446
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
336 if (rar_read(buf, 4, 1, mpeg->stream) != 1) |
4080 | 337 return -1; |
338 while (memcmp(buf, wanted, sizeof(wanted)) != 0) { | |
7446
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
339 c = rar_getc(mpeg->stream); |
4080 | 340 if (c < 0) |
341 return -1; | |
342 memmove(buf, buf + 1, 3); | |
343 buf[3] = c; | |
344 } | |
345 switch (buf[3]) { | |
346 case 0xb9: /* System End Code */ | |
347 break; | |
348 case 0xba: /* Packet start code */ | |
7446
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
349 c = rar_getc(mpeg->stream); |
4080 | 350 if (c < 0) |
351 return -1; | |
352 if ((c & 0xc0) == 0x40) | |
353 version = 4; | |
354 else if ((c & 0xf0) == 0x20) | |
355 version = 2; | |
356 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
|
357 mp_msg(MSGT_VOBSUB,MSGL_ERR, "VobSub: Unsupported MPEG version: 0x%02x\n", c); |
4080 | 358 return -1; |
359 } | |
360 if (version == 4) { | |
7446
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
361 if (rar_seek(mpeg->stream, 9, SEEK_CUR)) |
4080 | 362 return -1; |
363 } | |
364 else if (version == 2) { | |
7446
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
365 if (rar_seek(mpeg->stream, 7, SEEK_CUR)) |
4080 | 366 return -1; |
367 } | |
368 else | |
369 abort(); | |
370 break; | |
371 case 0xbd: /* packet */ | |
7446
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
372 if (rar_read(buf, 2, 1, mpeg->stream) != 1) |
4080 | 373 return -1; |
374 len = buf[0] << 8 | buf[1]; | |
375 idx = mpeg_tell(mpeg); | |
7446
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
376 c = rar_getc(mpeg->stream); |
4080 | 377 if (c < 0) |
378 return -1; | |
379 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
|
380 if (rar_getc(mpeg->stream) < 0) |
4080 | 381 return -1; |
7446
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
382 c = rar_getc(mpeg->stream); |
4080 | 383 if (c < 0) |
384 return -1; | |
385 } | |
386 if ((c & 0xf0) == 0x20) { /* System-1 stream timestamp */ | |
387 /* Do we need this? */ | |
388 abort(); | |
389 } | |
390 else if ((c & 0xf0) == 0x30) { | |
391 /* Do we need this? */ | |
392 abort(); | |
393 } | |
394 else if ((c & 0xc0) == 0x80) { /* System-2 (.VOB) stream */ | |
395 unsigned int pts_flags, hdrlen, dataidx; | |
7446
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
396 c = rar_getc(mpeg->stream); |
4080 | 397 if (c < 0) |
398 return -1; | |
399 pts_flags = c; | |
7446
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
400 c = rar_getc(mpeg->stream); |
4080 | 401 if (c < 0) |
402 return -1; | |
403 hdrlen = c; | |
404 dataidx = mpeg_tell(mpeg) + hdrlen; | |
405 if (dataidx > idx + len) { | |
6110 | 406 mp_msg(MSGT_VOBSUB,MSGL_ERR, "Invalid header length: %d (total length: %d, idx: %d, dataidx: %d)\n", |
4080 | 407 hdrlen, len, idx, dataidx); |
408 return -1; | |
409 } | |
410 if ((pts_flags & 0xc0) == 0x80) { | |
7446
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
411 if (rar_read(buf, 5, 1, mpeg->stream) != 1) |
4080 | 412 return -1; |
413 if (!(((buf[0] & 0xf0) == 0x20) && (buf[0] & 1) && (buf[2] & 1) && (buf[4] & 1))) { | |
6110 | 414 mp_msg(MSGT_VOBSUB,MSGL_ERR, "vobsub PTS error: 0x%02x %02x%02x %02x%02x \n", |
4080 | 415 buf[0], buf[1], buf[2], buf[3], buf[4]); |
416 mpeg->pts = 0; | |
417 } | |
418 else | |
419 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
|
420 | buf[3] << 7 | (buf[4] >> 1)); |
4080 | 421 } |
422 else /* if ((pts_flags & 0xc0) == 0xc0) */ { | |
423 /* what's this? */ | |
424 /* abort(); */ | |
425 } | |
7446
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
426 rar_seek(mpeg->stream, dataidx, SEEK_SET); |
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
427 mpeg->aid = rar_getc(mpeg->stream); |
4080 | 428 if (mpeg->aid < 0) { |
6110 | 429 mp_msg(MSGT_VOBSUB,MSGL_ERR, "Bogus aid %d\n", mpeg->aid); |
4080 | 430 return -1; |
431 } | |
432 mpeg->packet_size = len - ((unsigned int) mpeg_tell(mpeg) - idx); | |
433 if (mpeg->packet_reserve < mpeg->packet_size) { | |
434 if (mpeg->packet) | |
435 free(mpeg->packet); | |
436 mpeg->packet = malloc(mpeg->packet_size); | |
437 if (mpeg->packet) | |
438 mpeg->packet_reserve = mpeg->packet_size; | |
439 } | |
440 if (mpeg->packet == NULL) { | |
6110 | 441 mp_msg(MSGT_VOBSUB,MSGL_FATAL,"malloc failure"); |
4080 | 442 mpeg->packet_reserve = 0; |
443 mpeg->packet_size = 0; | |
444 return -1; | |
445 } | |
7446
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
446 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
|
447 mp_msg(MSGT_VOBSUB,MSGL_ERR,"fread failure"); |
4080 | 448 mpeg->packet_size = 0; |
449 return -1; | |
450 } | |
451 idx = len; | |
452 } | |
453 break; | |
454 case 0xbe: /* Padding */ | |
7446
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
455 if (rar_read(buf, 2, 1, mpeg->stream) != 1) |
4080 | 456 return -1; |
457 len = buf[0] << 8 | buf[1]; | |
7446
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
458 if (len > 0 && rar_seek(mpeg->stream, len, SEEK_CUR)) |
4080 | 459 return -1; |
460 break; | |
461 default: | |
5388
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
462 if (0xc0 <= buf[3] && buf[3] < 0xf0) { |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
463 /* MPEG audio or video */ |
7446
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
464 if (rar_read(buf, 2, 1, mpeg->stream) != 1) |
5388
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
465 return -1; |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
466 len = buf[0] << 8 | buf[1]; |
7446
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
467 if (len > 0 && rar_seek(mpeg->stream, len, SEEK_CUR)) |
5388
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
468 return -1; |
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 } |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
471 else { |
6110 | 472 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
|
473 buf[0], buf[1], buf[2], buf[3]); |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
474 return -1; |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
475 } |
4080 | 476 } |
477 return 0; | |
478 } | |
479 | |
480 /********************************************************************** | |
481 * Packet queue | |
482 **********************************************************************/ | |
483 | |
484 typedef struct { | |
485 unsigned int pts100; | |
486 off_t filepos; | |
487 unsigned int size; | |
488 unsigned char *data; | |
489 } packet_t; | |
490 | |
491 typedef struct { | |
492 char *id; | |
493 packet_t *packets; | |
494 unsigned int packets_reserve; | |
495 unsigned int packets_size; | |
496 unsigned int current_index; | |
497 } packet_queue_t; | |
498 | |
499 static void | |
500 packet_construct(packet_t *pkt) | |
501 { | |
502 pkt->pts100 = 0; | |
503 pkt->filepos = 0; | |
504 pkt->size = 0; | |
505 pkt->data = NULL; | |
506 } | |
507 | |
508 static void | |
509 packet_destroy(packet_t *pkt) | |
510 { | |
511 if (pkt->data) | |
512 free(pkt->data); | |
513 } | |
514 | |
515 static void | |
516 packet_queue_construct(packet_queue_t *queue) | |
517 { | |
518 queue->id = NULL; | |
519 queue->packets = NULL; | |
520 queue->packets_reserve = 0; | |
521 queue->packets_size = 0; | |
522 queue->current_index = 0; | |
523 } | |
524 | |
525 static void | |
526 packet_queue_destroy(packet_queue_t *queue) | |
527 { | |
528 if (queue->packets) { | |
529 while (queue->packets_size--) | |
530 packet_destroy(queue->packets + queue->packets_size); | |
531 free(queue->packets); | |
532 } | |
533 return; | |
534 } | |
535 | |
536 /* Make sure there is enough room for needed_size packets in the | |
537 packet queue. */ | |
538 static int | |
539 packet_queue_ensure(packet_queue_t *queue, unsigned int needed_size) | |
540 { | |
541 if (queue->packets_reserve < needed_size) { | |
542 if (queue->packets) { | |
543 packet_t *tmp = realloc(queue->packets, 2 * queue->packets_reserve * sizeof(packet_t)); | |
544 if (tmp == NULL) { | |
6110 | 545 mp_msg(MSGT_VOBSUB,MSGL_FATAL,"realloc failure"); |
4080 | 546 return -1; |
547 } | |
548 queue->packets = tmp; | |
549 queue->packets_reserve *= 2; | |
550 } | |
551 else { | |
552 queue->packets = malloc(sizeof(packet_t)); | |
553 if (queue->packets == NULL) { | |
6110 | 554 mp_msg(MSGT_VOBSUB,MSGL_FATAL,"malloc failure"); |
4080 | 555 return -1; |
556 } | |
557 queue->packets_reserve = 1; | |
558 } | |
559 } | |
560 return 0; | |
561 } | |
562 | |
563 /* add one more packet */ | |
564 static int | |
565 packet_queue_grow(packet_queue_t *queue) | |
566 { | |
567 if (packet_queue_ensure(queue, queue->packets_size + 1) < 0) | |
568 return -1; | |
569 packet_construct(queue->packets + queue->packets_size); | |
570 ++queue->packets_size; | |
571 return 0; | |
572 } | |
573 | |
574 /* insert a new packet, duplicating pts from the current one */ | |
575 static int | |
576 packet_queue_insert(packet_queue_t *queue) | |
577 { | |
578 packet_t *pkts; | |
579 if (packet_queue_ensure(queue, queue->packets_size + 1) < 0) | |
580 return -1; | |
581 /* XXX packet_size does not reflect the real thing here, it will be updated a bit later */ | |
582 memmove(queue->packets + queue->current_index + 2, | |
583 queue->packets + queue->current_index + 1, | |
4085 | 584 sizeof(packet_t) * (queue->packets_size - queue->current_index - 1)); |
4080 | 585 pkts = queue->packets + queue->current_index; |
586 ++queue->packets_size; | |
587 ++queue->current_index; | |
588 packet_construct(pkts + 1); | |
589 pkts[1].pts100 = pkts[0].pts100; | |
590 pkts[1].filepos = pkts[0].filepos; | |
591 return 0; | |
592 } | |
593 | |
594 /********************************************************************** | |
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
|
595 * Vobsub |
4080 | 596 **********************************************************************/ |
597 | |
598 typedef struct { | |
599 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
|
600 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
|
601 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
|
602 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
|
603 unsigned int have_palette; |
5388
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
604 unsigned int orig_frame_width, orig_frame_height; |
5563 | 605 unsigned int origin_x, origin_y; |
10917
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
10893
diff
changeset
|
606 unsigned int forced_subs; |
4080 | 607 /* index */ |
608 packet_queue_t *spu_streams; | |
609 unsigned int spu_streams_size; | |
610 unsigned int spu_streams_current; | |
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 | |
803 static int | |
5388
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
804 vobsub_parse_palette(vobsub_t *vob, const char *line) |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
805 { |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
806 // 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
|
807 unsigned int n; |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
808 n = 0; |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
809 while (1) { |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
810 const char *p; |
6831 | 811 int r, g, b, y, u, v, tmp; |
5388
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
812 while (isspace(*line)) |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
813 ++line; |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
814 p = line; |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
815 while (isxdigit(*p)) |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
816 ++p; |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
817 if (p - line != 6) |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
818 return -1; |
6831 | 819 tmp = strtoul(line, NULL, 16); |
820 r = tmp >> 16 & 0xff; | |
821 g = tmp >> 8 & 0xff; | |
822 b = tmp & 0xff; | |
823 y = MIN(MAX((int)(0.1494 * r + 0.6061 * g + 0.2445 * b), 0), 0xff); | |
824 u = MIN(MAX((int)(0.6066 * r - 0.4322 * g - 0.1744 * b) + 128, 0), 0xff); | |
825 v = MIN(MAX((int)(-0.08435 * r - 0.3422 * g + 0.4266 * b) + 128, 0), 0xff); | |
826 vob->palette[n++] = y << 16 | u << 8 | v; | |
5388
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
827 if (n == 16) |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
828 break; |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
829 if (*p == ',') |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
830 ++p; |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
831 line = p; |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
832 } |
5833
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5563
diff
changeset
|
833 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
|
834 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
|
835 } |
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5563
diff
changeset
|
836 |
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5563
diff
changeset
|
837 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
|
838 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
|
839 { |
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5563
diff
changeset
|
840 //custom colors: OFF/ON(0/1) |
5839 | 841 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
|
842 vob->custom=1; |
5839 | 843 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
|
844 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
|
845 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
|
846 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
|
847 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
|
848 } |
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5563
diff
changeset
|
849 |
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5563
diff
changeset
|
850 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
|
851 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
|
852 { |
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5563
diff
changeset
|
853 //colors: XXXXXX, XXXXXX, XXXXXX, XXXXXX |
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5563
diff
changeset
|
854 unsigned int n; |
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5563
diff
changeset
|
855 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
|
856 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
|
857 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
|
858 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
|
859 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
|
860 ++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
|
861 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
|
862 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
|
863 ++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
|
864 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
|
865 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
|
866 vob->cuspal[n++] = strtoul(line, NULL,16); |
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5563
diff
changeset
|
867 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
|
868 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
|
869 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
|
870 ++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
|
871 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
|
872 } |
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 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
|
874 } |
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5563
diff
changeset
|
875 |
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 /* don't know how to use tridx */ |
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5563
diff
changeset
|
877 static int |
6110 | 878 vobsub_parse_tridx(const char *line) |
5833
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5563
diff
changeset
|
879 { |
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 //tridx: XXXX |
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5563
diff
changeset
|
881 int tridx; |
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5563
diff
changeset
|
882 tridx = strtoul((line + 26), NULL, 16); |
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5563
diff
changeset
|
883 tridx = ((tridx&0x1000)>>12) | ((tridx&0x100)>>7) | ((tridx&0x10)>>2) | ((tridx&1)<<3); |
6110 | 884 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
|
885 } |
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5563
diff
changeset
|
886 |
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5563
diff
changeset
|
887 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
|
888 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
|
889 { |
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 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
|
891 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
|
892 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
|
893 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
|
894 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
|
895 } |
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 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
|
897 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
|
898 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
|
899 } |
6110 | 900 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
|
901 h = atoi(line + 7); |
6110 | 902 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
|
903 m = atoi(line + 10); |
6110 | 904 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
|
905 s = atoi(line + 13); |
6110 | 906 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
|
907 ms = atoi(line + 16); |
6110 | 908 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
|
909 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
|
910 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
|
911 } |
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 static int |
6110 | 914 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
|
915 { |
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 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
|
917 vobsub_id = atoi(line + 8); |
5388
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
918 return 0; |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
919 } |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
920 |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
921 static int |
10917
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
10893
diff
changeset
|
922 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
|
923 { |
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
10893
diff
changeset
|
924 const char *p; |
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
10893
diff
changeset
|
925 |
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
10893
diff
changeset
|
926 p = line; |
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
10893
diff
changeset
|
927 while (isspace(*p)) |
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
10893
diff
changeset
|
928 ++p; |
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
10893
diff
changeset
|
929 |
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
10893
diff
changeset
|
930 if (strncasecmp("on",p,2) == 0){ |
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
10893
diff
changeset
|
931 vob->forced_subs=~0; |
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
10893
diff
changeset
|
932 return 0; |
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
10893
diff
changeset
|
933 } else if (strncasecmp("off",p,3) == 0){ |
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
10893
diff
changeset
|
934 vob->forced_subs=0; |
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
10893
diff
changeset
|
935 return 0; |
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
10893
diff
changeset
|
936 } |
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
10893
diff
changeset
|
937 |
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
10893
diff
changeset
|
938 return -1; |
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
10893
diff
changeset
|
939 } |
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
10893
diff
changeset
|
940 |
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
10893
diff
changeset
|
941 static int |
7446
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
942 vobsub_parse_one_line(vobsub_t *vob, rar_stream_t *fd) |
4080 | 943 { |
944 ssize_t line_size; | |
945 int res = -1; | |
6163
141a082e6da6
applied 64bit patch from Ulrich Hecht <uli at suse dot de>
alex
parents:
6110
diff
changeset
|
946 size_t line_reserve = 0; |
4080 | 947 char *line = NULL; |
14237
cb14ee6b0944
fix memleak in idx parser. patch by elupus [elupus {at] ecce <dot) se]
reimar
parents:
14046
diff
changeset
|
948 do { |
17527 | 949 line_size = vobsub_getline(&line, &line_reserve, fd); |
4080 | 950 if (line_size < 0) { |
951 break; | |
952 } | |
953 if (*line == 0 || *line == '\r' || *line == '\n' || *line == '#') | |
954 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
|
955 else if (strncmp("langidx:", line, 8) == 0) |
6110 | 956 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
|
957 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
|
958 res = vobsub_parse_delay(vob, line); |
4080 | 959 else if (strncmp("id:", line, 3) == 0) |
960 res = vobsub_parse_id(vob, line + 3); | |
5388
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
961 else if (strncmp("palette:", line, 8) == 0) |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
962 res = vobsub_parse_palette(vob, line + 8); |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
963 else if (strncmp("size:", line, 5) == 0) |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
964 res = vobsub_parse_size(vob, line + 5); |
5563 | 965 else if (strncmp("org:", line, 4) == 0) |
966 res = vobsub_parse_origin(vob, line + 4); | |
4080 | 967 else if (strncmp("timestamp:", line, 10) == 0) |
968 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
|
969 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
|
970 //custom colors: ON/OFF, tridx: XXXX, colors: XXXXXX, XXXXXX, XXXXXX,XXXXXX |
6110 | 971 res = vobsub_parse_cuspal(vob, line) + vobsub_parse_tridx(line) + vobsub_parse_custom(vob, line); |
10917
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
10893
diff
changeset
|
972 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
|
973 res = vobsub_parse_forced_subs(vob, line + 12); |
4080 | 974 else { |
8027 | 975 mp_msg(MSGT_VOBSUB,MSGL_V, "vobsub: ignoring %s", line); |
4080 | 976 continue; |
977 } | |
978 if (res < 0) | |
6110 | 979 mp_msg(MSGT_VOBSUB,MSGL_ERR, "ERROR in %s", line); |
4080 | 980 break; |
981 } while (1); | |
14237
cb14ee6b0944
fix memleak in idx parser. patch by elupus [elupus {at] ecce <dot) se]
reimar
parents:
14046
diff
changeset
|
982 if (line) |
cb14ee6b0944
fix memleak in idx parser. patch by elupus [elupus {at] ecce <dot) se]
reimar
parents:
14046
diff
changeset
|
983 free(line); |
4080 | 984 return res; |
985 } | |
986 | |
5388
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
987 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
|
988 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
|
989 int sid, char *langid) |
5388
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
990 { |
6110 | 991 vobsub_t *vob = (vobsub_t*)this; |
5388
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
992 int res = -1; |
7446
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
993 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
|
994 if (fd == NULL) { |
412ff784c971
Avoid bogus file not found message if vobsub isn'T forced (autodetect).
atmos4
parents:
5839
diff
changeset
|
995 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
|
996 mp_msg(MSGT_VOBSUB,MSGL_ERR, "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
|
997 } else { |
5388
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
998 // parse IFO header |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
999 unsigned char block[0x800]; |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
1000 const char *const ifo_magic = "DVDVIDEO-VTS"; |
7446
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
1001 if (rar_read(block, sizeof(block), 1, fd) != 1) { |
5388
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
1002 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
|
1003 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
|
1004 } 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
|
1005 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
|
1006 else { |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
1007 unsigned long pgci_sector = block[0xcc] << 24 | block[0xcd] << 16 |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
1008 | block[0xce] << 8 | block[0xcf]; |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
1009 int standard = (block[0x200] & 0x30) >> 4; |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
1010 int resolution = (block[0x201] & 0x0c) >> 2; |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
1011 *height = standard ? 576 : 480; |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
1012 *width = 0; |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
1013 switch (resolution) { |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
1014 case 0x0: |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
1015 *width = 720; |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
1016 break; |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
1017 case 0x1: |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
1018 *width = 704; |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
1019 break; |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
1020 case 0x2: |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
1021 *width = 352; |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
1022 break; |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
1023 case 0x3: |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
1024 *width = 352; |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
1025 *height /= 2; |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
1026 break; |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
1027 default: |
6110 | 1028 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
|
1029 } |
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
|
1030 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
|
1031 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
|
1032 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
|
1033 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
|
1034 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
|
1035 } |
7446
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
1036 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
|
1037 || 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
|
1038 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
|
1039 else { |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
1040 unsigned long idx; |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
1041 unsigned long pgc_offset = block[0xc] << 24 | block[0xd] << 16 |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
1042 | block[0xe] << 8 | block[0xf]; |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
1043 for (idx = 0; idx < 16; ++idx) { |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
1044 unsigned char *p = block + pgc_offset + 0xa4 + 4 * idx; |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
1045 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
|
1046 } |
6110 | 1047 if(vob) |
1048 vob->have_palette = 1; | |
5388
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
1049 res = 0; |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
1050 } |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
1051 } |
7446
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
1052 rar_close(fd); |
5388
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
1053 } |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
1054 return res; |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
1055 } |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
1056 |
4080 | 1057 void * |
6110 | 1058 vobsub_open(const char *const name,const char *const ifo,const int force,void** spu) |
4080 | 1059 { |
1060 vobsub_t *vob = malloc(sizeof(vobsub_t)); | |
6110 | 1061 if(spu) |
1062 *spu = NULL; | |
4080 | 1063 if (vob) { |
1064 char *buf; | |
6674
f8551f89dd48
MEncoder vobsub ripping support, currently not compatible with windows vobsub, some bugs to be fixed. However it already works with mplayer, so it's a start.
atmos4
parents:
6163
diff
changeset
|
1065 vob->custom = 0; |
f8551f89dd48
MEncoder vobsub ripping support, currently not compatible with windows vobsub, some bugs to be fixed. However it already works with mplayer, so it's a start.
atmos4
parents:
6163
diff
changeset
|
1066 vob->have_palette = 0; |
5388
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
1067 vob->orig_frame_width = 0; |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
1068 vob->orig_frame_height = 0; |
4080 | 1069 vob->spu_streams = NULL; |
1070 vob->spu_streams_size = 0; | |
1071 vob->spu_streams_current = 0; | |
5833
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5563
diff
changeset
|
1072 vob->delay = 0; |
10917
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
10893
diff
changeset
|
1073 vob->forced_subs=0; |
19074
d385666efa27
removes unused parentheses lefted behind in the r19075 sizeof(char) cleanups, noticed by dalias
reynaldo
parents:
19070
diff
changeset
|
1074 buf = malloc(strlen(name) + 5); |
4080 | 1075 if (buf) { |
7446
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
1076 rar_stream_t *fd; |
4080 | 1077 mpeg_t *mpg; |
5388
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4787
diff
changeset
|
1078 /* read in the info file */ |
6110 | 1079 if(!ifo) { |
1080 strcpy(buf, name); | |
1081 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
|
1082 vobsub_parse_ifo(vob,buf, vob->palette, &vob->orig_frame_width, &vob->orig_frame_height, force, -1, NULL); |
6110 | 1083 } 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
|
1084 vobsub_parse_ifo(vob,ifo, vob->palette, &vob->orig_frame_width, &vob->orig_frame_height, force, -1, NULL); |
4080 | 1085 /* read in the index */ |
1086 strcpy(buf, name); | |
1087 strcat(buf, ".idx"); | |
7446
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
1088 fd = rar_open(buf, "rb"); |
4787 | 1089 if (fd == NULL) { |
1090 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
|
1091 mp_msg(MSGT_VOBSUB,MSGL_ERR,"VobSub: Can't open IDX file\n"); |
6110 | 1092 else { |
1093 free(buf); | |
1094 free(vob); | |
1095 return NULL; | |
1096 } | |
4787 | 1097 } else { |
4080 | 1098 while (vobsub_parse_one_line(vob, fd) >= 0) |
1099 /* NOOP */ ; | |
7446
ad00ad5f25a9
Automatic unrar of vobsub. Does not work with rar v3
kmkaplan
parents:
7417
diff
changeset
|
1100 rar_close(fd); |
4080 | 1101 } |
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
|
1102 /* 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
|
1103 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
|
1104 vob->custom = 1; |
6110 | 1105 if (spu && vob->orig_frame_width && vob->orig_frame_height) |
1106 *spu = spudec_new_scaled_vobsub(vob->palette, vob->cuspal, vob->custom, vob->orig_frame_width, vob->orig_frame_height); | |
4080 | 1107 |
1108 /* read the indexed mpeg_stream */ | |
1109 strcpy(buf, name); | |
1110 strcat(buf, ".sub"); | |
1111 mpg = mpeg_open(buf); | |
4787 | 1112 if (mpg == NULL) { |
6110 | 1113 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
|
1114 mp_msg(MSGT_VOBSUB,MSGL_ERR,"VobSub: Can't open SUB file\n"); |
6110 | 1115 else { |
1116 | |
1117 free(buf); | |
1118 free(vob); | |
1119 return NULL; | |
1120 } | |
4787 | 1121 } else { |
4080 | 1122 long last_pts_diff = 0; |
1123 while (!mpeg_eof(mpg)) { | |
1124 off_t pos = mpeg_tell(mpg); | |
1125 if (mpeg_run(mpg) < 0) { | |
1126 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
|
1127 mp_msg(MSGT_VOBSUB,MSGL_ERR,"VobSub: mpeg_run error\n"); |
4080 | 1128 break; |
1129 } | |
1130 if (mpg->packet_size) { | |
1131 if ((mpg->aid & 0xe0) == 0x20) { | |
1132 unsigned int sid = mpg->aid & 0x1f; | |
4085 | 1133 if (vobsub_ensure_spu_stream(vob, sid) >= 0) { |
4080 | 1134 packet_queue_t *queue = vob->spu_streams + sid; |
1135 /* get the packet to fill */ | |
4085 | 1136 if (queue->packets_size == 0 && packet_queue_grow(queue) < 0) |
1137 abort(); | |
4080 | 1138 while (queue->current_index + 1 < queue->packets_size |
1139 && queue->packets[queue->current_index + 1].filepos <= pos) | |
1140 ++queue->current_index; | |
1141 if (queue->current_index < queue->packets_size) { | |
1142 packet_t *pkt; | |
1143 if (queue->packets[queue->current_index].data) { | |
1144 /* insert a new packet and fix the PTS ! */ | |
1145 packet_queue_insert(queue); | |
1146 queue->packets[queue->current_index].pts100 = | |
1147 mpg->pts + last_pts_diff; | |
1148 } | |
1149 pkt = queue->packets + queue->current_index; | |
7417
c477dae38383
Fix support for negative "delay:" directive in .idx file.
kmkaplan
parents:
6831
diff
changeset
|
1150 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
|
1151 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
|
1152 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
|
1153 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
|
1154 pkt->pts100 = mpg->pts; |
4080 | 1155 /* FIXME: should not use mpg_sub internal informations, make a copy */ |
1156 pkt->data = mpg->packet; | |
1157 pkt->size = mpg->packet_size; | |
1158 mpg->packet = NULL; | |
1159 mpg->packet_reserve = 0; | |
1160 mpg->packet_size = 0; | |
7417
c477dae38383
Fix support for negative "delay:" directive in .idx file.
kmkaplan
parents:
6831
diff
changeset
|
1161 } |
4080 | 1162 } |
1163 } | |
1164 else | |
6110 | 1165 mp_msg(MSGT_VOBSUB,MSGL_WARN, "don't know what to do with subtitle #%u\n", sid); |
4080 | 1166 } |
1167 } | |
1168 } | |
1169 vob->spu_streams_current = vob->spu_streams_size; | |
1170 while (vob->spu_streams_current-- > 0) | |
1171 vob->spu_streams[vob->spu_streams_current].current_index = 0; | |
1172 mpeg_free(mpg); | |
1173 } | |
1174 free(buf); | |
1175 } | |
1176 } | |
1177 return vob; | |
1178 } | |
1179 | |
1180 void | |
1181 vobsub_close(void *this) | |
1182 { | |
1183 vobsub_t *vob = (vobsub_t *)this; | |
1184 if (vob->spu_streams) { | |
1185 while (vob->spu_streams_size--) | |
1186 packet_queue_destroy(vob->spu_streams + vob->spu_streams_size); | |
1187 free(vob->spu_streams); | |
1188 } | |
1189 free(vob); | |
1190 } | |
1191 | |
7780
9806d65986e4
Mplayer can switch between subtitles of different languages during
kmkaplan
parents:
7446
diff
changeset
|
1192 unsigned int |
9806d65986e4
Mplayer can switch between subtitles of different languages during
kmkaplan
parents:
7446
diff
changeset
|
1193 vobsub_get_indexes_count(void *vobhandle) |
9806d65986e4
Mplayer can switch between subtitles of different languages during
kmkaplan
parents:
7446
diff
changeset
|
1194 { |
9806d65986e4
Mplayer can switch between subtitles of different languages during
kmkaplan
parents:
7446
diff
changeset
|
1195 vobsub_t *vob = (vobsub_t *) vobhandle; |
9806d65986e4
Mplayer can switch between subtitles of different languages during
kmkaplan
parents:
7446
diff
changeset
|
1196 return vob->spu_streams_size; |
9806d65986e4
Mplayer can switch between subtitles of different languages during
kmkaplan
parents:
7446
diff
changeset
|
1197 } |
9806d65986e4
Mplayer can switch between subtitles of different languages during
kmkaplan
parents:
7446
diff
changeset
|
1198 |
9806d65986e4
Mplayer can switch between subtitles of different languages during
kmkaplan
parents:
7446
diff
changeset
|
1199 char * |
9806d65986e4
Mplayer can switch between subtitles of different languages during
kmkaplan
parents:
7446
diff
changeset
|
1200 vobsub_get_id(void *vobhandle, unsigned int index) |
9806d65986e4
Mplayer can switch between subtitles of different languages during
kmkaplan
parents:
7446
diff
changeset
|
1201 { |
9806d65986e4
Mplayer can switch between subtitles of different languages during
kmkaplan
parents:
7446
diff
changeset
|
1202 vobsub_t *vob = (vobsub_t *) vobhandle; |
9806d65986e4
Mplayer can switch between subtitles of different languages during
kmkaplan
parents:
7446
diff
changeset
|
1203 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
|
1204 } |
9806d65986e4
Mplayer can switch between subtitles of different languages during
kmkaplan
parents:
7446
diff
changeset
|
1205 |
10917
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
10893
diff
changeset
|
1206 unsigned int |
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
10893
diff
changeset
|
1207 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
|
1208 { |
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
10893
diff
changeset
|
1209 if (vobhandle) |
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
10893
diff
changeset
|
1210 return ((vobsub_t*) vobhandle)->forced_subs; |
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
10893
diff
changeset
|
1211 else |
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
10893
diff
changeset
|
1212 return 0; |
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
10893
diff
changeset
|
1213 } |
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
10893
diff
changeset
|
1214 |
6110 | 1215 int |
8535
bc7bd163fff9
Here is the patch to make vobsub subtitle use -slang option, I have not made a
arpi
parents:
8203
diff
changeset
|
1216 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
|
1217 { |
bc7bd163fff9
Here is the patch to make vobsub subtitle use -slang option, I have not made a
arpi
parents:
8203
diff
changeset
|
1218 int i; |
bc7bd163fff9
Here is the patch to make vobsub subtitle use -slang option, I have not made a
arpi
parents:
8203
diff
changeset
|
1219 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
|
1220 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
|
1221 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
|
1222 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
|
1223 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
|
1224 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
|
1225 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
|
1226 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
|
1227 } |
bc7bd163fff9
Here is the patch to make vobsub subtitle use -slang option, I have not made a
arpi
parents:
8203
diff
changeset
|
1228 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
|
1229 } |
11695 | 1230 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
|
1231 return -1; |
bc7bd163fff9
Here is the patch to make vobsub subtitle use -slang option, I have not made a
arpi
parents:
8203
diff
changeset
|
1232 } |
bc7bd163fff9
Here is the patch to make vobsub subtitle use -slang option, I have not made a
arpi
parents:
8203
diff
changeset
|
1233 |
bc7bd163fff9
Here is the patch to make vobsub subtitle use -slang option, I have not made a
arpi
parents:
8203
diff
changeset
|
1234 int |
6110 | 1235 vobsub_get_packet(void *vobhandle, float pts,void** data, int* timestamp) { |
1236 vobsub_t *vob = (vobsub_t *)vobhandle; | |
1237 unsigned int pts100 = 90000 * pts; | |
1238 if (vob->spu_streams && 0 <= vobsub_id && (unsigned) vobsub_id < vob->spu_streams_size) { | |
1239 packet_queue_t *queue = vob->spu_streams + vobsub_id; | |
1240 while (queue->current_index < queue->packets_size) { | |
1241 packet_t *pkt = queue->packets + queue->current_index; | |
7417
c477dae38383
Fix support for negative "delay:" directive in .idx file.
kmkaplan
parents:
6831
diff
changeset
|
1242 if (pkt->pts100 != UINT_MAX) |
6110 | 1243 if (pkt->pts100 <= pts100) { |
1244 ++queue->current_index; | |
1245 *data = pkt->data; | |
1246 *timestamp = pkt->pts100; | |
1247 return pkt->size; | |
1248 } else break; | |
7417
c477dae38383
Fix support for negative "delay:" directive in .idx file.
kmkaplan
parents:
6831
diff
changeset
|
1249 else |
c477dae38383
Fix support for negative "delay:" directive in .idx file.
kmkaplan
parents:
6831
diff
changeset
|
1250 ++queue->current_index; |
4080 | 1251 } |
6110 | 1252 } |
1253 return -1; | |
4080 | 1254 } |
1255 | |
6829 | 1256 int |
1257 vobsub_get_next_packet(void *vobhandle, void** data, int* timestamp) | |
1258 { | |
1259 vobsub_t *vob = (vobsub_t *)vobhandle; | |
1260 if (vob->spu_streams && 0 <= vobsub_id && (unsigned) vobsub_id < vob->spu_streams_size) { | |
1261 packet_queue_t *queue = vob->spu_streams + vobsub_id; | |
1262 if (queue->current_index < queue->packets_size) { | |
1263 packet_t *pkt = queue->packets + queue->current_index; | |
1264 ++queue->current_index; | |
1265 *data = pkt->data; | |
1266 *timestamp = pkt->pts100; | |
1267 return pkt->size; | |
1268 } | |
1269 } | |
1270 return -1; | |
1271 } | |
1272 | |
11589 | 1273 void vobsub_seek(void * vobhandle, float pts) |
1274 { | |
1275 vobsub_t * vob = (vobsub_t *)vobhandle; | |
1276 packet_queue_t * queue; | |
1277 int seek_pts100 = (int)pts * 90000; | |
1278 | |
1279 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
|
1280 /* 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
|
1281 if (vobsub_get_id(vob, vobsub_id) == NULL) |
4afcdb7b8aab
fix the crash when seek with 'unknown' subtitles, hopefully...
luran
parents:
11695
diff
changeset
|
1282 return; |
11589 | 1283 queue = vob->spu_streams + vobsub_id; |
1284 queue->current_index = 0; | |
1285 while ((queue->packets + queue->current_index)->pts100 < seek_pts100) | |
1286 ++queue->current_index; | |
11594 | 1287 if (queue->current_index > 0) |
11589 | 1288 --queue->current_index; |
1289 } | |
1290 } | |
1291 | |
4080 | 1292 void |
1293 vobsub_reset(void *vobhandle) | |
1294 { | |
1295 vobsub_t *vob = (vobsub_t *)vobhandle; | |
1296 if (vob->spu_streams) { | |
1297 unsigned int n = vob->spu_streams_size; | |
1298 while (n-- > 0) | |
1299 vob->spu_streams[n].current_index = 0; | |
1300 } | |
1301 } | |
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
|
1302 |
f8551f89dd48
MEncoder vobsub ripping support, currently not compatible with windows vobsub, some bugs to be fixed. However it already works with mplayer, so it's a start.
atmos4
parents:
6163
diff
changeset
|
1303 /********************************************************************** |
f8551f89dd48
MEncoder vobsub ripping support, currently not compatible with windows vobsub, some bugs to be fixed. However it already works with mplayer, so it's a start.
atmos4
parents:
6163
diff
changeset
|
1304 * 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
|
1305 **********************************************************************/ |
f8551f89dd48
MEncoder vobsub ripping support, currently not compatible with windows vobsub, some bugs to be fixed. However it already works with mplayer, so it's a start.
atmos4
parents:
6163
diff
changeset
|
1306 |
f8551f89dd48
MEncoder vobsub ripping support, currently not compatible with windows vobsub, some bugs to be fixed. However it already works with mplayer, so it's a start.
atmos4
parents:
6163
diff
changeset
|
1307 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
|
1308 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
|
1309 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
|
1310 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
|
1311 } 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
|
1312 |
f8551f89dd48
MEncoder vobsub ripping support, currently not compatible with windows vobsub, some bugs to be fixed. However it already works with mplayer, so it's a start.
atmos4
parents:
6163
diff
changeset
|
1313 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
|
1314 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
|
1315 { |
f8551f89dd48
MEncoder vobsub ripping support, currently not compatible with windows vobsub, some bugs to be fixed. However it already works with mplayer, so it's a start.
atmos4
parents:
6163
diff
changeset
|
1316 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
|
1317 fprintf(me->fidx, |
6706
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1318 "# 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
|
1319 "#\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
|
1320 "# 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
|
1321 "# 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
|
1322 "# 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
|
1323 "#\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
|
1324 "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
|
1325 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
|
1326 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
|
1327 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
|
1328 for (i = 0; i < 16; ++i) { |
6831 | 1329 const double y = palette[i] >> 16 & 0xff, |
1330 u = (palette[i] >> 8 & 0xff) - 128.0, | |
1331 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
|
1332 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
|
1333 putc(',', me->fidx); |
6831 | 1334 fprintf(me->fidx, " %02x%02x%02x", |
1335 MIN(MAX((int)(y + 1.4022 * u), 0), 0xff), | |
1336 MIN(MAX((int)(y - 0.3456 * u - 0.7145 * v), 0), 0xff), | |
1337 MIN(MAX((int)(y + 1.7710 * v), 0), 0xff)); | |
6674
f8551f89dd48
MEncoder vobsub ripping support, currently not compatible with windows vobsub, some bugs to be fixed. However it already works with mplayer, so it's a start.
atmos4
parents:
6163
diff
changeset
|
1338 } |
f8551f89dd48
MEncoder vobsub ripping support, currently not compatible with windows vobsub, some bugs to be fixed. However it already works with mplayer, so it's a start.
atmos4
parents:
6163
diff
changeset
|
1339 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
|
1340 } |
10917
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
10893
diff
changeset
|
1341 |
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
10893
diff
changeset
|
1342 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
|
1343 "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
|
1344 } |
f8551f89dd48
MEncoder vobsub ripping support, currently not compatible with windows vobsub, some bugs to be fixed. However it already works with mplayer, so it's a start.
atmos4
parents:
6163
diff
changeset
|
1345 |
f8551f89dd48
MEncoder vobsub ripping support, currently not compatible with windows vobsub, some bugs to be fixed. However it already works with mplayer, so it's a start.
atmos4
parents:
6163
diff
changeset
|
1346 void * |
f8551f89dd48
MEncoder vobsub ripping support, currently not compatible with windows vobsub, some bugs to be fixed. However it already works with mplayer, so it's a start.
atmos4
parents:
6163
diff
changeset
|
1347 vobsub_out_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
|
1348 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
|
1349 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
|
1350 { |
f8551f89dd48
MEncoder vobsub ripping support, currently not compatible with windows vobsub, some bugs to be fixed. However it already works with mplayer, so it's a start.
atmos4
parents:
6163
diff
changeset
|
1351 vobsub_out_t *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
|
1352 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
|
1353 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
|
1354 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
|
1355 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
|
1356 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
|
1357 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
|
1358 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
|
1359 strcat(filename, ".sub"); |
21444
ce7567436cb0
Open vobsub output files in binary mode, otherwise the OS might
reimar
parents:
20096
diff
changeset
|
1360 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
|
1361 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
|
1362 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
|
1363 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
|
1364 strcat(filename, ".idx"); |
21444
ce7567436cb0
Open vobsub output files in binary mode, otherwise the OS might
reimar
parents:
20096
diff
changeset
|
1365 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
|
1366 if (result->fidx) { |
8014
3d6904cee13e
The first language ripped is set as the default language
arpi
parents:
7780
diff
changeset
|
1367 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
|
1368 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
|
1369 /* Make the selected language the default language */ |
3d6904cee13e
The first language ripped is set as the default language
arpi
parents:
7780
diff
changeset
|
1370 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
|
1371 } |
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
|
1372 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
|
1373 /* So that we can check the file now */ |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1374 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
|
1375 } |
f8551f89dd48
MEncoder vobsub ripping support, currently not compatible with windows vobsub, some bugs to be fixed. However it already works with mplayer, so it's a start.
atmos4
parents:
6163
diff
changeset
|
1376 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
|
1377 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
|
1378 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
|
1379 } |
f8551f89dd48
MEncoder vobsub ripping support, currently not compatible with windows vobsub, some bugs to be fixed. However it already works with mplayer, so it's a start.
atmos4
parents:
6163
diff
changeset
|
1380 } |
f8551f89dd48
MEncoder vobsub ripping support, currently not compatible with windows vobsub, some bugs to be fixed. However it already works with mplayer, so it's a start.
atmos4
parents:
6163
diff
changeset
|
1381 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
|
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 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
|
1385 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
|
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 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
|
1388 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
|
1389 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
|
1390 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
|
1391 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
|
1392 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
|
1393 } |
f8551f89dd48
MEncoder vobsub ripping support, currently not compatible 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 |
f8551f89dd48
MEncoder vobsub ripping support, currently not compatible 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 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
|
1396 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
|
1397 { |
6706
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1398 static double last_pts; |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1399 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
|
1400 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
|
1401 if (vob->fsub) { |
6706
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1402 /* 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
|
1403 unsigned char buffer[2048]; |
6706
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1404 unsigned char *p; |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1405 int remain = 2048; |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1406 /* 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
|
1407 breaks Windows' Vobsub */ |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1408 if (vob->fidx && (!last_pts_set || last_pts != pts)) { |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1409 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
|
1410 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
|
1411 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
|
1412 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
|
1413 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
|
1414 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
|
1415 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
|
1416 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
|
1417 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
|
1418 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
|
1419 ms = 0; |
6706
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1420 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
|
1421 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
|
1422 h, m, (unsigned int) s, ms, ftell(vob->fsub)); |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1423 last_h = h; |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1424 last_m = m; |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1425 last_s = (unsigned int) s; |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1426 last_ms = ms; |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1427 } |
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
|
1428 } |
6706
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1429 last_pts = pts; |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1430 last_pts_set = 1; |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1431 |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1432 /* Packet start code: Windows' Vobsub needs this */ |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1433 p = buffer; |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1434 *p++ = 0; /* 0x00 */ |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1435 *p++ = 0; |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1436 *p++ = 1; |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1437 *p++ = 0xba; |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1438 *p++ = 0x40; |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1439 memset(p, 0, 9); |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1440 p += 9; |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1441 { /* Packet */ |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1442 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
|
1443 unsigned char now_pts[5]; |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1444 int pts_len, pad_len, datalen = len; |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1445 pts *= 90000; |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1446 now_pts[0] = 0x21 | (((unsigned long)pts >> 29) & 0x0e); |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1447 now_pts[1] = ((unsigned long)pts >> 22) & 0xff; |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1448 now_pts[2] = 0x01 | (((unsigned long)pts >> 14) & 0xfe); |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1449 now_pts[3] = ((unsigned long)pts >> 7) & 0xff; |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1450 now_pts[4] = 0x01 | (((unsigned long)pts << 1) & 0xfe); |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1451 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
|
1452 memcpy(last_pts, now_pts, sizeof(now_pts)); |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1453 |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1454 datalen += 3; /* Version, PTS_flags, pts_len */ |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1455 datalen += pts_len; |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1456 datalen += 1; /* AID */ |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1457 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
|
1458 /* 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
|
1459 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
|
1460 with padding (0x000001be) latter I'll do that. But if |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1461 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
|
1462 padding packet. So I add some padding in the PTS |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1463 field. This looks like a dirty kludge. Oh well... */ |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1464 if (pad_len < 0) { |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1465 /* 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
|
1466 datalen -= pts_len; |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1467 pts_len = 0; |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1468 pad_len = 0; |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1469 } |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1470 else if (pad_len > 6) |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1471 pad_len = 0; |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1472 datalen += pad_len; |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1473 |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1474 *p++ = 0; /* 0x0e */ |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1475 *p++ = 0; |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1476 *p++ = 1; |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1477 *p++ = 0xbd; |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1478 |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1479 *p++ = (datalen >> 8) & 0xff; /* length of payload */ |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1480 *p++ = datalen & 0xff; |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1481 *p++ = 0x80; /* System-2 (.VOB) stream */ |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1482 *p++ = pts_len ? 0x80 : 0x00; /* pts_flags */ |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1483 *p++ = pts_len + pad_len; |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1484 memcpy(p, now_pts, pts_len); |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1485 p += pts_len; |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1486 memset(p, 0, pad_len); |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1487 p += pad_len; |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1488 } |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1489 *p++ = 0x20 | vob->aid; /* aid */ |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1490 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
|
1491 || 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
|
1492 perror("ERROR: vobsub write failed"); |
6706
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1493 else |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1494 remain -= p - buffer + len; |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1495 |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1496 /* Padding */ |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1497 if (remain >= 6) { |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1498 p = buffer; |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1499 *p++ = 0x00; |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1500 *p++ = 0x00; |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1501 *p++ = 0x01; |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1502 *p++ = 0xbe; |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1503 *p++ = (remain - 6) >> 8; |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1504 *p++ = (remain - 6) & 0xff; |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1505 /* for better compression, blank this */ |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1506 memset(buffer + 6, 0, remain - (p - buffer)); |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1507 if (fwrite(buffer, remain, 1, vob->fsub) != 1) |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1508 perror("ERROR: vobsub padding write failed"); |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1509 } |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1510 else if (remain > 0) { |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1511 /* 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
|
1512 needs to be 2KB big */ |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1513 memset(buffer, 0, remain); |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1514 if (fwrite(buffer, remain, 1, vob->fsub) != 1) |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1515 perror("ERROR: vobsub blank padding write failed"); |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1516 } |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1517 else if (remain < 0) |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1518 fprintf(stderr, |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1519 "\nERROR: wrong thing happenned...\n" |
e1428c2c971f
Lots of compatibility fixes for Windows' Vobsub reader.
kmkaplan
parents:
6674
diff
changeset
|
1520 " 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
|
1521 } |
f8551f89dd48
MEncoder vobsub ripping support, currently not compatible with windows vobsub, some bugs to be fixed. However it already works with mplayer, so it's a start.
atmos4
parents:
6163
diff
changeset
|
1522 } |