From b072ffb1394d8cc9c79c299bcd591bbc21b65926 Mon Sep 17 00:00:00 2001 From: Thulinma Date: Sat, 13 May 2017 23:04:42 +0200 Subject: [PATCH] Fixed Ogg output Opus support --- lib/ogg.cpp | 2 ++ src/output/output_progressive_ogg.cpp | 17 +++++++++++------ 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/lib/ogg.cpp b/lib/ogg.cpp index 24bd4180..925e4a51 100644 --- a/lib/ogg.cpp +++ b/lib/ogg.cpp @@ -492,6 +492,8 @@ namespace OGG { tempGranule = (currentSegment.lastKeyFrameSeen << split) | currentSegment.framesSinceKeyFrame; } else if (codec == OGG::VORBIS){ tempGranule = currentSegment.lastKeyFrameSeen; + } else if (codec == OGG::OPUS){ + tempGranule = currentSegment.timeStamp*48; } return tempGranule; } diff --git a/src/output/output_progressive_ogg.cpp b/src/output/output_progressive_ogg.cpp index c081bd36..028875b1 100644 --- a/src/output/output_progressive_ogg.cpp +++ b/src/output/output_progressive_ogg.cpp @@ -133,8 +133,8 @@ namespace Mist { OGG::oggSegment newSegment; for (std::set::iterator it = selectedTracks.begin(); it != selectedTracks.end(); it++){ - parseInit(myMeta.tracks[*it].init, initData[*it]); if (myMeta.tracks[*it].codec == "theora"){ //get size and position of init data for this page. + parseInit(myMeta.tracks[*it].init, initData[*it]); pageBuffer[*it].codec = OGG::THEORA; pageBuffer[*it].totalFrames = 1; //starts at frame number 1, according to weird offDetectMeta function. std::string tempStr = initData[*it][0]; @@ -142,6 +142,7 @@ namespace Mist { pageBuffer[*it].split = tempHead.getKFGShift(); INFO_MSG("got theora KFG shift: %d", pageBuffer[*it].split); //looks OK. } else if (myMeta.tracks[*it].codec == "vorbis"){ + parseInit(myMeta.tracks[*it].init, initData[*it]); pageBuffer[*it].codec = OGG::VORBIS; pageBuffer[*it].totalFrames = 0; pageBuffer[*it].sampleRate = myMeta.tracks[*it].rate; @@ -155,17 +156,21 @@ namespace Mist { } else if (myMeta.tracks[*it].codec == "opus"){ pageBuffer[*it].totalFrames = 0; //? pageBuffer[*it].codec = OGG::OPUS; + initData[*it].push_back(myMeta.tracks[*it].init); + initData[*it].push_back(std::string("OpusTags\000\000\000\012MistServer\000\000\000\000", 26)); } pageBuffer[*it].clear(OGG::BeginOfStream, 0, *it, 0); //CREATES a (map)pageBuffer object, *it = id, pagetype=BOS - newSegment.dataString = initData[*it][0]; + newSegment.dataString = initData[*it].front(); + initData[*it].pop_front(); pageBuffer[*it].oggSegments.push_back(newSegment); pageBuffer[*it].sendTo(myConn, 0); //granule position of 0 } for (std::set::iterator it = selectedTracks.begin(); it != selectedTracks.end(); it++){ - newSegment.dataString = initData[*it][1]; - pageBuffer[*it].oggSegments.push_back(newSegment); - newSegment.dataString = initData[*it][2]; - pageBuffer[*it].oggSegments.push_back(newSegment); + while (initData[*it].size()){ + newSegment.dataString = initData[*it].front(); + initData[*it].pop_front(); + pageBuffer[*it].oggSegments.push_back(newSegment); + } while (pageBuffer[*it].oggSegments.size()){ pageBuffer[*it].sendTo(myConn, 0); //granule position of 0 }