Example #1
0
/* This is broken reading more than 2Gb at a time is ssize_t is 32-bit. */
ssize_t DVDReadBlocks( dvd_file_t *dvd_file, int offset,
                       size_t block_count, unsigned char *data )
{
  int ret;

  /* Check arguments. */
  if( dvd_file == NULL || offset < 0 || data == NULL )
    return -1;

  /* Hack, and it will still fail for multiple opens in a threaded app ! */
  if( dvd_file->dvd->css_title != dvd_file->css_title ) {
    dvd_file->dvd->css_title = dvd_file->css_title;
    if( dvd_file->dvd->isImageFile ) {
      dvdinput_title( dvd_file->dvd->dev, (int)dvd_file->lb_start );
    }
    /* Here each vobu has it's own dvdcss handle, so no need to update
    else {
      dvdinput_title( dvd_file->title_devs[ 0 ], (int)dvd_file->lb_start );
    }*/
  }

  if( dvd_file->dvd->isImageFile ) {
    ret = DVDReadBlocksUDF( dvd_file, (uint32_t)offset,
                            block_count, data, DVDINPUT_READ_DECRYPT );
  } else {
    ret = DVDReadBlocksPath( dvd_file, (unsigned int)offset,
                             block_count, data, DVDINPUT_READ_DECRYPT );
  }

  return (ssize_t)ret;
}
int DVDReadBytes( dvd_file_t *dvd_file, void *data, int byte_size )
{
	unsigned char *secbuf;
	unsigned int numsec, seek_sector, seek_byte;
	int ret;
	
	/* Check arguments. */
	if( dvd_file == NULL || data == NULL )
		return -1;
	
	seek_sector = dvd_file->seek_pos / DVD_VIDEO_LB_LEN;
	seek_byte   = dvd_file->seek_pos % DVD_VIDEO_LB_LEN;
	
	numsec = ( ( seek_byte + byte_size ) / DVD_VIDEO_LB_LEN ) +
		( ( ( seek_byte + byte_size ) % DVD_VIDEO_LB_LEN ) ? 1 : 0 );
	
	secbuf = (unsigned char *) malloc( numsec * DVD_VIDEO_LB_LEN );
	if( !secbuf ) {
		//fprintf( stderr, "libdvdread: Can't allocate memory " 
		//	"for file read!\n" );
		return 0;
	}
	
	ret = DVDReadBlocksUDF( dvd_file, seek_sector, numsec, secbuf, 0 );
	if( ret != (int) numsec ) {
		free( secbuf );
		return ret < 0 ? ret : 0;
	}
	
	memcpy( data, &(secbuf[ seek_byte ]), byte_size );
	free( secbuf );
	
	dvd_file->seek_pos += byte_size;
	return byte_size;
}
Example #3
0
ssize_t DVDReadBytes( dvd_file_t *dvd_file, void *data, size_t byte_size )
{
  unsigned char *secbuf_start;
  unsigned char *secbuf; //must be aligned to 2048-bytes for raw/O_DIRECT
  unsigned int numsec, seek_sector, seek_byte;
  int ret;
    
  /* Check arguments. */
  if( dvd_file == NULL || data == NULL ) {
    errno = EINVAL;
    return -1;
  }
  seek_sector = dvd_file->seek_pos / DVD_VIDEO_LB_LEN;
  seek_byte   = dvd_file->seek_pos % DVD_VIDEO_LB_LEN;

  numsec = ( ( seek_byte + byte_size ) / DVD_VIDEO_LB_LEN ) +
    ( ( ( seek_byte + byte_size ) % DVD_VIDEO_LB_LEN ) ? 1 : 0 );

  /* must align to 2048 bytes if we are reading from raw/O_DIRECT */
  secbuf_start = (unsigned char *) malloc( (numsec+1) * DVD_VIDEO_LB_LEN );
  if( !secbuf_start ) {
    /* errno will be set to ENOMEM by malloc */
    return -1;
  }

  secbuf = DVD_ALIGN(secbuf_start);

  if( dvd_file->dvd->isImageFile ) {
    ret = DVDReadBlocksUDF( dvd_file, (uint32_t) seek_sector, 
                            (size_t) numsec, secbuf, DVDINPUT_NOFLAGS );
  } else {
    ret = DVDReadBlocksPath( dvd_file, seek_sector, 
                             (size_t) numsec, secbuf, DVDINPUT_NOFLAGS );
  }

  if( ret != (int) numsec ) {
    free( secbuf_start );
    return ret < 0 ? ret : 0;
  }

  memcpy( data, &(secbuf[ seek_byte ]), byte_size );
  free( secbuf_start );

  dvd_file->seek_pos += byte_size;
  return byte_size;
}
/* This is broken reading more than 2Gb at a time is ssize_t is 32-bit. */
int DVDReadBlocks( dvd_file_t *dvd_file, int offset, 
									size_t block_count, unsigned char *data )
{
	/* Check arguments. */
	if( dvd_file == NULL || offset < 0 || data == NULL )
		return -1;
	
	/* Hack, and it will still fail for multiple opens in a threaded app ! */
	if( dvd_file->dvd->css_title != dvd_file->css_title ) {
		dvd_file->dvd->css_title = dvd_file->css_title;
		/* Here each vobu has it's own dvdcss handle, so no need to update 
		else {
		dvdinput_title( dvd_file->title_devs[ 0 ], (int)dvd_file->lb_start );
	}*/
	}
	
	return DVDReadBlocksUDF( dvd_file, (unsigned int)offset, block_count, data, 1 );
}
Example #5
0
ssize_t DVDReadBytes( dvd_file_t *dvd_file, void *data, size_t byte_size )
{
  unsigned char *secbuf_base, *secbuf;
  unsigned int numsec, seek_sector, seek_byte;
  int ret;

  /* Check arguments. */
  if( dvd_file == NULL || data == NULL || (ssize_t)byte_size < 0 )
    return -1;

  seek_sector = dvd_file->seek_pos / DVD_VIDEO_LB_LEN;
  seek_byte   = dvd_file->seek_pos % DVD_VIDEO_LB_LEN;

  numsec = ( ( seek_byte + byte_size ) / DVD_VIDEO_LB_LEN ) +
    ( ( ( seek_byte + byte_size ) % DVD_VIDEO_LB_LEN ) ? 1 : 0 );

  secbuf_base = malloc( numsec * DVD_VIDEO_LB_LEN + 2048 );
  if( !secbuf_base ) {
    fprintf( stderr, "libdvdread: Can't allocate memory "
             "for file read!\n" );
    return 0;
  }
  secbuf = (unsigned char *)(((uintptr_t)secbuf_base & ~((uintptr_t)2047)) + 2048);

  if( dvd_file->dvd->isImageFile ) {
    ret = DVDReadBlocksUDF( dvd_file, (uint32_t) seek_sector,
                            (size_t) numsec, secbuf, DVDINPUT_NOFLAGS );
  } else {
    ret = DVDReadBlocksPath( dvd_file, seek_sector,
                             (size_t) numsec, secbuf, DVDINPUT_NOFLAGS );
  }

  if( ret != (int) numsec ) {
    free( secbuf_base );
    return ret < 0 ? ret : 0;
  }

  memcpy( data, &(secbuf[ seek_byte ]), byte_size );
  free( secbuf_base );

  DVDFileSeekForce(dvd_file, dvd_file->seek_pos + byte_size, -1);
  return byte_size;
}