aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRainer Hochecker <fernetmenta@online.de>2014-01-11 12:26:26 +0100
committerRainer Hochecker <fernetmenta@online.de>2014-01-12 18:50:55 +0100
commitac9c144bec5eaef9aadac17b43c3f918202442b3 (patch)
tree907437a1fd20f0b0da96a81c4eec2e9a9ff22016
parent756598be794ffd724ff03219cff9439353f6170f (diff)
dvdplayer audio: fix invalid format after 5852fd70705b7c23141b1672a24d83d61efac591
-rw-r--r--xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg.cpp25
-rw-r--r--xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg.h3
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;