ChapterForge
Loading...
Searching...
No Matches
parser.hpp
Go to the documentation of this file.
1//
2// parser.hpp
3// ChapterForge
4//
5// Created by Till Toenshoff on 12/9/25.
6// Copyright © 2025 Till Toenshoff. All rights reserved.
7//
8
9#pragma once
10
11#include <cstdint>
12#include <istream>
13#include <memory>
14#include <optional>
15#include <string>
16#include <vector>
17
19 uint32_t type = 0;
20 uint64_t size = 0; // Total atom size, including its header.
21 uint64_t offset = 0; // Offset of the atom header in the file or enclosing stream.
22 uint64_t header_size = 8; // 8 normally, 16 when a 64-bit extended size is present.
23};
24
25namespace parser_detail {
27 uint32_t track_id = 0;
28 uint32_t tkhd_flags = 0;
29 uint32_t handler_type = 0;
30 std::string handler_name;
31 uint32_t timescale = 0;
32 uint64_t duration = 0;
33 uint32_t sample_count = 0;
34 std::vector<uint8_t> stsd;
35 std::vector<uint8_t> stts;
36 std::vector<uint8_t> stsc;
37 std::vector<uint8_t> stsz;
38 std::vector<uint8_t> stco;
39 std::vector<uint8_t> co64;
40};
41} // namespace parser_detail
42
43// Minimal parsed MP4 data for our authoring needs.
44struct ParsedMp4 {
45 bool used_fallback_stbl = false; // Reserved for reporting parser recovery paths.
46
47 // All parsed tracks (audio/text/video).
48 std::vector<parser_detail::TrackParseResult> tracks;
49
50 // ilst metadata atom payload (optional).
51 std::vector<uint8_t> ilst_payload;
52 // raw meta payload (version/flags/reserved + children) to allow verbatim reuse.
53 std::vector<uint8_t> meta_payload;
54
55 // audio track timing info.
56 uint32_t audio_timescale = 0;
57 uint64_t audio_duration = 0;
58
59 // sample table (copied directly)
60 std::vector<uint8_t> stsd;
61 std::vector<uint8_t> stts;
62 std::vector<uint8_t> stsc;
63 std::vector<uint8_t> stsz;
64 std::vector<uint8_t> stco;
65 std::vector<uint8_t> co64;
66};
67
68// Utility: read big-endian 32-bit value.
69uint32_t read_u32(std::istream &in);
70
71// Utility: read big-endian 64-bit value.
72uint64_t read_u64(std::istream &in);
73
74// Main parsing entry point.
75std::optional<ParsedMp4> parse_mp4(const std::string &path);
76
77#ifdef CHAPTERFORGE_TESTING
78// Test-only wrappers that allow unit tests to exercise lower-level parsing.
79std::optional<parser_detail::TrackParseResult> parse_trak_for_test(std::istream &in,
80 uint64_t payload_size,
81 uint64_t file_size,
82 bool &force_fallback);
83void parse_moov_for_test(std::istream &in, const Mp4AtomInfo &atom, uint64_t file_size,
84 ParsedMp4 &out, uint32_t &best_audio_samples, bool &force_fallback);
85#endif
Definition parser.hpp:25
std::vector< uint8_t > co64
Definition parser.hpp:39
uint32_t timescale
Definition parser.hpp:31
uint32_t tkhd_flags
Definition parser.hpp:28
std::vector< uint8_t > stsc
Definition parser.hpp:36
std::string handler_name
Definition parser.hpp:30
uint32_t sample_count
Definition parser.hpp:33
uint32_t track_id
Definition parser.hpp:27
uint32_t handler_type
Definition parser.hpp:29
std::vector< uint8_t > stco
Definition parser.hpp:38
std::vector< uint8_t > stsz
Definition parser.hpp:37
std::vector< uint8_t > stsd
Definition parser.hpp:34
std::vector< uint8_t > stts
Definition parser.hpp:35
uint64_t duration
Definition parser.hpp:32
Definition parser.hpp:26
uint64_t audio_duration
Definition parser.hpp:57
std::vector< uint8_t > ilst_payload
Definition parser.hpp:51
std::optional< ParsedMp4 > parse_mp4(const std::string &path)
std::vector< uint8_t > stsc
Definition parser.hpp:62
std::vector< uint8_t > stsz
Definition parser.hpp:63
uint32_t type
Definition parser.hpp:19
uint64_t offset
Definition parser.hpp:21
std::vector< uint8_t > stco
Definition parser.hpp:64
bool used_fallback_stbl
Definition parser.hpp:45
std::vector< uint8_t > meta_payload
Definition parser.hpp:53
std::vector< parser_detail::TrackParseResult > tracks
Definition parser.hpp:48
uint32_t audio_timescale
Definition parser.hpp:56
uint64_t read_u64(std::istream &in)
std::vector< uint8_t > co64
Definition parser.hpp:65
std::vector< uint8_t > stsd
Definition parser.hpp:60
std::vector< uint8_t > stts
Definition parser.hpp:61
uint64_t header_size
Definition parser.hpp:22
uint64_t size
Definition parser.hpp:20
uint32_t read_u32(std::istream &in)
Definition parser.hpp:18
Definition parser.hpp:44