mirror of
https://github.com/ossrs/srs.git
synced 2025-03-09 15:49:59 +00:00
Modify the play stream to specify encoding format.
This commit is contained in:
parent
8953dbfba1
commit
c2e31d1578
3 changed files with 57 additions and 17 deletions
|
@ -483,23 +483,6 @@ void SrsRtcSource::init_for_play_before_publishing()
|
||||||
video_track_desc->media_ = video_payload;
|
video_track_desc->media_ = video_payload;
|
||||||
|
|
||||||
video_payload->set_h264_param_desc("level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f");
|
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());
|
set_stream_desc(stream_desc.get());
|
||||||
|
@ -1090,6 +1073,20 @@ srs_error_t SrsRtcRtpBuilder::on_video(SrsSharedPtrMessage* msg)
|
||||||
return err;
|
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;
|
bool has_idr = false;
|
||||||
vector<SrsSample*> samples;
|
vector<SrsSample*> samples;
|
||||||
if ((err = filter(msg, format, has_idr, samples)) != srs_success) {
|
if ((err = filter(msg, format, has_idr, samples)) != srs_success) {
|
||||||
|
|
|
@ -95,6 +95,8 @@ SrsFrameToRtcBridge::SrsFrameToRtcBridge(SrsSharedPtr<SrsRtcSource> source)
|
||||||
|
|
||||||
rtp_builder_ = new SrsRtcRtpBuilder(this, audio_ssrc, audio_payload_type, video_ssrc, video_payload_type);
|
rtp_builder_ = new SrsRtcRtpBuilder(this, audio_ssrc, audio_payload_type, video_ssrc, video_payload_type);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
codec_switched_ = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
SrsFrameToRtcBridge::~SrsFrameToRtcBridge()
|
SrsFrameToRtcBridge::~SrsFrameToRtcBridge()
|
||||||
|
@ -156,6 +158,44 @@ srs_error_t SrsFrameToRtcBridge::on_rtp(SrsRtpPacket* pkt)
|
||||||
return source_->on_rtp(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
|
#endif
|
||||||
|
|
||||||
SrsCompositeBridge::SrsCompositeBridge()
|
SrsCompositeBridge::SrsCompositeBridge()
|
||||||
|
|
|
@ -65,6 +65,8 @@ private:
|
||||||
#if defined(SRS_FFMPEG_FIT)
|
#if defined(SRS_FFMPEG_FIT)
|
||||||
SrsRtcRtpBuilder* rtp_builder_;
|
SrsRtcRtpBuilder* rtp_builder_;
|
||||||
#endif
|
#endif
|
||||||
|
private:
|
||||||
|
bool codec_switched_;
|
||||||
public:
|
public:
|
||||||
SrsFrameToRtcBridge(SrsSharedPtr<SrsRtcSource> source);
|
SrsFrameToRtcBridge(SrsSharedPtr<SrsRtcSource> source);
|
||||||
virtual ~SrsFrameToRtcBridge();
|
virtual ~SrsFrameToRtcBridge();
|
||||||
|
@ -74,6 +76,7 @@ public:
|
||||||
virtual void on_unpublish();
|
virtual void on_unpublish();
|
||||||
virtual srs_error_t on_frame(SrsSharedPtrMessage* frame);
|
virtual srs_error_t on_frame(SrsSharedPtrMessage* frame);
|
||||||
srs_error_t on_rtp(SrsRtpPacket* pkt);
|
srs_error_t on_rtp(SrsRtpPacket* pkt);
|
||||||
|
srs_error_t update_codec(SrsVideoCodecId id);
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue