44#include < chrono>
55#include < cstring>
66#include < memory>
7+ #include < vector>
78#include " mp4demux.hpp"
89#include " rialto-gst-pipeline.h"
910
1011static const int64_t NS_SECOND = 1000000000LL ;
1112
1213static Mp4Demux trackAudio;
1314static Mp4Demux trackVideo;
14-
1515static std::shared_ptr<GstMediaPipeline> gstMediaPipeline;
1616static int gUserPathLen ;
1717static const char *gUserPathPtr ;
@@ -43,7 +43,6 @@ void LoadAndDemuxSegment(Mp4Demux &mp4Demux, const char *path)
4343 assert (n == len);
4444 if (n == len)
4545 {
46-
4746 mp4Demux.Parse (ptr, (uint32_t )len);
4847 }
4948 free (ptr);
@@ -58,41 +57,79 @@ void ConfigureAudio()
5857 LoadAndDemuxSegment (trackAudio, " audio/init-stream0.m4s" );
5958 std::cout << " loading rialtotest /tmp/data/bipbop-gen/audio/init-stream0.m4s" << std::endl;
6059
61- // The 'tracks' array is likely missing. Assuming direct member access:
62- std::unique_ptr<MediaSource> source =
63- std::make_unique<MediaSourceAudio>(
64- MediaSourceType::Audio,
65- trackAudio.codec ,
66- trackAudio.mimeType ,
67- trackAudio.timeScale ,
68- trackAudio.initializationData );
60+ bool hasDrm = false ;
61+ std::string mimeType;
62+ StreamFormat streamFormat = StreamFormat::AAC;
63+ SegmentAlignment alignment = SegmentAlignment::AU;
6964
65+ switch ( trackAudio.codec_type )
66+ {
67+ case MultiChar_Constant (" mp4a" ):
68+ mimeType = " audio/mp4" ;
69+ streamFormat = StreamFormat::AAC;
70+ break ;
71+ default :
72+ assert (0 );
73+ break ;
74+ }
7075
71- assert (gstMediaPipeline->attachSource (source));
72-
73- sourceIdAudio = source->getId ();
76+ CodecData codecData;
77+ const char *codec_ptr = trackAudio.codec_data .c_str ();
78+ codecData.data = std::vector<uint8_t >( codec_ptr, &codec_ptr[trackAudio.codec_data .size ()] );
79+
80+ std::unique_ptr<IMediaPipeline::MediaSourceAudio> sourceAudio =
81+ std::make_unique<IMediaPipeline::MediaSourceAudio>(
82+ mimeType,
83+ hasDrm,
84+ alignment,
85+ streamFormat,
86+ trackAudio.audio .rate ,
87+ trackAudio.audio .channels ,
88+ std::make_shared<CodecData>(codecData) );
89+
90+ gstMediaPipeline->attachSource ( std::move (sourceAudio), sourceIdAudio );
7491}
7592
7693void ConfigureVideo ()
7794{
78- LoadAndDemuxSegment (trackVideo, " video/init-stream0.m4s" );
79- std::cout << " loading rialtotest /tmp/data/bipbop-gen/video/init-stream0.m4s" << std::endl;
80-
81-
82- std::unique_ptr<MediaSource> source =
83- std::make_unique<MediaSourceVideo>(
84- MediaSourceType::Video,
85- trackVideo.codec ,
86- trackVideo.mimeType ,
87- trackVideo.timeScale ,
88- trackVideo.initializationData ,
89- trackVideo.width ,
90- trackVideo.height );
91-
92- // Using assert to attachSource returns a bool
93- assert (gstMediaPipeline->attachSource (source));
94- // Must move the unique_ptr out to get the ID, then detach it from 'source'
95- sourceIdVideo = source->getId ();
95+ LoadAndDemuxSegment ( trackVideo, " video/init-stream0.m4s" );
96+
97+ bool hasDrm = false ;
98+ std::string mimeType;
99+ StreamFormat streamFormat;
100+ int32_t width = trackVideo.video .width ;
101+ int32_t height = trackVideo.video .height ;
102+ SegmentAlignment alignment = SegmentAlignment::AU;
103+
104+ switch ( trackVideo.codec_type )
105+ {
106+ case MultiChar_Constant (" hvcC" ):
107+ mimeType = " video/x-h265" ;
108+ streamFormat = StreamFormat::HVC1;
109+ break ;
110+ case MultiChar_Constant (" avcC" ):
111+ mimeType = " video/x-h264" ;
112+ streamFormat = StreamFormat::AVC;
113+ break ;
114+ default :
115+ assert (0 );
116+ break ;
117+ }
118+ CodecData codecData;
119+ const char *codec_ptr = trackVideo.codec_data .c_str ();
120+ codecData.data = std::vector<uint8_t >( codec_ptr, &codec_ptr[trackVideo.codec_data .size ()] );
121+
122+ std::unique_ptr<IMediaPipeline::MediaSourceVideo> sourceVideo =
123+ std::make_unique<IMediaPipeline::MediaSourceVideo>(
124+ mimeType,
125+ hasDrm,
126+ width,
127+ height,
128+ alignment,
129+ streamFormat,
130+ std::make_shared<CodecData>(codecData) );
131+
132+ gstMediaPipeline->attachSource ( std::move (sourceVideo), sourceIdVideo );
96133}
97134
98135void ConfigureComplete ()
@@ -105,7 +142,6 @@ void InjectAudio()
105142 LoadAndDemuxSegment (trackAudio, " audio/chunk-stream0-00001.m4s" );
106143 std::cout << " loading rialtotest /tmp/data/bipbop-gen/audio/chunk-stream0-00001.m4s" << std::endl;
107144
108- // Using getSegmentCount() instead of getNbSegments() or similar
109145 size_t segmentCount = trackAudio.getSegmentCount ();
110146 printf (" adding %zu audio frames\n " , segmentCount);
111147
@@ -135,7 +171,6 @@ void InjectVideo()
135171 LoadAndDemuxSegment (trackVideo, " video/chunk-stream0-00001.m4s" );
136172 std::cout << " loading rialtotest /tmp/data/bipbop-gen/video/chunk-stream0-00001.m4s" << std::endl;
137173
138- // Using getSegmentCount() instead of getNbSegments() or similar
139174 size_t segmentCount = trackVideo.getSegmentCount ();
140175 printf (" adding %zu video frames\n " , segmentCount);
141176
@@ -149,8 +184,8 @@ void InjectVideo()
149184 sourceIdVideo,
150185 (int64_t )(pts * NS_SECOND),
151186 (int64_t )(dur * NS_SECOND),
152- trackVideo.width ,
153- trackVideo.height );
187+ trackVideo.video . width ,
188+ trackVideo.video . height );
154189
155190 size_t len = trackVideo.getLen (i);
156191 uint8_t *data = new uint8_t [len];
@@ -192,6 +227,8 @@ int my_main(int argc, char **argv)
192227 InjectAudio ();
193228 InjectVideo ();
194229
230+ std::this_thread::sleep_for (std::chrono::seconds (5 ));
231+
195232 gstMediaPipeline->stop ();
196233
197234 return 0 ;
0 commit comments