mirror of
https://github.com/Ponce/slackbuilds
synced 2024-11-22 19:44:21 +01:00
d7cbc3b5cb
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>
385 lines
12 KiB
Diff
385 lines
12 KiB
Diff
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;
|