diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2010-10-25 17:52:19 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2010-10-25 17:52:19 +0000 |
| commit | b6c6470b519a772b914773e71efd06abf76897e2 (patch) | |
| tree | 0dff44c4f4e0a73e308913afb9178cfd6734f881 /src | |
| parent | 5d26f92234abb6ce1f5bd13ef4ea5523d319a359 (diff) | |
| download | qmmp-b6c6470b519a772b914773e71efd06abf76897e2.tar.gz qmmp-b6c6470b519a772b914773e71efd06abf76897e2.tar.bz2 qmmp-b6c6470b519a772b914773e71efd06abf76897e2.zip | |
fixed aac streams support, fixed ape noise while seeking
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@1953 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src')
| -rw-r--r-- | src/plugins/Input/ffmpeg/decoder_ffmpeg.cpp | 30 |
1 files changed, 21 insertions, 9 deletions
diff --git a/src/plugins/Input/ffmpeg/decoder_ffmpeg.cpp b/src/plugins/Input/ffmpeg/decoder_ffmpeg.cpp index 988d534d4..39f9d5ba8 100644 --- a/src/plugins/Input/ffmpeg/decoder_ffmpeg.cpp +++ b/src/plugins/Input/ffmpeg/decoder_ffmpeg.cpp @@ -60,7 +60,6 @@ static int64_t ffmpeg_seek(void *data, int64_t offset, int whence) return d->input()->seek(absolute_pos); } - // Decoder class DecoderFFmpeg::DecoderFFmpeg(const QString &path, QIODevice *i) @@ -169,7 +168,7 @@ 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*/); + m_output_buf = (uint8_t *)av_malloc(AVCODEC_MAX_AUDIO_FRAME_SIZE*2); #if (LIBAVCODEC_VERSION_INT >= ((52<<16)+(20<<8)+0)) if(c->codec_id == CODEC_ID_SHORTEN) //ffmpeg bug workaround @@ -210,13 +209,13 @@ qint64 DecoderFFmpeg::read(char *audio, qint64 maxSize) qint64 len = qMin(m_output_at, maxSize); memcpy(audio, m_output_buf, len); m_output_at -= len; - memmove(m_output_buf, m_output_buf + len, m_output_at-m_skipBytes); + memmove(m_output_buf, m_output_buf + len, m_output_at); return len; } qint64 DecoderFFmpeg::ffmpeg_decode(uint8_t *audio) { - int out_size = AVCODEC_MAX_AUDIO_FRAME_SIZE * sizeof(int16_t); + int out_size = AVCODEC_MAX_AUDIO_FRAME_SIZE * 2; if((m_pkt.stream_index == wma_idx)) { #if (LIBAVCODEC_VERSION_INT >= ((52<<16)+(23<<8)+0)) @@ -237,7 +236,7 @@ qint64 DecoderFFmpeg::ffmpeg_decode(uint8_t *audio) } void DecoderFFmpeg::seek(qint64 pos) -{ +{ int64_t timestamp = int64_t(pos)*AV_TIME_BASE/1000; if (ic->start_time != (qint64)AV_NOPTS_VALUE) timestamp += ic->start_time; @@ -297,9 +296,10 @@ void DecoderFFmpeg::fillBuffer() if(m_skipBytes < 0) { + qint64 size = m_output_at; m_output_at = - m_skipBytes; m_output_at = m_output_at/4*4; - memmove(m_output_buf, m_output_buf + m_output_at, m_output_at); + memmove(m_output_buf, (m_output_buf + size - m_output_at), m_output_at); m_skipBytes = 0; } } @@ -310,12 +310,24 @@ void DecoderFFmpeg::fillBuffer() #endif if(m_output_at < 0) { - qWarning("DecoderFFmpeg: decoder error"); + m_output_at = 0; + m_temp_pkt.size = 0; +#if (LIBAVCODEC_VERSION_INT >= ((52<<16)+(20<<8)+0)) + if(c->codec_id == CODEC_ID_SHORTEN) + { + if(m_pkt.data) + av_free_packet(&m_pkt); + m_pkt.data = 0; + break; + } +#endif + continue; + } + else if(m_output_at == 0) + { if(m_pkt.data) av_free_packet(&m_pkt); m_pkt.data = 0; - m_temp_pkt.size = 0; - m_output_at = 0; break; } } |
