11#include " MebxMe4cStrategy.hpp"
2+ #include " StrategyHelpers.hpp"
23#include " ../common/Logger.hpp"
34
45extern " C"
@@ -15,148 +16,6 @@ extern "C"
1516namespace t35
1617{
1718
18- // Helper: Find first video track
19- static MP4Err findFirstVideoTrack (MP4Movie moov, MP4Track *outTrack)
20- {
21- MP4Err err = MP4NoErr;
22- u32 trackCount = 0 ;
23- *outTrack = nullptr ;
24-
25- err = MP4GetMovieTrackCount (moov, &trackCount);
26- if (err) return err;
27-
28- MP4Track firstVideo = nullptr ;
29- u32 videoCount = 0 ;
30-
31- for (u32 i = 1 ; i <= trackCount; ++i)
32- {
33- MP4Track trak = nullptr ;
34- MP4Media media = nullptr ;
35- u32 handlerType = 0 ;
36-
37- err = MP4GetMovieIndTrack (moov, i, &trak);
38- if (err) continue ;
39-
40- err = MP4GetTrackMedia (trak, &media);
41- if (err) continue ;
42-
43- err = MP4GetMediaHandlerDescription (media, &handlerType, nullptr );
44- if (err) continue ;
45-
46- if (handlerType == MP4VisualHandlerType)
47- {
48- if (!firstVideo)
49- {
50- firstVideo = trak;
51- }
52- ++videoCount;
53- }
54- }
55-
56- if (!firstVideo)
57- {
58- LOG_ERROR (" No video track found in movie" );
59- return MP4NotFoundErr;
60- }
61-
62- if (videoCount > 1 )
63- {
64- LOG_WARN (" Found {} video tracks, using the first one" , videoCount);
65- }
66-
67- *outTrack = firstVideo;
68- return MP4NoErr;
69- }
70-
71- // Helper: Get video sample durations
72- static MP4Err getVideoSampleDurations (MP4Media mediaV, std::vector<u32 > &durations)
73- {
74- MP4Err err = MP4NoErr;
75- u32 sampleCount = 0 ;
76-
77- durations.clear ();
78-
79- err = MP4GetMediaSampleCount (mediaV, &sampleCount);
80- if (err) return err;
81-
82- durations.reserve (sampleCount);
83-
84- for (u32 i = 1 ; i <= sampleCount; ++i)
85- {
86- MP4Handle sampleH = nullptr ;
87- u32 outSize, outSampleFlags, outSampleDescIndex;
88- u64 outDTS, outDuration;
89- s32 outCTSOffset;
90-
91- MP4NewHandle (0 , &sampleH);
92- err = MP4GetIndMediaSample (mediaV, i, sampleH, &outSize, &outDTS, &outCTSOffset, &outDuration,
93- &outSampleFlags, &outSampleDescIndex);
94- if (err)
95- {
96- if (sampleH) MP4DisposeHandle (sampleH);
97- return err;
98- }
99-
100- durations.push_back (static_cast <u32 >(outDuration));
101-
102- if (sampleH) MP4DisposeHandle (sampleH);
103- }
104-
105- LOG_DEBUG (" Collected {} video sample durations" , durations.size ());
106- return MP4NoErr;
107- }
108-
109- // Helper: Build metadata durations and sizes
110- static MP4Err buildMetadataDurationsAndSizes (const MetadataMap &items,
111- const std::vector<u32 > &videoDurations,
112- std::vector<u32 > &metadataDurations,
113- std::vector<u32 > &metadataSizes,
114- std::vector<MetadataItem> &sortedItems)
115- {
116- metadataDurations.clear ();
117- metadataSizes.clear ();
118- sortedItems.clear ();
119-
120- if (items.empty ())
121- {
122- LOG_ERROR (" No metadata items provided" );
123- return MP4BadParamErr;
124- }
125-
126- // Sort items by frame_start (already sorted in map, but make vector)
127- for (const auto &[start, item] : items)
128- {
129- sortedItems.push_back (item);
130- }
131-
132- // Validate coverage
133- const auto &last = sortedItems.back ();
134- u32 maxFrame = last.frame_start + last.frame_duration ;
135- if (maxFrame > videoDurations.size ())
136- {
137- LOG_ERROR (" Metadata covers up to frame {} but video only has {} samples" , maxFrame,
138- videoDurations.size ());
139- return MP4BadParamErr;
140- }
141-
142- // Compute metadata sample durations and sizes
143- for (const auto &item : sortedItems)
144- {
145- u32 startFrame = item.frame_start ;
146- u32 endFrame = startFrame + item.frame_duration ;
147- u32 totalDur =
148- std::accumulate (videoDurations.begin () + startFrame, videoDurations.begin () + endFrame, 0u );
149-
150- metadataDurations.push_back (totalDur);
151- metadataSizes.push_back (static_cast <u32 >(item.payload .size ()));
152-
153- LOG_DEBUG (" Metadata item covers frames [{}-{}] totalDur={} size={} bytes" , startFrame,
154- endFrame - 1 , totalDur, item.payload .size ());
155- }
156-
157- return MP4NoErr;
158- }
159-
16019// Helper: Add all metadata samples
16120static MP4Err addAllMetadataSamples (MP4Media mediaM, const std::vector<MetadataItem> &sortedItems,
16221 const std::vector<u32 > &metadataDurations,
@@ -291,22 +150,6 @@ static MP4Err fourCCToHandle(u32 fourCC, MP4Handle *outHandle)
291150 return MP4NoErr;
292151}
293152
294- // Helper: Convert string to handle (as text, not hex)
295- static MP4Err stringToHandle (const std::string &input, MP4Handle *outHandle)
296- {
297- MP4Err err = MP4NoErr;
298- *outHandle = nullptr ;
299-
300- // Copy input string as text
301- u32 byteCount = static_cast <u32 >(input.size ());
302- err = MP4NewHandle (byteCount, outHandle);
303- if (err) return err;
304-
305- std::memcpy (**outHandle, input.data (), byteCount);
306-
307- return MP4NoErr;
308- }
309-
310153bool MebxMe4cStrategy::isApplicable (const MetadataMap &items, const InjectionConfig &config,
311154 std::string &reason) const
312155{
0 commit comments