@@ -3402,6 +3402,38 @@ srs_error_t SrsRtcPublisherNegotiator::negotiate_publish_capability(SrsRtcUserCo
34023402 }
34033403 }
34043404
3405+ track_desc->type_ = " video" ;
3406+ track_desc->set_codec_payload ((SrsCodecPayload *)video_payload);
3407+ break ;
3408+ }
3409+ } else if (remote_media_desc.is_video () && srs_video_codec_str2id (ruc->codec_ ) == SrsVideoCodecIdVP9) {
3410+ std::vector<SrsMediaPayloadType> payloads = remote_media_desc.find_media_with_encoding_name (" VP9" );
3411+ if (payloads.empty ()) {
3412+ return srs_error_new (ERROR_RTC_SDP_EXCHANGE, " no found valid VP9 payload type" );
3413+ }
3414+
3415+ for (int j = 0 ; j < (int )payloads.size (); j++) {
3416+ const SrsMediaPayloadType &payload = payloads.at (j);
3417+
3418+ // Generate video payload for vp9.
3419+ SrsVideoPayload *video_payload = new SrsVideoPayload (payload.payload_type_ , payload.encoding_name_ , payload.clock_rate_ );
3420+
3421+ // TODO: FIXME: Only support some transport algorithms.
3422+ for (int k = 0 ; k < (int )payload.rtcp_fb_ .size (); ++k) {
3423+ const string &rtcp_fb = payload.rtcp_fb_ .at (k);
3424+
3425+ if (nack_enabled) {
3426+ if (rtcp_fb == " nack" || rtcp_fb == " nack pli" ) {
3427+ video_payload->rtcp_fbs_ .push_back (rtcp_fb);
3428+ }
3429+ }
3430+ if (twcc_enabled && remote_twcc_id) {
3431+ if (rtcp_fb == " transport-cc" ) {
3432+ video_payload->rtcp_fbs_ .push_back (rtcp_fb);
3433+ }
3434+ }
3435+ }
3436+
34053437 track_desc->type_ = " video" ;
34063438 track_desc->set_codec_payload ((SrsCodecPayload *)video_payload);
34073439 break ;
@@ -3804,6 +3836,14 @@ srs_error_t SrsRtcPlayerNegotiator::negotiate_play_capability(SrsRtcUserConfig *
38043836 // @see https://bugs.chromium.org/p/webrtc/issues/detail?id=13166
38053837 track_descs = source->get_track_desc (" video" , " AV1X" );
38063838 }
3839+ } else if (prefer_codec == SrsVideoCodecIdVP9) {
3840+ std::vector<SrsMediaPayloadType> payloads = remote_media_desc.find_media_with_encoding_name (" VP9" );
3841+ if (payloads.empty ()) {
3842+ return srs_error_new (ERROR_RTC_SDP_EXCHANGE, " no found valid VP9 payload type" );
3843+ }
3844+
3845+ remote_payload = payloads.at (0 );
3846+ track_descs = source->get_track_desc (" video" , " VP9" );
38073847 } else if (prefer_codec == SrsVideoCodecIdHEVC) {
38083848 std::vector<SrsMediaPayloadType> payloads = remote_media_desc.find_media_with_encoding_name (" H265" );
38093849 if (payloads.empty ()) {
0 commit comments