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/co64 patching.
18 std::vector<uint64_t> audio_offsets;
19 std::vector<std::vector<uint64_t>> text_offsets; // one entry per text track
20 std::vector<uint64_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// Promote all 32-bit chunk-offset tables before layout when output offsets may exceed 32 bits.
35
36// Patch stco/co64 boxes in moov (audio, text tracks, image). If patch_audio is false,
37// the first audio offset table is left untouched.
38void patch_all_stco(Atom *moov, const MdatOffsets &offs, bool patch_audio = true);
39
41 const std::vector<std::vector<uint8_t>> &audio_samples,
42 const std::vector<std::vector<std::vector<uint8_t>>> &text_tracks_samples,
43 const std::vector<std::vector<uint8_t>> &image_samples);
44
45uint64_t mdat_header_size(uint64_t payload_size);
46
47// Compute chunk offsets without writing, given starting payload offset.
48MdatOffsets compute_mdat_offsets(uint64_t payload_start,
49 const std::vector<std::vector<uint8_t>> &audio_samples,
50 const std::vector<std::vector<std::vector<uint8_t>>> &text_tracks_samples,
51 const std::vector<std::vector<uint8_t>> &image_samples,
52 const std::vector<uint32_t> &audio_chunk_sizes,
53 const std::vector<std::vector<uint32_t>> &text_chunk_sizes,
54 const std::vector<uint32_t> &image_chunk_sizes);
Definition mp4_atoms.hpp:24
void promote_stco_to_co64(Atom *root)
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< uint64_t > image_offsets
Definition mdat_writer.hpp:20
std::vector< std::vector< uint64_t > > text_offsets
Definition mdat_writer.hpp:19
uint64_t media_payload_size(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)
std::vector< uint64_t > audio_offsets
Definition mdat_writer.hpp:18
uint64_t mdat_header_size(uint64_t payload_size)
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)
void patch_all_stco(Atom *moov, const MdatOffsets &offs, bool patch_audio=true)
Definition mdat_writer.hpp:17