mirror of https://git.ffmpeg.org/ffmpeg.git
avcodec/nvenc: support for HEVC timecode passthrough
Reviewed-by: Timo Rothenpieler <timo@rothenpieler.org> Signed-off-by: Limin Wang <lance.lmwang@gmail.com>
This commit is contained in:
parent
4ef766e73c
commit
fdead2a31a
|
@ -22,6 +22,7 @@
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
#include "nvenc.h"
|
#include "nvenc.h"
|
||||||
|
#include "hevc_sei.h"
|
||||||
|
|
||||||
#include "libavutil/hwcontext_cuda.h"
|
#include "libavutil/hwcontext_cuda.h"
|
||||||
#include "libavutil/hwcontext.h"
|
#include "libavutil/hwcontext.h"
|
||||||
|
@ -2153,6 +2154,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, sei_count);
|
nvenc_codec_specific_pic_params(avctx, &pic_params, sei_data, sei_count);
|
||||||
} else {
|
} else {
|
||||||
pic_params.encodePicFlags = NV_ENC_PIC_FLAG_EOS;
|
pic_params.encodePicFlags = NV_ENC_PIC_FLAG_EOS;
|
||||||
|
|
|
@ -196,6 +196,7 @@ typedef struct NvencContext
|
||||||
int coder;
|
int coder;
|
||||||
int b_ref_mode;
|
int b_ref_mode;
|
||||||
int a53_cc;
|
int a53_cc;
|
||||||
|
int tc;
|
||||||
int dpb_size;
|
int dpb_size;
|
||||||
} NvencContext;
|
} NvencContext;
|
||||||
|
|
||||||
|
|
|
@ -129,6 +129,7 @@ static const AVOption options[] = {
|
||||||
{ "each", "", 0, AV_OPT_TYPE_CONST, { .i64 = 1 }, 0, 0, VE, "b_ref_mode" },
|
{ "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" },
|
{ "middle", "", 0, AV_OPT_TYPE_CONST, { .i64 = 2 }, 0, 0, VE, "b_ref_mode" },
|
||||||
#endif
|
#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)",
|
{ "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 },
|
OFFSET(dpb_size), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, VE },
|
||||||
{ NULL }
|
{ NULL }
|
||||||
|
|
Loading…
Reference in New Issue