From 84903fce2548688ac47cb8b2d98e5876e3e55142 Mon Sep 17 00:00:00 2001 From: Vincent Laviron Date: Thu, 3 Apr 2014 17:28:13 +0200 Subject: [PATCH] FFMpeg: Fix uninitialized AVFrame, which led to crashes with recent version of libav and ffmpeg --- src/arch/MovieTexture/MovieTexture_FFMpeg.cpp | 12 +++++++----- src/arch/MovieTexture/MovieTexture_FFMpeg.h | 4 +++- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/arch/MovieTexture/MovieTexture_FFMpeg.cpp b/src/arch/MovieTexture/MovieTexture_FFMpeg.cpp index 51cfbd5924..7c5b26f969 100644 --- a/src/arch/MovieTexture/MovieTexture_FFMpeg.cpp +++ b/src/arch/MovieTexture/MovieTexture_FFMpeg.cpp @@ -112,6 +112,7 @@ MovieDecoder_FFMpeg::MovieDecoder_FFMpeg() m_fctx = NULL; m_pStream = NULL; m_iCurrentPacketOffset = -1; + m_Frame = avcodec::av_frame_alloc(); Init(); } @@ -139,6 +140,7 @@ MovieDecoder_FFMpeg::~MovieDecoder_FFMpeg() { avcodec::av_free(m_buffer); } + avcodec::av_frame_free(&m_Frame); } void MovieDecoder_FFMpeg::Init() @@ -267,7 +269,7 @@ int MovieDecoder_FFMpeg::DecodePacket( float fTargetTime ) m_Packet.data = m_Packet.size ? m_Packet.data : NULL; int len = avcodec::avcodec_decode_video2( m_pStream->codec, - &m_Frame, &iGotFrame, + m_Frame, &iGotFrame, &m_Packet ); CHECKPOINT; @@ -286,9 +288,9 @@ int MovieDecoder_FFMpeg::DecodePacket( float fTargetTime ) 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 { @@ -299,7 +301,7 @@ int MovieDecoder_FFMpeg::DecodePacket( float fTargetTime ) /* Length of this frame: */ 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; @@ -350,7 +352,7 @@ void MovieDecoder_FFMpeg::GetFrame( RageSurface *pSurface ) } 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 ); } diff --git a/src/arch/MovieTexture/MovieTexture_FFMpeg.h b/src/arch/MovieTexture/MovieTexture_FFMpeg.h index 0c017d8e2f..96b4437ab4 100644 --- a/src/arch/MovieTexture/MovieTexture_FFMpeg.h +++ b/src/arch/MovieTexture/MovieTexture_FFMpeg.h @@ -11,8 +11,10 @@ namespace avcodec extern "C" { #include + #include #include #include + #include } }; @@ -63,7 +65,7 @@ private: int DecodePacket( float fTargetTime ); avcodec::AVStream *m_pStream; - avcodec::AVFrame m_Frame; + avcodec::AVFrame *m_Frame; avcodec::PixelFormat m_AVTexfmt; /* PixelFormat of output surface */ avcodec::SwsContext *m_swsctx;