aboutsummaryrefslogtreecommitdiff
path: root/src/plugins/Input/ffmpeg
diff options
context:
space:
mode:
authortrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2010-06-26 13:39:33 +0000
committertrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2010-06-26 13:39:33 +0000
commit7d1adda602644eb3030a3ccf5b3506c339f67b3f (patch)
tree13909ed73d3fb91ee52d3457866cc9c6206b9c86 /src/plugins/Input/ffmpeg
parent7f4352dd9796ace45eaaee3b065bfaeb285eb363 (diff)
downloadqmmp-7d1adda602644eb3030a3ccf5b3506c339f67b3f.tar.gz
qmmp-7d1adda602644eb3030a3ccf5b3506c339f67b3f.tar.bz2
qmmp-7d1adda602644eb3030a3ccf5b3506c339f67b3f.zip
ffmpeg plugin: fixed shorten support, fixed freezes on corrupted files
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@1786 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src/plugins/Input/ffmpeg')
-rw-r--r--src/plugins/Input/ffmpeg/decoder_ffmpeg.cpp19
1 files changed, 12 insertions, 7 deletions
diff --git a/src/plugins/Input/ffmpeg/decoder_ffmpeg.cpp b/src/plugins/Input/ffmpeg/decoder_ffmpeg.cpp
index 03e86c636..f770480bc 100644
--- a/src/plugins/Input/ffmpeg/decoder_ffmpeg.cpp
+++ b/src/plugins/Input/ffmpeg/decoder_ffmpeg.cpp
@@ -172,6 +172,11 @@ bool DecoderFFmpeg::initialize()
m_totalTime = input()->isSequential() ? 0 : ic->duration * 1000 / AV_TIME_BASE;
m_output_buf = (uint8_t *)av_malloc(AVCODEC_MAX_AUDIO_FRAME_SIZE * 3 / 2 + QMMP_BUFFER_SIZE);
+#if (LIBAVCODEC_VERSION_INT >= ((52<<16)+(20<<8)+0))
+ if(c->codec_id == CODEC_ID_SHORTEN) //ffmpeg bug workaround
+ m_totalTime = 0;
+#endif
+
configure(c->sample_rate, c->channels, Qmmp::PCM_S16LE);
m_bitrate = c->bit_rate;
qDebug("DecoderFFmpeg: initialize succes");
@@ -191,6 +196,7 @@ int DecoderFFmpeg::bitrate()
qint64 DecoderFFmpeg::read(char *audio, qint64 maxSize)
{
+ qDebug("read");
m_skipBytes = 0;
if (m_skip)
{
@@ -286,6 +292,8 @@ void DecoderFFmpeg::fillBuffer()
while (m_skipBytes > 0)
{
m_output_at = ffmpeg_decode(m_output_buf);
+ if(m_output_at < 0)
+ break;
m_skipBytes -= m_output_at;
}
@@ -302,18 +310,15 @@ void DecoderFFmpeg::fillBuffer()
#else
m_output_at = ffmpeg_decode(m_output_buf);
#endif
-
if(m_output_at < 0)
{
- m_output_at = 0;
- m_temp_pkt.size = 0;
- continue;
- }
- else if(m_output_at == 0)
- {
+ qWarning("DecoderFFmpeg: decoder error");
if(m_pkt.data)
av_free_packet(&m_pkt);
+ m_pkt.data = 0;
m_temp_pkt.size = 0;
+ m_output_at = 0;
+ break;
}
}
}