diff -ur freerdp-1.0.2/channels/drdynvc/tsmf/ffmpeg/tsmf_ffmpeg.c freerdp-1.0.2.ffmpeg/channels/drdynvc/tsmf/ffmpeg/tsmf_ffmpeg.c --- freerdp-1.0.2/channels/drdynvc/tsmf/ffmpeg/tsmf_ffmpeg.c 2016-04-04 21:17:22.515023232 +0900 +++ freerdp-1.0.2.ffmpeg/channels/drdynvc/tsmf/ffmpeg/tsmf_ffmpeg.c 2016-04-04 21:16:59.521188035 +0900 @@ -193,28 +193,28 @@ switch (media_type->SubType) { case TSMF_SUB_TYPE_WVC1: - mdecoder->codec_id = CODEC_ID_VC1; + mdecoder->codec_id = AV_CODEC_ID_VC1; break; case TSMF_SUB_TYPE_WMA2: - mdecoder->codec_id = CODEC_ID_WMAV2; + mdecoder->codec_id = AV_CODEC_ID_WMAV2; break; case TSMF_SUB_TYPE_WMA9: - mdecoder->codec_id = CODEC_ID_WMAPRO; + mdecoder->codec_id = AV_CODEC_ID_WMAPRO; break; case TSMF_SUB_TYPE_MP3: - mdecoder->codec_id = CODEC_ID_MP3; + mdecoder->codec_id = AV_CODEC_ID_MP3; break; case TSMF_SUB_TYPE_MP2A: - mdecoder->codec_id = CODEC_ID_MP2; + mdecoder->codec_id = AV_CODEC_ID_MP2; break; case TSMF_SUB_TYPE_MP2V: - mdecoder->codec_id = CODEC_ID_MPEG2VIDEO; + mdecoder->codec_id = AV_CODEC_ID_MPEG2VIDEO; break; case TSMF_SUB_TYPE_WMV3: - mdecoder->codec_id = CODEC_ID_WMV3; + mdecoder->codec_id = AV_CODEC_ID_WMV3; break; case TSMF_SUB_TYPE_AAC: - mdecoder->codec_id = CODEC_ID_AAC; + mdecoder->codec_id = AV_CODEC_ID_AAC; /* For AAC the pFormat is a HEAACWAVEINFO struct, and the codec data is at the end of it. See http://msdn.microsoft.com/en-us/library/dd757806.aspx */ @@ -226,10 +226,10 @@ break; case TSMF_SUB_TYPE_H264: case TSMF_SUB_TYPE_AVC1: - mdecoder->codec_id = CODEC_ID_H264; + mdecoder->codec_id = AV_CODEC_ID_H264; break; case TSMF_SUB_TYPE_AC3: - mdecoder->codec_id = CODEC_ID_AC3; + mdecoder->codec_id = AV_CODEC_ID_AC3; break; default: return false; @@ -351,19 +351,29 @@ } dst += mdecoder->decoded_size; } + frame_size = mdecoder->decoded_size_max - mdecoder->decoded_size; #if LIBAVCODEC_VERSION_MAJOR < 52 || (LIBAVCODEC_VERSION_MAJOR == 52 && LIBAVCODEC_VERSION_MINOR <= 20) len = avcodec_decode_audio2(mdecoder->codec_context, - (int16_t*) dst, &frame_size, - src, src_size); + (int16_t*) dst, &frame_size, src, src_size); #else { + AVFrame* decoded_frame = avcodec_alloc_frame(); + int got_frame = 0; AVPacket pkt; av_init_packet(&pkt); pkt.data = (uint8*) src; pkt.size = src_size; - len = avcodec_decode_audio3(mdecoder->codec_context, - (int16_t*) dst, &frame_size, &pkt); + len = avcodec_decode_audio4(mdecoder->codec_context, decoded_frame, &got_frame, &pkt); + + if (len >= 0 && got_frame) + { + frame_size = av_samples_get_buffer_size(NULL, mdecoder->codec_context->channels, + decoded_frame->nb_samples, mdecoder->codec_context->sample_fmt, 1); + memcpy(dst, decoded_frame->data[0], frame_size); + } + + av_free(decoded_frame); } #endif if (len <= 0 || frame_size <= 0) @@ -435,7 +445,7 @@ switch (mdecoder->codec_context->pix_fmt) { - case PIX_FMT_YUV420P: + case AV_PIX_FMT_YUV420P: return RDP_PIXFMT_I420; default: