[FFmpeg-devel] [PATCH v4 7/7] avcodec/nvenc: support for HEVC timecode passthrough
lance.lmwang at gmail.com
lance.lmwang at gmail.com
Wed Jun 24 16:43:20 EEST 2020
From: Limin Wang <lance.lmwang at gmail.com>
Reviewed-by: Timo Rothenpieler <timo at rothenpieler.org>
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 22c19f3..4efd532 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"
@@ -2147,6 +2148,22 @@ static int 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);
} else {
pic_params.encodePicFlags = NV_ENC_PIC_FLAG_EOS;
diff --git a/libavcodec/nvenc.h b/libavcodec/nvenc.h
index 007721a..b67abca 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 434dc66..45dda3d 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
More information about the ffmpeg-devel
mailing list