44#include < chrono>
55#include < cstring>
66#include < memory>
7- #include " mp4demux.hpp"
7+ #include " mp4demux.hpp" // Assuming this is your demuxer
88#include " rialto-gst-pipeline.h"
99
1010// Nanosecond conversion for timestamps
1111static const int64_t NS_SECOND = 1000000000LL ;
1212
1313static Mp4Demux trackAudio;
1414static Mp4Demux trackVideo;
15- static GstMediaPipeline *gstMediaPipeline;
15+ // *** CRITICAL CHANGE: Now uses shared_ptr ***
16+ static std::shared_ptr<GstMediaPipeline> gstMediaPipeline;
1617static int gUserPathLen ;
1718static const char *gUserPathPtr ;
1819static int32_t sourceIdAudio;
1920static int32_t sourceIdVideo;
2021
22+ using namespace firebolt ::rialto;
23+
2124void LoadAndDemuxSegment (Mp4Demux &mp4Demux, const char *path)
2225{
2326 char fullpath[512 ];
@@ -41,7 +44,7 @@ void LoadAndDemuxSegment(Mp4Demux &mp4Demux, const char *path)
4144 assert (n == len);
4245 if (n == len)
4346 {
44- mp4Demux.Parse (ptr, len);
47+ mp4Demux.load (ptr, ( uint32_t ) len);
4548 }
4649 free (ptr);
4750 }
@@ -53,75 +56,43 @@ void LoadAndDemuxSegment(Mp4Demux &mp4Demux, const char *path)
5356void ConfigureAudio ()
5457{
5558 LoadAndDemuxSegment (trackAudio, " audio/init-stream0.m4s" );
59+ std::cout << " loading rialtotest /tmp/data/bipbop-gen/audio/init-stream0.m4s" << std::endl;
5660
57- bool hasDrm = false ;
58- std::string mimeType;
59- StreamFormat streamFormat;
60- AudioConfig audioConfig;
61- audioConfig.numberOfChannels = trackAudio.audio .channel_count ;
62- audioConfig.sampleRate = trackAudio.audio .samplerate ;
63-
64- switch (trackAudio.codec_type )
65- {
66- case MultiChar_Constant (" esds" ):
67- mimeType = " audio/mpeg" ;
68- streamFormat = StreamFormat::RAW;
69- break ;
70- case MultiChar_Constant (" dec3" ):
71- mimeType = " audio/x-eac3" ;
72- streamFormat = StreamFormat::UNDEFINED;
73- break ;
74- default :
75- assert (0 );
76- }
77-
78- std::unique_ptr<IMediaPipeline::MediaSource> sourceAudio =
79- std::make_unique<IMediaPipeline::MediaSourceAudio>(
80- mimeType, hasDrm, audioConfig, SegmentAlignment::UNDEFINED, streamFormat, nullptr );
61+ assert (trackAudio.tracks .size () == 1 );
62+ assert (trackAudio.tracks [0 ].type == MediaSourceType::Audio);
8163
82- bool okA = gstMediaPipeline->attachSource (sourceAudio);
83- // assert(okA);
64+ std::unique_ptr<MediaSource> source =
65+ std::make_unique<MediaSourceAudio>(
66+ trackAudio.tracks [0 ].type ,
67+ trackAudio.tracks [0 ].codec ,
68+ trackAudio.tracks [0 ].mimeType ,
69+ trackAudio.tracks [0 ].timeScale ,
70+ trackAudio.tracks [0 ].initializationData );
8471
85- sourceIdAudio = sourceAudio->getId ();
72+ assert (gstMediaPipeline->attachSource (source));
73+ sourceIdAudio = source->getId ();
8674}
8775
8876void ConfigureVideo ()
8977{
9078 LoadAndDemuxSegment (trackVideo, " video/init-stream0.m4s" );
91-
92- bool hasDrm = false ;
93- std::string mimeType;
94- StreamFormat streamFormat;
95- int32_t width = trackVideo.video .width ;
96- int32_t height = trackVideo.video .height ;
97- SegmentAlignment alignment = SegmentAlignment::AU;
98-
99- switch (trackVideo.codec_type )
100- {
101- case MultiChar_Constant (" hvcC" ):
102- mimeType = " video/x-h265" ;
103- streamFormat = StreamFormat::HVC1;
104- break ;
105- case MultiChar_Constant (" avcC" ):
106- mimeType = " video/x-h264" ;
107- streamFormat = StreamFormat::AVC;
108- break ;
109- default :
110- assert (0 );
111- }
112-
113- CodecData codecData;
114- const char *codec_ptr = trackVideo.codec_data .c_str ();
115- codecData.data = std::vector<uint8_t >(codec_ptr, &codec_ptr[trackVideo.codec_data .size ()]);
116-
117- std::unique_ptr<IMediaPipeline::MediaSource> sourceVideo =
118- std::make_unique<IMediaPipeline::MediaSourceVideo>(
119- mimeType, hasDrm, width, height, alignment, streamFormat, std::make_shared<CodecData>(codecData));
120-
121- bool okV = gstMediaPipeline->attachSource (sourceVideo);
122- // assert(okV);
123-
124- sourceIdVideo = sourceVideo->getId ();
79+ std::cout << " loading rialtotest /tmp/data/bipbop-gen/video/init-stream0.m4s" << std::endl;
80+
81+ assert (trackVideo.tracks .size () == 1 );
82+ assert (trackVideo.tracks [0 ].type == MediaSourceType::Video);
83+
84+ std::unique_ptr<MediaSource> source =
85+ std::make_unique<MediaSourceVideo>(
86+ trackVideo.tracks [0 ].type ,
87+ trackVideo.tracks [0 ].codec ,
88+ trackVideo.tracks [0 ].mimeType ,
89+ trackVideo.tracks [0 ].timeScale ,
90+ trackVideo.tracks [0 ].initializationData ,
91+ trackVideo.tracks [0 ].video .width ,
92+ trackVideo.tracks [0 ].video .height );
93+
94+ assert (gstMediaPipeline->attachSource (source));
95+ sourceIdVideo = source->getId ();
12596}
12697
12798void ConfigureComplete ()
@@ -132,10 +103,10 @@ void ConfigureComplete()
132103void InjectAudio ()
133104{
134105 LoadAndDemuxSegment (trackAudio, " audio/chunk-stream0-00001.m4s" );
135- int count = trackAudio. count () ;
136- printf (" adding %d audio frames\n " , count );
106+ std::cout << " loading rialtotest /tmp/data/bipbop-gen/audio/chunk-stream0-00001.m4s " << std::endl ;
107+ printf (" adding %zu audio frames\n " , trackAudio. getNbSegments () );
137108
138- for (int i = 0 ; i < count; i++ )
109+ for (size_t i = 0 ; i < trackAudio. getNbSegments (); ++i )
139110 {
140111 double pts = trackAudio.getPts (i);
141112 double dur = trackAudio.getDuration (i);
@@ -144,9 +115,7 @@ void InjectAudio()
144115 std::make_unique<IMediaPipeline::MediaSegmentAudio>(
145116 sourceIdAudio,
146117 (int64_t )(pts * NS_SECOND),
147- (int64_t )(dur * NS_SECOND),
148- trackAudio.audio .samplerate ,
149- trackAudio.audio .channel_count );
118+ (int64_t )(dur * NS_SECOND));
150119
151120 size_t len = trackAudio.getLen (i);
152121 uint8_t *data = new uint8_t [len];
@@ -161,10 +130,10 @@ void InjectAudio()
161130void InjectVideo ()
162131{
163132 LoadAndDemuxSegment (trackVideo, " video/chunk-stream0-00001.m4s" );
164- int count = trackVideo. count () ;
165- printf (" adding %d video frames\n " , count );
133+ std::cout << " loading rialtotest /tmp/data/bipbop-gen/video/chunk-stream0-00001.m4s " << std::endl ;
134+ printf (" adding %zu video frames\n " , trackVideo. getNbSegments () );
166135
167- for (int i = 0 ; i < count; i++ )
136+ for (size_t i = 0 ; i < trackVideo. getNbSegments (); ++i )
168137 {
169138 double pts = trackVideo.getPts (i);
170139 double dur = trackVideo.getDuration (i);
@@ -174,8 +143,8 @@ void InjectVideo()
174143 sourceIdVideo,
175144 (int64_t )(pts * NS_SECOND),
176145 (int64_t )(dur * NS_SECOND),
177- trackVideo.video .width ,
178- trackVideo.video .height );
146+ trackVideo.tracks [ 0 ]. video .width ,
147+ trackVideo.tracks [ 0 ]. video .height );
179148
180149 size_t len = trackVideo.getLen (i);
181150 uint8_t *data = new uint8_t [len];
@@ -196,7 +165,18 @@ int my_main(int argc, char **argv)
196165 const char *delim = strchr (&gUserPathPtr [prefixLen], ' /' );
197166 gUserPathLen = (int )(delim - gUserPathPtr );
198167
199- gstMediaPipeline = new GstMediaPipeline ();
168+ gstMediaPipeline = std::make_shared<GstMediaPipeline>();
169+ if (!gstMediaPipeline->init ())
170+ {
171+ fprintf (stderr, " FATAL: Failed to initialize Rialto pipeline. Check logs/server status.\n " );
172+ return -1 ;
173+ }
174+
175+ if (!gstMediaPipeline->setVideoWindow (0 , 0 , 1920 , 1080 ))
176+ {
177+ fprintf (stderr, " Warning: Failed to set video window. Video may not appear.\n " );
178+ }
179+
200180 gstMediaPipeline->play ();
201181
202182 ConfigureAudio ();
@@ -205,16 +185,18 @@ int my_main(int argc, char **argv)
205185
206186 InjectAudio ();
207187 InjectVideo ();
188+
189+ gstMediaPipeline->stop ();
208190
209- std::this_thread::sleep_for (std::chrono::seconds (2 ));
210191 return 0 ;
211192}
212193
213194int main (int argc, char **argv)
214195{
196+
215197#if defined(__APPLE__) && defined(__GST_MACOS_H__)
216198 return gst_macos_main ((GstMainFunc)my_main, argc, argv, nullptr );
217199#else
218200 return my_main (argc, argv);
219201#endif
220- }
202+ }
0 commit comments