Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
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);
}
Ejemplo n.º 3
0
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;
    }