Skip to content

Commit

Permalink
Modify the play stream to specify encoding format.
Browse files Browse the repository at this point in the history
  • Loading branch information
chundonglinlin committed Feb 22, 2025
1 parent 8953dbf commit c2e31d1
Show file tree
Hide file tree
Showing 3 changed files with 57 additions and 17 deletions.
31 changes: 14 additions & 17 deletions trunk/src/app/srs_app_rtc_source.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -483,23 +483,6 @@ void SrsRtcSource::init_for_play_before_publishing()
video_track_desc->media_ = video_payload;

video_payload->set_h264_param_desc("level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f");

#ifdef SRS_H265
// default h265 video track description
SrsRtcTrackDescription* h265_video_track_desc = new SrsRtcTrackDescription();
stream_desc->video_track_descs_.push_back(h265_video_track_desc);

h265_video_track_desc->type_ = "video";
h265_video_track_desc->id_ = "video-" + srs_random_str(8);
h265_video_track_desc->ssrc_ = video_ssrc;
h265_video_track_desc->direction_ = "recvonly";

SrsVideoPayload* h265_video_payload = new SrsVideoPayload(kVideoPayloadType, "H265", kVideoSamplerate);
h265_video_track_desc->media_ = h265_video_payload;

h265_video_payload->set_h265_param_desc("level-id=180;profile-id=1;tier-flag=0;tx-mode=SRST");
#endif

}

set_stream_desc(stream_desc.get());
Expand Down Expand Up @@ -1090,6 +1073,20 @@ srs_error_t SrsRtcRtpBuilder::on_video(SrsSharedPtrMessage* msg)
return err;
}

// support video codec: h264/h265
SrsVideoCodecId vcodec = format->vcodec->id;
if (vcodec != SrsVideoCodecIdAVC && vcodec != SrsVideoCodecIdHEVC) {
return err;
}

#ifdef SRS_H265
if (vcodec == SrsVideoCodecIdHEVC) {
if ((err = bridge_->update_codec(vcodec)) != srs_success) {
return srs_error_wrap(err, "update codec");
}
}
#endif

bool has_idr = false;
vector<SrsSample*> samples;
if ((err = filter(msg, format, has_idr, samples)) != srs_success) {
Expand Down
40 changes: 40 additions & 0 deletions trunk/src/app/srs_app_stream_bridge.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,8 @@ SrsFrameToRtcBridge::SrsFrameToRtcBridge(SrsSharedPtr<SrsRtcSource> source)

rtp_builder_ = new SrsRtcRtpBuilder(this, audio_ssrc, audio_payload_type, video_ssrc, video_payload_type);
#endif

codec_switched_ = false;
}

SrsFrameToRtcBridge::~SrsFrameToRtcBridge()
Expand Down Expand Up @@ -156,6 +158,44 @@ srs_error_t SrsFrameToRtcBridge::on_rtp(SrsRtpPacket* pkt)
return source_->on_rtp(pkt);
}

srs_error_t SrsFrameToRtcBridge::update_codec(SrsVideoCodecId id)
{
srs_error_t err = srs_success;

// Only handle H.265/HEVC codec switch.
if (id != SrsVideoCodecIdHEVC) {
return err;
}

if (codec_switched_) {
return err;
}

// Check if H.265 track description exists
if (!source_->get_track_desc("video", "H265").empty()) {
return err;
}

// Try to convert H.264 track to H.265
std::vector<SrsRtcTrackDescription*> video_track_descs = source_->get_track_desc("video", "H264");
if (video_track_descs.empty()) {
return srs_error_new(ERROR_RTC_NO_TRACK, "no H264 track found for conversion");
}

SrsRtcTrackDescription* video_track_desc = video_track_descs.at(0);
SrsVideoPayload* video_payload = (SrsVideoPayload*)video_track_desc->media_;
video_payload->name_ = "H265";
video_payload->set_h265_param_desc("level-id=180;profile-id=1;tier-flag=0;tx-mode=SRST");

codec_switched_ = true;

srs_trace("RTC: Switch video codec %d(%s) to %d(%s)",
SrsVideoCodecIdAVC, srs_video_codec_id2str(SrsVideoCodecIdAVC).c_str(),
id, srs_video_codec_id2str(id).c_str());

return err;
}

#endif

SrsCompositeBridge::SrsCompositeBridge()
Expand Down
3 changes: 3 additions & 0 deletions trunk/src/app/srs_app_stream_bridge.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,8 @@ class SrsFrameToRtcBridge : public ISrsStreamBridge
#if defined(SRS_FFMPEG_FIT)
SrsRtcRtpBuilder* rtp_builder_;
#endif
private:
bool codec_switched_;
public:
SrsFrameToRtcBridge(SrsSharedPtr<SrsRtcSource> source);
virtual ~SrsFrameToRtcBridge();
Expand All @@ -74,6 +76,7 @@ class SrsFrameToRtcBridge : public ISrsStreamBridge
virtual void on_unpublish();
virtual srs_error_t on_frame(SrsSharedPtrMessage* frame);
srs_error_t on_rtp(SrsRtpPacket* pkt);
srs_error_t update_codec(SrsVideoCodecId id);
};
#endif

Expand Down

0 comments on commit c2e31d1

Please sign in to comment.