[FFmpeg-devel] [PATCH v2] avcodec/nvenc: adapt to the new internal encode API
Fu, Linjie
linjie.fu at intel.com
Fri Apr 10 04:04:01 EEST 2020
> From: ffmpeg-devel <ffmpeg-devel-bounces at ffmpeg.org> On Behalf Of
> James Almer
> Sent: Friday, April 10, 2020 02:27
> To: ffmpeg-devel at ffmpeg.org
> Subject: [FFmpeg-devel] [PATCH v2] avcodec/nvenc: adapt to the new
> internal encode API
>
> Signed-off-by: James Almer <jamrial at gmail.com>
> ---
> Version with the flush() callback left in place. But it will need the
> changes i originally added to avcodec_flush_buffers() and then removed
> for the latest iteration of this set, in some form or another.
>
> libavcodec/nvenc.c | 78 ++++++++++++++++++-----------------------
> libavcodec/nvenc.h | 9 ++---
> libavcodec/nvenc_h264.c | 6 ----
> libavcodec/nvenc_hevc.c | 4 ---
> 4 files changed, 36 insertions(+), 61 deletions(-)
>
> diff --git a/libavcodec/nvenc.c b/libavcodec/nvenc.c
> index 9a96bf2bba..700a9a7a97 100644
> --- a/libavcodec/nvenc.c
> +++ b/libavcodec/nvenc.c
> @@ -30,6 +30,7 @@
> #include "libavutil/avassert.h"
> #include "libavutil/mem.h"
> #include "libavutil/pixdesc.h"
> +#include "encode.h"
> #include "internal.h"
>
> #define CHECK_CU(x) FF_CUDA_CHECK_DL(avctx, dl_fn->cuda_dl, x)
> @@ -1491,6 +1492,8 @@ av_cold int
> ff_nvenc_encode_close(AVCodecContext *avctx)
> av_freep(&ctx->surfaces);
> ctx->nb_surfaces = 0;
>
> + av_frame_free(&ctx->frame);
> +
> if (ctx->nvencoder) {
> p_nvenc->nvEncDestroyEncoder(ctx->nvencoder);
>
> @@ -1544,6 +1547,10 @@ av_cold int
> ff_nvenc_encode_init(AVCodecContext *avctx)
> ctx->data_pix_fmt = avctx->pix_fmt;
> }
>
> + ctx->frame = av_frame_alloc();
> + if (!ctx->frame)
> + return AVERROR(ENOMEM);
> +
> if ((ret = nvenc_load_libraries(avctx)) < 0)
> return ret;
>
> @@ -1881,9 +1888,7 @@ static int process_output_surface(AVCodecContext
> *avctx, AVPacket *pkt, NvencSur
> goto error;
> }
>
> - res = pkt->data ?
> - ff_alloc_packet2(avctx, pkt, lock_params.bitstreamSizeInBytes,
> lock_params.bitstreamSizeInBytes) :
> - av_new_packet(pkt, lock_params.bitstreamSizeInBytes);
> + res = av_new_packet(pkt, lock_params.bitstreamSizeInBytes);
>
Is there any specific reason to drop ff_alloc_packet2?
This function calls av_new_packet() with a return check while !pkt->data,
which seems to have an identical logic with this modification, so how about:
res = ff_alloc_packet2(avctx, pkt, lock_params.bitstreamSizeInBytes, lock_params.bitstreamSizeInBytes)
Honestly I've got one question on how to choose between:
1. ff_alloc_packet2(avctx, pkt, lock_params.bitstreamSizeInBytes, lock_params.bitstreamSizeInBytes);// seems to equals av_new_packet while !pkt->data
2. ff_alloc_packet2(avctx, pkt, lock_params.bitstreamSizeInBytes, 0);// seems to be the majority usage of encoder, which uses av_fast_padded_malloc();
3. av_new_packet(pkt, lock_params.bitstreamSizeInBytes);// basic
- Linjie
More information about the ffmpeg-devel
mailing list