@ -151,6 +151,7 @@ typedef struct NvencContext
void * nvencoder ;
char * preset ;
char * profile ;
int cbr ;
int twopass ;
int gpu ;
@ -729,26 +730,6 @@ static av_cold int nvenc_encode_init(AVCodecContext *avctx)
ctx - > encode_config . frameFieldMode = NV_ENC_PARAMS_FRAME_FIELD_MODE_FRAME ;
}
switch ( avctx - > profile ) {
case FF_PROFILE_HEVC_MAIN :
ctx - > encode_config . profileGUID = NV_ENC_HEVC_PROFILE_MAIN_GUID ;
break ;
case FF_PROFILE_H264_BASELINE :
ctx - > encode_config . profileGUID = NV_ENC_H264_PROFILE_BASELINE_GUID ;
break ;
case FF_PROFILE_H264_MAIN :
ctx - > encode_config . profileGUID = NV_ENC_H264_PROFILE_MAIN_GUID ;
break ;
case FF_PROFILE_H264_HIGH :
case FF_PROFILE_UNKNOWN :
ctx - > encode_config . profileGUID = NV_ENC_H264_PROFILE_HIGH_GUID ;
break ;
default :
av_log ( avctx , AV_LOG_WARNING , " Unsupported profile requested, falling back to high \n " ) ;
ctx - > encode_config . profileGUID = NV_ENC_H264_PROFILE_HIGH_GUID ;
break ;
}
switch ( avctx - > codec - > id ) {
case AV_CODEC_ID_H264 :
ctx - > encode_config . encodeCodecConfig . h264Config . h264VUIParameters . colourDescriptionPresentFlag = 1 ;
@ -762,10 +743,48 @@ static av_cold int nvenc_encode_init(AVCodecContext *avctx)
ctx - > encode_config . encodeCodecConfig . h264Config . disableSPSPPS = ( avctx - > flags & CODEC_FLAG_GLOBAL_HEADER ) ? 1 : 0 ;
ctx - > encode_config . encodeCodecConfig . h264Config . repeatSPSPPS = ( avctx - > flags & CODEC_FLAG_GLOBAL_HEADER ) ? 0 : 1 ;
if ( ! ctx - > profile ) {
switch ( avctx - > profile ) {
case FF_PROFILE_H264_BASELINE :
ctx - > encode_config . profileGUID = NV_ENC_H264_PROFILE_BASELINE_GUID ;
break ;
case FF_PROFILE_H264_MAIN :
ctx - > encode_config . profileGUID = NV_ENC_H264_PROFILE_MAIN_GUID ;
break ;
case FF_PROFILE_H264_HIGH :
case FF_PROFILE_UNKNOWN :
ctx - > encode_config . profileGUID = NV_ENC_H264_PROFILE_HIGH_GUID ;
break ;
default :
av_log ( avctx , AV_LOG_WARNING , " Unsupported profile requested, falling back to high \n " ) ;
ctx - > encode_config . profileGUID = NV_ENC_H264_PROFILE_HIGH_GUID ;
break ;
}
} else {
if ( ! strcmp ( ctx - > profile , " high " ) ) {
ctx - > encode_config . profileGUID = NV_ENC_H264_PROFILE_HIGH_GUID ;
avctx - > profile = FF_PROFILE_H264_HIGH ;
} else if ( ! strcmp ( ctx - > profile , " main " ) ) {
ctx - > encode_config . profileGUID = NV_ENC_H264_PROFILE_MAIN_GUID ;
avctx - > profile = FF_PROFILE_H264_MAIN ;
} else if ( ! strcmp ( ctx - > profile , " baseline " ) ) {
ctx - > encode_config . profileGUID = NV_ENC_H264_PROFILE_BASELINE_GUID ;
avctx - > profile = FF_PROFILE_H264_BASELINE ;
} else {
av_log ( avctx , AV_LOG_FATAL , " Profile \" %s \" is unknown! Supported profiles: high, main, baseline \n " , ctx - > profile ) ;
res = AVERROR ( EINVAL ) ;
goto error ;
}
}
break ;
case AV_CODEC_ID_H265 :
ctx - > encode_config . encodeCodecConfig . hevcConfig . disableSPSPPS = ( avctx - > flags & CODEC_FLAG_GLOBAL_HEADER ) ? 1 : 0 ;
ctx - > encode_config . encodeCodecConfig . hevcConfig . repeatSPSPPS = ( avctx - > flags & CODEC_FLAG_GLOBAL_HEADER ) ? 0 : 1 ;
/* No other profile is supported in the current SDK version 5 */
ctx - > encode_config . profileGUID = NV_ENC_HEVC_PROFILE_MAIN_GUID ;
avctx - > profile = FF_PROFILE_HEVC_MAIN ;
break ;
/* Earlier switch/case will return if unknown codec is passed. */
}
@ -1258,6 +1277,7 @@ static enum AVPixelFormat pix_fmts_nvenc[] = {
# define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
static const AVOption options [ ] = {
{ " preset " , " Set the encoding preset (one of hq, hp, bd, ll, llhq, llhp, default) " , OFFSET ( preset ) , AV_OPT_TYPE_STRING , { . str = " hq " } , 0 , 0 , VE } ,
{ " profile " , " Set the encoding profile (high, main or baseline) " , OFFSET ( profile ) , AV_OPT_TYPE_STRING , { 0 } , 0 , 0 , VE } ,
{ " cbr " , " Use cbr encoding mode " , OFFSET ( cbr ) , AV_OPT_TYPE_INT , { . i64 = 0 } , 0 , 1 , VE } ,
{ " 2pass " , " Use 2pass cbr encoding mode (low latency mode only) " , OFFSET ( twopass ) , AV_OPT_TYPE_INT , { . i64 = - 1 } , - 1 , 1 , VE } ,
{ " gpu " , " Selects which NVENC capable GPU to use. First GPU is 0, second is 1, and so on. " , OFFSET ( gpu ) , AV_OPT_TYPE_INT , { . i64 = 0 } , 0 , INT_MAX , VE } ,