annotate remap.c @ 409:9b8bfc56a7fe src

Add dvdnav_program_play & dvdnav_current_title_program Using title parts w/ dvdnav_part_play and dvdnav_current_title_info is not reliable for use as chapter marks in files made from transcoding. The start of a part does not necessarily fall strictly inside the main title. Parts can have an intro sequence before getting into the title. So we use program boundaries instead of part markers to test when we have reached a chapter point during encoding of the title. The same would apply to displaying the current chapter during playback. The program boundaries should be checked instead of looking for a part. Patch from John Stebbins. Thanks!
author erik
date Fri, 30 Jul 2010 23:34:16 +0000
parents 9c5aef10d165
children 4e34a2fce645
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
114
b6834e6359cf big libdvdnav cleanup, quoting the ChangeLog:
mroi
parents: 96
diff changeset
1 /*
b6834e6359cf big libdvdnav cleanup, quoting the ChangeLog:
mroi
parents: 96
diff changeset
2 * This file is part of libdvdnav, a DVD navigation library.
b6834e6359cf big libdvdnav cleanup, quoting the ChangeLog:
mroi
parents: 96
diff changeset
3 *
b6834e6359cf big libdvdnav cleanup, quoting the ChangeLog:
mroi
parents: 96
diff changeset
4 * libdvdnav is free software; you can redistribute it and/or modify
b6834e6359cf big libdvdnav cleanup, quoting the ChangeLog:
mroi
parents: 96
diff changeset
5 * it under the terms of the GNU General Public License as published by
b6834e6359cf big libdvdnav cleanup, quoting the ChangeLog:
mroi
parents: 96
diff changeset
6 * the Free Software Foundation; either version 2 of the License, or
b6834e6359cf big libdvdnav cleanup, quoting the ChangeLog:
mroi
parents: 96
diff changeset
7 * (at your option) any later version.
b6834e6359cf big libdvdnav cleanup, quoting the ChangeLog:
mroi
parents: 96
diff changeset
8 *
b6834e6359cf big libdvdnav cleanup, quoting the ChangeLog:
mroi
parents: 96
diff changeset
9 * libdvdnav is distributed in the hope that it will be useful,
b6834e6359cf big libdvdnav cleanup, quoting the ChangeLog:
mroi
parents: 96
diff changeset
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
b6834e6359cf big libdvdnav cleanup, quoting the ChangeLog:
mroi
parents: 96
diff changeset
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
b6834e6359cf big libdvdnav cleanup, quoting the ChangeLog:
mroi
parents: 96
diff changeset
12 * GNU General Public License for more details.
b6834e6359cf big libdvdnav cleanup, quoting the ChangeLog:
mroi
parents: 96
diff changeset
13 *
389
d3c273ced49c Use consistent license headers everywhere: Fix wrong FSF address.
diego
parents: 388
diff changeset
14 * You should have received a copy of the GNU General Public License along
d3c273ced49c Use consistent license headers everywhere: Fix wrong FSF address.
diego
parents: 388
diff changeset
15 * with libdvdnav; if not, write to the Free Software Foundation, Inc.,
d3c273ced49c Use consistent license headers everywhere: Fix wrong FSF address.
diego
parents: 388
diff changeset
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
114
b6834e6359cf big libdvdnav cleanup, quoting the ChangeLog:
mroi
parents: 96
diff changeset
17 */
b6834e6359cf big libdvdnav cleanup, quoting the ChangeLog:
mroi
parents: 96
diff changeset
18
287
f22a52d426a3 include config.h (if present)
nicodvb
parents: 286
diff changeset
19 #ifdef HAVE_CONFIG_H
f22a52d426a3 include config.h (if present)
nicodvb
parents: 286
diff changeset
20 #include "config.h"
f22a52d426a3 include config.h (if present)
nicodvb
parents: 286
diff changeset
21 #endif
f22a52d426a3 include config.h (if present)
nicodvb
parents: 286
diff changeset
22
96
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
23 #include <stdlib.h>
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
24 #include <string.h>
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
25 #include <stdio.h>
176
4e099155c968 Helping with the WIN32 port.
jcdutton
parents: 114
diff changeset
26
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
27 #ifndef _MSC_VER
96
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
28 #include <sys/param.h>
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
29 #include <sys/fcntl.h>
176
4e099155c968 Helping with the WIN32 port.
jcdutton
parents: 114
diff changeset
30 #else
4e099155c968 Helping with the WIN32 port.
jcdutton
parents: 114
diff changeset
31 #ifndef MAXPATHLEN
4e099155c968 Helping with the WIN32 port.
jcdutton
parents: 114
diff changeset
32 #define MAXPATHLEN 255
4e099155c968 Helping with the WIN32 port.
jcdutton
parents: 114
diff changeset
33 #endif
4e099155c968 Helping with the WIN32 port.
jcdutton
parents: 114
diff changeset
34 #endif /* _MSC_VER */
4e099155c968 Helping with the WIN32 port.
jcdutton
parents: 114
diff changeset
35
286
6fac6a613ea5 moved inclusion of inttypes.h from dvd_types.h to the including .c files
nicodvb
parents: 285
diff changeset
36 #include <inttypes.h>
294
2146ff691bcd include limits.h; it was included in the previous dvdnav_internal.h and without it players segfault
nicodvb
parents: 290
diff changeset
37 #include <limits.h>
290
54b6a000f6da decoder.h needs inclusion of sys/time.h
nicodvb
parents: 287
diff changeset
38 #include <sys/time.h>
395
9c5aef10d165 Move dvd_types.h, dvdnav_events.h and dvdnav.h into a dvdnav directory.
reimar
parents: 392
diff changeset
39 #include "dvdnav/dvdnav.h"
386
579a3538d284 Sync with current libdvdread header location.
rathann
parents: 378
diff changeset
40 #include <dvdread/nav_types.h>
579a3538d284 Sync with current libdvdread header location.
rathann
parents: 378
diff changeset
41 #include <dvdread/ifo_types.h>
96
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
42 #include "remap.h"
285
52877d182e96 moved all header inclusions from .h to .c files; my word, I've never seen such a horrible entanglement as in this mess
nicodvb
parents: 282
diff changeset
43 #include "vm/decoder.h"
52877d182e96 moved all header inclusions from .h to .c files; my word, I've never seen such a horrible entanglement as in this mess
nicodvb
parents: 282
diff changeset
44 #include "vm/vm.h"
114
b6834e6359cf big libdvdnav cleanup, quoting the ChangeLog:
mroi
parents: 96
diff changeset
45 #include "dvdnav_internal.h"
96
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
46
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
47 struct block_s {
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
48 int domain;
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
49 int title;
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
50 int program;
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
51 unsigned long start_block;
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
52 unsigned long end_block;
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
53 };
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
54
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
55 struct remap_s {
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
56 char *title;
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
57 int maxblocks;
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
58 int nblocks;
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
59 int debug;
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
60 struct block_s *blocks;
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
61 };
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
62
212
6b67914ae021 port Daniel's changes to xine-lib cvs to minimize difference
mroi
parents: 176
diff changeset
63 static remap_t* remap_new( char *title) {
96
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
64 remap_t *map = malloc( sizeof(remap_t));
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
65 map->title = strdup(title);
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
66 map->maxblocks = 0;
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
67 map->nblocks = 0;
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
68 map->blocks = NULL;
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
69 map->debug = 0;
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
70 return map;
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
71 }
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
72
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
73 static int compare_block( block_t *a, block_t *b) {
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
74 /* returns -1 if a precedes b, 1 if a follows b, and 0 if a and b overlap */
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
75 if (a->domain < b->domain) {
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
76 return -1;
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
77 } else if (a->domain > b->domain) {
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
78 return 1;
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
79 }
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
80
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
81 if (a->title < b->title) {
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
82 return -1;
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
83 } else if (a->title > b->title) {
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
84 return 1;
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
85 }
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
86
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
87 if (a->program < b->program) {
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
88 return -1;
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
89 } else if (a->program > b->program) {
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
90 return 1;
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
91 }
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
92
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
93 if (a->end_block < b->start_block) {
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
94 return -1;
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
95 } else if (a->start_block > b->end_block) {
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
96 /*
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
97 * if a->start_block == b->end_block then the two regions
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
98 * aren't strictly overlapping, but they should be merged
96
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
99 * anyway since there are zero blocks between them
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
100 */
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
101 return 1;
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
102 }
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
103
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
104 return 0;
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
105 }
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
106
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
107 static block_t *findblock( remap_t *map, block_t *key) {
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
108 int lb = 0;
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
109 int ub = map->nblocks - 1;
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
110 int mid;
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
111 int res;
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
112
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
113 while (lb <= ub) {
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
114 mid = lb + (ub - lb)/2;
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
115 res = compare_block( key, &map->blocks[mid]);
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
116 if (res < 0) {
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
117 ub = mid-1;
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
118 } else if (res > 0) {
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
119 lb = mid+1;
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
120 } else {
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
121 return &map->blocks[mid];
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
122 }
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
123 }
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
124 return NULL;
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
125 }
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
126
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
127 static void mergeblock( block_t *b, block_t tmp) {
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
128 if (tmp.start_block < b->start_block) b->start_block = tmp.start_block;
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
129 if (tmp.end_block > b->end_block) b->end_block = tmp.end_block;
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
130 }
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
131
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
132 static void remap_add_node( remap_t *map, block_t block) {
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
133 block_t *b;
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
134 int n;
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
135 b = findblock( map, &block);
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
136 if (b) {
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
137 /* overlaps an existing block */
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
138 mergeblock( b, block);
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
139 } else {
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
140 /* new block */
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
141 if (map->nblocks >= map->maxblocks) {
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
142 map->maxblocks += 20;
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
143 map->blocks = realloc( map->blocks, sizeof( block_t)*map->maxblocks);
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
144 }
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
145 n = map->nblocks++;
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
146 while (n > 0 && compare_block( &block, &map->blocks[ n-1]) < 0) {
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
147 map->blocks[ n] = map->blocks[ n-1];
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
148 n--;
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
149 }
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
150 map->blocks[ n] = block;
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
151 }
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
152 }
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
153
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
154 static int parseblock(char *buf, int *dom, int *tt, int *pg,
212
6b67914ae021 port Daniel's changes to xine-lib cvs to minimize difference
mroi
parents: 176
diff changeset
155 unsigned long *start, unsigned long *end) {
96
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
156 long tmp;
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
157 char *tok;
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
158 char *epos;
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
159 char *marker[]={"domain", "title", "program", "start", "end"};
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
160 int st = 0;
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
161 tok = strtok( buf, " ");
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
162 while (st < 5) {
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
163 if (strcmp(tok, marker[st])) return -st-1000;
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
164 tok = strtok( NULL, " ");
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
165 if (!tok) return -st-2000;
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
166 tmp = strtol( tok, &epos, 0);
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
167 if (*epos != 0 && *epos != ',') return -st-3000;
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
168 switch (st) {
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
169 case 0:
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
170 *dom = (int)tmp;
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
171 break;
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
172 case 1:
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
173 *tt = (int)tmp;
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
174 break;
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
175 case 2:
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
176 *pg = (int)tmp;
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
177 break;
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
178 case 3:
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
179 *start = tmp;
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
180 break;
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
181 case 4:
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
182 *end = tmp;
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
183 break;
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
184 }
96
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
185 st++;
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
186 tok = strtok( NULL, " ");
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
187 }
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
188 return st;
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
189 }
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
190
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
191 remap_t* remap_loadmap( char *title) {
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
192 char buf[160];
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
193 char fname[MAXPATHLEN];
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
194 char *home;
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
195 int res;
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
196 FILE *fp;
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
197 block_t tmp;
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
198 remap_t *map;
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
199
375
5820649e5aa2 in remap_loadmap() memzero tmp before using it; patch by Erik Hovland org
nicodvb
parents: 371
diff changeset
200 memset(&tmp, 0, sizeof(tmp));
96
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
201 /* Build the map filename */
371
587353009f65 replace an assert(getenv("HOME)) with a return NULL in cases
nicodvb
parents: 342
diff changeset
202 home = getenv("HOME");
587353009f65 replace an assert(getenv("HOME)) with a return NULL in cases
nicodvb
parents: 342
diff changeset
203 if(!home) {
587353009f65 replace an assert(getenv("HOME)) with a return NULL in cases
nicodvb
parents: 342
diff changeset
204 fprintf(MSG_OUT, "libdvdnav: Unable to find home directory" );
587353009f65 replace an assert(getenv("HOME)) with a return NULL in cases
nicodvb
parents: 342
diff changeset
205 return NULL;
587353009f65 replace an assert(getenv("HOME)) with a return NULL in cases
nicodvb
parents: 342
diff changeset
206 }
282
918fe20358cb replaced sequency of strncpy() and strncat() by 1 snprintf() and fixed off-by-1 possible buffer oveflow; patch by Diego Petteno'
nicodvb
parents: 212
diff changeset
207 snprintf(fname, sizeof(fname), "%s/.dvdnav/%s.map", home, title);
96
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
208
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
209 /* Open the map file */
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
210 fp = fopen( fname, "r");
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
211 if (!fp) {
114
b6834e6359cf big libdvdnav cleanup, quoting the ChangeLog:
mroi
parents: 96
diff changeset
212 fprintf(MSG_OUT, "libdvdnav: Unable to find map file '%s'\n", fname);
96
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
213 return NULL;
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
214 }
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
215
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
216 /* Load the map file */
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
217 map = remap_new( title);
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
218 while (fgets( buf, sizeof(buf), fp) != NULL) {
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
219 if (buf[0] == '\n' || buf[0] == '#' || buf[0] == 0) continue;
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
220 if (strncasecmp( buf, "debug", 5) == 0) {
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
221 map->debug = 1;
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
222 } else {
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
223 res = parseblock( buf,
96
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
224 &tmp.domain, &tmp.title, &tmp.program, &tmp.start_block, &tmp.end_block);
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
225 if (res != 5) {
114
b6834e6359cf big libdvdnav cleanup, quoting the ChangeLog:
mroi
parents: 96
diff changeset
226 fprintf(MSG_OUT, "libdvdnav: Ignoring map line (%d): %s\n", res, buf);
96
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
227 continue;
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
228 }
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
229 remap_add_node( map, tmp);
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
230 }
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
231 }
342
83758bfacd4c in remap_loadmap() close the file pointer before exiting ; patch by Erik Hovland - erik hovland org
nicodvb
parents: 341
diff changeset
232 fclose(fp);
96
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
233
341
090b808c421b in remap_loadmap() free map before exiting in case of failure ; patch by Erik Hovland - erik hovland org
nicodvb
parents: 332
diff changeset
234 if (map->nblocks == 0 && map->debug == 0) {
090b808c421b in remap_loadmap() free map before exiting in case of failure ; patch by Erik Hovland - erik hovland org
nicodvb
parents: 332
diff changeset
235 free(map);
090b808c421b in remap_loadmap() free map before exiting in case of failure ; patch by Erik Hovland - erik hovland org
nicodvb
parents: 332
diff changeset
236 return NULL;
090b808c421b in remap_loadmap() free map before exiting in case of failure ; patch by Erik Hovland - erik hovland org
nicodvb
parents: 332
diff changeset
237 }
96
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
238 return map;
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
239 }
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
240
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
241 unsigned long remap_block(
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
242 remap_t *map, int domain, int title, int program,
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
243 unsigned long cblock, unsigned long offset)
96
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
244 {
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
245 block_t key;
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
246 block_t *b;
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
247
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
248 if (map->debug) {
114
b6834e6359cf big libdvdnav cleanup, quoting the ChangeLog:
mroi
parents: 96
diff changeset
249 fprintf(MSG_OUT, "libdvdnav: %s: domain %d, title %d, program %d, start %lx, next %lx\n",
96
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
250 map->title, domain, title, program, cblock, cblock+offset);
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
251 }
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
252
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
253 key.domain = domain;
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
254 key.title = title;
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
255 key.program = program;
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
256 key.start_block = key.end_block = cblock + offset;
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
257 b = findblock( map, &key);
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
258
96
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
259 if (b) {
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
260 if (map->debug) {
114
b6834e6359cf big libdvdnav cleanup, quoting the ChangeLog:
mroi
parents: 96
diff changeset
261 fprintf(MSG_OUT, "libdvdnav: Redirected to %lx\n", b->end_block);
96
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
262 }
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
263 return b->end_block - cblock;
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
264 }
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
265 return offset;
2fcb4f228308 Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff changeset
266 }