Files
BMLFS/patches/directfb-pld-linux/ffmpeg3.patch

353 lines
12 KiB
Diff

diff -ur -x .deps DirectFB-1.7.6.orig/interfaces/IDirectFBImageProvider/idirectfbimageprovider_ffmpeg.c DirectFB-1.7.6/interfaces/IDirectFBImageProvider/idirectfbimageprovider_ffmpeg.c
--- DirectFB-1.7.6.orig/interfaces/IDirectFBImageProvider/idirectfbimageprovider_ffmpeg.c 2014-03-23 05:05:18.000000000 +0900
+++ DirectFB-1.7.6/interfaces/IDirectFBImageProvider/idirectfbimageprovider_ffmpeg.c 2016-04-02 01:07:55.515031522 +0900
@@ -259,7 +259,7 @@
av_codec_ctx = data->av_fmt_ctx->streams[0]->codec;
- av_picture = avcodec_alloc_frame();
+ av_picture = av_frame_alloc();
if (av_picture == NULL)
{
@@ -270,7 +270,7 @@
/*No scaling just colourspace conversion*/
sw_sca_ctx = sws_getCachedContext(sw_sca_ctx, av_codec_ctx->width, av_codec_ctx->height, av_codec_ctx->pix_fmt,
- av_codec_ctx->width, av_codec_ctx->height, PIX_FMT_BGRA,
+ av_codec_ctx->width, av_codec_ctx->height, AV_PIX_FMT_BGRA,
SWS_FAST_BILINEAR, NULL,
NULL, NULL);
if (sw_sca_ctx == NULL)
diff -ur -x .deps DirectFB-1.7.6.orig/interfaces/IDirectFBVideoProvider/idirectfbvideoprovider_ffmpeg.c DirectFB-1.7.6/interfaces/IDirectFBVideoProvider/idirectfbvideoprovider_ffmpeg.c
--- DirectFB-1.7.6.orig/interfaces/IDirectFBVideoProvider/idirectfbvideoprovider_ffmpeg.c 2016-04-02 00:59:25.978409428 +0900
+++ DirectFB-1.7.6/interfaces/IDirectFBVideoProvider/idirectfbvideoprovider_ffmpeg.c 2016-04-04 19:51:41.558286928 +0900
@@ -601,42 +601,42 @@
ff2dvc_pixelformat( int pix_fmt )
{
switch (pix_fmt) {
- case PIX_FMT_YUV420P:
- case PIX_FMT_YUVJ420P:
+ case AV_PIX_FMT_YUV420P:
+ case AV_PIX_FMT_YUVJ420P:
return DVCPF_YUV420;
- case PIX_FMT_YUV422P:
- case PIX_FMT_YUVJ422P:
+ case AV_PIX_FMT_YUV422P:
+ case AV_PIX_FMT_YUVJ422P:
return DVCPF_YUV422;
- case PIX_FMT_YUV444P:
- case PIX_FMT_YUVJ444P:
+ case AV_PIX_FMT_YUV444P:
+ case AV_PIX_FMT_YUVJ444P:
return DVCPF_YUV444;
- case PIX_FMT_YUV411P:
+ case AV_PIX_FMT_YUV411P:
return DVCPF_YUV411;
- case PIX_FMT_YUV410P:
+ case AV_PIX_FMT_YUV410P:
return DVCPF_YUV410;
- case PIX_FMT_YUYV422:
+ case AV_PIX_FMT_YUYV422:
return DVCPF_YUYV_LE;
- case PIX_FMT_UYVY422:
+ case AV_PIX_FMT_UYVY422:
return DVCPF_YUYV_BE;
- case PIX_FMT_NV12:
+ case AV_PIX_FMT_NV12:
return DVCPF_NV12_LE;
- case PIX_FMT_NV21:
+ case AV_PIX_FMT_NV21:
return DVCPF_NV12_BE;
- case PIX_FMT_GRAY8:
+ case AV_PIX_FMT_GRAY8:
return DVCPF_Y8;
- case PIX_FMT_RGB8:
+ case AV_PIX_FMT_RGB8:
return DVCPF_RGB8;
- case PIX_FMT_RGB555:
+ case AV_PIX_FMT_RGB555:
return DVCPF_RGB15;
- case PIX_FMT_RGB565:
+ case AV_PIX_FMT_RGB565:
return DVCPF_RGB16;
- case PIX_FMT_RGB24:
+ case AV_PIX_FMT_RGB24:
return DVCPF_RGB24;
- case PIX_FMT_BGR24:
+ case AV_PIX_FMT_BGR24:
return DVCPF_BGR24;
- case PIX_FMT_RGB32:
+ case AV_PIX_FMT_RGB32:
return DVCPF_RGB32;
- case PIX_FMT_BGR32:
+ case AV_PIX_FMT_BGR32:
return DVCPF_BGR32;
default:
D_ONCE("unsupported picture format");
@@ -798,15 +798,17 @@
IDirectFBVideoProvider_FFmpeg_data *data = arg;
AVStream *st = data->audio.st;
- u8 buf[192000 /* AVCODEC_MAX_AUDIO_FRAME_SIZE */];
+ AVFrame *decoded_frame = NULL;
+
+ decoded_frame = av_frame_alloc();
while (data->status != DVSTATE_STOP) {
AVPacket pkt;
u8 *pkt_data;
int pkt_size;
int decoded = 0;
- int len = 192000 /* AVCODEC_MAX_AUDIO_FRAME_SIZE */;
int size = 0;
+ int got_frame = 0;
direct_thread_testcancel( self );
@@ -830,23 +832,15 @@
avcodec_flush_buffers( data->audio.ctx );
data->audio.seeked = false;
}
-
+
for (pkt_data = pkt.data, pkt_size = pkt.size; pkt_size > 0;) {
-#if (LIBAVFORMAT_VERSION_MAJOR >= 53)
- decoded = avcodec_decode_audio3( data->audio.ctx,
- (s16*)&buf[size], &len, &pkt );
-#else
- decoded = avcodec_decode_audio2( data->audio.ctx,
- (s16*)&buf[size], &len,
- pkt_data, pkt_size );
-#endif
- if (decoded < 0)
- break;
-
- pkt_data += decoded;
- pkt_size -= decoded;
- if (len > 0)
- size += len;
+ decoded = avcodec_decode_audio4( data->audio.ctx, decoded_frame, &got_frame, &pkt);
+ if ((decoded >= 0) && got_frame) {
+ pkt_data += decoded;
+ pkt_size -= decoded;
+ size += decoded;
+ } else
+ break;
}
size /= data->audio.sample_size;
@@ -863,12 +857,17 @@
pthread_mutex_unlock( &data->audio.lock );
- if (size)
- data->audio.stream->Write( data->audio.stream, buf, size );
- else
+ if (size) {
+ int data_size = av_samples_get_buffer_size(NULL, data->audio.ctx->channels,
+ decoded_frame->nb_samples,
+ data->audio.ctx->sample_fmt, 1);
+ data->audio.stream->Write( data->audio.stream, decoded_frame->data[0], data_size );
+ } else
usleep( 1000 );
}
+ av_free(decoded_frame);
+
return (void*)0;
}
#endif
@@ -1052,37 +1051,37 @@
}
switch (data->video.ctx->pix_fmt) {
- case PIX_FMT_RGB8:
+ case AV_PIX_FMT_RGB8:
desc->pixelformat = DSPF_RGB332;
break;
- case PIX_FMT_RGB555:
+ case AV_PIX_FMT_RGB555:
desc->pixelformat = DSPF_ARGB1555;
break;
- case PIX_FMT_RGB565:
+ case AV_PIX_FMT_RGB565:
desc->pixelformat = DSPF_RGB16;
break;
- case PIX_FMT_RGB24:
- case PIX_FMT_BGR24:
+ case AV_PIX_FMT_RGB24:
+ case AV_PIX_FMT_BGR24:
desc->pixelformat = DSPF_RGB24;
break;
- case PIX_FMT_RGB32:
- case PIX_FMT_BGR32:
+ case AV_PIX_FMT_RGB32:
+ case AV_PIX_FMT_BGR32:
desc->pixelformat = DSPF_RGB32;
break;
- case PIX_FMT_YUYV422:
+ case AV_PIX_FMT_YUYV422:
desc->pixelformat = DSPF_YUY2;
break;
- case PIX_FMT_UYVY422:
+ case AV_PIX_FMT_UYVY422:
desc->pixelformat = DSPF_UYVY;
break;
- case PIX_FMT_YUV444P:
- case PIX_FMT_YUV422P:
- case PIX_FMT_YUV420P:
- case PIX_FMT_YUV411P:
- case PIX_FMT_YUV410P:
- case PIX_FMT_YUVJ420P:
- case PIX_FMT_YUVJ422P:
- case PIX_FMT_YUVJ444P:
+ case AV_PIX_FMT_YUV444P:
+ case AV_PIX_FMT_YUV422P:
+ case AV_PIX_FMT_YUV420P:
+ case AV_PIX_FMT_YUV411P:
+ case AV_PIX_FMT_YUV410P:
+ case AV_PIX_FMT_YUVJ420P:
+ case AV_PIX_FMT_YUVJ422P:
+ case AV_PIX_FMT_YUVJ444P:
desc->pixelformat = DSPF_I420;
break;
default:
diff -ur -x .deps DirectFB-1.7.6.orig/interfaces/IFusionSoundMusicProvider/ifusionsoundmusicprovider_ffmpeg.c DirectFB-1.7.6/interfaces/IFusionSoundMusicProvider/ifusionsoundmusicprovider_ffmpeg.c
--- DirectFB-1.7.6.orig/interfaces/IFusionSoundMusicProvider/ifusionsoundmusicprovider_ffmpeg.c 2016-04-02 00:59:26.075077423 +0900
+++ DirectFB-1.7.6/interfaces/IFusionSoundMusicProvider/ifusionsoundmusicprovider_ffmpeg.c 2016-04-04 20:16:31.250776250 +0900
@@ -604,9 +604,13 @@
u8 *pkt_data = NULL;
int pkt_size = 0;
s64 pkt_pts = AV_NOPTS_VALUE;
+ AVFrame *decoded_frame = NULL;
+
+ decoded_frame = av_frame_alloc();
while (data->status == FMSTATE_PLAY) {
int len, decoded, size = 0;
+ int got_frame = 0;
pthread_mutex_lock( &data->lock );
@@ -655,31 +659,22 @@
}
}
- len = AVCODEC_MAX_AUDIO_FRAME_SIZE;
-
-#if (LIBAVFORMAT_VERSION_MAJOR >= 52)
- decoded = avcodec_decode_audio3( data->codec,
- (s16*)data->buf, &len, &pkt);
-
-#else
- decoded = avcodec_decode_audio2( data->codec,
- (s16*)data->buf, &len, pkt_data, pkt_size );
-
-#endif
- if (decoded < 0) {
- av_free_packet( &pkt );
- pkt_size = 0;
- }
- else {
+ decoded = avcodec_decode_audio4( data->codec, decoded_frame, &got_frame, &pkt);
+ if ((decoded >= 0) && got_frame) {
pkt_data += decoded;
pkt_size -= decoded;
if (pkt_size <= 0)
av_free_packet( &pkt );
- if (len > 0) {
- size = len / (data->codec->channels * 2);
- data->pts += (s64)size * AV_TIME_BASE / data->codec->sample_rate;
- }
+ size = decoded / (data->codec->channels * 2);
+ data->pts += (s64)size * AV_TIME_BASE / data->codec->sample_rate;
+ int data_size = av_samples_get_buffer_size(NULL, data->codec->channels,
+ decoded_frame->nb_samples,
+ data->codec->sample_fmt, 1);
+ memcpy(data->buf, decoded_frame->data[0], data_size);
+ } else {
+ av_free_packet( &pkt );
+ pkt_size = 0;
}
pthread_mutex_unlock( &data->lock );
@@ -710,6 +705,8 @@
if (pkt_size > 0)
av_free_packet( &pkt );
+ av_free(decoded_frame);
+
return (void*)0;
}
@@ -814,10 +811,14 @@
int pkt_size = 0;
s64 pkt_pts = AV_NOPTS_VALUE;
int pos = 0;
+ AVFrame *decoded_frame = NULL;
+
+ decoded_frame = av_frame_alloc();
while (data->status == FMSTATE_PLAY) {
s16 *buf;
int len, decoded, size = 0;
+ int got_frame = 0;
pthread_mutex_lock( &data->lock );
@@ -870,32 +871,22 @@
}
}
- len = AVCODEC_MAX_AUDIO_FRAME_SIZE;
-
-#if (LIBAVFORMAT_VERSION_MAJOR >= 53)
- decoded = avcodec_decode_audio3( data->codec,
- (s16*)data->buf, &len, &pkt);
-
-#else
- decoded = avcodec_decode_audio2( data->codec,
- (s16*)data->buf, &len, pkt_data, pkt_size );
-
-#endif
-
- if (decoded < 0) {
- av_free_packet( &pkt );
- pkt_size = 0;
- }
- else {
+ decoded = avcodec_decode_audio4( data->codec, decoded_frame, &got_frame, &pkt);
+ if ((decoded >= 0) && got_frame) {
pkt_data += decoded;
pkt_size -= decoded;
if (pkt_size <= 0)
av_free_packet( &pkt );
- if (len > 0) {
- size = len / (data->codec->channels * 2);
- data->pts += (s64)size * AV_TIME_BASE / data->codec->sample_rate;
- }
+ size = decoded / (data->codec->channels * 2);
+ data->pts += (s64)size * AV_TIME_BASE / data->codec->sample_rate;
+ int data_size = av_samples_get_buffer_size(NULL, data->codec->channels,
+ decoded_frame->nb_samples,
+ data->codec->sample_fmt, 1);
+ memcpy(data->buf, decoded_frame->data[0], data_size);
+ } else {
+ av_free_packet( &pkt );
+ pkt_size = 0;
}
buf = (s16*)data->buf;
@@ -937,6 +928,8 @@
if (pkt_size > 0)
av_free_packet( &pkt );
+ av_free(decoded_frame);
+
return (void*)0;
}