From e5bb653b789555e975cb5a675496372c39263b44 Mon Sep 17 00:00:00 2001 From: Augustin Cavalier Date: Sun, 23 Sep 2018 15:59:36 -0400 Subject: [PATCH] add-ons/media/ffmpeg: Rework usage of AVPicture in AVCodecDecoder. It has been deprecated since FFmpeg ~3.0, and is internally implemented using these functions now, so this should largely be a no-op change. AVCodecEncoder still uses it. --- .../media/plugins/ffmpeg/AVCodecDecoder.cpp | 24 ++++++++++--------- .../media/plugins/ffmpeg/AVCodecDecoder.h | 5 ++-- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/src/add-ons/media/plugins/ffmpeg/AVCodecDecoder.cpp b/src/add-ons/media/plugins/ffmpeg/AVCodecDecoder.cpp index 1c781026c4..12f8d36cb9 100644 --- a/src/add-ons/media/plugins/ffmpeg/AVCodecDecoder.cpp +++ b/src/add-ons/media/plugins/ffmpeg/AVCodecDecoder.cpp @@ -1570,9 +1570,9 @@ AVCodecDecoder::_UpdateMediaHeaderForVideoFrame() fHeader.file_pos = 0; fHeader.orig_size = 0; fHeader.start_time = fRawDecodedPicture->pkt_dts; - fHeader.size_used = avpicture_get_size( + fHeader.size_used = av_image_get_buffer_size( colorspace_to_pixfmt(fOutputColorSpace), fRawDecodedPicture->width, - fRawDecodedPicture->height); + fRawDecodedPicture->height, 1); fHeader.u.raw_video.display_line_width = fRawDecodedPicture->width; fHeader.u.raw_video.display_line_count = fRawDecodedPicture->height; fHeader.u.raw_video.bytes_per_row @@ -1622,11 +1622,11 @@ AVCodecDecoder::_DeinterlaceAndColorConvertVideoFrame() { int displayWidth = fRawDecodedPicture->width; int displayHeight = fRawDecodedPicture->height; - AVPicture deinterlacedPicture; + AVFrame deinterlacedPicture; bool useDeinterlacedPicture = false; if (fRawDecodedPicture->interlaced_frame) { - AVPicture rawPicture; + AVFrame rawPicture; rawPicture.data[0] = fRawDecodedPicture->data[0]; rawPicture.data[1] = fRawDecodedPicture->data[1]; rawPicture.data[2] = fRawDecodedPicture->data[2]; @@ -1636,12 +1636,14 @@ AVCodecDecoder::_DeinterlaceAndColorConvertVideoFrame() rawPicture.linesize[2] = fRawDecodedPicture->linesize[2]; rawPicture.linesize[3] = fRawDecodedPicture->linesize[3]; - avpicture_alloc(&deinterlacedPicture, fCodecContext->pix_fmt, displayWidth, - displayHeight); + if (av_image_alloc(deinterlacedPicture.data, + deinterlacedPicture.linesize, displayWidth, displayHeight, + fCodecContext->pix_fmt, 1) < 0) + return B_NO_MEMORY; // deinterlace implemented using avfilter _ProcessFilterGraph(&deinterlacedPicture, &rawPicture, - fCodecContext->pix_fmt, displayWidth, displayHeight); + fCodecContext->pix_fmt, displayWidth, displayHeight); useDeinterlacedPicture = true; } @@ -1717,7 +1719,7 @@ AVCodecDecoder::_DeinterlaceAndColorConvertVideoFrame() } if (fRawDecodedPicture->interlaced_frame) - avpicture_free(&deinterlacedPicture); + av_freep(&deinterlacedPicture.data[0]); return B_OK; } @@ -1787,7 +1789,7 @@ AVCodecDecoder::_InitFilterGraph(enum AVPixelFormat pixfmt, int32 width, \returns B_NO_MEMORY Not enough memory available for correct operation. */ status_t -AVCodecDecoder::_ProcessFilterGraph(AVPicture *dst, const AVPicture *src, +AVCodecDecoder::_ProcessFilterGraph(AVFrame *dst, const AVFrame *src, enum AVPixelFormat pixfmt, int32 width, int32 height) { if (fFilterGraph == NULL || width != fLastWidth @@ -1812,8 +1814,8 @@ AVCodecDecoder::_ProcessFilterGraph(AVPicture *dst, const AVPicture *src, if (ret < 0) return B_BAD_DATA; - av_picture_copy(dst, (const AVPicture *)fFilterFrame, pixfmt, width, - height); + av_image_copy(dst->data, dst->linesize, (const uint8**)fFilterFrame->data, + fFilterFrame->linesize, pixfmt, width, height); av_frame_unref(fFilterFrame); return B_OK; } diff --git a/src/add-ons/media/plugins/ffmpeg/AVCodecDecoder.h b/src/add-ons/media/plugins/ffmpeg/AVCodecDecoder.h index 43a95b3d0f..9319ca937d 100644 --- a/src/add-ons/media/plugins/ffmpeg/AVCodecDecoder.h +++ b/src/add-ons/media/plugins/ffmpeg/AVCodecDecoder.h @@ -22,6 +22,7 @@ extern "C" { #include "avfilter.h" #include "buffersink.h" #include "buffersrc.h" + #include "imgutils.h" #include "swresample.h" #include "swscale.h" } @@ -101,8 +102,8 @@ private: // video deinterlace filter graph status_t _InitFilterGraph(enum AVPixelFormat pixfmt, int32 width, int32 height); - status_t _ProcessFilterGraph(AVPicture *dst, - const AVPicture *src, enum AVPixelFormat pixfmt, + status_t _ProcessFilterGraph(AVFrame *dst, + const AVFrame *src, enum AVPixelFormat pixfmt, int32 width, int32 height); media_header fHeader;