From d7cbc3b5cbadafef4a1469de1a8389e3621d6513 Mon Sep 17 00:00:00 2001 From: David Spencer Date: Wed, 27 May 2015 10:58:53 +0100 Subject: games/alephone: Patched for ffmpeg-2.6.3. Signed-off-by: David Spencer Signed-off-by: Heinz Wiesinger Signed-off-by: Willy Sudiarto Raharjo --- games/alephone/alephone.SlackBuild | 8 + games/alephone/r5009.diff | 385 +++++++++++++++++++++++++++ games/alephone/r5010.diff | 13 + games/alephone/r5013.diff | 14 + games/alephone/r5033.diff | 514 +++++++++++++++++++++++++++++++++++++ games/alephone/r5037.diff | 193 ++++++++++++++ 6 files changed, 1127 insertions(+) create mode 100644 games/alephone/r5009.diff create mode 100644 games/alephone/r5010.diff create mode 100644 games/alephone/r5013.diff create mode 100644 games/alephone/r5033.diff create mode 100644 games/alephone/r5037.diff diff --git a/games/alephone/alephone.SlackBuild b/games/alephone/alephone.SlackBuild index a59807eb1b..73d2a82bb9 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 0000000000..39f9e648cf --- /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 0000000000..ff010424fa --- /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 0000000000..48f621d852 --- /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 0000000000..54f7ea355a --- /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 ++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 ++ #else ++ #include ++ #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 ]) ], ++ [ 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 +- #else +- #include +- #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 ]) +- 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 0000000000..852d75245e --- /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]) -- cgit v1.2.3