1- #include " codecs/jetson/jetson_h264_encoder .h"
1+ #include " codecs/jetson/jetson_video_encoder .h"
22#include " common/logging.h"
33#include " common/v4l2_frame_buffer.h"
44
5- std::unique_ptr<webrtc::VideoEncoder> JetsonH264Encoder::Create (Args args) {
6- return std::make_unique<JetsonH264Encoder>(args);
5+ #include < modules/video_coding/include/video_codec_interface.h>
6+
7+ std::unique_ptr<webrtc::VideoEncoder> JetsonVideoEncoder::Create (Args args) {
8+ return std::make_unique<JetsonVideoEncoder>(args);
79}
810
9- JetsonH264Encoder::JetsonH264Encoder (Args args)
11+ JetsonVideoEncoder::JetsonVideoEncoder (Args args)
1012 : fps_adjuster_(args.fps),
1113 bitrate_adjuster_(.85 , 1 ),
1214 callback_(nullptr ) {}
1315
14- int32_t JetsonH264Encoder ::InitEncode (const webrtc::VideoCodec *codec_settings,
15- const VideoEncoder::Settings &settings) {
16+ int32_t JetsonVideoEncoder ::InitEncode (const webrtc::VideoCodec *codec_settings,
17+ const VideoEncoder::Settings &settings) {
1618 codec_ = *codec_settings;
1719 width_ = codec_settings->width ;
1820 height_ = codec_settings->height ;
@@ -21,25 +23,21 @@ int32_t JetsonH264Encoder::InitEncode(const webrtc::VideoCodec *codec_settings,
2123 encoded_image_.timing_ .flags = webrtc::VideoSendTiming::TimingFrameFlags::kInvalid ;
2224 encoded_image_.content_type_ = webrtc::VideoContentType::UNSPECIFIED;
2325
24- if (codec_.codecType != webrtc::kVideoCodecH264 ) {
25- return WEBRTC_VIDEO_CODEC_ERROR;
26- }
27-
2826 return WEBRTC_VIDEO_CODEC_OK;
2927}
3028
31- int32_t JetsonH264Encoder ::RegisterEncodeCompleteCallback (webrtc::EncodedImageCallback *callback) {
29+ int32_t JetsonVideoEncoder ::RegisterEncodeCompleteCallback (webrtc::EncodedImageCallback *callback) {
3230 callback_ = callback;
3331 return WEBRTC_VIDEO_CODEC_OK;
3432}
3533
36- int32_t JetsonH264Encoder ::Release () {
34+ int32_t JetsonVideoEncoder ::Release () {
3735 encoder_.reset ();
3836 return WEBRTC_VIDEO_CODEC_OK;
3937}
4038
41- int32_t JetsonH264Encoder ::Encode (const webrtc::VideoFrame &frame,
42- const std::vector<webrtc::VideoFrameType> *frame_types) {
39+ int32_t JetsonVideoEncoder ::Encode (const webrtc::VideoFrame &frame,
40+ const std::vector<webrtc::VideoFrameType> *frame_types) {
4341 if (!frame_types) {
4442 return WEBRTC_VIDEO_CODEC_NO_OUTPUT;
4543 }
@@ -51,8 +49,12 @@ int32_t JetsonH264Encoder::Encode(const webrtc::VideoFrame &frame,
5149 auto v4l2_frame_buffer = V4L2FrameBufferRef (static_cast <V4L2FrameBuffer *>(frame_buffer.get ()));
5250
5351 if (!encoder_) {
52+ auto codec_fmt = GetV4L2CodecFormat (codec_.codecType );
53+ if (codec_fmt == 0 ) {
54+ return WEBRTC_VIDEO_CODEC_ENCODER_FAILURE;
55+ }
5456 encoder_ =
55- JetsonEncoder::Create (width_, height_, V4L2_PIX_FMT_H264 ,
57+ JetsonEncoder::Create (width_, height_, codec_fmt ,
5658 frame_buffer->type () == webrtc::VideoFrameBuffer::Type::kNative );
5759 }
5860
@@ -68,7 +70,7 @@ int32_t JetsonH264Encoder::Encode(const webrtc::VideoFrame &frame,
6870 return WEBRTC_VIDEO_CODEC_OK;
6971}
7072
71- void JetsonH264Encoder ::SetRates (const RateControlParameters ¶meters) {
73+ void JetsonVideoEncoder ::SetRates (const RateControlParameters ¶meters) {
7274 if (parameters.bitrate .get_sum_bps () <= 0 || parameters.framerate_fps <= 0 ) {
7375 return ;
7476 }
@@ -82,22 +84,25 @@ void JetsonH264Encoder::SetRates(const RateControlParameters ¶meters) {
8284 encoder_->SetBitrate (bitrate_adjuster_.GetAdjustedBitrateBps ());
8385}
8486
85- webrtc::VideoEncoder::EncoderInfo JetsonH264Encoder ::GetEncoderInfo () const {
87+ webrtc::VideoEncoder::EncoderInfo JetsonVideoEncoder ::GetEncoderInfo () const {
8688 EncoderInfo info;
8789 info.supports_native_handle = true ;
8890 info.is_hardware_accelerated = true ;
89- info.implementation_name = " Jetson H264 Hardware Encoder" ;
91+ info.implementation_name = " Jetson Hardware Encoder" ;
9092 return info;
9193}
9294
93- void JetsonH264Encoder ::SendFrame (const webrtc::VideoFrame &frame, V4L2Buffer &encoded_buffer) {
95+ void JetsonVideoEncoder ::SendFrame (const webrtc::VideoFrame &frame, V4L2Buffer &encoded_buffer) {
9496 auto encoded_image_buffer =
9597 webrtc::EncodedImageBuffer::Create ((uint8_t *)encoded_buffer.start , encoded_buffer.length );
9698
9799 webrtc::CodecSpecificInfo codec_specific;
98- codec_specific.codecType = webrtc::kVideoCodecH264 ;
99- codec_specific.codecSpecific .H264 .packetization_mode =
100- webrtc::H264PacketizationMode::NonInterleaved;
100+ codec_specific.codecType = codec_.codecType ;
101+
102+ if (codec_specific.codecType == webrtc::kVideoCodecH264 ) {
103+ codec_specific.codecSpecific .H264 .packetization_mode =
104+ webrtc::H264PacketizationMode::NonInterleaved;
105+ }
101106
102107 encoded_image_.SetEncodedData (encoded_image_buffer);
103108 encoded_image_.SetTimestamp (frame.timestamp ());
@@ -116,3 +121,18 @@ void JetsonH264Encoder::SendFrame(const webrtc::VideoFrame &frame, V4L2Buffer &e
116121 ERROR_PRINT (" Failed to send the frame => %d" , result.error );
117122 }
118123}
124+
125+ uint32_t JetsonVideoEncoder::GetV4L2CodecFormat (webrtc::VideoCodecType type) {
126+ switch (type) {
127+ case webrtc::kVideoCodecVP8 :
128+ return V4L2_PIX_FMT_VP8;
129+ case webrtc::kVideoCodecVP9 :
130+ return V4L2_PIX_FMT_VP9;
131+ case webrtc::kVideoCodecAV1 :
132+ return V4L2_PIX_FMT_AV1;
133+ case webrtc::kVideoCodecH264 :
134+ return V4L2_PIX_FMT_H264;
135+ default :
136+ return 0 ;
137+ }
138+ }
0 commit comments