diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2019-11-02 17:15:22 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2019-11-02 17:15:22 +0000 |
| commit | a52f165675d244a4e01c583ec44fd40a1cc127d1 (patch) | |
| tree | ba39720b1b25f5dfadccf4d5fe792c2009e0d801 | |
| parent | 877403342c0352bc52d934c787b4e6d251855727 (diff) | |
| download | qmmp-a52f165675d244a4e01c583ec44fd40a1cc127d1.tar.gz qmmp-a52f165675d244a4e01c583ec44fd40a1cc127d1.tar.bz2 qmmp-a52f165675d244a4e01c583ec44fd40a1cc127d1.zip | |
fixed crash on corrupted m4a files (#1021)
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@9090 90c681e8-e032-0410-971d-27865f9a5e38
| -rw-r--r-- | src/plugins/Input/ffmpeg/decoder_ffmpeg.cpp | 44 |
1 files changed, 23 insertions, 21 deletions
diff --git a/src/plugins/Input/ffmpeg/decoder_ffmpeg.cpp b/src/plugins/Input/ffmpeg/decoder_ffmpeg.cpp index 1155cddaa..bfa9ebdbd 100644 --- a/src/plugins/Input/ffmpeg/decoder_ffmpeg.cpp +++ b/src/plugins/Input/ffmpeg/decoder_ffmpeg.cpp @@ -388,25 +388,31 @@ qint64 DecoderFFmpeg::ffmpeg_decode() #endif #if (LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(57,48,0)) //ffmpeg-3.1: 57.48.101 - int err = 0; + int send_err = 0, receive_err = 0; + if(m_temp_pkt.data) - err = avcodec_send_packet(c, &m_temp_pkt); - if(err != 0 && err != AVERROR(EAGAIN) && err != AVERROR(EINVAL)) { - qWarning("DecoderFFmpeg: avcodec_send_packet error: %d", err); - return -1; + if((send_err = avcodec_send_packet(c, &m_temp_pkt)) != 0) + { + qWarning("DecoderFFmpeg: avcodec_send_packet error: %d", send_err); + } } - int l = (err == AVERROR(EAGAIN)) ? 0 : m_temp_pkt.size; + int l = (send_err != 0) ? 0 : m_temp_pkt.size; - if((err = avcodec_receive_frame(c, m_decoded_frame)) < 0) + if((receive_err = avcodec_receive_frame(c, m_decoded_frame)) != 0) { - if(err == AVERROR(EAGAIN)) //try again + qWarning("DecoderFFmpeg: avcodec_receive_frame error: %d", receive_err); + if(send_err < 0 && receive_err < 0) + return -1; + + if(receive_err == AVERROR(EAGAIN)) return 0; - qWarning("DecoderFFmpeg: avcodec_receive_frame error: %d", err); - return -1; } - got_frame = m_decoded_frame->pkt_size; + else + { + got_frame = m_decoded_frame->pkt_size; + } #else int l = avcodec_decode_audio4(c, m_decoded_frame, &got_frame, &m_temp_pkt); #endif @@ -531,19 +537,15 @@ void DecoderFFmpeg::fillBuffer() m_output_at = 0; m_temp_pkt.size = 0; - if(c->codec_id == AV_CODEC_ID_SHORTEN || c->codec_id == AV_CODEC_ID_TWINVQ) - { - if(m_pkt.data) + if(m_pkt.data) #if (LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(57,24,102)) //ffmpeg-3.0 - av_packet_unref(&m_pkt); + av_packet_unref(&m_pkt); #else - av_free_packet(&m_pkt); + av_free_packet(&m_pkt); #endif - m_pkt.data = nullptr; - m_temp_pkt.size = 0; - break; - } - continue; + m_pkt.data = nullptr; + m_temp_pkt.size = 0; + break; } else if(m_output_at == 0 && !m_pkt.data) { |
