1
0
Fork 0
mirror of https://github.com/ossrs/srs.git synced 2025-02-24 06:54:22 +00:00
srs/trunk/src/app/srs_app_rtc_source.hpp

217 lines
7.2 KiB
C++
Raw Normal View History

2020-05-12 05:19:31 +00:00
/**
* The MIT License (MIT)
*
* Copyright (c) 2013-2020 John
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of
* this software and associated documentation files (the "Software"), to deal in
* the Software without restriction, including without limitation the rights to
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
* the Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#ifndef SRS_APP_RTC_SOURCE_HPP
#define SRS_APP_RTC_SOURCE_HPP
#include <srs_core.hpp>
#include <vector>
#include <map>
#include <srs_service_st.hpp>
#include <srs_app_source.hpp>
class SrsRequest;
class SrsConnection;
class SrsMetaCache;
class SrsSharedPtrMessage;
class SrsCommonMessage;
class SrsMessageArray;
class SrsRtcSource;
2020-05-12 11:53:21 +00:00
class SrsRtcFromRtmpBridger;
2020-05-13 07:09:36 +00:00
class SrsAudioRecode;
class SrsRtpPacket2;
class SrsSample;
2020-05-12 05:19:31 +00:00
2020-05-15 00:24:26 +00:00
class SrsRtcConsumer
2020-05-12 05:19:31 +00:00
{
private:
SrsRtcSource* source;
2020-05-13 12:13:25 +00:00
std::vector<SrsRtpPacket2*> queue;
2020-05-12 05:19:31 +00:00
// when source id changed, notice all consumers
bool should_update_source_id;
// The cond wait for mw.
// @see https://github.com/ossrs/srs/issues/251
srs_cond_t mw_wait;
bool mw_waiting;
int mw_min_msgs;
public:
2020-05-13 12:13:25 +00:00
SrsRtcConsumer(SrsRtcSource* s);
2020-05-12 05:19:31 +00:00
virtual ~SrsRtcConsumer();
public:
2020-05-13 12:13:25 +00:00
// When source id changed, notice client to print.
2020-05-12 05:19:31 +00:00
virtual void update_source_id();
2020-05-15 00:24:26 +00:00
// Put RTP packet into queue.
// @note We do not drop packet here, but drop it in sender.
srs_error_t enqueue(SrsRtpPacket2* pkt);
// Get all RTP packets from queue.
2020-05-13 12:13:25 +00:00
virtual srs_error_t dump_packets(std::vector<SrsRtpPacket2*>& pkts);
// Wait for at-least some messages incoming in queue.
virtual void wait(int nb_msgs);
2020-05-12 05:19:31 +00:00
};
2020-05-13 07:46:49 +00:00
class SrsRtcSourceManager
{
private:
srs_mutex_t lock;
std::map<std::string, SrsRtcSource*> pool;
public:
SrsRtcSourceManager();
virtual ~SrsRtcSourceManager();
public:
// create source when fetch from cache failed.
// @param r the client request.
// @param pps the matched source, if success never be NULL.
virtual srs_error_t fetch_or_create(SrsRequest* r, SrsRtcSource** pps);
private:
// Get the exists source, NULL when not exists.
// update the request and return the exists source.
virtual SrsRtcSource* fetch(SrsRequest* r);
};
// Global singleton instance.
extern SrsRtcSourceManager* _srs_rtc_sources;
2020-06-02 11:00:31 +00:00
class ISrsRtcPublisher
{
public:
ISrsRtcPublisher();
virtual ~ISrsRtcPublisher();
public:
virtual void request_keyframe() = 0;
};
2020-05-12 05:19:31 +00:00
class SrsRtcSource
{
private:
// For publish, it's the publish client id.
// For edge, it's the edge ingest id.
// when source id changed, for example, the edge reconnect,
// invoke the on_source_id_changed() to let all clients know.
SrsContextId _source_id;
2020-05-12 05:19:31 +00:00
// previous source id.
SrsContextId _pre_source_id;
2020-05-12 05:19:31 +00:00
SrsRequest* req;
2020-06-02 11:00:31 +00:00
ISrsRtcPublisher* rtc_publisher_;
2020-05-12 11:53:21 +00:00
// Transmux RTMP to RTC.
ISrsSourceBridger* bridger_;
2020-05-12 05:19:31 +00:00
private:
// To delivery stream to clients.
std::vector<SrsRtcConsumer*> consumers;
// Whether source is avaiable for publishing.
bool _can_publish;
public:
SrsRtcSource();
virtual ~SrsRtcSource();
public:
virtual srs_error_t initialize(SrsRequest* r);
// Update the authentication information in request.
virtual void update_auth(SrsRequest* r);
// The source id changed.
virtual srs_error_t on_source_id_changed(SrsContextId id);
2020-05-12 05:19:31 +00:00
// Get current source id.
virtual SrsContextId source_id();
virtual SrsContextId pre_source_id();
2020-05-12 11:53:21 +00:00
// Get the bridger.
ISrsSourceBridger* bridger();
2020-05-12 05:19:31 +00:00
public:
// Create consumer
// @param consumer, output the create consumer.
2020-05-13 12:13:25 +00:00
virtual srs_error_t create_consumer(SrsRtcConsumer*& consumer);
2020-05-12 05:19:31 +00:00
// Dumps packets in cache to consumer.
// @param ds, whether dumps the sequence header.
// @param dm, whether dumps the metadata.
// @param dg, whether dumps the gop cache.
virtual srs_error_t consumer_dumps(SrsRtcConsumer* consumer, bool ds = true, bool dm = true, bool dg = true);
virtual void on_consumer_destroy(SrsRtcConsumer* consumer);
// TODO: FIXME: Remove the param is_edge.
virtual bool can_publish(bool is_edge);
// When start publish stream.
virtual srs_error_t on_publish();
// When stop publish stream.
virtual void on_unpublish();
public:
// Get and set the publisher, passed to consumer to process requests such as PLI.
2020-06-02 11:00:31 +00:00
ISrsRtcPublisher* rtc_publisher();
void set_rtc_publisher(ISrsRtcPublisher* v);
// Consume the shared RTP packet, user must free it.
srs_error_t on_rtp(SrsRtpPacket2* pkt);
2020-05-12 05:19:31 +00:00
};
#ifdef SRS_FFMPEG_FIT
2020-05-12 11:53:21 +00:00
class SrsRtcFromRtmpBridger : public ISrsSourceBridger
{
private:
SrsRequest* req;
2020-05-12 11:53:21 +00:00
SrsRtcSource* source_;
// The format, codec information.
SrsRtmpFormat* format;
2020-05-15 00:19:22 +00:00
// The metadata cache.
SrsMetaCache* meta;
2020-05-13 07:09:36 +00:00
private:
bool discard_aac;
SrsAudioRecode* codec;
2020-05-13 07:15:57 +00:00
bool discard_bframe;
bool merge_nalus;
uint32_t audio_timestamp;
2020-06-16 08:41:04 +00:00
uint16_t audio_sequence;
uint16_t video_sequence;
2020-05-12 11:53:21 +00:00
public:
SrsRtcFromRtmpBridger(SrsRtcSource* source);
virtual ~SrsRtcFromRtmpBridger();
public:
virtual srs_error_t initialize(SrsRequest* r);
2020-05-12 11:53:21 +00:00
virtual srs_error_t on_publish();
2020-05-13 05:42:55 +00:00
virtual void on_unpublish();
virtual srs_error_t on_audio(SrsSharedPtrMessage* msg);
2020-05-13 07:09:36 +00:00
private:
srs_error_t transcode(char* adts_audio, int nn_adts_audio);
srs_error_t package_opus(char* data, int size, SrsRtpPacket2** ppkt);
2020-05-13 07:09:36 +00:00
public:
virtual srs_error_t on_video(SrsSharedPtrMessage* msg);
2020-05-13 07:15:57 +00:00
private:
2020-05-15 00:34:58 +00:00
srs_error_t filter(SrsSharedPtrMessage* msg, SrsFormat* format, bool& has_idr, std::vector<SrsSample*>& samples);
srs_error_t package_stap_a(SrsRtcSource* source, SrsSharedPtrMessage* msg, SrsRtpPacket2** ppkt);
2020-05-15 00:34:58 +00:00
srs_error_t package_nalus(SrsSharedPtrMessage* msg, const std::vector<SrsSample*>& samples, std::vector<SrsRtpPacket2*>& pkts);
srs_error_t package_single_nalu(SrsSharedPtrMessage* msg, SrsSample* sample, std::vector<SrsRtpPacket2*>& pkts);
srs_error_t package_fu_a(SrsSharedPtrMessage* msg, SrsSample* sample, int fu_payload_size, std::vector<SrsRtpPacket2*>& pkts);
srs_error_t consume_packets(std::vector<SrsRtpPacket2*>& pkts);
2020-05-12 11:53:21 +00:00
};
#endif
class SrsRtcDummyBridger : public ISrsSourceBridger
{
public:
SrsRtcDummyBridger();
virtual ~SrsRtcDummyBridger();
public:
virtual srs_error_t on_publish();
virtual srs_error_t on_audio(SrsSharedPtrMessage* audio);
virtual srs_error_t on_video(SrsSharedPtrMessage* video);
virtual void on_unpublish();
};
2020-05-12 11:53:21 +00:00
2020-05-12 05:19:31 +00:00
#endif