bool DVDPlayerCodec::Init(const CStdString &strFile, unsigned int filecache) { m_decoded = NULL;; m_nDecodedLen = 0; CStdString strFileToOpen = strFile; CURL urlFile(strFile); if (urlFile.GetProtocol() == "shout" ) strFileToOpen.Replace("shout://","http://"); m_pInputStream = CDVDFactoryInputStream::CreateInputStream(NULL, strFileToOpen, m_strContentType); if (!m_pInputStream) { CLog::Log(LOGERROR, "%s: Error creating input stream for %s", __FUNCTION__, strFileToOpen.c_str()); return false; } if (!m_pInputStream->Open(strFileToOpen.c_str(), m_strContentType)) { CLog::Log(LOGERROR, "%s: Error opening file %s", __FUNCTION__, strFileToOpen.c_str()); if (m_pInputStream) delete m_pInputStream; m_pInputStream = NULL; return false; } m_pDemuxer = NULL; try { m_pDemuxer = CDVDFactoryDemuxer::CreateDemuxer(m_pInputStream); if (!m_pDemuxer) { delete m_pInputStream; m_pInputStream = NULL; CLog::Log(LOGERROR, "%s: Error creating demuxer", __FUNCTION__); return false; } } catch(...) { CLog::Log(LOGERROR, "%s: Exception thrown when opeing demuxer", __FUNCTION__); if (m_pDemuxer) { delete m_pDemuxer; m_pDemuxer = NULL; } delete m_pInputStream; m_pInputStream = NULL; return false; } CDemuxStream* pStream = NULL; m_nAudioStream = -1; for (int i = 0; i < m_pDemuxer->GetNrOfStreams(); i++) { pStream = m_pDemuxer->GetStream(i); if (pStream && pStream->type == STREAM_AUDIO) { m_nAudioStream = i; break; } } if (m_nAudioStream == -1) { CLog::Log(LOGERROR, "%s: Could not find audio stream", __FUNCTION__); delete m_pDemuxer; m_pDemuxer = NULL; delete m_pInputStream; m_pInputStream = NULL; return false; } CDVDStreamInfo hint(*pStream, true); bool passthrough = AUDIO_IS_BITSTREAM(g_guiSettings.GetInt("audiooutput.mode")); m_pAudioCodec = CDVDFactoryCodec::CreateAudioCodec(hint, passthrough); if (!m_pAudioCodec) { CLog::Log(LOGERROR, "%s: Could not create audio codec", __FUNCTION__); delete m_pDemuxer; m_pDemuxer = NULL; delete m_pInputStream; m_pInputStream = NULL; return false; } // we have to decode initial data in order to get channels/samplerate // for sanity - we read no more than 10 packets int nErrors = 0; for (int nPacket=0; nPacket < 10 && (m_Channels == 0 || m_SampleRate == 0); nPacket++) { BYTE dummy[256]; int nSize = 256; if (ReadPCM(dummy, nSize, &nSize) == READ_ERROR) ++nErrors; m_DataFormat = m_pAudioCodec->GetDataFormat(); m_BitsPerSample = CAEUtil::DataFormatToBits(m_DataFormat); m_SampleRate = m_pAudioCodec->GetSampleRate(); m_EncodedSampleRate = m_pAudioCodec->GetEncodedSampleRate(); m_Channels = m_pAudioCodec->GetChannels(); m_ChannelInfo = m_pAudioCodec->GetChannelMap(); } if (nErrors >= 10) { CLog::Log(LOGDEBUG, "%s: Could not decode data", __FUNCTION__); return false; } m_nDecodedLen = 0; if (m_Channels == 0) // no data - just guess and hope for the best m_Channels = 2; if (m_SampleRate == 0) m_SampleRate = 44100; m_TotalTime = m_pDemuxer->GetStreamLength(); m_Bitrate = m_pAudioCodec->GetBitRate(); m_pDemuxer->GetStreamCodecName(m_nAudioStream,m_CodecName); return true; }
bool DVDPlayerCodec::Init(const CStdString &strFile, unsigned int filecache) { // take precaution if Init()ialized earlier if (m_bInited) { // keep things as is if Init() was done with known strFile if (m_strFileName == strFile) return true; // got differing filename, so cleanup before starting over DeInit(); } m_decoded = NULL; m_nDecodedLen = 0; CStdString strFileToOpen = strFile; CURL urlFile(strFile); if (urlFile.GetProtocol() == "shout" ) strFileToOpen.replace(0, 8, "http://"); m_pInputStream = CDVDFactoryInputStream::CreateInputStream(NULL, strFileToOpen, m_strContentType); if (!m_pInputStream) { CLog::Log(LOGERROR, "%s: Error creating input stream for %s", __FUNCTION__, strFileToOpen.c_str()); return false; } if (!m_pInputStream->Open(strFileToOpen.c_str(), m_strContentType)) { CLog::Log(LOGERROR, "%s: Error opening file %s", __FUNCTION__, strFileToOpen.c_str()); if (m_pInputStream) delete m_pInputStream; m_pInputStream = NULL; return false; } m_pDemuxer = NULL; try { m_pDemuxer = CDVDFactoryDemuxer::CreateDemuxer(m_pInputStream); if (!m_pDemuxer) { delete m_pInputStream; m_pInputStream = NULL; CLog::Log(LOGERROR, "%s: Error creating demuxer", __FUNCTION__); return false; } } catch(...) { CLog::Log(LOGERROR, "%s: Exception thrown when opening demuxer", __FUNCTION__); if (m_pDemuxer) { delete m_pDemuxer; m_pDemuxer = NULL; } delete m_pInputStream; m_pInputStream = NULL; return false; } CDemuxStream* pStream = NULL; m_nAudioStream = -1; for (int i = 0; i < m_pDemuxer->GetNrOfStreams(); i++) { pStream = m_pDemuxer->GetStream(i); if (pStream && pStream->type == STREAM_AUDIO) { m_nAudioStream = i; break; } } if (m_nAudioStream == -1) { CLog::Log(LOGERROR, "%s: Could not find audio stream", __FUNCTION__); delete m_pDemuxer; m_pDemuxer = NULL; delete m_pInputStream; m_pInputStream = NULL; return false; } CDVDStreamInfo hint(*pStream, true); m_pAudioCodec = CDVDFactoryCodec::CreateAudioCodec(hint); if (!m_pAudioCodec) { CLog::Log(LOGERROR, "%s: Could not create audio codec", __FUNCTION__); delete m_pDemuxer; m_pDemuxer = NULL; delete m_pInputStream; m_pInputStream = NULL; return false; } // Extract ReplayGain info // tagLoaderTagLib.Load will try to determine tag type by file extension, so set fallback by contentType CStdString strFallbackFileExtension = ""; if (m_strContentType.Equals("audio/aacp") || m_strContentType.Equals("audio/aacp" "audio/aac")) strFallbackFileExtension = "m4a"; else if (m_strContentType.Equals("audio/x-ms-wma")) strFallbackFileExtension = "wma"; else if (m_strContentType.Equals("audio/x-ape") || m_strContentType.Equals("audio/ape")) strFallbackFileExtension = "ape"; CTagLoaderTagLib tagLoaderTagLib; tagLoaderTagLib.Load(strFile, m_tag, strFallbackFileExtension); // we have to decode initial data in order to get channels/samplerate // for sanity - we read no more than 10 packets int nErrors = 0; for (int nPacket=0; nPacket < 10 && (m_Channels == 0 || m_SampleRate == 0); nPacket++) { BYTE dummy[256]; int nSize = 256; if (ReadPCM(dummy, nSize, &nSize) == READ_ERROR) ++nErrors; m_DataFormat = m_pAudioCodec->GetDataFormat(); m_BitsPerSample = CAEUtil::DataFormatToBits(m_DataFormat); m_SampleRate = m_pAudioCodec->GetSampleRate(); m_EncodedSampleRate = m_pAudioCodec->GetEncodedSampleRate(); m_Channels = m_pAudioCodec->GetChannels(); m_ChannelInfo = m_pAudioCodec->GetChannelMap(); m_BitsPerCodedSample = static_cast<CDemuxStreamAudio*>(pStream)->iBitsPerSample; } if (nErrors >= 10) { CLog::Log(LOGDEBUG, "%s: Could not decode data", __FUNCTION__); return false; } // test if seeking is supported if (Seek(1) != DVD_NOPTS_VALUE) { // rewind stream to beginning Seek(0); m_bCanSeek = true; } else { m_pInputStream->Seek(0, SEEK_SET); m_pDemuxer->Reset(); m_bCanSeek = false; } if (m_Channels == 0) // no data - just guess and hope for the best m_Channels = 2; if (m_SampleRate == 0) m_SampleRate = 44100; m_TotalTime = m_pDemuxer->GetStreamLength(); m_Bitrate = m_pAudioCodec->GetBitRate(); if (!m_Bitrate && m_TotalTime) { m_Bitrate = (int)(((m_pInputStream->GetLength()*1000) / m_TotalTime) * 8); } m_pDemuxer->GetStreamCodecName(m_nAudioStream,m_CodecName); m_strFileName = strFile; m_bInited = true; return true; }