Added PCM support to RTSP
This commit is contained in:
		
							parent
							
								
									6595059737
								
							
						
					
					
						commit
						f46d2a0c4a
					
				
					 2 changed files with 58 additions and 8 deletions
				
			
		|  | @ -60,6 +60,7 @@ namespace Mist { | |||
|     capa["codecs"][0u][1u].append("MP3"); | ||||
|     capa["codecs"][0u][1u].append("AC3"); | ||||
|     capa["codecs"][0u][1u].append("ALAW"); | ||||
|     capa["codecs"][0u][1u].append("PCM"); | ||||
|     capa["codecs"][0u][1u].append("opus"); | ||||
|      | ||||
|     capa["methods"][0u]["handler"] = "rtsp"; | ||||
|  | @ -516,14 +517,7 @@ namespace Mist { | |||
|     if (!tracks[track].firstTime){ | ||||
|       tracks[track].firstTime = pkt.getTimeStamp() + 1; | ||||
|     } | ||||
|     if (myMeta.tracks[track].codec == "ALAW"){ | ||||
|       char * pl = pkt.getPayload(); | ||||
|       DTSC::Packet nextPack; | ||||
|       nextPack.genericFill((pkt.getTimeStamp() - tracks[track].firstTime + 1) / ((double)myMeta.tracks[track].rate / 1000.0), 0, track, pl, pkt.getPayloadSize(), 0, false); | ||||
|       bufferLivePacket(nextPack); | ||||
|       return; | ||||
|     } | ||||
|     if (myMeta.tracks[track].codec == "opus"){ | ||||
|     if (myMeta.tracks[track].codec == "ALAW" || myMeta.tracks[track].codec == "opus" || myMeta.tracks[track].codec == "MP3" || myMeta.tracks[track].codec == "PCM"){ | ||||
|       char * pl = pkt.getPayload(); | ||||
|       DTSC::Packet nextPack; | ||||
|       nextPack.genericFill((pkt.getTimeStamp() - tracks[track].firstTime + 1) / ((double)myMeta.tracks[track].rate / 1000.0), 0, track, pl, pkt.getPayloadSize(), 0, false); | ||||
|  | @ -555,6 +549,10 @@ namespace Mist { | |||
|       //Prints a WARN-level message if packet type is unsupported.
 | ||||
|       /// \todo Support other H264 packets types?
 | ||||
|       char * pl = pkt.getPayload(); | ||||
|       if (!pkt.getPayloadSize()){ | ||||
|         WARN_MSG("Empty packet ignored!"); | ||||
|         return; | ||||
|       } | ||||
|       if ((pl[0] & 0x1F) == 0){ | ||||
|         WARN_MSG("H264 packet type null ignored"); | ||||
|         return; | ||||
|  | @ -755,6 +753,24 @@ namespace Mist { | |||
|               thisTrack->channels = 1; | ||||
|               INFO_MSG("Incoming track %s", thisTrack->getIdentifier().c_str()); | ||||
|               break; | ||||
|             case 10: //PCM Stereo, 44.1kHz
 | ||||
|               INFO_MSG("Linear PCM stereo 44.1kHz payload type"); | ||||
|               nope = false; | ||||
|               thisTrack->codec = "PCM"; | ||||
|               thisTrack->size = 16; | ||||
|               thisTrack->rate = 44100; | ||||
|               thisTrack->channels = 2; | ||||
|               INFO_MSG("Incoming track %s", thisTrack->getIdentifier().c_str()); | ||||
|               break; | ||||
|             case 11: //PCM Mono, 44.1kHz
 | ||||
|               INFO_MSG("Linear PCM mono 44.1kHz payload type"); | ||||
|               nope = false; | ||||
|               thisTrack->codec = "PCM"; | ||||
|               thisTrack->rate = 44100; | ||||
|               thisTrack->size = 16; | ||||
|               thisTrack->channels = 1; | ||||
|               INFO_MSG("Incoming track %s", thisTrack->getIdentifier().c_str()); | ||||
|               break; | ||||
|             default: | ||||
|               //dynamic type
 | ||||
|               if (avp_type >= 96 && avp_type <= 127){ | ||||
|  | @ -795,6 +811,22 @@ namespace Mist { | |||
|           thisTrack->init = std::string("OpusHead\001\002\170\000\200\273\000\000\000\000\000", 19); | ||||
|         } | ||||
|         if (trCodec == "PCMA"){thisTrack->codec = "ALAW";} | ||||
|         if (trCodec == "L8"){ | ||||
|           thisTrack->codec = "PCM"; | ||||
|           thisTrack->size = 8; | ||||
|         } | ||||
|         if (trCodec == "L16"){ | ||||
|           thisTrack->codec = "PCM"; | ||||
|           thisTrack->size = 16; | ||||
|         } | ||||
|         if (trCodec == "L20"){ | ||||
|           thisTrack->codec = "PCM"; | ||||
|           thisTrack->size = 20; | ||||
|         } | ||||
|         if (trCodec == "L24"){ | ||||
|           thisTrack->codec = "PCM"; | ||||
|           thisTrack->size = 24; | ||||
|         } | ||||
|         if (trCodec == "MPEG4-GENERIC"){thisTrack->codec = "AAC";} | ||||
|         INFO_MSG("Incoming track %s", thisTrack->getIdentifier().c_str()); | ||||
|         continue; | ||||
|  |  | |||
|  | @ -96,6 +96,16 @@ namespace Mist { | |||
|             mediaDesc << "a=rtpmap:101 PCMA/" << trk.rate <<  "/" << trk.channels << "\r\n"; | ||||
|           } | ||||
|           mediaDesc << "a=control:track" << trk.trackID << "\r\n"; | ||||
|         }else if ( trk.codec == "PCM") { | ||||
|           if (trk.size == 16 && trk.channels == 2 && trk.rate == 44100){ | ||||
|             mediaDesc << "m=audio 0 RTP/AVP 10" << "\r\n"; | ||||
|           } else if (trk.size == 16 && trk.channels == 1 && trk.rate == 44100){ | ||||
|             mediaDesc << "m=audio 0 RTP/AVP 11" << "\r\n"; | ||||
|           }else{ | ||||
|             mediaDesc << "m=audio 0 RTP/AVP 103" << "\r\n"; | ||||
|             mediaDesc << "a=rtpmap:103 L" << trk.size << "/" << trk.rate <<  "/" << trk.channels << "\r\n"; | ||||
|           } | ||||
|           mediaDesc << "a=control:track" << trk.trackID << "\r\n"; | ||||
|         }else if ( trk.codec == "opus") { | ||||
|           mediaDesc << "m=audio 0 RTP/AVP 102" << "\r\n" | ||||
|           "a=rtpmap:102 opus/" << trk.rate << "/" << trk.channels << "\r\n" | ||||
|  | @ -119,6 +129,14 @@ namespace Mist { | |||
|           }else{ | ||||
|             pack = RTP::Packet(101, 1, 0, SSrc); | ||||
|           } | ||||
|         }else if ( trk.codec == "PCM") { | ||||
|           if (trk.size == 16 && trk.channels == 2 && trk.rate == 44100){ | ||||
|             pack = RTP::Packet(10, 1, 0, SSrc); | ||||
|           } else if (trk.size == 16 && trk.channels == 1 && trk.rate == 44100){ | ||||
|             pack = RTP::Packet(11, 1, 0, SSrc); | ||||
|           }else{ | ||||
|             pack = RTP::Packet(103, 1, 0, SSrc); | ||||
|           } | ||||
|         }else if(trk.codec == "opus"){ | ||||
|           pack = RTP::Packet(102, 1, 0, SSrc); | ||||
|         }else{ | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Thulinma
						Thulinma