|
@@ -80,47 +80,10 @@ int32_t JetsonVideoEncoder::InitEncode(const webrtc::VideoCodec* codec_settings,
|
|
|
height_ = codec_settings->height;
|
|
|
|
|
|
target_bitrate_bps_ = codec_settings->startBitrate * 1000;
|
|
|
- std::cout << "g=heig " << width_ << height_ << target_bitrate_bps_ << std::endl;
|
|
|
-
|
|
|
-key_frame_interval_ = codec_settings->H264().keyFrameInterval;
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
+
|
|
|
+
|
|
|
+ key_frame_interval_ = codec_settings->H264().keyFrameInterval;
|
|
|
+
|
|
|
framerate_ = codec_settings->maxFramerate;
|
|
|
|
|
|
RTC_LOG(LS_INFO) << "InitEncode " << framerate_ << "fps "
|
|
@@ -154,12 +117,8 @@ int32_t JetsonVideoEncoder::JetsonConfigure() {
|
|
|
encoder_ = NvVideoEncoder::createVideoEncoder("enc0");
|
|
|
INIT_ERROR(!encoder_, "Failed to createVideoEncoder");
|
|
|
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- ret =
|
|
|
- encoder_->setCapturePlaneFormat(V4L2_PIX_FMT_H264,
|
|
|
- width_, height_, 2 * 1024 * 1024);
|
|
|
+ ret =encoder_->setCapturePlaneFormat(V4L2_PIX_FMT_H264,width_, height_, 2 * 1024 * 1024);
|
|
|
+ printf("width_;%d, height_:%d\n",width_,height_);
|
|
|
INIT_ERROR(ret < 0, "Failed to encoder setCapturePlaneFormat");
|
|
|
|
|
|
ret = encoder_->setOutputPlaneFormat(V4L2_PIX_FMT_YUV420M, width_, height_);
|
|
@@ -172,20 +131,22 @@ int32_t JetsonVideoEncoder::JetsonConfigure() {
|
|
|
INIT_ERROR(ret < 0, "Failed to setProfile");
|
|
|
|
|
|
|
|
|
+ ret = encoder_->setLevel(V4L2_MPEG_VIDEO_H264_LEVEL_2_1);
|
|
|
|
|
|
|
|
|
ret = encoder_->setNumBFrames(0);
|
|
|
INIT_ERROR(ret < 0, "Failed to setNumBFrames");
|
|
|
|
|
|
-
|
|
|
-
|
|
|
+ ret = encoder_->setInsertSpsPpsAtIdrEnabled(true);
|
|
|
+ INIT_ERROR(ret < 0, "Failed to setInsertSpsPpsAtIdrEnabled");
|
|
|
|
|
|
-
|
|
|
-
|
|
|
+ ret = encoder_->setInsertVuiEnabled(true);
|
|
|
+ INIT_ERROR(ret < 0, "Failed to setInsertSpsPpsAtIdrEnabled");
|
|
|
|
|
|
|
|
|
-
|
|
|
-
|
|
|
+ ret = encoder_->setHWPresetType(V4L2_ENC_HW_PRESET_FAST);
|
|
|
+
|
|
|
+ INIT_ERROR(ret < 0, "Failed to setHWPresetType");
|
|
|
}
|
|
|
|
|
|
ret = encoder_->setRateControlMode(V4L2_MPEG_VIDEO_BITRATE_MODE_CBR);
|
|
@@ -196,9 +157,6 @@ int32_t JetsonVideoEncoder::JetsonConfigure() {
|
|
|
SetBitrateBps(target_bitrate_bps_);
|
|
|
|
|
|
ret = encoder_->setIDRInterval(key_frame_interval_);
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
INIT_ERROR(ret < 0, "Failed to setIDRInterval");
|
|
|
|
|
|
|
|
@@ -396,6 +354,7 @@ int32_t JetsonVideoEncoder::RegisterEncodeCompleteCallback(
|
|
|
}
|
|
|
|
|
|
void JetsonVideoEncoder::SetRates(const RateControlParameters& parameters) {
|
|
|
+
|
|
|
if (encoder_ == nullptr)
|
|
|
return;
|
|
|
if (parameters.bitrate.get_sum_bps() <= 0 || parameters.framerate_fps <= 0)
|
|
@@ -434,14 +393,7 @@ void JetsonVideoEncoder::SetBitrateBps(uint32_t bitrate_bps) {
|
|
|
configured_bitrate_bps_ = bitrate_bps;
|
|
|
|
|
|
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
+
|
|
|
|
|
|
if (encoder_->setBitrate(bitrate_bps) < 0) {
|
|
|
RTC_LOG(LS_ERROR) << "Failed to setBitrate";
|
|
@@ -453,39 +405,17 @@ webrtc::VideoEncoder::EncoderInfo JetsonVideoEncoder::GetEncoderInfo() const {
|
|
|
EncoderInfo info;
|
|
|
info.supports_native_handle = true;
|
|
|
info.implementation_name = "Jetson Video Encoder";
|
|
|
-
|
|
|
- static const int kLowH264QpThreshold = 34;
|
|
|
- static const int kHighH264QpThreshold = 40;
|
|
|
- info.scaling_settings = VideoEncoder::ScalingSettings(kLowH264QpThreshold,
|
|
|
- kHighH264QpThreshold);
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
+ static const int kLowH264QpThreshold = 24;
|
|
|
+ static const int kHighH264QpThreshold = 37;
|
|
|
+ info.scaling_settings = VideoEncoder::ScalingSettings(kLowH264QpThreshold,
|
|
|
+ kHighH264QpThreshold);
|
|
|
return info;
|
|
|
}
|
|
|
|
|
|
int32_t JetsonVideoEncoder::Encode(
|
|
|
const webrtc::VideoFrame& input_frame,
|
|
|
const std::vector<webrtc::VideoFrameType>* frame_types) {
|
|
|
+
|
|
|
if (!callback_) {
|
|
|
RTC_LOG(LS_WARNING)
|
|
|
<< "InitEncode() has been called, but a callback function "
|
|
@@ -501,16 +431,9 @@ int32_t JetsonVideoEncoder::Encode(
|
|
|
|
|
|
if (frame_buffer->type() == webrtc::VideoFrameBuffer::Type::kNative) {
|
|
|
use_native_ = true;
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
+
|
|
|
} else {
|
|
|
+
|
|
|
use_native_ = false;
|
|
|
}
|
|
|
|
|
@@ -662,7 +585,6 @@ int32_t JetsonVideoEncoder::Encode(
|
|
|
encoder_->output_plane.getNumQueuedBuffers());
|
|
|
v4l2_buf.index = encoder_->output_plane.getNumQueuedBuffers();
|
|
|
}
|
|
|
-
|
|
|
rtc::scoped_refptr<const webrtc::I420BufferInterface> i420_buffer =
|
|
|
frame_buffer->ToI420();
|
|
|
for (uint32_t i = 0; i < buffer->n_planes; i++) {
|
|
@@ -747,18 +669,14 @@ int32_t JetsonVideoEncoder::SendFrame(
|
|
|
|
|
|
|
|
|
if (enc_metadata->KeyFrame) {
|
|
|
-
|
|
|
encoded_image_._frameType= webrtc::VideoFrameType::kVideoFrameKey;
|
|
|
} else {
|
|
|
encoded_image_._frameType= webrtc::VideoFrameType::kVideoFrameDelta;
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
}
|
|
|
|
|
|
webrtc::CodecSpecificInfo codec_specific;
|
|
|
codec_specific.codecType = codec_.codecType;
|
|
|
-
|
|
|
+
|
|
|
auto encoded_image_buffer =
|
|
|
webrtc::EncodedImageBuffer::Create(buffer, size);
|
|
|
encoded_image_.SetEncodedData(encoded_image_buffer);
|
|
@@ -766,13 +684,8 @@ int32_t JetsonVideoEncoder::SendFrame(
|
|
|
codec_specific.codecSpecific.H264.packetization_mode =
|
|
|
webrtc::H264PacketizationMode::NonInterleaved;
|
|
|
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
+
|
|
|
|
|
|
-
|
|
|
RTC_LOG(LS_VERBOSE) << "key_frame=" << enc_metadata->KeyFrame
|
|
|
<< " size=" << size << " qp=" << encoded_image_.qp_;
|
|
|
|