[FFmpeg-devel] [PATCH v3 5/5] avcodec/nvenc: support for HEVC timecode passthrough

Timo Rothenpieler timo at rothenpieler.org
Tue Jun 23 18:39:01 EEST 2020


On 23.06.2020 16:44, lance.lmwang at gmail.com wrote:
> 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
> 

The nvenc changes look fine to me, minus a few stylistic changes.
But I can't properly comment on the de/encoding.


More information about the ffmpeg-devel mailing list