📄 wispcmaudioservermediasubsession.cpp
字号:
/* * Copyright (C) 2005 WIS Technologies International Ltd. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and the associated README documentation file (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */// A "ServerMediaSubsession" subclass for on-demand unicast streaming// of PCM audio from a WIS GO7007 capture device.// Implementation#include "WISPCMAudioServerMediaSubsession.hh"#include <uLawAudioFilter.hh>#include <SimpleRTPSink.hh>WISPCMAudioServerMediaSubsession* WISPCMAudioServerMediaSubsession::createNew(UsageEnvironment& env, WISInput& wisInput, unsigned samplingFrequency, unsigned numChannels, Boolean inputIsLittleEndian, Boolean convertToULaw) { return new WISPCMAudioServerMediaSubsession(env, wisInput, samplingFrequency, numChannels, inputIsLittleEndian, convertToULaw);}WISPCMAudioServerMediaSubsession::WISPCMAudioServerMediaSubsession(UsageEnvironment& env, WISInput& wisInput, unsigned samplingFrequency, unsigned numChannels, Boolean inputIsLittleEndian, Boolean convertToULaw) : WISServerMediaSubsession(env, wisInput, fSamplingFrequency*(fConvertToULaw ? 8 : 16)*fNumChannels), fSamplingFrequency(samplingFrequency), fNumChannels(numChannels), fInputIsLittleEndian(inputIsLittleEndian), fConvertToULaw(convertToULaw) {}WISPCMAudioServerMediaSubsession::~WISPCMAudioServerMediaSubsession() {}FramedSource* WISPCMAudioServerMediaSubsession::createNewStreamSource(unsigned /*clientSessionId*/, unsigned& estBitrate) { FramedSource* pcmSource = fWISInput.audioSource(); // Add in any filter necessary to transform the data prior to streaming: FramedSource* resultSource; if (fConvertToULaw) { // stream u-law // Add a filter that converts from raw 16-bit PCM audio // to 8-bit u-law audio: resultSource = uLawFromPCMAudioSource::createNew(envir(), pcmSource); } else { // stream raw PCM if (fInputIsLittleEndian) { // The 16-bit samples are in little-endian order. Add a filter // that converts them to network (i.e., big-endian) order: resultSource = EndianSwap16::createNew(envir(), pcmSource); } else { // The 16-bit samples are already in big-endian order: resultSource = pcmSource; } } estBitrate = fEstimatedKbps; return resultSource;}RTPSink* WISPCMAudioServerMediaSubsession::createNewRTPSink(Groupsock* rtpGroupsock, unsigned char rtpPayloadTypeIfDynamic, FramedSource* /*inputSource*/) { setAudioRTPSinkBufferSize(); char* mimeType; unsigned char payloadFormatCode = rtpPayloadTypeIfDynamic; // by default if (fConvertToULaw) { // stream u-law mimeType = "PCMU"; if (fSamplingFrequency == 8000 && fNumChannels == 1) { payloadFormatCode = 0; // a static RTP payload type } } else { // stream raw PCM mimeType = "L16"; if (fSamplingFrequency == 44100 && fNumChannels == 2) { payloadFormatCode = 10; // a static RTP payload type } else if (fSamplingFrequency == 44100 && fNumChannels == 1) { payloadFormatCode = 11; // a static RTP payload type } } return SimpleRTPSink::createNew(envir(), rtpGroupsock, payloadFormatCode, fSamplingFrequency, "audio", mimeType, fNumChannels);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -