Ogg2 dtsc start on DTSC packets
This commit is contained in:
		
							parent
							
								
									03d4d58cbe
								
							
						
					
					
						commit
						867bb45760
					
				
					 1 changed files with 90 additions and 28 deletions
				
			
		|  | @ -3,17 +3,22 @@ | ||||||
| #include <fstream> | #include <fstream> | ||||||
| #include <string> | #include <string> | ||||||
| #include <string.h> | #include <string.h> | ||||||
| #include <vector> | #include <map> | ||||||
| #include <mist/dtsc.h> | #include <mist/dtsc.h> | ||||||
| #include <mist/ogg.h> | #include <mist/ogg.h> | ||||||
|  | #include <mist/theora.h> | ||||||
| #include <mist/config.h> | #include <mist/config.h> | ||||||
| #include <mist/json.h> | #include <mist/json.h> | ||||||
| 
 | 
 | ||||||
| namespace Converters{ | namespace Converters{ | ||||||
|  |   enum codecType {THEORA, VORBIS}; | ||||||
|  | 
 | ||||||
|   struct oggTrack{ |   struct oggTrack{ | ||||||
|     long unsigned int serialNumber; //serial number in read OGG file
 |     //long unsigned int serialNumber; //serial number in read OGG file
 | ||||||
|     long unsigned int lastSequenceNumber;//error checking for lost pages in OGG
 |     long unsigned int lastSequenceNumber;//error checking for lost pages in OGG
 | ||||||
|     long long int dtscID; //track ID for in the written DTSC file
 |     codecType codec; | ||||||
|  |     long long unsigned int dtscID; | ||||||
|  |     long long signed int fpks; //frames per kilo second
 | ||||||
|     DTSC::datatype type; //type of stream in DTSC
 |     DTSC::datatype type; //type of stream in DTSC
 | ||||||
|   }; |   }; | ||||||
| 
 | 
 | ||||||
|  | @ -25,59 +30,116 @@ namespace Converters{ | ||||||
|      |      | ||||||
|     //while stream busy
 |     //while stream busy
 | ||||||
|     JSON::Value DTSCOut; |     JSON::Value DTSCOut; | ||||||
|     std::vector<oggTrack> trackData; |     std::map<long unsigned int, oggTrack> trackData; | ||||||
|     long long int lastTrackID = 1; |     long long int lastTrackID = 1; | ||||||
|     while (std::cin.good()){ |     while (std::cin.good()){ | ||||||
|       for (unsigned int i = 0; (i < 1024) && (std::cin.good()); i++){ |       for (unsigned int i = 0; (i < 1024) && (std::cin.good()); i++){//buffering
 | ||||||
|         oggBuffer += std::cin.get(); |         oggBuffer += std::cin.get(); | ||||||
|       } |       } | ||||||
|       //while OGG::page check functie{ read
 |       //while OGG::page check functie{ read
 | ||||||
|       while (oggPage.read(oggBuffer)){//reading ogg to ogg::page
 |       while (oggPage.read(oggBuffer)){//reading ogg to ogg::page
 | ||||||
|         //on succes, we handle one page
 |         //on succes, we handle one page
 | ||||||
|  |         long unsigned int sNum = oggPage.getBitstreamSerialNumber(); | ||||||
|         if (oggPage.typeBOS()){//defines a new track
 |         if (oggPage.typeBOS()){//defines a new track
 | ||||||
|           //std::cout << oggPage.getFullPayload() << std::endl;
 |           std::cerr << "Begin "<< sNum << std::endl; | ||||||
|           oggTrack temp; |           trackData[sNum].lastSequenceNumber = oggPage.getPageSequenceNumber(); | ||||||
|           temp.serialNumber = oggPage.getBitstreamSerialNumber(); |           trackData[sNum].dtscID = lastTrackID++; | ||||||
|           std::cerr << "Begin "<< temp.serialNumber << std::endl; |           if (memcmp(oggPage.getFullPayload()+1, "theora", 6) == 0){ | ||||||
|           temp.lastSequenceNumber = oggPage.getPageSequenceNumber(); |             trackData[sNum].type = DTSC::VIDEO;  | ||||||
|           temp.dtscID = lastTrackID; |             trackData[sNum].codec = THEORA; | ||||||
|           lastTrackID++; |             std::cerr << "Snr " << sNum << "=theora" << std::endl; | ||||||
|           if (memcmp(oggPage.getFullPayload()+1, "theora", 6)){ |           }else if(memcmp(oggPage.getFullPayload()+1, "vorbis", 6) == 0){ | ||||||
|             temp.type = DTSC::VIDEO;  |             std::cerr << "Snr " << sNum << "=vorbis" << std::endl; | ||||||
|             std::cerr << "Snr " << temp.serialNumber << "=theora" << std::endl; |             trackData[sNum].codec = VORBIS; | ||||||
|           }else if(memcmp(oggPage.getFullPayload()+2, "vorbis", 6)){ |             trackData[sNum].type = DTSC::AUDIO; | ||||||
|             std::cerr << "Snr " << temp.serialNumber << "=vorbis" << std::endl; |  | ||||||
|             temp.type = DTSC::AUDIO; |  | ||||||
|           }else{ |           }else{ | ||||||
|             std::cerr << "Unknown Codec!" << std::endl; |             std::cerr << "Unknown Codec!" << std::endl; | ||||||
|           } |           } | ||||||
|           trackData.insert(trackData.end(), temp); |         } | ||||||
|         }else if (oggPage.typeEOS()){//ending page
 |         //if Serial number is available in mapping
 | ||||||
|           std::cerr << std::hex << oggPage.getGranulePosition() <<std::dec << "ending" << std::endl; |         if(trackData.find(sNum)!=trackData.end()){ | ||||||
|         }else{//normal page
 |           //switch on codec
 | ||||||
|           std::cerr << std::hex << oggPage.getGranulePosition() <<std::dec<< std::endl; |           //oggTrack curTrack = trackData[oggPage.getBitstreamSerialNumber()];
 | ||||||
|  |           switch(trackData[sNum].codec){ | ||||||
|  |             case THEORA:{ | ||||||
|  |               //std::cerr << "Theora" << std::endl;
 | ||||||
|  |               char* curSeg;//current segment
 | ||||||
|  |               curSeg = oggPage.getFullPayload();//setting pointer to first segment
 | ||||||
|  |               std::deque<unsigned int> segTable;//
 | ||||||
|  |               //oggPage.getSegmentTableDeque().swap(segTable);
 | ||||||
|  |               segTable = oggPage.getSegmentTableDeque(); | ||||||
|  |               unsigned int curPlace = 0; | ||||||
|  |               unsigned int curLength; | ||||||
|  |               theora::header tHead; | ||||||
|  |               while (!segTable.empty()) { | ||||||
|  |                 curLength = segTable.front(); | ||||||
|  |                 segTable.pop_front(); | ||||||
|                  |                  | ||||||
|  |                 //std::cerr << curLength << ", " << std::hex << curSeg << std::dec;
 | ||||||
|  |                 if(tHead.read(curSeg+curPlace, curLength)){//if the current segment is a header part
 | ||||||
|  |                   std::cerr << "Theora Header Segment " << tHead.getHeaderType() << std::endl; | ||||||
|  |                   //fillDTSC header
 | ||||||
|  |                   switch(tHead.getHeaderType()){ | ||||||
|  |                     case 0: //identification header
 | ||||||
|  |                       trackData[sNum].fpks = ((long long int)tHead.getFRN() * 1000) / tHead.getFRD(); | ||||||
|  |                       std::cerr << trackData[sNum].fpks << std::endl; | ||||||
|  |                     break; | ||||||
|  |                     case 1: //comment header
 | ||||||
|  |                     break; | ||||||
|  |                     case 2: //setup header
 | ||||||
|  |                     break; | ||||||
|  |                   } | ||||||
|  |                    | ||||||
|  |                 }else{//if the current segment is a movie part
 | ||||||
|  |                   //std::cerr << "Theora Movie" << std::endl;
 | ||||||
|  |                   //output DTSC packet
 | ||||||
|  |                   DTSCOut.null();//clearing DTSC buffer
 | ||||||
|  |                   DTSCOut["trackid"] = (long long)trackData[sNum].dtscID; | ||||||
|  |                   DTSCOut["time"] = 0; //timestamp
 | ||||||
|  |                   DTSCOut["data"] = std::string(curSeg + curPlace, curLength); //segment content put in JSON
 | ||||||
|  |                   //DTSCOut["keyframe"] = "x"; //Aanmaken als eerste segment = keyframe
 | ||||||
|  |                   //else DTSCOut["interframe"] = "x";                  
 | ||||||
|  |                   std::cout << DTSCOut.toString(); | ||||||
|  |                 } | ||||||
|  |                 curPlace += curLength; | ||||||
|  |               } | ||||||
|  |             break; | ||||||
|  |             } | ||||||
|  |             case VORBIS: | ||||||
|  |               //std::cerr << oggPage.getFullPayload() << " ";
 | ||||||
|  |               //std::cerr << "Vorbis Page" << std::endl;
 | ||||||
|  |             break; | ||||||
|  |             default: | ||||||
|  |               std::cerr << "Can not handle this codec" << std::endl; | ||||||
|  |             break; | ||||||
|  |           } | ||||||
|           /*
 |           /*
 | ||||||
|           //ogg page 2 DTSC packet
 |           //ogg page 2 DTSC packet
 | ||||||
|           //for elk segment
 |           //for every segment
 | ||||||
|             DTSCOut.null();//clearing DTSC buffer
 |             DTSCOut.null();//clearing DTSC buffer
 | ||||||
|             DTSCOut["trackid"] = 1; //video
 |             DTSCOut["trackid"] = 1; //video
 | ||||||
|             DTSCOut["trackid"] = 2; //audio
 |             DTSCOut["trackid"] = 2; //audio
 | ||||||
|             DTSCOut["time"] = 0; //timestamp
 |             DTSCOut["time"] = 0; //timestamp
 | ||||||
|             DTSCOut["data"] = 0; //segment inhoud
 |             DTSCOut["data"] = 0; //segment inhoud
 | ||||||
|             DTSCOut["keyframe"] = "x"; //Aanmaken als eerste segment = keyframe
 |             DTSCOut["keyframe"] = "x"; //Aanmaken als eerste segment = keyframe
 | ||||||
|  |             else DTSCOut["interframe"] = "x"; | ||||||
|           //std::cout << "inner" << std::endl;
 |           //std::cout << "inner" << std::endl;
 | ||||||
|           */ |           */ | ||||||
|  |         }else{ | ||||||
|  |           std::cerr <<"Error! " << oggPage.getBitstreamSerialNumber() << "unknown bitstream serial number" << std::endl; | ||||||
|  |         } | ||||||
|  |         if (oggPage.typeEOS()){//ending page
 | ||||||
|  |           std::cerr << oggPage.getBitstreamSerialNumber() << "  ending" << std::endl; | ||||||
|  |           //remove from trackdata
 | ||||||
|         } |         } | ||||||
|       } |       } | ||||||
|       //std::cout << "outer" << std::endl;
 |  | ||||||
|     } |     } | ||||||
|     return 0; |     return 0; | ||||||
|   } |   } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int main(int argc, char ** argv){ | int main(int argc, char ** argv){ | ||||||
|   Util::Config conf = Util::Config(argv[0], PACKAGE_VERSION); |   //Util::Config conf = Util::Config(argv[0], PACKAGE_VERSION);
 | ||||||
|   conf.parseArgs(argc, argv); |   //conf.parseArgs(argc, argv);
 | ||||||
|   return Converters::OGG2DTSC(); |   return Converters::OGG2DTSC(); | ||||||
| } | } | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Oswald de Bruin
						Oswald de Bruin