After migrating from Jetpack 5 –> 6, I noticed that the H265 encoded video started displaying these artifacts. Since no settings were changed in the encoder, I assume the API or something changed for the encoder pipeline. Does anyone have any idea what would be causing this horizontal banding?
Here is where I set up my encoder:
// Create encoder
snprintf(enc_name, sizeof(enc_name),"%s-enc-%d",
name().c_str(), getpid());
enc = NvVideoEncoder::createVideoEncoder(enc_name, O_NONBLOCK);
if(!enc)
throw std::runtime_error("Failed to create video encoder");
// Format of the capture (encoder output) plane
ret = enc->setCapturePlaneFormat(
enc_fmt, width, height, bitrate / 2);
if(ret < 0)
throw std::runtime_error("Failed to set encoder capture plane format");
// Format of the output (encoder input) plane
ret = enc->setOutputPlaneFormat(
V4L2_PIX_FMT_YUV420M, width, height);
if(ret < 0)
throw std::runtime_error("Failed to set encoder output plane format");
ret = enc->setBitrate(bitrate);
if(ret < 0)
throw std::runtime_error("Failed to set encoder target bitrate");
ret = enc->setPeakBitrate(bitrate \* 1.2f);
if(ret < 0)
throw std::runtime_error("Failed to set encoder peak bitrate");
ret = enc->setRateControlMode(V4L2_MPEG_VIDEO_BITRATE_MODE_VBR);
if(ret < 0)
throw std::runtime_error("Failed to set rate control mode");
if(enc_fmt == V4L2_PIX_FMT_H265) {
if(width < 144 || height < 144)
throw std::runtime_error("Dimensions too small for H.265");
ret = enc->setProfile(V4L2_MPEG_VIDEO_H265_PROFILE_MAIN);
if(ret < 0)
throw std::runtime_error("Failed to set encoder profile");
}
else {
ret = enc->setProfile(V4L2_MPEG_VIDEO_H264_PROFILE_HIGH);
if(ret < 0)
throw std::runtime_error("Failed to set encoder profile");
ret = enc->setLevel(V4L2_MPEG_VIDEO_H264_LEVEL_5_1);
if(ret < 0)
throw std::runtime_error("Failed to set encoder level");
}
ret = enc->setFrameRate(framerate, 1);
if(ret < 0)
throw std::runtime_error("Failed to set encoder framerate");
if(streaming_flag) {
ret = enc->setIFrameInterval(std::max(5, framerate));
if(ret < 0)
throw std::runtime_error("Failed to set Iframe interval");
ret = enc->setIDRInterval(std::max(10, framerate));
if(ret < 0)
throw std::runtime_error("Failed to set IDR interval");
ret = enc->forceIDR();
if(ret < 0)
throw std::runtime_error("Failed to set force IDR");
ret = enc->setNumBFrames(0);
if(ret < 0)
throw std::runtime_error("Failed to disable Bframes");
ret = enc->setInsertAudEnabled(true);
if(ret < 0)
throw std::runtime_error("Failed to enable AUD");
ret = enc->setInsertVuiEnabled(true);
if(ret < 0)
throw std::runtime_error("Failed to enable VUI");
ret = enc->setInsertSpsPpsAtIdrEnabled(true);
if(ret < 0)
throw std::runtime_error("Failed to enable SPS/PPS");
}
else {
ret = enc->setInsertVuiEnabled(true);
if(ret < 0)
throw std::runtime_error("Failed to enable VUI");
ret = enc->setIFrameInterval(framerate);
if(ret < 0)
throw std::runtime_error("Failed to set Iframe interval");
ret = enc->setIDRInterval(framerate \* 4);
if(ret < 0)
throw std::runtime_error("Failed to set IDR interval");
}
ret = enc->setHWPresetType(V4L2_ENC_HW_PRESET_ULTRAFAST);
if(ret < 0)
throw std::runtime_error("Failed to set HW Preset");
ret = enc->capture_plane.setupPlane(
V4L2_MEMORY_MMAP, queue_size, true, false);
if(ret < 0)
throw std::runtime_error("Failed to setup capture plane");
Thank you!
