/* Partition Descriptor */
UDFPartition( LogBlock, &part->Flags, &part->Number,
part->Contents, &part->Start, &part->Length );
+ part->Start_Correction = 0;
part->valid = ( partnum == part->Number );
} else if( ( TagID == 6 ) && ( !volvalid ) ) {
/* Logical Volume Descriptor */
UDFExtFileEntry( LogBlock, &File );
if (File.Type == 250) {
part->Start += File.AD_chain[0].Location;
+ // we need to remember this correction because read positions are relative to the non-indirected partition start
+ part->Start_Correction = File.AD_chain[0].Location;
part->Length = File.AD_chain[0].Length;
break;
}
memset(File, 0, sizeof(*File));
File->Partition = partition->Number;
File->Partition_Start = partition->Start;
+ File->Partition_Start_Correction = partition->Start_Correction;
do {
if( DVDReadLBUDF( lbnum++, 1, LogBlock, 0 ) <= 0 )
if(len == 0)
break;
- pos -= 32 * DVD_VIDEO_LB_LEN; /* why? */
+ // correct for partition indirection if applicable
+ pos -= bdfile->file->Partition_Start_Correction * DVD_VIDEO_LB_LEN;
if((uint32_t)lSize < len)
len = lSize;