Parts of: http://cvs.pld-linux.org/cgi-bin/viewvc.cgi/cvs/packages/FusionSound/FusionSound-ffmpeg.patch?view=markup and remove a write only variable. https://bugs.gentoo.org/show_bug.cgi?id=405721 Index: FusionSound-1.1.1/interfaces/IFusionSoundMusicProvider/ifusionsoundmusicprovider_ffmpeg.c =================================================================== --- FusionSound-1.1.1.orig/interfaces/IFusionSoundMusicProvider/ifusionsoundmusicprovider_ffmpeg.c +++ FusionSound-1.1.1/interfaces/IFusionSoundMusicProvider/ifusionsoundmusicprovider_ffmpeg.c @@ -41,6 +41,7 @@ #include +#define FF_API_OLD_METADATA2 0 #include #include @@ -476,17 +477,26 @@ static DFBResult IFusionSoundMusicProvider_FFmpeg_GetTrackDescription( IFusionSoundMusicProvider *thiz, FSTrackDescription *desc ) { + AVDictionaryEntry *tag = NULL; + DIRECT_INTERFACE_GET_DATA( IFusionSoundMusicProvider_FFmpeg ) if (!desc) return DFB_INVARG; - direct_snputs( desc->artist, data->ctx->author, FS_TRACK_DESC_ARTIST_LENGTH ); - direct_snputs( desc->title, data->ctx->title, FS_TRACK_DESC_TITLE_LENGTH ); - direct_snputs( desc->album, data->ctx->album, FS_TRACK_DESC_ALBUM_LENGTH ); - direct_snputs( desc->genre, data->ctx->genre, FS_TRACK_DESC_GENRE_LENGTH ); - direct_snputs( desc->encoding, data->codec->codec->name, FS_TRACK_DESC_ENCODING_LENGTH ); - desc->year = data->ctx->year; + tag = av_dict_get(data->ctx->metadata, "artist", NULL, 0); + if (tag) direct_snputs( desc->artist, tag->value, FS_TRACK_DESC_ARTIST_LENGTH ); + tag = av_dict_get(data->ctx->metadata, "title", NULL, 0); + if (tag) direct_snputs( desc->title, tag->value, FS_TRACK_DESC_TITLE_LENGTH ); + tag = av_dict_get(data->ctx->metadata, "album", NULL, 0); + if (tag) direct_snputs( desc->album, tag->value, FS_TRACK_DESC_ALBUM_LENGTH ); + tag = av_dict_get(data->ctx->metadata, "genre", NULL, 0); + if (tag) direct_snputs( desc->genre, tag->value, FS_TRACK_DESC_GENRE_LENGTH ); + tag = av_dict_get(data->ctx->metadata, "encoding", NULL, 0); + if (tag) direct_snputs( desc->encoding, tag->value, FS_TRACK_DESC_ENCODING_LENGTH ); + tag = av_dict_get(data->ctx->metadata, "year", NULL, 0); + if (tag) desc->year = atoi(tag->value); + desc->bitrate = data->codec->bit_rate; desc->replaygain = desc->replaygain_album = 0; @@ -540,7 +550,6 @@ FFmpegStreamThread( DirectThread *thread IFusionSoundMusicProvider_FFmpeg_data *data = ctx; AVPacket pkt; - u8 *pkt_data = NULL; int pkt_size = 0; s64 pkt_pts = AV_NOPTS_VALUE; @@ -584,7 +593,6 @@ FFmpegStreamThread( DirectThread *thread continue; } - pkt_data = pkt.data; pkt_size = pkt.size; pkt_pts = pkt.pts; if (pkt_pts != AV_NOPTS_VALUE) { @@ -595,14 +603,13 @@ FFmpegStreamThread( DirectThread *thread } len = AVCODEC_MAX_AUDIO_FRAME_SIZE; - decoded = avcodec_decode_audio2( data->codec, - (s16*)data->buf, &len, pkt_data, pkt_size ); + decoded = avcodec_decode_audio3( data->codec, + (s16*)data->buf, &len, &pkt ); if (decoded < 0) { av_free_packet( &pkt ); pkt_size = 0; } else { - pkt_data += decoded; pkt_size -= decoded; if (pkt_size <= 0) av_free_packet( &pkt ); @@ -739,7 +746,6 @@ FFmpegBufferThread( DirectThread *thread IFusionSoundMusicProvider_FFmpeg_data *data = ctx; AVPacket pkt; - u8 *pkt_data = NULL; int pkt_size = 0; s64 pkt_pts = AV_NOPTS_VALUE; int pos = 0; @@ -789,7 +795,6 @@ FFmpegBufferThread( DirectThread *thread continue; } - pkt_data = pkt.data; pkt_size = pkt.size; pkt_pts = pkt.pts; if (pkt_pts != AV_NOPTS_VALUE) { @@ -800,14 +805,13 @@ FFmpegBufferThread( DirectThread *thread } len = AVCODEC_MAX_AUDIO_FRAME_SIZE; - decoded = avcodec_decode_audio2( data->codec, - (s16*)data->buf, &len, pkt_data, pkt_size ); + decoded = avcodec_decode_audio3( data->codec, + (s16*)data->buf, &len, &pkt ); if (decoded < 0) { av_free_packet( &pkt ); pkt_size = 0; } else { - pkt_data += decoded; pkt_size -= decoded; if (pkt_size <= 0) av_free_packet( &pkt ); @@ -1208,7 +1212,7 @@ Construct( IFusionSoundMusicProvider *th } for (i = 0; i < data->ctx->nb_streams; i++) { - if (data->ctx->streams[i]->codec->codec_type == CODEC_TYPE_AUDIO) { + if (data->ctx->streams[i]->codec->codec_type == AVMEDIA_TYPE_AUDIO) { if (!data->st || data->st->codec->bit_rate < data->ctx->streams[i]->codec->bit_rate) data->st = data->ctx->streams[i]; }