Skip to content

Commit 0eb95e7

Browse files
authored
Factor out common code between T35 Strategy files (#72)
Remove unused stringToHandle().
1 parent 768a712 commit 0eb95e7

6 files changed

Lines changed: 200 additions & 335 deletions

File tree

IsoLib/t35_tool/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ add_executable(
7070
sources/GenericJsonSource.cpp
7171
sources/SMPTEFolderSource.cpp
7272
injection/InjectionStrategy.cpp
73+
injection/StrategyHelpers.cpp
7374
injection/MebxMe4cStrategy.cpp
7475
injection/DedicatedIt35Strategy.cpp
7576
injection/SampleGroupStrategy.cpp

IsoLib/t35_tool/injection/DedicatedIt35Strategy.cpp

Lines changed: 1 addition & 142 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#include "DedicatedIt35Strategy.hpp"
22
#include "../common/Logger.hpp"
3+
#include "StrategyHelpers.hpp"
34

45
extern "C"
56
{
@@ -14,148 +15,6 @@ extern "C"
1415
namespace t35
1516
{
1617

17-
// Helper: Find first video track
18-
static MP4Err findFirstVideoTrack(MP4Movie moov, MP4Track *outTrack)
19-
{
20-
MP4Err err = MP4NoErr;
21-
u32 trackCount = 0;
22-
*outTrack = nullptr;
23-
24-
err = MP4GetMovieTrackCount(moov, &trackCount);
25-
if(err) return err;
26-
27-
MP4Track firstVideo = nullptr;
28-
u32 videoCount = 0;
29-
30-
for(u32 i = 1; i <= trackCount; ++i)
31-
{
32-
MP4Track trak = nullptr;
33-
MP4Media media = nullptr;
34-
u32 handlerType = 0;
35-
36-
err = MP4GetMovieIndTrack(moov, i, &trak);
37-
if(err) continue;
38-
39-
err = MP4GetTrackMedia(trak, &media);
40-
if(err) continue;
41-
42-
err = MP4GetMediaHandlerDescription(media, &handlerType, nullptr);
43-
if(err) continue;
44-
45-
if(handlerType == MP4VisualHandlerType)
46-
{
47-
if(!firstVideo)
48-
{
49-
firstVideo = trak;
50-
}
51-
++videoCount;
52-
}
53-
}
54-
55-
if(!firstVideo)
56-
{
57-
LOG_ERROR("No video track found in movie");
58-
return MP4NotFoundErr;
59-
}
60-
61-
if(videoCount > 1)
62-
{
63-
LOG_WARN("Found {} video tracks, using the first one", videoCount);
64-
}
65-
66-
*outTrack = firstVideo;
67-
return MP4NoErr;
68-
}
69-
70-
// Helper: Get video sample durations
71-
static MP4Err getVideoSampleDurations(MP4Media mediaV, std::vector<u32> &durations)
72-
{
73-
MP4Err err = MP4NoErr;
74-
u32 sampleCount = 0;
75-
76-
durations.clear();
77-
78-
err = MP4GetMediaSampleCount(mediaV, &sampleCount);
79-
if(err) return err;
80-
81-
durations.reserve(sampleCount);
82-
83-
for(u32 i = 1; i <= sampleCount; ++i)
84-
{
85-
MP4Handle sampleH = nullptr;
86-
u32 outSize, outSampleFlags, outSampleDescIndex;
87-
u64 outDTS, outDuration;
88-
s32 outCTSOffset;
89-
90-
MP4NewHandle(0, &sampleH);
91-
err = MP4GetIndMediaSample(mediaV, i, sampleH, &outSize, &outDTS, &outCTSOffset, &outDuration,
92-
&outSampleFlags, &outSampleDescIndex);
93-
if(err)
94-
{
95-
if(sampleH) MP4DisposeHandle(sampleH);
96-
return err;
97-
}
98-
99-
durations.push_back(static_cast<u32>(outDuration));
100-
101-
if(sampleH) MP4DisposeHandle(sampleH);
102-
}
103-
104-
LOG_DEBUG("Collected {} video sample durations", durations.size());
105-
return MP4NoErr;
106-
}
107-
108-
// Helper: Build metadata durations and sizes
109-
static MP4Err buildMetadataDurationsAndSizes(const MetadataMap &items,
110-
const std::vector<u32> &videoDurations,
111-
std::vector<u32> &metadataDurations,
112-
std::vector<u32> &metadataSizes,
113-
std::vector<MetadataItem> &sortedItems)
114-
{
115-
metadataDurations.clear();
116-
metadataSizes.clear();
117-
sortedItems.clear();
118-
119-
if(items.empty())
120-
{
121-
LOG_ERROR("No metadata items provided");
122-
return MP4BadParamErr;
123-
}
124-
125-
// Sort items by frame_start (already sorted in map, but make vector)
126-
for(const auto &[start, item] : items)
127-
{
128-
sortedItems.push_back(item);
129-
}
130-
131-
// Validate coverage
132-
const auto &last = sortedItems.back();
133-
u32 maxFrame = last.frame_start + last.frame_duration;
134-
if(maxFrame > videoDurations.size())
135-
{
136-
LOG_ERROR("Metadata covers up to frame {} but video only has {} samples", maxFrame,
137-
videoDurations.size());
138-
return MP4BadParamErr;
139-
}
140-
141-
// Compute metadata sample durations and sizes
142-
for(const auto &item : sortedItems)
143-
{
144-
u32 startFrame = item.frame_start;
145-
u32 endFrame = startFrame + item.frame_duration;
146-
u32 totalDur =
147-
std::accumulate(videoDurations.begin() + startFrame, videoDurations.begin() + endFrame, 0u);
148-
149-
metadataDurations.push_back(totalDur);
150-
metadataSizes.push_back(static_cast<u32>(item.payload.size()));
151-
152-
LOG_DEBUG("Metadata item covers frames [{}-{}] totalDur={} size={} bytes", startFrame,
153-
endFrame - 1, totalDur, item.payload.size());
154-
}
155-
156-
return MP4NoErr;
157-
}
158-
15918
// Helper: Build sample data (just payloads, no box wrapper)
16019
static MP4Err buildSampleData(const std::vector<MetadataItem> &sortedItems,
16120
const std::vector<u32> &metadataSizes, MP4Handle *outSampleDataH)

IsoLib/t35_tool/injection/MebxMe4cStrategy.cpp

Lines changed: 1 addition & 158 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#include "MebxMe4cStrategy.hpp"
2+
#include "StrategyHelpers.hpp"
23
#include "../common/Logger.hpp"
34

45
extern "C"
@@ -15,148 +16,6 @@ extern "C"
1516
namespace 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
16120
static 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-
310153
bool MebxMe4cStrategy::isApplicable(const MetadataMap &items, const InjectionConfig &config,
311154
std::string &reason) const
312155
{

IsoLib/t35_tool/injection/SampleGroupStrategy.cpp

Lines changed: 1 addition & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#include "SampleGroupStrategy.hpp"
2+
#include "StrategyHelpers.hpp"
23
#include "../common/Logger.hpp"
34
#include "../common/T35Prefix.hpp"
45
#include "../common/MetadataTypes.hpp"
@@ -15,41 +16,6 @@ extern "C"
1516
namespace 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-
for(u32 i = 1; i <= trackCount; ++i)
29-
{
30-
MP4Track trak = nullptr;
31-
MP4Media media = nullptr;
32-
u32 handlerType = 0;
33-
34-
err = MP4GetMovieIndTrack(moov, i, &trak);
35-
if(err) continue;
36-
37-
err = MP4GetTrackMedia(trak, &media);
38-
if(err) continue;
39-
40-
err = MP4GetMediaHandlerDescription(media, &handlerType, nullptr);
41-
if(err) continue;
42-
43-
if(handlerType == MP4VisualHandlerType)
44-
{
45-
*outTrack = trak;
46-
return MP4NoErr;
47-
}
48-
}
49-
50-
return MP4NotFoundErr;
51-
}
52-
5319
bool SampleGroupStrategy::isApplicable(const MetadataMap &items, const InjectionConfig &config,
5420
std::string &reason) const
5521
{

0 commit comments

Comments
 (0)