瀏覽代碼

Add AV1 packetizer to C API

Paul-Louis Ageneau 1 年之前
父節點
當前提交
a2a98c0791
共有 2 個文件被更改,包括 39 次插入2 次删除
  1. 11 2
      include/rtc/rtc.h
  2. 28 0
      src/capi.cpp

+ 11 - 2
include/rtc/rtc.h

@@ -113,6 +113,7 @@ typedef enum {
 	RTC_CODEC_VP8 = 1,
 	RTC_CODEC_VP8 = 1,
 	RTC_CODEC_VP9 = 2,
 	RTC_CODEC_VP9 = 2,
 	RTC_CODEC_H265 = 3,
 	RTC_CODEC_H265 = 3,
+	RTC_CODEC_AV1 = 4,
 
 
 	// audio
 	// audio
 	RTC_CODEC_OPUS = 128,
 	RTC_CODEC_OPUS = 128,
@@ -315,9 +316,14 @@ typedef struct {
 	uint16_t sequenceNumber;
 	uint16_t sequenceNumber;
 	uint32_t timestamp;
 	uint32_t timestamp;
 
 
-	// H264/H265
+	// H264/H265 only
 	rtcNalUnitSeparator nalSeparator; // NAL unit separator
 	rtcNalUnitSeparator nalSeparator; // NAL unit separator
-	uint16_t maxFragmentSize;         // Maximum NAL unit fragment size
+
+	// H264, H265, AV1
+	uint16_t maxFragmentSize; // Maximum fragment size
+
+	// AV1 only
+	rtcObuPacketization obuPacketization; // OBU paketization for AV1 samples
 
 
 } rtcPacketizationHandlerInit;
 } rtcPacketizationHandlerInit;
 
 
@@ -348,6 +354,9 @@ RTC_C_EXPORT int rtcSetH264PacketizationHandler(int tr, const rtcPacketizationHa
 // Set H265PacketizationHandler for track
 // Set H265PacketizationHandler for track
 RTC_C_EXPORT int rtcSetH265PacketizationHandler(int tr, const rtcPacketizationHandlerInit *init);
 RTC_C_EXPORT int rtcSetH265PacketizationHandler(int tr, const rtcPacketizationHandlerInit *init);
 
 
+// Set AV1PacketizationHandler for track
+RTC_C_EXPORT int rtcSetAV1PacketizationHandler(int tr, const rtcPacketizationHandlerInit *init);
+
 // Set OpusPacketizationHandler for track
 // Set OpusPacketizationHandler for track
 RTC_C_EXPORT int rtcSetOpusPacketizationHandler(int tr, const rtcPacketizationHandlerInit *init);
 RTC_C_EXPORT int rtcSetOpusPacketizationHandler(int tr, const rtcPacketizationHandlerInit *init);
 
 

+ 28 - 0
src/capi.cpp

@@ -1032,6 +1032,7 @@ int rtcAddTrackEx(int pc, const rtcTrackInit *init) {
 			mid = string(init->mid);
 			mid = string(init->mid);
 		} else {
 		} else {
 			switch (init->codec) {
 			switch (init->codec) {
+			case RTC_CODEC_AV1:
 			case RTC_CODEC_H264:
 			case RTC_CODEC_H264:
 			case RTC_CODEC_H265:
 			case RTC_CODEC_H265:
 			case RTC_CODEC_VP8:
 			case RTC_CODEC_VP8:
@@ -1055,12 +1056,16 @@ int rtcAddTrackEx(int pc, const rtcTrackInit *init) {
 
 
 		unique_ptr<Description::Media> description;
 		unique_ptr<Description::Media> description;
 		switch (init->codec) {
 		switch (init->codec) {
+		case RTC_CODEC_AV1:
 		case RTC_CODEC_H264:
 		case RTC_CODEC_H264:
 		case RTC_CODEC_H265:
 		case RTC_CODEC_H265:
 		case RTC_CODEC_VP8:
 		case RTC_CODEC_VP8:
 		case RTC_CODEC_VP9: {
 		case RTC_CODEC_VP9: {
 			auto video = std::make_unique<Description::Video>(mid, direction);
 			auto video = std::make_unique<Description::Video>(mid, direction);
 			switch (init->codec) {
 			switch (init->codec) {
+			case RTC_CODEC_AV1:
+				video->addAV1Codec(pt, profile);
+				break;
 			case RTC_CODEC_H264:
 			case RTC_CODEC_H264:
 				video->addH264Codec(pt, profile);
 				video->addH264Codec(pt, profile);
 				break;
 				break;
@@ -1256,6 +1261,29 @@ int rtcSetH265PacketizationHandler(int tr, const rtcPacketizationHandlerInit *in
 	});
 	});
 }
 }
 
 
+int rtcSetAV1PacketizationHandler(int tr, const rtcPacketizationHandlerInit *init) {
+	return wrap([&] {
+		auto track = getTrack(tr);
+		// create RTP configuration
+		auto rtpConfig = createRtpPacketizationConfig(init);
+		// create packetizer
+		auto maxFragmentSize = init && init->maxFragmentSize ? init->maxFragmentSize
+		                                                     : RTC_DEFAULT_MAXIMUM_FRAGMENT_SIZE;
+		auto packetization = init->obuPacketization == RTC_OBU_PACKETIZED_TEMPORAL_UNIT
+		                         ? AV1RtpPacketizer::Packetization::TemporalUnit
+		                         : AV1RtpPacketizer::Packetization::Obu;
+		auto packetizer =
+		    std::make_shared<AV1RtpPacketizer>(packetization, rtpConfig, maxFragmentSize);
+		// create AV1 handler
+		auto av1Handler = std::make_shared<AV1PacketizationHandler>(packetizer);
+		emplaceMediaChainableHandler(av1Handler, tr);
+		emplaceRtpConfig(rtpConfig, tr);
+		// set handler
+		track->setMediaHandler(av1Handler);
+		return RTC_ERR_SUCCESS;
+	});
+}
+
 int rtcSetOpusPacketizationHandler(int tr, const rtcPacketizationHandlerInit *init) {
 int rtcSetOpusPacketizationHandler(int tr, const rtcPacketizationHandlerInit *init) {
 	return wrap([&] {
 	return wrap([&] {
 		auto track = getTrack(tr);
 		auto track = getTrack(tr);