mirror of
https://github.com/ossrs/srs.git
synced 2025-02-13 20:01:56 +00:00
RTC: Extract video to bridger
This commit is contained in:
parent
8efbdec2af
commit
e446cf466f
2 changed files with 40 additions and 1 deletions
|
@ -476,6 +476,7 @@ SrsRtcFromRtmpBridger::SrsRtcFromRtmpBridger(SrsRtcSource* source)
|
||||||
rtc = new SrsRtc();
|
rtc = new SrsRtc();
|
||||||
codec = new SrsAudioRecode(kChannel, kSamplerate);
|
codec = new SrsAudioRecode(kChannel, kSamplerate);
|
||||||
discard_aac = false;
|
discard_aac = false;
|
||||||
|
discard_bframe = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
SrsRtcFromRtmpBridger::~SrsRtcFromRtmpBridger()
|
SrsRtcFromRtmpBridger::~SrsRtcFromRtmpBridger()
|
||||||
|
@ -506,7 +507,8 @@ srs_error_t SrsRtcFromRtmpBridger::initialize(SrsRequest* r)
|
||||||
|
|
||||||
// TODO: FIXME: Support reload and log it.
|
// TODO: FIXME: Support reload and log it.
|
||||||
discard_aac = _srs_config->get_rtc_aac_discard(req->vhost);
|
discard_aac = _srs_config->get_rtc_aac_discard(req->vhost);
|
||||||
srs_trace("RTC bridge from RTMP, discard_aac=%d", discard_aac);
|
discard_bframe = _srs_config->get_rtc_bframe_discard(req->vhost);
|
||||||
|
srs_trace("RTC bridge from RTMP, discard_aac=%d, discard_bframe=%d", discard_aac, discard_bframe);
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
@ -676,3 +678,37 @@ srs_error_t SrsRtcFromRtmpBridger::on_video(SrsSharedPtrMessage* msg)
|
||||||
return source_->on_video_imp(msg);
|
return source_->on_video_imp(msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
srs_error_t SrsRtcFromRtmpBridger::filter(SrsSharedPtrMessage* shared_frame, SrsFormat* format)
|
||||||
|
{
|
||||||
|
srs_error_t err = srs_success;
|
||||||
|
|
||||||
|
// If IDR, we will insert SPS/PPS before IDR frame.
|
||||||
|
if (format->video && format->video->has_idr) {
|
||||||
|
shared_frame->set_has_idr(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update samples to shared frame.
|
||||||
|
for (int i = 0; i < format->video->nb_samples; ++i) {
|
||||||
|
SrsSample* sample = &format->video->samples[i];
|
||||||
|
|
||||||
|
// Because RTC does not support B-frame, so we will drop them.
|
||||||
|
// TODO: Drop B-frame in better way, which not cause picture corruption.
|
||||||
|
if (discard_bframe) {
|
||||||
|
if ((err = sample->parse_bframe()) != srs_success) {
|
||||||
|
return srs_error_wrap(err, "parse bframe");
|
||||||
|
}
|
||||||
|
if (sample->bframe) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (format->video->nb_samples <= 0) {
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
shared_frame->set_samples(format->video->samples, format->video->nb_samples);
|
||||||
|
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -179,6 +179,7 @@ private:
|
||||||
private:
|
private:
|
||||||
bool discard_aac;
|
bool discard_aac;
|
||||||
SrsAudioRecode* codec;
|
SrsAudioRecode* codec;
|
||||||
|
bool discard_bframe;
|
||||||
// rtc handler
|
// rtc handler
|
||||||
SrsRtc* rtc;
|
SrsRtc* rtc;
|
||||||
public:
|
public:
|
||||||
|
@ -195,6 +196,8 @@ private:
|
||||||
srs_error_t transcode(SrsSharedPtrMessage* shared_audio, char* adts_audio, int nn_adts_audio);
|
srs_error_t transcode(SrsSharedPtrMessage* shared_audio, char* adts_audio, int nn_adts_audio);
|
||||||
public:
|
public:
|
||||||
virtual srs_error_t on_video(SrsSharedPtrMessage* video);
|
virtual srs_error_t on_video(SrsSharedPtrMessage* video);
|
||||||
|
private:
|
||||||
|
srs_error_t filter(SrsSharedPtrMessage* shared_video, SrsFormat* format);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue