FFMpeg: Fix uninitialized AVFrame, which led to crashes with recent version of libav and ffmpeg
This commit is contained in:
@@ -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 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user