FFMpeg: Fix uninitialized AVFrame, which led to crashes with recent version of libav and ffmpeg

This commit is contained in:
Vincent Laviron
2014-04-03 17:28:13 +02:00
parent 914ad876ae
commit 84903fce25
2 changed files with 10 additions and 6 deletions
@@ -112,6 +112,7 @@ MovieDecoder_FFMpeg::MovieDecoder_FFMpeg()
m_fctx = NULL; m_fctx = NULL;
m_pStream = NULL; m_pStream = NULL;
m_iCurrentPacketOffset = -1; m_iCurrentPacketOffset = -1;
m_Frame = avcodec::av_frame_alloc();
Init(); Init();
} }
@@ -139,6 +140,7 @@ MovieDecoder_FFMpeg::~MovieDecoder_FFMpeg()
{ {
avcodec::av_free(m_buffer); avcodec::av_free(m_buffer);
} }
avcodec::av_frame_free(&m_Frame);
} }
void MovieDecoder_FFMpeg::Init() void MovieDecoder_FFMpeg::Init()
@@ -267,7 +269,7 @@ int MovieDecoder_FFMpeg::DecodePacket( float fTargetTime )
m_Packet.data = m_Packet.size ? m_Packet.data : NULL; m_Packet.data = m_Packet.size ? m_Packet.data : NULL;
int len = avcodec::avcodec_decode_video2( int len = avcodec::avcodec_decode_video2(
m_pStream->codec, m_pStream->codec,
&m_Frame, &iGotFrame, m_Frame, &iGotFrame,
&m_Packet ); &m_Packet );
CHECKPOINT; CHECKPOINT;
@@ -286,9 +288,9 @@ int MovieDecoder_FFMpeg::DecodePacket( float fTargetTime )
continue; continue;
} }
if( m_Frame.pkt_dts != AV_NOPTS_VALUE ) if( m_Frame->pkt_dts != AV_NOPTS_VALUE )
{ {
m_fTimestamp = (float) (m_Frame.pkt_dts * av_q2d(m_pStream->time_base)); m_fTimestamp = (float) (m_Frame->pkt_dts * av_q2d(m_pStream->time_base));
} }
else else
{ {
@@ -299,7 +301,7 @@ int MovieDecoder_FFMpeg::DecodePacket( float fTargetTime )
/* Length of this frame: */ /* Length of this frame: */
m_fLastFrameDelay = (float) av_q2d(m_pStream->time_base); m_fLastFrameDelay = (float) av_q2d(m_pStream->time_base);
m_fLastFrameDelay += m_Frame.repeat_pict * (m_fLastFrameDelay * 0.5f); m_fLastFrameDelay += m_Frame->repeat_pict * (m_fLastFrameDelay * 0.5f);
++m_iFrameNumber; ++m_iFrameNumber;
@@ -350,7 +352,7 @@ void MovieDecoder_FFMpeg::GetFrame( RageSurface *pSurface )
} }
avcodec::sws_scale( m_swsctx, avcodec::sws_scale( m_swsctx,
m_Frame.data, m_Frame.linesize, 0, GetHeight(), m_Frame->data, m_Frame->linesize, 0, GetHeight(),
pict.data, pict.linesize ); pict.data, pict.linesize );
} }
+3 -1
View File
@@ -11,8 +11,10 @@ namespace avcodec
extern "C" extern "C"
{ {
#include <libavformat/avformat.h> #include <libavformat/avformat.h>
#include <libavcodec/avcodec.h>
#include <libswscale/swscale.h> #include <libswscale/swscale.h>
#include <libavutil/pixdesc.h> #include <libavutil/pixdesc.h>
#include <libavutil/frame.h>
} }
}; };
@@ -63,7 +65,7 @@ private:
int DecodePacket( float fTargetTime ); int DecodePacket( float fTargetTime );
avcodec::AVStream *m_pStream; avcodec::AVStream *m_pStream;
avcodec::AVFrame m_Frame; avcodec::AVFrame *m_Frame;
avcodec::PixelFormat m_AVTexfmt; /* PixelFormat of output surface */ avcodec::PixelFormat m_AVTexfmt; /* PixelFormat of output surface */
avcodec::SwsContext *m_swsctx; avcodec::SwsContext *m_swsctx;