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;
20 uint64_t size; // total atom size.
21 uint64_t offset; // offset in file.
22};
23
24namespace parser_detail {
26 uint32_t track_id = 0;
27 uint32_t tkhd_flags = 0;
28 uint32_t handler_type = 0;
29 std::string handler_name;
30 uint32_t timescale = 0;
31 uint64_t duration = 0;
32 uint32_t sample_count = 0;
33 std::vector<uint8_t> stsd;
34 std::vector<uint8_t> stts;
35 std::vector<uint8_t> stsc;
36 std::vector<uint8_t> stsz;
37 std::vector<uint8_t> stco;
38};
39} // namespace parser_detail
40
41// Minimal parsed MP4 data for our authoring needs.
42struct ParsedMp4 {
43 bool used_fallback_stbl = false; // true if stbl atoms were recovered via flat scan.
44
45 // All parsed tracks (audio/text/video).
46 std::vector<parser_detail::TrackParseResult> tracks;
47
48 // ilst metadata atom payload (optional).
49 std::vector<uint8_t> ilst_payload;
50 // raw meta payload (version/flags/reserved + children) to allow verbatim reuse.
51 std::vector<uint8_t> meta_payload;
52
53 // audio track timing info.
54 uint32_t audio_timescale = 0;
55 uint64_t audio_duration = 0;
56
57 // sample table (copied directly)
58 std::vector<uint8_t> stsd;
59 std::vector<uint8_t> stts;
60 std::vector<uint8_t> stsc;
61 std::vector<uint8_t> stsz;
62 std::vector<uint8_t> stco;
63};
64
65// Utility: read big-endian 32-bit value.
66uint32_t read_u32(std::istream &in);
67
68// Utility: read big-endian 64-bit value.
69uint64_t read_u64(std::istream &in);
70
71// Main parsing entry point.
72std::optional<ParsedMp4> parse_mp4(const std::string &path);
73
74#ifdef CHAPTERFORGE_TESTING
75// Test-only wrappers that allow unit tests to exercise lower-level parsing.
76std::optional<parser_detail::TrackParseResult> parse_trak_for_test(std::istream &in,
77 uint64_t payload_size,
78 uint64_t file_size,
79 bool &force_fallback);
80void parse_moov_for_test(std::istream &in, const Mp4AtomInfo &atom, uint64_t file_size,
81 ParsedMp4 &out, uint32_t &best_audio_samples, bool &force_fallback);
82#endif
Definition parser.hpp:24
uint32_t timescale
Definition parser.hpp:30
uint32_t tkhd_flags
Definition parser.hpp:27
std::vector< uint8_t > stsc
Definition parser.hpp:35
std::string handler_name
Definition parser.hpp:29
uint32_t sample_count
Definition parser.hpp:32
uint32_t track_id
Definition parser.hpp:26
uint32_t handler_type
Definition parser.hpp:28
std::vector< uint8_t > stco
Definition parser.hpp:37
std::vector< uint8_t > stsz
Definition parser.hpp:36
std::vector< uint8_t > stsd
Definition parser.hpp:33
std::vector< uint8_t > stts
Definition parser.hpp:34
uint64_t duration
Definition parser.hpp:31
Definition parser.hpp:25
uint64_t audio_duration
Definition parser.hpp:55
std::vector< uint8_t > ilst_payload
Definition parser.hpp:49
std::optional< ParsedMp4 > parse_mp4(const std::string &path)
std::vector< uint8_t > stsc
Definition parser.hpp:60
std::vector< uint8_t > stsz
Definition parser.hpp:61
uint32_t type
Definition parser.hpp:19
uint64_t offset
Definition parser.hpp:21
std::vector< uint8_t > stco
Definition parser.hpp:62
bool used_fallback_stbl
Definition parser.hpp:43
std::vector< uint8_t > meta_payload
Definition parser.hpp:51
std::vector< parser_detail::TrackParseResult > tracks
Definition parser.hpp:46
uint32_t audio_timescale
Definition parser.hpp:54
uint64_t read_u64(std::istream &in)
std::vector< uint8_t > stsd
Definition parser.hpp:58
std::vector< uint8_t > stts
Definition parser.hpp:59
uint64_t size
Definition parser.hpp:20
uint32_t read_u32(std::istream &in)
Definition parser.hpp:18
Definition parser.hpp:42