1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| static void plus_r_dl_split (Scsi_Command &cmd,off64_t size)
{ int err;
unsigned int blocks,split;
unsigned char dvd_20[4+8];
cmd[0] = 0xAD; // READ DVD STRUCTURE
cmd[7] = 0x20; // "DVD+R Double Layer Boundary Information"
cmd[9] = sizeof(dvd_20);
cmd[11] = 0;
if ((err=cmd.transport(READ,dvd_20,sizeof(dvd_20))))
sperror ("READ DVD+R DL BOUNDARY INFORMATION",err),
exit (FATAL_START(errno));
if ((dvd_20[0]<<8|dvd_20[1]) < 10)
fprintf (stderr,":-( insane DVD+R DL BI structure length\n"),
exit (FATAL_START(EINVAL));
if (dvd_20[4]&0x80)
{ fprintf (stderr,":-? L0 Data Zone Capacity is set already\n");
return;
}
split = dvd_20[8]<<24|dvd_20[9]<<16|dvd_20[10]<<8|dvd_20[11];
blocks = size/2048;
blocks += 15, blocks &= ~15;
if (blocks <= split)
fprintf (stderr,":-( more than 50%% of space will be *wasted*!\n"
" use single layer media for this recording\n"),
exit (FATAL_START(EMEDIUMTYPE));
blocks /= 16;
blocks += 1;
blocks /= 2;
blocks *= 16;
fprintf (stderr,"%s: splitting layers at %u blocks\n",
ioctl_device,blocks);
memset (dvd_20,0,sizeof(dvd_20));
dvd_20[1] = sizeof(dvd_20)-2;
dvd_20[8] = blocks>>24;
dvd_20[9] = blocks>>16;
dvd_20[10] = blocks>>8;
dvd_20[11] = blocks;
cmd[0] = 0xBF; // SEND DVD STRUCTURE
cmd[7] = 0x20; // "DVD+R Double Layer Recording Information"
cmd[9] = sizeof(dvd_20);
cmd[11] = 0;
if ((err=cmd.transport(WRITE,dvd_20,sizeof(dvd_20))))
sperror ("SEND DVD+R DOUBLE LAYER RECORDING INFORMATION",err),
exit (FATAL_START(errno));
} |
Partager