Fixed Ogg output Opus support

This commit is contained in:
Thulinma 2017-05-13 23:04:42 +02:00
parent 41842227fa
commit b072ffb139
2 changed files with 13 additions and 6 deletions

View file

@ -492,6 +492,8 @@ namespace OGG {
tempGranule = (currentSegment.lastKeyFrameSeen << split) | currentSegment.framesSinceKeyFrame; tempGranule = (currentSegment.lastKeyFrameSeen << split) | currentSegment.framesSinceKeyFrame;
} else if (codec == OGG::VORBIS){ } else if (codec == OGG::VORBIS){
tempGranule = currentSegment.lastKeyFrameSeen; tempGranule = currentSegment.lastKeyFrameSeen;
} else if (codec == OGG::OPUS){
tempGranule = currentSegment.timeStamp*48;
} }
return tempGranule; return tempGranule;
} }

View file

@ -133,8 +133,8 @@ namespace Mist {
OGG::oggSegment newSegment; OGG::oggSegment newSegment;
for (std::set<long unsigned int>::iterator it = selectedTracks.begin(); it != selectedTracks.end(); it++){ for (std::set<long unsigned int>::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. 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].codec = OGG::THEORA;
pageBuffer[*it].totalFrames = 1; //starts at frame number 1, according to weird offDetectMeta function. pageBuffer[*it].totalFrames = 1; //starts at frame number 1, according to weird offDetectMeta function.
std::string tempStr = initData[*it][0]; std::string tempStr = initData[*it][0];
@ -142,6 +142,7 @@ namespace Mist {
pageBuffer[*it].split = tempHead.getKFGShift(); pageBuffer[*it].split = tempHead.getKFGShift();
INFO_MSG("got theora KFG shift: %d", pageBuffer[*it].split); //looks OK. INFO_MSG("got theora KFG shift: %d", pageBuffer[*it].split); //looks OK.
} else if (myMeta.tracks[*it].codec == "vorbis"){ } else if (myMeta.tracks[*it].codec == "vorbis"){
parseInit(myMeta.tracks[*it].init, initData[*it]);
pageBuffer[*it].codec = OGG::VORBIS; pageBuffer[*it].codec = OGG::VORBIS;
pageBuffer[*it].totalFrames = 0; pageBuffer[*it].totalFrames = 0;
pageBuffer[*it].sampleRate = myMeta.tracks[*it].rate; pageBuffer[*it].sampleRate = myMeta.tracks[*it].rate;
@ -155,17 +156,21 @@ namespace Mist {
} else if (myMeta.tracks[*it].codec == "opus"){ } else if (myMeta.tracks[*it].codec == "opus"){
pageBuffer[*it].totalFrames = 0; //? pageBuffer[*it].totalFrames = 0; //?
pageBuffer[*it].codec = OGG::OPUS; 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 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].oggSegments.push_back(newSegment);
pageBuffer[*it].sendTo(myConn, 0); //granule position of 0 pageBuffer[*it].sendTo(myConn, 0); //granule position of 0
} }
for (std::set<long unsigned int>::iterator it = selectedTracks.begin(); it != selectedTracks.end(); it++){ for (std::set<long unsigned int>::iterator it = selectedTracks.begin(); it != selectedTracks.end(); it++){
newSegment.dataString = initData[*it][1]; while (initData[*it].size()){
pageBuffer[*it].oggSegments.push_back(newSegment); newSegment.dataString = initData[*it].front();
newSegment.dataString = initData[*it][2]; initData[*it].pop_front();
pageBuffer[*it].oggSegments.push_back(newSegment); pageBuffer[*it].oggSegments.push_back(newSegment);
}
while (pageBuffer[*it].oggSegments.size()){ while (pageBuffer[*it].oggSegments.size()){
pageBuffer[*it].sendTo(myConn, 0); //granule position of 0 pageBuffer[*it].sendTo(myConn, 0); //granule position of 0
} }