Temporary undo indenting fix (for merge!)

This commit is contained in:
Erik Zandvliet 2013-01-08 14:36:49 +01:00
parent 53542a7d3b
commit b45153d051
2 changed files with 176 additions and 174 deletions

View file

@ -20,10 +20,11 @@
#include <mist/ts_packet.h> //TS support #include <mist/ts_packet.h> //TS support
#include <mist/dtsc.h> //DTSC support #include <mist/dtsc.h> //DTSC support
#include <mist/mp4.h> //For initdata conversion #include <mist/mp4.h> //For initdata conversion
/// The main function of the connector /// The main function of the connector
/// \param conn A connection with the client /// \param conn A connection with the client
/// \param streamname The name of the stream /// \param streamname The name of the stream
int TS_Handler(Socket::Connection conn, std::string streamname){ int TS_Handler( Socket::Connection conn, std::string streamname ) {
std::string ToPack; std::string ToPack;
TS::Packet PackData; TS::Packet PackData;
std::string DTMIData; std::string DTMIData;
@ -38,175 +39,173 @@ int TS_Handler(Socket::Connection conn, std::string streamname){
bool FirstIDRInKeyFrame; bool FirstIDRInKeyFrame;
MP4::AVCC avccbox; MP4::AVCC avccbox;
bool haveAvcc = false; bool haveAvcc = false;
DTSC::Stream Strm; DTSC::Stream Strm;
bool inited = false; bool inited = false;
Socket::Connection ss; Socket::Connection ss;
while (conn.connected()){ while(conn.connected()) {
if ( !inited){ if( !inited ) {
ss = Util::Stream::getStream(streamname); ss = Util::Stream::getStream(streamname);
if ( !ss.connected()){ if (!ss.connected()){
#if DEBUG >= 1 #if DEBUG >= 1
fprintf(stderr, "Could not connect to server!\n"); fprintf(stderr, "Could not connect to server!\n");
#endif #endif
conn.close(); conn.close();
break; break;
} }
ss.SendNow("p\n"); ss.SendNow( "p\n" );
#if DEBUG >= 3 #if DEBUG >= 3
fprintf(stderr, "Everything connected, starting to send video data...\n"); fprintf(stderr, "Everything connected, starting to send video data...\n");
#endif #endif
inited = true; inited = true;
} }
if (ss.spool()){ if (ss.spool()){
while (Strm.parsePacket(ss.Received())){ while (Strm.parsePacket(ss.Received())){
if ( !haveAvcc){ if( !haveAvcc ) {
avccbox.setPayload(Strm.metadata["video"]["init"].asString()); avccbox.setPayload( Strm.metadata["video"]["init"].asString() );
haveAvcc = true; haveAvcc = true;
} }
if (Strm.lastType() == DTSC::VIDEO){ if( Strm.lastType() == DTSC::VIDEO ) {
DTMIData = Strm.lastData(); DTMIData = Strm.lastData();
if (Strm.getPacket(0).isMember("keyframe")){ if( Strm.getPacket(0).isMember("keyframe") ) {
IsKeyFrame = true; IsKeyFrame = true;
FirstIDRInKeyFrame = true; FirstIDRInKeyFrame = true;
}else{ } else {
IsKeyFrame = false; IsKeyFrame = false;
FirstKeyFrame = false; FirstKeyFrame = false;
} }
if (IsKeyFrame){ if( IsKeyFrame ) {
TimeStamp = (Strm.getPacket(0)["time"].asInt() * 27000); TimeStamp = ( Strm.getPacket(0)["time"].asInt() * 27000 );
} }
int TSType; int TSType;
bool FirstPic = true; bool FirstPic = true;
while (DTMIData.size()){ while( DTMIData.size() ) {
ThisNaluSize = (DTMIData[0] << 24) + (DTMIData[1] << 16) + (DTMIData[2] << 8) + DTMIData[3]; ThisNaluSize = (DTMIData[0] << 24) + (DTMIData[1] << 16) +
DTMIData.erase(0, 4); //Erase the first four characters; (DTMIData[2] << 8) + DTMIData[3];
DTMIData.erase(0,4);//Erase the first four characters;
TSType = (int)DTMIData[0] & 0x1F; TSType = (int)DTMIData[0] & 0x1F;
if (TSType == 0x05){ if( TSType == 0x05 ) {
if (FirstPic){ if( FirstPic ) {
ToPack += avccbox.asAnnexB(); ToPack += avccbox.asAnnexB( );
FirstPic = false; FirstPic = false;
} }
if (IsKeyFrame){ if( IsKeyFrame ) {
if ( !FirstKeyFrame && FirstIDRInKeyFrame){ if( !FirstKeyFrame && FirstIDRInKeyFrame ) {
ToPack.append(TS::NalHeader, 4); ToPack.append(TS::NalHeader,4);
FirstIDRInKeyFrame = false; FirstIDRInKeyFrame = false;
}else{ } else {
ToPack.append(TS::ShortNalHeader, 3); ToPack.append(TS::ShortNalHeader,3);
} }
} }
}else if (TSType == 0x01){ } else if ( TSType == 0x01 ) {
if (FirstPic){ if( FirstPic ) {
ToPack.append(TS::NalHeader, 4); ToPack.append(TS::NalHeader,4);
FirstPic = false; FirstPic = false;
}else{ } else {
ToPack.append(TS::ShortNalHeader, 3); ToPack.append(TS::ShortNalHeader,3);
} }
}else{ } else {
ToPack.append(TS::NalHeader, 4); ToPack.append(TS::NalHeader,4);
} }
ToPack.append(DTMIData, 0, ThisNaluSize); ToPack.append(DTMIData,0,ThisNaluSize);
DTMIData.erase(0, ThisNaluSize); DTMIData.erase(0,ThisNaluSize);
} }
WritePesHeader = true; WritePesHeader = true;
while (ToPack.size()){ while( ToPack.size() ) {
if ((PacketNumber % 42) == 0){ if ( ( PacketNumber % 42 ) == 0 ) {
PackData.DefaultPAT(); PackData.DefaultPAT();
conn.SendNow(PackData.ToString(), 188); conn.SendNow( PackData.ToString(), 188 );
PackData.DefaultPMT(); PackData.DefaultPMT();
conn.SendNow(PackData.ToString(), 188); conn.SendNow( PackData.ToString(), 188 );
PacketNumber += 2; PacketNumber += 2;
} }
PackData.Clear(); PackData.Clear();
PackData.PID(0x100); PackData.PID( 0x100 );
PackData.ContinuityCounter(VideoCounter); PackData.ContinuityCounter( VideoCounter );
VideoCounter++; VideoCounter ++;
if (WritePesHeader){ if( WritePesHeader ) {
PackData.UnitStart(1); PackData.UnitStart( 1 );
if (IsKeyFrame){ if( IsKeyFrame ) {
PackData.RandomAccess(1); PackData.RandomAccess( 1 );
PackData.PCR(TimeStamp); PackData.PCR( TimeStamp );
}else{ } else {
PackData.AdaptationField(1); PackData.AdaptationField( 1 );
} }
PackData.AddStuffing(184 - (20 + ToPack.size())); PackData.AddStuffing( 184 - (20+ToPack.size()) );
PackData.PESVideoLeadIn(ToPack.size(), Strm.getPacket(0)["time"].asInt() * 90); PackData.PESVideoLeadIn( ToPack.size(), Strm.getPacket(0)["time"].asInt() * 90 );
WritePesHeader = false; WritePesHeader = false;
}else{ } else {
PackData.AdaptationField(1); PackData.AdaptationField( 1 );
PackData.AddStuffing(184 - (ToPack.size())); PackData.AddStuffing( 184 - (ToPack.size()) );
} }
PackData.FillFree(ToPack); PackData.FillFree( ToPack );
conn.SendNow(PackData.ToString(), 188); conn.SendNow( PackData.ToString(), 188 );
PacketNumber++; PacketNumber ++;
} }
}else if (Strm.lastType() == DTSC::AUDIO){ } else if( Strm.lastType() == DTSC::AUDIO ) {
WritePesHeader = true; WritePesHeader = true;
DTMIData = Strm.lastData(); DTMIData = Strm.lastData();
ToPack = TS::GetAudioHeader(DTMIData.size(), Strm.metadata["audio"]["init"].asString()); ToPack = TS::GetAudioHeader( DTMIData.size(), Strm.metadata["audio"]["init"].asString() );
ToPack += DTMIData; ToPack += DTMIData;
TimeStamp = Strm.getPacket(0)["time"].asInt() * 81000; TimeStamp = Strm.getPacket(0)["time"].asInt() * 81000;
while (ToPack.size()){ while( ToPack.size() ) {
if ((PacketNumber % 42) == 0){ if ( ( PacketNumber % 42 ) == 0 ) {
PackData.DefaultPAT(); PackData.DefaultPAT();
conn.SendNow(PackData.ToString(), 188); conn.SendNow( PackData.ToString(), 188 );
PackData.DefaultPMT(); PackData.DefaultPMT();
conn.SendNow(PackData.ToString(), 188); conn.SendNow( PackData.ToString(), 188 );
PacketNumber += 2; PacketNumber += 2;
} }
PackData.Clear(); PackData.Clear();
PackData.PID(0x101); PackData.PID( 0x101 );
PackData.ContinuityCounter(AudioCounter); PackData.ContinuityCounter( AudioCounter );
AudioCounter++; AudioCounter ++;
if (WritePesHeader){ if( WritePesHeader ) {
PackData.UnitStart(1); PackData.UnitStart( 1 );
PackData.RandomAccess(1); PackData.RandomAccess( 1 );
PackData.AddStuffing(184 - (14 + ToPack.size())); PackData.AddStuffing( 184 - (14 + ToPack.size()) );
PackData.PESAudioLeadIn(ToPack.size(), TimeStamp); PackData.PESAudioLeadIn( ToPack.size(), TimeStamp );
WritePesHeader = false; WritePesHeader = false;
}else{ } else {
PackData.AdaptationField(1); PackData.AdaptationField( 1 );
PackData.AddStuffing(184 - (ToPack.size())); PackData.AddStuffing( 184 - (ToPack.size()) );
} }
PackData.FillFree(ToPack); PackData.FillFree( ToPack );
conn.SendNow(PackData.ToString(), 188); conn.SendNow( PackData.ToString(), 188 );
PacketNumber++; PacketNumber ++;
} }
} }
} }
} }
} }
fprintf(stderr, "Exiting\n"); fprintf( stderr, "Exiting\n" );
return 0; return 0;
} }
int main(int argc, char ** argv){ int main(int argc, char ** argv){
Util::Config conf(argv[0], PACKAGE_VERSION); Util::Config conf(argv[0], PACKAGE_VERSION);
conf.addOption("streamname", conf.addOption("streamname",JSON::fromString("{\"arg\":\"string\",\"arg_num\":1,\"help\":\"The name of the stream that this connector will transmit.\"}"));
JSON::fromString("{\"arg\":\"string\",\"arg_num\":1,\"help\":\"The name of the stream that this connector will transmit.\"}"));
conf.addConnectorOptions(8888); conf.addConnectorOptions(8888);
conf.parseArgs(argc, argv); conf.parseArgs(argc, argv);
Socket::Server server_socket = Socket::Server(conf.getInteger("listen_port"), conf.getString("listen_interface")); Socket::Server server_socket = Socket::Server(conf.getInteger("listen_port"), conf.getString("listen_interface"));
if ( !server_socket.connected()){ if (!server_socket.connected()){return 1;}
return 1;
}
conf.activate(); conf.activate();
while (server_socket.connected() && conf.is_active){ while (server_socket.connected() && conf.is_active){
Socket::Connection S = server_socket.accept(); Socket::Connection S = server_socket.accept();
if (S.connected()){ //check if the new connection is valid if (S.connected()){//check if the new connection is valid
fprintf(stderr, "Incoming connection\n"); fprintf(stderr,"Incoming connection\n");
pid_t myid = fork(); pid_t myid = fork();
if (myid == 0){ //if new child, start MAINHANDLER if (myid == 0){//if new child, start MAINHANDLER
return TS_Handler(S, conf.getString("streamname")); return TS_Handler(S,conf.getString("streamname"));
}else{ //otherwise, do nothing or output debugging text }else{//otherwise, do nothing or output debugging text
#if DEBUG >= 3 #if DEBUG >= 3
fprintf(stderr, "Spawned new process %i for socket %i\n", (int)myid, S.getSocket()); fprintf(stderr, "Spawned new process %i for socket %i\n", (int)myid, S.getSocket());
#endif #endif
} }
} }
} //while connected }//while connected
server_socket.close(); server_socket.close();
return 0; return 0;
} //main }//main

View file

@ -10,8 +10,9 @@
#include <mist/ts_packet.h> //TS support #include <mist/ts_packet.h> //TS support
#include <mist/dtsc.h> //DTSC support #include <mist/dtsc.h> //DTSC support
#include <mist/mp4.h> //For initdata conversion #include <mist/mp4.h> //For initdata conversion
int main(){
char charBuffer[1024 * 10]; int main( ) {
char charBuffer[1024*10];
unsigned int charCount; unsigned int charCount;
std::string StrData; std::string StrData;
std::string ToPack; std::string ToPack;
@ -29,124 +30,126 @@ int main(){
bool FirstIDRInKeyFrame; bool FirstIDRInKeyFrame;
MP4::AVCC avccbox; MP4::AVCC avccbox;
bool haveAvcc = false; bool haveAvcc = false;
while (std::cin.good()){
if (DTSCStream.parsePacket(StrData)){ while( std::cin.good() ) {
if ( !haveAvcc){ if ( DTSCStream.parsePacket( StrData ) ) {
avccbox.setPayload(DTSCStream.metadata["video"]["init"].asString()); if( !haveAvcc ) {
avccbox.setPayload( DTSCStream.metadata["video"]["init"].asString() );
haveAvcc = true; haveAvcc = true;
} }
if (DTSCStream.lastType() == DTSC::VIDEO){ if( DTSCStream.lastType() == DTSC::VIDEO ) {
DTMIData = DTSCStream.lastData(); DTMIData = DTSCStream.lastData();
if (DTSCStream.getPacket(0).isMember("keyframe")){ if( DTSCStream.getPacket(0).isMember("keyframe") ) {
IsKeyFrame = true; IsKeyFrame = true;
FirstIDRInKeyFrame = true; FirstIDRInKeyFrame = true;
}else{ } else {
IsKeyFrame = false; IsKeyFrame = false;
FirstKeyFrame = false; FirstKeyFrame = false;
} }
if (IsKeyFrame){ if( IsKeyFrame ) {
TimeStamp = (DTSCStream.getPacket(0)["time"].asInt() * 27000); TimeStamp = ( DTSCStream.getPacket(0)["time"].asInt() * 27000 );
} }
int TSType; int TSType;
bool FirstPic = true; bool FirstPic = true;
while (DTMIData.size()){ while( DTMIData.size() ) {
ThisNaluSize = (DTMIData[0] << 24) + (DTMIData[1] << 16) + (DTMIData[2] << 8) + DTMIData[3]; ThisNaluSize = (DTMIData[0] << 24) + (DTMIData[1] << 16) +
DTMIData.erase(0, 4); //Erase the first four characters; (DTMIData[2] << 8) + DTMIData[3];
DTMIData.erase(0,4);//Erase the first four characters;
TSType = (int)DTMIData[0] & 0x1F; TSType = (int)DTMIData[0] & 0x1F;
if (TSType == 0x05){ if( TSType == 0x05 ) {
if (FirstPic){ if( FirstPic ) {
ToPack += avccbox.asAnnexB(); ToPack += avccbox.asAnnexB( );
FirstPic = false; FirstPic = false;
} }
if (IsKeyFrame){ if( IsKeyFrame ) {
if ( !FirstKeyFrame && FirstIDRInKeyFrame){ if( !FirstKeyFrame && FirstIDRInKeyFrame ) {
ToPack.append(TS::NalHeader, 4); ToPack.append(TS::NalHeader,4);
FirstIDRInKeyFrame = false; FirstIDRInKeyFrame = false;
}else{ } else {
ToPack.append(TS::ShortNalHeader, 3); ToPack.append(TS::ShortNalHeader,3);
} }
} }
}else if (TSType == 0x01){ } else if ( TSType == 0x01 ) {
if (FirstPic){ if( FirstPic ) {
ToPack.append(TS::NalHeader, 4); ToPack.append(TS::NalHeader,4);
FirstPic = false; FirstPic = false;
}else{ } else {
ToPack.append(TS::ShortNalHeader, 3); ToPack.append(TS::ShortNalHeader,3);
} }
}else{ } else {
ToPack.append(TS::NalHeader, 4); ToPack.append(TS::NalHeader,4);
} }
ToPack.append(DTMIData, 0, ThisNaluSize); ToPack.append(DTMIData,0,ThisNaluSize);
DTMIData.erase(0, ThisNaluSize); DTMIData.erase(0,ThisNaluSize);
} }
WritePesHeader = true; WritePesHeader = true;
while (ToPack.size()){ while( ToPack.size() ) {
if ((PacketNumber % 42) == 0){ if ( ( PacketNumber % 42 ) == 0 ) {
PackData.DefaultPAT(); PackData.DefaultPAT();
std::cout.write(PackData.ToString(), 188); std::cout.write( PackData.ToString(), 188 );
PackData.DefaultPMT(); PackData.DefaultPMT();
std::cout.write(PackData.ToString(), 188); std::cout.write( PackData.ToString(), 188 );
PacketNumber += 2; PacketNumber += 2;
} }
PackData.Clear(); PackData.Clear();
PackData.PID(0x100); PackData.PID( 0x100 );
PackData.ContinuityCounter(VideoCounter); PackData.ContinuityCounter( VideoCounter );
VideoCounter++; VideoCounter ++;
if (WritePesHeader){ if( WritePesHeader ) {
PackData.UnitStart(1); PackData.UnitStart( 1 );
if (IsKeyFrame){ if( IsKeyFrame ) {
PackData.RandomAccess(1); PackData.RandomAccess( 1 );
PackData.PCR(TimeStamp); PackData.PCR( TimeStamp );
}else{ } else {
PackData.AdaptationField(1); PackData.AdaptationField( 1 );
} }
PackData.AddStuffing(184 - (20 + ToPack.size())); PackData.AddStuffing( 184 - (20+ToPack.size()) );
PackData.PESVideoLeadIn(ToPack.size(), DTSCStream.getPacket(0)["time"].asInt() * 90); PackData.PESVideoLeadIn( ToPack.size(), DTSCStream.getPacket(0)["time"].asInt() * 90 );
WritePesHeader = false; WritePesHeader = false;
}else{ } else {
PackData.AdaptationField(1); PackData.AdaptationField( 1 );
PackData.AddStuffing(184 - (ToPack.size())); PackData.AddStuffing( 184 - (ToPack.size()) );
} }
PackData.FillFree(ToPack); PackData.FillFree( ToPack );
std::cout.write(PackData.ToString(), 188); std::cout.write( PackData.ToString(), 188 );
PacketNumber++; PacketNumber ++;
} }
}else if (DTSCStream.lastType() == DTSC::AUDIO){ } else if( DTSCStream.lastType() == DTSC::AUDIO ) {
WritePesHeader = true; WritePesHeader = true;
DTMIData = DTSCStream.lastData(); DTMIData = DTSCStream.lastData();
ToPack = TS::GetAudioHeader(DTMIData.size(), DTSCStream.metadata["audio"]["init"].asString()); ToPack = TS::GetAudioHeader( DTMIData.size(), DTSCStream.metadata["audio"]["init"].asString() );
ToPack += DTMIData; ToPack += DTMIData;
TimeStamp = DTSCStream.getPacket(0)["time"].asInt() * 81000; TimeStamp = DTSCStream.getPacket(0)["time"].asInt() * 81000;
while (ToPack.size()){ while( ToPack.size() ) {
if ((PacketNumber % 42) == 0){ if ( ( PacketNumber % 42 ) == 0 ) {
PackData.DefaultPAT(); PackData.DefaultPAT();
std::cout.write(PackData.ToString(), 188); std::cout.write( PackData.ToString(), 188 );
PackData.DefaultPMT(); PackData.DefaultPMT();
std::cout.write(PackData.ToString(), 188); std::cout.write( PackData.ToString(), 188 );
PacketNumber += 2; PacketNumber += 2;
} }
PackData.Clear(); PackData.Clear();
PackData.PID(0x101); PackData.PID( 0x101 );
PackData.ContinuityCounter(AudioCounter); PackData.ContinuityCounter( AudioCounter );
AudioCounter++; AudioCounter ++;
if (WritePesHeader){ if( WritePesHeader ) {
PackData.UnitStart(1); PackData.UnitStart( 1 );
PackData.RandomAccess(1); PackData.RandomAccess( 1 );
PackData.AddStuffing(184 - (14 + ToPack.size())); PackData.AddStuffing( 184 - (14 + ToPack.size()) );
PackData.PESAudioLeadIn(ToPack.size(), TimeStamp); PackData.PESAudioLeadIn( ToPack.size(), TimeStamp );
WritePesHeader = false; WritePesHeader = false;
}else{ } else {
PackData.AdaptationField(1); PackData.AdaptationField( 1 );
PackData.AddStuffing(184 - (ToPack.size())); PackData.AddStuffing( 184 - (ToPack.size()) );
} }
PackData.FillFree(ToPack); PackData.FillFree( ToPack );
std::cout.write(PackData.ToString(), 188); std::cout.write( PackData.ToString(), 188 );
PacketNumber++; PacketNumber ++;
} }
} }
}else{ } else {
std::cin.read(charBuffer, 1024 * 10); std::cin.read(charBuffer, 1024*10);
charCount = std::cin.gcount(); charCount = std::cin.gcount();
StrData.append(charBuffer, charCount); StrData.append(charBuffer, charCount);
} }