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;
} else if (codec == OGG::VORBIS){
tempGranule = currentSegment.lastKeyFrameSeen;
} else if (codec == OGG::OPUS){
tempGranule = currentSegment.timeStamp*48;
}
return tempGranule;
}

View file

@ -133,8 +133,8 @@ namespace Mist {
OGG::oggSegment newSegment;
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.
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<long unsigned int>::iterator it = selectedTracks.begin(); it != selectedTracks.end(); it++){
newSegment.dataString = initData[*it][1];
pageBuffer[*it].oggSegments.push_back(newSegment);
newSegment.dataString = initData[*it][2];
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
}