void CDVDDemuxClient::RequestStreams() { std::map<int, std::shared_ptr<CDemuxStream>> m_newStreamMap; for (auto stream : m_IDemux->GetStreams()) { if (!stream) { CLog::Log(LOGERROR, "CDVDDemuxClient::RequestStreams - invalid stream"); DisposeStreams(); return; } std::shared_ptr<CDemuxStream> dStream = GetStreamInternal(stream->uniqueId); if (stream->type == STREAM_AUDIO) { CDemuxStreamAudio *source = dynamic_cast<CDemuxStreamAudio*>(stream); if (!source) { CLog::Log(LOGERROR, "CDVDDemuxClient::RequestStreams - invalid audio stream with id %d", stream->uniqueId); DisposeStreams(); return; } std::shared_ptr<CDemuxStreamClientInternalTpl<CDemuxStreamAudio>> streamAudio; if (dStream) streamAudio = std::dynamic_pointer_cast<CDemuxStreamClientInternalTpl<CDemuxStreamAudio>>(dStream); if (!streamAudio || streamAudio->codec != source->codec) { streamAudio.reset(new CDemuxStreamClientInternalTpl<CDemuxStreamAudio>()); streamAudio->m_parser = av_parser_init(source->codec); if (streamAudio->m_parser) streamAudio->m_parser->flags |= PARSER_FLAG_COMPLETE_FRAMES; } streamAudio->iChannels = source->iChannels; streamAudio->iSampleRate = source->iSampleRate; streamAudio->iBlockAlign = source->iBlockAlign; streamAudio->iBitRate = source->iBitRate; streamAudio->iBitsPerSample = source->iBitsPerSample; if (source->ExtraSize > 0 && source->ExtraData) { streamAudio->ExtraData = new uint8_t[source->ExtraSize]; streamAudio->ExtraSize = source->ExtraSize; for (unsigned int j=0; j<source->ExtraSize; j++) streamAudio->ExtraData[j] = source->ExtraData[j]; } streamAudio->m_parser_split = true; streamAudio->changes++; m_newStreamMap[stream->uniqueId] = streamAudio; dStream = streamAudio; } else if (stream->type == STREAM_VIDEO) { CDemuxStreamVideo *source = dynamic_cast<CDemuxStreamVideo*>(stream); if (!source) { CLog::Log(LOGERROR, "CDVDDemuxClient::RequestStreams - invalid video stream with id %d", stream->uniqueId); DisposeStreams(); return; } std::shared_ptr<CDemuxStreamClientInternalTpl<CDemuxStreamVideo>> streamVideo; if (dStream) streamVideo = std::dynamic_pointer_cast<CDemuxStreamClientInternalTpl<CDemuxStreamVideo>>(dStream); if (!streamVideo || streamVideo->codec != source->codec || streamVideo->iWidth != source->iWidth || streamVideo->iHeight != source->iHeight) { streamVideo.reset(new CDemuxStreamClientInternalTpl<CDemuxStreamVideo>()); streamVideo->m_parser = av_parser_init(source->codec); if (streamVideo->m_parser) streamVideo->m_parser->flags |= PARSER_FLAG_COMPLETE_FRAMES; } streamVideo->iFpsScale = source->iFpsScale; streamVideo->iFpsRate = source->iFpsRate; streamVideo->iHeight = source->iHeight; streamVideo->iWidth = source->iWidth; streamVideo->fAspect = source->fAspect; streamVideo->stereo_mode = "mono"; if (source->ExtraSize > 0 && source->ExtraData) { streamVideo->ExtraData = new uint8_t[source->ExtraSize]; streamVideo->ExtraSize = source->ExtraSize; for (unsigned int j=0; j<source->ExtraSize; j++) streamVideo->ExtraData[j] = source->ExtraData[j]; } streamVideo->m_parser_split = true; streamVideo->changes++; m_newStreamMap[stream->uniqueId] = streamVideo; dStream = streamVideo; } else if (stream->type == STREAM_SUBTITLE) { CDemuxStreamSubtitle *source = dynamic_cast<CDemuxStreamSubtitle*>(stream); if (!source) { CLog::Log(LOGERROR, "CDVDDemuxClient::RequestStreams - invalid subtitle stream with id %d", stream->uniqueId); DisposeStreams(); return; } std::shared_ptr<CDemuxStreamClientInternalTpl<CDemuxStreamSubtitle>> streamSubtitle; if (dStream) streamSubtitle = std::dynamic_pointer_cast<CDemuxStreamClientInternalTpl<CDemuxStreamSubtitle>>(dStream); if (!streamSubtitle || streamSubtitle->codec != source->codec) { streamSubtitle.reset(new CDemuxStreamClientInternalTpl<CDemuxStreamSubtitle>()); streamSubtitle->m_parser = av_parser_init(source->codec); if (streamSubtitle->m_parser) streamSubtitle->m_parser->flags |= PARSER_FLAG_COMPLETE_FRAMES; } if (source->ExtraSize == 4) { streamSubtitle->ExtraData = new uint8_t[4]; streamSubtitle->ExtraSize = 4; for (int j=0; j<4; j++) streamSubtitle->ExtraData[j] = source->ExtraData[j]; } m_newStreamMap[stream->uniqueId] = streamSubtitle; dStream = streamSubtitle; } else if (stream->type == STREAM_TELETEXT) { CDemuxStreamTeletext *source = dynamic_cast<CDemuxStreamTeletext*>(stream); if (!source) { CLog::Log(LOGERROR, "CDVDDemuxClient::RequestStreams - invalid teletext stream with id %d", stream->uniqueId); DisposeStreams(); return; } std::shared_ptr<CDemuxStreamClientInternalTpl<CDemuxStreamTeletext>> streamTeletext; if (dStream) streamTeletext = std::dynamic_pointer_cast<CDemuxStreamClientInternalTpl<CDemuxStreamTeletext>>(dStream); if (!streamTeletext || streamTeletext->codec != source->codec) { streamTeletext.reset(new CDemuxStreamClientInternalTpl<CDemuxStreamTeletext>()); } m_newStreamMap[stream->uniqueId] = streamTeletext; dStream = streamTeletext; } else if (stream->type == STREAM_RADIO_RDS) { CDemuxStreamRadioRDS *source = dynamic_cast<CDemuxStreamRadioRDS*>(stream); if (!source) { CLog::Log(LOGERROR, "CDVDDemuxClient::RequestStreams - invalid radio-rds stream with id %d", stream->uniqueId); DisposeStreams(); return; } std::shared_ptr<CDemuxStreamClientInternalTpl<CDemuxStreamRadioRDS>> streamRDS; if (dStream) streamRDS = std::dynamic_pointer_cast<CDemuxStreamClientInternalTpl<CDemuxStreamRadioRDS>>(dStream); if (!streamRDS || streamRDS->codec != source->codec) { streamRDS.reset(new CDemuxStreamClientInternalTpl<CDemuxStreamRadioRDS>()); } m_newStreamMap[stream->uniqueId] = streamRDS; dStream = streamRDS; } else { std::shared_ptr<CDemuxStreamClientInternalTpl<CDemuxStream>> streamGen; streamGen = std::make_shared<CDemuxStreamClientInternalTpl<CDemuxStream>>(); m_newStreamMap[stream->uniqueId] = streamGen; dStream = streamGen; } dStream->uniqueId = stream->uniqueId; dStream->codec = stream->codec; dStream->codecName = stream->codecName; dStream->bandwidth = stream->bandwidth; dStream->uniqueId = stream->uniqueId; for (int j=0; j<4; j++) dStream->language[j] = stream->language[j]; dStream->realtime = stream->realtime; CLog::Log(LOGDEBUG,"CDVDDemuxClient::RequestStreams(): added/updated stream %d with codec_id %d", dStream->uniqueId, dStream->codec); } m_streams = m_newStreamMap; }
void CDVDDemuxClient::SetStreamProps(CDemuxStream *stream, std::map<int, std::shared_ptr<CDemuxStream>> &map, bool forceInit) { if (!stream) { CLog::Log(LOGERROR, "CDVDDemuxClient::RequestStream - invalid stream"); DisposeStreams(); return; } std::shared_ptr<CDemuxStream> currentStream(GetStreamInternal(stream->uniqueId)); std::shared_ptr<CDemuxStream> toStream; if (stream->type == STREAM_AUDIO) { CDemuxStreamAudio *source = dynamic_cast<CDemuxStreamAudio*>(stream); if (!source) { CLog::Log(LOGERROR, "CDVDDemuxClient::RequestStream - invalid audio stream with id %d", stream->uniqueId); DisposeStreams(); return; } std::shared_ptr<CDemuxStreamClientInternalTpl<CDemuxStreamAudio>> streamAudio; if (currentStream) streamAudio = std::dynamic_pointer_cast<CDemuxStreamClientInternalTpl<CDemuxStreamAudio>>(currentStream); if (forceInit || !streamAudio || streamAudio->codec != source->codec) { streamAudio.reset(new CDemuxStreamClientInternalTpl<CDemuxStreamAudio>()); streamAudio->m_parser = av_parser_init(source->codec); if (streamAudio->m_parser) streamAudio->m_parser->flags |= PARSER_FLAG_COMPLETE_FRAMES; streamAudio->iSampleRate = source->iSampleRate; streamAudio->iChannels = source->iChannels; } streamAudio->iBlockAlign = source->iBlockAlign; streamAudio->iBitRate = source->iBitRate; streamAudio->iBitsPerSample = source->iBitsPerSample; if (source->ExtraSize > 0 && source->ExtraData) { delete[] streamAudio->ExtraData; streamAudio->ExtraData = new uint8_t[source->ExtraSize]; streamAudio->ExtraSize = source->ExtraSize; for (unsigned int j=0; j<source->ExtraSize; j++) streamAudio->ExtraData[j] = source->ExtraData[j]; } streamAudio->m_parser_split = true; streamAudio->changes++; map[stream->uniqueId] = streamAudio; toStream = streamAudio; } else if (stream->type == STREAM_VIDEO) { CDemuxStreamVideo *source = dynamic_cast<CDemuxStreamVideo*>(stream); if (!source) { CLog::Log(LOGERROR, "CDVDDemuxClient::RequestStream - invalid video stream with id %d", stream->uniqueId); DisposeStreams(); return; } std::shared_ptr<CDemuxStreamClientInternalTpl<CDemuxStreamVideo>> streamVideo; if (currentStream) streamVideo = std::dynamic_pointer_cast<CDemuxStreamClientInternalTpl<CDemuxStreamVideo>>(currentStream); if (forceInit || !streamVideo || streamVideo->codec != source->codec) { streamVideo.reset(new CDemuxStreamClientInternalTpl<CDemuxStreamVideo>()); streamVideo->m_parser = av_parser_init(source->codec); if (streamVideo->m_parser) streamVideo->m_parser->flags |= PARSER_FLAG_COMPLETE_FRAMES; streamVideo->iHeight = source->iHeight; streamVideo->iWidth = source->iWidth; } streamVideo->iFpsScale = source->iFpsScale; streamVideo->iFpsRate = source->iFpsRate; streamVideo->fAspect = source->fAspect; streamVideo->iBitRate = source->iBitRate; if (source->ExtraSize > 0 && source->ExtraData) { delete[] streamVideo->ExtraData; streamVideo->ExtraData = new uint8_t[source->ExtraSize]; streamVideo->ExtraSize = source->ExtraSize; for (unsigned int j=0; j<source->ExtraSize; j++) streamVideo->ExtraData[j] = source->ExtraData[j]; } streamVideo->m_parser_split = true; streamVideo->changes++; map[stream->uniqueId] = streamVideo; toStream = streamVideo; } else if (stream->type == STREAM_SUBTITLE) { CDemuxStreamSubtitle *source = dynamic_cast<CDemuxStreamSubtitle*>(stream); if (!source) { CLog::Log(LOGERROR, "CDVDDemuxClient::RequestStream - invalid subtitle stream with id %d", stream->uniqueId); DisposeStreams(); return; } std::shared_ptr<CDemuxStreamClientInternalTpl<CDemuxStreamSubtitle>> streamSubtitle; if (currentStream) streamSubtitle = std::dynamic_pointer_cast<CDemuxStreamClientInternalTpl<CDemuxStreamSubtitle>>(currentStream); if (!streamSubtitle || streamSubtitle->codec != source->codec) { streamSubtitle.reset(new CDemuxStreamClientInternalTpl<CDemuxStreamSubtitle>()); streamSubtitle->m_parser = av_parser_init(source->codec); if (streamSubtitle->m_parser) streamSubtitle->m_parser->flags |= PARSER_FLAG_COMPLETE_FRAMES; } if (source->ExtraSize == 4) { delete[] streamSubtitle->ExtraData; streamSubtitle->ExtraData = new uint8_t[4]; streamSubtitle->ExtraSize = 4; for (int j=0; j<4; j++) streamSubtitle->ExtraData[j] = source->ExtraData[j]; } map[stream->uniqueId] = streamSubtitle; toStream = streamSubtitle; } else if (stream->type == STREAM_TELETEXT) { CDemuxStreamTeletext *source = dynamic_cast<CDemuxStreamTeletext*>(stream); if (!source) { CLog::Log(LOGERROR, "CDVDDemuxClient::RequestStream - invalid teletext stream with id %d", stream->uniqueId); DisposeStreams(); return; } std::shared_ptr<CDemuxStreamClientInternalTpl<CDemuxStreamTeletext>> streamTeletext; if (currentStream) streamTeletext = std::dynamic_pointer_cast<CDemuxStreamClientInternalTpl<CDemuxStreamTeletext>>(currentStream); if (!streamTeletext || streamTeletext->codec != source->codec) { streamTeletext.reset(new CDemuxStreamClientInternalTpl<CDemuxStreamTeletext>()); } map[stream->uniqueId] = streamTeletext; toStream = streamTeletext; } else if (stream->type == STREAM_RADIO_RDS) { CDemuxStreamRadioRDS *source = dynamic_cast<CDemuxStreamRadioRDS*>(stream); if (!source) { CLog::Log(LOGERROR, "CDVDDemuxClient::RequestStream - invalid radio-rds stream with id %d", stream->uniqueId); DisposeStreams(); return; } std::shared_ptr<CDemuxStreamClientInternalTpl<CDemuxStreamRadioRDS>> streamRDS; if (currentStream) streamRDS = std::dynamic_pointer_cast<CDemuxStreamClientInternalTpl<CDemuxStreamRadioRDS>>(currentStream); if (!streamRDS || streamRDS->codec != source->codec) { streamRDS.reset(new CDemuxStreamClientInternalTpl<CDemuxStreamRadioRDS>()); } map[stream->uniqueId] = streamRDS; toStream = streamRDS; } else { std::shared_ptr<CDemuxStreamClientInternalTpl<CDemuxStream>> streamGen; streamGen = std::make_shared<CDemuxStreamClientInternalTpl<CDemuxStream>>(); map[stream->uniqueId] = streamGen; toStream = streamGen; } // only update profile / level if we create a new stream // existing streams may be corrected by ParsePacket if (!currentStream) { toStream->profile = stream->profile; toStream->level = stream->level; } toStream->uniqueId = stream->uniqueId; toStream->codec = stream->codec; toStream->codecName = stream->codecName; toStream->flags = stream->flags; toStream->cryptoSession = stream->cryptoSession; toStream->externalInterfaces = stream->externalInterfaces; toStream->language = stream->language; CLog::Log(LOGDEBUG,"CDVDDemuxClient::RequestStream(): added/updated stream %d with codec_id %d", toStream->uniqueId, toStream->codec); }
void CInputStreamPVRBase::UpdateStreamMap() { std::map<int, std::shared_ptr<CDemuxStream>> newStreamMap; int num = GetNrOfStreams(); for (int i = 0; i < num; ++i) { PVR_STREAM_PROPERTIES::PVR_STREAM stream = m_StreamProps->stream[i]; std::shared_ptr<CDemuxStream> dStream = GetStreamInternal(stream.iPID); if (stream.iCodecType == XBMC_CODEC_TYPE_AUDIO) { std::shared_ptr<CDemuxStreamAudio> streamAudio; if (dStream) streamAudio = std::dynamic_pointer_cast<CDemuxStreamAudio>(dStream); if (!streamAudio) streamAudio = std::make_shared<CDemuxStreamAudio>(); streamAudio->iChannels = stream.iChannels; streamAudio->iSampleRate = stream.iSampleRate; streamAudio->iBlockAlign = stream.iBlockAlign; streamAudio->iBitRate = stream.iBitRate; streamAudio->iBitsPerSample = stream.iBitsPerSample; dStream = streamAudio; } else if (stream.iCodecType == XBMC_CODEC_TYPE_VIDEO) { std::shared_ptr<CDemuxStreamVideo> streamVideo; if (dStream) streamVideo = std::dynamic_pointer_cast<CDemuxStreamVideo>(dStream); if (!streamVideo) streamVideo = std::make_shared<CDemuxStreamVideo>(); streamVideo->iFpsScale = stream.iFPSScale; streamVideo->iFpsRate = stream.iFPSRate; streamVideo->iHeight = stream.iHeight; streamVideo->iWidth = stream.iWidth; streamVideo->fAspect = stream.fAspect; dStream = streamVideo; } else if (stream.iCodecId == AV_CODEC_ID_DVB_TELETEXT) { std::shared_ptr<CDemuxStreamTeletext> streamTeletext; if (dStream) streamTeletext = std::dynamic_pointer_cast<CDemuxStreamTeletext>(dStream); if (!streamTeletext) streamTeletext = std::make_shared<CDemuxStreamTeletext>(); dStream = streamTeletext; } else if (stream.iCodecType == XBMC_CODEC_TYPE_SUBTITLE) { std::shared_ptr<CDemuxStreamSubtitle> streamSubtitle; if (dStream) streamSubtitle = std::dynamic_pointer_cast<CDemuxStreamSubtitle>(dStream); if (!streamSubtitle) streamSubtitle = std::make_shared<CDemuxStreamSubtitle>(); if (stream.iSubtitleInfo) { streamSubtitle->ExtraData = new uint8_t[4]; streamSubtitle->ExtraSize = 4; streamSubtitle->ExtraData[0] = (stream.iSubtitleInfo >> 8) & 0xff; streamSubtitle->ExtraData[1] = (stream.iSubtitleInfo >> 0) & 0xff; streamSubtitle->ExtraData[2] = (stream.iSubtitleInfo >> 24) & 0xff; streamSubtitle->ExtraData[3] = (stream.iSubtitleInfo >> 16) & 0xff; } dStream = streamSubtitle; }