本文整理汇总了C++中MediaSubsession::fmtp_config方法的典型用法代码示例。如果您正苦于以下问题:C++ MediaSubsession::fmtp_config方法的具体用法?C++ MediaSubsession::fmtp_config怎么用?C++ MediaSubsession::fmtp_config使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类MediaSubsession
的用法示例。
在下文中一共展示了MediaSubsession::fmtp_config方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: handSetup
bool MtkRTSPClient::handSetup(char* resultString)
{
CHECK_NULL_COND(session, false);
CHECK_NULL_COND(rtsp::env, false);
bool bSuccess = false;
// Then, setup the "RTPSource"s for the session:
MediaSubsessionIterator iter(*(session));
MediaSubsession *subsession = NULL;
while ((subsession = iter.next()) != NULL)
{
if (subsession->readSource() == NULL)
{
LOG_ERR("warning");
continue; // was not initiated
}
if (subsession->sink != NULL)/*already be set*/
{
continue;
}
unsigned int type = getBufType(subsession);
if (type == 0)
{
LOG_ERR("error type=%d", type);
continue;
}
{
iSetupCount--;
/*set mediay info*/
setMediaInfo(subsession, type);
}
CmpbSink *sink = NULL;
if ((type != mediatype_audio) && (strcmp(subsession->codecName(), "H264") == 0))
{
sink = CmpbH264Sink::createNew(*env, *subsession, type, fileSinkBufferSize);
}
else if ((type == mediatype_audio) &&
((stMediaInfo.audioCodec == MEDIACODEC_AC3) ||
(stMediaInfo.audioCodec == MEDIACODEC_EAC3) ||
(stMediaInfo.audioCodec == MEDIACODEC_MPEG4_GENERIC)))
{
sink = CmpbAACSink::createNew(*env, *subsession, type, fileSinkBufferSize);
}
else if ((type == mediatype_audio) && (stMediaInfo.audioCodec == MEDIACODEC_MP4A_LATM))
{
sink = CmpbLATMSink::createNew(*env, *subsession, type, fileSinkBufferSize);
}
else
{
sink = CmpbSink::createNew(*env, *subsession, type, fileSinkBufferSize);
}
subsession->sink = sink;
if (subsession->sink == NULL)
{
LOG_ERR("error!");
}
else
{
#if 0 /*this should be remove to cmpb sink*/
if ((type != mediatype_audio) && (strcmp(subsession->codecName(), "MP4V-ES") == 0)
&& (subsession->fmtp_config() != NULL))
{
// For MPEG-4 video RTP streams, the 'config' information
// from the SDP description contains useful VOL etc. headers.
// Insert this data at the front of the output file:
unsigned configLen;
unsigned char* configData
= parseGeneralConfigStr(subsession->fmtp_config(), configLen);
struct timeval timeNow;
gettimeofday(&timeNow, NULL);
sink->sendData(configData, configLen, timeNow);
delete[] configData;
}
#endif
subsession->sink->startPlaying(*(subsession->readSource()),
subsessionAfterPlaying,
subsession);
// Also set a handler to be called if a RTCP "BYE" arrives
// for this subsession:
if (subsession->rtcpInstance() != NULL)
{
subsession->rtcpInstance()->setByeHandler(subsessionAfterPlaying, subsession);
}
bSuccess = true;
}
break;
}
if (iSetupCount == 0)
{
mediaInfoReady();
}
//.........这里部分代码省略.........
示例2: main
//.........这里部分代码省略.........
fileSinkBufferSize,
movieWidth, movieHeight,
movieFPS,
packetLossCompensate);
if (aviOut == NULL) {
*env << "Failed to create AVI file sink for stdout: " << env->getResultMsg();
shutdown();
}
aviOut->startPlaying(sessionAfterPlaying, NULL);
} else {
// Create and start "FileSink"s for each subsession:
madeProgress = False;
iter.reset();
while ((subsession = iter.next()) != NULL) {
if (subsession->readSource() == NULL) continue; // was not initiated
// Create an output file for each desired stream:
char outFileName[1000];
if (singleMedium == NULL) {
// Output file name is
// "<filename-prefix><medium_name>-<codec_name>-<counter>"
static unsigned streamCounter = 0;
snprintf(outFileName, sizeof outFileName, "%s%s-%s-%d",
fileNamePrefix, subsession->mediumName(),
subsession->codecName(), ++streamCounter);
} else {
sprintf(outFileName, "stdout");
}
FileSink* fileSink;
if (strcmp(subsession->mediumName(), "audio") == 0 &&
(strcmp(subsession->codecName(), "AMR") == 0 ||
strcmp(subsession->codecName(), "AMR-WB") == 0)) {
// For AMR audio streams, we use a special sink that inserts AMR frame hdrs:
fileSink = AMRAudioFileSink::createNew(*env, outFileName,
fileSinkBufferSize, oneFilePerFrame);
} else if (strcmp(subsession->mediumName(), "video") == 0 &&
(strcmp(subsession->codecName(), "H264") == 0)) {
// For H.264 video stream, we use a special sink that insert start_codes:
fileSink = H264VideoFileSink::createNew(*env, outFileName,
fileSinkBufferSize, oneFilePerFrame);
} else {
// Normal case:
fileSink = FileSink::createNew(*env, outFileName,
fileSinkBufferSize, oneFilePerFrame);
}
subsession->sink = fileSink;
if (subsession->sink == NULL) {
*env << "Failed to create FileSink for \"" << outFileName
<< "\": " << env->getResultMsg() << "\n";
} else {
if (singleMedium == NULL) {
*env << "Created output file: \"" << outFileName << "\"\n";
} else {
*env << "Outputting data from the \"" << subsession->mediumName()
<< "/" << subsession->codecName()
<< "\" subsession to 'stdout'\n";
}
if (strcmp(subsession->mediumName(), "video") == 0 &&
strcmp(subsession->codecName(), "MP4V-ES") == 0 &&
subsession->fmtp_config() != NULL) {
// For MPEG-4 video RTP streams, the 'config' information
// from the SDP description contains useful VOL etc. headers.
// Insert this data at the front of the output file:
unsigned configLen;
unsigned char* configData
= parseGeneralConfigStr(subsession->fmtp_config(), configLen);
struct timeval timeNow;
gettimeofday(&timeNow, NULL);
fileSink->addData(configData, configLen, timeNow);
delete[] configData;
}
subsession->sink->startPlaying(*(subsession->readSource()),
subsessionAfterPlaying,
subsession);
// Also set a handler to be called if a RTCP "BYE" arrives
// for this subsession:
if (subsession->rtcpInstance() != NULL) {
subsession->rtcpInstance()->setByeHandler(subsessionByeHandler,
subsession);
}
madeProgress = True;
}
}
if (!madeProgress) shutdown();
}
}
// Finally, start playing each subsession, to start the data flow:
startPlayingStreams();
env->taskScheduler().doEventLoop(); // does not return
return 0; // only to prevent compiler warning
}