aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Spencer <baildon.research@googlemail.com>2015-05-27 10:58:53 +0100
committerWilly Sudiarto Raharjo <willysr@slackbuilds.org>2015-06-20 11:55:24 +0700
commitd7cbc3b5cbadafef4a1469de1a8389e3621d6513 (patch)
treea2993e1e1fbaf476b46e79f07081591754a1334f
parent7ec02b8f86f8be27c8191d134c8a8c83bcf1180d (diff)
games/alephone: Patched for ffmpeg-2.6.3.
Signed-off-by: David Spencer <baildon.research@googlemail.com> Signed-off-by: Heinz Wiesinger <pprkut@slackbuilds.org> Signed-off-by: Willy Sudiarto Raharjo <willysr@slackbuilds.org>
-rw-r--r--games/alephone/alephone.SlackBuild8
-rw-r--r--games/alephone/r5009.diff385
-rw-r--r--games/alephone/r5010.diff13
-rw-r--r--games/alephone/r5013.diff14
-rw-r--r--games/alephone/r5033.diff514
-rw-r--r--games/alephone/r5037.diff193
6 files changed, 1127 insertions, 0 deletions
diff --git a/games/alephone/alephone.SlackBuild b/games/alephone/alephone.SlackBuild
index a59807eb1bd7e..73d2a82bb9756 100644
--- a/games/alephone/alephone.SlackBuild
+++ b/games/alephone/alephone.SlackBuild
@@ -58,6 +58,14 @@ find -L . \
# Patch came from ArchLinux AUR, this is the two ffmpeg patches catted
# together.
patch -p1 < $CWD/ffmpeg_api.diff
+# Thanks to John Vogel for these ffmpeg patches:
+patch -p0 < $CWD/r5009.diff
+patch -p0 < $CWD/r5010.diff
+patch -p0 < $CWD/r5013.diff
+patch -p0 < $CWD/r5033.diff
+patch -p0 < $CWD/r5037.diff
+
+autoreconf
[ "${FFMPEG:-yes}" = "no" ] && EXTRAOPT=--disable-ffmpeg
diff --git a/games/alephone/r5009.diff b/games/alephone/r5009.diff
new file mode 100644
index 0000000000000..39f9e648cf078
--- /dev/null
+++ b/games/alephone/r5009.diff
@@ -0,0 +1,385 @@
+Index: Source_Files/Sound/FFmpegDecoder.cpp
+===================================================================
+--- Source_Files/Sound/FFmpegDecoder.cpp (revision 5008)
++++ Source_Files/Sound/FFmpegDecoder.cpp (revision 5009)
+@@ -199,10 +199,13 @@
+
+ while (pkt_temp.size > 0)
+ {
+- AVFrame frame;
+- avcodec_get_frame_defaults(&frame);
++#if LIBAVCODEC_VERSION_INT < AV_VERSION_INT(55,28,0)
++ AVFrame *dframe = avcodec_alloc_frame();
++#else
++ AVFrame *dframe = av_frame_alloc();
++#endif
+ int got_frame = 0;
+- int bytes_read = avcodec_decode_audio4(dec_ctx, &frame, &got_frame, &pkt_temp);
++ int bytes_read = avcodec_decode_audio4(dec_ctx, dframe, &got_frame, &pkt_temp);
+ if (bytes_read < 0)
+ {
+ av_free_packet(&pkt);
+@@ -216,12 +219,12 @@
+
+ int stride = -1;
+ if (channels > 1 && av_sample_fmt_is_planar(in_fmt))
+- stride = frame.extended_data[1] - frame.extended_data[0];
++ stride = dframe->extended_data[1] - dframe->extended_data[0];
+
+- int written = convert_audio(frame.nb_samples, channels,
++ int written = convert_audio(dframe->nb_samples, channels,
+ stride,
+- in_fmt, frame.extended_data[0],
+- frame.nb_samples, channels,
++ in_fmt, dframe->extended_data[0],
++ dframe->nb_samples, channels,
+ -1,
+ out_fmt, av->temp_data);
+
+@@ -230,6 +233,12 @@
+ pkt_temp.data += bytes_read;
+ pkt_temp.size -= bytes_read;
+ }
++
++#if LIBAVCODEC_VERSION_INT < AV_VERSION_INT(55,28,0)
++ av_freep(&dframe);
++#else
++ av_frame_free(&dframe);
++#endif
+ }
+
+ av_free_packet(&pkt);
+Index: Source_Files/FFmpeg/Movie.cpp
+===================================================================
+--- Source_Files/FFmpeg/Movie.cpp (revision 5008)
++++ Source_Files/FFmpeg/Movie.cpp (revision 5009)
+@@ -85,6 +85,15 @@
+ }
+ #endif
+
++// FFmpeg compatibility
++#ifndef AV_CODEC_ID_VP8
++#define AV_CODEC_ID_VP8 CODEC_ID_VP8
++#endif
++#ifndef AV_CODEC_ID_VORBIS
++#define AV_CODEC_ID_VORBIS CODEC_ID_VORBIS
++#endif
++
++
+ // shamelessly stolen from SDL 2.0
+ static int get_cpu_count(void)
+ {
+@@ -399,7 +408,7 @@
+ AVStream *video_stream;
+ if (success)
+ {
+- video_codec = avcodec_find_encoder(CODEC_ID_VP8);
++ video_codec = avcodec_find_encoder(AV_CODEC_ID_VP8);
+ success = video_codec;
+ if (!success) err_msg = "Could not find VP8 encoder";
+ }
+@@ -445,7 +454,11 @@
+ }
+ if (success)
+ {
++#if LIBAVCODEC_VERSION_INT < AV_VERSION_INT(55,28,0)
+ av->video_frame = avcodec_alloc_frame();
++#else
++ av->video_frame = av_frame_alloc();
++#endif
+ success = av->video_frame;
+ if (!success) err_msg = "Could not allocate video frame";
+ }
+@@ -466,7 +479,7 @@
+ AVStream *audio_stream;
+ if (success)
+ {
+- audio_codec = avcodec_find_encoder(CODEC_ID_VORBIS);
++ audio_codec = avcodec_find_encoder(AV_CODEC_ID_VORBIS);
+ success = audio_codec;
+ if (!success) err_msg = "Could not find Vorbis encoder";
+ }
+@@ -511,7 +524,11 @@
+ }
+ if (success)
+ {
++#if LIBAVCODEC_VERSION_INT < AV_VERSION_INT(55,28,0)
+ av->audio_frame = avcodec_alloc_frame();
++#else
++ av->audio_frame = av_frame_alloc();
++#endif
+ success = av->audio_frame;
+ if (!success) err_msg = "Could not allocate audio frame";
+ }
+@@ -550,6 +567,7 @@
+ // Start movie file
+ if (success)
+ {
++ video_stream->time_base = (AVRational){1, TICKS_PER_SECOND};
+ avformat_write_header(av->fmt_ctx, NULL);
+ }
+
+@@ -615,13 +633,15 @@
+ while (!done)
+ {
+ // add video
+- int vsize = avcodec_encode_video(vcodec,
+- av->video_buf, av->video_bufsize,
+- frame);
++ AVPacket pkt;
++ av_init_packet(&pkt);
++ pkt.data = av->video_buf;
++ pkt.size = av->video_bufsize;
++
++#if LIBAVCODEC_VERSION_INT < AV_VERSION_INT(54,0,0)
++ int vsize = avcodec_encode_video(vcodec, av->video_buf, av->video_bufsize, frame);
+ if (vsize > 0)
+ {
+- AVPacket pkt;
+- av_init_packet(&pkt);
+ if (vcodec->coded_frame->pts != AV_NOPTS_VALUE)
+ {
+ pkt.pts = av_rescale_q(vcodec->coded_frame->pts,
+@@ -630,12 +650,19 @@
+ }
+ if (vcodec->coded_frame->key_frame)
+ pkt.flags |= AV_PKT_FLAG_KEY;
++ pkt.size = vsize;
++ }
++
++#else
++ int got_packet = 0;
++ int vsize = avcodec_encode_video2(vcodec, &pkt, frame, &got_packet);
++#endif
++ if (vsize > 0)
++ {
+ pkt.stream_index = vstream->index;
+- pkt.data = av->video_buf;
+- pkt.size = vsize;
+ av_interleaved_write_frame(av->fmt_ctx, &pkt);
+- av_free_packet(&pkt);
+ }
++ av_free_packet(&pkt);
+
+ if (!last || vsize <= 0)
+ done = true;
+@@ -679,7 +706,11 @@
+ write_samples, acodec->channels, write_samples * write_bps,
+ acodec->sample_fmt, av->audio_data_conv);
+
++#if LIBAVCODEC_VERSION_INT < AV_VERSION_INT(55,28,1)
+ avcodec_get_frame_defaults(av->audio_frame);
++#else
++ av_frame_unref(av->audio_frame);
++#endif
+ av->audio_frame->nb_samples = write_samples;
+ int asize = avcodec_fill_audio_frame(av->audio_frame, acodec->channels,
+ acodec->sample_fmt,
+@@ -695,7 +726,7 @@
+ if (0 == avcodec_encode_audio2(acodec, &pkt, av->audio_frame, &got_pkt)
+ && got_pkt)
+ {
+- if (acodec->coded_frame->pts != AV_NOPTS_VALUE)
++ if (acodec->coded_frame && acodec->coded_frame->pts != AV_NOPTS_VALUE)
+ {
+ pkt.pts = av_rescale_q(acodec->coded_frame->pts,
+ acodec->time_base,
+Index: Source_Files/FFmpeg/SDL_ffmpeg.c
+===================================================================
+--- Source_Files/FFmpeg/SDL_ffmpeg.c (revision 5008)
++++ Source_Files/FFmpeg/SDL_ffmpeg.c (revision 5009)
+@@ -48,6 +48,38 @@
+ }
+ #endif
+
++// FFmpeg compatibility
++#ifndef AV_CODEC_ID_MPEG1VIDEO
++#define AV_CODEC_ID_MPEG1VIDEO CODEC_ID_MPEG1VIDEO
++#endif
++#ifndef AV_CODEC_ID_MPEG2VIDEO
++#define AV_CODEC_ID_MPEG2VIDEO CODEC_ID_MPEG2VIDEO
++#endif
++#ifndef AV_CODEC_ID_MP2
++#define AV_CODEC_ID_MP2 CODEC_ID_MP2
++#endif
++#ifndef AV_CODEC_ID_DVVIDEO
++#define AV_CODEC_ID_DVVIDEO CODEC_ID_DVVIDEO
++#endif
++#ifndef AV_CODEC_ID_DVAUDIO
++#define AV_CODEC_ID_DVAUDIO CODEC_ID_DVAUDIO
++#endif
++#ifndef AV_CODEC_ID_PCM_S16LE
++#define AV_CODEC_ID_PCM_S16LE CODEC_ID_PCM_S16LE
++#endif
++#ifndef AV_CODEC_ID_PCM_S16BE
++#define AV_CODEC_ID_PCM_S16BE CODEC_ID_PCM_S16BE
++#endif
++#ifndef AV_CODEC_ID_PCM_U16LE
++#define AV_CODEC_ID_PCM_U16LE CODEC_ID_PCM_U16LE
++#endif
++#ifndef AV_CODEC_ID_PCM_U16BE
++#define AV_CODEC_ID_PCM_U16BE CODEC_ID_PCM_U16BE
++#endif
++#ifndef AVCODEC_MAX_AUDIO_FRAME_SIZE
++#define AVCODEC_MAX_AUDIO_FRAME_SIZE 192000
++#endif
++
+ #include "SDL_ffmpeg.h"
+
+ #ifdef MSVC
+@@ -169,12 +201,12 @@
+
+ const SDL_ffmpegCodec SDL_ffmpegCodecPALDVD =
+ {
+- CODEC_ID_MPEG2VIDEO,
++ AV_CODEC_ID_MPEG2VIDEO,
+ 720, 576,
+ 1, 25,
+ 6000000,
+ -1, -1,
+- CODEC_ID_MP2,
++ AV_CODEC_ID_MP2,
+ 2, 48000,
+ 192000,
+ -1, -1
+@@ -182,12 +214,12 @@
+
+ const SDL_ffmpegCodec SDL_ffmpegCodecPALDV =
+ {
+- CODEC_ID_DVVIDEO,
++ AV_CODEC_ID_DVVIDEO,
+ 720, 576,
+ 1, 25,
+ 6553600,
+ -1, -1,
+- CODEC_ID_DVAUDIO,
++ AV_CODEC_ID_DVAUDIO,
+ 2, 48000,
+ 256000,
+ -1, -1
+@@ -324,7 +356,11 @@
+ {
+ if ( file->type == SDL_ffmpegInputStream )
+ {
++#if LIBAVFORMAT_VERSION_INT < AV_VERSION_INT(53,17,0)
+ av_close_input_file( file->_ffmpeg );
++#else
++ avformat_close_input( &file->_ffmpeg );
++#endif
+ }
+ else if ( file->type == SDL_ffmpegOutputStream )
+ {
+@@ -448,7 +484,11 @@
+ {
+ stream->mutex = SDL_CreateMutex();
+
++#if LIBAVCODEC_VERSION_INT < AV_VERSION_INT(55,28,0)
+ stream->decodeFrame = avcodec_alloc_frame();
++#else
++ stream->decodeFrame = av_frame_alloc();
++#endif
+
+ SDL_ffmpegStream **s = &file->vs;
+ while ( *s )
+@@ -1301,11 +1341,17 @@
+ {
+ if ( stream && stream->_ffmpeg && stream->_ffmpeg->codec )
+ {
+- if ( nominator ) *nominator = stream->_ffmpeg->r_frame_rate.num;
++ AVRational frate;
++#if LIBAVFORMAT_VERSION_INT < AV_VERSION_INT(55,12,100)
++ frate = stream->_ffmpeg->r_frame_rate;
++#else
++ frate = av_stream_get_r_frame_rate(stream->_ffmpeg);
++#endif
++ if ( nominator ) *nominator = frate.num;
+
+- if ( denominator ) *denominator = stream->_ffmpeg->r_frame_rate.den;
++ if ( denominator ) *denominator = frate.den;
+
+- return ( float )stream->_ffmpeg->r_frame_rate.num / stream->_ffmpeg->r_frame_rate.den;
++ return ( float )frate.num / frate.den;
+ }
+ else
+ {
+@@ -1587,13 +1633,13 @@
+ stream->codec->pix_fmt = PIX_FMT_YUV420P;
+
+ /* set mpeg2 codec parameters */
+- if ( stream->codec->codec_id == CODEC_ID_MPEG2VIDEO )
++ if ( stream->codec->codec_id == AV_CODEC_ID_MPEG2VIDEO )
+ {
+ stream->codec->max_b_frames = 2;
+ }
+
+ /* set mpeg1 codec parameters */
+- if ( stream->codec->codec_id == CODEC_ID_MPEG1VIDEO )
++ if ( stream->codec->codec_id == AV_CODEC_ID_MPEG1VIDEO )
+ {
+ /* needed to avoid using macroblocks in which some coeffs overflow
+ this doesnt happen with normal video, it just happens here as the
+@@ -1757,10 +1803,10 @@
+
+ switch ( stream->codec->codec_id )
+ {
+- case CODEC_ID_PCM_S16LE:
+- case CODEC_ID_PCM_S16BE:
+- case CODEC_ID_PCM_U16LE:
+- case CODEC_ID_PCM_U16BE:
++ case AV_CODEC_ID_PCM_S16LE:
++ case AV_CODEC_ID_PCM_S16BE:
++ case AV_CODEC_ID_PCM_U16LE:
++ case AV_CODEC_ID_PCM_U16BE:
+ str->encodeAudioInputSize >>= 1;
+ break;
+ default:
+@@ -2032,19 +2078,41 @@
+ while ( size > 0 )
+ {
+ /* Decode the packet */
+-
+-#if ( LIBAVCODEC_VERSION_MAJOR <= 52 && LIBAVCODEC_VERSION_MINOR <= 20 )
+- int len = avcodec_decode_audio2( file->audioStream->_ffmpeg->codec, ( int16_t* )file->audioStream->sampleBuffer, &audioSize, pack->data, pack->size );
+-#else
+- int len = avcodec_decode_audio3( file->audioStream->_ffmpeg->codec, ( int16_t* )file->audioStream->sampleBuffer, &audioSize, pack );
++ AVCodecContext *avctx = file->audioStream->_ffmpeg->codec;
++ AVFrame dframe;
++#if LIBAVCODEC_VERSION_INT < AV_VERSION_INT(55,28,1)
++ avcodec_get_frame_defaults(&dframe);
+ #endif
+-
+- /* if an error occured, we skip the frame */
+- if ( len <= 0 || !audioSize )
++ int got_frame = 0;
++ int len = avcodec_decode_audio4( avctx, &dframe, &got_frame, pack );
++
++ if (len < 0 || !got_frame)
+ {
+ SDL_ffmpegSetError( "error decoding audio frame" );
+ break;
+ }
++
++ int planar = av_sample_fmt_is_planar( avctx->sample_fmt );
++ int plane_size;
++ int data_size = av_samples_get_buffer_size( &plane_size, avctx->channels, dframe.nb_samples, avctx->sample_fmt, 1 );
++ if ( data_size > 10000 )
++ {
++ SDL_ffmpegSetError( "too much data in decoded audio frame" );
++ break;
++ }
++ memcpy( file->audioStream->sampleBuffer, dframe.extended_data[0], plane_size );
++ audioSize = plane_size;
++ if ( planar && avctx->channels > 1 )
++ {
++ int8_t *out = file->audioStream->sampleBuffer + plane_size;
++ int ch;
++ for ( ch = 1; ch < avctx->channels; ch++ )
++ {
++ memcpy( out, dframe.extended_data[ch], plane_size );
++ out += plane_size;
++ audioSize += plane_size;
++ }
++ }
+
+ /* change pointers */
+ data += len;
diff --git a/games/alephone/r5010.diff b/games/alephone/r5010.diff
new file mode 100644
index 0000000000000..ff010424faa8a
--- /dev/null
+++ b/games/alephone/r5010.diff
@@ -0,0 +1,13 @@
+Index: configure.ac
+===================================================================
+--- configure.ac (revision 5009)
++++ configure.ac (revision 5010)
+@@ -195,7 +195,7 @@
+
+ if [[ "x$enable_ffmpeg" = "xyes" ]]; then
+ dnl Check for libavcodec
+-PKG_CHECK_MODULES([FFMPEG], [libavcodec >= 53.35.0 libavformat >= 53.21.0 libavutil >= 51.22.0 libswscale >= 2.1.0], [
++PKG_CHECK_MODULES([FFMPEG], [libavcodec >= 53.61.100 libavformat >= 53.32.100 libavutil >= 51.35.100 libswscale >= 2.1.100], [
+ CPPFLAGS="$FFMPEG_CFLAGS $CPPFLAGS"
+ LIBS="$FFMPEG_LIBS $LIBS"
+ AC_DEFINE(HAVE_FFMPEG, 1, [ffmpeg support enabled])
diff --git a/games/alephone/r5013.diff b/games/alephone/r5013.diff
new file mode 100644
index 0000000000000..48f621d85288e
--- /dev/null
+++ b/games/alephone/r5013.diff
@@ -0,0 +1,14 @@
+Index: Source_Files/Sound/FFmpegDecoder.cpp
+===================================================================
+--- Source_Files/Sound/FFmpegDecoder.cpp (revision 5012)
++++ Source_Files/Sound/FFmpegDecoder.cpp (revision 5013)
+@@ -21,6 +21,9 @@
+
+ */
+
++// make FFmpeg happy
++#define __STDC_CONSTANT_MACROS
++
+ #include "FFmpegDecoder.h"
+
+ #ifdef HAVE_FFMPEG
diff --git a/games/alephone/r5033.diff b/games/alephone/r5033.diff
new file mode 100644
index 0000000000000..54f7ea355aa5c
--- /dev/null
+++ b/games/alephone/r5033.diff
@@ -0,0 +1,514 @@
+Index: configure.ac
+===================================================================
+--- configure.ac (revision 5032)
++++ configure.ac (revision 5033)
+@@ -1,9 +1,13 @@
+ dnl Process this file with autoconf to produce a configure script.
+-dnl Written in 2000 by Christian Bauer <Christian.Bauer@uni-mainz.de>
++dnl Written by Christian Bauer and the Aleph One developers.
+
+-AC_INIT([Aleph One/SDL], m4_esyscmd([ grep '^#define A1_DATE_VERSION' Source_Files/Misc/alephversion.h | sed -e 's/\(.*\"\)\(.*\)\(\"\)/\2/g' | tr -d '\n']), [http://sourceforge.net/bugs/?group_id=1997], [AlephOne])
++AC_INIT([Aleph One],
++ m4_esyscmd([ grep '^#define A1_DATE_VERSION' Source_Files/Misc/alephversion.h | sed -e 's/\(.*\"\)\(.*\)\(\"\)/\2/g' | tr -d '\n']),
++ [http://sourceforge.net/p/marathon/bugs/],
++ [AlephOne],
++ [http://marathon.sourceforge.net/])
+ AC_CONFIG_SRCDIR([Source_Files/shell.cpp])
+-AC_PREREQ(2.52)
++AC_PREREQ([2.65])
+
+ dnl Detect the canonical host and target build environment.
+ AC_CANONICAL_HOST
+@@ -11,288 +15,212 @@
+
+ dnl Init automake.
+ AM_INIT_AUTOMAKE
+-AM_CONFIG_HEADER(config.h)
++AM_CONFIG_HEADER([config.h])
+
+ dnl Configure options.
+-AC_ARG_ENABLE(opengl,
+-[ --enable-opengl use OpenGL for rendering [default=yes]], , enable_opengl=yes)
+-AC_ARG_ENABLE(mad,
+-[ --enable-mad use libmad for mp3 playback [default=yes]], , enable_mad=yes)
+-AC_ARG_ENABLE(ffmpeg,
+-[ --enable-ffmpeg use ffmpeg for audio/video playback and film export [default=yes]], , enable_ffmpeg=yes)
+-AC_ARG_ENABLE(sndfile,
+-[ --enable-sndfile use libsndfile for decoding audio files [default=yes]], , enable_sndfile=yes)
+-AC_ARG_ENABLE(vorbis,
+-[ --enable-vorbis enable ogg/vorbis music playback [default=yes]], , enable_vorbis=yes)
+-AC_ARG_ENABLE(lua,
+-[ --enable-lua use built-in Lua scripting [default=yes]], , enable_lua=yes)
+-AC_ARG_ENABLE(smpeg,
+-[ --enable-smpeg use SMPEG for movie playback [default=yes]], , enable_smpeg=yes)
+-AC_ARG_ENABLE(speex,
+-[ --enable-speex enable Speex net mic playback [default=yes]], , enable_speex=yes)
+-AC_ARG_ENABLE(alsa,
+-[ --enable-alsa enable ALSA net mic transmission [default=yes]], , enable_alsa=yes)
+-AC_ARG_ENABLE(zzip,
+-[ --enable-zzip enable zziplib support [default=yes]], , enable_zzip=yes)
+-AC_ARG_ENABLE(png,
+-[ --enable-png enable PNG screenshot support [default=yes]], , enable_png=yes)
+
+-dnl Checks for programs.
++dnl AX_ARG_ENABLE(option, desc)
++AC_DEFUN([AX_ARG_ENABLE],
++ [ desc_$1="$2"
++ AC_ARG_ENABLE([$1], AS_HELP_STRING([--disable-$1], [do not include $2])) ])
++dnl AX_ARG_WITH(option)
++AC_DEFUN([AX_ARG_WITH],
++ [ desc_$1="$2"
++ AC_ARG_WITH([$1], AS_HELP_STRING([--without-$1], [do not use $2])) ])
++
++AX_ARG_ENABLE([opengl], [OpenGL rendering])
++AX_ARG_ENABLE([lua], [built-in Lua scripting])
++
++AX_ARG_WITH([sdl_image], [SDL_image support])
++AX_ARG_WITH([ffmpeg], [FFmpeg playback and film export])
++AX_ARG_WITH([mad], [libmad MP3 playback])
++AX_ARG_WITH([sndfile], [libsndfile audio decoding])
++AX_ARG_WITH([vorbis], [libvorbis Ogg/Vorbis music playback])
++AX_ARG_WITH([smpeg], [SMPEG movie playback])
++AX_ARG_WITH([speex], [Speex net mic playback])
++AX_ARG_WITH([alsa], [ALSA net mic transmission])
++AX_ARG_WITH([zzip], [zziplib support])
++AX_ARG_WITH([png], [libpng PNG screenshot support])
++
++
++dnl Check for programs.
+ AC_PROG_CC
+ AC_PROG_CPP
+ AC_PROG_CXX
+ AC_PROG_CXXCPP
++AC_PROG_OBJCXX
+ AC_PROG_INSTALL
+ AC_PROG_RANLIB
+
+-dnl some platform specific stuff
+-case $target in
+-*-*-mingw32*)
+- AC_CHECK_TOOL(WINDRES, windres, :)
+- ;;
+-*-*-netbsd*)
+- CPPFLAGS="$CPPFLAGS -I/usr/pkg/include"
+- ;;
+-*)
+- ;;
+-esac
++dnl Some platform specific stuff.
++AS_CASE([$target],
++ [*-*-mingw32*],
++ [ make_windows=true
++ AC_CHECK_TOOL([WINDRES], [windres], [:])
++ AC_DEFINE([WIN32_DISABLE_MUSIC], [1], [Win32 music disabled])
++ LIBS="$LIBS -ldsound -lwsock32" ],
++ [*-*-netbsd*],
++ [CPPFLAGS="$CPPFLAGS -I/usr/pkg/include"])
++AM_CONDITIONAL([MAKE_WINDOWS], [test "x$make_windows" = "xtrue"])
+
+-dnl Checks for headers.
+-AC_CHECK_HEADERS(unistd.h)
+-AC_CHECK_HEADERS(pwd.h)
++dnl Set target system name.
++AC_DEFINE_UNQUOTED([TARGET_PLATFORM], ["$target_os $target_cpu"], [Target platform name])
+
+-dnl Checks for library functions.
+-AC_CHECK_FUNC(snprintf, [
+- AC_DEFINE(HAVE_SNPRINTF, 1, [snprintf() is available])
+-])
+-AC_CHECK_FUNC(vsnprintf, [
+- AC_DEFINE(HAVE_VSNPRINTF, 1, [vsnprintf() is available])
+-])
++dnl Check for headers.
++AC_CHECK_HEADERS([unistd.h pwd.h])
+
+-AC_CHECK_FUNC(mkstemp, [
+- AC_DEFINE(LUA_USE_MKSTEMP, 1, [mkstemp() is available])
+-])
+-AC_CHECK_FUNC(sysconf, [
+- AC_DEFINE(HAVE_SYSCONF, 1, [sysconf() is available])
+-])
+-AC_CHECK_FUNC(sysctlbyname, [
+- AC_DEFINE(HAVE_SYSCTLBYNAME, 1, [sysctlbyname() is available])
+-])
++dnl Check for boost functions.
++AC_LANG_PUSH(C++)
++AC_CHECK_HEADER([boost/bind.hpp],
++ ,
++ [AC_MSG_ERROR([You need boost/bind.hpp from the boost library to run Aleph One.])])
++AC_CHECK_HEADER([boost/function.hpp],
++ ,
++ [AC_MSG_ERROR([You need boost/function.hpp from the boost library to run Aleph One.])])
++AC_LANG_POP(C++)
+
+-dnl Check for SDL.
+-AM_PATH_SDL(1.2.0, , AC_MSG_ERROR([You need SDL 1.2 to run Aleph One.]))
+-CPPFLAGS="$CPPFLAGS $SDL_CFLAGS -DSDL"
+-LIBS="$LIBS $SDL_LIBS"
++dnl Check for library functions.
++AC_CHECK_FUNCS([snprintf vsnprintf sysconf sysctlbyname])
++AC_CHECK_FUNC([mkstemp],
++ [AC_DEFINE([LUA_USE_MKSTEMP], [1], [mkstemp() available])])
+
+-dnl Check for SDL_image.
+-AC_CHECK_HEADERS(SDL_image.h, [
+- AC_CHECK_LIB(SDL_image, IMG_Load, [
+- LIBS="-lSDL_image $LIBS"
+- AC_DEFINE(HAVE_SDL_IMAGE, 1, [SDL_image support is enabled])
+- ])
+-])
++dnl Check for net functions.
++AC_SEARCH_LIBS([gethostbyname], [nsl])
++AC_SEARCH_LIBS([socket], [socket],
++ ,
++ [AC_CHECK_LIB([nsl], [socket],
++ [ LIBS="$LIBS -lsocket -lnsl" ],
++ ,
++ [-lsocket])])
+
+-AC_CHECK_HEADERS(SDL_ttf.h, [
+- AC_CHECK_LIB(SDL_ttf, TTF_Init, [
+- LIBS="-lSDL_ttf $LIBS"
+- AC_DEFINE(HAVE_SDL_TTF, 1, [SDL_TTF support is enabled])
+- ])],
+- AC_MSG_ERROR([You need SDL_ttf to run Aleph One.])
+-)
++dnl Check for libraries.
+
+-dnl Check for SDL_net.
+-AC_CHECK_HEADERS(SDL_net.h, [
+- AC_CHECK_LIB(SDL_net, SDLNet_Init, [
+- LIBS="-lSDL_net $LIBS"
+- AC_DEFINE(HAVE_SDL_NET, 1, [SDL_net support is enabled])
+- ])
+-])
+-if [[ "x$ac_cv_lib_SDL_net_SDLNet_Init" != xyes ]]; then
+- AC_MSG_ERROR([You need SDL_net to run Aleph One.])
+-fi
+-AM_CONDITIONAL(HAVE_SDL_NET, test x$ac_cv_lib_SDL_net_SDLNet_Init = xyes)
++dnl AX_REQUIRE_LIB(desc, define, header, lib, func)
++AC_DEFUN([AX_REQUIRE_LIB],
++ [ AC_CHECK_HEADERS([$3], [AC_CHECK_LIB([$4], [$5])])
++ AS_IF([test "x${ac_cv_lib_$4_$5}" = "xyes"],
++ [AC_DEFINE([HAVE_$2], [1], [$1 support enabled])],
++ [AC_MSG_ERROR([You need $1 to run Aleph One.])]) ])
+
+-AC_SEARCH_LIBS(gethostbyname, nsl)
+-AC_SEARCH_LIBS(socket, socket, ,
+- [AC_CHECK_LIB(nsl, socket, LIBS="$LIBS -lsocket -lnsl", , -lsocket)])
++dnl Check for required SDL dependencies.
++AM_PATH_SDL(1.2.0, , AC_MSG_ERROR([You need SDL 1.2 to run Aleph One.]))
++CPPFLAGS="$CPPFLAGS $SDL_CFLAGS -DSDL"
++LIBS="$LIBS $SDL_LIBS"
+
++AX_REQUIRE_LIB([SDL_ttf], [SDL_TTF],
++ [SDL_ttf.h], [SDL_ttf], [TTF_Init])
++AX_REQUIRE_LIB([SDL_net], [SDL_NET],
++ [SDL_net.h], [SDL_net], [SDLNet_Init])
+
+-dnl Check for zlib
+-AC_CHECK_HEADER(zlib.h, , AC_ERROR([Aleph One requires zlib]))
+-AC_CHECK_LIB(z, zlibVersion, LIBS="-lz $LIBS", AC_ERROR([Aleph One requires zlib]))
++dnl Check for zlib.
++AX_REQUIRE_LIB([zlib], [ZLIB],
++ [zlib.h], [z], [zlibVersion])
+
+-dnl Check for zziplib
+-have_zzip=false
+-if [[ "x$enable_zzip" = "xyes" ]]; then
+-PKG_CHECK_MODULES([ZZIP], [zziplib >= 0.10.75], [
+- CPPFLAGS="$ZZIP_CFLAGS $CPPFLAGS"
+- LIBS="$ZZIP_LIBS $LIBS"
+- have_zzip=true
+- AC_DEFINE(HAVE_ZZIP, 1, [ZZIP support enabled])
+-])
+-fi
+-AM_CONDITIONAL(BUILD_ZZIP_RWOPS, test x$have_zzip = xtrue)
++dnl Check for OpenGL.
++AS_IF([test "x$enable_opengl" != "xno"],
++ [ AC_MSG_CHECKING([for OpenGL support])
++ compiled_opengl=no
++ AS_CASE([$target],
++ [*-*-cygwin* | *-*-mingw32*],
++ [ SYS_GL_LIBS="-lGLEW -lopengl32 -lglu32"
++ LIBS="$LIBS -lstdc++" ],
++ [*-*-darwin*],
++ [ SYS_GL_LIBS="-F/System/Library/Frameworks -framework AGL -framework OpenGL"
++ CPPFLAGS="$CPPFLAGS -D__DARWIN__ -F/System/Library/Frameworks -I/System/Library/Frameworks/OpenGL.framework/Headers" ],
++ [*-*-linux*],
++ [ SYS_GL_LIBS="-lGL -lpthread" ],
++ [ SYS_GL_LIBS="-lGL" ])
++ AC_TRY_COMPILE([
++ #ifndef __DARWIN__
++ #include <GL/gl.h>
++ #else
++ #include <OpenGL/gl.h>
++ #endif
++ ],
++ ,
++ [ compiled_opengl=yes ])
++ AC_MSG_RESULT($compiled_opengl)
++ AS_IF([test "x$compiled_opengl" = "xyes"],
++ [ have_opengl=true
++ AC_DEFINE([HAVE_OPENGL], [1], [OpenGL support enabled])
++ AC_CHECK_LIB([GLU], [gluScaleImage],
++ [SYS_GL_LIBS="$SYS_GL_LIBS -lGLU"],
++ ,
++ [$SYS_GL_LIBS])
++ LIBS="$LIBS $SYS_GL_LIBS"
++ AC_CHECK_HEADERS([GL/glext.h], [], [], [#include <GL/gl.h>]) ],
++ [ AS_IF([test "x$enable_opengl" = "xyes"],
++ [AC_MSG_ERROR([OpenGL support requested but not available])],
++ [AC_MSG_WARN([OpenGL not available])]) ]) ])
++AM_CONDITIONAL([MAKE_OPENGL], [test "x$have_opengl" = "xtrue" ])
+
+-have_png=false
+-if [[ "x$enable_png" = "xyes" ]]; then
+-PKG_CHECK_MODULES([PNG], [libpng], [
+- CPPFLAGS="$PNG_CFLAGS $CPPFLAGS"
+- LIBS="$PNG_LIBS $LIBS"
+- have_png=true
+- AC_DEFINE(HAVE_PNG, 1, [PNG support enabled])]
+-)
+-fi
+-AM_CONDITIONAL(HAVE_PNG, test x$have_png = xtrue)
++dnl Enable Lua.
++AS_IF([test "x$enable_lua" != "xno"],
++ [ have_lua=true
++ AC_DEFINE([HAVE_LUA], [1], [Lua support enabled]) ])
+
+-dnl Check for boost/bind
+-AC_LANG_PUSH(C++)
+-AC_CHECK_HEADER([boost/bind.hpp], , [AC_MSG_ERROR([You need boost/bind.hpp from the boost library to run Aleph One])])
+-AC_LANG_POP(C++)
+
+-dnl Check for boost/function
+-AC_LANG_PUSH(C++)
+-AC_CHECK_HEADER([boost/function.hpp], , [AC_MSG_ERROR([You need boost/function.hpp from the boost library to run Aleph One])])
+-AC_LANG_POP(C++)
++dnl Check optional packages.
+
+-if [[ "x$enable_smpeg" = "xyes" ]]; then
+-dnl Check for SMPEG
+-AC_CHECK_HEADERS([smpeg/smpeg.h], [
+- AC_CHECK_LIB(smpeg, SMPEG_new, [
+- LIBS="-lsmpeg $LIBS"
+- AC_DEFINE(HAVE_SMPEG, 1, [SMPEG movie playback is enabled])
+- ])
+-])
+-fi
++dnl AX_CHECK_FEATURE_LIB(option, define, header, lib, func)
++AC_DEFUN([AX_CHECK_FEATURE_LIB],
++ [ AS_IF([test "x${with_$1}" != "xno"],
++ [ AC_CHECK_HEADERS([$3], [AC_CHECK_LIB([$4], [$5])])
++ AS_IF([test "x${ac_cv_lib_$4_$5}" = "xyes"],
++ [ have_$1=true
++ AC_DEFINE([HAVE_$2], [1], [${desc_$1} enabled]) ],
++ [AS_IF([test "x${with_$1}" = "xyes"],
++ [AC_MSG_ERROR([${desc_$1} requested but not found])])])
++ ]) ])
++dnl AX_CHECK_FEATURE_PKG(option, define, package, lib)
++AC_DEFUN([AX_CHECK_FEATURE_PKG],
++ [ AS_IF([test "x${with_$1}" != "xno"],
++ [ PKG_CHECK_MODULES([$3], [$4],
++ [ CPPFLAGS="${[$3]_CFLAGS} $CPPFLAGS"
++ LIBS="${[$3]_LIBS} $LIBS"
++ have_$1=true
++ AC_DEFINE([HAVE_$2], [1], [${desc_$1} enabled]) ],
++ [AS_IF([test "x${with_$1}" = "xyes"],
++ [AC_MSG_ERROR([${desc_$1} requested but not available])])])
++
++ ])
++ AM_CONDITIONAL([HAVE_$2], [test "x${have_$1}" = "xtrue"])
++ ])
+
+-if [[ "x$enable_mad" = "xyes" ]]; then
+-dnl Check for libmad
+-AC_CHECK_HEADERS([mad.h], [
+- AC_CHECK_LIB(mad, mad_stream_init, [
+- LIBS="-lmad $LIBS"
+- AC_DEFINE(HAVE_MAD, 1, [MAD mp3 playback is enabled])
+-])
+-])
+-fi
++AX_CHECK_FEATURE_LIB([sdl_image], [SDL_IMAGE],
++ [SDL_image.h], [SDL_image], [IMG_Load])
+
+-if [[ "x$enable_sndfile" = "xyes" ]]; then
+-dnl Check for libsndfile
+-AC_CHECK_HEADERS([sndfile.h], [
+- AC_CHECK_LIB(sndfile, sf_open, [
+- LIBS="-lsndfile $LIBS"
+- AC_DEFINE(HAVE_SNDFILE, 1, [libsndfile support is enabled])
+-])
+-])
+-fi
++AX_CHECK_FEATURE_PKG([ffmpeg], [FFMPEG],
++ [FFMPEG], [libavcodec >= 53.61.100 libavformat >= 53.32.100 libavutil >= 51.35.100 libswscale >= 2.1.1])
+
+-if [[ "x$enable_vorbis" = "xyes" ]]; then
+-dnl Check for vorbisfile
+-PKG_CHECK_MODULES([VORBISFILE], [vorbisfile], [
+- CPPFLAGS="$VORBISFILE_CFLAGS $CPPFLAGS"
+- LIBS="$VORBISFILE_LIBS $LIBS"
+- AC_DEFINE(HAVE_VORBISFILE, 1, [vorbis support enabled])
+-])
+-fi
++AX_CHECK_FEATURE_LIB([mad], [MAD],
++ [mad.h], [mad], [mad_stream_init])
+
+-if [[ "x$enable_ffmpeg" = "xyes" ]]; then
+-dnl Check for libavcodec
+-PKG_CHECK_MODULES([FFMPEG], [libavcodec >= 53.61.100 libavformat >= 53.32.100 libavutil >= 51.35.100 libswscale >= 2.1.100], [
+- CPPFLAGS="$FFMPEG_CFLAGS $CPPFLAGS"
+- LIBS="$FFMPEG_LIBS $LIBS"
+- AC_DEFINE(HAVE_FFMPEG, 1, [ffmpeg support enabled])
+- have_ffmpeg=true
+-])
+-fi
+-AM_CONDITIONAL(HAVE_FFMPEG, test x$have_ffmpeg = xtrue)
++AX_CHECK_FEATURE_LIB([sndfile], [SNDFILE],
++ [sndfile.h], [sndfile], [sf_open])
+
+-if [[ "x$enable_lua" = "xyes" ]]; then
+-AC_DEFINE(HAVE_LUA, 1, [Lua support is enabled])
+-fi
++AX_CHECK_FEATURE_PKG([vorbis], [VORBISFILE],
++ [VORBISFILE], [vorbisfile])
+
+-if [[ "x$enable_speex" = "xyes" ]]; then
+-dnl Check for Speex
+-AC_CHECK_HEADERS(speex/speex.h, [
+- AC_CHECK_LIB(speex, speex_decoder_init, [
+- LIBS="-lspeex $LIBS"
+- AC_DEFINE(SPEEX, 1, [Speex support is enabled])
+- ])
+- AC_CHECK_LIB(speexdsp, speex_preprocess_state_init, [
+- LIBS="-lspeexdsp $LIBS"
+-])
+-])
+-fi
++AX_CHECK_FEATURE_LIB([smpeg], [SMPEG],
++ [smpeg/smpeg.h], [smpeg], [SMPEG_new])
+
+-if [[ "x$enable_alsa" = "xyes" ]]; then
+-dnl Check for ALSA
+-AC_CHECK_HEADERS([alsa/asoundlib.h], [
+- AC_CHECK_LIB(asound, snd_pcm_open, [
+- LIBS="-lasound $LIBS"
+- AC_DEFINE(HAVE_ALSA, 1, [ALSA netmic is enabled])
+- ])
+-])
+-fi
++AX_CHECK_FEATURE_LIB([speex], [SPEEX],
++ [speex/speex.h], [speex], [speex_decoder_init])
++AS_IF([test "x$have_speex" = "xyes"],
++ [AC_CHECK_LIB([speexdsp], [speex_preprocess_state_init])])
+
+-dnl Figure out which OpenGL library to use
+-case "$target" in
+- *-*-cygwin* | *-*-mingw32*)
+- SYS_GL_LIBS="-lGLEW -lopengl32 -lglu32"
+- LIBS="$LIBS -lstdc++"
+- ;;
+- *-*-darwin*)
+- SYS_GL_LIBS="-F/System/Library/Frameworks -framework AGL -framework OpenGL"
+- CPPFLAGS="$CPPFLAGS -D__DARWIN__ -F/System/Library/Frameworks -I/System/Library/Frameworks/OpenGL.framework/Headers"
+- ;;
+- *-*-linux*)
+- SYS_GL_LIBS="-lGL -lpthread"
+- ;;
+- *)
+- SYS_GL_LIBS="-lGL"
+- ;;
+-esac
++AX_CHECK_FEATURE_LIB([alsa], [ALSA],
++ [alsa/asoundlib.h], [asound], [snd_pcm_open])
+
+-dnl Check for OpenGL.
+-if [[ "x$enable_opengl" = "xyes" ]]; then
+- AC_MSG_CHECKING(for OpenGL support)
+- have_opengl=no
+- AC_TRY_COMPILE([
+- #ifndef __DARWIN__
+- #include <GL/gl.h>
+- #else
+- #include <OpenGL/gl.h>
+- #endif
+- ],[
+- ],[
+- have_opengl=yes
+- ])
+- AC_MSG_RESULT($have_opengl)
+- if test x$have_opengl = xyes; then
+- AC_DEFINE(HAVE_OPENGL, 1, [OpenGL support is enabled])
+- AC_CHECK_LIB(GLU, gluScaleImage, [SYS_GL_LIBS="$SYS_GL_LIBS -lGLU"], , $SYS_GL_LIBS)
+- LIBS="$LIBS $SYS_GL_LIBS"
+- AC_CHECK_HEADERS(GL/glext.h, [], [], [#include <GL/gl.h>])
+- make_opengl=true
+- else
+- AC_MSG_WARN([Could not find OpenGL, ignoring --enable-opengl.])
+- make_opengl=false
+- fi
+-fi
+-AM_CONDITIONAL(MAKE_OPENGL, test x$make_opengl = xtrue)
++AX_CHECK_FEATURE_PKG([zzip], [ZZIP],
++ [ZZIP], [zziplib >= 0.10.75])
++AM_CONDITIONAL([BUILD_ZZIP_RWOPS], [test "x$have_zzip" = "xtrue"])
+
+-dnl Set target system name.
+-AC_DEFINE_UNQUOTED(TARGET_PLATFORM, "$target_os $target_cpu", [Target platform name])
++AX_CHECK_FEATURE_PKG([png], [PNG],
++ [PNG], [libpng])
+
+-dnl add some windows goodies
+-case $target in
+-*-*-mingw32*)
+- make_windows=true
+- AC_DEFINE(WIN32_DISABLE_MUSIC, 1, [Win32 music is disabled])
+- LIBS="$LIBS -ldsound -lwsock32"
+- ;;
+-*)
+- make_windows=false ;;
+-esac
+-AM_CONDITIONAL(MAKE_WINDOWS, test x$make_windows = xtrue)
+
+-
+ dnl Generate Makefiles.
+ AC_CONFIG_FILES([
+ Makefile
+@@ -321,5 +249,32 @@
+ ])
+ AC_OUTPUT
+
+-dnl Print summary.
+-echo "Configuration done. Now type \"make\"."
++dnl Print summary of enabled/disabled options.
++
++dnl AX_PRINT_SUMMARY(option)
++AC_DEFUN([AX_PRINT_SUMMARY],
++ [ AS_IF([test "x${have_$1}" = "xtrue"],
++ [AS_ECHO([" Enabled: ${desc_$1}"])],
++ [test "x${enable_$1}" = "xno" ||
++ test "x${with_$1}" = "xno"],
++ [AS_ECHO([" Disabled: ${desc_$1}"])],
++ [AS_ECHO([" Not found: ${desc_$1}"])])
++ ])
++
++AS_ECHO([""])
++AS_ECHO(["Summary of optional features:"])
++AS_ECHO([""])
++AX_PRINT_SUMMARY([opengl])
++AX_PRINT_SUMMARY([lua])
++AX_PRINT_SUMMARY([sdl_image])
++AX_PRINT_SUMMARY([ffmpeg])
++AX_PRINT_SUMMARY([mad])
++AX_PRINT_SUMMARY([sndfile])
++AX_PRINT_SUMMARY([vorbis])
++AX_PRINT_SUMMARY([smpeg])
++AX_PRINT_SUMMARY([speex])
++AX_PRINT_SUMMARY([alsa])
++AX_PRINT_SUMMARY([zzip])
++AX_PRINT_SUMMARY([png])
++AS_ECHO([""])
++AS_ECHO(["Configuration done. Now type \"make\"."])
diff --git a/games/alephone/r5037.diff b/games/alephone/r5037.diff
new file mode 100644
index 0000000000000..852d75245ef39
--- /dev/null
+++ b/games/alephone/r5037.diff
@@ -0,0 +1,193 @@
+Index: Source_Files/FFmpeg/Movie.cpp
+===================================================================
+--- Source_Files/FFmpeg/Movie.cpp (revision 5036)
++++ Source_Files/FFmpeg/Movie.cpp (revision 5037)
+@@ -138,6 +138,9 @@
+ AVFormatContext *fmt_ctx;
+ int video_stream_idx;
+ int audio_stream_idx;
++
++ size_t video_counter;
++ size_t audio_counter;
+ };
+ typedef struct libav_vars libav_vars_t;
+
+@@ -495,6 +498,7 @@
+ audio_stream->codec->codec_id = audio_codec->id;
+ audio_stream->codec->codec_type = AVMEDIA_TYPE_AUDIO;
+ audio_stream->codec->sample_rate = mx->obtained.freq;
++ audio_stream->codec->time_base = (AVRational){1, mx->obtained.freq};
+ audio_stream->codec->channels = 2;
+
+ if (av->fmt_ctx->oformat->flags & AVFMT_GLOBALHEADER)
+@@ -507,19 +511,8 @@
+ audio_stream->codec->global_quality = FF_QP2LAMBDA * (aq / 10);
+ audio_stream->codec->flags |= CODEC_FLAG_QSCALE;
+
+- // find correct sample format
+- audio_stream->codec->sample_fmt = AV_SAMPLE_FMT_S16;
++ audio_stream->codec->sample_fmt = AV_SAMPLE_FMT_FLTP;
+ success = (0 <= avcodec_open2(audio_stream->codec, audio_codec, NULL));
+- if (!success)
+- {
+- audio_stream->codec->sample_fmt = AV_SAMPLE_FMT_FLT;
+- success = (0 <= avcodec_open2(audio_stream->codec, audio_codec, NULL));
+- }
+- if (!success)
+- {
+- audio_stream->codec->sample_fmt = AV_SAMPLE_FMT_FLTP;
+- success = (0 <= avcodec_open2(audio_stream->codec, audio_codec, NULL));
+- }
+ if (!success) err_msg = "Could not open audio codec";
+ }
+ if (success)
+@@ -568,6 +561,7 @@
+ if (success)
+ {
+ video_stream->time_base = (AVRational){1, TICKS_PER_SECOND};
++ audio_stream->time_base = (AVRational){1, mx->obtained.freq};
+ avformat_write_header(av->fmt_ctx, NULL);
+ }
+
+@@ -625,7 +619,7 @@
+
+ sws_scale(av->sws_ctx, pdata, pitch, 0, temp_surface->h,
+ av->video_frame->data, av->video_frame->linesize);
+- av->video_frame->pts = vcodec->frame_number;
++ av->video_frame->pts = av->video_counter++;
+ frame = av->video_frame;
+ }
+
+@@ -638,33 +632,22 @@
+ pkt.data = av->video_buf;
+ pkt.size = av->video_bufsize;
+
+-#if LIBAVCODEC_VERSION_INT < AV_VERSION_INT(54,0,0)
+- int vsize = avcodec_encode_video(vcodec, av->video_buf, av->video_bufsize, frame);
+- if (vsize > 0)
+- {
+- if (vcodec->coded_frame->pts != AV_NOPTS_VALUE)
+- {
+- pkt.pts = av_rescale_q(vcodec->coded_frame->pts,
+- vcodec->time_base,
+- vstream->time_base);
+- }
+- if (vcodec->coded_frame->key_frame)
+- pkt.flags |= AV_PKT_FLAG_KEY;
+- pkt.size = vsize;
+- }
+-
+-#else
+ int got_packet = 0;
+ int vsize = avcodec_encode_video2(vcodec, &pkt, frame, &got_packet);
+-#endif
+- if (vsize > 0)
++ if (vsize == 0 && got_packet)
+ {
++ if (pkt.pts != AV_NOPTS_VALUE && pkt.pts < pkt.dts)
++ pkt.pts = pkt.dts;
++ if (pkt.pts != AV_NOPTS_VALUE)
++ pkt.pts = av_rescale_q(pkt.pts, vcodec->time_base, vstream->time_base);
++ if (pkt.dts != AV_NOPTS_VALUE)
++ pkt.dts = av_rescale_q(pkt.dts, vcodec->time_base, vstream->time_base);
++ pkt.duration = av_rescale_q(pkt.duration, vcodec->time_base, vstream->time_base);
+ pkt.stream_index = vstream->index;
+ av_interleaved_write_frame(av->fmt_ctx, &pkt);
++ av_free_packet(&pkt);
+ }
+- av_free_packet(&pkt);
+-
+- if (!last || vsize <= 0)
++ if (!last || vsize < 0 || !got_packet)
+ done = true;
+ }
+ }
+@@ -712,6 +695,10 @@
+ av_frame_unref(av->audio_frame);
+ #endif
+ av->audio_frame->nb_samples = write_samples;
++ av->audio_frame->pts = av_rescale_q(av->audio_counter,
++ (AVRational){1, acodec->sample_rate},
++ acodec->time_base);
++ av->audio_counter += write_samples;
+ int asize = avcodec_fill_audio_frame(av->audio_frame, acodec->channels,
+ acodec->sample_fmt,
+ av->audio_data_conv,
+@@ -726,24 +713,57 @@
+ if (0 == avcodec_encode_audio2(acodec, &pkt, av->audio_frame, &got_pkt)
+ && got_pkt)
+ {
+- if (acodec->coded_frame && acodec->coded_frame->pts != AV_NOPTS_VALUE)
+- {
+- pkt.pts = av_rescale_q(acodec->coded_frame->pts,
+- acodec->time_base,
+- astream->time_base);
+- }
++ if (pkt.pts != AV_NOPTS_VALUE && pkt.pts < pkt.dts)
++ pkt.pts = pkt.dts;
++ if (pkt.pts != AV_NOPTS_VALUE)
++ pkt.pts = av_rescale_q(pkt.pts, acodec->time_base, astream->time_base);
++ if (pkt.dts != AV_NOPTS_VALUE)
++ pkt.dts = av_rescale_q(pkt.dts, acodec->time_base, astream->time_base);
++ pkt.duration = av_rescale_q(pkt.duration, acodec->time_base, astream->time_base);
+ pkt.stream_index = astream->index;
+- pkt.flags |= AV_PKT_FLAG_KEY;
+ av_interleaved_write_frame(av->fmt_ctx, &pkt);
+ av_free_packet(&pkt);
+ }
+ }
+ }
++ if (last)
++ {
++ bool done = false;
++ while (!done)
++ {
++ AVPacket pkt;
++ memset(&pkt, 0, sizeof(AVPacket));
++ av_init_packet(&pkt);
++
++ int got_pkt = 0;
++ if (0 == avcodec_encode_audio2(acodec, &pkt, NULL, &got_pkt)
++ && got_pkt)
++ {
++ if (pkt.pts != AV_NOPTS_VALUE && pkt.pts < pkt.dts)
++ pkt.pts = pkt.dts;
++ if (pkt.pts != AV_NOPTS_VALUE)
++ pkt.pts = av_rescale_q(pkt.pts, acodec->time_base, astream->time_base);
++ if (pkt.dts != AV_NOPTS_VALUE)
++ pkt.dts = av_rescale_q(pkt.dts, acodec->time_base, astream->time_base);
++ pkt.duration = av_rescale_q(pkt.duration, acodec->time_base, astream->time_base);
++ pkt.stream_index = astream->index;
++ av_interleaved_write_frame(av->fmt_ctx, &pkt);
++ av_free_packet(&pkt);
++ }
++ else
++ {
++ done = true;
++ }
++ }
++
++ }
+
+ }
+
+ void Movie::EncodeThread()
+ {
++ av->video_counter = 0;
++ av->audio_counter = 0;
+ while (true)
+ {
+ SDL_SemWait(encodeReady);
+Index: configure.ac
+===================================================================
+--- configure.ac (revision 5036)
++++ configure.ac (revision 5037)
+@@ -191,7 +191,7 @@
+ [SDL_image.h], [SDL_image], [IMG_Load])
+
+ AX_CHECK_FEATURE_PKG([ffmpeg], [FFMPEG],
+- [FFMPEG], [libavcodec >= 53.61.100 libavformat >= 53.32.100 libavutil >= 51.35.100 libswscale >= 2.1.1])
++ [FFMPEG], [libavcodec >= 54.35.0 libavformat >= 54.20.0 libavutil >= 52.3.0 libswscale >= 2.1.1])
+
+ AX_CHECK_FEATURE_LIB([mad], [MAD],
+ [mad.h], [mad], [mad_stream_init])