aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2019-11-02 17:15:22 +0000
committertrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2019-11-02 17:15:22 +0000
commita52f165675d244a4e01c583ec44fd40a1cc127d1 (patch)
treeba39720b1b25f5dfadccf4d5fe792c2009e0d801
parent877403342c0352bc52d934c787b4e6d251855727 (diff)
downloadqmmp-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.cpp44
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)
{