307
307
//!! if( (audio_attr->channels + 1) == 6 ) return( "dts" );
308
308
return( _AudioFormat[audio_attr->audio_format] );
310
/*------------------------------------------------------------------------------
312
Linux!jef 2006/07/07 20:49:13
313
------------------------------------------------------------------------------*/
315
static int FindNextGoodSector( dvd_file_t * dvdFile, int noSect, int lim )
317
char buffer[DVD_VIDEO_LB_LEN];
322
if( lim < 1000 ) lim = 1000;
325
CTEST(fprintf(stderr,"Testing <%d,%d>\n", noSect, bMax ););
326
while( (bMax - noSect) > 1 ) {
327
next = noSect + (( bMax - noSect ) / 2);
329
res = DVDReadBlocks( dvdFile, next, 1, (unsigned char *)buffer );
331
CTEST(fprintf(stderr,"sector %d good\n", next ););
335
CTEST(fprintf(stderr,"sector %d bad\n", next ););
339
CTEST(fprintf(stderr,"NextGood: %d\n", bMax ););
343
/*------------------------------------------------------------------------------
311
/*------------------------------------------------------------------------------
345
313
Linux!jef 2006/07/06 22:04:04
314
Special for dvd errors handling
346
315
------------------------------------------------------------------------------*/
348
ssize_t MyDVDReadBlocks( dvd_file_t * dvdFile, int noSect, size_t nbSect, unsigned char * buffer )
316
int MyDVDRead1Block( dvd_file_t * dvdFile, int noSect, void * buffer )
352
CTEST(fprintf(stderr,"Reading(%d,%ld) (%d,%d)\n", noSect, nbSect, BadStart, BadEnd ););
353
if( (noSect >= BadStart) && (int)(noSect+nbSect) <= BadEnd ) {
354
memset( buffer, 0, DVD_VIDEO_LB_LEN * nbSect );
357
nbRead = DVDReadBlocks( dvdFile, noSect, nbSect, buffer );
358
CTEST(fprintf(stderr,"Readed:=%ld\n", nbRead ););
363
BadStart = BadEnd = -1;
367
buffer += ( nbRead * DVD_VIDEO_LB_LEN );
368
if( !nbSect ) return( nbRead );
369
if( IgnoreErrors == -1 ) {
370
int res = MessageBoxYesNo( _("Erreur de lecture ! Ignorer les erreurs ?" ) );
376
if( !IgnoreErrors ) return( -1 );
377
CTEST(fprintf(stderr,"ReadError: nbSect=%ld\n", nbSect ););
378
/* En cas d'erreur de lecture on suppose que c'est un plage complete qui est HS pour eviter
379
de prendre trop de temps avec des lectures unitaires
382
BadEnd = FindNextGoodSector( dvdFile, noSect, nbSect + 1 );
384
return( nbRead + MyDVDReadBlocks( dvdFile, noSect, nbSect, buffer ) );
388
memset( buffer, 0, DVD_VIDEO_LB_LEN );
391
while( nbSect > 0 ) {
394
res = DVDReadBlocks( dvdFile, noSect, 1, buffer );
396
fprintf(stderr,"ReadError: Sector=%d zeroed\n", noSect );
397
memset( buffer, 0, DVD_VIDEO_LB_LEN );
400
fprintf(stderr,"ReadError: Sector=%d readed\n", noSect );
404
buffer += ( 1 * DVD_VIDEO_LB_LEN );
320
CTEST2(fprintf(stderr,"%s: Reading(%d) at %p\n", __FUNCTION__, noSect, buffer ););
322
if( IsBadSector( noSect ) ) return( 0 );
324
nbRead = DVDReadBlocks( dvdFile, noSect, 1, buffer );
325
CTEST2(fprintf(stderr,"%s: Readed:=%ld\n", __FUNCTION__, nbRead ););
327
DBG('b',fprintf(stderr,"%s: bad sector: %d\n", __FUNCTION__, noSect ););
328
NoteBadSector( noSect );
329
if( IgnoreErrors == -1 ) {
330
int res = MessageBoxYesNo( _("Erreur de lecture ! Ignorer les erreurs ?" ) );
337
if( IgnoreErrors ) return( 0 );
411
343
/*------------------------------------------------------------------------------
427
359
memset( &Pistes, 0, sizeof(Pistes));
361
/*------------------------------------------------------------------------------
363
Linux!jef 2007/08/16 00:41:38
364
------------------------------------------------------------------------------*/
366
void CreateDummyPack( unsigned char * buffer )
368
int8_t *ptr = (int8_t*)buffer;
370
uint8_t dummy_pack [] =
372
/* pack header: SCR=0, mux rate=10080000bps, stuffing length=0 */
373
0, 0, 1, 0xba, 0x44, 0x00, 0x04, 0x00, 0x04, 0x01, 0x01, 0x89, 0xc3, 0xf8,
374
/* PES header for dummy video packet */
375
0, 0, 1, 0xe0, 0x07, 0xec, 0x81, 0x00, 0x00
378
tc_memcpy( ptr, dummy_pack, sizeof (dummy_pack));
379
ptr += sizeof (dummy_pack);
380
memset( ptr, 0xff, DVD_VIDEO_LB_LEN - sizeof (dummy_pack));
383
/*------------------------------------------------------------------------------
385
Linux!jef 2007/08/16 00:43:54
386
------------------------------------------------------------------------------*/
388
void CreateDummyNavPack( unsigned char * buffer, unsigned int sector )
390
int8_t *ptr = (int8_t*)buffer;
394
static uint8_t nav_pack1 [] =
396
/* pack header: SCR=0, mux rate=10080000bps, stuffing length=0 */
397
0, 0, 1, 0xba, 0x44, 0x00, 0x04, 0x00, 0x04, 0x01, 0x01, 0x89, 0xc3, 0xf8,
398
/* system header length=0x12=18*/
399
0, 0, 1, 0xbb, 0x00, 0x12,
400
/* contents of system header filled in at run time (18 bytes) */
401
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
402
/* PES header for first private stream 2 packet */
403
0, 0, 1, 0xbf, 0x03, 0xd4
405
static uint8_t nav_pack2 [] =
407
/* PES header for second private stream 2 packet */
408
0, 0, 1, 0xbf, 0x03, 0xfa
411
tc_memcpy( ptr, nav_pack1, sizeof (nav_pack1));
412
ptr += sizeof (nav_pack1);
413
memset( ptr, 0, DVD_VIDEO_LB_LEN/2 - sizeof (nav_pack1));
414
ptr = (int8_t*)buffer + DVD_VIDEO_LB_LEN/2;
415
tc_memcpy( ptr, nav_pack2, sizeof (nav_pack2));
416
ptr += sizeof (nav_pack2);
417
memset( ptr, 0, DVD_VIDEO_LB_LEN/2 - sizeof (nav_pack2));
419
navRead_DSI( &dsiPack, buffer + DSI_START_BYTE);
420
navRead_PCI( &pciPack, buffer+0x2d);
421
dsiPack.dsi_gi.nv_pck_lbn= sector;
422
dsiPack.dsi_gi.vobu_ea = 1;
424
navRead_DSI((dsi_t*)(buffer + DSI_START_BYTE),(unsigned char*)&dsiPack);
425
pciPack.pci_gi.nv_pck_lbn = dsiPack.dsi_gi.nv_pck_lbn;
426
navRead_PCI((pci_t*)(buffer+0x2d),(unsigned char*)&pciPack);
428
/*------------------------------------------------------------------------------
430
Linux!jef 2007/08/22 22:35:53
431
------------------------------------------------------------------------------*/
433
int VerifNavPack( unsigned char * p )
440
if (p[3] == 0xBA) { /* program stream pack header */
441
int32_t nStuffingBytes;
443
bMpeg1 = (p[4] & 0x40) == 0;
448
nStuffingBytes = p[0xD] & 0x07;
449
p += 14 + nStuffingBytes;
453
if (p[3] == 0xbb) { /* program stream system header */
454
nHeaderLen = (p[4] << 8) | p[5];
458
/* we should now have a PES packet here */
459
if (p[0] || p[1] || (p[2] != 1)) {
460
fprintf(stderr, "%s: demux error! %02x %02x %02x (should be 0x000001) \n",__FUNCTION__,p[0],p[1],p[2]);
464
nPacketLen = p[4] << 8 | p[5];
470
if (nStreamID == 0xbf) { /* Private stream 2 */
471
// if(p[0] == 0x00) navRead_PCI(nav_pci, p+1);
473
/* We should now have a DSI packet. */
475
nPacketLen = p[4] << 8 | p[5];
477
// navRead_DSI(nav_dsi, p+1);
481
fprintf(stderr,"%s: bad streamid 0x%x\n", __FUNCTION__, nStreamID );