Files
libaaruformat/include/aaruformat/structs/optical.h

86 lines
4.3 KiB
C

/*
* This file is part of the Aaru Data Preservation Suite.
* Copyright (c) 2019-2025 Natalia Portillo.
*
* This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of the
* License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
* */
#ifndef LIBAARUFORMAT_OPTICAL_H
#define LIBAARUFORMAT_OPTICAL_H
#pragma pack(push, 1)
/** \file aaruformat/structs/optical.h
* \brief On-disk structures describing optical disc tracks (Track list block).
*
* An optical tracks block (identifier == BlockType::TracksBlock) stores a list of \ref TrackEntry
* records describing the logical layout of tracks and sessions for CD/DVD/BD and similar media.
*
* Layout:
* TracksHeader (fixed)
* TrackEntry[ entries ] (array, packed)
*
* CRC semantics:
* - TracksHeader::crc64 is a CRC64-ECMA over the contiguous TrackEntry array ONLY (header excluded).
* - For legacy images (imageMajorVersion <= AARUF_VERSION_V1) a byte swap is applied when verifying.
*
* Field semantics (TrackEntry):
* - sequence: Logical track number (1..99 typical for CD). Values outside that range may encode extras.
* - type: Value from \ref TrackType (Audio, Data, Mode variants, etc.).
* - start / end: Inclusive Logical Block Address (LBA) bounds for the track. end >= start.
* - pregap: Number of sectors of pre-gap *preceding* the track's first user-accessible sector (can be 0 or negative
* if representing lead-in semantics; negative interpretation is implementation-defined).
* - session: Session number starting at 1 for multi-session discs (1 for single session).
* - isrc: 13-byte ISRC (raw code, no terminating null). If fewer significant characters, remaining bytes are 0.
* - flags: Bitmask of track/control flags. Unless otherwise specified, recommended mapping (mirrors CD subchannel Q
* control bits) is: bit0 Pre-emphasis, bit1 Copy permitted, bit2 Data track, bit3 Four-channel audio,
* bits4-7 reserved. Actual semantics may be extended by the format specification.
*
* Invariants / validation recommendations:
* - identifier == BlockType::TracksBlock
* - entries * sizeof(TrackEntry) bytes are present after the header in the block image.
* - 1 <= sequence <= 99 for standard CD tracks (non-conforming values allowed but should be documented).
* - start <= end; pregap >= 0 (if negative pregaps unsupported in implementation).
* - ISRC bytes either all zero (no ISRC) or printable ASCII (A-Z 0-9 -) per ISO 3901 (without hyphen formatting).
*/
/** \struct TracksHeader
* \brief Header for an optical tracks block listing track entries.
*/
typedef struct TracksHeader
{
uint32_t identifier; ///< Block identifier (must be BlockType::TracksBlock).
uint16_t entries; ///< Number of TrackEntry records following this header.
uint64_t crc64; ///< CRC64-ECMA of the TrackEntry array (header excluded, legacy byte-swap for early versions).
} TracksHeader;
/** \struct TrackEntry
* \brief Single optical disc track descriptor (sequence, type, LBAs, session, ISRC, flags).
*/
typedef struct TrackEntry
{
uint8_t sequence; ///< Track number (1..99 typical for CD audio/data). 0 may indicate placeholder/non-standard.
uint8_t type; ///< Track type (value from \ref TrackType).
int64_t start; ///< Inclusive starting LBA of the track.
int64_t end; ///< Inclusive ending LBA of the track.
int64_t pregap; ///< Pre-gap length in sectors preceding track start (0 if none).
uint8_t session; ///< Session number (1-based). 1 for single-session discs.
uint8_t isrc[13]; ///< ISRC raw 13-byte code (no null terminator). All zeros if not present.
uint8_t flags; ///< Control / attribute bitfield (see file documentation for suggested bit mapping).
} TrackEntry;
#pragma pack(pop)
#endif // LIBAARUFORMAT_OPTICAL_H