diff options
Diffstat (limited to 'src/plugins/Input/ffmpeg')
| -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) { |
