1 /**
2 * Copyright (C) 2009
3 * - Salvatore Santagati <salvatore.santagati@gmail.com>
4 * - Abdur Rab <c.abdur@yahoo.com>
5 *
6 * All rights reserved.
7 *
8 * This program is free software; under the terms of the
9 * GNU General Public License as published by the Free Software Foundation;
10 * either version 2 of the License, or (at your option) any later version.
11 *
12 * Redistribution and use in source and binary forms, with or without
13 * modification, are permitted provided that the following conditions are
14 * met:
15 *
16 * @ Redistributions of source code must retain the above copyright
17 * notice, this list of conditions and the following disclaimer.
18 *
19 * @ Redistributions in binary form must reproduce the above copyright
20 * notice, this list of conditions and the following disclaimer in
21 * the documentation and/or other materials provided with the
22 * distribution.
23 *
24 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
25 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
26 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
27 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
28 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
29 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
30 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
31 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
32 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
33 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
34 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
35 *
36 * You should have received a copy of the GNU General Public License
37 * along with this program; if not, write to the
38 * Free Software Foundation, Inc.,
39 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
40 */
41
42 #ifndef MKTOC_H
43 #include "mktoc.h"
44 #endif
45
46 /* --- @print_toc_time@ --- *
47 *
48 * Arguments: @file_ptrs *fptrs@ = input file
49 * @struct_toc *toc@ = pointer struct of toc
50 *
51 *
52 * Returns: ---
53 *
54 * Use: print time of image.
55 */
print_toc_time(file_ptrs * fptrs,struct_toc * toc)56 void print_toc_time ( file_ptrs* fptrs, struct_toc *toc )
57 {
58 fprintf ( fptrs->fdesc, " %02d:%02d:%02d", toc->minute , toc->second-2, toc->frame );
59 }
60
61 /* --- @print_toc_mode@ --- *
62 *
63 * Arguments: @file_ptrs *fptrs@ = input file
64 * @struct_toc *toc@ = pointer struct of toc
65 * @image_struct *img_struct@ = pointer struct of type image and pregap of image
66 *
67 *
68 * Returns: ---
69 *
70 * Use: read first block of image and print type of mode.
71 */
print_toc_mode(file_ptrs * fptrs,struct_toc * toc,image_struct * img_struct)72 void print_toc_mode ( file_ptrs* fptrs, struct_toc* toc, image_struct* img_struct )
73 {
74 switch ( ( img_struct-> block ) ) {
75 case 2048:
76 case 2368:
77 fprintf ( fptrs->fdesc, "\n" );
78 break;
79 case 2336:
80 fprintf ( fptrs->fdesc, "_FORM_MIX\n");
81 break;
82 case 2352:
83 fprintf ( fptrs->fdesc, "_RAW\n" );
84 break;
85 case 2448:
86 fprintf ( fptrs->fdesc, "_RAW RW_RAW\n");
87 break;
88 default:
89 break;
90 }
91
92 }
93
94 /* --- @print_toc_datafile@ --- *
95 *
96 * Arguments: @file_ptrs *fptrs@ = input file
97 * @char *file_input@ = name of input file
98 *
99 *
100 * Returns: ---
101 *
102 * Use: print name of datafile.
103 */
print_toc_datafile(file_ptrs * fptrs,char * file_input)104 void print_toc_datafile ( file_ptrs* fptrs, char* file_input )
105 {
106 fprintf ( fptrs->fdesc, "DATAFILE \"%s\"", file_input );
107 }
108
109 /* --- @print_toc_track@ --- *
110 *
111 * Arguments: @file_ptrs *fptrs@ = input file
112 * @struct_toc *toc@ = pointer struct of toc
113 *
114 *
115 * Returns: ---
116 *
117 * Use: print track of image.
118 */
print_toc_track(file_ptrs * fptrs,struct_toc * toc)119 void print_toc_track ( file_ptrs* fptrs, struct_toc* toc )
120 {
121 fprintf( fptrs->fdesc, "TRACK MODE%d", toc->mode );
122 }
123
124
125 /* --- @print_toc_vcd_time@ --- *
126 *
127 * Arguments: @file_ptrs *fptrs@ = input file
128 * @struct_toc *toc@ = pointer struct of toc
129 * @image_struct *img_struct@ = pointer struct of type image and pregap of image
130 * @off_t l_loop@ = length of track;
131 * @off_t loop_last@ = loop end last track;
132 *
133 *
134 * Returns: ---
135 *
136 * Use: print time of track.
137 */
138
print_toc_vcd_time(file_ptrs * fptrs,struct_toc * toc,image_struct * img_struct,off_t l_loop,off_t loop_last)139 void print_toc_vcd_time ( file_ptrs* fptrs, struct_toc* toc, image_struct* img_struct,
140 off_t l_loop, off_t loop_last)
141 {
142 msf_mode_block msf_block;
143
144 if ( ( loop_last * img_struct-> block ) > 0 )
145 fprintf ( fptrs-> fdesc , "\t#%d", ( loop_last * img_struct->block ) );
146
147 lba2msf ( l_loop, &msf_block );
148
149 toc->frame = ( *( msf_block.frame ) ) ;
150 toc->second = ( *( msf_block.second ) );
151 toc->minute = ( *( msf_block.minute ) );
152
153 print_toc_time ( fptrs, toc );
154
155 fprintf ( fptrs->fdesc, " // length in bytes: %d\n", ( l_loop * img_struct->block ) );
156
157 }
158
159 /* --- @toc_first_track@ --- *
160 *
161 * Arguments: @file_ptrs *fptrs@ = input file
162 * @image_struct *img_struct@ = pointer struct of type image and pregap of image
163 * @char *file_input@ = name of input file
164 * @struct_toc *toc@ = pointer struct of cuesheet
165 *
166 * Returns: ---
167 *
168 * Use: detect track of image.
169 */
toc_first_track(file_ptrs * fptrs,image_struct * img_struct,char * file_input,struct_toc * toc)170 void toc_first_track ( file_ptrs* fptrs, image_struct* img_struct, char *file_input, struct_toc* toc )
171 {
172 off_t lba = 0;
173
174 msf_mode_block msf_block;
175
176 /* inizialization first track */
177 toc->mode = is_mode ( fptrs, img_struct );
178 toc->block = img_struct->block;
179
180 toc->track = 1;
181 /* toc->index = 1; */
182
183 fprintf ( fptrs->fdesc, "// TRACK %d\n", toc->track );
184
185 print_toc_track ( fptrs, toc );
186
187 print_toc_mode ( fptrs, toc, img_struct );
188
189 print_toc_datafile ( fptrs, file_input );
190
191 }
192 /* --- @create_raw_toc@ --- *
193 *
194 * Arguments: @file_ptrs *fptrs@ = input file
195 * @image_struct *img_struct@ = pointer struct of type image and pregap of image
196 * @char *file_input@ = name of input file
197 *
198 *
199 *
200 * Returns: ---
201 *
202 * Use: generate a toc for raw image.
203 */
create_raw_toc(file_ptrs * fptrs,image_struct * img_struct,char * file_input)204 void create_raw_toc ( file_ptrs* fptrs, image_struct* img_struct, char *file_input )
205 {
206 struct_toc toc;
207
208 toc_first_track ( fptrs, img_struct, file_input, &toc );
209
210 }
211
212 /* --- @create_iso_toc@ --- *
213 *
214 * Arguments: @file_ptrs *fptrs@ = input file
215 * @image_struct *img_struct@ = pointer struct of type image and pregap of image
216 * @char *file_input@ = name of input file
217 *
218 *
219 *
220 * Returns: ---
221 *
222 * Use: generate a cuesheet for iso/udf image.
223 */
create_iso_toc(file_ptrs * fptrs,image_struct * img_struct,char * file_input)224 void create_iso_toc ( file_ptrs* fptrs, image_struct* img_struct, char *file_input )
225 {
226 struct_toc toc;
227
228 toc_first_track ( fptrs, img_struct, file_input, &toc );
229
230 }
231 /* --- @create_vcd_toc@ --- *
232 *
233 * Arguments: @file_ptrs *fptrs @ = input file
234 * @image_struct *img_struct@ = pointer struct of type image and pregap of image
235 * @char *file_input@ = name of input file
236 *
237 *
238 * Returns: Zeor on success, @-1@ on error.
239 *
240 * Use: generate a TOC file for vcd.
241 */
create_vcd_toc(file_ptrs * fptrs,image_struct * img_struct,char * file_input)242 int create_vcd_toc ( file_ptrs* fptrs, image_struct* img_struct, char *file_input )
243 {
244 off_t n_loop;
245 off_t loop_cur = 0;
246 off_t loop_last = 0;
247 off_t l_loop;
248 off_t n_img_size;
249
250 struct_toc toc;
251 msf_mode_block msf_block;
252
253 if ( ( n_img_size = get_file_size ( fptrs -> fsource ) ) < 1 ) return ( -1 ); /* The image file is empty */
254
255 toc_first_track ( fptrs, img_struct, file_input, &toc );
256
257 n_loop = img_struct->pregap ;
258
259 while ( n_loop < n_img_size ) {
260
261 progress_bar ( ( int ) ( ( ( n_loop + 1 ) * 100 ) / n_img_size ) );
262
263 if ( track_vcd ( fptrs, img_struct, &toc, n_loop ) == AOK ) {
264
265 toc.track++;
266
267 l_loop = loop_cur - loop_last;
268
269 print_toc_vcd_time ( fptrs, &toc, img_struct, l_loop, loop_last);
270
271 fprintf ( fptrs->fdesc, "// TRACK %d\n", toc.track );
272
273 print_toc_track ( fptrs, &toc );
274
275 print_toc_mode ( fptrs, &toc, img_struct );
276
277 print_toc_datafile ( fptrs, file_input );
278
279 loop_last = loop_cur;
280
281 }
282
283
284 loop_cur++;
285
286 n_loop += img_struct->block;
287
288 }
289
290 l_loop = loop_cur - loop_last;
291
292 print_toc_vcd_time ( fptrs, &toc, img_struct, l_loop, loop_last);
293
294 progress_bar ( 100 );
295
296 return ( 0 );
297 }
298
299 /* --- @create_toc@ --- *
300 *
301 * Arguments: @file_ptrs *fptrs @ = input file
302 * @image_struct *img_struct@ = pointer struct of type image and pregap of image
303 * @char *file_input@ = name of input file
304 *
305 *
306 * Returns: Zeor on success, @-1@ on error.
307 *
308 * Use: Get info from file for generate a TOC file descriptor.
309 */
create_toc(file_ptrs * fptrs,image_struct * img_struct,char * file_input)310 int create_toc ( file_ptrs* fptrs, image_struct* img_struct, char *file_input )
311 {
312 int n_return_value = AOK;
313
314 fprintf( fptrs->fdesc, "// Generated with %s v%s\n", PACKAGE_NAME, VERSION );
315
316
317
318 switch ( img_struct->type ) {
319 case IMG_AUDIO:
320 fprintf ( fptrs->fdesc, "CD_DA\n" );
321 printf ("Need implementation\n");
322 break;
323 case IMG_ISO:
324 fprintf ( fptrs->fdesc, "CD_ROM\n" );
325 create_iso_toc ( fptrs, img_struct, file_input );
326 break;
327 case IMG_RAW:
328 fprintf ( fptrs->fdesc, "CD_ROM\n" );
329 create_raw_toc ( fptrs, img_struct, file_input );
330 break;
331 case IMG_VCD: case 9 : case 10 :
332 fprintf ( fptrs->fdesc, "CD_ROM_XA\n");
333 create_vcd_toc ( fptrs, img_struct, file_input );
334 break;
335 default :
336 n_return_value = ERROR;
337 break;
338 }
339 return ( n_return_value );
340 }
341
342
343