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; }