diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2010-06-26 13:39:33 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2010-06-26 13:39:33 +0000 |
| commit | 7d1adda602644eb3030a3ccf5b3506c339f67b3f (patch) | |
| tree | 13909ed73d3fb91ee52d3457866cc9c6206b9c86 /src/plugins/Input | |
| parent | 7f4352dd9796ace45eaaee3b065bfaeb285eb363 (diff) | |
| download | qmmp-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')
| -rw-r--r-- | src/plugins/Input/ffmpeg/decoder_ffmpeg.cpp | 19 |
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; } } } |
