martes, 26 de junio de 2007

Viaje al interior de... un DVD

Hoy me pasaron un DVD con un video. Al llegar a mis manos me comentaron que el DVD no estaba cerrado («sin finalizar», que supongo que será el término que usen los programas como Nero). En principio no debería haber ningún problema, ya que mi máquina es nueva, ya han pasado por aquí varios CDs sin cerrar, estoy con un 2.6.17 (el de Ubuntu Edgy... y ya... no es que esté recién sacado del horno, pero tampoco se puede decir que sea viejo), etc etc

Cuando el DVD entra en la máquina aparece un mensaje como que acabo de meter un disco virgen, y me pregunta si lo quiero desvirgar ¿?¿?. Antes de que cunda el caos, miro en el syslog a ver qué se cuenta. Cada vez que entra el DVD aparece.

...] cdrom: This disc doesn't have any tracks I recognize!

Buscando por Google con ese mensaje no veo nada de utilidad, así que intento atacar el disco directamente. Aunque no tenía muchas esperanzas probé con un dd, pero salía nada más empezar, y en el syslog podía ver

...] end_request: I/O error, dev sr0, sector 0
...] printk: 17 messages suppressed.
...] Buffer I/O error on device sr0, logical block 0
...] end_request: I/O error, dev sr0, sector 0

Ouch!

Buscando herramientas relacionadas con los DVD (aún no he perdido la esperanza) veo un dvd+rw-mediainfo, que forma parte del paquete dvd+rw-tools. Al ejecutarlo sobre el DVD veo cosas bastante prometedoras:

# dvd+rw-mediainfo /dev/dvd
INQUIRY:                [PHILIPS ][DVD+-RW SDVD8820][AD15]
GET [CURRENT] CONFIGURATION:
 Mounted Media:         11h, DVD-R Sequential
 Media ID:              CMC MAG. AE1
 Current Write Speed:   8.0x1385=11080KB/s
 Write Speed #0:        8.0x1385=11080KB/s
 Write Speed #1:        6.0x1385=8310KB/s
 Write Speed #2:        4.0x1385=5540KB/s
 Write Speed #3:        2.0x1385=2770KB/s
 Speed Descriptor#0:    00/2297887 R@8.0x1385=11080KB/s W@8.0x1385=11080KB/s
 Speed Descriptor#1:    00/2297887 R@8.0x1385=11080KB/s W@6.0x1385=8310KB/s
 Speed Descriptor#2:    00/2297887 R@8.0x1385=11080KB/s W@4.0x1385=5540KB/s
 Speed Descriptor#3:    00/2297887 R@8.0x1385=11080KB/s W@2.0x1385=2770KB/s
READ DVD STRUCTURE[#10h]:
 Media Book Type:       25h, DVD-R book [revision 5]
 Legacy lead-out at:    2298496*2KB=4707319808
READ DVD STRUCTURE[#0h]:
 Media Book Type:       25h, DVD-R book [revision 5]
 Last border-out at:    0*2KB=0
READ DISC INFORMATION:
 Disc status:           appendable
 Number of Sessions:    1
 State of Last Session: incomplete
 "Next" Track:          1
 Number of Tracks:      4
READ TRACK INFORMATION[#1]:
 Track State:           reserved incremental
 Track Start Address:   0*2KB
 Next Writable Address: 0*2KB
 Free Blocks:           1520*2KB
 Track Size:            1520*2KB
READ TRACK INFORMATION[#2]:
 Track State:           complete incremental
 Track Start Address:   1536*2KB
 Free Blocks:           0*2KB
 Track Size:            176*2KB
 Last Recorded Address: 1551*2KB
READ TRACK INFORMATION[#3]:
 Track State:           complete incremental
 Track Start Address:   1728*2KB
 Free Blocks:           0*2KB
 Track Size:            668544*2KB
 Last Recorded Address: 670271*2KB
READ TRACK INFORMATION[#4]:
 Track State:           invisible incremental
 Track Start Address:   670288*2KB
 Next Writable Address: 670288*2KB
 Free Blocks:           1627600*2KB
 Track Size:            1627600*2KB
READ CAPACITY:          0*2048=0

Apenas he trabajado con DVDs multisesión, pero supongo que esa salida será más que normal. Lo que importa es que el DVD está ahí, y, de algún modo, dvd+rw-mediainfo puede acceder a él.

Me pongo a buscar entre las herramientas sobre DVDs y CDs y veo que cdrecord tiene un readcd, que parece ser lo que necesito. Los primeros resultados no son muy positivos

# readcd dev=/dev/scd0 f=cdimage.raw
Read  speed: 11080 kB/s (CD  62x, DVD  8x).
Write speed: 11080 kB/s (CD  62x, DVD  8x).
Capacity: 1 Blocks = 2 kBytes = 0 MBytes = 0 prMB
Sectorsize: 2048 Bytes
Copy from SCSI (1,0,0) disk to file 'cdimage.raw'
end:         1
readcd: Input/output error. read_g1: scsi sendcmd: no error
CDB:  28 00 00 00 00 00 00 00 01 00
status: 0x2 (CHECK CONDITION)
Sense Bytes: 70 00 05 00 00 00 00 0A 00 00 00 00 21 00 00 00
Sense Key: 0x5 Illegal Request, Segment 0
Sense Code: 0x21 Qual 0x00 (logical block address out of range) Fru 0x0
Sense flags: Blk 0 (not valid) 
resid: 2048
cmd finished after 0.009s timeout 40s
readcd: Input/output error. Cannot read source disk
readcd: Retrying from sector 0.
.~~-~~~+~~~-~~~+~~~-~~~+~~~-~~~+~~~-~~~+~~~-~~~+~~~-~~~+~~~-~~~+~~~-~~~+~~~-~~~+~~~-~~~+~~~-~~~+~~~-~~~+~~~-~~~+~~~-~~~
readcd: Input/output error. Error on sector 0 not corrected. Total of 1 errors.

Time total: 1.982sec
Read 0.00 kB at 0.0 kB/sec.
Max corected retry count was 0 (limited to 128).
The following 1 sector(s) could not be read correctly:
0

Tiene el mismo problema que el dd. Mirando en el man para ver si hay manera de que ignore esos errores y siga leyendo veo que hay opciones como -noerror o -nocorr. Con estas opciones lee un poco más, pero no sale de la primera pista

Mirando un poco más veo que hay una opción para indicar qué sectores sacar del DVD. Fíjandome en la salida del dvd+rw-mediainfo veo que la segunda y la tercera pista están desde el sector 1536 al 670448 (el final se saca sumando el tamaño de las dos)... Así que añado sectors=1536-670448 a las opciones del readcd... y ¡Voilà!

Los datos que empiezan a leer corresponden al video que quería ver. Después de unos minutos tengo un fichero de 1,3Gib con un video de unos 20 minutos

Según file el fichero es un Video title set, v11, aunque el mplayer lo abre usando el codec mpegpes, que (según su propia descripción) corresponde a MPEG-PES output (.mpg or DXR3/DVB card)

Quizás con algún programa de esos llenos de dibujos y colores por todas partes no hubiera tenido que pensar en cómo solucionar este tema, pero seguro que no me hubiera sentido tan bien con la solución.

1 comentario:

Unknown dijo...

no entendi lo que quiere decir y no me ayuda con mi tarea!!!!!!!!!!!!