ChapterForge
Loading...
Searching...
No Matches
mdat_writer.hpp
Go to the documentation of this file.
1//
2// mdat_writer.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#include <cstdint>
11#include <fstream>
12#include <vector>
13
14#include "mp4_atoms.hpp"
15
16// Stores final chunk offsets per track, used for STCO patching.
18 std::vector<uint32_t> audio_offsets;
19 std::vector<std::vector<uint32_t>> text_offsets; // one entry per text track
20 std::vector<uint32_t> image_offsets;
21
22 uint64_t payload_start = 0; // absolute file offset where mdat payload begins
23};
24
25// Write mdat and return offsets (relative to payload_start)
26MdatOffsets write_mdat(std::ofstream &out, const std::vector<std::vector<uint8_t>> &audio_samples,
27 const std::vector<std::vector<std::vector<uint8_t>>> &text_tracks_samples,
28 const std::vector<std::vector<uint8_t>> &image_samples,
29 const std::vector<uint32_t> &audio_chunk_sizes,
30 const std::vector<std::vector<uint32_t>> &text_chunk_sizes,
31 const std::vector<uint32_t> &image_chunk_sizes);
32
33// Patch a single stco atom.
34void patch_stco_table(Atom *stco, const std::vector<uint32_t> &offsets,
35 uint64_t mdat_payload_start);
36
37// Patch stco boxes in moov (audio, text tracks, image). If patch_audio is false,
38// audio stco (first one) is left untouched.
39void patch_all_stco(Atom *moov, const MdatOffsets &offs, bool patch_audio = true);
40
41// Compute chunk offsets without writing, given starting payload offset.
42MdatOffsets compute_mdat_offsets(uint64_t payload_start,
43 const std::vector<std::vector<uint8_t>> &audio_samples,
44 const std::vector<std::vector<std::vector<uint8_t>>> &text_tracks_samples,
45 const std::vector<std::vector<uint8_t>> &image_samples,
46 const std::vector<uint32_t> &audio_chunk_sizes,
47 const std::vector<std::vector<uint32_t>> &text_chunk_sizes,
48 const std::vector<uint32_t> &image_chunk_sizes);
Definition mp4_atoms.hpp:24
MdatOffsets write_mdat(std::ofstream &out, const std::vector< std::vector< uint8_t > > &audio_samples, const std::vector< std::vector< std::vector< uint8_t > > > &text_tracks_samples, const std::vector< std::vector< uint8_t > > &image_samples, const std::vector< uint32_t > &audio_chunk_sizes, const std::vector< std::vector< uint32_t > > &text_chunk_sizes, const std::vector< uint32_t > &image_chunk_sizes)
uint64_t payload_start
Definition mdat_writer.hpp:22
std::vector< std::vector< uint32_t > > text_offsets
Definition mdat_writer.hpp:19
std::vector< uint32_t > image_offsets
Definition mdat_writer.hpp:20
MdatOffsets compute_mdat_offsets(uint64_t payload_start, const std::vector< std::vector< uint8_t > > &audio_samples, const std::vector< std::vector< std::vector< uint8_t > > > &text_tracks_samples, const std::vector< std::vector< uint8_t > > &image_samples, const std::vector< uint32_t > &audio_chunk_sizes, const std::vector< std::vector< uint32_t > > &text_chunk_sizes, const std::vector< uint32_t > &image_chunk_sizes)
std::vector< uint32_t > audio_offsets
Definition mdat_writer.hpp:18
void patch_all_stco(Atom *moov, const MdatOffsets &offs, bool patch_audio=true)
void patch_stco_table(Atom *stco, const std::vector< uint32_t > &offsets, uint64_t mdat_payload_start)
Definition mdat_writer.hpp:17