1616#include " moxygen/dejitter/DeJitter.h"
1717#include " moxygen/flv_parser/FlvWriter.h"
1818#include " moxygen/moq_mi/MoQMi.h"
19+ #include " moxygen/moq_mi_to_flv/MoQMiToFlv.h"
1920
2021DEFINE_string (
2122 connect_url,
@@ -73,101 +74,21 @@ class TrackType {
7374 TrackType::MediaType mediaType_;
7475};
7576
76- class FlvWriterShared : flv::FlvWriter {
77+ class FlvWriterShared : public flv ::FlvWriter, public MoQMiToFlv {
7778 public:
7879 explicit FlvWriterShared (const std::string& flvOutPath)
7980 : flv::FlvWriter(flvOutPath) {}
8081
8182 bool writeMoqMiPayload (MoQMi::MoqMiItem moqMiItem) {
82- bool ret = false ;
83- if (moqMiItem.index () ==
84- MoQMi::MoqMIItemTypeIndex::MOQMI_ITEM_INDEX_READCMD ) {
85- return ret;
86- }
87-
88- if (moqMiItem.index () ==
89- MoQMi::MoqMIItemTypeIndex::MOQMI_ITEM_INDEX_VIDEO_H264_AVC ) {
90- auto moqv = std::move (
91- std::get<MoQMi::MoqMIItemTypeIndex::MOQMI_ITEM_INDEX_VIDEO_H264_AVC >(
92- moqMiItem));
93-
94- // Since PTS >= DTS lets check 1st PTS for rollover
95- uint32_t pts =
96- static_cast <int32_t >(moqv->pts & 0x7FFFFFFF ); // 31 lower bits
97- uint32_t dts =
98- static_cast <int32_t >(moqv->dts & 0x7FFFFFFF ); // 31 lower bits
99- // This already handles the case where PTS rolled over and DTS NOT yet
100- int32_t compositionTime = pts - dts;
101- if (moqv->pts > std::numeric_limits<int32_t >::max ()) {
102- XLOG_EVERY_N (WARNING , 1000 )
103- << " PTS video truncated! Rolling over. From " << moqv->pts
104- << " , to: " << pts << " , compositionTime: " << compositionTime;
105- }
106- CHECK_GE (compositionTime, 0 );
107-
108- if (moqv->metadata != nullptr && !videoHeaderWritten_) {
109- XLOG (INFO ) << " Writing video header" ;
110- auto vhtag = flv::createVideoTag (
111- pts, 1 , 7 , 0 , compositionTime, std::move (moqv->metadata ));
112- ret = writeTag (std::move (vhtag));
113- if (!ret) {
114- return ret;
115- }
116- videoHeaderWritten_ = true ;
117- }
118- bool isIdr = moqv->isIdr ();
119- if (videoHeaderWritten_ && moqv->data != nullptr &&
120- moqv->data ->computeChainDataLength () > 0 ) {
121- if ((!firstIDRWritten_ && isIdr) || firstIDRWritten_) {
122- // Write frame
123- uint8_t frameType = isIdr ? 1 : 0 ;
124- XLOG (DBG1 ) << " Writing video frame, type: " << frameType;
125- auto vtag = flv::createVideoTag (
126- moqv->pts ,
127- frameType,
128- 7 ,
129- 1 ,
130- compositionTime,
131- std::move (moqv->data ));
132- ret = writeTag (std::move (vtag));
133- if (isIdr && !firstIDRWritten_) {
134- firstIDRWritten_ = true ;
135- XLOG (INFO ) << " Wrote first IDR frame" ;
136- }
137- }
138- }
139- } else if (
140- moqMiItem.index () ==
141- MoQMi::MoqMIItemTypeIndex::MOQMI_ITEM_INDEX_AUDIO_AAC_LC ) {
142- auto moqa = std::move (
143- std::get<MoQMi::MoqMIItemTypeIndex::MOQMI_ITEM_INDEX_AUDIO_AAC_LC >(
144- moqMiItem));
145- if (!audioHeaderWritten_) {
146- XLOG (INFO ) << " Writing audio header" ;
147- auto ascHeader = moqa->getAscHeader ();
148- uint32_t pts =
149- static_cast <int32_t >(moqa->pts & 0x7FFFFFFF ); // 31 lower bits
150- if (moqa->pts > std::numeric_limits<int32_t >::max ()) {
151- XLOG_EVERY_N (WARNING , 1000 )
152- << " PTS audio truncated! Rolling over. From " << moqa->pts
153- << " , to: " << pts;
154- }
155- auto ahtag =
156- flv::createAudioTag (pts, 10 , 3 , 1 , 1 , 0 , std::move (ascHeader));
157- ret = writeTag (std::move (ahtag));
158- if (!ret) {
159- return ret;
160- }
161- audioHeaderWritten_ = true ;
162- }
163- if (audioHeaderWritten_) {
164- XLOG (DBG1 ) << " Writing audio frame" ;
165- auto atag = flv::createAudioTag (
166- moqa->pts , 10 , 3 , 1 , 1 , 1 , std::move (moqa->data ));
167- ret = writeTag (std::move (atag));
83+ auto tags = MoQMiToFlv::MoQMiToFlvPayload (std::move (moqMiItem));
84+ while (!tags.empty ()) {
85+ flv::FlvTag tag = std::move (tags.front ());
86+ tags.pop_front (); // Remove the now-empty unique_ptr from the list
87+ if (!writeTag (std::move (tag))) {
88+ return false ;
16889 }
16990 }
170- return ret ;
91+ return true ;
17192 }
17293
17394 private:
@@ -177,9 +98,6 @@ class FlvWriterShared : flv::FlvWriter {
17798 }
17899
179100 std::mutex mutex_;
180- bool videoHeaderWritten_{false };
181- bool audioHeaderWritten_{false };
182- bool firstIDRWritten_{false };
183101};
184102
185103class TrackReceiverHandler : public ObjectReceiverCallback {
0 commit comments