libudfread | branch: master | Petri Hintukainen <[email protected]> | Wed Jun 14 23:32:11 2017 +0300| [2e4197e66bf2f06f8aad8f9e5e711e6c8e4078b2] | committer: Petri Hintukainen
Handle Volume Descriptor Pointer > http://git.videolan.org/gitweb.cgi/libudfread.git/?a=commit;h=2e4197e66bf2f06f8aad8f9e5e711e6c8e4078b2 --- ChangeLog | 1 + src/ecma167.c | 8 +++++++- src/ecma167.h | 9 +++++++++ src/udfread.c | 13 +++++++++++-- 4 files changed, 28 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index c4e8e46..e8352ec 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,7 @@ ????-??-??: Version ?.?.? - Fix possible memory corruption with inline files. - Improve error resilience and stability. +- Add support for Volume Descriptor Pointer. 2017-06-07: Version 1.0.0 diff --git a/src/ecma167.c b/src/ecma167.c index 9cf0b3b..6c71158 100644 --- a/src/ecma167.c +++ b/src/ecma167.c @@ -106,7 +106,7 @@ void decode_primary_volume(const uint8_t *p, struct primary_volume_descriptor *p memcpy(pvd->volume_set_identifier, p + 72, 128); } -/* Anchor Volume Description Pointer (ECMA 167 3/10.2) */ +/* Anchor Volume Descriptor Pointer (ECMA 167 3/10.2) */ void decode_avdp(const uint8_t *p, struct anchor_volume_descriptor *avdp) { /* Main volume descriptor sequence extent */ @@ -116,6 +116,12 @@ void decode_avdp(const uint8_t *p, struct anchor_volume_descriptor *avdp) _decode_extent_ad(p + 24, &avdp->rvds); } +/* Volume Descriptor Pointer (ECMA 167 3/10.3) */ +void decode_vdp(const uint8_t *p, struct volume_descriptor_pointer *vdp) +{ + _decode_extent_ad(p + 20, &vdp->next_extent); +} + /* Partition Descriptor (ECMA 167 3/10.5) */ void decode_partition(const uint8_t *p, struct partition_descriptor *pd) { diff --git a/src/ecma167.h b/src/ecma167.h index a38e97e..be56d8d 100644 --- a/src/ecma167.h +++ b/src/ecma167.h @@ -87,6 +87,7 @@ enum tag_identifier { /* ECMA 167, 3/7.2.1) */ ECMA_PrimaryVolumeDescriptor = 1, ECMA_AnchorVolumeDescriptorPointer = 2, + ECMA_VolumeDescriptorPointer = 3, ECMA_PartitionDescriptor = 5, ECMA_LogicalVolumeDescriptor = 6, ECMA_TerminatingDescriptor = 8, @@ -122,6 +123,14 @@ struct anchor_volume_descriptor { void decode_avdp(const uint8_t *p, struct anchor_volume_descriptor *avdp); +/* Volume Descriptor Pointer (ECMA 167, 3/10.3) */ + +struct volume_descriptor_pointer { + struct extent_ad next_extent; /* Next Volume Descriptor Sequence Extent */ +}; + +void decode_vdp(const uint8_t *p, struct volume_descriptor_pointer *vdp); + /* Partition Descriptor (ECMA 167, 3/10.5) */ struct partition_descriptor { diff --git a/src/udfread.c b/src/udfread.c index 834226d..4b49170 100644 --- a/src/udfread.c +++ b/src/udfread.c @@ -379,15 +379,19 @@ static int _search_vds(udfread_block_input *input, int part_number, struct volume_descriptor_set *vds) { + struct volume_descriptor_pointer vdp; uint8_t buf[UDF_BLOCK_SIZE]; int tag_id; uint32_t lba; - uint32_t end_lba = loc->lba + loc->length / UDF_BLOCK_SIZE; + uint32_t end_lba; int have_part = 0, have_lvd = 0, have_pvd = 0; + memset(vds, 0, sizeof(*vds)); + +next_extent: udf_trace("reading Volume Descriptor Sequence at lba %u, len %u bytes\n", loc->lba, loc->length); - memset(vds, 0, sizeof(*vds)); + end_lba = loc->lba + loc->length / UDF_BLOCK_SIZE; /* parse Volume Descriptor Sequence */ for (lba = loc->lba; lba < end_lba; lba++) { @@ -396,6 +400,11 @@ static int _search_vds(udfread_block_input *input, int part_number, switch (tag_id) { + case ECMA_VolumeDescriptorPointer: + decode_vdp(buf, &vdp); + loc = &vdp.next_extent; + goto next_extent; + case ECMA_PrimaryVolumeDescriptor: udf_log("Primary Volume Descriptor in lba %u\n", lba); decode_primary_volume(buf, &vds->pvd); _______________________________________________ libbluray-devel mailing list [email protected] https://mailman.videolan.org/listinfo/libbluray-devel
