diff options
author | Rainer Hochecker <fernetmenta@online.de> | 2014-01-11 12:26:26 +0100 |
---|---|---|
committer | Rainer Hochecker <fernetmenta@online.de> | 2014-01-12 18:50:55 +0100 |
commit | ac9c144bec5eaef9aadac17b43c3f918202442b3 (patch) | |
tree | 907437a1fd20f0b0da96a81c4eec2e9a9ff22016 | |
parent | 756598be794ffd724ff03219cff9439353f6170f (diff) |
dvdplayer audio: fix invalid format after 5852fd70705b7c23141b1672a24d83d61efac591
-rw-r--r-- | xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg.cpp | 25 | ||||
-rw-r--r-- | xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg.h | 3 |
2 files changed, 19 insertions, 9 deletions
diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg.cpp index 9e31d6c814..d1327783c7 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg.cpp +++ b/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg.cpp @@ -46,7 +46,6 @@ CDVDAudioCodecFFmpeg::CDVDAudioCodecFFmpeg() : CDVDAudioCodec() m_layout = 0; m_bLpcmMode = false; - m_bNeedConversion = false; m_pFrame1 = NULL; m_iSampleFormat = AV_SAMPLE_FMT_NONE; @@ -118,8 +117,6 @@ bool CDVDAudioCodecFFmpeg::Open(CDVDStreamInfo &hints, CDVDCodecOptions &options m_bOpenedCodec = true; m_iSampleFormat = AV_SAMPLE_FMT_NONE; - // check if conversion is needed - GetDataFormat(); return true; } @@ -185,8 +182,23 @@ int CDVDAudioCodecFFmpeg::Decode(uint8_t* pData, int iSize) m_iBuffered += iBytesUsed; else m_iBuffered = 0; - - if(m_bLpcmMode || m_bNeedConversion) + + bool convert = false; + switch(m_pCodecContext->sample_fmt) + { + case AV_SAMPLE_FMT_U8: + case AV_SAMPLE_FMT_S16: + case AV_SAMPLE_FMT_S32: + case AV_SAMPLE_FMT_FLT: + case AV_SAMPLE_FMT_DBL: + break; + case AV_SAMPLE_FMT_NONE: + CLog::Log(LOGERROR, "CDVDAudioCodecFFmpeg::Decode - invalid data format"); + return -1; + default: + convert = true; + } + if(m_bLpcmMode || convert) ConvertToFloat(); return iBytesUsed; @@ -312,10 +324,9 @@ enum AEDataFormat CDVDAudioCodecFFmpeg::GetDataFormat() case AV_SAMPLE_FMT_FLT: return AE_FMT_FLOAT; case AV_SAMPLE_FMT_DBL: return AE_FMT_DOUBLE; case AV_SAMPLE_FMT_NONE: - assert(false); + CLog::Log(LOGERROR, "CDVDAudioCodecFFmpeg::GetDataFormat - invalid data format"); return AE_FMT_INVALID; default: - m_bNeedConversion = true; return AE_FMT_FLOAT; } } diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg.h b/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg.h index 3028b246f9..ab461ab16b 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg.h +++ b/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg.h @@ -50,8 +50,7 @@ protected: SwrContext* m_pConvert; enum AVSampleFormat m_iSampleFormat; CAEChannelInfo m_channelLayout; - bool m_bLpcmMode; - bool m_bNeedConversion; + bool m_bLpcmMode; AVFrame* m_pFrame1; int m_iBufferSize1; |