[FFmpeg-devel] [PATCH v3 5/5] avcodec/nvenc: support for HEVC timecode passthrough
lance.lmwang at gmail.com
lance.lmwang at gmail.com
Tue Jun 23 17:44:22 EEST 2020
On Thu, Jun 18, 2020 at 12:32:57PM +0800, lance.lmwang at gmail.com wrote:
> From: Limin Wang <lance.lmwang at gmail.com>
>
> Signed-off-by: Limin Wang <lance.lmwang at gmail.com>
> ---
> libavcodec/nvenc.c | 17 +++++++++++++++++
> libavcodec/nvenc.h | 1 +
> libavcodec/nvenc_hevc.c | 1 +
> 3 files changed, 19 insertions(+)
>
> diff --git a/libavcodec/nvenc.c b/libavcodec/nvenc.c
> index e4356ce..81e8338 100644
> --- a/libavcodec/nvenc.c
> +++ b/libavcodec/nvenc.c
> @@ -22,6 +22,7 @@
> #include "config.h"
>
> #include "nvenc.h"
> +#include "hevc_sei.h"
>
> #include "libavutil/hwcontext_cuda.h"
> #include "libavutil/hwcontext.h"
> @@ -2156,6 +2157,22 @@ int ff_nvenc_send_frame(AVCodecContext *avctx, const AVFrame *frame)
> }
> }
>
> + if (ctx->tc && av_frame_get_side_data(frame, AV_FRAME_DATA_S12M_TIMECODE)) {
> + void *tc_data = NULL;
> + size_t tc_size = 0;
> +
> + if (ff_alloc_timecode_sei(frame, 0, (void**)&tc_data, &tc_size) < 0) {
> + av_log(ctx, AV_LOG_ERROR, "Not enough memory for timecode sei, skipping\n");
> + }
> +
> + if (tc_data) {
> + sei_data[sei_count].payloadSize = (uint32_t)tc_size;
> + sei_data[sei_count].payloadType = HEVC_SEI_TYPE_TIME_CODE;
> + sei_data[sei_count].payload = (uint8_t*)tc_data;
> + sei_count ++;
> + }
> + }
> +
> nvenc_codec_specific_pic_params(avctx, &pic_params, sei_data, sei_count);
> } else {
> pic_params.encodePicFlags = NV_ENC_PIC_FLAG_EOS;
> diff --git a/libavcodec/nvenc.h b/libavcodec/nvenc.h
> index 7a415a4..f1adaeb 100644
> --- a/libavcodec/nvenc.h
> +++ b/libavcodec/nvenc.h
> @@ -196,6 +196,7 @@ typedef struct NvencContext
> int coder;
> int b_ref_mode;
> int a53_cc;
> + int tc;
> int dpb_size;
> } NvencContext;
>
> diff --git a/libavcodec/nvenc_hevc.c b/libavcodec/nvenc_hevc.c
> index 7f12b56..74ca548 100644
> --- a/libavcodec/nvenc_hevc.c
> +++ b/libavcodec/nvenc_hevc.c
> @@ -129,6 +129,7 @@ static const AVOption options[] = {
> { "each", "", 0, AV_OPT_TYPE_CONST, { .i64 = 1 }, 0, 0, VE, "b_ref_mode" },
> { "middle", "", 0, AV_OPT_TYPE_CONST, { .i64 = 2 }, 0, 0, VE, "b_ref_mode" },
> #endif
> + { "tc", "Use timecode (if available)", OFFSET(tc), AV_OPT_TYPE_BOOL, { .i64 = 1 }, 0, 1, VE },
> { "dpb_size", "Specifies the DPB size used for encoding (0 means automatic)",
> OFFSET(dpb_size), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, VE },
> { NULL }
> --
> 1.8.3.1
>
ping
--
Thanks,
Limin Wang
More information about the ffmpeg-devel
mailing list