--- src/arch/MovieTexture/MovieTexture_FFMpeg.cpp.ori 2005-12-29 16:54:24.744730500 +0100 +++ src/arch/MovieTexture/MovieTexture_FFMpeg.cpp 2005-12-29 16:56:23.100127250 +0100 @@ -307,7 +307,11 @@ if ( GetNextTimestamp ) { if (pkt.dts != int64_t(AV_NOPTS_VALUE)) +#if (LIBAVCODEC_BUILD >= 4754) + pts = (float)pkt.dts * m_stream->time_base.num / m_stream->time_base.den; +#else pts = (float)pkt.dts / AV_TIME_BASE; +#endif else pts = -1; GetNextTimestamp = false; @@ -326,7 +326,11 @@ * to give it a buffer to read from since it tries to read anyway. */ static uint8_t dummy[FF_INPUT_BUFFER_PADDING_SIZE] = { 0 }; int len = avcodec::avcodec_decode_video( +#if (LIBAVCODEC_BUILD >= 4754) + m_stream->codec, +#else &m_stream->codec, +#endif &frame, &got_frame, pkt.size? pkt.data:dummy, pkt.size ); CHECKPOINT; @@ -360,7 +364,11 @@ } /* Length of this frame: */ +#if (LIBAVCODEC_BUILD >= 4754) + LastFrameDelay = (float)m_stream->codec->time_base.num / m_stream->codec->time_base.den; +#else LastFrameDelay = (float)m_stream->codec.frame_rate_base / m_stream->codec.frame_rate; +#endif LastFrameDelay += frame.repeat_pict * (LastFrameDelay * 0.5f); return 1; @@ -377,9 +385,15 @@ pict.data[0] = (unsigned char *)m_img->pixels; pict.linesize[0] = m_img->pitch; +#if (LIBAVCODEC_BUILD >= 4754) + avcodec::img_convert(&pict, AVPixelFormats[m_AVTexfmt].pf, + (avcodec::AVPicture *) &decoder->frame, decoder->m_stream->codec->pix_fmt, + decoder->m_stream->codec->width, decoder->m_stream->codec->height); +#else avcodec::img_convert(&pict, AVPixelFormats[m_AVTexfmt].pf, (avcodec::AVPicture *) &decoder->frame, decoder->m_stream->codec.pix_fmt, decoder->m_stream->codec.width, decoder->m_stream->codec.height); +#endif m_ImageWaiting = FRAME_WAITING; } @@ -389,8 +403,13 @@ for( int stream = 0; stream < m_fctx->nb_streams; ++stream ) { avcodec::AVStream *enc = m_fctx->streams[stream]; +#if (LIBAVCODEC_BUILD >= 4754) + if( enc->codec->codec_type == avcodec::CODEC_TYPE_VIDEO ) + return enc; +#else if( enc->codec.codec_type == avcodec::CODEC_TYPE_VIDEO ) return enc; +#endif } return NULL; } @@ -418,8 +437,13 @@ m_bThreaded = PREFSMAN->m_bThreadedMovieDecode; CreateDecoder(); +#if (LIBAVCODEC_BUILD >= 4754) + LOG->Trace("Bitrate: %i", decoder->m_stream->codec->bit_rate ); + LOG->Trace("Codec pixel format: %s", avcodec::avcodec_get_pix_fmt_name(decoder->m_stream->codec->pix_fmt) ); +#else LOG->Trace("Bitrate: %i", decoder->m_stream->codec.bit_rate ); LOG->Trace("Codec pixel format: %s", avcodec::avcodec_get_pix_fmt_name(decoder->m_stream->codec.pix_fmt) ); +#endif /* Decode one frame, to guarantee that the texture is drawn when this function returns. */ int ret = decoder->GetFrame(); @@ -573,6 +597,17 @@ if ( stream == NULL ) RageException::Throw( "AVCodec (%s): Couldn't find any video streams", GetID().filename.c_str() ); +#if (LIBAVCODEC_BUILD >= 4754) + if( stream->codec->codec_id == avcodec::CODEC_ID_NONE ) + RageException::ThrowNonfatal( "AVCodec (%s): Unsupported codec %08x", GetID().filename.c_str(), stream->codec->codec_tag ); + + avcodec::AVCodec *codec = avcodec::avcodec_find_decoder( stream->codec->codec_id ); + if( codec == NULL ) + RageException::Throw( "AVCodec (%s): Couldn't find decoder %i", GetID().filename.c_str(), stream->codec->codec_id ); + + LOG->Trace("Opening codec %s", codec->name ); + ret = avcodec::avcodec_open( stream->codec, codec ); +#else if( stream->codec.codec_id == avcodec::CODEC_ID_NONE ) RageException::ThrowNonfatal( "AVCodec (%s): Unsupported codec %08x", GetID().filename.c_str(), stream->codec.codec_tag ); @@ -582,6 +617,7 @@ LOG->Trace("Opening codec %s", codec->name ); ret = avcodec::avcodec_open( &stream->codec, codec ); +#endif if ( ret < 0 ) RageException::Throw( averr_ssprintf(ret, "AVCodec (%s): Couldn't open codec \"%s\"", GetID().filename.c_str(), codec->name) ); @@ -596,7 +632,11 @@ { if( decoder->m_stream ) { +#if (LIBAVCODEC_BUILD >= 4754) + avcodec::avcodec_close( decoder->m_stream->codec ); +#else avcodec::avcodec_close( &decoder->m_stream->codec ); +#endif decoder->m_stream = NULL; } @@ -637,8 +677,13 @@ /* Cap the max texture size to the hardware max. */ actualID.iMaxSize = min( actualID.iMaxSize, DISPLAY->GetMaxTextureSize() ); +#if (LIBAVCODEC_BUILD >= 4754) + m_iSourceWidth = decoder->m_stream->codec->width; + m_iSourceHeight = decoder->m_stream->codec->height; +#else m_iSourceWidth = decoder->m_stream->codec.width; m_iSourceHeight = decoder->m_stream->codec.height; +#endif /* image size cannot exceed max size */ m_iImageWidth = min( m_iSourceWidth, actualID.iMaxSize ); @@ -818,7 +863,11 @@ m_FrameSkipMode = true; } +#if (LIBAVCODEC_BUILD >= 4754) + if( m_FrameSkipMode && decoder->m_stream->codec->frame_number % 2 ) +#else if( m_FrameSkipMode && decoder->m_stream->codec.frame_number % 2 ) +#endif return -1; /* skip */ return 0;