AI: Replace SrsSharedPtrMessage with SrsMediaPacket for unified media packet handling. v7.0.74 (#4465)

This PR introduces a major refactoring to replace `SrsSharedPtrMessage`
with `SrsMediaPacket` throughout the SRS codebase, providing a more
unified and cleaner approach to media packet handling.

---------

Co-authored-by: OSSRS-AI <winlinam@gmail.com>
This commit is contained in:
Winlin 2025-09-01 18:06:24 -04:00 committed by GitHub
parent c534a265e5
commit 3e8cb3f9d5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
72 changed files with 3749 additions and 3942 deletions

2
trunk/configure vendored
View File

@ -251,7 +251,7 @@ MODULE_FILES=("srs_kernel_error" "srs_kernel_log" "srs_kernel_buffer"
"srs_kernel_utility" "srs_kernel_flv" "srs_kernel_codec" "srs_kernel_io"
"srs_kernel_consts" "srs_kernel_aac" "srs_kernel_mp3" "srs_kernel_ts" "srs_kernel_ps"
"srs_kernel_stream" "srs_kernel_balance" "srs_kernel_mp4" "srs_kernel_file"
"srs_kernel_kbps" "srs_kernel_rtc_rtp" "srs_kernel_rtc_rtcp")
"srs_kernel_kbps" "srs_kernel_rtc_rtp" "srs_kernel_rtc_rtcp" "srs_kernel_packet")
KERNEL_INCS="src/kernel"; MODULE_DIR=${KERNEL_INCS} . $SRS_WORKDIR/auto/modules.sh
KERNEL_OBJS="${MODULE_OBJS[@]}"
#

View File

@ -7,6 +7,7 @@ The changelog for SRS.
<a name="v7-changes"></a>
## SRS 7.0 Changelog
* v7.0, 2025-09-01, Merge [#4465](https://github.com/ossrs/srs/pull/4465): AI: Replace SrsSharedPtrMessage with SrsMediaPacket for unified media packet handling. v7.0.74 (#4465)
* v7.0, 2025-09-01, Merge [#4464](https://github.com/ossrs/srs/pull/4464): AI: Use shared ptr in RTMP message. v7.0.73 (#4464)
* v7.0, 2025-09-01, Merge [#4463](https://github.com/ossrs/srs/pull/4463): AI: Use SrsHttpUri for URL parsing and add legacy RTMP URL conversion. v7.0.72 (#4463)
* v7.0, 2025-09-01, Merge [#4462](https://github.com/ossrs/srs/pull/4462): HTTP: Rename HTTP hijack to dynamic match for better clarity. v7.0.71 (#4462)

View File

@ -279,11 +279,15 @@ srs_error_t SrsDynamicHttpConn::do_proxy(ISrsHttpResponseReader *rr, SrsFlvDecod
return srs_error_wrap(err, "read tag data");
}
SrsSharedPtrMessage *msg = NULL;
if ((err = srs_rtmp_create_msg(type, time, data, size, sdk->sid(), &msg)) != srs_success) {
SrsCommonMessage *cmsg = NULL;
if ((err = srs_rtmp_create_msg(type, time, data, size, sdk->sid(), &cmsg)) != srs_success) {
return srs_error_wrap(err, "create message");
}
SrsMediaPacket *msg = new SrsMediaPacket();
cmsg->to_msg(msg);
srs_freep(cmsg);
// TODO: FIXME: for post flv, reconnect when error.
if ((err = sdk->send_and_free_message(msg)) != srs_success) {
return srs_error_wrap(err, "send message");

View File

@ -112,7 +112,7 @@ srs_error_t SrsFragmentedMp4::initialize(ISrsRequest *r, bool video, int64_t tim
return err;
}
srs_error_t SrsFragmentedMp4::write(SrsSharedPtrMessage *shared_msg, SrsFormat *format)
srs_error_t SrsFragmentedMp4::write(SrsMediaPacket *shared_msg, SrsFormat *format)
{
srs_error_t err = srs_success;
@ -480,7 +480,7 @@ void SrsDashController::on_unpublish()
}
}
srs_error_t SrsDashController::on_audio(SrsSharedPtrMessage *shared_audio, SrsFormat *format)
srs_error_t SrsDashController::on_audio(SrsMediaPacket *shared_audio, SrsFormat *format)
{
srs_error_t err = srs_success;
@ -552,7 +552,7 @@ srs_error_t SrsDashController::on_audio(SrsSharedPtrMessage *shared_audio, SrsFo
return err;
}
srs_error_t SrsDashController::on_video(SrsSharedPtrMessage *shared_video, SrsFormat *format)
srs_error_t SrsDashController::on_video(SrsMediaPacket *shared_video, SrsFormat *format)
{
srs_error_t err = srs_success;
@ -641,7 +641,7 @@ srs_error_t SrsDashController::refresh_mpd(SrsFormat *format)
return err;
}
srs_error_t SrsDashController::refresh_init_mp4(SrsSharedPtrMessage *msg, SrsFormat *format)
srs_error_t SrsDashController::refresh_init_mp4(SrsMediaPacket *msg, SrsFormat *format)
{
srs_error_t err = srs_success;
@ -796,7 +796,7 @@ srs_error_t SrsDash::on_publish()
return err;
}
srs_error_t SrsDash::on_audio(SrsSharedPtrMessage *shared_audio, SrsFormat *format)
srs_error_t SrsDash::on_audio(SrsMediaPacket *shared_audio, SrsFormat *format)
{
srs_error_t err = srs_success;
@ -818,7 +818,7 @@ srs_error_t SrsDash::on_audio(SrsSharedPtrMessage *shared_audio, SrsFormat *form
return err;
}
srs_error_t SrsDash::on_video(SrsSharedPtrMessage *shared_video, SrsFormat *format)
srs_error_t SrsDash::on_video(SrsMediaPacket *shared_video, SrsFormat *format)
{
srs_error_t err = srs_success;

View File

@ -16,7 +16,7 @@
class ISrsRequest;
class SrsOriginHub;
class SrsSharedPtrMessage;
class SrsMediaPacket;
class SrsFormat;
class SrsFileWriter;
class SrsMpdWriter;
@ -54,7 +54,7 @@ public:
// Initialize the fragment, create the home dir, open the file.
virtual srs_error_t initialize(ISrsRequest *r, bool video, int64_t time, SrsMpdWriter *mpd, uint32_t tid);
// Write media message to fragment.
virtual srs_error_t write(SrsSharedPtrMessage *shared_msg, SrsFormat *format);
virtual srs_error_t write(SrsMediaPacket *shared_msg, SrsFormat *format);
// Reap the fragment, close the fd and rename tmp to official file.
virtual srs_error_t reap(uint64_t &dts);
};
@ -154,12 +154,12 @@ public:
virtual srs_error_t initialize(ISrsRequest *r);
virtual srs_error_t on_publish();
virtual void on_unpublish();
virtual srs_error_t on_audio(SrsSharedPtrMessage *shared_audio, SrsFormat *format);
virtual srs_error_t on_video(SrsSharedPtrMessage *shared_video, SrsFormat *format);
virtual srs_error_t on_audio(SrsMediaPacket *shared_audio, SrsFormat *format);
virtual srs_error_t on_video(SrsMediaPacket *shared_video, SrsFormat *format);
private:
virtual srs_error_t refresh_mpd(SrsFormat *format);
virtual srs_error_t refresh_init_mp4(SrsSharedPtrMessage *msg, SrsFormat *format);
virtual srs_error_t refresh_init_mp4(SrsMediaPacket *msg, SrsFormat *format);
};
// The MPEG-DASH encoder, transmux RTMP to DASH.
@ -190,9 +190,9 @@ public:
// When stream start publishing.
virtual srs_error_t on_publish();
// When got an shared audio message.
virtual srs_error_t on_audio(SrsSharedPtrMessage *shared_audio, SrsFormat *format);
virtual srs_error_t on_audio(SrsMediaPacket *shared_audio, SrsFormat *format);
// When got an shared video message.
virtual srs_error_t on_video(SrsSharedPtrMessage *shared_video, SrsFormat *format);
virtual srs_error_t on_video(SrsMediaPacket *shared_video, SrsFormat *format);
// When stream stop publishing.
virtual void on_unpublish();
};

View File

@ -117,17 +117,17 @@ srs_error_t SrsDvrSegmenter::open()
return err;
}
srs_error_t SrsDvrSegmenter::write_metadata(SrsSharedPtrMessage *metadata)
srs_error_t SrsDvrSegmenter::write_metadata(SrsMediaPacket *metadata)
{
return encode_metadata(metadata);
}
srs_error_t SrsDvrSegmenter::write_audio(SrsSharedPtrMessage *shared_audio, SrsFormat *format)
srs_error_t SrsDvrSegmenter::write_audio(SrsMediaPacket *shared_audio, SrsFormat *format)
{
srs_error_t err = srs_success;
// TODO: FIXME: Use SrsSharedPtr instead.
SrsUniquePtr<SrsSharedPtrMessage> audio(shared_audio->copy());
SrsUniquePtr<SrsMediaPacket> audio(shared_audio->copy());
if ((err = jitter->correct(audio.get(), jitter_algorithm)) != srs_success) {
return srs_error_wrap(err, "jitter");
@ -144,12 +144,12 @@ srs_error_t SrsDvrSegmenter::write_audio(SrsSharedPtrMessage *shared_audio, SrsF
return err;
}
srs_error_t SrsDvrSegmenter::write_video(SrsSharedPtrMessage *shared_video, SrsFormat *format)
srs_error_t SrsDvrSegmenter::write_video(SrsMediaPacket *shared_video, SrsFormat *format)
{
srs_error_t err = srs_success;
// TODO: FIXME: Use SrsSharedPtr instead.
SrsUniquePtr<SrsSharedPtrMessage> video(shared_video->copy());
SrsUniquePtr<SrsMediaPacket> video(shared_video->copy());
if ((err = jitter->correct(video.get(), jitter_algorithm)) != srs_success) {
return srs_error_wrap(err, "jitter");
@ -215,7 +215,7 @@ string SrsDvrSegmenter::generate_path()
return flv_path;
}
srs_error_t SrsDvrSegmenter::on_update_duration(SrsSharedPtrMessage *msg)
srs_error_t SrsDvrSegmenter::on_update_duration(SrsMediaPacket *msg)
{
fragment->append(msg->timestamp);
return srs_success;
@ -310,7 +310,7 @@ srs_error_t SrsDvrFlvSegmenter::open_encoder()
return err;
}
srs_error_t SrsDvrFlvSegmenter::encode_metadata(SrsSharedPtrMessage *metadata)
srs_error_t SrsDvrFlvSegmenter::encode_metadata(SrsMediaPacket *metadata)
{
srs_error_t err = srs_success;
@ -366,7 +366,7 @@ srs_error_t SrsDvrFlvSegmenter::encode_metadata(SrsSharedPtrMessage *metadata)
return err;
}
srs_error_t SrsDvrFlvSegmenter::encode_audio(SrsSharedPtrMessage *audio, SrsFormat *format)
srs_error_t SrsDvrFlvSegmenter::encode_audio(SrsMediaPacket *audio, SrsFormat *format)
{
srs_error_t err = srs_success;
@ -379,7 +379,7 @@ srs_error_t SrsDvrFlvSegmenter::encode_audio(SrsSharedPtrMessage *audio, SrsForm
return err;
}
srs_error_t SrsDvrFlvSegmenter::encode_video(SrsSharedPtrMessage *video, SrsFormat *format)
srs_error_t SrsDvrFlvSegmenter::encode_video(SrsMediaPacket *video, SrsFormat *format)
{
srs_error_t err = srs_success;
@ -439,12 +439,12 @@ srs_error_t SrsDvrMp4Segmenter::open_encoder()
return err;
}
srs_error_t SrsDvrMp4Segmenter::encode_metadata(SrsSharedPtrMessage * /*metadata*/)
srs_error_t SrsDvrMp4Segmenter::encode_metadata(SrsMediaPacket * /*metadata*/)
{
return srs_success;
}
srs_error_t SrsDvrMp4Segmenter::encode_audio(SrsSharedPtrMessage *audio, SrsFormat *format)
srs_error_t SrsDvrMp4Segmenter::encode_audio(SrsMediaPacket *audio, SrsFormat *format)
{
srs_error_t err = srs_success;
@ -472,7 +472,7 @@ srs_error_t SrsDvrMp4Segmenter::encode_audio(SrsSharedPtrMessage *audio, SrsForm
return err;
}
srs_error_t SrsDvrMp4Segmenter::encode_video(SrsSharedPtrMessage *video, SrsFormat *format)
srs_error_t SrsDvrMp4Segmenter::encode_video(SrsMediaPacket *video, SrsFormat *format)
{
srs_error_t err = srs_success;
@ -607,7 +607,7 @@ void SrsDvrPlan::on_unpublish()
{
}
srs_error_t SrsDvrPlan::on_meta_data(SrsSharedPtrMessage *shared_metadata)
srs_error_t SrsDvrPlan::on_meta_data(SrsMediaPacket *shared_metadata)
{
srs_error_t err = srs_success;
@ -618,7 +618,7 @@ srs_error_t SrsDvrPlan::on_meta_data(SrsSharedPtrMessage *shared_metadata)
return segment->write_metadata(shared_metadata);
}
srs_error_t SrsDvrPlan::on_audio(SrsSharedPtrMessage *shared_audio, SrsFormat *format)
srs_error_t SrsDvrPlan::on_audio(SrsMediaPacket *shared_audio, SrsFormat *format)
{
srs_error_t err = srs_success;
@ -633,7 +633,7 @@ srs_error_t SrsDvrPlan::on_audio(SrsSharedPtrMessage *shared_audio, SrsFormat *f
return err;
}
srs_error_t SrsDvrPlan::on_video(SrsSharedPtrMessage *shared_video, SrsFormat *format)
srs_error_t SrsDvrPlan::on_video(SrsMediaPacket *shared_video, SrsFormat *format)
{
srs_error_t err = srs_success;
@ -816,7 +816,7 @@ void SrsDvrSegmentPlan::on_unpublish()
SrsDvrPlan::on_unpublish();
}
srs_error_t SrsDvrSegmentPlan::on_audio(SrsSharedPtrMessage *shared_audio, SrsFormat *format)
srs_error_t SrsDvrSegmentPlan::on_audio(SrsMediaPacket *shared_audio, SrsFormat *format)
{
srs_error_t err = srs_success;
@ -831,7 +831,7 @@ srs_error_t SrsDvrSegmentPlan::on_audio(SrsSharedPtrMessage *shared_audio, SrsFo
return err;
}
srs_error_t SrsDvrSegmentPlan::on_video(SrsSharedPtrMessage *shared_video, SrsFormat *format)
srs_error_t SrsDvrSegmentPlan::on_video(SrsMediaPacket *shared_video, SrsFormat *format)
{
srs_error_t err = srs_success;
@ -846,7 +846,7 @@ srs_error_t SrsDvrSegmentPlan::on_video(SrsSharedPtrMessage *shared_video, SrsFo
return err;
}
srs_error_t SrsDvrSegmentPlan::update_duration(SrsSharedPtrMessage *msg)
srs_error_t SrsDvrSegmentPlan::update_duration(SrsMediaPacket *msg)
{
srs_error_t err = srs_success;
@ -981,7 +981,7 @@ void SrsDvr::on_unpublish()
plan->on_unpublish();
}
srs_error_t SrsDvr::on_meta_data(SrsSharedPtrMessage *metadata)
srs_error_t SrsDvr::on_meta_data(SrsMediaPacket *metadata)
{
srs_error_t err = srs_success;
@ -997,7 +997,7 @@ srs_error_t SrsDvr::on_meta_data(SrsSharedPtrMessage *metadata)
return err;
}
srs_error_t SrsDvr::on_audio(SrsSharedPtrMessage *shared_audio, SrsFormat *format)
srs_error_t SrsDvr::on_audio(SrsMediaPacket *shared_audio, SrsFormat *format)
{
// the dvr for this stream is not actived.
if (!actived) {
@ -1007,7 +1007,7 @@ srs_error_t SrsDvr::on_audio(SrsSharedPtrMessage *shared_audio, SrsFormat *forma
return plan->on_audio(shared_audio, format);
}
srs_error_t SrsDvr::on_video(SrsSharedPtrMessage *shared_video, SrsFormat *format)
srs_error_t SrsDvr::on_video(SrsMediaPacket *shared_video, SrsFormat *format)
{
// the dvr for this stream is not actived.
if (!actived) {

View File

@ -17,7 +17,7 @@ class SrsOriginHub;
class ISrsRequest;
class SrsBuffer;
class SrsRtmpJitter;
class SrsSharedPtrMessage;
class SrsMediaPacket;
class SrsFileWriter;
class SrsFlvTransmuxer;
class SrsDvrPlan;
@ -65,13 +65,13 @@ public:
// @remark Ignore when file is already open.
virtual srs_error_t open();
// Write the metadata.
virtual srs_error_t write_metadata(SrsSharedPtrMessage *metadata);
virtual srs_error_t write_metadata(SrsMediaPacket *metadata);
// Write audio packet.
// @param shared_audio, directly ptr, copy it if need to save it.
virtual srs_error_t write_audio(SrsSharedPtrMessage *shared_audio, SrsFormat *format);
virtual srs_error_t write_audio(SrsMediaPacket *shared_audio, SrsFormat *format);
// Write video packet.
// @param shared_video, directly ptr, copy it if need to save it.
virtual srs_error_t write_video(SrsSharedPtrMessage *shared_video, SrsFormat *format);
virtual srs_error_t write_video(SrsMediaPacket *shared_video, SrsFormat *format);
// Refresh the metadata. For example, there is duration in flv metadata,
// when DVR in append mode, the duration must be update every some seconds.
// @remark Maybe ignored by concreate segmenter.
@ -82,16 +82,16 @@ public:
protected:
virtual srs_error_t open_encoder() = 0;
virtual srs_error_t encode_metadata(SrsSharedPtrMessage *metadata) = 0;
virtual srs_error_t encode_audio(SrsSharedPtrMessage *audio, SrsFormat *format) = 0;
virtual srs_error_t encode_video(SrsSharedPtrMessage *video, SrsFormat *format) = 0;
virtual srs_error_t encode_metadata(SrsMediaPacket *metadata) = 0;
virtual srs_error_t encode_audio(SrsMediaPacket *audio, SrsFormat *format) = 0;
virtual srs_error_t encode_video(SrsMediaPacket *video, SrsFormat *format) = 0;
virtual srs_error_t close_encoder() = 0;
private:
// Generate the flv segment path.
virtual std::string generate_path();
// When update the duration of segment by rtmp msg.
virtual srs_error_t on_update_duration(SrsSharedPtrMessage *msg);
virtual srs_error_t on_update_duration(SrsMediaPacket *msg);
};
// The FLV segmenter to use FLV encoder to write file.
@ -120,9 +120,9 @@ public:
protected:
virtual srs_error_t open_encoder();
virtual srs_error_t encode_metadata(SrsSharedPtrMessage *metadata);
virtual srs_error_t encode_audio(SrsSharedPtrMessage *audio, SrsFormat *format);
virtual srs_error_t encode_video(SrsSharedPtrMessage *video, SrsFormat *format);
virtual srs_error_t encode_metadata(SrsMediaPacket *metadata);
virtual srs_error_t encode_audio(SrsMediaPacket *audio, SrsFormat *format);
virtual srs_error_t encode_video(SrsMediaPacket *video, SrsFormat *format);
virtual srs_error_t close_encoder();
};
@ -142,9 +142,9 @@ public:
protected:
virtual srs_error_t open_encoder();
virtual srs_error_t encode_metadata(SrsSharedPtrMessage *metadata);
virtual srs_error_t encode_audio(SrsSharedPtrMessage *audio, SrsFormat *format);
virtual srs_error_t encode_video(SrsSharedPtrMessage *video, SrsFormat *format);
virtual srs_error_t encode_metadata(SrsMediaPacket *metadata);
virtual srs_error_t encode_audio(SrsMediaPacket *audio, SrsFormat *format);
virtual srs_error_t encode_video(SrsMediaPacket *video, SrsFormat *format);
virtual srs_error_t close_encoder();
};
@ -184,9 +184,9 @@ public:
virtual srs_error_t initialize(SrsOriginHub *h, SrsDvrSegmenter *s, ISrsRequest *r);
virtual srs_error_t on_publish(ISrsRequest *r);
virtual void on_unpublish();
virtual srs_error_t on_meta_data(SrsSharedPtrMessage *shared_metadata);
virtual srs_error_t on_audio(SrsSharedPtrMessage *shared_audio, SrsFormat *format);
virtual srs_error_t on_video(SrsSharedPtrMessage *shared_video, SrsFormat *format);
virtual srs_error_t on_meta_data(SrsMediaPacket *shared_metadata);
virtual srs_error_t on_audio(SrsMediaPacket *shared_audio, SrsFormat *format);
virtual srs_error_t on_video(SrsMediaPacket *shared_video, SrsFormat *format);
// Internal interface for segmenter.
public:
// When segmenter close a segment.
@ -226,11 +226,11 @@ public:
virtual srs_error_t initialize(SrsOriginHub *h, SrsDvrSegmenter *s, ISrsRequest *r);
virtual srs_error_t on_publish(ISrsRequest *r);
virtual void on_unpublish();
virtual srs_error_t on_audio(SrsSharedPtrMessage *shared_audio, SrsFormat *format);
virtual srs_error_t on_video(SrsSharedPtrMessage *shared_video, SrsFormat *format);
virtual srs_error_t on_audio(SrsMediaPacket *shared_audio, SrsFormat *format);
virtual srs_error_t on_video(SrsMediaPacket *shared_video, SrsFormat *format);
private:
virtual srs_error_t update_duration(SrsSharedPtrMessage *msg);
virtual srs_error_t update_duration(SrsMediaPacket *msg);
};
// DVR(Digital Video Recorder) to record RTMP stream to flv/mp4 file.
@ -264,13 +264,13 @@ public:
// when encoder stop(unpublish) to publish RTMP stream.
virtual void on_unpublish();
// get some information from metadata, it's optinal.
virtual srs_error_t on_meta_data(SrsSharedPtrMessage *metadata);
virtual srs_error_t on_meta_data(SrsMediaPacket *metadata);
// mux the audio packets to dvr.
// @param shared_audio, directly ptr, copy it if need to save it.
virtual srs_error_t on_audio(SrsSharedPtrMessage *shared_audio, SrsFormat *foramt);
virtual srs_error_t on_audio(SrsMediaPacket *shared_audio, SrsFormat *foramt);
// mux the video packets to dvr.
// @param shared_video, directly ptr, copy it if need to save it.
virtual srs_error_t on_video(SrsSharedPtrMessage *shared_video, SrsFormat *format);
virtual srs_error_t on_video(SrsMediaPacket *shared_video, SrsFormat *format);
};
extern SrsAsyncCallWorker *_srs_dvr_async;

View File

@ -130,7 +130,7 @@ srs_error_t SrsEdgeRtmpUpstream::recv_message(SrsCommonMessage **pmsg)
return sdk->recv_message(pmsg);
}
srs_error_t SrsEdgeRtmpUpstream::decode_message(SrsCommonMessage *msg, SrsPacket **ppacket)
srs_error_t SrsEdgeRtmpUpstream::decode_message(SrsCommonMessage *msg, SrsRtmpCommand **ppacket)
{
return sdk->decode_message(msg, ppacket);
}
@ -333,11 +333,11 @@ srs_error_t SrsEdgeFlvUpstream::recv_message(SrsCommonMessage **pmsg)
return err;
}
srs_error_t SrsEdgeFlvUpstream::decode_message(SrsCommonMessage *msg, SrsPacket **ppacket)
srs_error_t SrsEdgeFlvUpstream::decode_message(SrsCommonMessage *msg, SrsRtmpCommand **ppacket)
{
srs_error_t err = srs_success;
SrsPacket *packet = NULL;
SrsRtmpCommand *packet = NULL;
SrsBuffer stream(msg->payload(), msg->size());
SrsMessageHeader &header = msg->header;
@ -647,11 +647,11 @@ srs_error_t SrsEdgeIngester::process_publish_message(SrsCommonMessage *msg, stri
// process onMetaData
if (msg->header.is_amf0_data() || msg->header.is_amf3_data()) {
SrsPacket *pkt_raw = NULL;
SrsRtmpCommand *pkt_raw = NULL;
if ((err = upstream->decode_message(msg, &pkt_raw)) != srs_success) {
return srs_error_wrap(err, "decode message");
}
SrsUniquePtr<SrsPacket> pkt(pkt_raw);
SrsUniquePtr<SrsRtmpCommand> pkt(pkt_raw);
if (dynamic_cast<SrsOnMetaDataPacket *>(pkt.get())) {
SrsOnMetaDataPacket *metadata = dynamic_cast<SrsOnMetaDataPacket *>(pkt.get());
@ -666,11 +666,11 @@ srs_error_t SrsEdgeIngester::process_publish_message(SrsCommonMessage *msg, stri
// call messages, for example, reject, redirect.
if (msg->header.is_amf0_command() || msg->header.is_amf3_command()) {
SrsPacket *pkt_raw = NULL;
SrsRtmpCommand *pkt_raw = NULL;
if ((err = upstream->decode_message(msg, &pkt_raw)) != srs_success) {
return srs_error_wrap(err, "decode message");
}
SrsUniquePtr<SrsPacket> pkt(pkt_raw);
SrsUniquePtr<SrsRtmpCommand> pkt(pkt_raw);
// RTMP 302 redirect
if (dynamic_cast<SrsCallPacket *>(pkt.get())) {
@ -928,10 +928,8 @@ srs_error_t SrsEdgeForwarder::proxy(SrsCommonMessage *msg)
return err;
}
SrsSharedPtrMessage copy;
if ((err = copy.create(msg)) != srs_success) {
return srs_error_wrap(err, "create message");
}
SrsMediaPacket copy;
msg->to_msg(&copy);
copy.stream_id = sdk->sid();
if ((err = queue->enqueue(copy.copy())) != srs_success) {

View File

@ -28,7 +28,7 @@ class SrsKbps;
class SrsLbRoundRobin;
class SrsTcpClient;
class SrsSimpleRtmpClient;
class SrsPacket;
class SrsRtmpCommand;
class SrsHttpClient;
class ISrsHttpMessage;
class SrsHttpFileReader;
@ -66,7 +66,7 @@ public:
public:
virtual srs_error_t connect(ISrsRequest *r, SrsLbRoundRobin *lb) = 0;
virtual srs_error_t recv_message(SrsCommonMessage **pmsg) = 0;
virtual srs_error_t decode_message(SrsCommonMessage *msg, SrsPacket **ppacket) = 0;
virtual srs_error_t decode_message(SrsCommonMessage *msg, SrsRtmpCommand **ppacket) = 0;
virtual void close() = 0;
public:
@ -96,7 +96,7 @@ public:
public:
virtual srs_error_t connect(ISrsRequest *r, SrsLbRoundRobin *lb);
virtual srs_error_t recv_message(SrsCommonMessage **pmsg);
virtual srs_error_t decode_message(SrsCommonMessage *msg, SrsPacket **ppacket);
virtual srs_error_t decode_message(SrsCommonMessage *msg, SrsRtmpCommand **ppacket);
virtual void close();
public:
@ -135,7 +135,7 @@ private:
public:
virtual srs_error_t recv_message(SrsCommonMessage **pmsg);
virtual srs_error_t decode_message(SrsCommonMessage *msg, SrsPacket **ppacket);
virtual srs_error_t decode_message(SrsCommonMessage *msg, SrsRtmpCommand **ppacket);
virtual void close();
public:

View File

@ -98,11 +98,11 @@ void SrsForwarder::on_unpublish()
sdk->close();
}
srs_error_t SrsForwarder::on_meta_data(SrsSharedPtrMessage *shared_metadata)
srs_error_t SrsForwarder::on_meta_data(SrsMediaPacket *shared_metadata)
{
srs_error_t err = srs_success;
SrsSharedPtrMessage *metadata = shared_metadata->copy();
SrsMediaPacket *metadata = shared_metadata->copy();
// TODO: FIXME: config the jitter of Forwarder.
if ((err = jitter->correct(metadata, SrsRtmpJitterAlgorithmOFF)) != srs_success) {
@ -116,11 +116,11 @@ srs_error_t SrsForwarder::on_meta_data(SrsSharedPtrMessage *shared_metadata)
return err;
}
srs_error_t SrsForwarder::on_audio(SrsSharedPtrMessage *shared_audio)
srs_error_t SrsForwarder::on_audio(SrsMediaPacket *shared_audio)
{
srs_error_t err = srs_success;
SrsSharedPtrMessage *msg = shared_audio->copy();
SrsMediaPacket *msg = shared_audio->copy();
// TODO: FIXME: config the jitter of Forwarder.
if ((err = jitter->correct(msg, SrsRtmpJitterAlgorithmOFF)) != srs_success) {
@ -139,11 +139,11 @@ srs_error_t SrsForwarder::on_audio(SrsSharedPtrMessage *shared_audio)
return err;
}
srs_error_t SrsForwarder::on_video(SrsSharedPtrMessage *shared_video)
srs_error_t SrsForwarder::on_video(SrsMediaPacket *shared_video)
{
srs_error_t err = srs_success;
SrsSharedPtrMessage *msg = shared_video->copy();
SrsMediaPacket *msg = shared_video->copy();
// TODO: FIXME: config the jitter of Forwarder.
if ((err = jitter->correct(msg, SrsRtmpJitterAlgorithmOFF)) != srs_success) {

View File

@ -14,7 +14,7 @@
#include <srs_app_st.hpp>
class ISrsProtocolReadWriter;
class SrsSharedPtrMessage;
class SrsMediaPacket;
class SrsOnMetaDataPacket;
class SrsMessageQueue;
class SrsRtmpJitter;
@ -46,8 +46,8 @@ private:
SrsRtmpJitter *jitter;
SrsMessageQueue *queue;
// Cache the sequence header for retry when slave is failed.
SrsSharedPtrMessage *sh_audio;
SrsSharedPtrMessage *sh_video;
SrsMediaPacket *sh_audio;
SrsMediaPacket *sh_video;
public:
SrsForwarder(SrsOriginHub *h);
@ -62,13 +62,13 @@ public:
virtual void on_unpublish();
// Forward the audio packet.
// @param shared_metadata, directly ptr, copy it if need to save it.
virtual srs_error_t on_meta_data(SrsSharedPtrMessage *shared_metadata);
virtual srs_error_t on_meta_data(SrsMediaPacket *shared_metadata);
// Forward the audio packet.
// @param shared_audio, directly ptr, copy it if need to save it.
virtual srs_error_t on_audio(SrsSharedPtrMessage *shared_audio);
virtual srs_error_t on_audio(SrsMediaPacket *shared_audio);
// Forward the video packet.
// @param shared_video, directly ptr, copy it if need to save it.
virtual srs_error_t on_video(SrsSharedPtrMessage *shared_video);
virtual srs_error_t on_video(SrsMediaPacket *shared_video);
// Interface ISrsReusableThread2Handler.
public:
virtual srs_error_t cycle();

View File

@ -1547,15 +1547,15 @@ SrsMpegpsQueue::SrsMpegpsQueue()
SrsMpegpsQueue::~SrsMpegpsQueue()
{
std::map<int64_t, SrsSharedPtrMessage *>::iterator it;
std::map<int64_t, SrsMediaPacket *>::iterator it;
for (it = msgs.begin(); it != msgs.end(); ++it) {
SrsSharedPtrMessage *msg = it->second;
SrsMediaPacket *msg = it->second;
srs_freep(msg);
}
msgs.clear();
}
srs_error_t SrsMpegpsQueue::push(SrsSharedPtrMessage *msg)
srs_error_t SrsMpegpsQueue::push(SrsMediaPacket *msg)
{
srs_error_t err = srs_success;
@ -1588,7 +1588,7 @@ srs_error_t SrsMpegpsQueue::push(SrsSharedPtrMessage *msg)
return err;
}
SrsSharedPtrMessage *SrsMpegpsQueue::dequeue()
SrsMediaPacket *SrsMpegpsQueue::dequeue()
{
// got 2+ videos and audios, ok to dequeue.
bool av_ok = nb_videos >= 2 && nb_audios >= 2;
@ -1596,8 +1596,8 @@ SrsSharedPtrMessage *SrsMpegpsQueue::dequeue()
bool av_overflow = nb_videos > 100 || nb_audios > 300;
if (av_ok || av_overflow) {
std::map<int64_t, SrsSharedPtrMessage *>::iterator it = msgs.begin();
SrsSharedPtrMessage *msg = it->second;
std::map<int64_t, SrsMediaPacket *>::iterator it = msgs.begin();
SrsMediaPacket *msg = it->second;
msgs.erase(it);
if (msg->is_audio()) {
@ -2107,12 +2107,14 @@ srs_error_t SrsGbMuxer::rtmp_write_packet(char type, uint32_t timestamp, char *d
return srs_error_wrap(err, "connect");
}
SrsSharedPtrMessage *msg = NULL;
if ((err = srs_rtmp_create_msg(type, timestamp, data, size, sdk_->sid(), &msg)) != srs_success) {
SrsCommonMessage *cmsg = NULL;
if ((err = srs_rtmp_create_msg(type, timestamp, data, size, sdk_->sid(), &cmsg)) != srs_success) {
return srs_error_wrap(err, "create message");
}
srs_assert(msg);
SrsMediaPacket *msg = new SrsMediaPacket();
cmsg->to_msg(msg);
srs_freep(cmsg);
// push msg to queue.
if ((err = queue_->push(msg)) != srs_success) {

View File

@ -37,7 +37,7 @@ class SrsSimpleRtmpClient;
struct SrsRawAacStreamCodec;
class SrsRawH264Stream;
class SrsRawHEVCStream;
class SrsSharedPtrMessage;
class SrsMediaPacket;
class SrsPithyPrint;
class SrsRawAacStream;
class ISrsHttpServeMux;
@ -485,7 +485,7 @@ class SrsMpegpsQueue
{
private:
// The key: dts, value: msg.
std::map<int64_t, SrsSharedPtrMessage *> msgs;
std::map<int64_t, SrsMediaPacket *> msgs;
int nb_audios;
int nb_videos;
@ -494,8 +494,8 @@ public:
virtual ~SrsMpegpsQueue();
public:
virtual srs_error_t push(SrsSharedPtrMessage *msg);
virtual SrsSharedPtrMessage *dequeue();
virtual srs_error_t push(SrsMediaPacket *msg);
virtual SrsMediaPacket *dequeue();
};
// Mux GB28181 to RTMP.

View File

@ -38,7 +38,7 @@ char flv_header[] = {'F', 'L', 'V',
0x01, 0x05, 0x00, 0x00, 0x00, 0x09,
0x00, 0x00, 0x00, 0x00};
string serialFlv(SrsSharedPtrMessage *msg)
string serialFlv(SrsMediaPacket *msg)
{
int size = 15 + msg->size();
char *byte = new char[size];
@ -81,22 +81,22 @@ public:
srs_freep(audioSh);
// clean msgs
list<SrsSharedPtrMessage *>::iterator iter;
list<SrsMediaPacket *>::iterator iter;
for (iter = msgs.begin(); iter != msgs.end(); ++iter) {
SrsSharedPtrMessage *msg = *iter;
SrsMediaPacket *msg = *iter;
srs_freep(msg);
}
}
void on_video(SrsSharedPtrMessage *msg)
void on_video(SrsMediaPacket *msg)
{
SrsSharedPtrMessage *_msg = msg->copy();
SrsMediaPacket *_msg = msg->copy();
msgs.push_back(_msg);
}
void on_audio(SrsSharedPtrMessage *msg)
void on_audio(SrsMediaPacket *msg)
{
SrsSharedPtrMessage *_msg = msg->copy();
SrsMediaPacket *_msg = msg->copy();
msgs.push_back(_msg);
}
@ -116,9 +116,9 @@ public:
data.append(serialFlv(audioSh));
}
list<SrsSharedPtrMessage *>::iterator iter;
list<SrsMediaPacket *>::iterator iter;
for (iter = msgs.begin(); iter != msgs.end(); ++iter) {
SrsSharedPtrMessage *msg = *iter;
SrsMediaPacket *msg = *iter;
data.append(serialFlv(msg));
}
@ -158,10 +158,10 @@ public:
long long last_msg_ts = 0;
if (msgs.size() >= 2) {
SrsSharedPtrMessage *first_msg = msgs.front();
SrsMediaPacket *first_msg = msgs.front();
first_msg_ts = first_msg->timestamp;
SrsSharedPtrMessage *last_msg = msgs.back();
SrsMediaPacket *last_msg = msgs.back();
last_msg_ts = last_msg->timestamp;
duration_ms = (int)(last_msg_ts - first_msg_ts);
@ -200,13 +200,13 @@ public:
return start_time;
}
void set_video_sh(SrsSharedPtrMessage *msg)
void set_video_sh(SrsMediaPacket *msg)
{
srs_freep(videoSh);
videoSh = msg->copy();
}
void set_audio_sh(SrsSharedPtrMessage *msg)
void set_audio_sh(SrsMediaPacket *msg)
{
srs_freep(audioSh);
audioSh = msg->copy();
@ -219,7 +219,7 @@ public:
private:
ISrsRequest *req;
list<SrsSharedPtrMessage *> msgs;
list<SrsMediaPacket *> msgs;
/*!
the index of this fragment
@ -227,8 +227,8 @@ private:
int index;
long long start_time;
SrsSharedPtrMessage *videoSh;
SrsSharedPtrMessage *audioSh;
SrsMediaPacket *videoSh;
SrsMediaPacket *audioSh;
string path;
};
@ -290,7 +290,7 @@ srs_error_t SrsHds::on_unpublish()
return err;
}
srs_error_t SrsHds::on_video(SrsSharedPtrMessage *msg)
srs_error_t SrsHds::on_video(SrsMediaPacket *msg)
{
srs_error_t err = srs_success;
@ -340,7 +340,7 @@ srs_error_t SrsHds::on_video(SrsSharedPtrMessage *msg)
return err;
}
srs_error_t SrsHds::on_audio(SrsSharedPtrMessage *msg)
srs_error_t SrsHds::on_audio(SrsMediaPacket *msg)
{
srs_error_t err = srs_success;

View File

@ -14,7 +14,7 @@
#include <list>
class ISrsRequest;
class SrsSharedPtrMessage;
class SrsMediaPacket;
class SrsHdsFragment;
class SrsLiveSource;
@ -28,8 +28,8 @@ public:
srs_error_t on_publish(ISrsRequest *req);
srs_error_t on_unpublish();
srs_error_t on_video(SrsSharedPtrMessage *msg);
srs_error_t on_audio(SrsSharedPtrMessage *msg);
srs_error_t on_video(SrsMediaPacket *msg);
srs_error_t on_audio(SrsMediaPacket *msg);
private:
srs_error_t flush_mainfest();
@ -40,8 +40,8 @@ private:
std::list<SrsHdsFragment *> fragments;
SrsHdsFragment *currentSegment;
int fragment_index;
SrsSharedPtrMessage *video_sh;
SrsSharedPtrMessage *audio_sh;
SrsMediaPacket *video_sh;
SrsMediaPacket *audio_sh;
ISrsRequest *hds_req;
bool hds_enabled;

View File

@ -203,7 +203,7 @@ void SrsHlsM4sSegment::config_cipher(unsigned char *key, unsigned char *iv)
memcpy(this->iv, iv, 16);
}
srs_error_t SrsHlsM4sSegment::write(SrsSharedPtrMessage *shared_msg, SrsFormat *format)
srs_error_t SrsHlsM4sSegment::write(SrsMediaPacket *shared_msg, SrsFormat *format)
{
srs_error_t err = srs_success;
@ -580,7 +580,7 @@ srs_error_t SrsHlsFmp4Muxer::write_init_mp4(SrsFormat *format, bool has_video, b
return err;
}
srs_error_t SrsHlsFmp4Muxer::write_audio(SrsSharedPtrMessage *shared_audio, SrsFormat *format)
srs_error_t SrsHlsFmp4Muxer::write_audio(SrsMediaPacket *shared_audio, SrsFormat *format)
{
srs_error_t err = srs_success;
@ -604,7 +604,7 @@ srs_error_t SrsHlsFmp4Muxer::write_audio(SrsSharedPtrMessage *shared_audio, SrsF
return err;
}
srs_error_t SrsHlsFmp4Muxer::write_video(SrsSharedPtrMessage *shared_video, SrsFormat *format)
srs_error_t SrsHlsFmp4Muxer::write_video(SrsMediaPacket *shared_video, SrsFormat *format)
{
srs_error_t err = srs_success;
@ -2039,7 +2039,7 @@ srs_error_t SrsHlsController::on_unpublish()
return err;
}
srs_error_t SrsHlsController::on_sequence_header(SrsSharedPtrMessage *msg, SrsFormat *format)
srs_error_t SrsHlsController::on_sequence_header(SrsMediaPacket *msg, SrsFormat *format)
{
// TODO: support discontinuity for the same stream
// currently we reap and insert discontinity when encoder republish,
@ -2050,10 +2050,10 @@ srs_error_t SrsHlsController::on_sequence_header(SrsSharedPtrMessage *msg, SrsFo
return muxer->on_sequence_header();
}
srs_error_t SrsHlsController::write_audio(SrsSharedPtrMessage *shared_audio, SrsFormat *format)
srs_error_t SrsHlsController::write_audio(SrsMediaPacket *shared_audio, SrsFormat *format)
{
srs_error_t err = srs_success;
SrsAudioFrame *frame = format->audio;
SrsParsedAudioPacket *frame = format->audio;
// Reset the aac samples counter when DTS jitter.
if (previous_audio_dts > shared_audio->timestamp) {
@ -2140,10 +2140,10 @@ srs_error_t SrsHlsController::write_audio(SrsSharedPtrMessage *shared_audio, Srs
return err;
}
srs_error_t SrsHlsController::write_video(SrsSharedPtrMessage *shared_video, SrsFormat *format)
srs_error_t SrsHlsController::write_video(SrsMediaPacket *shared_video, SrsFormat *format)
{
srs_error_t err = srs_success;
SrsVideoFrame *frame = format->video;
SrsParsedVideoPacket *frame = format->video;
int64_t dts = shared_video->timestamp * 90;
// Refresh the codec ASAP.
@ -2306,10 +2306,10 @@ srs_error_t SrsHlsMp4Controller::on_unpublish()
return err;
}
srs_error_t SrsHlsMp4Controller::write_audio(SrsSharedPtrMessage *shared_audio, SrsFormat *format)
srs_error_t SrsHlsMp4Controller::write_audio(SrsMediaPacket *shared_audio, SrsFormat *format)
{
srs_error_t err = srs_success;
SrsAudioFrame *frame = format->audio;
SrsParsedAudioPacket *frame = format->audio;
// Ignore audio sequence header
if (format->is_aac_sequence_header() || format->is_mp3_sequence_header()) {
@ -2332,10 +2332,10 @@ srs_error_t SrsHlsMp4Controller::write_audio(SrsSharedPtrMessage *shared_audio,
return err;
}
srs_error_t SrsHlsMp4Controller::write_video(SrsSharedPtrMessage *shared_video, SrsFormat *format)
srs_error_t SrsHlsMp4Controller::write_video(SrsMediaPacket *shared_video, SrsFormat *format)
{
srs_error_t err = srs_success;
SrsVideoFrame *frame = format->video;
SrsParsedVideoPacket *frame = format->video;
// Refresh the codec ASAP.
if (muxer_->latest_vcodec() != frame->vcodec()->id) {
@ -2353,7 +2353,7 @@ srs_error_t SrsHlsMp4Controller::write_video(SrsSharedPtrMessage *shared_video,
return err;
}
srs_error_t SrsHlsMp4Controller::on_sequence_header(SrsSharedPtrMessage *msg, SrsFormat *format)
srs_error_t SrsHlsMp4Controller::on_sequence_header(SrsMediaPacket *msg, SrsFormat *format)
{
srs_error_t err = srs_success;
@ -2622,7 +2622,7 @@ void SrsHls::on_unpublish()
unpublishing_ = false;
}
srs_error_t SrsHls::on_audio(SrsSharedPtrMessage *shared_audio, SrsFormat *format)
srs_error_t SrsHls::on_audio(SrsMediaPacket *shared_audio, SrsFormat *format)
{
srs_error_t err = srs_success;
@ -2642,7 +2642,7 @@ srs_error_t SrsHls::on_audio(SrsSharedPtrMessage *shared_audio, SrsFormat *forma
// update the hls time, for hls_dispose.
last_update_time = srs_time_now_cached();
SrsUniquePtr<SrsSharedPtrMessage> audio(shared_audio->copy());
SrsUniquePtr<SrsMediaPacket> audio(shared_audio->copy());
// ts support audio codec: aac/mp3
SrsAudioCodecId acodec = format->acodec->id;
@ -2669,7 +2669,7 @@ srs_error_t SrsHls::on_audio(SrsSharedPtrMessage *shared_audio, SrsFormat *forma
return err;
}
srs_error_t SrsHls::on_video(SrsSharedPtrMessage *shared_video, SrsFormat *format)
srs_error_t SrsHls::on_video(SrsMediaPacket *shared_video, SrsFormat *format)
{
srs_error_t err = srs_success;
@ -2688,7 +2688,7 @@ srs_error_t SrsHls::on_video(SrsSharedPtrMessage *shared_video, SrsFormat *forma
// update the hls time, for hls_dispose.
last_update_time = srs_time_now_cached();
SrsUniquePtr<SrsSharedPtrMessage> video(shared_video->copy());
SrsUniquePtr<SrsMediaPacket> video(shared_video->copy());
// ignore info frame,
// @see https://github.com/ossrs/srs/issues/288#issuecomment-69863909

View File

@ -19,7 +19,7 @@
#include <srs_kernel_mp4.hpp>
class SrsFormat;
class SrsSharedPtrMessage;
class SrsMediaPacket;
class SrsAmf0Object;
class SrsRtmpJitter;
class SrsTsContextWriter;
@ -117,7 +117,7 @@ public:
public:
virtual srs_error_t initialize(int64_t time, uint32_t v_tid, uint32_t a_tid, int sequence_number, std::string m4s_path);
virtual void config_cipher(unsigned char *key, unsigned char *iv);
virtual srs_error_t write(SrsSharedPtrMessage *shared_msg, SrsFormat *format);
virtual srs_error_t write(SrsMediaPacket *shared_msg, SrsFormat *format);
// Finalizes segment
virtual srs_error_t reap(uint64_t dts);
};
@ -410,8 +410,8 @@ public:
public:
virtual srs_error_t write_init_mp4(SrsFormat *format, bool has_video, bool has_audio);
virtual srs_error_t write_audio(SrsSharedPtrMessage *shared_audio, SrsFormat *format);
virtual srs_error_t write_video(SrsSharedPtrMessage *shared_video, SrsFormat *format);
virtual srs_error_t write_audio(SrsMediaPacket *shared_audio, SrsFormat *format);
virtual srs_error_t write_video(SrsMediaPacket *shared_video, SrsFormat *format);
public:
virtual srs_error_t on_unpublish();
@ -459,11 +459,11 @@ public:
virtual srs_error_t on_unpublish() = 0;
public:
virtual srs_error_t write_audio(SrsSharedPtrMessage *shared_audio, SrsFormat *format) = 0;
virtual srs_error_t write_video(SrsSharedPtrMessage *shared_video, SrsFormat *format) = 0;
virtual srs_error_t write_audio(SrsMediaPacket *shared_audio, SrsFormat *format) = 0;
virtual srs_error_t write_video(SrsMediaPacket *shared_video, SrsFormat *format) = 0;
public:
virtual srs_error_t on_sequence_header(SrsSharedPtrMessage *msg, SrsFormat *format) = 0;
virtual srs_error_t on_sequence_header(SrsMediaPacket *msg, SrsFormat *format) = 0;
virtual int sequence_no() = 0;
// TODO: maybe rename to segment_url?
virtual std::string ts_url() = 0;
@ -524,11 +524,11 @@ public:
// must write a #EXT-X-DISCONTINUITY to m3u8.
// @see: hls-m3u8-draft-pantos-http-live-streaming-12.txt
// @see: 3.4.11. EXT-X-DISCONTINUITY
virtual srs_error_t on_sequence_header(SrsSharedPtrMessage *shared_audio, SrsFormat *format);
virtual srs_error_t on_sequence_header(SrsMediaPacket *shared_audio, SrsFormat *format);
// write audio to cache, if need to flush, flush to muxer.
virtual srs_error_t write_audio(SrsSharedPtrMessage *shared_audio, SrsFormat *format);
virtual srs_error_t write_audio(SrsMediaPacket *shared_audio, SrsFormat *format);
// write video to muxer.
virtual srs_error_t write_video(SrsSharedPtrMessage *shared_video, SrsFormat *format);
virtual srs_error_t write_video(SrsMediaPacket *shared_video, SrsFormat *format);
private:
// Reopen the muxer for a new hls segment,
@ -572,11 +572,11 @@ public:
// When publish or unpublish stream.
virtual srs_error_t on_publish(ISrsRequest *req);
virtual srs_error_t on_unpublish();
virtual srs_error_t write_audio(SrsSharedPtrMessage *shared_audio, SrsFormat *format);
virtual srs_error_t write_video(SrsSharedPtrMessage *shared_video, SrsFormat *format);
virtual srs_error_t write_audio(SrsMediaPacket *shared_audio, SrsFormat *format);
virtual srs_error_t write_video(SrsMediaPacket *shared_video, SrsFormat *format);
public:
virtual srs_error_t on_sequence_header(SrsSharedPtrMessage *shared_audio, SrsFormat *format);
virtual srs_error_t on_sequence_header(SrsMediaPacket *shared_audio, SrsFormat *format);
virtual int sequence_no();
virtual std::string ts_url();
virtual srs_utime_t duration();
@ -637,12 +637,12 @@ public:
virtual void on_unpublish();
// Mux the audio packets to ts.
// @param shared_audio, directly ptr, copy it if need to save it.
virtual srs_error_t on_audio(SrsSharedPtrMessage *shared_audio, SrsFormat *format);
virtual srs_error_t on_audio(SrsMediaPacket *shared_audio, SrsFormat *format);
// Mux the video packets to ts.
// @param shared_video, directly ptr, copy it if need to save it.
// @param is_sps_pps whether the video is h.264 sps/pps.
// TODO: FIXME: Remove param is_sps_pps.
virtual srs_error_t on_video(SrsSharedPtrMessage *shared_video, SrsFormat *format);
virtual srs_error_t on_video(SrsMediaPacket *shared_video, SrsFormat *format);
private:
virtual void hls_show_mux_log();

View File

@ -29,7 +29,7 @@ class SrsHttpParser;
class ISrsHttpMessage;
class SrsHttpHandler;
class SrsMessageQueue;
class SrsSharedPtrMessage;
class SrsMediaPacket;
class SrsFastStream;
class SrsHttpUri;
class SrsHttpMessage;

View File

@ -188,7 +188,7 @@ srs_error_t SrsBufferCache::cycle()
// free the messages.
for (int i = 0; i < count; i++) {
SrsSharedPtrMessage *msg = msgs.msgs[i];
SrsMediaPacket *msg = msgs.msgs[i];
queue->enqueue(msg);
}
}
@ -369,7 +369,7 @@ srs_error_t SrsFlvStreamEncoder::dump_cache(SrsLiveConsumer * /*consumer*/, SrsR
return srs_success;
}
srs_error_t SrsFlvStreamEncoder::write_tags(SrsSharedPtrMessage **msgs, int count)
srs_error_t SrsFlvStreamEncoder::write_tags(SrsMediaPacket **msgs, int count)
{
srs_error_t err = srs_success;
@ -390,7 +390,7 @@ srs_error_t SrsFlvStreamEncoder::write_tags(SrsSharedPtrMessage **msgs, int coun
// Note that we must iterate all messages to count the audio and video frames.
for (int i = 0; i < count; i++) {
SrsSharedPtrMessage *msg = msgs[i];
SrsMediaPacket *msg = msgs[i];
if (msg->is_video()) {
if (!SrsFlvVideo::sh(msg->payload(), msg->size()))
nn_video_frames++;
@ -862,7 +862,7 @@ srs_error_t SrsLiveStream::do_serve_http(SrsLiveSource *source, SrsLiveConsumer
// free the messages.
for (int i = 0; i < count; i++) {
SrsSharedPtrMessage *msg = msgs.msgs[i];
SrsMediaPacket *msg = msgs.msgs[i];
srs_freep(msg);
}
@ -948,14 +948,14 @@ void SrsLiveStream::http_hooks_on_stop(ISrsHttpMessage *r)
return;
}
srs_error_t SrsLiveStream::streaming_send_messages(ISrsBufferEncoder *enc, SrsSharedPtrMessage **msgs, int nb_msgs)
srs_error_t SrsLiveStream::streaming_send_messages(ISrsBufferEncoder *enc, SrsMediaPacket **msgs, int nb_msgs)
{
srs_error_t err = srs_success;
// TODO: In gop cache, we know both the audio and video codec, so we should notice the encoder, which might depends
// on setting the correct codec information, for example, HTTP-TS or HLS will write PMT.
for (int i = 0; i < nb_msgs; i++) {
SrsSharedPtrMessage *msg = msgs[i];
SrsMediaPacket *msg = msgs[i];
if (msg->is_audio()) {
err = enc->write_audio(msg->timestamp, msg->payload(), msg->size());

View File

@ -105,7 +105,7 @@ public:
public:
// Write the tags in a time.
virtual srs_error_t write_tags(SrsSharedPtrMessage **msgs, int count);
virtual srs_error_t write_tags(SrsMediaPacket **msgs, int count);
private:
virtual srs_error_t write_header(bool has_video, bool has_audio);
@ -239,7 +239,7 @@ private:
virtual srs_error_t do_serve_http(SrsLiveSource *source, SrsLiveConsumer *consumer, ISrsHttpResponseWriter *w, ISrsHttpMessage *r);
virtual srs_error_t http_hooks_on_play(ISrsHttpMessage *r);
virtual void http_hooks_on_stop(ISrsHttpMessage *r);
virtual srs_error_t streaming_send_messages(ISrsBufferEncoder *enc, SrsSharedPtrMessage **msgs, int nb_msgs);
virtual srs_error_t streaming_send_messages(ISrsBufferEncoder *enc, SrsMediaPacket **msgs, int nb_msgs);
};
// The Live Entry, to handle HTTP Live Streaming.

View File

@ -84,15 +84,15 @@ SrsMpegtsQueue::SrsMpegtsQueue()
SrsMpegtsQueue::~SrsMpegtsQueue()
{
std::map<int64_t, SrsSharedPtrMessage *>::iterator it;
std::map<int64_t, SrsMediaPacket *>::iterator it;
for (it = msgs.begin(); it != msgs.end(); ++it) {
SrsSharedPtrMessage *msg = it->second;
SrsMediaPacket *msg = it->second;
srs_freep(msg);
}
msgs.clear();
}
srs_error_t SrsMpegtsQueue::push(SrsSharedPtrMessage *msg)
srs_error_t SrsMpegtsQueue::push(SrsMediaPacket *msg)
{
srs_error_t err = srs_success;
@ -125,7 +125,7 @@ srs_error_t SrsMpegtsQueue::push(SrsSharedPtrMessage *msg)
return err;
}
SrsSharedPtrMessage *SrsMpegtsQueue::dequeue()
SrsMediaPacket *SrsMpegtsQueue::dequeue()
{
// got 2+ videos and audios, ok to dequeue.
bool av_ok = nb_videos >= 2 && nb_audios >= 2;
@ -133,8 +133,8 @@ SrsSharedPtrMessage *SrsMpegtsQueue::dequeue()
bool av_overflow = nb_videos > 100 || nb_audios > 300;
if (av_ok || av_overflow) {
std::map<int64_t, SrsSharedPtrMessage *>::iterator it = msgs.begin();
SrsSharedPtrMessage *msg = it->second;
std::map<int64_t, SrsMediaPacket *>::iterator it = msgs.begin();
SrsMediaPacket *msg = it->second;
msgs.erase(it);
if (msg->is_audio()) {
@ -604,12 +604,15 @@ srs_error_t SrsMpegtsOverUdp::rtmp_write_packet(char type, uint32_t timestamp, c
return srs_error_wrap(err, "connect");
}
SrsSharedPtrMessage *msg = NULL;
if ((err = srs_rtmp_create_msg(type, timestamp, data, size, sdk->sid(), &msg)) != srs_success) {
SrsCommonMessage *cmsg = NULL;
if ((err = srs_rtmp_create_msg(type, timestamp, data, size, sdk->sid(), &cmsg)) != srs_success) {
return srs_error_wrap(err, "create message");
}
srs_assert(msg);
srs_assert(cmsg);
SrsMediaPacket *msg = new SrsMediaPacket();
cmsg->to_msg(msg);
srs_freep(cmsg);
// push msg to queue.
if ((err = queue->push(msg)) != srs_success) {

View File

@ -21,7 +21,7 @@ class SrsRtmpClient;
class SrsStSocket;
class ISrsRequest;
class SrsRawH264Stream;
class SrsSharedPtrMessage;
class SrsMediaPacket;
class SrsRawAacStream;
struct SrsRawAacStreamCodec;
class SrsPithyPrint;
@ -56,7 +56,7 @@ class SrsMpegtsQueue
{
private:
// The key: dts, value: msg.
std::map<int64_t, SrsSharedPtrMessage *> msgs;
std::map<int64_t, SrsMediaPacket *> msgs;
int nb_audios;
int nb_videos;
@ -65,8 +65,8 @@ public:
virtual ~SrsMpegtsQueue();
public:
virtual srs_error_t push(SrsSharedPtrMessage *msg);
virtual SrsSharedPtrMessage *dequeue();
virtual srs_error_t push(SrsMediaPacket *msg);
virtual SrsMediaPacket *dequeue();
};
// The mpegts over udp stream caster.

View File

@ -159,7 +159,7 @@ srs_error_t SrsAudioTranscoder::initialize(SrsAudioCodecId src_codec, SrsAudioCo
return err;
}
srs_error_t SrsAudioTranscoder::transcode(SrsAudioFrame *in_pkt, std::vector<SrsAudioFrame *> &out_pkts)
srs_error_t SrsAudioTranscoder::transcode(SrsParsedAudioPacket *in_pkt, std::vector<SrsParsedAudioPacket *> &out_pkts)
{
srs_error_t err = srs_success;
@ -174,10 +174,10 @@ srs_error_t SrsAudioTranscoder::transcode(SrsAudioFrame *in_pkt, std::vector<Srs
return err;
}
void SrsAudioTranscoder::free_frames(std::vector<SrsAudioFrame *> &frames)
void SrsAudioTranscoder::free_frames(std::vector<SrsParsedAudioPacket *> &frames)
{
for (std::vector<SrsAudioFrame *>::iterator it = frames.begin(); it != frames.end(); ++it) {
SrsAudioFrame *p = *it;
for (std::vector<SrsParsedAudioPacket *>::iterator it = frames.begin(); it != frames.end(); ++it) {
SrsParsedAudioPacket *p = *it;
for (int i = 0; i < p->nb_samples; i++) {
char *pa = p->samples[i].bytes;
@ -325,7 +325,7 @@ srs_error_t SrsAudioTranscoder::init_fifo()
return srs_success;
}
srs_error_t SrsAudioTranscoder::decode_and_resample(SrsAudioFrame *pkt)
srs_error_t SrsAudioTranscoder::decode_and_resample(SrsParsedAudioPacket *pkt)
{
srs_error_t err = srs_success;
@ -380,7 +380,7 @@ srs_error_t SrsAudioTranscoder::decode_and_resample(SrsAudioFrame *pkt)
return err;
}
srs_error_t SrsAudioTranscoder::encode(std::vector<SrsAudioFrame *> &pkts)
srs_error_t SrsAudioTranscoder::encode(std::vector<SrsParsedAudioPacket *> &pkts)
{
char err_buf[AV_ERROR_MAX_STRING_SIZE] = {0};
@ -435,7 +435,7 @@ srs_error_t SrsAudioTranscoder::encode(std::vector<SrsAudioFrame *> &pkts)
enc_packet_->dts = av_rescale(enc_packet_->dts, 1000, enc_->time_base.den);
enc_packet_->pts = av_rescale(enc_packet_->pts, 1000, enc_->time_base.den);
SrsAudioFrame *out_frame = new SrsAudioFrame;
SrsParsedAudioPacket *out_frame = new SrsParsedAudioPacket;
char *buf = new char[enc_packet_->size];
memcpy(buf, enc_packet_->data, enc_packet_->size);
out_frame->add_sample(buf, enc_packet_->size);

View File

@ -10,6 +10,7 @@
#include <srs_core.hpp>
#include <srs_kernel_codec.hpp>
#include <srs_kernel_packet.hpp>
#include <string>
@ -60,9 +61,9 @@ public:
// The bit_rate specifies the bitrate of encoder, for example, 48000.
srs_error_t initialize(SrsAudioCodecId from, SrsAudioCodecId to, int channels, int sample_rate, int bit_rate);
// Transcode the input audio frame in, as output audio frames outs.
virtual srs_error_t transcode(SrsAudioFrame *in, std::vector<SrsAudioFrame *> &outs);
virtual srs_error_t transcode(SrsParsedAudioPacket *in, std::vector<SrsParsedAudioPacket *> &outs);
// Free the generated audio frames by transcode.
void free_frames(std::vector<SrsAudioFrame *> &frames);
void free_frames(std::vector<SrsParsedAudioPacket *> &frames);
public:
// Get the aac codec header, for example, FLV sequence header.
@ -75,8 +76,8 @@ private:
srs_error_t init_swr(AVCodecContext *decoder);
srs_error_t init_fifo();
srs_error_t decode_and_resample(SrsAudioFrame *pkt);
srs_error_t encode(std::vector<SrsAudioFrame *> &pkts);
srs_error_t decode_and_resample(SrsParsedAudioPacket *pkt);
srs_error_t encode(std::vector<SrsParsedAudioPacket *> &pkts);
srs_error_t add_samples_to_fifo(uint8_t **samples, int frame_size);
void free_swr_samples();

View File

@ -35,7 +35,7 @@ class SrsLiveConsumer;
class SrsStunPacket;
class SrsServer;
class SrsRtcConnection;
class SrsSharedPtrMessage;
class SrsMediaPacket;
class SrsRtcSource;
class SrsRtpPacket;
class ISrsCodec;

View File

@ -68,7 +68,7 @@ using namespace std;
#define SRS_RTC_SOURCE_CLEANUP (3 * SRS_UTIME_SECONDS)
// TODO: Add this function into SrsRtpMux class.
srs_error_t aac_raw_append_adts_header(SrsSharedPtrMessage *shared_audio, SrsFormat *format, char **pbuf, int *pnn_buf)
srs_error_t aac_raw_append_adts_header(SrsMediaPacket *shared_audio, SrsFormat *format, char **pbuf, int *pnn_buf)
{
srs_error_t err = srs_success;
@ -1005,7 +1005,7 @@ void SrsRtcRtpBuilder::on_unpublish()
meta->update_previous_ash();
}
srs_error_t SrsRtcRtpBuilder::on_frame(SrsSharedPtrMessage *frame)
srs_error_t SrsRtcRtpBuilder::on_frame(SrsMediaPacket *frame)
{
if (frame->is_audio()) {
return on_audio(frame);
@ -1015,7 +1015,7 @@ srs_error_t SrsRtcRtpBuilder::on_frame(SrsSharedPtrMessage *frame)
return srs_success;
}
srs_error_t SrsRtcRtpBuilder::on_audio(SrsSharedPtrMessage *msg)
srs_error_t SrsRtcRtpBuilder::on_audio(SrsMediaPacket *msg)
{
srs_error_t err = srs_success;
@ -1072,7 +1072,7 @@ srs_error_t SrsRtcRtpBuilder::on_audio(SrsSharedPtrMessage *msg)
return err;
}
SrsAudioFrame aac;
SrsParsedAudioPacket aac;
aac.dts = format->audio->dts;
aac.cts = format->audio->cts;
if ((err = aac.add_sample(adts_audio, nn_adts_audio)) == srs_success) {
@ -1115,11 +1115,11 @@ srs_error_t SrsRtcRtpBuilder::init_codec(SrsAudioCodecId codec)
return err;
}
srs_error_t SrsRtcRtpBuilder::transcode(SrsAudioFrame *audio)
srs_error_t SrsRtcRtpBuilder::transcode(SrsParsedAudioPacket *audio)
{
srs_error_t err = srs_success;
std::vector<SrsAudioFrame *> out_audios;
std::vector<SrsParsedAudioPacket *> out_audios;
if ((err = codec_->transcode(audio, out_audios)) != srs_success) {
return srs_error_wrap(err, "recode error");
}
@ -1129,8 +1129,8 @@ srs_error_t SrsRtcRtpBuilder::transcode(SrsAudioFrame *audio)
return err;
}
for (std::vector<SrsAudioFrame *>::iterator it = out_audios.begin(); it != out_audios.end(); ++it) {
SrsAudioFrame *out_audio = *it;
for (std::vector<SrsParsedAudioPacket *>::iterator it = out_audios.begin(); it != out_audios.end(); ++it) {
SrsParsedAudioPacket *out_audio = *it;
SrsUniquePtr<SrsRtpPacket> pkt(new SrsRtpPacket());
if ((err = package_opus(out_audio, pkt.get())) != srs_success) {
@ -1149,7 +1149,7 @@ srs_error_t SrsRtcRtpBuilder::transcode(SrsAudioFrame *audio)
return err;
}
srs_error_t SrsRtcRtpBuilder::package_opus(SrsAudioFrame *audio, SrsRtpPacket *pkt)
srs_error_t SrsRtcRtpBuilder::package_opus(SrsParsedAudioPacket *audio, SrsRtpPacket *pkt)
{
srs_error_t err = srs_success;
@ -1181,7 +1181,7 @@ static void free_packets(vector<SrsRtpPacket *> *pkts)
pkts->clear();
}
srs_error_t SrsRtcRtpBuilder::on_video(SrsSharedPtrMessage *msg)
srs_error_t SrsRtcRtpBuilder::on_video(SrsMediaPacket *msg)
{
srs_error_t err = srs_success;
@ -1216,7 +1216,7 @@ srs_error_t SrsRtcRtpBuilder::on_video(SrsSharedPtrMessage *msg)
}
bool has_idr = false;
vector<SrsSample *> samples;
vector<SrsNaluSample *> samples;
if ((err = filter(msg, format, has_idr, samples)) != srs_success) {
return srs_error_wrap(err, "filter video");
}
@ -1247,7 +1247,7 @@ srs_error_t SrsRtcRtpBuilder::on_video(SrsSharedPtrMessage *msg)
} else {
// By default, we package each NALU(sample) to a RTP or FUA packet.
for (int i = 0; i < nn_samples; i++) {
SrsSample *sample = samples[i];
SrsNaluSample *sample = samples[i];
if (sample->size <= kRtpMaxPayloadSize) {
if ((err = package_single_nalu(msg, sample, pkts)) != srs_success) {
@ -1268,7 +1268,7 @@ srs_error_t SrsRtcRtpBuilder::on_video(SrsSharedPtrMessage *msg)
return consume_packets(pkts);
}
srs_error_t SrsRtcRtpBuilder::filter(SrsSharedPtrMessage *msg, SrsFormat *format, bool &has_idr, vector<SrsSample *> &samples)
srs_error_t SrsRtcRtpBuilder::filter(SrsMediaPacket *msg, SrsFormat *format, bool &has_idr, vector<SrsNaluSample *> &samples)
{
srs_error_t err = srs_success;
@ -1279,12 +1279,12 @@ srs_error_t SrsRtcRtpBuilder::filter(SrsSharedPtrMessage *msg, SrsFormat *format
// Update samples to shared frame.
for (int i = 0; i < format->video->nb_samples; ++i) {
SrsSample *sample = &format->video->samples[i];
SrsNaluSample *sample = &format->video->samples[i];
if (!keep_avc_nalu_sei && format->vcodec->id == SrsVideoCodecIdAVC) {
SrsAvcNaluType avc_nalu_type;
if ((err = SrsVideoFrame::parse_avc_nalu_type(sample, avc_nalu_type)) != srs_success) {
if ((err = SrsParsedVideoPacket::parse_avc_nalu_type(sample, avc_nalu_type)) != srs_success) {
return srs_error_wrap(err, "parse avc nalu_type");
}
if (avc_nalu_type == SrsAvcNaluTypeSEI) {
@ -1298,11 +1298,11 @@ srs_error_t SrsRtcRtpBuilder::filter(SrsSharedPtrMessage *msg, SrsFormat *format
if (!keep_bframe) {
bool is_b_frame = false;
if (format->vcodec->id == SrsVideoCodecIdAVC) {
if ((err = SrsVideoFrame::parse_avc_bframe(sample, is_b_frame)) != srs_success) {
if ((err = SrsParsedVideoPacket::parse_avc_bframe(sample, is_b_frame)) != srs_success) {
return srs_error_wrap(err, "parse bframe");
}
} else if (format->vcodec->id == SrsVideoCodecIdHEVC) {
if ((err = SrsVideoFrame::parse_hevc_bframe(sample, format, is_b_frame)) != srs_success) {
if ((err = SrsParsedVideoPacket::parse_hevc_bframe(sample, format, is_b_frame)) != srs_success) {
return srs_error_wrap(err, "parse bframe");
}
}
@ -1317,7 +1317,7 @@ srs_error_t SrsRtcRtpBuilder::filter(SrsSharedPtrMessage *msg, SrsFormat *format
return err;
}
srs_error_t SrsRtcRtpBuilder::package_stap_a(SrsSharedPtrMessage *msg, SrsRtpPacket *pkt)
srs_error_t SrsRtcRtpBuilder::package_stap_a(SrsMediaPacket *msg, SrsRtpPacket *pkt)
{
srs_error_t err = srs_success;
@ -1329,7 +1329,7 @@ srs_error_t SrsRtcRtpBuilder::package_stap_a(SrsSharedPtrMessage *msg, SrsRtpPac
return video_builder_->package_stap_a(msg, pkt);
}
srs_error_t SrsRtcRtpBuilder::package_nalus(SrsSharedPtrMessage *msg, const vector<SrsSample *> &samples, vector<SrsRtpPacket *> &pkts)
srs_error_t SrsRtcRtpBuilder::package_nalus(SrsMediaPacket *msg, const vector<SrsNaluSample *> &samples, vector<SrsRtpPacket *> &pkts)
{
srs_error_t err = srs_success;
@ -1342,12 +1342,12 @@ srs_error_t SrsRtcRtpBuilder::package_nalus(SrsSharedPtrMessage *msg, const vect
}
// Single NAL Unit Packet @see https://tools.ietf.org/html/rfc6184#section-5.6
srs_error_t SrsRtcRtpBuilder::package_single_nalu(SrsSharedPtrMessage *msg, SrsSample *sample, vector<SrsRtpPacket *> &pkts)
srs_error_t SrsRtcRtpBuilder::package_single_nalu(SrsMediaPacket *msg, SrsNaluSample *sample, vector<SrsRtpPacket *> &pkts)
{
return video_builder_->package_single_nalu(msg, sample, pkts);
}
srs_error_t SrsRtcRtpBuilder::package_fu_a(SrsSharedPtrMessage *msg, SrsSample *sample, int fu_payload_size, vector<SrsRtpPacket *> &pkts)
srs_error_t SrsRtcRtpBuilder::package_fu_a(SrsMediaPacket *msg, SrsNaluSample *sample, int fu_payload_size, vector<SrsRtpPacket *> &pkts)
{
srs_error_t err = srs_success;
@ -1867,10 +1867,8 @@ srs_error_t SrsRtcFrameBuilder::transcode_audio(SrsRtpPacket *pkt)
SrsCommonMessage out_rtmp;
packet_aac(&out_rtmp, (char *)header, header_len, ts, is_first_audio_);
SrsSharedPtrMessage msg;
if ((err = msg.create(&out_rtmp)) != srs_success) {
return srs_error_wrap(err, "create message");
}
SrsMediaPacket msg;
out_rtmp.to_msg(&msg);
if ((err = bridge_->on_frame(&msg)) != srs_success) {
return srs_error_wrap(err, "source on audio");
@ -1880,10 +1878,10 @@ srs_error_t SrsRtcFrameBuilder::transcode_audio(SrsRtpPacket *pkt)
}
// TODO: FIXME: Should use SrsUniquePtr to dispose it automatically.
std::vector<SrsAudioFrame *> out_pkts;
std::vector<SrsParsedAudioPacket *> out_pkts;
SrsRtpRawPayload *payload = dynamic_cast<SrsRtpRawPayload *>(pkt->payload());
SrsAudioFrame frame;
SrsParsedAudioPacket frame;
frame.add_sample(payload->payload, payload->nn_payload);
frame.dts = ts;
frame.cts = 0;
@ -1893,16 +1891,14 @@ srs_error_t SrsRtcFrameBuilder::transcode_audio(SrsRtpPacket *pkt)
return err;
}
for (std::vector<SrsAudioFrame *>::iterator it = out_pkts.begin(); it != out_pkts.end(); ++it) {
for (std::vector<SrsParsedAudioPacket *>::iterator it = out_pkts.begin(); it != out_pkts.end(); ++it) {
SrsCommonMessage out_rtmp;
// TODO: FIXME: Should never directly use it, please define a variable with class name.
out_rtmp.header.timestamp = (*it)->dts;
packet_aac(&out_rtmp, (*it)->samples[0].bytes, (*it)->samples[0].size, ts, is_first_audio_);
SrsSharedPtrMessage msg;
if ((err = msg.create(&out_rtmp)) != srs_success) {
return srs_error_wrap(err, "create message");
}
SrsMediaPacket msg;
out_rtmp.to_msg(&msg);
if ((err = bridge_->on_frame(&msg)) != srs_success) {
err = srs_error_wrap(err, "source on audio");
@ -2023,10 +2019,10 @@ srs_error_t SrsRtcFrameBuilder::packet_sequence_header_avc(SrsRtpPacket *pkt)
// Handle SPS/PPS in cache or STAP-A packet.
if (stap_payload || has_sps_pps_in_raw_payload) {
// Get the SPS/PPS from cache or STAP-A packet.
SrsSample *sps = stap_payload ? stap_payload->get_sps() : NULL;
SrsNaluSample *sps = stap_payload ? stap_payload->get_sps() : NULL;
if (!sps && obs_whip_sps_)
sps = dynamic_cast<SrsRtpRawPayload *>(obs_whip_sps_->payload())->sample_;
SrsSample *pps = stap_payload ? stap_payload->get_pps() : NULL;
SrsNaluSample *pps = stap_payload ? stap_payload->get_pps() : NULL;
if (!pps && obs_whip_pps_)
pps = dynamic_cast<SrsRtpRawPayload *>(obs_whip_pps_->payload())->sample_;
if (!sps || !pps) {
@ -2048,7 +2044,7 @@ srs_error_t SrsRtcFrameBuilder::packet_sequence_header_avc(SrsRtpPacket *pkt)
return err;
}
srs_error_t SrsRtcFrameBuilder::do_packet_sequence_header_avc(SrsRtpPacket *pkt, SrsSample *sps, SrsSample *pps)
srs_error_t SrsRtcFrameBuilder::do_packet_sequence_header_avc(SrsRtpPacket *pkt, SrsNaluSample *sps, SrsNaluSample *pps)
{
srs_error_t err = srs_success;
@ -2078,10 +2074,8 @@ srs_error_t SrsRtcFrameBuilder::do_packet_sequence_header_avc(SrsRtpPacket *pkt,
return srs_error_wrap(err, "create rtmp");
}
SrsSharedPtrMessage msg;
if ((err = msg.create(&rtmp)) != srs_success) {
return srs_error_wrap(err, "create message");
}
SrsMediaPacket msg;
rtmp.to_msg(&msg);
if ((err = bridge_->on_frame(&msg)) != srs_success) {
return err;
@ -2121,13 +2115,13 @@ srs_error_t SrsRtcFrameBuilder::packet_sequence_header_hevc(SrsRtpPacket *pkt)
// Generally, there will be SPS+PPS+IDR in a STAP-A packet.
SrsRtpSTAPPayloadHevc *stap_payload_hevc = dynamic_cast<SrsRtpSTAPPayloadHevc *>(pkt->payload());
if (video_codec_ == SrsVideoCodecIdHEVC && (stap_payload_hevc || has_vps_sps_pps_in_raw_payload)) {
SrsSample *vps = stap_payload_hevc ? stap_payload_hevc->get_vps() : NULL;
SrsNaluSample *vps = stap_payload_hevc ? stap_payload_hevc->get_vps() : NULL;
if (!vps && obs_whip_vps_)
vps = dynamic_cast<SrsRtpRawPayload *>(obs_whip_vps_->payload())->sample_;
SrsSample *sps = stap_payload_hevc ? stap_payload_hevc->get_sps() : NULL;
SrsNaluSample *sps = stap_payload_hevc ? stap_payload_hevc->get_sps() : NULL;
if (!sps && obs_whip_sps_)
sps = dynamic_cast<SrsRtpRawPayload *>(obs_whip_sps_->payload())->sample_;
SrsSample *pps = stap_payload_hevc ? stap_payload_hevc->get_pps() : NULL;
SrsNaluSample *pps = stap_payload_hevc ? stap_payload_hevc->get_pps() : NULL;
if (!pps && obs_whip_pps_)
pps = dynamic_cast<SrsRtpRawPayload *>(obs_whip_pps_->payload())->sample_;
if (!vps || !sps || !pps) {
@ -2149,7 +2143,7 @@ srs_error_t SrsRtcFrameBuilder::packet_sequence_header_hevc(SrsRtpPacket *pkt)
return err;
}
srs_error_t SrsRtcFrameBuilder::do_packet_sequence_header_hevc(SrsRtpPacket *pkt, SrsSample *vps, SrsSample *sps, SrsSample *pps)
srs_error_t SrsRtcFrameBuilder::do_packet_sequence_header_hevc(SrsRtpPacket *pkt, SrsNaluSample *vps, SrsNaluSample *sps, SrsNaluSample *pps)
{
srs_error_t err = srs_success;
@ -2177,10 +2171,8 @@ srs_error_t SrsRtcFrameBuilder::do_packet_sequence_header_hevc(SrsRtpPacket *pkt
return srs_error_wrap(err, "create rtmp");
}
SrsSharedPtrMessage msg;
if ((err = msg.create(&rtmp)) != srs_success) {
return srs_error_wrap(err, "create message");
}
SrsMediaPacket msg;
rtmp.to_msg(&msg);
if ((err = bridge_->on_frame(&msg)) != srs_success) {
return err;
@ -2210,7 +2202,7 @@ int SrsRtcFrameBuilder::calculate_packet_payload_size(SrsRtpPacket *pkt)
if (stap_payload) {
int size = 0;
for (int j = 0; j < (int)stap_payload->nalus.size(); ++j) {
SrsSample *sample = stap_payload->nalus.at(j);
SrsNaluSample *sample = stap_payload->nalus.at(j);
if (sample->size > 0) {
size += 4 + sample->size; // length prefix + NALU
}
@ -2233,7 +2225,7 @@ int SrsRtcFrameBuilder::calculate_packet_payload_size(SrsRtpPacket *pkt)
if (stap_payload_hevc) {
int size = 0;
for (int j = 0; j < (int)stap_payload_hevc->nalus.size(); ++j) {
SrsSample *sample = stap_payload_hevc->nalus.at(j);
SrsNaluSample *sample = stap_payload_hevc->nalus.at(j);
if (sample->size > 0) {
size += 4 + sample->size; // length prefix + NALU
}
@ -2281,7 +2273,7 @@ void SrsRtcFrameBuilder::write_packet_payload_to_buffer(SrsRtpPacket *pkt, SrsBu
SrsRtpSTAPPayload *stap_payload = dynamic_cast<SrsRtpSTAPPayload *>(pkt->payload());
if (stap_payload) {
for (int j = 0; j < (int)stap_payload->nalus.size(); ++j) {
SrsSample *sample = stap_payload->nalus.at(j);
SrsNaluSample *sample = stap_payload->nalus.at(j);
if (sample->size > 0) {
payload.write_4bytes(sample->size);
payload.write_bytes(sample->bytes, sample->size);
@ -2316,7 +2308,7 @@ void SrsRtcFrameBuilder::write_packet_payload_to_buffer(SrsRtpPacket *pkt, SrsBu
SrsRtpSTAPPayloadHevc *stap_payload_hevc = dynamic_cast<SrsRtpSTAPPayloadHevc *>(pkt->payload());
if (stap_payload_hevc) {
for (int j = 0; j < (int)stap_payload_hevc->nalus.size(); ++j) {
SrsSample *sample = stap_payload_hevc->nalus.at(j);
SrsNaluSample *sample = stap_payload_hevc->nalus.at(j);
if (sample->size > 0) {
payload.write_4bytes(sample->size);
payload.write_bytes(sample->bytes, sample->size);
@ -2435,10 +2427,8 @@ srs_error_t SrsRtcFrameBuilder::packet_video_rtmp(const uint16_t start, const ui
write_packet_payload_to_buffer(pkt.get(), payload, nalu_len);
}
SrsSharedPtrMessage msg;
if ((err = msg.create(&rtmp)) != srs_success) {
return srs_error_wrap(err, "create message");
}
SrsMediaPacket msg;
rtmp.to_msg(&msg);
if ((err = bridge_->on_frame(&msg)) != srs_success) {
srs_warn("fail to pack video frame: %s", srs_error_summary(err).c_str());

View File

@ -24,14 +24,14 @@
class ISrsRequest;
class SrsMetaCache;
class SrsSharedPtrMessage;
class SrsMediaPacket;
class SrsCommonMessage;
class SrsMessageArray;
class SrsRtcSource;
class SrsFrameToRtcBridge;
class SrsAudioTranscoder;
class SrsRtpPacket;
class SrsSample;
class SrsNaluSample;
class SrsRtcSourceDescription;
class SrsRtcTrackDescription;
class SrsRtcConnection;
@ -346,25 +346,25 @@ public:
virtual srs_error_t initialize(ISrsRequest *r);
virtual srs_error_t on_publish();
virtual void on_unpublish();
virtual srs_error_t on_frame(SrsSharedPtrMessage *frame);
virtual srs_error_t on_frame(SrsMediaPacket *frame);
private:
virtual srs_error_t on_audio(SrsSharedPtrMessage *msg);
virtual srs_error_t on_audio(SrsMediaPacket *msg);
private:
srs_error_t init_codec(SrsAudioCodecId codec);
srs_error_t transcode(SrsAudioFrame *audio);
srs_error_t package_opus(SrsAudioFrame *audio, SrsRtpPacket *pkt);
srs_error_t transcode(SrsParsedAudioPacket *audio);
srs_error_t package_opus(SrsParsedAudioPacket *audio, SrsRtpPacket *pkt);
private:
virtual srs_error_t on_video(SrsSharedPtrMessage *msg);
virtual srs_error_t on_video(SrsMediaPacket *msg);
private:
srs_error_t filter(SrsSharedPtrMessage *msg, SrsFormat *format, bool &has_idr, std::vector<SrsSample *> &samples);
srs_error_t package_stap_a(SrsSharedPtrMessage *msg, SrsRtpPacket *pkt);
srs_error_t package_nalus(SrsSharedPtrMessage *msg, const std::vector<SrsSample *> &samples, std::vector<SrsRtpPacket *> &pkts);
srs_error_t package_single_nalu(SrsSharedPtrMessage *msg, SrsSample *sample, std::vector<SrsRtpPacket *> &pkts);
srs_error_t package_fu_a(SrsSharedPtrMessage *msg, SrsSample *sample, int fu_payload_size, std::vector<SrsRtpPacket *> &pkts);
srs_error_t filter(SrsMediaPacket *msg, SrsFormat *format, bool &has_idr, std::vector<SrsNaluSample *> &samples);
srs_error_t package_stap_a(SrsMediaPacket *msg, SrsRtpPacket *pkt);
srs_error_t package_nalus(SrsMediaPacket *msg, const std::vector<SrsNaluSample *> &samples, std::vector<SrsRtpPacket *> &pkts);
srs_error_t package_single_nalu(SrsMediaPacket *msg, SrsNaluSample *sample, std::vector<SrsRtpPacket *> &pkts);
srs_error_t package_fu_a(SrsMediaPacket *msg, SrsNaluSample *sample, int fu_payload_size, std::vector<SrsRtpPacket *> &pkts);
srs_error_t consume_packets(std::vector<SrsRtpPacket *> &pkts);
};
@ -504,9 +504,9 @@ private:
srs_error_t packet_video(SrsRtpPacket *pkt);
srs_error_t packet_video_key_frame(SrsRtpPacket *pkt);
srs_error_t packet_sequence_header_avc(SrsRtpPacket *pkt);
srs_error_t do_packet_sequence_header_avc(SrsRtpPacket *pkt, SrsSample *sps, SrsSample *pps);
srs_error_t do_packet_sequence_header_avc(SrsRtpPacket *pkt, SrsNaluSample *sps, SrsNaluSample *pps);
srs_error_t packet_sequence_header_hevc(SrsRtpPacket *pkt);
srs_error_t do_packet_sequence_header_hevc(SrsRtpPacket *pkt, SrsSample *vps, SrsSample *sps, SrsSample *pps);
srs_error_t do_packet_sequence_header_hevc(SrsRtpPacket *pkt, SrsNaluSample *vps, SrsNaluSample *sps, SrsNaluSample *pps);
private:
srs_error_t packet_video_rtmp(const uint16_t start, const uint16_t end);

View File

@ -825,7 +825,7 @@ srs_error_t SrsRtmpConn::do_playing(SrsSharedPtr<SrsLiveSource> source, SrsLiveC
// we start to collect the durations for each message.
if (user_specified_duration_to_stop) {
for (int i = 0; i < count; i++) {
SrsSharedPtrMessage *msg = msgs.msgs[i];
SrsMediaPacket *msg = msgs.msgs[i];
// foreach msg, collect the duration.
// @remark: never use msg when sent it, for the protocol sdk will free it.
@ -1109,11 +1109,11 @@ srs_error_t SrsRtmpConn::handle_publish_message(SrsSharedPtr<SrsLiveSource> &sou
// process publish event.
if (msg->header.is_amf0_command() || msg->header.is_amf3_command()) {
SrsPacket *pkt_raw = NULL;
SrsRtmpCommand *pkt_raw = NULL;
if ((err = rtmp->decode_message(msg, &pkt_raw)) != srs_success) {
return srs_error_wrap(err, "rtmp: decode message");
}
SrsUniquePtr<SrsPacket> pkt(pkt_raw);
SrsUniquePtr<SrsRtmpCommand> pkt(pkt_raw);
// for flash, any packet is republish.
if (info->type == SrsRtmpConnFlashPublish) {
@ -1181,11 +1181,11 @@ srs_error_t SrsRtmpConn::process_publish_message(SrsSharedPtr<SrsLiveSource> &so
// process onMetaData
if (msg->header.is_amf0_data() || msg->header.is_amf3_data()) {
SrsPacket *pkt_raw = NULL;
SrsRtmpCommand *pkt_raw = NULL;
if ((err = rtmp->decode_message(msg, &pkt_raw)) != srs_success) {
return srs_error_wrap(err, "rtmp: decode message");
}
SrsUniquePtr<SrsPacket> pkt(pkt_raw);
SrsUniquePtr<SrsRtmpCommand> pkt(pkt_raw);
if (dynamic_cast<SrsOnMetaDataPacket *>(pkt.get())) {
SrsOnMetaDataPacket *metadata = dynamic_cast<SrsOnMetaDataPacket *>(pkt.get());
@ -1213,11 +1213,11 @@ srs_error_t SrsRtmpConn::process_play_control_msg(SrsLiveConsumer *consumer, Srs
return err;
}
SrsPacket *pkt_raw = NULL;
SrsRtmpCommand *pkt_raw = NULL;
if ((err = rtmp->decode_message(msg.get(), &pkt_raw)) != srs_success) {
return srs_error_wrap(err, "rtmp: decode message");
}
SrsUniquePtr<SrsPacket> pkt(pkt_raw);
SrsUniquePtr<SrsRtmpCommand> pkt(pkt_raw);
// for jwplayer/flowplayer, which send close as pause message.
SrsCloseStreamPacket *close = dynamic_cast<SrsCloseStreamPacket *>(pkt.get());

View File

@ -31,13 +31,13 @@ class SrsHttpHooks;
class SrsBandwidth;
class SrsKbps;
class SrsRtmpClient;
class SrsSharedPtrMessage;
class SrsMediaPacket;
class SrsQueueRecvThread;
class SrsPublishRecvThread;
class SrsSecurity;
class ISrsWakable;
class SrsCommonMessage;
class SrsPacket;
class SrsRtmpCommand;
class SrsNetworkDelta;
class SrsSslConnection;

View File

@ -692,7 +692,7 @@ void SrsRtspRtpBuilder::on_unpublish()
meta->update_previous_ash();
}
srs_error_t SrsRtspRtpBuilder::on_frame(SrsSharedPtrMessage *frame)
srs_error_t SrsRtspRtpBuilder::on_frame(SrsMediaPacket *frame)
{
if (frame->is_audio()) {
return on_audio(frame);
@ -702,7 +702,7 @@ srs_error_t SrsRtspRtpBuilder::on_frame(SrsSharedPtrMessage *frame)
return srs_success;
}
srs_error_t SrsRtspRtpBuilder::on_audio(SrsSharedPtrMessage *msg)
srs_error_t SrsRtspRtpBuilder::on_audio(SrsMediaPacket *msg)
{
srs_error_t err = srs_success;
@ -753,7 +753,7 @@ srs_error_t SrsRtspRtpBuilder::on_audio(SrsSharedPtrMessage *msg)
return err;
}
srs_error_t SrsRtspRtpBuilder::package_aac(SrsAudioFrame *audio, SrsRtpPacket *pkt)
srs_error_t SrsRtspRtpBuilder::package_aac(SrsParsedAudioPacket *audio, SrsRtpPacket *pkt)
{
srs_error_t err = srs_success;
@ -827,7 +827,7 @@ static void free_packets(vector<SrsRtpPacket *> *pkts)
pkts->clear();
}
srs_error_t SrsRtspRtpBuilder::on_video(SrsSharedPtrMessage *msg)
srs_error_t SrsRtspRtpBuilder::on_video(SrsMediaPacket *msg)
{
srs_error_t err = srs_success;
@ -862,7 +862,7 @@ srs_error_t SrsRtspRtpBuilder::on_video(SrsSharedPtrMessage *msg)
}
bool has_idr = false;
vector<SrsSample *> samples;
vector<SrsNaluSample *> samples;
if ((err = filter(msg, format, has_idr, samples)) != srs_success) {
return srs_error_wrap(err, "filter video");
}
@ -888,7 +888,7 @@ srs_error_t SrsRtspRtpBuilder::on_video(SrsSharedPtrMessage *msg)
// By default, we package each NALU(sample) to a RTP or FUA packet.
for (int i = 0; i < nn_samples; i++) {
SrsSample *sample = samples[i];
SrsNaluSample *sample = samples[i];
if (sample->size <= kRtpMaxPayloadSize) {
if ((err = package_single_nalu(msg, sample, pkts)) != srs_success) {
@ -908,7 +908,7 @@ srs_error_t SrsRtspRtpBuilder::on_video(SrsSharedPtrMessage *msg)
return consume_packets(pkts);
}
srs_error_t SrsRtspRtpBuilder::filter(SrsSharedPtrMessage *msg, SrsFormat *format, bool &has_idr, vector<SrsSample *> &samples)
srs_error_t SrsRtspRtpBuilder::filter(SrsMediaPacket *msg, SrsFormat *format, bool &has_idr, vector<SrsNaluSample *> &samples)
{
srs_error_t err = srs_success;
@ -919,14 +919,14 @@ srs_error_t SrsRtspRtpBuilder::filter(SrsSharedPtrMessage *msg, SrsFormat *forma
// Update samples to shared frame.
for (int i = 0; i < format->video->nb_samples; ++i) {
SrsSample *sample = &format->video->samples[i];
SrsNaluSample *sample = &format->video->samples[i];
samples.push_back(sample);
}
return err;
}
srs_error_t SrsRtspRtpBuilder::package_stap_a(SrsSharedPtrMessage *msg, SrsRtpPacket *pkt)
srs_error_t SrsRtspRtpBuilder::package_stap_a(SrsMediaPacket *msg, SrsRtpPacket *pkt)
{
srs_error_t err = srs_success;
@ -938,7 +938,7 @@ srs_error_t SrsRtspRtpBuilder::package_stap_a(SrsSharedPtrMessage *msg, SrsRtpPa
return video_builder_->package_stap_a(msg, pkt);
}
srs_error_t SrsRtspRtpBuilder::package_nalus(SrsSharedPtrMessage *msg, const vector<SrsSample *> &samples, vector<SrsRtpPacket *> &pkts)
srs_error_t SrsRtspRtpBuilder::package_nalus(SrsMediaPacket *msg, const vector<SrsNaluSample *> &samples, vector<SrsRtpPacket *> &pkts)
{
srs_error_t err = srs_success;
@ -951,12 +951,12 @@ srs_error_t SrsRtspRtpBuilder::package_nalus(SrsSharedPtrMessage *msg, const vec
}
// Single NAL Unit Packet @see https://tools.ietf.org/html/rfc6184#section-5.6
srs_error_t SrsRtspRtpBuilder::package_single_nalu(SrsSharedPtrMessage *msg, SrsSample *sample, vector<SrsRtpPacket *> &pkts)
srs_error_t SrsRtspRtpBuilder::package_single_nalu(SrsMediaPacket *msg, SrsNaluSample *sample, vector<SrsRtpPacket *> &pkts)
{
return video_builder_->package_single_nalu(msg, sample, pkts);
}
srs_error_t SrsRtspRtpBuilder::package_fu_a(SrsSharedPtrMessage *msg, SrsSample *sample, int fu_payload_size, vector<SrsRtpPacket *> &pkts)
srs_error_t SrsRtspRtpBuilder::package_fu_a(SrsMediaPacket *msg, SrsNaluSample *sample, int fu_payload_size, vector<SrsRtpPacket *> &pkts)
{
srs_error_t err = srs_success;

View File

@ -223,23 +223,23 @@ public:
virtual srs_error_t initialize(ISrsRequest *r);
virtual srs_error_t on_publish();
virtual void on_unpublish();
virtual srs_error_t on_frame(SrsSharedPtrMessage *frame);
virtual srs_error_t on_frame(SrsMediaPacket *frame);
private:
virtual srs_error_t on_audio(SrsSharedPtrMessage *msg);
virtual srs_error_t on_audio(SrsMediaPacket *msg);
private:
srs_error_t package_aac(SrsAudioFrame *audio, SrsRtpPacket *pkt);
srs_error_t package_aac(SrsParsedAudioPacket *audio, SrsRtpPacket *pkt);
private:
virtual srs_error_t on_video(SrsSharedPtrMessage *msg);
virtual srs_error_t on_video(SrsMediaPacket *msg);
private:
srs_error_t filter(SrsSharedPtrMessage *msg, SrsFormat *format, bool &has_idr, std::vector<SrsSample *> &samples);
srs_error_t package_stap_a(SrsSharedPtrMessage *msg, SrsRtpPacket *pkt);
srs_error_t package_nalus(SrsSharedPtrMessage *msg, const std::vector<SrsSample *> &samples, std::vector<SrsRtpPacket *> &pkts);
srs_error_t package_single_nalu(SrsSharedPtrMessage *msg, SrsSample *sample, std::vector<SrsRtpPacket *> &pkts);
srs_error_t package_fu_a(SrsSharedPtrMessage *msg, SrsSample *sample, int fu_payload_size, std::vector<SrsRtpPacket *> &pkts);
srs_error_t filter(SrsMediaPacket *msg, SrsFormat *format, bool &has_idr, std::vector<SrsNaluSample *> &samples);
srs_error_t package_stap_a(SrsMediaPacket *msg, SrsRtpPacket *pkt);
srs_error_t package_nalus(SrsMediaPacket *msg, const std::vector<SrsNaluSample *> &samples, std::vector<SrsRtpPacket *> &pkts);
srs_error_t package_single_nalu(SrsMediaPacket *msg, SrsNaluSample *sample, std::vector<SrsRtpPacket *> &pkts);
srs_error_t package_fu_a(SrsMediaPacket *msg, SrsNaluSample *sample, int fu_payload_size, std::vector<SrsRtpPacket *> &pkts);
srs_error_t consume_packets(std::vector<SrsRtpPacket *> &pkts);
};

View File

@ -70,7 +70,7 @@ SrsRtmpJitter::~SrsRtmpJitter()
{
}
srs_error_t SrsRtmpJitter::correct(SrsSharedPtrMessage *msg, SrsRtmpJitterAlgorithm ag)
srs_error_t SrsRtmpJitter::correct(SrsMediaPacket *msg, SrsRtmpJitterAlgorithm ag)
{
srs_error_t err = srs_success;
@ -140,7 +140,7 @@ SrsFastVector::SrsFastVector()
{
count = 0;
nb_msgs = 8;
msgs = new SrsSharedPtrMessage *[nb_msgs];
msgs = new SrsMediaPacket *[nb_msgs];
}
SrsFastVector::~SrsFastVector()
@ -164,12 +164,12 @@ int SrsFastVector::end()
return count;
}
SrsSharedPtrMessage **SrsFastVector::data()
SrsMediaPacket **SrsFastVector::data()
{
return msgs;
}
SrsSharedPtrMessage *SrsFastVector::at(int index)
SrsMediaPacket *SrsFastVector::at(int index)
{
srs_assert(index < count);
return msgs[index];
@ -193,13 +193,13 @@ void SrsFastVector::erase(int _begin, int _end)
count -= _end - _begin;
}
void SrsFastVector::push_back(SrsSharedPtrMessage *msg)
void SrsFastVector::push_back(SrsMediaPacket *msg)
{
// increase vector.
if (count >= nb_msgs) {
int size = srs_max(SRS_PERF_MW_MSGS * 8, nb_msgs * 2);
SrsSharedPtrMessage **buf = msgs;
msgs = new SrsSharedPtrMessage *[size];
SrsMediaPacket **buf = msgs;
msgs = new SrsMediaPacket *[size];
for (int i = 0; i < nb_msgs; i++) {
msgs[i] = buf[i];
}
@ -216,7 +216,7 @@ void SrsFastVector::push_back(SrsSharedPtrMessage *msg)
void SrsFastVector::free()
{
for (int i = 0; i < count; i++) {
SrsSharedPtrMessage *msg = msgs[i];
SrsMediaPacket *msg = msgs[i];
srs_freep(msg);
}
count = 0;
@ -250,7 +250,7 @@ void SrsMessageQueue::set_queue_size(srs_utime_t queue_size)
max_queue_size = queue_size;
}
srs_error_t SrsMessageQueue::enqueue(SrsSharedPtrMessage *msg, bool *is_overflow)
srs_error_t SrsMessageQueue::enqueue(SrsMediaPacket *msg, bool *is_overflow)
{
srs_error_t err = srs_success;
@ -283,7 +283,7 @@ srs_error_t SrsMessageQueue::enqueue(SrsSharedPtrMessage *msg, bool *is_overflow
return err;
}
srs_error_t SrsMessageQueue::dump_packets(int max_count, SrsSharedPtrMessage **pmsgs, int &count)
srs_error_t SrsMessageQueue::dump_packets(int max_count, SrsMediaPacket **pmsgs, int &count)
{
srs_error_t err = srs_success;
@ -295,10 +295,10 @@ srs_error_t SrsMessageQueue::dump_packets(int max_count, SrsSharedPtrMessage **p
srs_assert(max_count > 0);
count = srs_min(max_count, nb_msgs);
SrsSharedPtrMessage **omsgs = msgs.data();
memcpy(pmsgs, omsgs, count * sizeof(SrsSharedPtrMessage *));
SrsMediaPacket **omsgs = msgs.data();
memcpy(pmsgs, omsgs, count * sizeof(SrsMediaPacket *));
SrsSharedPtrMessage *last = omsgs[count - 1];
SrsMediaPacket *last = omsgs[count - 1];
av_start_time = srs_utime_t(last->timestamp * SRS_UTIME_MILLISECONDS);
if (count >= nb_msgs) {
@ -324,9 +324,9 @@ srs_error_t SrsMessageQueue::dump_packets(SrsLiveConsumer *consumer, bool atc, S
return err;
}
SrsSharedPtrMessage **omsgs = msgs.data();
SrsMediaPacket **omsgs = msgs.data();
for (int i = 0; i < nb_msgs; i++) {
SrsSharedPtrMessage *msg = omsgs[i];
SrsMediaPacket *msg = omsgs[i];
if ((err = consumer->enqueue(msg, atc, ag)) != srs_success) {
return srs_error_wrap(err, "consume message");
}
@ -337,13 +337,13 @@ srs_error_t SrsMessageQueue::dump_packets(SrsLiveConsumer *consumer, bool atc, S
void SrsMessageQueue::shrink()
{
SrsSharedPtrMessage *video_sh = NULL;
SrsSharedPtrMessage *audio_sh = NULL;
SrsMediaPacket *video_sh = NULL;
SrsMediaPacket *audio_sh = NULL;
int msgs_size = (int)msgs.size();
// Remove all msgs, mark the sequence headers.
for (int i = 0; i < (int)msgs.size(); i++) {
SrsSharedPtrMessage *msg = msgs.at(i);
SrsMediaPacket *msg = msgs.at(i);
if (msg->is_video() && SrsFlvVideo::sh(msg->payload(), msg->size())) {
srs_freep(video_sh);
@ -380,10 +380,10 @@ void SrsMessageQueue::shrink()
void SrsMessageQueue::clear()
{
#ifndef SRS_PERF_QUEUE_FAST_VECTOR
std::vector<SrsSharedPtrMessage *>::iterator it;
std::vector<SrsMediaPacket *>::iterator it;
for (it = msgs.begin(); it != msgs.end(); ++it) {
SrsSharedPtrMessage *msg = *it;
SrsMediaPacket *msg = *it;
srs_freep(msg);
}
#else
@ -445,11 +445,11 @@ int64_t SrsLiveConsumer::get_time()
return jitter->get_time();
}
srs_error_t SrsLiveConsumer::enqueue(SrsSharedPtrMessage *shared_msg, bool atc, SrsRtmpJitterAlgorithm ag)
srs_error_t SrsLiveConsumer::enqueue(SrsMediaPacket *shared_msg, bool atc, SrsRtmpJitterAlgorithm ag)
{
srs_error_t err = srs_success;
SrsSharedPtrMessage *msg = shared_msg->copy();
SrsMediaPacket *msg = shared_msg->copy();
if (!atc) {
if ((err = jitter->correct(msg, ag)) != srs_success) {
@ -606,7 +606,7 @@ bool SrsGopCache::enabled()
return enable_gop_cache;
}
srs_error_t SrsGopCache::cache(SrsSharedPtrMessage *shared_msg)
srs_error_t SrsGopCache::cache(SrsMediaPacket *shared_msg)
{
srs_error_t err = srs_success;
@ -615,7 +615,7 @@ srs_error_t SrsGopCache::cache(SrsSharedPtrMessage *shared_msg)
}
// the gop cache know when to gop it.
SrsSharedPtrMessage *msg = shared_msg;
SrsMediaPacket *msg = shared_msg;
// got video, update the video count if acceptable
if (msg->is_video()) {
@ -669,9 +669,9 @@ srs_error_t SrsGopCache::cache(SrsSharedPtrMessage *shared_msg)
void SrsGopCache::clear()
{
std::vector<SrsSharedPtrMessage *>::iterator it;
std::vector<SrsMediaPacket *>::iterator it;
for (it = gop_cache.begin(); it != gop_cache.end(); ++it) {
SrsSharedPtrMessage *msg = *it;
SrsMediaPacket *msg = *it;
srs_freep(msg);
}
gop_cache.clear();
@ -684,9 +684,9 @@ srs_error_t SrsGopCache::dump(SrsLiveConsumer *consumer, bool atc, SrsRtmpJitter
{
srs_error_t err = srs_success;
std::vector<SrsSharedPtrMessage *>::iterator it;
std::vector<SrsMediaPacket *>::iterator it;
for (it = gop_cache.begin(); it != gop_cache.end(); ++it) {
SrsSharedPtrMessage *msg = *it;
SrsMediaPacket *msg = *it;
if ((err = consumer->enqueue(msg, atc, jitter_algorithm)) != srs_success) {
return srs_error_wrap(err, "enqueue message");
}
@ -707,7 +707,7 @@ srs_utime_t SrsGopCache::start_time()
return 0;
}
SrsSharedPtrMessage *msg = gop_cache[0];
SrsMediaPacket *msg = gop_cache[0];
srs_assert(msg);
return srs_utime_t(msg->timestamp * SRS_UTIME_MILLISECONDS);
@ -727,7 +727,7 @@ ISrsLiveSourceHandler::~ISrsLiveSourceHandler()
}
// TODO: FIXME: Remove it?
bool srs_hls_can_continue(int ret, SrsSharedPtrMessage *sh, SrsSharedPtrMessage *msg)
bool srs_hls_can_continue(int ret, SrsMediaPacket *sh, SrsMediaPacket *msg)
{
// only continue for decode error.
if (ret != ERROR_HLS_DECODE_ERROR) {
@ -758,9 +758,9 @@ SrsMixQueue::~SrsMixQueue()
void SrsMixQueue::clear()
{
std::multimap<int64_t, SrsSharedPtrMessage *>::iterator it;
std::multimap<int64_t, SrsMediaPacket *>::iterator it;
for (it = msgs.begin(); it != msgs.end(); ++it) {
SrsSharedPtrMessage *msg = it->second;
SrsMediaPacket *msg = it->second;
srs_freep(msg);
}
msgs.clear();
@ -769,7 +769,7 @@ void SrsMixQueue::clear()
nb_audios = 0;
}
void SrsMixQueue::push(SrsSharedPtrMessage *msg)
void SrsMixQueue::push(SrsMediaPacket *msg)
{
msgs.insert(std::make_pair(msg->timestamp, msg));
@ -780,7 +780,7 @@ void SrsMixQueue::push(SrsSharedPtrMessage *msg)
}
}
SrsSharedPtrMessage *SrsMixQueue::pop()
SrsMediaPacket *SrsMixQueue::pop()
{
bool mix_ok = false;
@ -804,8 +804,8 @@ SrsSharedPtrMessage *SrsMixQueue::pop()
}
// pop the first msg.
std::multimap<int64_t, SrsSharedPtrMessage *>::iterator it = msgs.begin();
SrsSharedPtrMessage *msg = it->second;
std::multimap<int64_t, SrsMediaPacket *>::iterator it = msgs.begin();
SrsMediaPacket *msg = it->second;
msgs.erase(it);
if (msg->is_video()) {
@ -920,7 +920,7 @@ srs_utime_t SrsOriginHub::cleanup_delay()
return srs_max(hls_delay, dash_delay);
}
srs_error_t SrsOriginHub::on_meta_data(SrsSharedPtrMessage *shared_metadata, SrsOnMetaDataPacket *packet)
srs_error_t SrsOriginHub::on_meta_data(SrsMediaPacket *shared_metadata, SrsOnMetaDataPacket *packet)
{
srs_error_t err = srs_success;
@ -942,11 +942,11 @@ srs_error_t SrsOriginHub::on_meta_data(SrsSharedPtrMessage *shared_metadata, Srs
return err;
}
srs_error_t SrsOriginHub::on_audio(SrsSharedPtrMessage *shared_audio)
srs_error_t SrsOriginHub::on_audio(SrsMediaPacket *shared_audio)
{
srs_error_t err = srs_success;
SrsSharedPtrMessage *msg = shared_audio;
SrsMediaPacket *msg = shared_audio;
SrsRtmpFormat *format = source_->format_;
// Handle the metadata when got sequence header.
@ -1028,11 +1028,11 @@ srs_error_t SrsOriginHub::on_audio(SrsSharedPtrMessage *shared_audio)
return err;
}
srs_error_t SrsOriginHub::on_video(SrsSharedPtrMessage *shared_video, bool is_sequence_header)
srs_error_t SrsOriginHub::on_video(SrsMediaPacket *shared_video, bool is_sequence_header)
{
srs_error_t err = srs_success;
SrsSharedPtrMessage *msg = shared_video;
SrsMediaPacket *msg = shared_video;
SrsRtmpFormat *format = source_->format_;
// cache the sequence header if h264
@ -1186,9 +1186,9 @@ srs_error_t SrsOriginHub::on_forwarder_start(SrsForwarder *forwarder)
{
srs_error_t err = srs_success;
SrsSharedPtrMessage *cache_metadata = source_->meta->data();
SrsSharedPtrMessage *cache_sh_video = source_->meta->vsh();
SrsSharedPtrMessage *cache_sh_audio = source_->meta->ash();
SrsMediaPacket *cache_metadata = source_->meta->data();
SrsMediaPacket *cache_sh_video = source_->meta->vsh();
SrsMediaPacket *cache_sh_audio = source_->meta->ash();
// feed the forwarder the metadata/sequence header,
// when reload to enable the forwarder.
@ -1209,9 +1209,9 @@ srs_error_t SrsOriginHub::on_dvr_request_sh()
{
srs_error_t err = srs_success;
SrsSharedPtrMessage *cache_metadata = source_->meta->data();
SrsSharedPtrMessage *cache_sh_video = source_->meta->vsh();
SrsSharedPtrMessage *cache_sh_audio = source_->meta->ash();
SrsMediaPacket *cache_metadata = source_->meta->data();
SrsMediaPacket *cache_sh_video = source_->meta->vsh();
SrsMediaPacket *cache_sh_audio = source_->meta->ash();
// feed the dvr the metadata/sequence header,
// when reload to start dvr, dvr will never get the sequence header in stream,
@ -1239,14 +1239,14 @@ srs_error_t SrsOriginHub::on_hls_request_sh()
{
srs_error_t err = srs_success;
SrsSharedPtrMessage *cache_sh_video = source_->meta->vsh();
SrsMediaPacket *cache_sh_video = source_->meta->vsh();
if (cache_sh_video) {
if ((err = hls->on_video(cache_sh_video, source_->meta->vsh_format())) != srs_success) {
return srs_error_wrap(err, "hls video");
}
}
SrsSharedPtrMessage *cache_sh_audio = source_->meta->ash();
SrsMediaPacket *cache_sh_audio = source_->meta->ash();
if (cache_sh_audio) {
if ((err = hls->on_audio(cache_sh_audio, source_->meta->ash_format())) != srs_success) {
return srs_error_wrap(err, "hls audio");
@ -1399,12 +1399,12 @@ void SrsMetaCache::clear()
srs_freep(audio);
}
SrsSharedPtrMessage *SrsMetaCache::data()
SrsMediaPacket *SrsMetaCache::data()
{
return meta;
}
SrsSharedPtrMessage *SrsMetaCache::vsh()
SrsMediaPacket *SrsMetaCache::vsh()
{
return video;
}
@ -1414,7 +1414,7 @@ SrsFormat *SrsMetaCache::vsh_format()
return vformat;
}
SrsSharedPtrMessage *SrsMetaCache::ash()
SrsMediaPacket *SrsMetaCache::ash()
{
return audio;
}
@ -1448,12 +1448,12 @@ srs_error_t SrsMetaCache::dumps(SrsLiveConsumer *consumer, bool atc, SrsRtmpJitt
return err;
}
SrsSharedPtrMessage *SrsMetaCache::previous_vsh()
SrsMediaPacket *SrsMetaCache::previous_vsh()
{
return previous_video;
}
SrsSharedPtrMessage *SrsMetaCache::previous_ash()
SrsMediaPacket *SrsMetaCache::previous_ash()
{
return previous_audio;
}
@ -1520,19 +1520,21 @@ srs_error_t SrsMetaCache::update_data(SrsMessageHeader *header, SrsOnMetaDataPac
// create a shared ptr message.
srs_freep(meta);
meta = new SrsSharedPtrMessage();
meta = new SrsMediaPacket();
updated = true;
// dump message to shared ptr message.
// the payload/size managed by cache_metadata, user should not free it.
if ((err = meta->create(header, payload, size)) != srs_success) {
SrsCommonMessage common_msg;
if ((err = common_msg.create(header, payload, size)) != srs_success) {
return srs_error_wrap(err, "create metadata");
}
common_msg.to_msg(meta);
return err;
}
srs_error_t SrsMetaCache::update_ash(SrsSharedPtrMessage *msg)
srs_error_t SrsMetaCache::update_ash(SrsMediaPacket *msg)
{
srs_freep(audio);
audio = msg->copy();
@ -1540,7 +1542,7 @@ srs_error_t SrsMetaCache::update_ash(SrsSharedPtrMessage *msg)
return aformat->on_audio(msg);
}
srs_error_t SrsMetaCache::update_vsh(SrsSharedPtrMessage *msg)
srs_error_t SrsMetaCache::update_vsh(SrsMediaPacket *msg)
{
srs_freep(video);
video = msg->copy();
@ -1962,7 +1964,6 @@ srs_error_t SrsLiveSource::on_meta_data(SrsCommonMessage *msg, SrsOnMetaDataPack
srs_error_t SrsLiveSource::on_audio(SrsCommonMessage *shared_audio)
{
srs_error_t err = srs_success;
// Detect where stream is monotonically increasing.
if (!mix_correct && is_monotonically_increase) {
@ -1976,15 +1977,13 @@ srs_error_t SrsLiveSource::on_audio(SrsCommonMessage *shared_audio)
// convert shared_audio to msg, user should not use shared_audio again.
// the payload is transfer to msg, and set to NULL in shared_audio.
SrsSharedPtrMessage msg;
if ((err = msg.create(shared_audio)) != srs_success) {
return srs_error_wrap(err, "create message");
}
SrsMediaPacket msg;
shared_audio->to_msg(&msg);
return on_frame(&msg);
}
srs_error_t SrsLiveSource::on_frame(SrsSharedPtrMessage *msg)
srs_error_t SrsLiveSource::on_frame(SrsMediaPacket *msg)
{
srs_error_t err = srs_success;
@ -2001,7 +2000,7 @@ srs_error_t SrsLiveSource::on_frame(SrsSharedPtrMessage *msg)
mix_queue->push(msg->copy());
// fetch someone from mix queue.
SrsSharedPtrMessage *m = mix_queue->pop();
SrsMediaPacket *m = mix_queue->pop();
if (!m) {
return err;
}
@ -2017,7 +2016,7 @@ srs_error_t SrsLiveSource::on_frame(SrsSharedPtrMessage *msg)
return err;
}
srs_error_t SrsLiveSource::on_audio_imp(SrsSharedPtrMessage *msg)
srs_error_t SrsLiveSource::on_audio_imp(SrsMediaPacket *msg)
{
srs_error_t err = srs_success;
@ -2122,15 +2121,13 @@ srs_error_t SrsLiveSource::on_video(SrsCommonMessage *shared_video)
// convert shared_video to msg, user should not use shared_video again.
// the payload is transfer to msg, and set to NULL in shared_video.
SrsSharedPtrMessage msg;
if ((err = msg.create(shared_video)) != srs_success) {
return srs_error_wrap(err, "create message");
}
SrsMediaPacket msg;
shared_video->to_msg(&msg);
return on_frame(&msg);
}
srs_error_t SrsLiveSource::on_video_imp(SrsSharedPtrMessage *msg)
srs_error_t SrsLiveSource::on_video_imp(SrsMediaPacket *msg)
{
srs_error_t err = srs_success;
@ -2271,7 +2268,6 @@ srs_error_t SrsLiveSource::on_aggregate(SrsCommonMessage *msg)
o.header.timestamp_delta = timestamp;
o.header.timestamp = timestamp;
o.header.stream_id = stream_id;
o.header.prefer_cid = msg->header.prefer_cid;
if (data_size > 0) {
o.create_payload(data_size);

View File

@ -29,7 +29,7 @@ class SrsPublishEdge;
class SrsLiveSource;
class SrsCommonMessage;
class SrsOnMetaDataPacket;
class SrsSharedPtrMessage;
class SrsMediaPacket;
class SrsForwarder;
class ISrsRequest;
class SrsStSocket;
@ -73,7 +73,7 @@ public:
public:
// detect the time jitter and correct it.
// @param ag the algorithm to use for time jitter.
virtual srs_error_t correct(SrsSharedPtrMessage *msg, SrsRtmpJitterAlgorithm ag);
virtual srs_error_t correct(SrsMediaPacket *msg, SrsRtmpJitterAlgorithm ag);
// Get current client time, the last packet time.
virtual int64_t get_time();
};
@ -83,7 +83,7 @@ public:
class SrsFastVector
{
private:
SrsSharedPtrMessage **msgs;
SrsMediaPacket **msgs;
int nb_msgs;
int count;
@ -95,11 +95,11 @@ public:
virtual int size();
virtual int begin();
virtual int end();
virtual SrsSharedPtrMessage **data();
virtual SrsSharedPtrMessage *at(int index);
virtual SrsMediaPacket **data();
virtual SrsMediaPacket *at(int index);
virtual void clear();
virtual void erase(int _begin, int _end);
virtual void push_back(SrsSharedPtrMessage *msg);
virtual void push_back(SrsMediaPacket *msg);
virtual void free();
};
#endif
@ -121,7 +121,7 @@ private:
#ifdef SRS_PERF_QUEUE_FAST_VECTOR
SrsFastVector msgs;
#else
std::vector<SrsSharedPtrMessage *> msgs;
std::vector<SrsMediaPacket *> msgs;
#endif
public:
SrsMessageQueue(bool ignore_shrink = false);
@ -140,12 +140,12 @@ public:
// Enqueue the message, the timestamp always monotonically.
// @param msg, the msg to enqueue, user never free it whatever the return code.
// @param is_overflow, whether overflow and shrinked. NULL to ignore.
virtual srs_error_t enqueue(SrsSharedPtrMessage *msg, bool *is_overflow = NULL);
virtual srs_error_t enqueue(SrsMediaPacket *msg, bool *is_overflow = NULL);
// Get packets in consumer queue.
// @pmsgs SrsSharedPtrMessage*[], used to store the msgs, user must alloc it.
// @pmsgs SrsMediaPacket*[], used to store the msgs, user must alloc it.
// @count the count in array, output param.
// @max_count the max count to dequeue, must be positive.
virtual srs_error_t dump_packets(int max_count, SrsSharedPtrMessage **pmsgs, int &count);
virtual srs_error_t dump_packets(int max_count, SrsMediaPacket **pmsgs, int &count);
// Dumps packets to consumer, use specified args.
// @remark the atc/tba/tbv/ag are same to SrsLiveConsumer.enqueue().
virtual srs_error_t dump_packets(SrsLiveConsumer *consumer, bool atc, SrsRtmpJitterAlgorithm ag);
@ -212,7 +212,7 @@ public:
// @param shared_msg, directly ptr, copy it if need to save it.
// @param whether atc, donot use jitter correct if true.
// @param ag the algorithm of time jitter.
virtual srs_error_t enqueue(SrsSharedPtrMessage *shared_msg, bool atc, SrsRtmpJitterAlgorithm ag);
virtual srs_error_t enqueue(SrsMediaPacket *shared_msg, bool atc, SrsRtmpJitterAlgorithm ag);
// Get packets in consumer queue.
// @param msgs the msgs array to dump packets to send.
// @param count the count in array, intput and output param.
@ -262,7 +262,7 @@ private:
// @see: https://github.com/ossrs/srs/issues/124
int audio_after_last_video_count;
// cached gop.
std::vector<SrsSharedPtrMessage *> gop_cache;
std::vector<SrsMediaPacket *> gop_cache;
public:
SrsGopCache();
@ -279,7 +279,7 @@ public:
// 1. cache the gop when got h264 video packet.
// 2. clear gop when got keyframe.
// @param shared_msg, directly ptr, copy it if need to save it.
virtual srs_error_t cache(SrsSharedPtrMessage *shared_msg);
virtual srs_error_t cache(SrsMediaPacket *shared_msg);
// clear the gop cache.
virtual void clear();
// dump the cached gop to consumer.
@ -317,7 +317,7 @@ class SrsMixQueue
private:
uint32_t nb_videos;
uint32_t nb_audios;
std::multimap<int64_t, SrsSharedPtrMessage *> msgs;
std::multimap<int64_t, SrsMediaPacket *> msgs;
public:
SrsMixQueue();
@ -325,8 +325,8 @@ public:
public:
virtual void clear();
virtual void push(SrsSharedPtrMessage *msg);
virtual SrsSharedPtrMessage *pop();
virtual void push(SrsMediaPacket *msg);
virtual SrsMediaPacket *pop();
};
// The hub for origin is a collection of utilities for origin only,
@ -381,11 +381,11 @@ public:
public:
// When got a parsed metadata.
virtual srs_error_t on_meta_data(SrsSharedPtrMessage *shared_metadata, SrsOnMetaDataPacket *packet);
virtual srs_error_t on_meta_data(SrsMediaPacket *shared_metadata, SrsOnMetaDataPacket *packet);
// When got a parsed audio packet.
virtual srs_error_t on_audio(SrsSharedPtrMessage *shared_audio);
virtual srs_error_t on_audio(SrsMediaPacket *shared_audio);
// When got a parsed video packet.
virtual srs_error_t on_video(SrsSharedPtrMessage *shared_video, bool is_sequence_header);
virtual srs_error_t on_video(SrsMediaPacket *shared_video, bool is_sequence_header);
public:
// When start publish stream.
@ -413,13 +413,13 @@ class SrsMetaCache
{
private:
// The cached metadata, FLV script data tag.
SrsSharedPtrMessage *meta;
SrsMediaPacket *meta;
// The cached video sequence header, for example, sps/pps for h.264.
SrsSharedPtrMessage *video;
SrsSharedPtrMessage *previous_video;
SrsMediaPacket *video;
SrsMediaPacket *previous_video;
// The cached audio sequence header, for example, asc for aac.
SrsSharedPtrMessage *audio;
SrsSharedPtrMessage *previous_audio;
SrsMediaPacket *audio;
SrsMediaPacket *previous_audio;
// The format for sequence header.
SrsRtmpFormat *vformat;
SrsRtmpFormat *aformat;
@ -436,12 +436,12 @@ public:
public:
// Get the cached metadata.
virtual SrsSharedPtrMessage *data();
virtual SrsMediaPacket *data();
// Get the cached vsh(video sequence header).
virtual SrsSharedPtrMessage *vsh();
virtual SrsMediaPacket *vsh();
virtual SrsFormat *vsh_format();
// Get the cached ash(audio sequence header).
virtual SrsSharedPtrMessage *ash();
virtual SrsMediaPacket *ash();
virtual SrsFormat *ash_format();
// Dumps cached metadata to consumer.
// @param dm Whether dumps the metadata.
@ -450,8 +450,8 @@ public:
public:
// Previous exists sequence header.
virtual SrsSharedPtrMessage *previous_vsh();
virtual SrsSharedPtrMessage *previous_ash();
virtual SrsMediaPacket *previous_vsh();
virtual SrsMediaPacket *previous_ash();
// Update previous sequence header, drop old one, set to new sequence header.
virtual void update_previous_vsh();
virtual void update_previous_ash();
@ -460,9 +460,9 @@ public:
// Update the cached metadata by packet.
virtual srs_error_t update_data(SrsMessageHeader *header, SrsOnMetaDataPacket *metadata, bool &updated);
// Update the cached audio sequence header.
virtual srs_error_t update_ash(SrsSharedPtrMessage *msg);
virtual srs_error_t update_ash(SrsMediaPacket *msg);
// Update the cached video sequence header.
virtual srs_error_t update_vsh(SrsSharedPtrMessage *msg);
virtual srs_error_t update_vsh(SrsMediaPacket *msg);
};
// The source manager to create and refresh all stream sources.
@ -595,19 +595,19 @@ public:
virtual srs_error_t on_meta_data(SrsCommonMessage *msg, SrsOnMetaDataPacket *metadata);
public:
// TODO: FIXME: Use SrsSharedPtrMessage instead.
// TODO: FIXME: Use SrsMediaPacket instead.
virtual srs_error_t on_audio(SrsCommonMessage *audio);
srs_error_t on_frame(SrsSharedPtrMessage *msg);
srs_error_t on_frame(SrsMediaPacket *msg);
private:
virtual srs_error_t on_audio_imp(SrsSharedPtrMessage *audio);
virtual srs_error_t on_audio_imp(SrsMediaPacket *audio);
public:
// TODO: FIXME: Use SrsSharedPtrMessage instead.
// TODO: FIXME: Use SrsMediaPacket instead.
virtual srs_error_t on_video(SrsCommonMessage *video);
private:
virtual srs_error_t on_video_imp(SrsSharedPtrMessage *video);
virtual srs_error_t on_video_imp(SrsMediaPacket *video);
public:
virtual srs_error_t on_aggregate(SrsCommonMessage *msg);

View File

@ -46,7 +46,7 @@ char *SrsSrtPacket::wrap(int size)
// Create a large enough message, with under-layer buffer.
srs_freep(shared_buffer_);
shared_buffer_ = new SrsSharedPtrMessage();
shared_buffer_ = new SrsMediaPacket();
char *buf = new char[size];
shared_buffer_->wrap(buf, size);
@ -61,7 +61,7 @@ char *SrsSrtPacket::wrap(char *data, int size)
return buf;
}
char *SrsSrtPacket::wrap(SrsSharedPtrMessage *msg)
char *SrsSrtPacket::wrap(SrsMediaPacket *msg)
{
// Generally, the wrap(msg) is used for RTMP to SRT, where the msg
// is not generated by SRT.
@ -79,7 +79,7 @@ SrsSrtPacket *SrsSrtPacket::copy()
{
SrsSrtPacket *cp = new SrsSrtPacket();
cp->shared_buffer_ = shared_buffer_ ? shared_buffer_->copy2() : NULL;
cp->shared_buffer_ = shared_buffer_ ? shared_buffer_->copy() : NULL;
cp->actual_buffer_size_ = actual_buffer_size_;
return cp;
@ -507,10 +507,8 @@ srs_error_t SrsSrtFrameBuilder::check_sps_pps_change(SrsTsMessage *msg)
return srs_error_wrap(err, "create rtmp");
}
SrsSharedPtrMessage frame;
if ((err = frame.create(&rtmp)) != srs_success) {
return srs_error_wrap(err, "create frame");
}
SrsMediaPacket frame;
rtmp.to_msg(&frame);
if ((err = bridge_->on_frame(&frame)) != srs_success) {
return srs_error_wrap(err, "srt to rtmp sps/pps");
@ -567,10 +565,8 @@ srs_error_t SrsSrtFrameBuilder::on_h264_frame(SrsTsMessage *msg, vector<pair<cha
payload.write_bytes(nal, nal_size);
}
SrsSharedPtrMessage frame;
if ((err = frame.create(&rtmp)) != srs_success) {
return srs_error_wrap(err, "create frame");
}
SrsMediaPacket frame;
rtmp.to_msg(&frame);
if ((err = bridge_->on_frame(&frame)) != srs_success) {
return srs_error_wrap(err, "srt ts video to rtmp");
@ -697,10 +693,8 @@ srs_error_t SrsSrtFrameBuilder::check_vps_sps_pps_change(SrsTsMessage *msg)
return srs_error_wrap(err, "create rtmp");
}
SrsSharedPtrMessage frame;
if ((err = frame.create(&rtmp)) != srs_success) {
return srs_error_wrap(err, "create frame");
}
SrsMediaPacket frame;
rtmp.to_msg(&frame);
if ((err = bridge_->on_frame(&frame)) != srs_success) {
return srs_error_wrap(err, "srt to rtmp vps/sps/pps");
@ -764,10 +758,8 @@ srs_error_t SrsSrtFrameBuilder::on_hevc_frame(SrsTsMessage *msg, vector<pair<cha
payload.write_bytes(nal, nal_size);
}
SrsSharedPtrMessage frame;
if ((err = frame.create(&rtmp)) != srs_success) {
return srs_error_wrap(err, "create frame");
}
SrsMediaPacket frame;
rtmp.to_msg(&frame);
if ((err = bridge_->on_frame(&frame)) != srs_success) {
return srs_error_wrap(err, "srt ts hevc video to rtmp");
@ -880,10 +872,8 @@ srs_error_t SrsSrtFrameBuilder::check_audio_sh_change(SrsTsMessage *msg, uint32_
stream.write_1bytes(0);
stream.write_bytes((char *)audio_sh_.data(), audio_sh_.size());
SrsSharedPtrMessage frame;
if ((err = frame.create(&rtmp)) != srs_success) {
return srs_error_wrap(err, "create frame");
}
SrsMediaPacket frame;
rtmp.to_msg(&frame);
if ((err = bridge_->on_frame(&frame)) != srs_success) {
return srs_error_wrap(err, "srt to rtmp audio sh");
@ -910,10 +900,8 @@ srs_error_t SrsSrtFrameBuilder::on_aac_frame(SrsTsMessage *msg, uint32_t pts, ch
// Write audio frame.
stream.write_bytes(data, data_size);
SrsSharedPtrMessage frame;
if ((err = frame.create(&rtmp)) != srs_success) {
return srs_error_wrap(err, "create frame");
}
SrsMediaPacket frame;
rtmp.to_msg(&frame);
if ((err = bridge_->on_frame(&frame)) != srs_success) {
return srs_error_wrap(err, "srt to rtmp audio sh");

View File

@ -18,7 +18,7 @@
#include <srs_kernel_ts.hpp>
#include <srs_protocol_st.hpp>
class SrsSharedPtrMessage;
class SrsMediaPacket;
class ISrsRequest;
class SrsLiveSource;
class SrsSrtSource;
@ -37,7 +37,7 @@ public:
char *wrap(int size);
char *wrap(char *data, int size);
// Wrap the shared message, we copy it.
char *wrap(SrsSharedPtrMessage *msg);
char *wrap(SrsMediaPacket *msg);
// Copy the SRT packet.
virtual SrsSrtPacket *copy();
@ -46,7 +46,7 @@ public:
int size();
private:
SrsSharedPtrMessage *shared_buffer_;
SrsMediaPacket *shared_buffer_;
// The size of SRT packet or SRT payload.
int actual_buffer_size_;
};

View File

@ -60,7 +60,7 @@ void SrsFrameToRtmpBridge::on_unpublish()
source_->on_unpublish();
}
srs_error_t SrsFrameToRtmpBridge::on_frame(SrsSharedPtrMessage *frame)
srs_error_t SrsFrameToRtmpBridge::on_frame(SrsMediaPacket *frame)
{
return source_->on_frame(frame);
}
@ -120,7 +120,7 @@ void SrsFrameToRtcBridge::on_unpublish()
source_->on_unpublish();
}
srs_error_t SrsFrameToRtcBridge::on_frame(SrsSharedPtrMessage *frame)
srs_error_t SrsFrameToRtcBridge::on_frame(SrsMediaPacket *frame)
{
#ifdef SRS_FFMPEG_FIT
return rtp_builder_->on_frame(frame);
@ -178,7 +178,7 @@ void SrsFrameToRtspBridge::on_unpublish()
source_->on_unpublish();
}
srs_error_t SrsFrameToRtspBridge::on_frame(SrsSharedPtrMessage *frame)
srs_error_t SrsFrameToRtspBridge::on_frame(SrsMediaPacket *frame)
{
return rtp_builder_->on_frame(frame);
}
@ -237,7 +237,7 @@ void SrsCompositeBridge::on_unpublish()
}
}
srs_error_t SrsCompositeBridge::on_frame(SrsSharedPtrMessage *frame)
srs_error_t SrsCompositeBridge::on_frame(SrsMediaPacket *frame)
{
srs_error_t err = srs_success;

View File

@ -15,7 +15,7 @@
#include <vector>
class ISrsRequest;
class SrsSharedPtrMessage;
class SrsMediaPacket;
class SrsLiveSource;
class SrsRtcSource;
class SrsRtmpFormat;
@ -37,7 +37,7 @@ public:
public:
virtual srs_error_t initialize(ISrsRequest *r) = 0;
virtual srs_error_t on_publish() = 0;
virtual srs_error_t on_frame(SrsSharedPtrMessage *frame) = 0;
virtual srs_error_t on_frame(SrsMediaPacket *frame) = 0;
virtual void on_unpublish() = 0;
};
@ -59,7 +59,7 @@ public:
virtual void on_unpublish();
public:
virtual srs_error_t on_frame(SrsSharedPtrMessage *frame);
virtual srs_error_t on_frame(SrsMediaPacket *frame);
};
// A bridge to covert AV frame to WebRTC stream.
@ -80,7 +80,7 @@ public:
virtual srs_error_t initialize(ISrsRequest *r);
virtual srs_error_t on_publish();
virtual void on_unpublish();
virtual srs_error_t on_frame(SrsSharedPtrMessage *frame);
virtual srs_error_t on_frame(SrsMediaPacket *frame);
srs_error_t on_rtp(SrsRtpPacket *pkt);
};
@ -102,7 +102,7 @@ public:
virtual srs_error_t initialize(ISrsRequest *r);
virtual srs_error_t on_publish();
virtual void on_unpublish();
virtual srs_error_t on_frame(SrsSharedPtrMessage *frame);
virtual srs_error_t on_frame(SrsMediaPacket *frame);
srs_error_t on_rtp(SrsRtpPacket *pkt);
};
#endif
@ -124,7 +124,7 @@ public:
virtual void on_unpublish();
public:
virtual srs_error_t on_frame(SrsSharedPtrMessage *frame);
virtual srs_error_t on_frame(SrsMediaPacket *frame);
public:
SrsCompositeBridge *append(ISrsStreamBridge *bridge);

View File

@ -9,6 +9,6 @@
#define VERSION_MAJOR 7
#define VERSION_MINOR 0
#define VERSION_REVISION 73
#define VERSION_REVISION 74
#endif

File diff suppressed because it is too large Load Diff

View File

@ -12,6 +12,9 @@
#include <string>
#include <vector>
#include <srs_core_autofree.hpp>
#include <srs_kernel_buffer.hpp>
class SrsBuffer;
class SrsBitBuffer;
class SrsFormat;
@ -264,6 +267,8 @@ enum SrsFrameType {
SrsFrameTypeVideo = 9,
// 18 = script data
SrsFrameTypeScript = 18,
// 20 = command data
SrsFrameTypeCommand = 20,
};
/**
@ -1107,30 +1112,6 @@ enum SrsHevcLevel {
};
std::string srs_hevc_level2str(SrsHevcLevel level);
/**
* A sample is the unit of frame.
* It's a NALU for H.264, H.265.
* It's the whole AAC raw data for AAC.
* @remark Neither SPS/PPS or ASC is sample unit, it's codec sequence header.
*/
class SrsSample
{
public:
// The size of unit.
int size;
// The ptr of unit, user must free it.
char *bytes;
public:
SrsSample();
SrsSample(char *b, int s);
~SrsSample();
public:
// Copy sample, share the bytes pointer.
SrsSample *copy();
};
/**
* The codec is the information of encoder,
* corresponding to the sequence header of FLV,
@ -1248,183 +1229,6 @@ public:
virtual bool is_avc_codec_ok();
};
// A frame, consists of a codec and a group of samples.
// TODO: FIXME: Rename to packet to follow names of FFmpeg, which means before decoding or after decoding.
class SrsFrame
{
public:
// The DTS/PTS in milliseconds, which is TBN=1000.
int64_t dts;
// PTS = DTS + CTS.
int32_t cts;
public:
// The codec info of frame.
SrsCodecConfig *codec;
// The actual parsed number of samples.
int nb_samples;
// The sampels cache.
SrsSample samples[SrsMaxNbSamples];
public:
SrsFrame();
virtual ~SrsFrame();
public:
// Initialize the frame, to parse sampels.
virtual srs_error_t initialize(SrsCodecConfig *c);
// Add a sample to frame.
virtual srs_error_t add_sample(char *bytes, int size);
};
// A audio frame, besides a frame, contains the audio frame info, such as frame type.
// TODO: FIXME: Rename to packet to follow names of FFmpeg, which means before decoding or after decoding.
class SrsAudioFrame : public SrsFrame
{
public:
SrsAudioAacFrameTrait aac_packet_type;
public:
SrsAudioFrame();
virtual ~SrsAudioFrame();
public:
virtual SrsAudioCodecConfig *acodec();
};
// A video frame, besides a frame, contains the video frame info, such as frame type.
// TODO: FIXME: Rename to packet to follow names of FFmpeg, which means before decoding or after decoding.
class SrsVideoFrame : public SrsFrame
{
public:
// video specified
SrsVideoAvcFrameType frame_type;
SrsVideoAvcFrameTrait avc_packet_type;
// whether sample_units contains IDR frame.
bool has_idr;
// Whether exists AUD NALU.
bool has_aud;
// Whether exists SPS/PPS NALU.
bool has_sps_pps;
// The first nalu type.
SrsAvcNaluType first_nalu_type;
public:
SrsVideoFrame();
virtual ~SrsVideoFrame();
public:
// Initialize the frame, to parse sampels.
virtual srs_error_t initialize(SrsCodecConfig *c);
// Add the sample without ANNEXB or IBMF header, or RAW AAC or MP3 data.
virtual srs_error_t add_sample(char *bytes, int size);
public:
virtual SrsVideoCodecConfig *vcodec();
public:
static srs_error_t parse_avc_nalu_type(const SrsSample *sample, SrsAvcNaluType &avc_nalu_type);
static srs_error_t parse_avc_bframe(const SrsSample *sample, bool &is_b_frame);
static srs_error_t parse_hevc_nalu_type(const SrsSample *sample, SrsHevcNaluType &hevc_nalu_type);
static srs_error_t parse_hevc_bframe(const SrsSample *sample, SrsFormat *format, bool &is_b_frame);
};
/**
* A codec format, including one or many stream, each stream identified by a frame.
* For example, a typical RTMP stream format, consits of a video and audio frame.
* Maybe some RTMP stream only has a audio stream, for instance, redio application.
*/
class SrsFormat
{
public:
SrsAudioFrame *audio;
SrsAudioCodecConfig *acodec;
SrsVideoFrame *video;
SrsVideoCodecConfig *vcodec;
public:
char *raw;
int nb_raw;
public:
// for sequence header, whether parse the h.264 sps.
// TODO: FIXME: Refine it.
bool avc_parse_sps;
// Whether try to parse in ANNEXB, then by IBMF.
bool try_annexb_first;
public:
SrsFormat();
virtual ~SrsFormat();
public:
// Initialize the format.
virtual srs_error_t initialize();
// When got a parsed audio packet.
// @param data The data in FLV format.
virtual srs_error_t on_audio(int64_t timestamp, char *data, int size);
// When got a parsed video packet.
// @param data The data in FLV format.
virtual srs_error_t on_video(int64_t timestamp, char *data, int size);
// When got a audio aac sequence header.
virtual srs_error_t on_aac_sequence_header(char *data, int size);
public:
virtual bool is_aac_sequence_header();
virtual bool is_mp3_sequence_header();
// TODO: is avc|hevc|av1 sequence header
virtual bool is_avc_sequence_header();
private:
// Demux the video packet in H.264 codec.
// The packet is muxed in FLV format, defined in flv specification.
// Demux the sps/pps from sequence header.
// Demux the samples from NALUs.
virtual srs_error_t video_avc_demux(SrsBuffer *stream, int64_t timestamp);
private:
virtual srs_error_t hevc_demux_hvcc(SrsBuffer *stream);
private:
virtual srs_error_t hevc_demux_vps_sps_pps(SrsHevcHvccNalu *nal);
virtual srs_error_t hevc_demux_vps_rbsp(char *rbsp, int nb_rbsp);
virtual srs_error_t hevc_demux_sps_rbsp(char *rbsp, int nb_rbsp);
virtual srs_error_t hevc_demux_pps_rbsp(char *rbsp, int nb_rbsp);
virtual srs_error_t hevc_demux_rbsp_ptl(SrsBitBuffer *bs, SrsHevcProfileTierLevel *ptl, int profile_present_flag, int max_sub_layers_minus1);
public:
virtual srs_error_t hevc_demux_vps(SrsBuffer *stream);
virtual srs_error_t hevc_demux_sps(SrsBuffer *stream);
virtual srs_error_t hevc_demux_pps(SrsBuffer *stream);
private:
// Parse the H.264 SPS/PPS.
virtual srs_error_t avc_demux_sps_pps(SrsBuffer *stream);
virtual srs_error_t avc_demux_sps();
virtual srs_error_t avc_demux_sps_rbsp(char *rbsp, int nb_rbsp);
private:
// Parse the H.264 or H.265 NALUs.
virtual srs_error_t video_nalu_demux(SrsBuffer *stream);
// Demux the avc NALU in "AnnexB" from ISO_IEC_14496-10-AVC-2003.pdf, page 211.
virtual srs_error_t avc_demux_annexb_format(SrsBuffer *stream);
virtual srs_error_t do_avc_demux_annexb_format(SrsBuffer *stream);
// Demux the avc NALU in "ISO Base Media File Format" from ISO_IEC_14496-15-AVC-format-2012.pdf, page 20
virtual srs_error_t avc_demux_ibmf_format(SrsBuffer *stream);
virtual srs_error_t do_avc_demux_ibmf_format(SrsBuffer *stream);
private:
// Demux the audio packet in AAC codec.
// Demux the asc from sequence header.
// Demux the sampels from RAW data.
virtual srs_error_t audio_aac_demux(SrsBuffer *stream, int64_t timestamp);
virtual srs_error_t audio_mp3_demux(SrsBuffer *stream, int64_t timestamp, bool fresh);
public:
// Directly demux the sequence header, without RTMP packet header.
virtual srs_error_t audio_aac_sequence_header_demux(char *data, int size);
};
// To read H.264 NALU uev.
extern srs_error_t srs_avc_nalu_read_uev(SrsBitBuffer *stream, int32_t &v);
extern srs_error_t srs_avc_nalu_read_bit(SrsBitBuffer *stream, int8_t &v);

View File

@ -20,13 +20,48 @@ using namespace std;
#include <srs_kernel_codec.hpp>
#include <srs_kernel_error.hpp>
#include <srs_kernel_file.hpp>
#include <srs_kernel_kbps.hpp>
#include <srs_kernel_log.hpp>
#include <srs_kernel_rtc_rtp.hpp>
#include <srs_kernel_utility.hpp>
#include <srs_kernel_kbps.hpp>
int srs_rtmp_prefer_cid(SrsFrameType message_type)
{
if (message_type == SrsFrameTypeVideo) {
return RTMP_CID_Video;
} else if (message_type == SrsFrameTypeAudio) {
return RTMP_CID_Audio;
} else if (message_type == SrsFrameTypeCommand || message_type == SrsFrameTypeScript) {
return RTMP_CID_OverStream;
} else if (message_type == (SrsFrameType)RTMP_MSG_AMF0CommandMessage) {
return RTMP_CID_OverStream;
} else if (message_type == (SrsFrameType)RTMP_MSG_AMF3DataMessage) {
return RTMP_CID_OverStream;
} else {
return RTMP_CID_OverConnection;
}
}
SrsPps *_srs_pps_objs_msgs = NULL;
int srs_rtmp_write_chunk_header(SrsMediaPacket *msg, char *cache, int nb_cache, bool c0)
{
int payload_length = msg->payload_.get() ? msg->payload_->size() : 0;
int chunk_id = srs_rtmp_prefer_cid(msg->message_type);
if (c0) {
return srs_chunk_header_c0(chunk_id,
(uint32_t)msg->timestamp,
payload_length,
msg->message_type,
msg->stream_id,
cache,
nb_cache);
} else {
return srs_chunk_header_c3(chunk_id,
(uint32_t)msg->timestamp,
cache,
nb_cache);
}
}
int srs_chunk_header_c0(int prefer_cid, uint32_t timestamp, int32_t payload_length, int8_t message_type, int32_t stream_id, char *cache, int nb_cache)
{
@ -159,8 +194,6 @@ SrsMessageHeader::SrsMessageHeader()
stream_id = 0;
timestamp = 0;
// we always use the connection chunk-id
prefer_cid = RTMP_CID_OverConnection;
}
SrsMessageHeader::~SrsMessageHeader()
@ -234,9 +267,6 @@ void SrsMessageHeader::initialize_amf0_script(int size, int stream)
timestamp_delta = (int32_t)0;
timestamp = (int64_t)0;
stream_id = (int32_t)stream;
// amf0 script use connection2 chunk-id
prefer_cid = RTMP_CID_OverConnection2;
}
void SrsMessageHeader::initialize_audio(int size, uint32_t time, int stream)
@ -246,9 +276,6 @@ void SrsMessageHeader::initialize_audio(int size, uint32_t time, int stream)
timestamp_delta = (int32_t)time;
timestamp = (int64_t)time;
stream_id = (int32_t)stream;
// audio chunk-id
prefer_cid = RTMP_CID_Audio;
}
void SrsMessageHeader::initialize_video(int size, uint32_t time, int stream)
@ -258,9 +285,6 @@ void SrsMessageHeader::initialize_video(int size, uint32_t time, int stream)
timestamp_delta = (int32_t)time;
timestamp = (int64_t)time;
stream_id = (int32_t)stream;
// video chunk-id
prefer_cid = RTMP_CID_Video;
}
SrsCommonMessage::SrsCommonMessage()
@ -299,126 +323,12 @@ srs_error_t SrsCommonMessage::create(SrsMessageHeader *pheader, char *body, int
return err;
}
SrsSharedPtrMessage::SrsSharedPtrMessage() : timestamp(0), stream_id(0), message_type(0), prefer_cid(RTMP_CID_OverConnection)
void SrsCommonMessage::to_msg(SrsMediaPacket *msg)
{
payload_ = SrsSharedPtr<SrsMemoryBlock>(NULL);
++_srs_pps_objs_msgs->sugar;
}
SrsSharedPtrMessage::~SrsSharedPtrMessage()
{
// payload_ automatically cleaned up by SrsSharedPtr
}
srs_error_t SrsSharedPtrMessage::create(SrsCommonMessage *msg)
{
srs_error_t err = srs_success;
// Share the memory block from the common message
payload_ = msg->payload_;
this->timestamp = msg->header.timestamp;
this->stream_id = msg->header.stream_id;
this->message_type = msg->header.message_type;
this->prefer_cid = msg->header.prefer_cid;
return err;
}
srs_error_t SrsSharedPtrMessage::create(SrsMessageHeader *pheader, char *payload, int size)
{
srs_error_t err = srs_success;
if (size < 0) {
return srs_error_new(ERROR_RTMP_MESSAGE_CREATE, "create message size=%d", size);
}
// Create new memory block and attach the payload
payload_ = SrsSharedPtr<SrsMemoryBlock>(new SrsMemoryBlock());
payload_->attach(payload, size);
// Set header information
if (pheader) {
this->timestamp = pheader->timestamp;
this->stream_id = pheader->stream_id;
this->message_type = pheader->message_type;
this->prefer_cid = pheader->prefer_cid;
}
return err;
}
void SrsSharedPtrMessage::wrap(char *payload, int size)
{
// Create new memory block and wrap the payload
payload_ = SrsSharedPtr<SrsMemoryBlock>(new SrsMemoryBlock());
payload_->attach(payload, size);
}
bool SrsSharedPtrMessage::check(int stream_id)
{
// Ignore error when message has no payload.
if (!payload_.get()) {
return true;
}
// we assume that the stream_id in a group must be the same.
if (this->stream_id == stream_id) {
return true;
}
this->stream_id = stream_id;
return false;
}
bool SrsSharedPtrMessage::is_av()
{
return message_type == RTMP_MSG_AudioMessage || message_type == RTMP_MSG_VideoMessage;
}
bool SrsSharedPtrMessage::is_audio()
{
return message_type == RTMP_MSG_AudioMessage;
}
bool SrsSharedPtrMessage::is_video()
{
return message_type == RTMP_MSG_VideoMessage;
}
int SrsSharedPtrMessage::chunk_header(char *cache, int nb_cache, bool c0)
{
int payload_length = payload_.get() ? payload_->size() : 0;
if (c0) {
return srs_chunk_header_c0(prefer_cid, (uint32_t)timestamp,
payload_length, message_type, stream_id, cache, nb_cache);
} else {
return srs_chunk_header_c3(prefer_cid, (uint32_t)timestamp,
cache, nb_cache);
}
}
SrsSharedPtrMessage *SrsSharedPtrMessage::copy()
{
SrsSharedPtrMessage *copy = copy2();
copy->timestamp = timestamp;
copy->stream_id = stream_id;
copy->message_type = message_type;
copy->prefer_cid = prefer_cid;
return copy;
}
SrsSharedPtrMessage *SrsSharedPtrMessage::copy2()
{
SrsSharedPtrMessage *copy = new SrsSharedPtrMessage();
// Share the memory block
copy->payload_ = payload_;
return copy;
msg->payload_ = payload_;
msg->timestamp = header.timestamp;
msg->stream_id = header.stream_id;
msg->message_type = (SrsFrameType)header.message_type;
}
SrsFlvTransmuxer::SrsFlvTransmuxer()
@ -566,7 +476,7 @@ int SrsFlvTransmuxer::size_tag(int data_size)
return SRS_FLV_TAG_HEADER_SIZE + data_size + SRS_FLV_PREVIOUS_TAG_SIZE;
}
srs_error_t SrsFlvTransmuxer::write_tags(SrsSharedPtrMessage **msgs, int count)
srs_error_t SrsFlvTransmuxer::write_tags(SrsMediaPacket **msgs, int count)
{
srs_error_t err = srs_success;
@ -604,7 +514,7 @@ srs_error_t SrsFlvTransmuxer::write_tags(SrsSharedPtrMessage **msgs, int count)
iovec *iovs = iovss;
int nn_real_iovss = 0;
for (int i = 0; i < count; i++) {
SrsSharedPtrMessage *msg = msgs[i];
SrsMediaPacket *msg = msgs[i];
// Cache FLV packet header.
if (msg->is_audio()) {

View File

@ -14,6 +14,8 @@
#include <srs_core_autofree.hpp>
#include <srs_kernel_buffer.hpp>
#include <srs_kernel_codec.hpp>
#include <srs_kernel_packet.hpp>
// For srs-librtmp, @see https://github.com/ossrs/srs/issues/213
#ifndef _WIN32
@ -24,8 +26,8 @@ class SrsBuffer;
class ISrsWriter;
class ISrsReader;
class SrsFileReader;
class SrsPacket;
class SrsSample;
class SrsRtmpCommand;
class SrsNaluSample;
#define SRS_FLV_TAG_HEADER_SIZE 11
#define SRS_FLV_PREVIOUS_TAG_SIZE 4
@ -156,12 +158,6 @@ public:
// @remark, we use 64bits for large time for jitter detect and hls.
int64_t timestamp;
public:
// Get the prefered cid(chunk stream id) which sendout over.
// set at decoding, and canbe used for directly send message,
// For example, dispatch to all connections.
int prefer_cid;
public:
SrsMessageHeader();
virtual ~SrsMessageHeader();
@ -222,80 +218,9 @@ public:
// @remark user should never free the body.
// @param pheader, the header to copy to the message. NULL to ignore.
virtual srs_error_t create(SrsMessageHeader *pheader, char *body, int size);
};
// The shared ptr message.
// For audio/video/data message that need less memory copy.
// and only for output.
//
// Create first object by constructor and create(),
// use copy if need reference count message.
class SrsSharedPtrMessage
{
// 4.1. Message Header
public:
// Four-byte field that contains a timestamp of the message.
// The 4 bytes are packed in the big-endian order.
// @remark, used as calc timestamp when decode and encode time.
// @remark, we use 64bits for large time for jitter detect and hls.
int64_t timestamp;
// 4bytes.
// Four-byte field that identifies the stream of the message. These
// bytes are set in big-endian format.
int32_t stream_id;
// Message type for determining audio/video/data
int8_t message_type;
// Preferred chunk ID for RTMP chunking
int prefer_cid;
public:
// 4.2. Message Payload
SrsSharedPtr<SrsMemoryBlock> payload_;
public:
SrsSharedPtrMessage();
virtual ~SrsSharedPtrMessage();
public:
// Backward compatibility accessors
char *payload() { return payload_.get() ? payload_->payload() : NULL; }
int size() { return payload_.get() ? payload_->size() : 0; }
public:
// Create shared ptr message,
// copy header, manage the payload of msg,
// set the payload to NULL to prevent double free.
// @remark payload of msg set to NULL if success.
// @remark User should free the msg.
virtual srs_error_t create(SrsCommonMessage *msg);
// Create shared ptr message,
// from the header and payload.
// @remark user should never free the payload.
// @param pheader, the header to copy to the message. NULL to ignore.
virtual srs_error_t create(SrsMessageHeader *pheader, char *payload, int size);
// Create shared ptr message from RAW payload.
// @remark Note that the header is set to zero.
virtual void wrap(char *payload, int size);
// check prefer cid and stream id.
// @return whether stream id already set.
virtual bool check(int stream_id);
public:
virtual bool is_av();
virtual bool is_audio();
virtual bool is_video();
public:
// generate the chunk header to cache.
// @return the size of header.
virtual int chunk_header(char *cache, int nb_cache, bool c0);
public:
// copy current shared ptr message, use ref-count.
// @remark, assert object is created.
virtual SrsSharedPtrMessage *copy();
// Only copy the buffer, without header fields.
virtual SrsSharedPtrMessage *copy2();
// Convert to shared ptr message.
void to_msg(SrsMediaPacket *msg);
};
// Transmux RTMP packets to FLV stream.
@ -363,7 +288,7 @@ private:
public:
// Write the tags in a time.
virtual srs_error_t write_tags(SrsSharedPtrMessage **msgs, int count);
virtual srs_error_t write_tags(SrsMediaPacket **msgs, int count);
private:
virtual void cache_metadata(char type, char *data, int size, char *cache);
@ -439,6 +364,17 @@ public:
virtual srs_error_t seek2(int64_t offset);
};
// Get the prefer cid for message type.
extern int srs_rtmp_prefer_cid(SrsFrameType message_type);
// Generate the RTMP chunk header for shared ptr message.
// @param msg, the shared ptr message to generate header for.
// @param cache, the cache to write header.
// @param nb_cache, the size of cache.
// @param c0, whether to use c0 format (true) or c3 format (false).
// @return the size of header. 0 if cache not enough.
extern int srs_rtmp_write_chunk_header(SrsMediaPacket *msg, char *cache, int nb_cache, bool c0);
// Generate the c0 chunk header for msg.
// @param cache, the cache to write header.
// @param nb_cache, the size of cache.

View File

@ -154,6 +154,8 @@ SrsPps *_srs_pps_rrtcps = NULL;
// NACK and loss statistics (only _srs_pps_aloss2 was originally in srs_app_server.cpp)
SrsPps *_srs_pps_aloss2 = NULL;
SrsPps *_srs_pps_objs_msgs = NULL;
#if defined(SRS_DEBUG) && defined(SRS_DEBUG_STATS)
// Debug thread statistics
SrsPps *_srs_pps_thread_run = NULL;

View File

@ -167,6 +167,8 @@ extern SrsPps *_srs_pps_objs_rbuf;
extern SrsPps *_srs_pps_objs_msgs;
extern SrsPps *_srs_pps_objs_rothers;
extern SrsPps *_srs_pps_objs_msgs;
#if defined(SRS_DEBUG) && defined(SRS_DEBUG_STATS)
// Debug thread statistics
extern SrsPps *_srs_pps_thread_run;

View File

@ -12,6 +12,7 @@
#include <srs_kernel_error.hpp>
#include <srs_kernel_io.hpp>
#include <srs_kernel_log.hpp>
#include <srs_kernel_packet.hpp>
#include <srs_kernel_stream.hpp>
#include <srs_kernel_utility.hpp>

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,260 @@
//
// Copyright (c) 2013-2025 The SRS Authors
//
// SPDX-License-Identifier: MIT
//
#ifndef SRS_KERNEL_PACKET_HPP
#define SRS_KERNEL_PACKET_HPP
#include <srs_core.hpp>
#include <srs_kernel_codec.hpp>
/**
* A sample is the NAL unit of a parsed packet.
* It's a NALU for H.264, H.265.
* It's the whole AAC raw data for AAC.
* @remark Neither SPS/PPS or ASC is sample unit, it's codec sequence header.
*/
class SrsNaluSample
{
public:
// The size of unit.
int size;
// The ptr of unit, user must free it.
char *bytes;
public:
SrsNaluSample();
SrsNaluSample(char *b, int s);
~SrsNaluSample();
public:
// Copy sample, share the bytes pointer.
SrsNaluSample *copy();
};
// A media packet containing raw, undecoded media data.
// This represents a single media frame or packet with timing information
// and payload data, but without codec-specific parsing or decoding.
class SrsMediaPacket
{
public:
// Timestamp of the media packet. The timebase is defined by context.
int64_t timestamp;
// Type of the media packet (audio, video, or script).
SrsFrameType message_type;
public:
// Stream identifier for the packet. It's optional, so only used for some
// protocols, for example, RTMP.
int32_t stream_id;
public:
// Raw payload data of the media packet.
SrsSharedPtr<SrsMemoryBlock> payload_;
public:
SrsMediaPacket();
virtual ~SrsMediaPacket();
public:
// Backward compatibility accessors
char *payload() { return payload_.get() ? payload_->payload() : NULL; }
int size() { return payload_.get() ? payload_->size() : 0; }
public:
// Create shared ptr message from RAW payload.
// @remark Note that the header is set to zero.
virtual void wrap(char *payload, int size);
// check prefer cid and stream id.
// @return whether stream id already set.
virtual bool check(int stream_id);
public:
virtual bool is_av();
virtual bool is_audio();
virtual bool is_video();
public:
// copy current shared ptr message, use ref-count.
// @remark, assert object is created.
virtual SrsMediaPacket *copy();
};
// A parsed packet, consists of a codec and a group of samples.
class SrsParsedPacket
{
public:
// The DTS/PTS in milliseconds, which is TBN=1000.
int64_t dts;
// PTS = DTS + CTS.
int32_t cts;
public:
// The codec info of frame.
SrsCodecConfig *codec;
// The actual parsed number of samples.
int nb_samples;
// The sampels cache.
SrsNaluSample samples[SrsMaxNbSamples];
public:
SrsParsedPacket();
virtual ~SrsParsedPacket();
public:
// Initialize the frame, to parse sampels.
virtual srs_error_t initialize(SrsCodecConfig *c);
// Add a sample to frame.
virtual srs_error_t add_sample(char *bytes, int size);
};
// A parsed audio packet, besides a frame, contains the audio frame info, such as frame type.
class SrsParsedAudioPacket : public SrsParsedPacket
{
public:
SrsAudioAacFrameTrait aac_packet_type;
public:
SrsParsedAudioPacket();
virtual ~SrsParsedAudioPacket();
public:
virtual SrsAudioCodecConfig *acodec();
};
// A parsed video packet, besides a frame, contains the video frame info, such as frame type.
class SrsParsedVideoPacket : public SrsParsedPacket
{
public:
// video specified
SrsVideoAvcFrameType frame_type;
SrsVideoAvcFrameTrait avc_packet_type;
// whether sample_units contains IDR frame.
bool has_idr;
// Whether exists AUD NALU.
bool has_aud;
// Whether exists SPS/PPS NALU.
bool has_sps_pps;
// The first nalu type.
SrsAvcNaluType first_nalu_type;
public:
SrsParsedVideoPacket();
virtual ~SrsParsedVideoPacket();
public:
// Initialize the frame, to parse sampels.
virtual srs_error_t initialize(SrsCodecConfig *c);
// Add the sample without ANNEXB or IBMF header, or RAW AAC or MP3 data.
virtual srs_error_t add_sample(char *bytes, int size);
public:
virtual SrsVideoCodecConfig *vcodec();
public:
static srs_error_t parse_avc_nalu_type(const SrsNaluSample *sample, SrsAvcNaluType &avc_nalu_type);
static srs_error_t parse_avc_bframe(const SrsNaluSample *sample, bool &is_b_frame);
static srs_error_t parse_hevc_nalu_type(const SrsNaluSample *sample, SrsHevcNaluType &hevc_nalu_type);
static srs_error_t parse_hevc_bframe(const SrsNaluSample *sample, SrsFormat *format, bool &is_b_frame);
};
/**
* A codec format, including one or many stream, each stream identified by a frame.
* For example, a typical RTMP stream format, consits of a video and audio frame.
* Maybe some RTMP stream only has a audio stream, for instance, redio application.
*/
class SrsFormat
{
public:
SrsParsedAudioPacket *audio;
SrsAudioCodecConfig *acodec;
SrsParsedVideoPacket *video;
SrsVideoCodecConfig *vcodec;
public:
char *raw;
int nb_raw;
public:
// for sequence header, whether parse the h.264 sps.
// TODO: FIXME: Refine it.
bool avc_parse_sps;
// Whether try to parse in ANNEXB, then by IBMF.
bool try_annexb_first;
public:
SrsFormat();
virtual ~SrsFormat();
public:
// Initialize the format.
virtual srs_error_t initialize();
// When got a parsed audio packet.
// @param data The data in FLV format.
virtual srs_error_t on_audio(int64_t timestamp, char *data, int size);
// When got a parsed video packet.
// @param data The data in FLV format.
virtual srs_error_t on_video(int64_t timestamp, char *data, int size);
// When got a audio aac sequence header.
virtual srs_error_t on_aac_sequence_header(char *data, int size);
public:
virtual bool is_aac_sequence_header();
virtual bool is_mp3_sequence_header();
// TODO: is avc|hevc|av1 sequence header
virtual bool is_avc_sequence_header();
private:
// Demux the video packet in H.264 codec.
// The packet is muxed in FLV format, defined in flv specification.
// Demux the sps/pps from sequence header.
// Demux the samples from NALUs.
virtual srs_error_t video_avc_demux(SrsBuffer *stream, int64_t timestamp);
private:
virtual srs_error_t hevc_demux_hvcc(SrsBuffer *stream);
private:
virtual srs_error_t hevc_demux_vps_sps_pps(SrsHevcHvccNalu *nal);
virtual srs_error_t hevc_demux_vps_rbsp(char *rbsp, int nb_rbsp);
virtual srs_error_t hevc_demux_sps_rbsp(char *rbsp, int nb_rbsp);
virtual srs_error_t hevc_demux_pps_rbsp(char *rbsp, int nb_rbsp);
virtual srs_error_t hevc_demux_rbsp_ptl(SrsBitBuffer *bs, SrsHevcProfileTierLevel *ptl, int profile_present_flag, int max_sub_layers_minus1);
public:
virtual srs_error_t hevc_demux_vps(SrsBuffer *stream);
virtual srs_error_t hevc_demux_sps(SrsBuffer *stream);
virtual srs_error_t hevc_demux_pps(SrsBuffer *stream);
private:
// Parse the H.264 SPS/PPS.
virtual srs_error_t avc_demux_sps_pps(SrsBuffer *stream);
virtual srs_error_t avc_demux_sps();
virtual srs_error_t avc_demux_sps_rbsp(char *rbsp, int nb_rbsp);
private:
// Parse the H.264 or H.265 NALUs.
virtual srs_error_t video_nalu_demux(SrsBuffer *stream);
// Demux the avc NALU in "AnnexB" from ISO_IEC_14496-10-AVC-2003.pdf, page 211.
virtual srs_error_t avc_demux_annexb_format(SrsBuffer *stream);
virtual srs_error_t do_avc_demux_annexb_format(SrsBuffer *stream);
// Demux the avc NALU in "ISO Base Media File Format" from ISO_IEC_14496-15-AVC-format-2012.pdf, page 20
virtual srs_error_t avc_demux_ibmf_format(SrsBuffer *stream);
virtual srs_error_t do_avc_demux_ibmf_format(SrsBuffer *stream);
private:
// Demux the audio packet in AAC codec.
// Demux the asc from sequence header.
// Demux the sampels from RAW data.
virtual srs_error_t audio_aac_demux(SrsBuffer *stream, int64_t timestamp);
virtual srs_error_t audio_mp3_demux(SrsBuffer *stream, int64_t timestamp, bool fresh);
public:
// Directly demux the sequence header, without RTMP packet header.
virtual srs_error_t audio_aac_sequence_header_demux(char *data, int size);
};
#endif

View File

@ -1006,7 +1006,7 @@ SrsRtpRawPayload::SrsRtpRawPayload()
{
payload = NULL;
nn_payload = 0;
sample_ = new SrsSample();
sample_ = new SrsNaluSample();
++_srs_pps_objs_rraw->sugar;
}
@ -1077,19 +1077,19 @@ SrsRtpRawNALUs::~SrsRtpRawNALUs()
{
int nn_nalus = (int)nalus.size();
for (int i = 0; i < nn_nalus; i++) {
SrsSample *p = nalus[i];
SrsNaluSample *p = nalus[i];
srs_freep(p);
}
}
void SrsRtpRawNALUs::push_back(SrsSample *sample)
void SrsRtpRawNALUs::push_back(SrsNaluSample *sample)
{
if (sample->size <= 0) {
return;
}
if (!nalus.empty()) {
SrsSample *p = new SrsSample();
SrsNaluSample *p = new SrsNaluSample();
p->bytes = (char *)"\0\0\1";
p->size = 3;
nn_bytes += 3;
@ -1107,7 +1107,7 @@ uint8_t SrsRtpRawNALUs::skip_bytes(int count)
return uint8_t(nalus[0]->bytes[0]);
}
srs_error_t SrsRtpRawNALUs::read_samples(vector<SrsSample *> &samples, int packet_size)
srs_error_t SrsRtpRawNALUs::read_samples(vector<SrsNaluSample *> &samples, int packet_size)
{
if (cursor + packet_size < 0 || cursor + packet_size > nn_bytes) {
return srs_error_new(ERROR_RTC_RTP_MUXER, "cursor=%d, max=%d, size=%d", cursor, nn_bytes, packet_size);
@ -1119,7 +1119,7 @@ srs_error_t SrsRtpRawNALUs::read_samples(vector<SrsSample *> &samples, int packe
int nn_nalus = (int)nalus.size();
for (int i = 0; left > 0 && i < nn_nalus; i++) {
SrsSample *p = nalus[i];
SrsNaluSample *p = nalus[i];
// Ignore previous consumed samples.
if (pos && pos - p->size >= 0) {
@ -1131,7 +1131,7 @@ srs_error_t SrsRtpRawNALUs::read_samples(vector<SrsSample *> &samples, int packe
int nn = srs_min(left, p->size - pos);
srs_assert(nn > 0);
SrsSample *sample = new SrsSample();
SrsNaluSample *sample = new SrsNaluSample();
samples.push_back(sample);
sample->bytes = p->bytes + pos;
@ -1150,7 +1150,7 @@ uint64_t SrsRtpRawNALUs::nb_bytes()
int nn_nalus = (int)nalus.size();
for (int i = 0; i < nn_nalus; i++) {
SrsSample *p = nalus[i];
SrsNaluSample *p = nalus[i];
size += p->size;
}
@ -1161,7 +1161,7 @@ srs_error_t SrsRtpRawNALUs::encode(SrsBuffer *buf)
{
int nn_nalus = (int)nalus.size();
for (int i = 0; i < nn_nalus; i++) {
SrsSample *p = nalus[i];
SrsNaluSample *p = nalus[i];
if (!buf->require(p->size)) {
return srs_error_new(ERROR_RTC_RTP_MUXER, "requires %d bytes", p->size);
@ -1179,7 +1179,7 @@ srs_error_t SrsRtpRawNALUs::decode(SrsBuffer *buf)
return srs_success;
}
SrsSample *sample = new SrsSample();
SrsNaluSample *sample = new SrsNaluSample();
sample->bytes = buf->head();
sample->size = buf->left();
buf->skip(sample->size);
@ -1198,7 +1198,7 @@ ISrsRtpPayloader *SrsRtpRawNALUs::copy()
int nn_nalus = (int)nalus.size();
for (int i = 0; i < nn_nalus; i++) {
SrsSample *p = nalus[i];
SrsNaluSample *p = nalus[i];
cp->nalus.push_back(p->copy());
}
@ -1216,16 +1216,16 @@ SrsRtpSTAPPayload::~SrsRtpSTAPPayload()
{
int nn_nalus = (int)nalus.size();
for (int i = 0; i < nn_nalus; i++) {
SrsSample *p = nalus[i];
SrsNaluSample *p = nalus[i];
srs_freep(p);
}
}
SrsSample *SrsRtpSTAPPayload::get_sps()
SrsNaluSample *SrsRtpSTAPPayload::get_sps()
{
int nn_nalus = (int)nalus.size();
for (int i = 0; i < nn_nalus; i++) {
SrsSample *p = nalus[i];
SrsNaluSample *p = nalus[i];
if (!p || !p->size) {
continue;
}
@ -1239,11 +1239,11 @@ SrsSample *SrsRtpSTAPPayload::get_sps()
return NULL;
}
SrsSample *SrsRtpSTAPPayload::get_pps()
SrsNaluSample *SrsRtpSTAPPayload::get_pps()
{
int nn_nalus = (int)nalus.size();
for (int i = 0; i < nn_nalus; i++) {
SrsSample *p = nalus[i];
SrsNaluSample *p = nalus[i];
if (!p || !p->size) {
continue;
}
@ -1263,7 +1263,7 @@ uint64_t SrsRtpSTAPPayload::nb_bytes()
int nn_nalus = (int)nalus.size();
for (int i = 0; i < nn_nalus; i++) {
SrsSample *p = nalus[i];
SrsNaluSample *p = nalus[i];
size += 2 + p->size;
}
@ -1285,7 +1285,7 @@ srs_error_t SrsRtpSTAPPayload::encode(SrsBuffer *buf)
// NALUs.
int nn_nalus = (int)nalus.size();
for (int i = 0; i < nn_nalus; i++) {
SrsSample *p = nalus[i];
SrsNaluSample *p = nalus[i];
if (!buf->require(2 + p->size)) {
return srs_error_new(ERROR_RTC_RTP_MUXER, "requires %d bytes", 2 + p->size);
@ -1328,7 +1328,7 @@ srs_error_t SrsRtpSTAPPayload::decode(SrsBuffer *buf)
return srs_error_new(ERROR_RTC_RTP_MUXER, "requires %d bytes", size);
}
SrsSample *sample = new SrsSample();
SrsNaluSample *sample = new SrsNaluSample();
sample->bytes = buf->head();
sample->size = size;
buf->skip(size);
@ -1347,7 +1347,7 @@ ISrsRtpPayloader *SrsRtpSTAPPayload::copy()
int nn_nalus = (int)nalus.size();
for (int i = 0; i < nn_nalus; i++) {
SrsSample *p = nalus[i];
SrsNaluSample *p = nalus[i];
cp->nalus.push_back(p->copy());
}
@ -1366,7 +1366,7 @@ SrsRtpFUAPayload::~SrsRtpFUAPayload()
{
int nn_nalus = (int)nalus.size();
for (int i = 0; i < nn_nalus; i++) {
SrsSample *p = nalus[i];
SrsNaluSample *p = nalus[i];
srs_freep(p);
}
}
@ -1377,7 +1377,7 @@ uint64_t SrsRtpFUAPayload::nb_bytes()
int nn_nalus = (int)nalus.size();
for (int i = 0; i < nn_nalus; i++) {
SrsSample *p = nalus[i];
SrsNaluSample *p = nalus[i];
size += p->size;
}
@ -1408,7 +1408,7 @@ srs_error_t SrsRtpFUAPayload::encode(SrsBuffer *buf)
// FU payload, @see https://tools.ietf.org/html/rfc6184#section-5.8
int nn_nalus = (int)nalus.size();
for (int i = 0; i < nn_nalus; i++) {
SrsSample *p = nalus[i];
SrsNaluSample *p = nalus[i];
if (!buf->require(p->size)) {
return srs_error_new(ERROR_RTC_RTP_MUXER, "requires %d bytes", p->size);
@ -1440,7 +1440,7 @@ srs_error_t SrsRtpFUAPayload::decode(SrsBuffer *buf)
return srs_error_new(ERROR_RTC_RTP_MUXER, "requires %d bytes", 1);
}
SrsSample *sample = new SrsSample();
SrsNaluSample *sample = new SrsNaluSample();
sample->bytes = buf->head();
sample->size = buf->left();
buf->skip(sample->size);
@ -1461,7 +1461,7 @@ ISrsRtpPayloader *SrsRtpFUAPayload::copy()
int nn_nalus = (int)nalus.size();
for (int i = 0; i < nn_nalus; i++) {
SrsSample *p = nalus[i];
SrsNaluSample *p = nalus[i];
cp->nalus.push_back(p->copy());
}
@ -1571,16 +1571,16 @@ SrsRtpSTAPPayloadHevc::~SrsRtpSTAPPayloadHevc()
{
int nn_nalus = (int)nalus.size();
for (int i = 0; i < nn_nalus; i++) {
SrsSample *p = nalus[i];
SrsNaluSample *p = nalus[i];
srs_freep(p);
}
}
SrsSample *SrsRtpSTAPPayloadHevc::get_vps()
SrsNaluSample *SrsRtpSTAPPayloadHevc::get_vps()
{
int nn_nalus = (int)nalus.size();
for (int i = 0; i < nn_nalus; i++) {
SrsSample *p = nalus[i];
SrsNaluSample *p = nalus[i];
if (!p || !p->size) {
continue;
}
@ -1594,11 +1594,11 @@ SrsSample *SrsRtpSTAPPayloadHevc::get_vps()
return NULL;
}
SrsSample *SrsRtpSTAPPayloadHevc::get_sps()
SrsNaluSample *SrsRtpSTAPPayloadHevc::get_sps()
{
int nn_nalus = (int)nalus.size();
for (int i = 0; i < nn_nalus; i++) {
SrsSample *p = nalus[i];
SrsNaluSample *p = nalus[i];
if (!p || !p->size) {
continue;
}
@ -1612,11 +1612,11 @@ SrsSample *SrsRtpSTAPPayloadHevc::get_sps()
return NULL;
}
SrsSample *SrsRtpSTAPPayloadHevc::get_pps()
SrsNaluSample *SrsRtpSTAPPayloadHevc::get_pps()
{
int nn_nalus = (int)nalus.size();
for (int i = 0; i < nn_nalus; i++) {
SrsSample *p = nalus[i];
SrsNaluSample *p = nalus[i];
if (!p || !p->size) {
continue;
}
@ -1636,7 +1636,7 @@ uint64_t SrsRtpSTAPPayloadHevc::nb_bytes()
int nn_nalus = (int)nalus.size();
for (int i = 0; i < nn_nalus; i++) {
SrsSample *p = nalus[i];
SrsNaluSample *p = nalus[i];
size += 2 + p->size;
}
@ -1657,7 +1657,7 @@ srs_error_t SrsRtpSTAPPayloadHevc::encode(SrsBuffer *buf)
// NALUs.
int nn_nalus = (int)nalus.size();
for (int i = 0; i < nn_nalus; i++) {
SrsSample *p = nalus[i];
SrsNaluSample *p = nalus[i];
if (!buf->require(2 + p->size)) {
return srs_error_new(ERROR_RTC_RTP_MUXER, "requires %d bytes", 2 + p->size);
@ -1699,7 +1699,7 @@ srs_error_t SrsRtpSTAPPayloadHevc::decode(SrsBuffer *buf)
return srs_error_new(ERROR_RTC_RTP_MUXER, "requires %d bytes", size);
}
SrsSample *sample = new SrsSample();
SrsNaluSample *sample = new SrsNaluSample();
sample->bytes = buf->head();
sample->size = size;
buf->skip(size);
@ -1716,7 +1716,7 @@ ISrsRtpPayloader *SrsRtpSTAPPayloadHevc::copy()
int nn_nalus = (int)nalus.size();
for (int i = 0; i < nn_nalus; i++) {
SrsSample *p = nalus[i];
SrsNaluSample *p = nalus[i];
cp->nalus.push_back(p->copy());
}
@ -1735,7 +1735,7 @@ SrsRtpFUAPayloadHevc::~SrsRtpFUAPayloadHevc()
{
int nn_nalus = (int)nalus.size();
for (int i = 0; i < nn_nalus; i++) {
SrsSample *p = nalus[i];
SrsNaluSample *p = nalus[i];
srs_freep(p);
}
}
@ -1746,7 +1746,7 @@ uint64_t SrsRtpFUAPayloadHevc::nb_bytes()
int nn_nalus = (int)nalus.size();
for (int i = 0; i < nn_nalus; i++) {
SrsSample *p = nalus[i];
SrsNaluSample *p = nalus[i];
size += p->size;
}
@ -1770,7 +1770,7 @@ srs_error_t SrsRtpFUAPayloadHevc::encode(SrsBuffer *buf)
int nn_nalus = (int)nalus.size();
for (int i = 0; i < nn_nalus; i++) {
SrsSample *p = nalus[i];
SrsNaluSample *p = nalus[i];
if (!buf->require(p->size)) {
return srs_error_new(ERROR_RTC_RTP_MUXER, "requires %d bytes", p->size);
@ -1799,7 +1799,7 @@ srs_error_t SrsRtpFUAPayloadHevc::decode(SrsBuffer *buf)
return srs_error_new(ERROR_RTC_RTP_MUXER, "requires %d bytes", 1);
}
SrsSample *sample = new SrsSample();
SrsNaluSample *sample = new SrsNaluSample();
sample->bytes = buf->head();
sample->size = buf->left();
buf->skip(sample->size);
@ -1819,7 +1819,7 @@ ISrsRtpPayloader *SrsRtpFUAPayloadHevc::copy()
int nn_nalus = (int)nalus.size();
for (int i = 0; i < nn_nalus; i++) {
SrsSample *p = nalus[i];
SrsNaluSample *p = nalus[i];
cp->nalus.push_back(p->copy());
}

View File

@ -12,6 +12,7 @@
#include <srs_core_autofree.hpp>
#include <srs_kernel_buffer.hpp>
#include <srs_kernel_codec.hpp>
#include <srs_kernel_packet.hpp>
#include <list>
#include <string>
@ -411,7 +412,7 @@ public:
public:
// Use the whole RAW RTP payload as a sample.
SrsSample *sample_;
SrsNaluSample *sample_;
public:
SrsRtpRawPayload();
@ -429,7 +430,7 @@ class SrsRtpRawNALUs : public ISrsRtpPayloader
{
private:
// We will manage the samples, but the sample itself point to the shared memory.
std::vector<SrsSample *> nalus;
std::vector<SrsNaluSample *> nalus;
int nn_bytes;
int cursor;
@ -438,12 +439,12 @@ public:
virtual ~SrsRtpRawNALUs();
public:
void push_back(SrsSample *sample);
void push_back(SrsNaluSample *sample);
public:
uint8_t skip_bytes(int count);
// We will manage the returned samples, if user want to manage it, please copy it.
srs_error_t read_samples(std::vector<SrsSample *> &samples, int packet_size);
srs_error_t read_samples(std::vector<SrsNaluSample *> &samples, int packet_size);
// interface ISrsRtpPayloader
public:
virtual uint64_t nb_bytes();
@ -460,15 +461,15 @@ public:
SrsAvcNaluType nri;
// The NALU samples, we will manage the samples.
// @remark We only refer to the memory, user must free its bytes.
std::vector<SrsSample *> nalus;
std::vector<SrsNaluSample *> nalus;
public:
SrsRtpSTAPPayload();
virtual ~SrsRtpSTAPPayload();
public:
SrsSample *get_sps();
SrsSample *get_pps();
SrsNaluSample *get_sps();
SrsNaluSample *get_pps();
// interface ISrsRtpPayloader
public:
virtual uint64_t nb_bytes();
@ -490,7 +491,7 @@ public:
SrsAvcNaluType nalu_type;
// The NALU samples, we manage the samples.
// @remark We only refer to the memory, user must free its bytes.
std::vector<SrsSample *> nalus;
std::vector<SrsNaluSample *> nalus;
public:
SrsRtpFUAPayload();
@ -534,16 +535,16 @@ class SrsRtpSTAPPayloadHevc : public ISrsRtpPayloader
public:
// The NALU samples, we will manage the samples.
// @remark We only refer to the memory, user must free its bytes.
std::vector<SrsSample *> nalus;
std::vector<SrsNaluSample *> nalus;
public:
SrsRtpSTAPPayloadHevc();
virtual ~SrsRtpSTAPPayloadHevc();
public:
SrsSample *get_vps();
SrsSample *get_sps();
SrsSample *get_pps();
SrsNaluSample *get_vps();
SrsNaluSample *get_sps();
SrsNaluSample *get_pps();
// interface ISrsRtpPayloader
public:
virtual uint64_t nb_bytes();
@ -563,7 +564,7 @@ public:
SrsHevcNaluType nalu_type;
// The NALU samples, we manage the samples.
// @remark We only refer to the memory, user must free its bytes.
std::vector<SrsSample *> nalus;
std::vector<SrsNaluSample *> nalus;
public:
SrsRtpFUAPayloadHevc();

View File

@ -2917,7 +2917,7 @@ SrsTsMessageCache::~SrsTsMessageCache()
srs_freep(video);
}
srs_error_t SrsTsMessageCache::cache_audio(SrsAudioFrame *frame, int64_t dts)
srs_error_t SrsTsMessageCache::cache_audio(SrsParsedAudioPacket *frame, int64_t dts)
{
srs_error_t err = srs_success;
@ -2951,7 +2951,7 @@ srs_error_t SrsTsMessageCache::cache_audio(SrsAudioFrame *frame, int64_t dts)
return err;
}
srs_error_t SrsTsMessageCache::cache_video(SrsVideoFrame *frame, int64_t dts)
srs_error_t SrsTsMessageCache::cache_video(SrsParsedVideoPacket *frame, int64_t dts)
{
srs_error_t err = srs_success;
@ -2979,21 +2979,21 @@ srs_error_t SrsTsMessageCache::cache_video(SrsVideoFrame *frame, int64_t dts)
return err;
}
srs_error_t SrsTsMessageCache::do_cache_mp3(SrsAudioFrame *frame)
srs_error_t SrsTsMessageCache::do_cache_mp3(SrsParsedAudioPacket *frame)
{
srs_error_t err = srs_success;
// for mp3, directly write to cache.
// TODO: FIXME: implements the ts jitter.
for (int i = 0; i < frame->nb_samples; i++) {
SrsSample *sample = &frame->samples[i];
SrsNaluSample *sample = &frame->samples[i];
audio->payload->append(sample->bytes, sample->size);
}
return err;
}
srs_error_t SrsTsMessageCache::do_cache_aac(SrsAudioFrame *frame)
srs_error_t SrsTsMessageCache::do_cache_aac(SrsParsedAudioPacket *frame)
{
srs_error_t err = srs_success;
@ -3001,7 +3001,7 @@ srs_error_t SrsTsMessageCache::do_cache_aac(SrsAudioFrame *frame)
srs_assert(codec);
for (int i = 0; i < frame->nb_samples; i++) {
SrsSample *sample = &frame->samples[i];
SrsNaluSample *sample = &frame->samples[i];
int32_t size = sample->size;
if (!sample->bytes || size <= 0 || size > 0x1fff) {
@ -3118,7 +3118,7 @@ void srs_avc_insert_aud(SrsSimpleStream *payload, bool aud_inserted)
}
}
srs_error_t SrsTsMessageCache::do_cache_avc(SrsVideoFrame *frame)
srs_error_t SrsTsMessageCache::do_cache_avc(SrsParsedVideoPacket *frame)
{
srs_error_t err = srs_success;
@ -3169,7 +3169,7 @@ srs_error_t SrsTsMessageCache::do_cache_avc(SrsVideoFrame *frame)
// all sample use cont nalu header, except the sps-pps before IDR frame.
for (int i = 0; i < frame->nb_samples; i++) {
SrsSample *sample = &frame->samples[i];
SrsNaluSample *sample = &frame->samples[i];
int32_t size = sample->size;
if (!sample->bytes || size <= 0) {
@ -3202,7 +3202,7 @@ srs_error_t SrsTsMessageCache::do_cache_avc(SrsVideoFrame *frame)
return err;
}
srs_error_t SrsTsMessageCache::do_cache_hevc(SrsVideoFrame *frame)
srs_error_t SrsTsMessageCache::do_cache_hevc(SrsParsedVideoPacket *frame)
{
srs_error_t err = srs_success;
@ -3216,7 +3216,7 @@ srs_error_t SrsTsMessageCache::do_cache_hevc(SrsVideoFrame *frame)
// all sample use cont nalu header, except the sps-pps before IDR frame.
for (int i = 0; i < frame->nb_samples; i++) {
SrsSample *sample = &frame->samples[i];
SrsNaluSample *sample = &frame->samples[i];
int32_t size = sample->size;
if (!sample->bytes || size <= 0) {

View File

@ -15,6 +15,7 @@
#include <srs_kernel_codec.hpp>
#include <srs_kernel_file.hpp>
#include <srs_kernel_packet.hpp>
class SrsBuffer;
class SrsTsMessageCache;
@ -1366,15 +1367,15 @@ public:
public:
// Write audio to cache
virtual srs_error_t cache_audio(SrsAudioFrame *frame, int64_t dts);
virtual srs_error_t cache_audio(SrsParsedAudioPacket *frame, int64_t dts);
// Write video to muxer.
virtual srs_error_t cache_video(SrsVideoFrame *frame, int64_t dts);
virtual srs_error_t cache_video(SrsParsedVideoPacket *frame, int64_t dts);
private:
virtual srs_error_t do_cache_mp3(SrsAudioFrame *frame);
virtual srs_error_t do_cache_aac(SrsAudioFrame *frame);
virtual srs_error_t do_cache_avc(SrsVideoFrame *frame);
virtual srs_error_t do_cache_hevc(SrsVideoFrame *frame);
virtual srs_error_t do_cache_mp3(SrsParsedAudioPacket *frame);
virtual srs_error_t do_cache_aac(SrsParsedAudioPacket *frame);
virtual srs_error_t do_cache_avc(SrsParsedVideoPacket *frame);
virtual srs_error_t do_cache_hevc(SrsParsedVideoPacket *frame);
};
// Transmux the RTMP stream to HTTP-TS stream.

View File

@ -27,9 +27,9 @@ srs_error_t SrsRtmpFormat::on_metadata(SrsOnMetaDataPacket *meta)
return srs_success;
}
srs_error_t SrsRtmpFormat::on_audio(SrsSharedPtrMessage *shared_audio)
srs_error_t SrsRtmpFormat::on_audio(SrsMediaPacket *shared_audio)
{
SrsSharedPtrMessage *msg = shared_audio;
SrsMediaPacket *msg = shared_audio;
char *data = msg->payload();
int size = msg->size();
@ -41,9 +41,9 @@ srs_error_t SrsRtmpFormat::on_audio(int64_t timestamp, char *data, int size)
return SrsFormat::on_audio(timestamp, data, size);
}
srs_error_t SrsRtmpFormat::on_video(SrsSharedPtrMessage *shared_video)
srs_error_t SrsRtmpFormat::on_video(SrsMediaPacket *shared_video)
{
SrsSharedPtrMessage *msg = shared_video;
SrsMediaPacket *msg = shared_video;
char *data = msg->payload();
int size = msg->size();

View File

@ -10,9 +10,10 @@
#include <srs_core.hpp>
#include <srs_kernel_codec.hpp>
#include <srs_kernel_packet.hpp>
class SrsOnMetaDataPacket;
class SrsSharedPtrMessage;
class SrsMediaPacket;
/**
* Create special structure from RTMP stream, for example, the metadata.
@ -27,10 +28,10 @@ public:
// Initialize the format from metadata, optional.
virtual srs_error_t on_metadata(SrsOnMetaDataPacket *meta);
// When got a parsed audio packet.
virtual srs_error_t on_audio(SrsSharedPtrMessage *shared_audio);
virtual srs_error_t on_audio(SrsMediaPacket *shared_audio);
virtual srs_error_t on_audio(int64_t timestamp, char *data, int size);
// When got a parsed video packet.
virtual srs_error_t on_video(SrsSharedPtrMessage *shared_video);
virtual srs_error_t on_video(SrsMediaPacket *shared_video);
virtual srs_error_t on_video(int64_t timestamp, char *data, int size);
};

View File

@ -14,6 +14,7 @@ using namespace std;
#include <srs_kernel_codec.hpp>
#include <srs_kernel_error.hpp>
#include <srs_kernel_log.hpp>
#include <srs_kernel_packet.hpp>
#include <srs_kernel_utility.hpp>
bool srs_aac_startswith_adts(SrsBuffer *stream)

View File

@ -206,17 +206,17 @@ srs_error_t SrsBasicRtmpClient::recv_message(SrsCommonMessage **pmsg)
return client->recv_message(pmsg);
}
srs_error_t SrsBasicRtmpClient::decode_message(SrsCommonMessage *msg, SrsPacket **ppacket)
srs_error_t SrsBasicRtmpClient::decode_message(SrsCommonMessage *msg, SrsRtmpCommand **ppacket)
{
return client->decode_message(msg, ppacket);
}
srs_error_t SrsBasicRtmpClient::send_and_free_messages(SrsSharedPtrMessage **msgs, int nb_msgs)
srs_error_t SrsBasicRtmpClient::send_and_free_messages(SrsMediaPacket **msgs, int nb_msgs)
{
return client->send_and_free_messages(msgs, nb_msgs, stream_id);
}
srs_error_t SrsBasicRtmpClient::send_and_free_message(SrsSharedPtrMessage *msg)
srs_error_t SrsBasicRtmpClient::send_and_free_message(SrsMediaPacket *msg)
{
return client->send_and_free_message(msg, stream_id);
}

View File

@ -15,8 +15,8 @@ class ISrsRequest;
class SrsTcpClient;
class SrsRtmpClient;
class SrsCommonMessage;
class SrsSharedPtrMessage;
class SrsPacket;
class SrsMediaPacket;
class SrsRtmpCommand;
class SrsNetworkKbps;
class SrsWallClock;
class SrsAmf0Object;
@ -75,9 +75,9 @@ public:
public:
virtual srs_error_t recv_message(SrsCommonMessage **pmsg);
virtual srs_error_t decode_message(SrsCommonMessage *msg, SrsPacket **ppacket);
virtual srs_error_t send_and_free_messages(SrsSharedPtrMessage **msgs, int nb_msgs);
virtual srs_error_t send_and_free_message(SrsSharedPtrMessage *msg);
virtual srs_error_t decode_message(SrsCommonMessage *msg, SrsRtmpCommand **ppacket);
virtual srs_error_t send_and_free_messages(SrsMediaPacket **msgs, int nb_msgs);
virtual srs_error_t send_and_free_message(SrsMediaPacket *msg);
public:
virtual void set_recv_timeout(srs_utime_t timeout);

View File

@ -12,7 +12,7 @@ SrsMessageArray::SrsMessageArray(int max_msgs)
{
srs_assert(max_msgs > 0);
msgs = new SrsSharedPtrMessage *[max_msgs];
msgs = new SrsMediaPacket *[max_msgs];
max = max_msgs;
zero(max_msgs);
@ -30,7 +30,7 @@ void SrsMessageArray::free(int count)
{
// initialize
for (int i = 0; i < count; i++) {
SrsSharedPtrMessage *msg = msgs[i];
SrsMediaPacket *msg = msgs[i];
srs_freep(msg);
msgs[i] = NULL;

View File

@ -9,7 +9,7 @@
#include <srs_core.hpp>
class SrsSharedPtrMessage;
class SrsMediaPacket;
// The class to auto free the shared ptr message array.
// When need to get some messages, for instance, from Consumer queue,
@ -24,7 +24,7 @@ public:
// When user already send all msgs, please set to NULL,
// for instance, msg= msgs.msgs[i], msgs.msgs[i]=NULL, send(msg),
// where send(msg) will always send and free it.
SrsSharedPtrMessage **msgs;
SrsMediaPacket **msgs;
int max;
public:

View File

@ -79,15 +79,15 @@ using namespace std;
*****************************************************************************
****************************************************************************/
SrsPacket::SrsPacket()
SrsRtmpCommand::SrsRtmpCommand()
{
}
SrsPacket::~SrsPacket()
SrsRtmpCommand::~SrsRtmpCommand()
{
}
srs_error_t SrsPacket::to_msg(SrsCommonMessage *msg, int stream_id)
srs_error_t SrsRtmpCommand::to_msg(SrsCommonMessage *msg, int stream_id)
{
srs_error_t err = srs_success;
@ -108,7 +108,6 @@ srs_error_t SrsPacket::to_msg(SrsCommonMessage *msg, int stream_id)
header.payload_length = size;
header.message_type = get_message_type();
header.stream_id = stream_id;
header.prefer_cid = get_prefer_cid();
if ((err = msg->create(&header, payload, size)) != srs_success) {
return srs_error_wrap(err, "create %dB message", size);
@ -117,7 +116,7 @@ srs_error_t SrsPacket::to_msg(SrsCommonMessage *msg, int stream_id)
return err;
}
srs_error_t SrsPacket::encode(int &psize, char *&ppayload)
srs_error_t SrsRtmpCommand::encode(int &psize, char *&ppayload)
{
srs_error_t err = srs_success;
@ -140,27 +139,22 @@ srs_error_t SrsPacket::encode(int &psize, char *&ppayload)
return err;
}
srs_error_t SrsPacket::decode(SrsBuffer *stream)
srs_error_t SrsRtmpCommand::decode(SrsBuffer *stream)
{
return srs_error_new(ERROR_SYSTEM_PACKET_INVALID, "decode");
}
int SrsPacket::get_prefer_cid()
int SrsRtmpCommand::get_message_type()
{
return 0;
}
int SrsPacket::get_message_type()
int SrsRtmpCommand::get_size()
{
return 0;
}
int SrsPacket::get_size()
{
return 0;
}
srs_error_t SrsPacket::encode_packet(SrsBuffer *stream)
srs_error_t SrsRtmpCommand::encode_packet(SrsBuffer *stream)
{
return srs_error_new(ERROR_SYSTEM_PACKET_INVALID, "encode");
}
@ -196,10 +190,6 @@ SrsProtocol::SrsProtocol(ISrsProtocolReadWriter *io)
}
for (int cid = 0; cid < SRS_PERF_CHUNK_STREAM_CACHE; cid++) {
SrsChunkStream *cs = new SrsChunkStream(cid);
// set the prefer cid of chunk,
// which will copy to the message received.
cs->header.prefer_cid = cid;
cs_cache[cid] = cs;
}
@ -220,9 +210,9 @@ SrsProtocol::~SrsProtocol()
}
if (true) {
std::vector<SrsPacket *>::iterator it;
std::vector<SrsRtmpCommand *>::iterator it;
for (it = manual_response_queue.begin(); it != manual_response_queue.end(); ++it) {
SrsPacket *pkt = *it;
SrsRtmpCommand *pkt = *it;
srs_freep(pkt);
}
manual_response_queue.clear();
@ -259,9 +249,9 @@ srs_error_t SrsProtocol::manual_response_flush()
return err;
}
std::vector<SrsPacket *>::iterator it;
std::vector<SrsRtmpCommand *>::iterator it;
for (it = manual_response_queue.begin(); it != manual_response_queue.end();) {
SrsPacket *pkt = *it;
SrsRtmpCommand *pkt = *it;
// erase this packet, the send api always free it.
it = manual_response_queue.erase(it);
@ -361,7 +351,7 @@ srs_error_t SrsProtocol::recv_message(SrsCommonMessage **pmsg)
return err;
}
srs_error_t SrsProtocol::decode_message(SrsCommonMessage *msg, SrsPacket **ppacket)
srs_error_t SrsProtocol::decode_message(SrsCommonMessage *msg, SrsRtmpCommand **ppacket)
{
*ppacket = NULL;
@ -374,7 +364,7 @@ srs_error_t SrsProtocol::decode_message(SrsCommonMessage *msg, SrsPacket **ppack
SrsBuffer stream(msg->payload(), msg->size());
// decode the packet.
SrsPacket *packet = NULL;
SrsRtmpCommand *packet = NULL;
if ((err = do_decode_message(msg->header, &stream, &packet)) != srs_success) {
srs_freep(packet);
return srs_error_wrap(err, "decode message");
@ -386,7 +376,7 @@ srs_error_t SrsProtocol::decode_message(SrsCommonMessage *msg, SrsPacket **ppack
return err;
}
srs_error_t SrsProtocol::do_send_messages(SrsSharedPtrMessage **msgs, int nb_msgs)
srs_error_t SrsProtocol::do_send_messages(SrsMediaPacket **msgs, int nb_msgs)
{
srs_error_t err = srs_success;
@ -400,7 +390,7 @@ srs_error_t SrsProtocol::do_send_messages(SrsSharedPtrMessage **msgs, int nb_msg
// try to send use the c0c3 header cache,
// if cache is consumed, try another loop.
for (int i = 0; i < nb_msgs; i++) {
SrsSharedPtrMessage *msg = msgs[i];
SrsMediaPacket *msg = msgs[i];
if (!msg) {
continue;
@ -420,7 +410,7 @@ srs_error_t SrsProtocol::do_send_messages(SrsSharedPtrMessage **msgs, int nb_msg
while (p < pend) {
// always has header
int nb_cache = SRS_CONSTS_C0C3_HEADERS_MAX - c0c3_cache_index;
int nbh = msg->chunk_header(c0c3_cache, nb_cache, p == msg->payload());
int nbh = srs_rtmp_write_chunk_header(msg, c0c3_cache, nb_cache, p == msg->payload());
srs_assert(nbh > 0);
// header iov
@ -498,7 +488,7 @@ srs_error_t SrsProtocol::do_send_messages(SrsSharedPtrMessage **msgs, int nb_msg
// try to send use the c0c3 header cache,
// if cache is consumed, try another loop.
for (int i = 0; i < nb_msgs; i++) {
SrsSharedPtrMessage *msg = msgs[i];
SrsMediaPacket *msg = msgs[i];
if (!msg) {
continue;
@ -522,7 +512,7 @@ srs_error_t SrsProtocol::do_send_messages(SrsSharedPtrMessage **msgs, int nb_msg
int nb_cache = SRS_CONSTS_C0C3_HEADERS_MAX;
// always has header
int nbh = msg->chunk_header(c0c3_cache, nb_cache, p == msg->payload);
int nbh = srs_rtmp_write_chunk_header(msg, c0c3_cache, nb_cache, p == msg->payload);
srs_assert(nbh > 0);
// header iov
@ -552,23 +542,20 @@ srs_error_t SrsProtocol::do_iovs_send(iovec *iovs, int size)
return srs_write_large_iovs(skt, iovs, size);
}
srs_error_t SrsProtocol::do_send_and_free_packet(SrsPacket *packet_raw, int stream_id)
srs_error_t SrsProtocol::do_send_and_free_packet(SrsRtmpCommand *packet_raw, int stream_id)
{
srs_error_t err = srs_success;
srs_assert(packet_raw);
SrsUniquePtr<SrsPacket> packet(packet_raw);
SrsUniquePtr<SrsRtmpCommand> packet(packet_raw);
SrsUniquePtr<SrsCommonMessage> msg(new SrsCommonMessage());
if ((err = packet->to_msg(msg.get(), stream_id)) != srs_success) {
return srs_error_wrap(err, "to message");
}
SrsSharedPtrMessage *shared_msg = new SrsSharedPtrMessage();
if ((err = shared_msg->create(msg.get())) != srs_success) {
srs_freep(shared_msg);
return srs_error_wrap(err, "create message");
}
SrsMediaPacket *shared_msg = new SrsMediaPacket();
msg->to_msg(shared_msg);
if ((err = send_and_free_message(shared_msg, stream_id)) != srs_success) {
return srs_error_wrap(err, "send packet");
@ -581,11 +568,11 @@ srs_error_t SrsProtocol::do_send_and_free_packet(SrsPacket *packet_raw, int stre
return err;
}
srs_error_t SrsProtocol::do_decode_message(SrsMessageHeader &header, SrsBuffer *stream, SrsPacket **ppacket)
srs_error_t SrsProtocol::do_decode_message(SrsMessageHeader &header, SrsBuffer *stream, SrsRtmpCommand **ppacket)
{
srs_error_t err = srs_success;
SrsPacket *packet = NULL;
SrsRtmpCommand *packet = NULL;
// decode specified packet type
if (header.is_amf0_command() || header.is_amf3_command() || header.is_amf0_data() || header.is_amf3_data()) {
@ -692,7 +679,7 @@ srs_error_t SrsProtocol::do_decode_message(SrsMessageHeader &header, SrsBuffer *
}
// default packet to drop message.
*ppacket = packet = new SrsPacket();
*ppacket = packet = new SrsRtmpCommand();
return err;
} else if (header.is_user_control_message()) {
*ppacket = packet = new SrsUserControlPacket();
@ -715,12 +702,12 @@ srs_error_t SrsProtocol::do_decode_message(SrsMessageHeader &header, SrsBuffer *
return err;
}
srs_error_t SrsProtocol::send_and_free_message(SrsSharedPtrMessage *msg, int stream_id)
srs_error_t SrsProtocol::send_and_free_message(SrsMediaPacket *msg, int stream_id)
{
return send_and_free_messages(&msg, 1, stream_id);
}
srs_error_t SrsProtocol::send_and_free_messages(SrsSharedPtrMessage **msgs, int nb_msgs, int stream_id)
srs_error_t SrsProtocol::send_and_free_messages(SrsMediaPacket **msgs, int nb_msgs, int stream_id)
{
// always not NULL msg.
srs_assert(msgs);
@ -728,7 +715,7 @@ srs_error_t SrsProtocol::send_and_free_messages(SrsSharedPtrMessage **msgs, int
// update the stream id in header.
for (int i = 0; i < nb_msgs; i++) {
SrsSharedPtrMessage *msg = msgs[i];
SrsMediaPacket *msg = msgs[i];
if (!msg) {
continue;
@ -746,7 +733,7 @@ srs_error_t SrsProtocol::send_and_free_messages(SrsSharedPtrMessage **msgs, int
srs_error_t err = do_send_messages(msgs, nb_msgs);
for (int i = 0; i < nb_msgs; i++) {
SrsSharedPtrMessage *msg = msgs[i];
SrsMediaPacket *msg = msgs[i];
srs_freep(msg);
}
@ -765,7 +752,7 @@ srs_error_t SrsProtocol::send_and_free_messages(SrsSharedPtrMessage **msgs, int
return err;
}
srs_error_t SrsProtocol::send_and_free_packet(SrsPacket *packet, int stream_id)
srs_error_t SrsProtocol::send_and_free_packet(SrsRtmpCommand *packet, int stream_id)
{
srs_error_t err = srs_success;
@ -806,9 +793,6 @@ srs_error_t SrsProtocol::recv_interlaced_message(SrsCommonMessage **pmsg)
// chunk stream cache miss, use map.
if (chunk_streams.find(cid) == chunk_streams.end()) {
chunk = chunk_streams[cid] = new SrsChunkStream(cid);
// set the prefer cid of chunk,
// which will copy to the message received.
chunk->header.prefer_cid = cid;
} else {
chunk = chunk_streams[cid];
}
@ -1250,7 +1234,7 @@ srs_error_t SrsProtocol::on_recv_message(SrsCommonMessage *msg)
return srs_error_wrap(err, "response ack");
}
SrsPacket *packet_raw = NULL;
SrsRtmpCommand *packet_raw = NULL;
switch (msg->header.message_type) {
case RTMP_MSG_SetChunkSize:
case RTMP_MSG_UserControlMessage:
@ -1268,7 +1252,7 @@ srs_error_t SrsProtocol::on_recv_message(SrsCommonMessage *msg)
// always free the packet.
srs_assert(packet_raw);
SrsUniquePtr<SrsPacket> packet(packet_raw);
SrsUniquePtr<SrsRtmpCommand> packet(packet_raw);
switch (msg->header.message_type) {
case RTMP_MSG_WindowAcknowledgementSize: {
@ -1324,7 +1308,7 @@ srs_error_t SrsProtocol::on_recv_message(SrsCommonMessage *msg)
return err;
}
srs_error_t SrsProtocol::on_send_packet(SrsMessageHeader *mh, SrsPacket *packet)
srs_error_t SrsProtocol::on_send_packet(SrsMessageHeader *mh, SrsRtmpCommand *packet)
{
srs_error_t err = srs_success;
@ -1831,22 +1815,22 @@ srs_error_t SrsRtmpClient::recv_message(SrsCommonMessage **pmsg)
return protocol->recv_message(pmsg);
}
srs_error_t SrsRtmpClient::decode_message(SrsCommonMessage *msg, SrsPacket **ppacket)
srs_error_t SrsRtmpClient::decode_message(SrsCommonMessage *msg, SrsRtmpCommand **ppacket)
{
return protocol->decode_message(msg, ppacket);
}
srs_error_t SrsRtmpClient::send_and_free_message(SrsSharedPtrMessage *msg, int stream_id)
srs_error_t SrsRtmpClient::send_and_free_message(SrsMediaPacket *msg, int stream_id)
{
return protocol->send_and_free_message(msg, stream_id);
}
srs_error_t SrsRtmpClient::send_and_free_messages(SrsSharedPtrMessage **msgs, int nb_msgs, int stream_id)
srs_error_t SrsRtmpClient::send_and_free_messages(SrsMediaPacket **msgs, int nb_msgs, int stream_id)
{
return protocol->send_and_free_messages(msgs, nb_msgs, stream_id);
}
srs_error_t SrsRtmpClient::send_and_free_packet(SrsPacket *packet, int stream_id)
srs_error_t SrsRtmpClient::send_and_free_packet(SrsRtmpCommand *packet, int stream_id)
{
return protocol->send_and_free_packet(packet, stream_id);
}
@ -2232,22 +2216,22 @@ srs_error_t SrsRtmpServer::recv_message(SrsCommonMessage **pmsg)
return protocol->recv_message(pmsg);
}
srs_error_t SrsRtmpServer::decode_message(SrsCommonMessage *msg, SrsPacket **ppacket)
srs_error_t SrsRtmpServer::decode_message(SrsCommonMessage *msg, SrsRtmpCommand **ppacket)
{
return protocol->decode_message(msg, ppacket);
}
srs_error_t SrsRtmpServer::send_and_free_message(SrsSharedPtrMessage *msg, int stream_id)
srs_error_t SrsRtmpServer::send_and_free_message(SrsMediaPacket *msg, int stream_id)
{
return protocol->send_and_free_message(msg, stream_id);
}
srs_error_t SrsRtmpServer::send_and_free_messages(SrsSharedPtrMessage **msgs, int nb_msgs, int stream_id)
srs_error_t SrsRtmpServer::send_and_free_messages(SrsMediaPacket **msgs, int nb_msgs, int stream_id)
{
return protocol->send_and_free_messages(msgs, nb_msgs, stream_id);
}
srs_error_t SrsRtmpServer::send_and_free_packet(SrsPacket *packet, int stream_id)
srs_error_t SrsRtmpServer::send_and_free_packet(SrsRtmpCommand *packet, int stream_id)
{
return protocol->send_and_free_packet(packet, stream_id);
}
@ -2496,11 +2480,11 @@ srs_error_t SrsRtmpServer::identify_client(int stream_id, SrsRtmpConnType &type,
continue;
}
SrsPacket *pkt_raw = NULL;
SrsRtmpCommand *pkt_raw = NULL;
if ((err = protocol->decode_message(msg.get(), &pkt_raw)) != srs_success) {
return srs_error_wrap(err, "decode identify");
}
SrsUniquePtr<SrsPacket> pkt(pkt_raw);
SrsUniquePtr<SrsRtmpCommand> pkt(pkt_raw);
if (dynamic_cast<SrsCreateStreamPacket *>(pkt.get())) {
return identify_create_stream_client(dynamic_cast<SrsCreateStreamPacket *>(pkt.get()), stream_id, 3, type, stream_name, duration);
@ -2598,7 +2582,7 @@ srs_error_t SrsRtmpServer::start_play(int stream_id)
// |RtmpSampleAccess(false, false)
if (true) {
SrsSampleAccessPacket *pkt = new SrsSampleAccessPacket();
SrsNaluSampleAccessPacket *pkt = new SrsNaluSampleAccessPacket();
// allow audio/video sample.
// @see: https://github.com/ossrs/srs/issues/49
@ -2887,11 +2871,11 @@ srs_error_t SrsRtmpServer::identify_create_stream_client(SrsCreateStreamPacket *
continue;
}
SrsPacket *pkt_raw = NULL;
SrsRtmpCommand *pkt_raw = NULL;
if ((err = protocol->decode_message(msg.get(), &pkt_raw)) != srs_success) {
return srs_error_wrap(err, "decode identify");
}
SrsUniquePtr<SrsPacket> pkt(pkt_raw);
SrsUniquePtr<SrsRtmpCommand> pkt(pkt_raw);
if (dynamic_cast<SrsPlayPacket *>(pkt.get())) {
return identify_play_client(dynamic_cast<SrsPlayPacket *>(pkt.get()), type, stream_name, duration);
@ -3033,11 +3017,6 @@ srs_error_t SrsConnectAppPacket::decode(SrsBuffer *stream)
return err;
}
int SrsConnectAppPacket::get_prefer_cid()
{
return RTMP_CID_OverConnection;
}
int SrsConnectAppPacket::get_message_type()
{
return RTMP_MSG_AMF0CommandMessage;
@ -3139,11 +3118,6 @@ srs_error_t SrsConnectAppResPacket::decode(SrsBuffer *stream)
return err;
}
int SrsConnectAppResPacket::get_prefer_cid()
{
return RTMP_CID_OverConnection;
}
int SrsConnectAppResPacket::get_message_type()
{
return RTMP_MSG_AMF0CommandMessage;
@ -3227,11 +3201,6 @@ srs_error_t SrsCallPacket::decode(SrsBuffer *stream)
return err;
}
int SrsCallPacket::get_prefer_cid()
{
return RTMP_CID_OverConnection;
}
int SrsCallPacket::get_message_type()
{
return RTMP_MSG_AMF0CommandMessage;
@ -3291,11 +3260,6 @@ SrsCallResPacket::~SrsCallResPacket()
srs_freep(response);
}
int SrsCallResPacket::get_prefer_cid()
{
return RTMP_CID_OverConnection;
}
int SrsCallResPacket::get_message_type()
{
return RTMP_MSG_AMF0CommandMessage;
@ -3381,11 +3345,6 @@ srs_error_t SrsCreateStreamPacket::decode(SrsBuffer *stream)
return err;
}
int SrsCreateStreamPacket::get_prefer_cid()
{
return RTMP_CID_OverConnection;
}
int SrsCreateStreamPacket::get_message_type()
{
return RTMP_MSG_AMF0CommandMessage;
@ -3454,11 +3413,6 @@ srs_error_t SrsCreateStreamResPacket::decode(SrsBuffer *stream)
return err;
}
int SrsCreateStreamResPacket::get_prefer_cid()
{
return RTMP_CID_OverConnection;
}
int SrsCreateStreamResPacket::get_message_type()
{
return RTMP_MSG_AMF0CommandMessage;
@ -3569,11 +3523,6 @@ srs_error_t SrsFMLEStartPacket::decode(SrsBuffer *stream)
return err;
}
int SrsFMLEStartPacket::get_prefer_cid()
{
return RTMP_CID_OverConnection;
}
int SrsFMLEStartPacket::get_message_type()
{
return RTMP_MSG_AMF0CommandMessage;
@ -3681,11 +3630,6 @@ srs_error_t SrsFMLEStartResPacket::decode(SrsBuffer *stream)
return err;
}
int SrsFMLEStartResPacket::get_prefer_cid()
{
return RTMP_CID_OverConnection;
}
int SrsFMLEStartResPacket::get_message_type()
{
return RTMP_MSG_AMF0CommandMessage;
@ -3768,11 +3712,6 @@ srs_error_t SrsPublishPacket::decode(SrsBuffer *stream)
return err;
}
int SrsPublishPacket::get_prefer_cid()
{
return RTMP_CID_OverStream;
}
int SrsPublishPacket::get_message_type()
{
return RTMP_MSG_AMF0CommandMessage;
@ -3927,11 +3866,6 @@ srs_error_t SrsPlayPacket::decode(SrsBuffer *stream)
return err;
}
int SrsPlayPacket::get_prefer_cid()
{
return RTMP_CID_OverStream;
}
int SrsPlayPacket::get_message_type()
{
return RTMP_MSG_AMF0CommandMessage;
@ -4017,11 +3951,6 @@ void SrsPlayResPacket::set_desc(SrsAmf0Object *v)
desc = v;
}
int SrsPlayResPacket::get_prefer_cid()
{
return RTMP_CID_OverStream;
}
int SrsPlayResPacket::get_message_type()
{
return RTMP_MSG_AMF0CommandMessage;
@ -4073,11 +4002,6 @@ void SrsOnBWDonePacket::set_args(SrsAmf0Any *v)
args = v;
}
int SrsOnBWDonePacket::get_prefer_cid()
{
return RTMP_CID_OverConnection;
}
int SrsOnBWDonePacket::get_message_type()
{
return RTMP_MSG_AMF0CommandMessage;
@ -4133,11 +4057,6 @@ void SrsOnStatusCallPacket::set_data(SrsAmf0Object *v)
data = v;
}
int SrsOnStatusCallPacket::get_prefer_cid()
{
return RTMP_CID_OverStream;
}
int SrsOnStatusCallPacket::get_message_type()
{
return RTMP_MSG_AMF0CommandMessage;
@ -4188,11 +4107,6 @@ void SrsOnStatusDataPacket::set_data(SrsAmf0Object *v)
data = v;
}
int SrsOnStatusDataPacket::get_prefer_cid()
{
return RTMP_CID_OverStream;
}
int SrsOnStatusDataPacket::get_message_type()
{
return RTMP_MSG_AMF0DataMessage;
@ -4218,33 +4132,28 @@ srs_error_t SrsOnStatusDataPacket::encode_packet(SrsBuffer *stream)
return err;
}
SrsSampleAccessPacket::SrsSampleAccessPacket()
SrsNaluSampleAccessPacket::SrsNaluSampleAccessPacket()
{
command_name = RTMP_AMF0_DATA_SAMPLE_ACCESS;
video_sample_access = false;
audio_sample_access = false;
}
SrsSampleAccessPacket::~SrsSampleAccessPacket()
SrsNaluSampleAccessPacket::~SrsNaluSampleAccessPacket()
{
}
int SrsSampleAccessPacket::get_prefer_cid()
{
return RTMP_CID_OverStream;
}
int SrsSampleAccessPacket::get_message_type()
int SrsNaluSampleAccessPacket::get_message_type()
{
return RTMP_MSG_AMF0DataMessage;
}
int SrsSampleAccessPacket::get_size()
int SrsNaluSampleAccessPacket::get_size()
{
return SrsAmf0Size::str(command_name) + SrsAmf0Size::boolean() + SrsAmf0Size::boolean();
}
srs_error_t SrsSampleAccessPacket::encode_packet(SrsBuffer *stream)
srs_error_t SrsNaluSampleAccessPacket::encode_packet(SrsBuffer *stream)
{
srs_error_t err = srs_success;
@ -4326,11 +4235,6 @@ srs_error_t SrsOnMetaDataPacket::decode(SrsBuffer *stream)
return err;
}
int SrsOnMetaDataPacket::get_prefer_cid()
{
return RTMP_CID_OverConnection2;
}
int SrsOnMetaDataPacket::get_message_type()
{
return RTMP_MSG_AMF0DataMessage;
@ -4378,11 +4282,6 @@ srs_error_t SrsSetWindowAckSizePacket::decode(SrsBuffer *stream)
return err;
}
int SrsSetWindowAckSizePacket::get_prefer_cid()
{
return RTMP_CID_ProtocolControl;
}
int SrsSetWindowAckSizePacket::get_message_type()
{
return RTMP_MSG_WindowAcknowledgementSize;
@ -4428,11 +4327,6 @@ srs_error_t SrsAcknowledgementPacket::decode(SrsBuffer *stream)
return err;
}
int SrsAcknowledgementPacket::get_prefer_cid()
{
return RTMP_CID_ProtocolControl;
}
int SrsAcknowledgementPacket::get_message_type()
{
return RTMP_MSG_Acknowledgement;
@ -4478,11 +4372,6 @@ srs_error_t SrsSetChunkSizePacket::decode(SrsBuffer *stream)
return err;
}
int SrsSetChunkSizePacket::get_prefer_cid()
{
return RTMP_CID_ProtocolControl;
}
int SrsSetChunkSizePacket::get_message_type()
{
return RTMP_MSG_SetChunkSize;
@ -4516,11 +4405,6 @@ SrsSetPeerBandwidthPacket::~SrsSetPeerBandwidthPacket()
{
}
int SrsSetPeerBandwidthPacket::get_prefer_cid()
{
return RTMP_CID_ProtocolControl;
}
int SrsSetPeerBandwidthPacket::get_message_type()
{
return RTMP_MSG_SetPeerBandwidth;
@ -4588,11 +4472,6 @@ srs_error_t SrsUserControlPacket::decode(SrsBuffer *stream)
return err;
}
int SrsUserControlPacket::get_prefer_cid()
{
return RTMP_CID_ProtocolControl;
}
int SrsUserControlPacket::get_message_type()
{
return RTMP_MSG_UserControlMessage;

View File

@ -28,7 +28,7 @@ class SrsBuffer;
class SrsAmf0Any;
class SrsMessageHeader;
class SrsChunkStream;
class SrsSharedPtrMessage;
class SrsMediaPacket;
class SrsProtocol;
class ISrsProtocolReader;
@ -39,7 +39,7 @@ class SrsPublishPacket;
class SrsOnMetaDataPacket;
class SrsPlayPacket;
class SrsCommonMessage;
class SrsPacket;
class SrsRtmpCommand;
class SrsAmf0Object;
class IMergeReadHandler;
class SrsCallPacket;
@ -86,17 +86,17 @@ class SrsCallPacket;
#define StatusCodeDataStart "NetStream.Data.Start"
#define StatusCodeUnpublishSuccess "NetStream.Unpublish.Success"
// The decoded message payload.
// The message payload is decoded as RTMP packet.
// @remark we seperate the packet from message,
// for the packet focus on logic and domain data,
// the message bind to the protocol and focus on protocol, such as header.
// we can merge the message and packet, using OOAD hierachy, packet extends from message,
// it's better for me to use components -- the message use the packet as payload.
class SrsPacket
class SrsRtmpCommand
{
public:
SrsPacket();
virtual ~SrsPacket();
SrsRtmpCommand();
virtual ~SrsRtmpCommand();
public:
// Covert packet to common message.
@ -115,11 +115,6 @@ public:
virtual srs_error_t decode(SrsBuffer *stream);
// Encode functions for concrete packet to override.
public:
// The cid(chunk id) specifies the chunk to send data over.
// Generally, each message prefer some cid, for example,
// all protocol control messages prefer RTMP_CID_ProtocolControl,
// SrsSetWindowAckSizePacket is protocol control message.
virtual int get_prefer_cid();
// The subpacket must override to provide the right message type.
// The message type set the RTMP message type in header.
virtual int get_message_type();
@ -182,7 +177,7 @@ private:
// default to true for it's very easy to use the protocol stack.
bool auto_response_when_recv;
// When not auto response message, manual flush the messages in queue.
std::vector<SrsPacket *> manual_response_queue;
std::vector<SrsRtmpCommand *> manual_response_queue;
// For peer out
private:
// Cache for multiple messages send,
@ -266,26 +261,26 @@ public:
// @param ppacket, output decoded packet,
// always NULL if error, never NULL if success.
// @return error when unknown packet, error when decode failed.
virtual srs_error_t decode_message(SrsCommonMessage *msg, SrsPacket **ppacket);
virtual srs_error_t decode_message(SrsCommonMessage *msg, SrsRtmpCommand **ppacket);
// Send the RTMP message and always free it.
// user must never free or use the msg after this method,
// For it will always free the msg.
// @param msg, the msg to send out, never be NULL.
// @param stream_id, the stream id of packet to send over, 0 for control message.
virtual srs_error_t send_and_free_message(SrsSharedPtrMessage *msg, int stream_id);
virtual srs_error_t send_and_free_message(SrsMediaPacket *msg, int stream_id);
// Send the RTMP message and always free it.
// user must never free or use the msg after this method,
// For it will always free the msg.
// @param msgs, the msgs to send out, never be NULL.
// @param nb_msgs, the size of msgs to send out.
// @param stream_id, the stream id of packet to send over, 0 for control message.
virtual srs_error_t send_and_free_messages(SrsSharedPtrMessage **msgs, int nb_msgs, int stream_id);
virtual srs_error_t send_and_free_messages(SrsMediaPacket **msgs, int nb_msgs, int stream_id);
// Send the RTMP packet and always free it.
// user must never free or use the packet after this method,
// For it will always free the packet.
// @param packet, the packet to send out, never be NULL.
// @param stream_id, the stream id of packet to send over, 0 for control message.
virtual srs_error_t send_and_free_packet(SrsPacket *packet, int stream_id);
virtual srs_error_t send_and_free_packet(SrsRtmpCommand *packet, int stream_id);
public:
// Expect a specified message, drop others util got specified one.
@ -317,7 +312,7 @@ public:
return srs_error_wrap(err, "recv message");
}
SrsPacket *packet = NULL;
SrsRtmpCommand *packet = NULL;
if ((err = decode_message(msg, &packet)) != srs_success) {
srs_freep(msg);
srs_freep(packet);
@ -342,13 +337,13 @@ public:
private:
// Send out the messages, donot free it,
// The caller must free the param msgs.
virtual srs_error_t do_send_messages(SrsSharedPtrMessage **msgs, int nb_msgs);
virtual srs_error_t do_send_messages(SrsMediaPacket **msgs, int nb_msgs);
// Send iovs. send multiple times if exceed limits.
virtual srs_error_t do_iovs_send(iovec *iovs, int size);
// The underlayer api for send and free packet.
virtual srs_error_t do_send_and_free_packet(SrsPacket *packet, int stream_id);
virtual srs_error_t do_send_and_free_packet(SrsRtmpCommand *packet, int stream_id);
// The imp for decode_message
virtual srs_error_t do_decode_message(SrsMessageHeader &header, SrsBuffer *stream, SrsPacket **ppacket);
virtual srs_error_t do_decode_message(SrsMessageHeader &header, SrsBuffer *stream, SrsRtmpCommand **ppacket);
// Recv bytes oriented RTMP message from protocol stack.
// return error if error occur and nerver set the pmsg,
// return success and pmsg set to NULL if no entire message got,
@ -366,7 +361,7 @@ private:
// When recv message, update the context.
virtual srs_error_t on_recv_message(SrsCommonMessage *msg);
// When message sentout, update the context.
virtual srs_error_t on_send_packet(SrsMessageHeader *mh, SrsPacket *packet);
virtual srs_error_t on_send_packet(SrsMessageHeader *mh, SrsRtmpCommand *packet);
private:
// Auto response the ack message.
@ -604,10 +599,10 @@ public:
virtual int64_t get_recv_bytes();
virtual int64_t get_send_bytes();
virtual srs_error_t recv_message(SrsCommonMessage **pmsg);
virtual srs_error_t decode_message(SrsCommonMessage *msg, SrsPacket **ppacket);
virtual srs_error_t send_and_free_message(SrsSharedPtrMessage *msg, int stream_id);
virtual srs_error_t send_and_free_messages(SrsSharedPtrMessage **msgs, int nb_msgs, int stream_id);
virtual srs_error_t send_and_free_packet(SrsPacket *packet, int stream_id);
virtual srs_error_t decode_message(SrsCommonMessage *msg, SrsRtmpCommand **ppacket);
virtual srs_error_t send_and_free_message(SrsMediaPacket *msg, int stream_id);
virtual srs_error_t send_and_free_messages(SrsMediaPacket **msgs, int nb_msgs, int stream_id);
virtual srs_error_t send_and_free_packet(SrsRtmpCommand *packet, int stream_id);
public:
// handshake with server, try complex, then simple handshake.
@ -717,13 +712,13 @@ public:
// @param ppacket, output decoded packet,
// always NULL if error, never NULL if success.
// @return error when unknown packet, error when decode failed.
virtual srs_error_t decode_message(SrsCommonMessage *msg, SrsPacket **ppacket);
virtual srs_error_t decode_message(SrsCommonMessage *msg, SrsRtmpCommand **ppacket);
// Send the RTMP message and always free it.
// user must never free or use the msg after this method,
// For it will always free the msg.
// @param msg, the msg to send out, never be NULL.
// @param stream_id, the stream id of packet to send over, 0 for control message.
virtual srs_error_t send_and_free_message(SrsSharedPtrMessage *msg, int stream_id);
virtual srs_error_t send_and_free_message(SrsMediaPacket *msg, int stream_id);
// Send the RTMP message and always free it.
// user must never free or use the msg after this method,
// For it will always free the msg.
@ -732,13 +727,13 @@ public:
// @param stream_id, the stream id of packet to send over, 0 for control message.
//
// @remark performance issue, to support 6k+ 250kbps client,
virtual srs_error_t send_and_free_messages(SrsSharedPtrMessage **msgs, int nb_msgs, int stream_id);
virtual srs_error_t send_and_free_messages(SrsMediaPacket **msgs, int nb_msgs, int stream_id);
// Send the RTMP packet and always free it.
// user must never free or use the packet after this method,
// For it will always free the packet.
// @param packet, the packet to send out, never be NULL.
// @param stream_id, the stream id of packet to send over, 0 for control message.
virtual srs_error_t send_and_free_packet(SrsPacket *packet, int stream_id);
virtual srs_error_t send_and_free_packet(SrsRtmpCommand *packet, int stream_id);
public:
// Do handshake with client, try complex then simple.
@ -842,7 +837,7 @@ private:
// 4.1.1. connect
// The client sends the connect command to the server to request
// connection to a server application instance.
class SrsConnectAppPacket : public SrsPacket
class SrsConnectAppPacket : public SrsRtmpCommand
{
public:
// Name of the command. Set to "connect".
@ -866,7 +861,6 @@ public:
virtual srs_error_t decode(SrsBuffer *stream);
// Encode functions for concrete packet to override.
public:
virtual int get_prefer_cid();
virtual int get_message_type();
protected:
@ -874,7 +868,7 @@ protected:
virtual srs_error_t encode_packet(SrsBuffer *stream);
};
// Response for SrsConnectAppPacket.
class SrsConnectAppResPacket : public SrsPacket
class SrsConnectAppResPacket : public SrsRtmpCommand
{
public:
// The _result or _error; indicates whether the response is result or error.
@ -897,7 +891,6 @@ public:
virtual srs_error_t decode(SrsBuffer *stream);
// Encode functions for concrete packet to override.
public:
virtual int get_prefer_cid();
virtual int get_message_type();
protected:
@ -909,7 +902,7 @@ protected:
// The call method of the NetConnection object runs remote procedure
// calls (RPC) at the receiving end. The called RPC name is passed as a
// parameter to the call command.
class SrsCallPacket : public SrsPacket
class SrsCallPacket : public SrsRtmpCommand
{
public:
// Name of the remote procedure that is called.
@ -932,7 +925,6 @@ public:
virtual srs_error_t decode(SrsBuffer *stream);
// Encode functions for concrete packet to override.
public:
virtual int get_prefer_cid();
virtual int get_message_type();
protected:
@ -940,7 +932,7 @@ protected:
virtual srs_error_t encode_packet(SrsBuffer *stream);
};
// Response for SrsCallPacket.
class SrsCallResPacket : public SrsPacket
class SrsCallResPacket : public SrsRtmpCommand
{
public:
// Name of the command.
@ -959,7 +951,6 @@ public:
virtual ~SrsCallResPacket();
// Encode functions for concrete packet to override.
public:
virtual int get_prefer_cid();
virtual int get_message_type();
protected:
@ -972,7 +963,7 @@ protected:
// channel for message communication The publishing of audio, video, and
// metadata is carried out over stream channel created using the
// createStream command.
class SrsCreateStreamPacket : public SrsPacket
class SrsCreateStreamPacket : public SrsRtmpCommand
{
public:
// Name of the command. Set to "createStream".
@ -993,7 +984,6 @@ public:
virtual srs_error_t decode(SrsBuffer *stream);
// Encode functions for concrete packet to override.
public:
virtual int get_prefer_cid();
virtual int get_message_type();
protected:
@ -1001,7 +991,7 @@ protected:
virtual srs_error_t encode_packet(SrsBuffer *stream);
};
// Response for SrsCreateStreamPacket.
class SrsCreateStreamResPacket : public SrsPacket
class SrsCreateStreamResPacket : public SrsRtmpCommand
{
public:
// The _result or _error; indicates whether the response is result or error.
@ -1022,7 +1012,6 @@ public:
virtual srs_error_t decode(SrsBuffer *stream);
// Encode functions for concrete packet to override.
public:
virtual int get_prefer_cid();
virtual int get_message_type();
protected:
@ -1031,7 +1020,7 @@ protected:
};
// client close stream packet.
class SrsCloseStreamPacket : public SrsPacket
class SrsCloseStreamPacket : public SrsRtmpCommand
{
public:
// Name of the command, set to "closeStream".
@ -1050,7 +1039,7 @@ public:
};
// FMLE start publish: ReleaseStream/PublishStream/FCPublish/FCUnpublish
class SrsFMLEStartPacket : public SrsPacket
class SrsFMLEStartPacket : public SrsRtmpCommand
{
public:
// Name of the command
@ -1074,7 +1063,6 @@ public:
virtual srs_error_t decode(SrsBuffer *stream);
// Encode functions for concrete packet to override.
public:
virtual int get_prefer_cid();
virtual int get_message_type();
protected:
@ -1086,7 +1074,7 @@ public:
static SrsFMLEStartPacket *create_FC_publish(std::string stream);
};
// Response for SrsFMLEStartPacket.
class SrsFMLEStartResPacket : public SrsPacket
class SrsFMLEStartResPacket : public SrsRtmpCommand
{
public:
// Name of the command
@ -1111,7 +1099,6 @@ public:
virtual srs_error_t decode(SrsBuffer *stream);
// Encode functions for concrete packet to override.
public:
virtual int get_prefer_cid();
virtual int get_message_type();
protected:
@ -1124,7 +1111,7 @@ protected:
// The client sends the publish command to publish a named stream to the
// server. Using this name, any client can play this stream and receive
// The published audio, video, and data messages.
class SrsPublishPacket : public SrsPacket
class SrsPublishPacket : public SrsRtmpCommand
{
public:
// Name of the command, set to "publish".
@ -1159,7 +1146,6 @@ public:
virtual srs_error_t decode(SrsBuffer *stream);
// Encode functions for concrete packet to override.
public:
virtual int get_prefer_cid();
virtual int get_message_type();
protected:
@ -1170,7 +1156,7 @@ protected:
// 4.2.8. pause
// The client sends the pause command to tell the server to pause or
// start playing.
class SrsPausePacket : public SrsPacket
class SrsPausePacket : public SrsRtmpCommand
{
public:
// Name of the command, set to "pause".
@ -1198,7 +1184,7 @@ public:
// 4.2.1. play
// The client sends this command to the server to play a stream.
class SrsPlayPacket : public SrsPacket
class SrsPlayPacket : public SrsRtmpCommand
{
public:
// Name of the command. Set to "play".
@ -1253,7 +1239,6 @@ public:
virtual srs_error_t decode(SrsBuffer *stream);
// Encode functions for concrete packet to override.
public:
virtual int get_prefer_cid();
virtual int get_message_type();
protected:
@ -1263,7 +1248,7 @@ protected:
// Response for SrsPlayPacket.
// @remark, user must set the stream_id in header.
class SrsPlayResPacket : public SrsPacket
class SrsPlayResPacket : public SrsRtmpCommand
{
public:
// Name of the command. If the play command is successful, the command
@ -1289,7 +1274,6 @@ public:
void set_desc(SrsAmf0Object *v);
// Encode functions for concrete packet to override.
public:
virtual int get_prefer_cid();
virtual int get_message_type();
protected:
@ -1298,7 +1282,7 @@ protected:
};
// When bandwidth test done, notice client.
class SrsOnBWDonePacket : public SrsPacket
class SrsOnBWDonePacket : public SrsRtmpCommand
{
public:
// Name of command. Set to "onBWDone"
@ -1316,7 +1300,6 @@ public:
void set_args(SrsAmf0Any *v);
// Encode functions for concrete packet to override.
public:
virtual int get_prefer_cid();
virtual int get_message_type();
protected:
@ -1326,7 +1309,7 @@ protected:
// onStatus command, AMF0 Call
// @remark, user must set the stream_id by SrsCommonMessage.set_packet().
class SrsOnStatusCallPacket : public SrsPacket
class SrsOnStatusCallPacket : public SrsRtmpCommand
{
public:
// Name of command. Set to "onStatus"
@ -1350,7 +1333,6 @@ public:
void set_data(SrsAmf0Object *v);
// Encode functions for concrete packet to override.
public:
virtual int get_prefer_cid();
virtual int get_message_type();
protected:
@ -1360,7 +1342,7 @@ protected:
// onStatus data, AMF0 Data
// @remark, user must set the stream_id by SrsCommonMessage.set_packet().
class SrsOnStatusDataPacket : public SrsPacket
class SrsOnStatusDataPacket : public SrsRtmpCommand
{
public:
// Name of command. Set to "onStatus"
@ -1379,7 +1361,6 @@ public:
SrsAmf0Object *get_data();
// Encode functions for concrete packet to override.
public:
virtual int get_prefer_cid();
virtual int get_message_type();
protected:
@ -1389,7 +1370,7 @@ protected:
// AMF0Data RtmpSampleAccess
// @remark, user must set the stream_id by SrsCommonMessage.set_packet().
class SrsSampleAccessPacket : public SrsPacket
class SrsNaluSampleAccessPacket : public SrsRtmpCommand
{
public:
// Name of command. Set to "|RtmpSampleAccess".
@ -1402,11 +1383,10 @@ public:
bool audio_sample_access;
public:
SrsSampleAccessPacket();
virtual ~SrsSampleAccessPacket();
SrsNaluSampleAccessPacket();
virtual ~SrsNaluSampleAccessPacket();
// Encode functions for concrete packet to override.
public:
virtual int get_prefer_cid();
virtual int get_message_type();
protected:
@ -1417,7 +1397,7 @@ protected:
// The stream metadata.
// FMLE: @setDataFrame
// others: onMetaData
class SrsOnMetaDataPacket : public SrsPacket
class SrsOnMetaDataPacket : public SrsRtmpCommand
{
public:
// Name of metadata. Set to "onMetaData"
@ -1437,7 +1417,6 @@ public:
virtual srs_error_t decode(SrsBuffer *stream);
// Encode functions for concrete packet to override.
public:
virtual int get_prefer_cid();
virtual int get_message_type();
protected:
@ -1448,7 +1427,7 @@ protected:
// 5.5. Window Acknowledgement Size (5)
// The client or the server sends this message to inform the peer which
// window size to use when sending acknowledgment.
class SrsSetWindowAckSizePacket : public SrsPacket
class SrsSetWindowAckSizePacket : public SrsRtmpCommand
{
public:
int32_t ackowledgement_window_size;
@ -1461,7 +1440,6 @@ public:
virtual srs_error_t decode(SrsBuffer *stream);
// Encode functions for concrete packet to override.
public:
virtual int get_prefer_cid();
virtual int get_message_type();
protected:
@ -1472,7 +1450,7 @@ protected:
// 5.3. Acknowledgement (3)
// The client or the server sends the acknowledgment to the peer after
// receiving bytes equal to the window size.
class SrsAcknowledgementPacket : public SrsPacket
class SrsAcknowledgementPacket : public SrsRtmpCommand
{
public:
uint32_t sequence_number;
@ -1485,7 +1463,6 @@ public:
virtual srs_error_t decode(SrsBuffer *stream);
// Encode functions for concrete packet to override.
public:
virtual int get_prefer_cid();
virtual int get_message_type();
protected:
@ -1496,7 +1473,7 @@ protected:
// 7.1. Set Chunk Size
// Protocol control message 1, Set Chunk Size, is used to notify the
// peer about the new maximum chunk size.
class SrsSetChunkSizePacket : public SrsPacket
class SrsSetChunkSizePacket : public SrsRtmpCommand
{
public:
// The maximum chunk size can be 65536 bytes. The chunk size is
@ -1511,7 +1488,6 @@ public:
virtual srs_error_t decode(SrsBuffer *stream);
// Encode functions for concrete packet to override.
public:
virtual int get_prefer_cid();
virtual int get_message_type();
protected:
@ -1531,7 +1507,7 @@ enum SrsPeerBandwidthType {
// 5.6. Set Peer Bandwidth (6)
// The client or the server sends this message to update the output
// bandwidth of the peer.
class SrsSetPeerBandwidthPacket : public SrsPacket
class SrsSetPeerBandwidthPacket : public SrsRtmpCommand
{
public:
int32_t bandwidth;
@ -1543,7 +1519,6 @@ public:
virtual ~SrsSetPeerBandwidthPacket();
// Encode functions for concrete packet to override.
public:
virtual int get_prefer_cid();
virtual int get_message_type();
protected:
@ -1634,7 +1609,7 @@ enum SrcPCUCEventType {
// | Event Type ( 2- bytes ) | Event Data
// +------------------------------+-------------------------
// Figure 5 Pay load for the 'User Control Message'.
class SrsUserControlPacket : public SrsPacket
class SrsUserControlPacket : public SrsRtmpCommand
{
public:
// Event type is followed by Event data.
@ -1655,7 +1630,6 @@ public:
virtual srs_error_t decode(SrsBuffer *stream);
// Encode functions for concrete packet to override.
public:
virtual int get_prefer_cid();
virtual int get_message_type();
protected:

View File

@ -36,7 +36,7 @@ srs_error_t SrsRtpVideoBuilder::initialize(SrsFormat *format, uint32_t ssrc, uin
return srs_success;
}
srs_error_t SrsRtpVideoBuilder::package_stap_a(SrsSharedPtrMessage *msg, SrsRtpPacket *pkt)
srs_error_t SrsRtpVideoBuilder::package_stap_a(SrsMediaPacket *msg, SrsRtpPacket *pkt)
{
srs_error_t err = srs_success;
@ -86,7 +86,7 @@ srs_error_t SrsRtpVideoBuilder::package_stap_a(SrsSharedPtrMessage *msg, SrsRtpP
for (vector<vector<char> *>::iterator it = params.begin(); it != params.end(); ++it) {
vector<char> *param = *it;
SrsSample *sample = new SrsSample();
SrsNaluSample *sample = new SrsNaluSample();
sample->bytes = payload;
sample->size = param->size();
if (format->vcodec->id == SrsVideoCodecIdHEVC) {
@ -102,7 +102,7 @@ srs_error_t SrsRtpVideoBuilder::package_stap_a(SrsSharedPtrMessage *msg, SrsRtpP
return err;
}
srs_error_t SrsRtpVideoBuilder::package_nalus(SrsSharedPtrMessage *msg, const vector<SrsSample *> &samples, vector<SrsRtpPacket *> &pkts)
srs_error_t SrsRtpVideoBuilder::package_nalus(SrsMediaPacket *msg, const vector<SrsNaluSample *> &samples, vector<SrsRtpPacket *> &pkts)
{
srs_error_t err = srs_success;
@ -116,7 +116,7 @@ srs_error_t SrsRtpVideoBuilder::package_nalus(SrsSharedPtrMessage *msg, const ve
uint8_t first_nalu_type = 0;
for (int i = 0; i < (int)samples.size(); i++) {
SrsSample *sample = samples[i];
SrsNaluSample *sample = samples[i];
if (!sample->size) {
continue;
@ -212,7 +212,7 @@ srs_error_t SrsRtpVideoBuilder::package_nalus(SrsSharedPtrMessage *msg, const ve
}
// Single NAL Unit Packet @see https://tools.ietf.org/html/rfc6184#section-5.6
srs_error_t SrsRtpVideoBuilder::package_single_nalu(SrsSharedPtrMessage *msg, SrsSample *sample, vector<SrsRtpPacket *> &pkts)
srs_error_t SrsRtpVideoBuilder::package_single_nalu(SrsMediaPacket *msg, SrsNaluSample *sample, vector<SrsRtpPacket *> &pkts)
{
srs_error_t err = srs_success;
@ -236,7 +236,7 @@ srs_error_t SrsRtpVideoBuilder::package_single_nalu(SrsSharedPtrMessage *msg, Sr
return err;
}
srs_error_t SrsRtpVideoBuilder::package_fu_a(SrsSharedPtrMessage *msg, SrsSample *sample, int fu_payload_size, vector<SrsRtpPacket *> &pkts)
srs_error_t SrsRtpVideoBuilder::package_fu_a(SrsMediaPacket *msg, SrsNaluSample *sample, int fu_payload_size, vector<SrsRtpPacket *> &pkts)
{
srs_error_t err = srs_success;

View File

@ -16,8 +16,8 @@
#include <srs_kernel_flv.hpp>
#include <srs_kernel_rtc_rtp.hpp>
class SrsSharedPtrMessage;
class SrsSample;
class SrsMediaPacket;
class SrsNaluSample;
class SrsRtpPacket;
class SrsFormat;
@ -36,10 +36,10 @@ public:
public:
srs_error_t initialize(SrsFormat *format, uint32_t ssrc, uint8_t payload_type);
srs_error_t package_stap_a(SrsSharedPtrMessage *msg, SrsRtpPacket *pkt);
srs_error_t package_nalus(SrsSharedPtrMessage *msg, const std::vector<SrsSample *> &samples, std::vector<SrsRtpPacket *> &pkts);
srs_error_t package_single_nalu(SrsSharedPtrMessage *msg, SrsSample *sample, std::vector<SrsRtpPacket *> &pkts);
srs_error_t package_fu_a(SrsSharedPtrMessage *msg, SrsSample *sample, int fu_payload_size, std::vector<SrsRtpPacket *> &pkts);
srs_error_t package_stap_a(SrsMediaPacket *msg, SrsRtpPacket *pkt);
srs_error_t package_nalus(SrsMediaPacket *msg, const std::vector<SrsNaluSample *> &samples, std::vector<SrsRtpPacket *> &pkts);
srs_error_t package_single_nalu(SrsMediaPacket *msg, SrsNaluSample *sample, std::vector<SrsRtpPacket *> &pkts);
srs_error_t package_fu_a(SrsMediaPacket *msg, SrsNaluSample *sample, int fu_payload_size, std::vector<SrsRtpPacket *> &pkts);
};
#endif

View File

@ -15,7 +15,7 @@
class SrsBuffer;
class SrsSimpleStream;
class SrsAudioFrame;
class SrsParsedAudioPacket;
class ISrsProtocolReadWriter;
// From rtsp specification

View File

@ -283,19 +283,18 @@ string srs_net_url_encode_rtmp_url(string server, int port, string host, string
return url;
}
template <typename T>
srs_error_t srs_do_rtmp_create_msg(char type, uint32_t timestamp, char *data, int size, int stream_id, T **ppmsg)
srs_error_t srs_do_rtmp_create_msg(char type, uint32_t timestamp, char *data, int size, int stream_id, SrsCommonMessage **ppmsg)
{
srs_error_t err = srs_success;
*ppmsg = NULL;
T *msg = NULL;
SrsCommonMessage *msg = NULL;
if (type == SrsFrameTypeAudio) {
SrsMessageHeader header;
header.initialize_audio(size, timestamp, stream_id);
msg = new T();
msg = new SrsCommonMessage();
if ((err = msg->create(&header, data, size)) != srs_success) {
srs_freep(msg);
return srs_error_wrap(err, "create message");
@ -304,7 +303,7 @@ srs_error_t srs_do_rtmp_create_msg(char type, uint32_t timestamp, char *data, in
SrsMessageHeader header;
header.initialize_video(size, timestamp, stream_id);
msg = new T();
msg = new SrsCommonMessage();
if ((err = msg->create(&header, data, size)) != srs_success) {
srs_freep(msg);
return srs_error_wrap(err, "create message");
@ -313,7 +312,7 @@ srs_error_t srs_do_rtmp_create_msg(char type, uint32_t timestamp, char *data, in
SrsMessageHeader header;
header.initialize_amf0_script(size, stream_id);
msg = new T();
msg = new SrsCommonMessage();
if ((err = msg->create(&header, data, size)) != srs_success) {
srs_freep(msg);
return srs_error_wrap(err, "create message");
@ -327,19 +326,6 @@ srs_error_t srs_do_rtmp_create_msg(char type, uint32_t timestamp, char *data, in
return err;
}
srs_error_t srs_rtmp_create_msg(char type, uint32_t timestamp, char *data, int size, int stream_id, SrsSharedPtrMessage **ppmsg)
{
srs_error_t err = srs_success;
// only when failed, we must free the data.
if ((err = srs_do_rtmp_create_msg(type, timestamp, data, size, stream_id, ppmsg)) != srs_success) {
srs_freepa(data);
return srs_error_wrap(err, "create message");
}
return err;
}
srs_error_t srs_rtmp_create_msg(char type, uint32_t timestamp, char *data, int size, int stream_id, SrsCommonMessage **ppmsg)
{
srs_error_t err = srs_success;

View File

@ -32,7 +32,7 @@
class ISrsHttpMessage;
class SrsMessageHeader;
class SrsSharedPtrMessage;
class SrsMediaPacket;
class SrsCommonMessage;
class ISrsProtocolReadWriter;
class ISrsReader;
@ -101,7 +101,6 @@ extern std::string srs_net_url_encode_rtmp_url(std::string server, int port, std
* @param data the packet bytes. user should never free it.
* @param ppmsg output the shared ptr message. user should free it.
*/
extern srs_error_t srs_rtmp_create_msg(char type, uint32_t timestamp, char *data, int size, int stream_id, SrsSharedPtrMessage **ppmsg);
extern srs_error_t srs_rtmp_create_msg(char type, uint32_t timestamp, char *data, int size, int stream_id, SrsCommonMessage **ppmsg);
// write large numbers of iovs.

View File

@ -54,25 +54,25 @@ public:
virtual ~MockSrsFormat() {}
};
class MockSrsSharedPtrMessage : public SrsSharedPtrMessage
class MockSrsMediaPacket : public SrsMediaPacket
{
public:
MockSrsSharedPtrMessage(bool is_video_msg, uint32_t ts)
MockSrsMediaPacket(bool is_video_msg, uint32_t ts)
{
timestamp = ts;
// Create sample payload
char *payload = new char[1024];
memset(payload, 0x00, 1024);
SrsSharedPtrMessage::wrap(payload, 1024);
SrsMediaPacket::wrap(payload, 1024);
if (is_video_msg) {
message_type = RTMP_MSG_VideoMessage;
message_type = SrsFrameTypeVideo;
} else {
message_type = RTMP_MSG_AudioMessage;
message_type = SrsFrameTypeAudio;
}
}
virtual ~MockSrsSharedPtrMessage() {}
virtual ~MockSrsMediaPacket() {}
};
VOID TEST(Fmp4Test, SrsInitMp4Segment_VideoOnly)
@ -165,11 +165,11 @@ VOID TEST(Fmp4Test, SrsHlsM4sSegment_Basic)
// Write video sample
MockSrsFormat fmt;
MockSrsSharedPtrMessage video_msg(true, 1000);
MockSrsMediaPacket video_msg(true, 1000);
HELPER_ASSERT_SUCCESS(segment.write(&video_msg, &fmt));
// Write audio sample
MockSrsSharedPtrMessage audio_msg(false, 2000); // Different timestamp
MockSrsMediaPacket audio_msg(false, 2000); // Different timestamp
HELPER_ASSERT_SUCCESS(segment.write(&audio_msg, &fmt));
// Test duration - should be > 0 after writing samples with different timestamps
@ -199,10 +199,10 @@ VOID TEST(Fmp4Test, SrsHlsM4sSegment_WithEncryption)
// Write samples with different timestamps to create duration
MockSrsFormat fmt;
MockSrsSharedPtrMessage video_msg1(true, 1000);
MockSrsMediaPacket video_msg1(true, 1000);
HELPER_ASSERT_SUCCESS(segment.write(&video_msg1, &fmt));
MockSrsSharedPtrMessage video_msg2(true, 2000);
MockSrsMediaPacket video_msg2(true, 2000);
HELPER_ASSERT_SUCCESS(segment.write(&video_msg2, &fmt));
// Test that segment has content
@ -330,19 +330,19 @@ VOID TEST(Fmp4Test, SrsHlsFmp4Muxer_WriteMedia)
HELPER_ASSERT_SUCCESS(muxer.write_init_mp4(&fmt, true, true));
// Write video samples
MockSrsSharedPtrMessage video_msg(true, 1000);
MockSrsMediaPacket video_msg(true, 1000);
HELPER_ASSERT_SUCCESS(muxer.write_video(&video_msg, &fmt));
// Write audio samples
MockSrsSharedPtrMessage audio_msg(false, 1000);
MockSrsMediaPacket audio_msg(false, 1000);
HELPER_ASSERT_SUCCESS(muxer.write_audio(&audio_msg, &fmt));
// Write more samples with time progression to accumulate duration
for (int i = 1; i <= 5; i++) {
MockSrsSharedPtrMessage video_msg2(true, 1000 + i * 1000); // 1 second increments
MockSrsMediaPacket video_msg2(true, 1000 + i * 1000); // 1 second increments
HELPER_ASSERT_SUCCESS(muxer.write_video(&video_msg2, &fmt));
MockSrsSharedPtrMessage audio_msg2(false, 1000 + i * 1000);
MockSrsMediaPacket audio_msg2(false, 1000 + i * 1000);
HELPER_ASSERT_SUCCESS(muxer.write_audio(&audio_msg2, &fmt));
}
@ -385,17 +385,17 @@ VOID TEST(Fmp4Test, SrsHlsMp4Controller_PublishWorkflow)
// Handle sequence headers
MockSrsFormat fmt;
MockSrsSharedPtrMessage video_sh(true, 0);
MockSrsMediaPacket video_sh(true, 0);
HELPER_ASSERT_SUCCESS(controller.on_sequence_header(&video_sh, &fmt));
MockSrsSharedPtrMessage audio_sh(false, 0);
MockSrsMediaPacket audio_sh(false, 0);
HELPER_ASSERT_SUCCESS(controller.on_sequence_header(&audio_sh, &fmt));
// Write media samples
MockSrsSharedPtrMessage video_msg(true, 1000);
MockSrsMediaPacket video_msg(true, 1000);
HELPER_ASSERT_SUCCESS(controller.write_video(&video_msg, &fmt));
MockSrsSharedPtrMessage audio_msg(false, 1000);
MockSrsMediaPacket audio_msg(false, 1000);
HELPER_ASSERT_SUCCESS(controller.write_audio(&audio_msg, &fmt));
// Unpublish
@ -601,13 +601,13 @@ VOID TEST(Fmp4Test, Integration_FullEncryptionWorkflow)
m4s_segment.config_cipher(seg_key, seg_iv);
// Write samples to encrypted segment with time progression
MockSrsSharedPtrMessage video_msg1(true, 2000);
MockSrsMediaPacket video_msg1(true, 2000);
HELPER_ASSERT_SUCCESS(m4s_segment.write(&video_msg1, &fmt));
MockSrsSharedPtrMessage audio_msg1(false, 2500);
MockSrsMediaPacket audio_msg1(false, 2500);
HELPER_ASSERT_SUCCESS(m4s_segment.write(&audio_msg1, &fmt));
MockSrsSharedPtrMessage video_msg2(true, 3000);
MockSrsMediaPacket video_msg2(true, 3000);
HELPER_ASSERT_SUCCESS(m4s_segment.write(&video_msg2, &fmt));
// Should have duration from timestamp progression
@ -720,11 +720,11 @@ VOID TEST(Fmp4Test, Configuration_TrackIdManagement)
HELPER_ASSERT_SUCCESS(controller.on_publish(&req));
MockSrsFormat fmt;
MockSrsSharedPtrMessage video_sh(true, 0);
MockSrsMediaPacket video_sh(true, 0);
HELPER_ASSERT_SUCCESS(controller.on_sequence_header(&video_sh, &fmt));
EXPECT_TRUE(controller.has_video_sh_);
MockSrsSharedPtrMessage audio_sh(false, 0);
MockSrsMediaPacket audio_sh(false, 0);
HELPER_ASSERT_SUCCESS(controller.on_sequence_header(&audio_sh, &fmt));
EXPECT_TRUE(controller.has_audio_sh_);
@ -740,7 +740,7 @@ VOID TEST(Fmp4Test, Configuration_SequenceHeaderValidation)
// Test sequence header without request (should fail)
MockSrsFormat fmt;
MockSrsSharedPtrMessage video_sh(true, 0);
MockSrsMediaPacket video_sh(true, 0);
HELPER_EXPECT_FAILED(controller.on_sequence_header(&video_sh, &fmt));
// Set request and try again
@ -765,14 +765,14 @@ VOID TEST(Fmp4Test, CodecDetection_AudioCodecUpdate)
MockSrsFormat fmt;
fmt.acodec = new SrsAudioCodecConfig();
fmt.acodec->id = SrsAudioCodecIdAAC;
fmt.audio = new SrsAudioFrame();
fmt.audio = new SrsParsedAudioPacket();
fmt.audio->codec = fmt.acodec;
// Initial codec should be forbidden (not set)
EXPECT_EQ(SrsAudioCodecIdForbidden, controller.muxer_->latest_acodec());
// Write audio frame - should detect and update codec
MockSrsSharedPtrMessage audio_msg(false, 1000);
MockSrsMediaPacket audio_msg(false, 1000);
HELPER_ASSERT_SUCCESS(controller.write_audio(&audio_msg, &fmt));
// Codec should now be detected as AAC
@ -804,14 +804,14 @@ VOID TEST(Fmp4Test, CodecDetection_VideoCodecUpdate)
MockSrsFormat fmt;
fmt.vcodec = new SrsVideoCodecConfig();
fmt.vcodec->id = SrsVideoCodecIdAVC;
fmt.video = new SrsVideoFrame();
fmt.video = new SrsParsedVideoPacket();
fmt.video->codec = fmt.vcodec;
// Initial codec should be forbidden (not set)
EXPECT_EQ(SrsVideoCodecIdForbidden, controller.muxer_->latest_vcodec());
// Write video frame - should detect and update codec
MockSrsSharedPtrMessage video_msg(true, 1000);
MockSrsMediaPacket video_msg(true, 1000);
HELPER_ASSERT_SUCCESS(controller.write_video(&video_msg, &fmt));
// Codec should now be detected as H.264
@ -847,11 +847,11 @@ VOID TEST(Fmp4Test, Performance_MultipleSegments)
// Write many samples to create multiple segments
for (int i = 0; i < 500; i++) {
MockSrsSharedPtrMessage video_msg(true, i * 40);
MockSrsMediaPacket video_msg(true, i * 40);
HELPER_ASSERT_SUCCESS(muxer.write_video(&video_msg, &fmt));
if (i % 2 == 0) { // Write audio less frequently
MockSrsSharedPtrMessage audio_msg(false, i * 40);
MockSrsMediaPacket audio_msg(false, i * 40);
HELPER_ASSERT_SUCCESS(muxer.write_audio(&audio_msg, &fmt));
}
}
@ -876,13 +876,13 @@ VOID TEST(Fmp4Test, Compatibility_SequenceHeaderIgnore)
MockSrsFormat fmt;
// Create audio sequence header message
MockSrsSharedPtrMessage audio_sh(false, 0);
MockSrsMediaPacket audio_sh(false, 0);
// Should ignore sequence headers in write_audio
HELPER_ASSERT_SUCCESS(controller.write_audio(&audio_sh, &fmt));
// Regular audio message should be processed
MockSrsSharedPtrMessage audio_msg(false, 1000);
MockSrsMediaPacket audio_msg(false, 1000);
HELPER_ASSERT_SUCCESS(controller.write_audio(&audio_msg, &fmt));
controller.dispose();

View File

@ -966,10 +966,12 @@ VOID TEST(KernelFLVTest, CoverWriterErrorCase)
SrsMessageHeader h;
h.initialize_video(10, 30, 20);
SrsSharedPtrMessage msg;
HELPER_EXPECT_SUCCESS(msg.create(&h, new char[1], 1));
SrsMediaPacket msg;
SrsCommonMessage common_msg;
HELPER_EXPECT_SUCCESS(common_msg.create(&h, new char[1], 1));
common_msg.to_msg(&msg);
SrsSharedPtrMessage *msgs = &msg;
SrsMediaPacket *msgs = &msg;
HELPER_EXPECT_FAILED(m.write_tags(&msgs, 1));
}
@ -983,10 +985,12 @@ VOID TEST(KernelFLVTest, CoverWriterErrorCase)
SrsMessageHeader h;
h.initialize_audio(10, 30, 20);
SrsSharedPtrMessage msg;
HELPER_EXPECT_SUCCESS(msg.create(&h, new char[1], 1));
SrsMediaPacket msg;
SrsCommonMessage common_msg;
HELPER_EXPECT_SUCCESS(common_msg.create(&h, new char[1], 1));
common_msg.to_msg(&msg);
SrsSharedPtrMessage *msgs = &msg;
SrsMediaPacket *msgs = &msg;
HELPER_EXPECT_FAILED(m.write_tags(&msgs, 1));
}
@ -1000,10 +1004,12 @@ VOID TEST(KernelFLVTest, CoverWriterErrorCase)
SrsMessageHeader h;
h.initialize_amf0_script(10, 20);
SrsSharedPtrMessage msg;
HELPER_EXPECT_SUCCESS(msg.create(&h, new char[1], 1));
SrsMediaPacket msg;
SrsCommonMessage common_msg;
HELPER_EXPECT_SUCCESS(common_msg.create(&h, new char[1], 1));
common_msg.to_msg(&msg);
SrsSharedPtrMessage *msgs = &msg;
SrsMediaPacket *msgs = &msg;
HELPER_EXPECT_FAILED(m.write_tags(&msgs, 1));
}
}
@ -3483,7 +3489,7 @@ VOID TEST(KernelCodecTest, AVFrame)
srs_error_t err;
if (true) {
SrsAudioFrame f;
SrsParsedAudioPacket f;
SrsAudioCodecConfig *cc = new SrsAudioCodecConfig();
SrsUniquePtr<SrsAudioCodecConfig> cc_uptr(cc);
HELPER_EXPECT_SUCCESS(f.initialize(cc));
@ -3501,7 +3507,7 @@ VOID TEST(KernelCodecTest, AVFrame)
}
if (true) {
SrsAudioFrame f;
SrsParsedAudioPacket f;
EXPECT_TRUE(0 == f.nb_samples);
HELPER_EXPECT_SUCCESS(f.add_sample((char *)1, 0));
@ -3512,7 +3518,7 @@ VOID TEST(KernelCodecTest, AVFrame)
}
if (true) {
SrsAudioFrame f;
SrsParsedAudioPacket f;
for (int i = 0; i < SrsMaxNbSamples; i++) {
HELPER_EXPECT_SUCCESS(f.add_sample((char *)(int64_t)(i + 1), i * 10 + 1));
}
@ -3522,7 +3528,7 @@ VOID TEST(KernelCodecTest, AVFrame)
}
if (true) {
SrsVideoFrame f;
SrsParsedVideoPacket f;
SrsVideoCodecConfig *cc = new SrsVideoCodecConfig();
SrsUniquePtr<SrsVideoCodecConfig> cc_uptr(cc);
HELPER_EXPECT_SUCCESS(f.initialize(cc));
@ -3534,7 +3540,7 @@ VOID TEST(KernelCodecTest, AVFrame)
}
if (true) {
SrsVideoFrame f;
SrsParsedVideoPacket f;
SrsVideoCodecConfig *cc = new SrsVideoCodecConfig();
SrsUniquePtr<SrsVideoCodecConfig> cc_uptr(cc);
HELPER_EXPECT_SUCCESS(f.initialize(cc));
@ -3545,7 +3551,7 @@ VOID TEST(KernelCodecTest, AVFrame)
}
if (true) {
SrsVideoFrame f;
SrsParsedVideoPacket f;
SrsVideoCodecConfig *cc = new SrsVideoCodecConfig();
SrsUniquePtr<SrsVideoCodecConfig> cc_uptr(cc);
HELPER_EXPECT_SUCCESS(f.initialize(cc));
@ -3556,7 +3562,7 @@ VOID TEST(KernelCodecTest, AVFrame)
}
if (true) {
SrsVideoFrame f;
SrsParsedVideoPacket f;
SrsVideoCodecConfig *cc = new SrsVideoCodecConfig();
SrsUniquePtr<SrsVideoCodecConfig> cc_uptr(cc);
HELPER_EXPECT_SUCCESS(f.initialize(cc));
@ -3567,7 +3573,7 @@ VOID TEST(KernelCodecTest, AVFrame)
}
if (true) {
SrsVideoFrame f;
SrsParsedVideoPacket f;
SrsVideoCodecConfig *cc = new SrsVideoCodecConfig();
SrsUniquePtr<SrsVideoCodecConfig> cc_uptr(cc);
HELPER_EXPECT_SUCCESS(f.initialize(cc));
@ -3587,12 +3593,12 @@ VOID TEST(KernelCodecTest, AVFrameNoConfig)
srs_error_t err;
if (true) {
SrsAudioFrame f;
SrsParsedAudioPacket f;
HELPER_EXPECT_SUCCESS(f.add_sample((char *)1, 10));
}
if (true) {
SrsVideoFrame f;
SrsParsedVideoPacket f;
HELPER_EXPECT_SUCCESS(f.add_sample((char *)"\x05", 1));
}
}
@ -3604,39 +3610,39 @@ VOID TEST(KernelCodecTest, VideoFrameH264_ParseNaluType)
if (true) {
// I Frame
uint8_t data[] = {0x05, 0x00, 0x00, 0x00};
SrsSample sample((char *)data, sizeof(data));
SrsNaluSample sample((char *)data, sizeof(data));
SrsAvcNaluType nalu_type = SrsAvcNaluTypeForbidden;
HELPER_EXPECT_SUCCESS(SrsVideoFrame::parse_avc_nalu_type(&sample, nalu_type));
HELPER_EXPECT_SUCCESS(SrsParsedVideoPacket::parse_avc_nalu_type(&sample, nalu_type));
EXPECT_EQ(nalu_type, SrsAvcNaluTypeIDR);
// P Frame
uint8_t data2[] = {0x01, 0x00, 0x00, 0x00};
SrsSample sample2((char *)data2, sizeof(data2));
SrsNaluSample sample2((char *)data2, sizeof(data2));
nalu_type = SrsAvcNaluTypeForbidden;
HELPER_EXPECT_SUCCESS(SrsVideoFrame::parse_avc_nalu_type(&sample2, nalu_type));
HELPER_EXPECT_SUCCESS(SrsParsedVideoPacket::parse_avc_nalu_type(&sample2, nalu_type));
EXPECT_EQ(nalu_type, SrsAvcNaluTypeNonIDR);
// SPS
uint8_t data3[] = {0x07, 0x00, 0x00, 0x00};
SrsSample sample3((char *)data3, sizeof(data3));
SrsNaluSample sample3((char *)data3, sizeof(data3));
nalu_type = SrsAvcNaluTypeForbidden;
HELPER_EXPECT_SUCCESS(SrsVideoFrame::parse_avc_nalu_type(&sample3, nalu_type));
HELPER_EXPECT_SUCCESS(SrsParsedVideoPacket::parse_avc_nalu_type(&sample3, nalu_type));
EXPECT_EQ(nalu_type, SrsAvcNaluTypeSPS);
// PPS
uint8_t data4[] = {0x08, 0x00, 0x00, 0x00};
SrsSample sample4((char *)data4, sizeof(data4));
SrsNaluSample sample4((char *)data4, sizeof(data4));
nalu_type = SrsAvcNaluTypeForbidden;
HELPER_EXPECT_SUCCESS(SrsVideoFrame::parse_avc_nalu_type(&sample4, nalu_type));
HELPER_EXPECT_SUCCESS(SrsParsedVideoPacket::parse_avc_nalu_type(&sample4, nalu_type));
EXPECT_EQ(nalu_type, SrsAvcNaluTypePPS);
// Empty Sample
SrsSample empty_sample(NULL, 0);
HELPER_EXPECT_FAILED(SrsVideoFrame::parse_avc_nalu_type(&empty_sample, nalu_type));
SrsNaluSample empty_sample(NULL, 0);
HELPER_EXPECT_FAILED(SrsParsedVideoPacket::parse_avc_nalu_type(&empty_sample, nalu_type));
}
}
@ -3649,53 +3655,53 @@ VOID TEST(KernelCodecTest, VideoFrameH264_BFrameDetection_AllowedNaluTypes)
// NonIDR NALU (type 1) with B-frame slice_type=1
uint8_t data_b1[] = {0x01, 0xA8, 0x00, 0x00}; // NALU type 1, slice_type=1 (B)
SrsSample sample_b1((char *)data_b1, sizeof(data_b1));
SrsNaluSample sample_b1((char *)data_b1, sizeof(data_b1));
bool is_b_frame = false;
HELPER_EXPECT_SUCCESS(SrsVideoFrame::parse_avc_bframe(&sample_b1, is_b_frame));
HELPER_EXPECT_SUCCESS(SrsParsedVideoPacket::parse_avc_bframe(&sample_b1, is_b_frame));
EXPECT_TRUE(is_b_frame);
// Test that the function correctly processes NALU type 1 (the main case)
// NonIDR NALU (type 1) with P-frame slice_type=0
uint8_t data_p1[] = {0x01, 0x88, 0x00, 0x00}; // NALU type 1, slice_type=0 (P)
SrsSample sample_p1((char *)data_p1, sizeof(data_p1));
SrsNaluSample sample_p1((char *)data_p1, sizeof(data_p1));
is_b_frame = true;
HELPER_EXPECT_SUCCESS(SrsVideoFrame::parse_avc_bframe(&sample_p1, is_b_frame));
HELPER_EXPECT_SUCCESS(SrsParsedVideoPacket::parse_avc_bframe(&sample_p1, is_b_frame));
EXPECT_FALSE(is_b_frame);
// NonIDR NALU (type 1) with I-frame slice_type=2
uint8_t data_i1[] = {0x01, 0x98, 0x00, 0x00}; // NALU type 1, slice_type=2 (I)
SrsSample sample_i1((char *)data_i1, sizeof(data_i1));
SrsNaluSample sample_i1((char *)data_i1, sizeof(data_i1));
is_b_frame = true;
HELPER_EXPECT_SUCCESS(SrsVideoFrame::parse_avc_bframe(&sample_i1, is_b_frame));
HELPER_EXPECT_SUCCESS(SrsParsedVideoPacket::parse_avc_bframe(&sample_i1, is_b_frame));
EXPECT_FALSE(is_b_frame);
// DataPartitionA NALU (type 2) with B-frame slice_type=1
uint8_t data_dpa_b[] = {0x02, 0xA8, 0x00, 0x00}; // NALU type 2, slice_type=1 (B)
SrsSample sample_dpa_b((char *)data_dpa_b, sizeof(data_dpa_b));
SrsNaluSample sample_dpa_b((char *)data_dpa_b, sizeof(data_dpa_b));
is_b_frame = false;
HELPER_EXPECT_SUCCESS(SrsVideoFrame::parse_avc_bframe(&sample_dpa_b, is_b_frame));
HELPER_EXPECT_SUCCESS(SrsParsedVideoPacket::parse_avc_bframe(&sample_dpa_b, is_b_frame));
EXPECT_TRUE(is_b_frame);
// DataPartitionA NALU (type 2) with P-frame slice_type=0
uint8_t data_dpa_p[] = {0x02, 0x88, 0x00, 0x00}; // NALU type 2, slice_type=0 (P)
SrsSample sample_dpa_p((char *)data_dpa_p, sizeof(data_dpa_p));
SrsNaluSample sample_dpa_p((char *)data_dpa_p, sizeof(data_dpa_p));
is_b_frame = true;
HELPER_EXPECT_SUCCESS(SrsVideoFrame::parse_avc_bframe(&sample_dpa_p, is_b_frame));
HELPER_EXPECT_SUCCESS(SrsParsedVideoPacket::parse_avc_bframe(&sample_dpa_p, is_b_frame));
EXPECT_FALSE(is_b_frame);
// DataPartitionB NALU (type 3) with B-frame slice_type=1
uint8_t data_dpb_b[] = {0x03, 0xA8, 0x00, 0x00}; // NALU type 3, slice_type=1 (B)
SrsSample sample_dpb_b((char *)data_dpb_b, sizeof(data_dpb_b));
SrsNaluSample sample_dpb_b((char *)data_dpb_b, sizeof(data_dpb_b));
is_b_frame = false;
HELPER_EXPECT_SUCCESS(SrsVideoFrame::parse_avc_bframe(&sample_dpb_b, is_b_frame));
HELPER_EXPECT_SUCCESS(SrsParsedVideoPacket::parse_avc_bframe(&sample_dpb_b, is_b_frame));
EXPECT_TRUE(is_b_frame);
// DataPartitionC NALU (type 4) with B-frame slice_type=1
uint8_t data_dpc_b[] = {0x04, 0xA8, 0x00, 0x00}; // NALU type 4, slice_type=1 (B)
SrsSample sample_dpc_b((char *)data_dpc_b, sizeof(data_dpc_b));
SrsNaluSample sample_dpc_b((char *)data_dpc_b, sizeof(data_dpc_b));
is_b_frame = false;
HELPER_EXPECT_SUCCESS(SrsVideoFrame::parse_avc_bframe(&sample_dpc_b, is_b_frame));
HELPER_EXPECT_SUCCESS(SrsParsedVideoPacket::parse_avc_bframe(&sample_dpc_b, is_b_frame));
EXPECT_TRUE(is_b_frame);
}
}
@ -3709,93 +3715,93 @@ VOID TEST(KernelCodecTest, VideoFrameH264_BFrameDetection_ForbiddenNaluTypes)
// IDR NALU (type 5) - cannot contain B-frames by definition
uint8_t data_idr[] = {0x05, 0xA8, 0x00, 0x00}; // NALU type 5, any slice data
SrsSample sample_idr((char *)data_idr, sizeof(data_idr));
SrsNaluSample sample_idr((char *)data_idr, sizeof(data_idr));
bool is_b_frame = true;
HELPER_EXPECT_SUCCESS(SrsVideoFrame::parse_avc_bframe(&sample_idr, is_b_frame));
HELPER_EXPECT_SUCCESS(SrsParsedVideoPacket::parse_avc_bframe(&sample_idr, is_b_frame));
EXPECT_FALSE(is_b_frame);
// SEI NALU (type 6) - cannot contain B-frames
uint8_t data_sei[] = {0x06, 0xA8, 0x00, 0x00}; // NALU type 6
SrsSample sample_sei((char *)data_sei, sizeof(data_sei));
SrsNaluSample sample_sei((char *)data_sei, sizeof(data_sei));
is_b_frame = true;
HELPER_EXPECT_SUCCESS(SrsVideoFrame::parse_avc_bframe(&sample_sei, is_b_frame));
HELPER_EXPECT_SUCCESS(SrsParsedVideoPacket::parse_avc_bframe(&sample_sei, is_b_frame));
EXPECT_FALSE(is_b_frame);
// SPS NALU (type 7) - cannot contain B-frames
uint8_t data_sps[] = {0x07, 0xA8, 0x00, 0x00}; // NALU type 7
SrsSample sample_sps((char *)data_sps, sizeof(data_sps));
SrsNaluSample sample_sps((char *)data_sps, sizeof(data_sps));
is_b_frame = true;
HELPER_EXPECT_SUCCESS(SrsVideoFrame::parse_avc_bframe(&sample_sps, is_b_frame));
HELPER_EXPECT_SUCCESS(SrsParsedVideoPacket::parse_avc_bframe(&sample_sps, is_b_frame));
EXPECT_FALSE(is_b_frame);
// PPS NALU (type 8) - cannot contain B-frames
uint8_t data_pps[] = {0x08, 0xA8, 0x00, 0x00}; // NALU type 8
SrsSample sample_pps((char *)data_pps, sizeof(data_pps));
SrsNaluSample sample_pps((char *)data_pps, sizeof(data_pps));
is_b_frame = true;
HELPER_EXPECT_SUCCESS(SrsVideoFrame::parse_avc_bframe(&sample_pps, is_b_frame));
HELPER_EXPECT_SUCCESS(SrsParsedVideoPacket::parse_avc_bframe(&sample_pps, is_b_frame));
EXPECT_FALSE(is_b_frame);
// AUD NALU (type 9) - cannot contain B-frames
uint8_t data_aud[] = {0x09, 0xA8, 0x00, 0x00}; // NALU type 9
SrsSample sample_aud((char *)data_aud, sizeof(data_aud));
SrsNaluSample sample_aud((char *)data_aud, sizeof(data_aud));
is_b_frame = true;
HELPER_EXPECT_SUCCESS(SrsVideoFrame::parse_avc_bframe(&sample_aud, is_b_frame));
HELPER_EXPECT_SUCCESS(SrsParsedVideoPacket::parse_avc_bframe(&sample_aud, is_b_frame));
EXPECT_FALSE(is_b_frame);
// End of Sequence NALU (type 10) - cannot contain B-frames
uint8_t data_eos[] = {0x0A, 0xA8, 0x00, 0x00}; // NALU type 10
SrsSample sample_eos((char *)data_eos, sizeof(data_eos));
SrsNaluSample sample_eos((char *)data_eos, sizeof(data_eos));
is_b_frame = true;
HELPER_EXPECT_SUCCESS(SrsVideoFrame::parse_avc_bframe(&sample_eos, is_b_frame));
HELPER_EXPECT_SUCCESS(SrsParsedVideoPacket::parse_avc_bframe(&sample_eos, is_b_frame));
EXPECT_FALSE(is_b_frame);
// End of Stream NALU (type 11) - cannot contain B-frames
uint8_t data_eost[] = {0x0B, 0xA8, 0x00, 0x00}; // NALU type 11
SrsSample sample_eost((char *)data_eost, sizeof(data_eost));
SrsNaluSample sample_eost((char *)data_eost, sizeof(data_eost));
is_b_frame = true;
HELPER_EXPECT_SUCCESS(SrsVideoFrame::parse_avc_bframe(&sample_eost, is_b_frame));
HELPER_EXPECT_SUCCESS(SrsParsedVideoPacket::parse_avc_bframe(&sample_eost, is_b_frame));
EXPECT_FALSE(is_b_frame);
// Filler Data NALU (type 12) - cannot contain B-frames
uint8_t data_filler[] = {0x0C, 0xA8, 0x00, 0x00}; // NALU type 12
SrsSample sample_filler((char *)data_filler, sizeof(data_filler));
SrsNaluSample sample_filler((char *)data_filler, sizeof(data_filler));
is_b_frame = true;
HELPER_EXPECT_SUCCESS(SrsVideoFrame::parse_avc_bframe(&sample_filler, is_b_frame));
HELPER_EXPECT_SUCCESS(SrsParsedVideoPacket::parse_avc_bframe(&sample_filler, is_b_frame));
EXPECT_FALSE(is_b_frame);
// SPS Extension NALU (type 13) - cannot contain B-frames
uint8_t data_sps_ext[] = {0x0D, 0xA8, 0x00, 0x00}; // NALU type 13
SrsSample sample_sps_ext((char *)data_sps_ext, sizeof(data_sps_ext));
SrsNaluSample sample_sps_ext((char *)data_sps_ext, sizeof(data_sps_ext));
is_b_frame = true;
HELPER_EXPECT_SUCCESS(SrsVideoFrame::parse_avc_bframe(&sample_sps_ext, is_b_frame));
HELPER_EXPECT_SUCCESS(SrsParsedVideoPacket::parse_avc_bframe(&sample_sps_ext, is_b_frame));
EXPECT_FALSE(is_b_frame);
// Prefix NALU (type 14) - cannot contain B-frames
uint8_t data_prefix[] = {0x0E, 0xA8, 0x00, 0x00}; // NALU type 14
SrsSample sample_prefix((char *)data_prefix, sizeof(data_prefix));
SrsNaluSample sample_prefix((char *)data_prefix, sizeof(data_prefix));
is_b_frame = true;
HELPER_EXPECT_SUCCESS(SrsVideoFrame::parse_avc_bframe(&sample_prefix, is_b_frame));
HELPER_EXPECT_SUCCESS(SrsParsedVideoPacket::parse_avc_bframe(&sample_prefix, is_b_frame));
EXPECT_FALSE(is_b_frame);
// Subset SPS NALU (type 15) - cannot contain B-frames
uint8_t data_subset_sps[] = {0x0F, 0xA8, 0x00, 0x00}; // NALU type 15
SrsSample sample_subset_sps((char *)data_subset_sps, sizeof(data_subset_sps));
SrsNaluSample sample_subset_sps((char *)data_subset_sps, sizeof(data_subset_sps));
is_b_frame = true;
HELPER_EXPECT_SUCCESS(SrsVideoFrame::parse_avc_bframe(&sample_subset_sps, is_b_frame));
HELPER_EXPECT_SUCCESS(SrsParsedVideoPacket::parse_avc_bframe(&sample_subset_sps, is_b_frame));
EXPECT_FALSE(is_b_frame);
// Layer Without Partition NALU (type 19) - cannot contain B-frames
uint8_t data_layer[] = {0x13, 0xA8, 0x00, 0x00}; // NALU type 19
SrsSample sample_layer((char *)data_layer, sizeof(data_layer));
SrsNaluSample sample_layer((char *)data_layer, sizeof(data_layer));
is_b_frame = true;
HELPER_EXPECT_SUCCESS(SrsVideoFrame::parse_avc_bframe(&sample_layer, is_b_frame));
HELPER_EXPECT_SUCCESS(SrsParsedVideoPacket::parse_avc_bframe(&sample_layer, is_b_frame));
EXPECT_FALSE(is_b_frame);
// Coded Slice Extension NALU (type 20) - cannot contain B-frames
uint8_t data_slice_ext[] = {0x14, 0xA8, 0x00, 0x00}; // NALU type 20
SrsSample sample_slice_ext((char *)data_slice_ext, sizeof(data_slice_ext));
SrsNaluSample sample_slice_ext((char *)data_slice_ext, sizeof(data_slice_ext));
is_b_frame = true;
HELPER_EXPECT_SUCCESS(SrsVideoFrame::parse_avc_bframe(&sample_slice_ext, is_b_frame));
HELPER_EXPECT_SUCCESS(SrsParsedVideoPacket::parse_avc_bframe(&sample_slice_ext, is_b_frame));
EXPECT_FALSE(is_b_frame);
}
}
@ -3808,129 +3814,129 @@ VOID TEST(KernelCodecTest, VideoFrameH264_BFrameDetection_EdgeCases)
if (true) {
// IDR NALU (type 5) - cannot contain B-frames by definition
uint8_t data_idr[] = {0x05, 0xA8, 0x00, 0x00}; // NALU type 5, any slice data
SrsSample sample_idr((char *)data_idr, sizeof(data_idr));
SrsNaluSample sample_idr((char *)data_idr, sizeof(data_idr));
bool is_b_frame = true;
HELPER_EXPECT_SUCCESS(SrsVideoFrame::parse_avc_bframe(&sample_idr, is_b_frame));
HELPER_EXPECT_SUCCESS(SrsParsedVideoPacket::parse_avc_bframe(&sample_idr, is_b_frame));
EXPECT_FALSE(is_b_frame);
// SEI NALU (type 6) - cannot contain B-frames
uint8_t data_sei[] = {0x06, 0xA8, 0x00, 0x00}; // NALU type 6
SrsSample sample_sei((char *)data_sei, sizeof(data_sei));
SrsNaluSample sample_sei((char *)data_sei, sizeof(data_sei));
is_b_frame = true;
HELPER_EXPECT_SUCCESS(SrsVideoFrame::parse_avc_bframe(&sample_sei, is_b_frame));
HELPER_EXPECT_SUCCESS(SrsParsedVideoPacket::parse_avc_bframe(&sample_sei, is_b_frame));
EXPECT_FALSE(is_b_frame);
// SPS NALU (type 7) - cannot contain B-frames
uint8_t data_sps[] = {0x07, 0xA8, 0x00, 0x00}; // NALU type 7
SrsSample sample_sps((char *)data_sps, sizeof(data_sps));
SrsNaluSample sample_sps((char *)data_sps, sizeof(data_sps));
is_b_frame = true;
HELPER_EXPECT_SUCCESS(SrsVideoFrame::parse_avc_bframe(&sample_sps, is_b_frame));
HELPER_EXPECT_SUCCESS(SrsParsedVideoPacket::parse_avc_bframe(&sample_sps, is_b_frame));
EXPECT_FALSE(is_b_frame);
// PPS NALU (type 8) - cannot contain B-frames
uint8_t data_pps[] = {0x08, 0xA8, 0x00, 0x00}; // NALU type 8
SrsSample sample_pps((char *)data_pps, sizeof(data_pps));
SrsNaluSample sample_pps((char *)data_pps, sizeof(data_pps));
is_b_frame = true;
HELPER_EXPECT_SUCCESS(SrsVideoFrame::parse_avc_bframe(&sample_pps, is_b_frame));
HELPER_EXPECT_SUCCESS(SrsParsedVideoPacket::parse_avc_bframe(&sample_pps, is_b_frame));
EXPECT_FALSE(is_b_frame);
// AUD NALU (type 9) - cannot contain B-frames
uint8_t data_aud[] = {0x09, 0xA8, 0x00, 0x00}; // NALU type 9
SrsSample sample_aud((char *)data_aud, sizeof(data_aud));
SrsNaluSample sample_aud((char *)data_aud, sizeof(data_aud));
is_b_frame = true;
HELPER_EXPECT_SUCCESS(SrsVideoFrame::parse_avc_bframe(&sample_aud, is_b_frame));
HELPER_EXPECT_SUCCESS(SrsParsedVideoPacket::parse_avc_bframe(&sample_aud, is_b_frame));
EXPECT_FALSE(is_b_frame);
// End of Sequence NALU (type 10) - cannot contain B-frames
uint8_t data_eos[] = {0x0A, 0xA8, 0x00, 0x00}; // NALU type 10
SrsSample sample_eos((char *)data_eos, sizeof(data_eos));
SrsNaluSample sample_eos((char *)data_eos, sizeof(data_eos));
is_b_frame = true;
HELPER_EXPECT_SUCCESS(SrsVideoFrame::parse_avc_bframe(&sample_eos, is_b_frame));
HELPER_EXPECT_SUCCESS(SrsParsedVideoPacket::parse_avc_bframe(&sample_eos, is_b_frame));
EXPECT_FALSE(is_b_frame);
// End of Stream NALU (type 11) - cannot contain B-frames
uint8_t data_eost[] = {0x0B, 0xA8, 0x00, 0x00}; // NALU type 11
SrsSample sample_eost((char *)data_eost, sizeof(data_eost));
SrsNaluSample sample_eost((char *)data_eost, sizeof(data_eost));
is_b_frame = true;
HELPER_EXPECT_SUCCESS(SrsVideoFrame::parse_avc_bframe(&sample_eost, is_b_frame));
HELPER_EXPECT_SUCCESS(SrsParsedVideoPacket::parse_avc_bframe(&sample_eost, is_b_frame));
EXPECT_FALSE(is_b_frame);
// Filler Data NALU (type 12) - cannot contain B-frames
uint8_t data_filler[] = {0x0C, 0xA8, 0x00, 0x00}; // NALU type 12
SrsSample sample_filler((char *)data_filler, sizeof(data_filler));
SrsNaluSample sample_filler((char *)data_filler, sizeof(data_filler));
is_b_frame = true;
HELPER_EXPECT_SUCCESS(SrsVideoFrame::parse_avc_bframe(&sample_filler, is_b_frame));
HELPER_EXPECT_SUCCESS(SrsParsedVideoPacket::parse_avc_bframe(&sample_filler, is_b_frame));
EXPECT_FALSE(is_b_frame);
// SPS Extension NALU (type 13) - cannot contain B-frames
uint8_t data_sps_ext[] = {0x0D, 0xA8, 0x00, 0x00}; // NALU type 13
SrsSample sample_sps_ext((char *)data_sps_ext, sizeof(data_sps_ext));
SrsNaluSample sample_sps_ext((char *)data_sps_ext, sizeof(data_sps_ext));
is_b_frame = true;
HELPER_EXPECT_SUCCESS(SrsVideoFrame::parse_avc_bframe(&sample_sps_ext, is_b_frame));
HELPER_EXPECT_SUCCESS(SrsParsedVideoPacket::parse_avc_bframe(&sample_sps_ext, is_b_frame));
EXPECT_FALSE(is_b_frame);
// Prefix NALU (type 14) - cannot contain B-frames
uint8_t data_prefix[] = {0x0E, 0xA8, 0x00, 0x00}; // NALU type 14
SrsSample sample_prefix((char *)data_prefix, sizeof(data_prefix));
SrsNaluSample sample_prefix((char *)data_prefix, sizeof(data_prefix));
is_b_frame = true;
HELPER_EXPECT_SUCCESS(SrsVideoFrame::parse_avc_bframe(&sample_prefix, is_b_frame));
HELPER_EXPECT_SUCCESS(SrsParsedVideoPacket::parse_avc_bframe(&sample_prefix, is_b_frame));
EXPECT_FALSE(is_b_frame);
// Subset SPS NALU (type 15) - cannot contain B-frames
uint8_t data_subset_sps[] = {0x0F, 0xA8, 0x00, 0x00}; // NALU type 15
SrsSample sample_subset_sps((char *)data_subset_sps, sizeof(data_subset_sps));
SrsNaluSample sample_subset_sps((char *)data_subset_sps, sizeof(data_subset_sps));
is_b_frame = true;
HELPER_EXPECT_SUCCESS(SrsVideoFrame::parse_avc_bframe(&sample_subset_sps, is_b_frame));
HELPER_EXPECT_SUCCESS(SrsParsedVideoPacket::parse_avc_bframe(&sample_subset_sps, is_b_frame));
EXPECT_FALSE(is_b_frame);
// Layer Without Partition NALU (type 19) - cannot contain B-frames
uint8_t data_layer[] = {0x13, 0xA8, 0x00, 0x00}; // NALU type 19
SrsSample sample_layer((char *)data_layer, sizeof(data_layer));
SrsNaluSample sample_layer((char *)data_layer, sizeof(data_layer));
is_b_frame = true;
HELPER_EXPECT_SUCCESS(SrsVideoFrame::parse_avc_bframe(&sample_layer, is_b_frame));
HELPER_EXPECT_SUCCESS(SrsParsedVideoPacket::parse_avc_bframe(&sample_layer, is_b_frame));
EXPECT_FALSE(is_b_frame);
// Coded Slice Extension NALU (type 20) - cannot contain B-frames
uint8_t data_slice_ext[] = {0x14, 0xA8, 0x00, 0x00}; // NALU type 20
SrsSample sample_slice_ext((char *)data_slice_ext, sizeof(data_slice_ext));
SrsNaluSample sample_slice_ext((char *)data_slice_ext, sizeof(data_slice_ext));
is_b_frame = true;
HELPER_EXPECT_SUCCESS(SrsVideoFrame::parse_avc_bframe(&sample_slice_ext, is_b_frame));
HELPER_EXPECT_SUCCESS(SrsParsedVideoPacket::parse_avc_bframe(&sample_slice_ext, is_b_frame));
EXPECT_FALSE(is_b_frame);
}
// Test edge cases and error conditions
if (true) {
// Empty Sample - should fail
SrsSample empty_sample(NULL, 0);
SrsNaluSample empty_sample(NULL, 0);
bool is_b_frame = false;
HELPER_EXPECT_FAILED(SrsVideoFrame::parse_avc_bframe(&empty_sample, is_b_frame));
HELPER_EXPECT_FAILED(SrsParsedVideoPacket::parse_avc_bframe(&empty_sample, is_b_frame));
// Sample too small for slice parsing (only NALU header) - should fail for slice types
uint8_t data_small[] = {0x01}; // NALU type 1, but no slice data
SrsSample sample_small((char *)data_small, sizeof(data_small));
SrsNaluSample sample_small((char *)data_small, sizeof(data_small));
is_b_frame = false;
HELPER_EXPECT_FAILED(SrsVideoFrame::parse_avc_bframe(&sample_small, is_b_frame));
HELPER_EXPECT_FAILED(SrsParsedVideoPacket::parse_avc_bframe(&sample_small, is_b_frame));
// Test basic slice types for NonIDR NALU using known working patterns
// P frame (slice_type=0)
uint8_t data_p[] = {0x01, 0x88, 0x00, 0x00}; // slice_type=0
SrsSample sample_p((char *)data_p, sizeof(data_p));
SrsNaluSample sample_p((char *)data_p, sizeof(data_p));
is_b_frame = true;
HELPER_EXPECT_SUCCESS(SrsVideoFrame::parse_avc_bframe(&sample_p, is_b_frame));
HELPER_EXPECT_SUCCESS(SrsParsedVideoPacket::parse_avc_bframe(&sample_p, is_b_frame));
EXPECT_FALSE(is_b_frame);
// B frame (slice_type=1)
uint8_t data_b[] = {0x01, 0xA8, 0x00, 0x00}; // slice_type=1
SrsSample sample_b((char *)data_b, sizeof(data_b));
SrsNaluSample sample_b((char *)data_b, sizeof(data_b));
is_b_frame = false;
HELPER_EXPECT_SUCCESS(SrsVideoFrame::parse_avc_bframe(&sample_b, is_b_frame));
HELPER_EXPECT_SUCCESS(SrsParsedVideoPacket::parse_avc_bframe(&sample_b, is_b_frame));
EXPECT_TRUE(is_b_frame);
// I frame (slice_type=2)
uint8_t data_i[] = {0x01, 0x98, 0x00, 0x00}; // slice_type=2
SrsSample sample_i((char *)data_i, sizeof(data_i));
SrsNaluSample sample_i((char *)data_i, sizeof(data_i));
is_b_frame = true;
HELPER_EXPECT_SUCCESS(SrsVideoFrame::parse_avc_bframe(&sample_i, is_b_frame));
HELPER_EXPECT_SUCCESS(SrsParsedVideoPacket::parse_avc_bframe(&sample_i, is_b_frame));
EXPECT_FALSE(is_b_frame);
}
}
@ -3942,47 +3948,47 @@ VOID TEST(KernelCodecTest, VideoFrameH265)
if (true) {
// I Frame
uint8_t data[] = {0x26, 0x01, 0x00, 0x00};
SrsSample sample((char *)data, sizeof(data));
SrsNaluSample sample((char *)data, sizeof(data));
SrsHevcNaluType nalu_type = SrsHevcNaluType_INVALID;
HELPER_EXPECT_SUCCESS(SrsVideoFrame::parse_hevc_nalu_type(&sample, nalu_type));
HELPER_EXPECT_SUCCESS(SrsParsedVideoPacket::parse_hevc_nalu_type(&sample, nalu_type));
EXPECT_EQ(nalu_type, SrsHevcNaluType_CODED_SLICE_IDR);
// P Frame
uint8_t data2[] = {0x02, 0x01, 0x00, 0x00};
SrsSample sample2((char *)data2, sizeof(data2));
SrsNaluSample sample2((char *)data2, sizeof(data2));
nalu_type = SrsHevcNaluType_INVALID;
HELPER_EXPECT_SUCCESS(SrsVideoFrame::parse_hevc_nalu_type(&sample2, nalu_type));
HELPER_EXPECT_SUCCESS(SrsParsedVideoPacket::parse_hevc_nalu_type(&sample2, nalu_type));
EXPECT_EQ(nalu_type, SrsHevcNaluType_CODED_SLICE_TRAIL_R);
// VPS
uint8_t data3[] = {0x40, 0x01, 0x00, 0x00};
SrsSample sample3((char *)data3, sizeof(data3));
SrsNaluSample sample3((char *)data3, sizeof(data3));
nalu_type = SrsHevcNaluType_INVALID;
HELPER_EXPECT_SUCCESS(SrsVideoFrame::parse_hevc_nalu_type(&sample3, nalu_type));
HELPER_EXPECT_SUCCESS(SrsParsedVideoPacket::parse_hevc_nalu_type(&sample3, nalu_type));
EXPECT_EQ(nalu_type, SrsHevcNaluType_VPS);
// SPS
uint8_t data4[] = {0x42, 0x01, 0x00, 0x00};
SrsSample sample4((char *)data4, sizeof(data4));
SrsNaluSample sample4((char *)data4, sizeof(data4));
nalu_type = SrsHevcNaluType_INVALID;
HELPER_EXPECT_SUCCESS(SrsVideoFrame::parse_hevc_nalu_type(&sample4, nalu_type));
HELPER_EXPECT_SUCCESS(SrsParsedVideoPacket::parse_hevc_nalu_type(&sample4, nalu_type));
EXPECT_EQ(nalu_type, SrsHevcNaluType_SPS);
// PPS
uint8_t data5[] = {0x44, 0x01, 0x00, 0x00};
SrsSample sample5((char *)data5, sizeof(data5));
SrsNaluSample sample5((char *)data5, sizeof(data5));
nalu_type = SrsHevcNaluType_INVALID;
HELPER_EXPECT_SUCCESS(SrsVideoFrame::parse_hevc_nalu_type(&sample5, nalu_type));
HELPER_EXPECT_SUCCESS(SrsParsedVideoPacket::parse_hevc_nalu_type(&sample5, nalu_type));
EXPECT_EQ(nalu_type, SrsHevcNaluType_PPS);
// Empty Sample
SrsSample empty_sample(NULL, 0);
HELPER_EXPECT_FAILED(SrsVideoFrame::parse_hevc_nalu_type(&empty_sample, nalu_type));
SrsNaluSample empty_sample(NULL, 0);
HELPER_EXPECT_FAILED(SrsParsedVideoPacket::parse_hevc_nalu_type(&empty_sample, nalu_type));
}
if (true) {
@ -3991,55 +3997,55 @@ VOID TEST(KernelCodecTest, VideoFrameH265)
// B Frame, slice_type=0(B Frame)
uint8_t data[] = {0x02, 0x01, 0xE0, 0x44};
SrsSample sample((char *)data, sizeof(data));
SrsNaluSample sample((char *)data, sizeof(data));
bool is_b_frame = false;
HELPER_EXPECT_SUCCESS(SrsVideoFrame::parse_hevc_bframe(&sample, &format, is_b_frame));
HELPER_EXPECT_SUCCESS(SrsParsedVideoPacket::parse_hevc_bframe(&sample, &format, is_b_frame));
EXPECT_TRUE(is_b_frame);
// Non-B Frame, slice_type=1(P Frame)
uint8_t data2[] = {0x02, 0x01, 0xD0, 0x30};
SrsSample sample2((char *)data2, sizeof(data2));
SrsNaluSample sample2((char *)data2, sizeof(data2));
is_b_frame = true;
HELPER_EXPECT_SUCCESS(SrsVideoFrame::parse_hevc_bframe(&sample2, &format, is_b_frame));
HELPER_EXPECT_SUCCESS(SrsParsedVideoPacket::parse_hevc_bframe(&sample2, &format, is_b_frame));
EXPECT_FALSE(is_b_frame);
// VPS
uint8_t data3[] = {0x40, 0x01, 0xE0, 0x44};
SrsSample sample3((char *)data3, sizeof(data3));
SrsNaluSample sample3((char *)data3, sizeof(data3));
is_b_frame = true;
HELPER_EXPECT_SUCCESS(SrsVideoFrame::parse_hevc_bframe(&sample3, &format, is_b_frame));
HELPER_EXPECT_SUCCESS(SrsParsedVideoPacket::parse_hevc_bframe(&sample3, &format, is_b_frame));
EXPECT_FALSE(is_b_frame);
// SPS
uint8_t data4[] = {0x42, 0x01, 0xE0, 0x44};
SrsSample sample4((char *)data4, sizeof(data4));
SrsNaluSample sample4((char *)data4, sizeof(data4));
is_b_frame = true;
HELPER_EXPECT_SUCCESS(SrsVideoFrame::parse_hevc_bframe(&sample4, &format, is_b_frame));
HELPER_EXPECT_SUCCESS(SrsParsedVideoPacket::parse_hevc_bframe(&sample4, &format, is_b_frame));
EXPECT_FALSE(is_b_frame);
// PPS
uint8_t data5[] = {0x44, 0x01, 0xE0, 0x44};
SrsSample sample5((char *)data5, sizeof(data5));
SrsNaluSample sample5((char *)data5, sizeof(data5));
is_b_frame = true;
HELPER_EXPECT_SUCCESS(SrsVideoFrame::parse_hevc_bframe(&sample5, &format, is_b_frame));
HELPER_EXPECT_SUCCESS(SrsParsedVideoPacket::parse_hevc_bframe(&sample5, &format, is_b_frame));
EXPECT_FALSE(is_b_frame);
// IDR
uint8_t data6[] = {0x26, 0x01, 0xE0, 0x44};
SrsSample sample6((char *)data6, sizeof(data6));
SrsNaluSample sample6((char *)data6, sizeof(data6));
is_b_frame = true;
HELPER_EXPECT_SUCCESS(SrsVideoFrame::parse_hevc_bframe(&sample6, &format, is_b_frame));
HELPER_EXPECT_SUCCESS(SrsParsedVideoPacket::parse_hevc_bframe(&sample6, &format, is_b_frame));
EXPECT_FALSE(is_b_frame);
// Empty Sample
SrsSample empty_sample(NULL, 0);
HELPER_EXPECT_FAILED(SrsVideoFrame::parse_hevc_bframe(&empty_sample, &format, is_b_frame));
SrsNaluSample empty_sample(NULL, 0);
HELPER_EXPECT_FAILED(SrsParsedVideoPacket::parse_hevc_bframe(&empty_sample, &format, is_b_frame));
}
}
@ -4050,7 +4056,7 @@ VOID TEST(KernelCodecTest, IsSequenceHeaderSpecial)
EXPECT_FALSE(f.is_avc_sequence_header());
f.vcodec = new SrsVideoCodecConfig();
f.video = new SrsVideoFrame();
f.video = new SrsParsedVideoPacket();
EXPECT_FALSE(f.is_avc_sequence_header());
f.vcodec->id = SrsVideoCodecIdAVC;
@ -4065,7 +4071,7 @@ VOID TEST(KernelCodecTest, IsSequenceHeaderSpecial)
EXPECT_FALSE(f.is_avc_sequence_header());
f.vcodec = new SrsVideoCodecConfig();
f.video = new SrsVideoFrame();
f.video = new SrsParsedVideoPacket();
EXPECT_FALSE(f.is_avc_sequence_header());
f.vcodec->id = SrsVideoCodecIdHEVC;
@ -5289,8 +5295,8 @@ VOID TEST(KernelFLVTest, CoverAll)
EXPECT_EQ(30, m.header.timestamp_delta);
EXPECT_EQ(30, m.header.timestamp);
SrsSharedPtrMessage s;
HELPER_EXPECT_SUCCESS(s.create(&m));
SrsMediaPacket s;
m.to_msg(&s);
EXPECT_TRUE(s.is_av());
EXPECT_TRUE(!s.is_audio());
EXPECT_TRUE(s.is_video());
@ -5304,10 +5310,12 @@ VOID TEST(KernelFLVTest, CoverAll)
SrsMessageHeader h;
h.initialize_video(10, 30, 20);
SrsSharedPtrMessage m;
HELPER_EXPECT_SUCCESS(m.create(&h, new char[1], 1));
SrsMediaPacket m;
SrsCommonMessage common_msg;
HELPER_EXPECT_SUCCESS(common_msg.create(&h, new char[1], 1));
common_msg.to_msg(&m);
SrsSharedPtrMessage *msgs = &m;
SrsMediaPacket *msgs = &m;
HELPER_EXPECT_SUCCESS(mux.write_tags(&msgs, 1));
EXPECT_EQ(16, f.tellg());
@ -5320,28 +5328,34 @@ VOID TEST(KernelFLVTest, CoverSharedPtrMessage)
if (true) {
SrsMessageHeader h;
SrsSharedPtrMessage m;
HELPER_EXPECT_SUCCESS(m.create(&h, new char[1], 1));
SrsMediaPacket m;
SrsCommonMessage common_msg;
HELPER_EXPECT_SUCCESS(common_msg.create(&h, new char[1], 1));
common_msg.to_msg(&m);
}
if (true) {
SrsMessageHeader h;
SrsSharedPtrMessage m;
HELPER_EXPECT_SUCCESS(m.create(&h, NULL, 0));
SrsMediaPacket m;
SrsCommonMessage common_msg;
HELPER_EXPECT_SUCCESS(common_msg.create(&h, NULL, 0));
common_msg.to_msg(&m);
}
if (true) {
SrsMessageHeader h;
SrsSharedPtrMessage m;
HELPER_EXPECT_FAILED(m.create(&h, NULL, -1));
SrsMediaPacket m;
SrsCommonMessage common_msg;
HELPER_EXPECT_FAILED(common_msg.create(&h, NULL, -1));
}
if (true) {
SrsMessageHeader h;
h.prefer_cid = 1;
SrsSharedPtrMessage m;
HELPER_EXPECT_SUCCESS(m.create(&h, NULL, 0));
SrsMediaPacket m;
SrsCommonMessage common_msg;
HELPER_EXPECT_SUCCESS(common_msg.create(&h, NULL, 0));
common_msg.to_msg(&m);
EXPECT_FALSE(m.check(1));
EXPECT_TRUE(m.check(1));

View File

@ -896,9 +896,11 @@ VOID TEST(ProtocolMsgArrayTest, MessageArray)
srs_error_t err = srs_success;
SrsMessageHeader header;
SrsSharedPtrMessage msg;
SrsMediaPacket msg;
char *payload = new char[1024];
HELPER_EXPECT_SUCCESS(msg.create(&header, payload, 1024));
SrsCommonMessage common_msg;
HELPER_EXPECT_SUCCESS(common_msg.create(&header, payload, 1024));
common_msg.to_msg(&msg);
if (true) {
SrsMessageArray arr(3);
@ -1012,9 +1014,9 @@ VOID TEST(ProtocolStackTest, ProtocolRecvMessage)
HELPER_ASSERT_SUCCESS(proto.recv_message(&msg));
SrsUniquePtr<SrsCommonMessage> msg_uptr(msg);
SrsPacket *pkt = NULL;
SrsRtmpCommand *pkt = NULL;
HELPER_EXPECT_SUCCESS(proto.decode_message(msg, &pkt));
SrsUniquePtr<SrsPacket> pkt_uptr(pkt);
SrsUniquePtr<SrsRtmpCommand> pkt_uptr(pkt);
SrsConnectAppPacket *spkt = dynamic_cast<SrsConnectAppPacket *>(pkt);
ASSERT_TRUE(NULL != spkt);
@ -1049,9 +1051,9 @@ VOID TEST(ProtocolStackTest, ProtocolRecvMessageBug98)
HELPER_ASSERT_SUCCESS(proto.recv_message(&msg));
SrsUniquePtr<SrsCommonMessage> msg_uptr(msg);
SrsPacket *pkt = NULL;
SrsRtmpCommand *pkt = NULL;
HELPER_EXPECT_SUCCESS(proto.decode_message(msg, &pkt));
SrsUniquePtr<SrsPacket> pkt_uptr(pkt);
SrsUniquePtr<SrsRtmpCommand> pkt_uptr(pkt);
SrsUserControlPacket *spkt = dynamic_cast<SrsUserControlPacket *>(pkt);
ASSERT_TRUE(NULL != spkt);
@ -1085,9 +1087,9 @@ VOID TEST(ProtocolStackTest, ProtocolRecvAckSizeMessage)
HELPER_ASSERT_SUCCESS(proto.recv_message(&msg));
SrsUniquePtr<SrsCommonMessage> msg_uptr(msg);
SrsPacket *pkt = NULL;
SrsRtmpCommand *pkt = NULL;
HELPER_EXPECT_SUCCESS(proto.decode_message(msg, &pkt));
SrsUniquePtr<SrsPacket> pkt_uptr(pkt);
SrsUniquePtr<SrsRtmpCommand> pkt_uptr(pkt);
SrsSetWindowAckSizePacket *spkt = dynamic_cast<SrsSetWindowAckSizePacket *>(pkt);
ASSERT_TRUE(NULL != spkt);
@ -3765,8 +3767,6 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVCid1BNormal)
HELPER_ASSERT_SUCCESS(proto.recv_message(&msg));
SrsUniquePtr<SrsCommonMessage> msg_uptr(msg);
EXPECT_TRUE(msg->header.is_video());
// 1B cid(6bits), cid in 2-63
EXPECT_EQ(0x09, msg->header.prefer_cid);
}
/**
@ -3817,8 +3817,6 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVCid1BMax)
HELPER_ASSERT_SUCCESS(proto.recv_message(&msg));
SrsUniquePtr<SrsCommonMessage> msg_uptr(msg);
EXPECT_TRUE(msg->header.is_video());
// 1B cid(6bits), max is 63
EXPECT_EQ(0x3F, msg->header.prefer_cid);
}
/**
@ -3869,8 +3867,6 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVCid2BMin)
HELPER_ASSERT_SUCCESS(proto.recv_message(&msg));
SrsUniquePtr<SrsCommonMessage> msg_uptr(msg);
EXPECT_TRUE(msg->header.is_video());
// 2B cid(8bits), min is 64
EXPECT_EQ(64, msg->header.prefer_cid);
}
/**
@ -3921,8 +3917,6 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVCid2BNormal)
HELPER_ASSERT_SUCCESS(proto.recv_message(&msg));
SrsUniquePtr<SrsCommonMessage> msg_uptr(msg);
EXPECT_TRUE(msg->header.is_video());
// 2B cid(8bits), cid in 64-319
EXPECT_EQ(0x10 + 64, msg->header.prefer_cid);
}
/**
@ -3973,8 +3967,6 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVCid2BNormal2)
HELPER_ASSERT_SUCCESS(proto.recv_message(&msg));
SrsUniquePtr<SrsCommonMessage> msg_uptr(msg);
EXPECT_TRUE(msg->header.is_video());
// 2B cid(8bits), cid in 64-319
EXPECT_EQ(0x11 + 64, msg->header.prefer_cid);
}
/**
@ -4025,8 +4017,6 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVCid2BMax)
HELPER_ASSERT_SUCCESS(proto.recv_message(&msg));
SrsUniquePtr<SrsCommonMessage> msg_uptr(msg);
EXPECT_TRUE(msg->header.is_video());
// 2B cid(68bits), max is 319
EXPECT_EQ(319, msg->header.prefer_cid);
}
/**
@ -4077,8 +4067,6 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVCid3BMin)
HELPER_ASSERT_SUCCESS(proto.recv_message(&msg));
SrsUniquePtr<SrsCommonMessage> msg_uptr(msg);
EXPECT_TRUE(msg->header.is_video());
// 3B cid(16bits), min is 64
EXPECT_EQ(64, msg->header.prefer_cid);
}
/**
@ -4129,8 +4117,6 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVCid3BNormal)
HELPER_ASSERT_SUCCESS(proto.recv_message(&msg));
SrsUniquePtr<SrsCommonMessage> msg_uptr(msg);
EXPECT_TRUE(msg->header.is_video());
// 3B cid(16bits), cid in 64-65599
EXPECT_EQ(0x10 * 256 + 64, msg->header.prefer_cid);
}
/**
@ -4181,8 +4167,6 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVCid3BNormal2)
HELPER_ASSERT_SUCCESS(proto.recv_message(&msg));
SrsUniquePtr<SrsCommonMessage> msg_uptr(msg);
EXPECT_TRUE(msg->header.is_video());
// 3B cid(16bits), cid in 64-65599
EXPECT_EQ(0x01 + (0x10 * 256) + 64, msg->header.prefer_cid);
}
/**
@ -4233,8 +4217,6 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVCid3BNormal3)
HELPER_ASSERT_SUCCESS(proto.recv_message(&msg));
SrsUniquePtr<SrsCommonMessage> msg_uptr(msg);
EXPECT_TRUE(msg->header.is_video());
// 3B cid(16bits), cid in 64-65599
EXPECT_EQ(0xFF + (0x10 * 256) + 64, msg->header.prefer_cid);
}
/**
@ -4285,8 +4267,6 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVCid3BNormal4)
HELPER_ASSERT_SUCCESS(proto.recv_message(&msg));
SrsUniquePtr<SrsCommonMessage> msg_uptr(msg);
EXPECT_TRUE(msg->header.is_video());
// 3B cid(16bits), cid in 64-65599
EXPECT_EQ(0x02 + (0x10 * 256) + 64, msg->header.prefer_cid);
}
/**
@ -4337,8 +4317,6 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVCid3BMax)
HELPER_ASSERT_SUCCESS(proto.recv_message(&msg));
SrsUniquePtr<SrsCommonMessage> msg_uptr(msg);
EXPECT_TRUE(msg->header.is_video());
// 2B cid(16bits), max is 65599
EXPECT_EQ(65599, msg->header.prefer_cid);
}
/**
@ -4397,8 +4375,8 @@ VOID TEST(ProtocolStackTest, ProtocolSendVMessage)
msg->create_payload(sizeof(data));
memcpy(msg->payload(), data, sizeof(data));
SrsSharedPtrMessage m;
HELPER_ASSERT_SUCCESS(m.create(msg));
SrsMediaPacket m;
msg->to_msg(&m);
HELPER_EXPECT_SUCCESS(proto.send_and_free_message(m.copy(), 0));
EXPECT_EQ(16, bio.out_buffer.length());
@ -4427,7 +4405,7 @@ VOID TEST(ProtocolStackTest, ProtocolSendSrsCallPacket)
HELPER_EXPECT_SUCCESS(proto.send_and_free_packet(pkt, 0));
char buf[] = {
0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x14,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x14,
0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x07, 0x6d,
0x79, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05,
@ -4470,7 +4448,7 @@ VOID TEST(ProtocolStackTest, ProtocolSendSrsCallResPacket)
HELPER_EXPECT_SUCCESS(proto.send_and_free_packet(pkt, 0));
char buf[] = {
0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x14,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x14,
0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x07, 0x5f,
0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05,
@ -4505,7 +4483,7 @@ VOID TEST(ProtocolStackTest, ProtocolSendSrsCreateStreamPacket)
HELPER_EXPECT_SUCCESS(proto.send_and_free_packet(pkt, 0));
char buf[] = {
0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x14,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x14,
0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0c, 0x63,
0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x74, 0x72,
0x65, 0x61, 0x6d, 0x00, 0x40, 0x00, 0x00, 0x00,
@ -4530,7 +4508,7 @@ VOID TEST(ProtocolStackTest, ProtocolSendSrsFMLEStartPacket)
HELPER_EXPECT_SUCCESS(proto.send_and_free_packet(pkt, 0));
char buf[] = {
0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x14,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x14,
0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x09, 0x46,
0x4d, 0x4c, 0x45, 0x53, 0x74, 0x61, 0x72, 0x74,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@ -4561,7 +4539,7 @@ VOID TEST(ProtocolStackTest, ProtocolSendSrsFMLEStartResPacket)
HELPER_EXPECT_SUCCESS(proto.send_and_free_packet(pkt, 0));
uint8_t buf[] = {
0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x14,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x14,
0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x09, 0x46,
0x4d, 0x4c, 0x45, 0x53, 0x74, 0x61, 0x72, 0x74,
0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00,
@ -4648,7 +4626,7 @@ VOID TEST(ProtocolStackTest, ProtocolSendSrsOnBWDonePacket)
HELPER_EXPECT_SUCCESS(proto.send_and_free_packet(pkt, 0));
char buf[] = {
0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x14,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x14,
0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x6f,
0x6e, 0x42, 0x57, 0x44, 0x6f, 0x6e, 0x65, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@ -4724,16 +4702,16 @@ VOID TEST(ProtocolStackTest, ProtocolSendSrsOnStatusDataPacket)
}
/**
* send a SrsSampleAccessPacket packet
* send a SrsNaluSampleAccessPacket packet
*/
VOID TEST(ProtocolStackTest, ProtocolSendSrsSampleAccessPacket)
VOID TEST(ProtocolStackTest, ProtocolSendSrsNaluSampleAccessPacket)
{
srs_error_t err = srs_success;
MockBufferIO bio;
SrsProtocol proto(&bio);
SrsSampleAccessPacket *pkt = new SrsSampleAccessPacket();
SrsNaluSampleAccessPacket *pkt = new SrsNaluSampleAccessPacket();
pkt->command_name = "|RtmpSampleAccess";
pkt->video_sample_access = true;
pkt->audio_sample_access = true;
@ -4769,7 +4747,7 @@ VOID TEST(ProtocolStackTest, ProtocolSendSrsOnMetaDataPacket)
HELPER_EXPECT_SUCCESS(proto.send_and_free_packet(pkt, 0));
uint8_t buf[] = {
0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x12,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x12,
0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0a, 0x6f,
0x6e, 0x4d, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74,
0x61, 0x03, 0x00, 0x05, 0x77, 0x69, 0x64, 0x74,
@ -4795,7 +4773,7 @@ VOID TEST(ProtocolStackTest, ProtocolSendSrsSetWindowAckSizePacket)
HELPER_EXPECT_SUCCESS(proto.send_and_free_packet(pkt, 0));
uint8_t buf[] = {
0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x05,
0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x05,
0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x90, 0x00};
EXPECT_TRUE(srs_bytes_equal(bio.out_buffer.bytes(), (char *)buf, sizeof(buf)));
}
@ -4815,7 +4793,7 @@ VOID TEST(ProtocolStackTest, ProtocolSendSrsAcknowledgementPacket)
HELPER_EXPECT_SUCCESS(proto.send_and_free_packet(pkt, 0));
char buf[] = {
0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03,
0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00};
EXPECT_TRUE(srs_bytes_equal(bio.out_buffer.bytes(), buf, sizeof(buf)));
}
@ -4835,7 +4813,7 @@ VOID TEST(ProtocolStackTest, ProtocolSendSrsSetChunkSizePacket)
HELPER_EXPECT_SUCCESS(proto.send_and_free_packet(pkt, 0));
char buf[] = {
0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x01,
0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x01,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00};
EXPECT_TRUE(srs_bytes_equal(bio.out_buffer.bytes(), buf, sizeof(buf)));
}
@ -4856,7 +4834,7 @@ VOID TEST(ProtocolStackTest, ProtocolSendSrsSetPeerBandwidthPacket)
HELPER_EXPECT_SUCCESS(proto.send_and_free_packet(pkt, 0));
char buf[] = {
0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x06,
0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x06,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00,
0x01};
EXPECT_TRUE(srs_bytes_equal(bio.out_buffer.bytes(), buf, sizeof(buf)));
@ -4879,7 +4857,7 @@ VOID TEST(ProtocolStackTest, ProtocolSendSrsUserControlPacket)
HELPER_EXPECT_SUCCESS(proto.send_and_free_packet(pkt, 0));
char buf[] = {
0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04,
0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04,
0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00,
0x00, 0x01, 0x00, 0x00, 0x00, 0x10};
@ -4961,8 +4939,8 @@ VOID TEST(ProtocolStackTest, ProtocolAckSizeFlow)
msg->header.message_type = 9;
EXPECT_TRUE(msg->header.is_video());
SrsSharedPtrMessage m;
HELPER_ASSERT_SUCCESS(m.create(msg));
SrsMediaPacket m;
msg->to_msg(&m);
HELPER_EXPECT_SUCCESS(proto.send_and_free_message(m.copy(), 1));
}
@ -5011,8 +4989,8 @@ VOID TEST(ProtocolStackTest, ProtocolAckSizeFlow)
msg->header.message_type = 9;
EXPECT_TRUE(msg->header.is_video());
SrsSharedPtrMessage m;
HELPER_ASSERT_SUCCESS(m.create(msg));
SrsMediaPacket m;
msg->to_msg(&m);
HELPER_EXPECT_SUCCESS(proto.send_and_free_message(m.copy(), 1));
}
@ -5086,9 +5064,9 @@ VOID TEST(ProtocolStackTest, ProtocolPingFlow)
SrsUniquePtr<SrsCommonMessage> msg_uptr(msg);
ASSERT_TRUE(msg->header.is_user_control_message());
SrsPacket *pkt = NULL;
SrsRtmpCommand *pkt = NULL;
HELPER_ASSERT_SUCCESS(proto.decode_message(msg, &pkt));
SrsUniquePtr<SrsPacket> pkt_uptr(pkt);
SrsUniquePtr<SrsRtmpCommand> pkt_uptr(pkt);
SrsUserControlPacket *spkt = dynamic_cast<SrsUserControlPacket *>(pkt);
ASSERT_TRUE(spkt != NULL);

View File

@ -4269,8 +4269,6 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVCid1BMin)
SrsUniquePtr<SrsCommonMessage> msg(msg_raw);
EXPECT_TRUE(msg->header.is_video());
// 1B cid(6bits), min is 2
EXPECT_EQ(0x02, msg->header.prefer_cid);
}
VOID TEST(ProtocolKbpsTest, Connections)

View File

@ -2344,21 +2344,21 @@ VOID TEST(KernelRTCTest, H265RtpSTAPPayload)
SrsRtpSTAPPayloadHevc stap;
// Create sample VPS NALU
SrsSample *vps = new SrsSample();
SrsNaluSample *vps = new SrsNaluSample();
uint8_t vps_data[] = {0x40, 0x01, 0x0c, 0x01, 0xff, 0xff, 0x01, 0x60, 0x00, 0x00, 0x03, 0x00, 0x90, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x3d, 0x95, 0x98, 0x09};
vps->bytes = (char *)vps_data;
vps->size = sizeof(vps_data);
stap.nalus.push_back(vps);
// Create sample SPS NALU
SrsSample *sps = new SrsSample();
SrsNaluSample *sps = new SrsNaluSample();
uint8_t sps_data[] = {0x42, 0x01, 0x01, 0x01, 0x60, 0x00, 0x00, 0x03, 0x00, 0x90, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x3d, 0xa0, 0x02, 0x80, 0x80, 0x2d, 0x16, 0x59, 0x59, 0xa4, 0x93, 0x2b, 0xc0, 0x5a, 0x70, 0x80, 0x80, 0x80, 0x82};
sps->bytes = (char *)sps_data;
sps->size = sizeof(sps_data);
stap.nalus.push_back(sps);
// Create sample PPS NALU
SrsSample *pps = new SrsSample();
SrsNaluSample *pps = new SrsNaluSample();
uint8_t pps_data[] = {0x44, 0x01, 0xc1, 0x72, 0xb4, 0x62, 0x40};
pps->bytes = (char *)pps_data;
pps->size = sizeof(pps_data);
@ -2383,17 +2383,17 @@ VOID TEST(KernelRTCTest, H265RtpSTAPPayload)
EXPECT_EQ(3, (int)decode_stap.nalus.size());
// Check VPS
SrsSample *decoded_vps = decode_stap.get_vps();
SrsNaluSample *decoded_vps = decode_stap.get_vps();
EXPECT_TRUE(decoded_vps != NULL);
EXPECT_EQ(sizeof(vps_data), (size_t)decoded_vps->size);
// Check SPS
SrsSample *decoded_sps = decode_stap.get_sps();
SrsNaluSample *decoded_sps = decode_stap.get_sps();
EXPECT_TRUE(decoded_sps != NULL);
EXPECT_EQ(sizeof(sps_data), (size_t)decoded_sps->size);
// Check PPS
SrsSample *decoded_pps = decode_stap.get_pps();
SrsNaluSample *decoded_pps = decode_stap.get_pps();
EXPECT_TRUE(decoded_pps != NULL);
EXPECT_EQ(sizeof(pps_data), (size_t)decoded_pps->size);
@ -2443,7 +2443,7 @@ VOID TEST(KernelRTCTest, H265RtpFUAPayload)
fua.nalu_type = SrsHevcNaluType_CODED_SLICE_IDR;
// Create sample payload data
SrsSample *sample = new SrsSample();
SrsNaluSample *sample = new SrsNaluSample();
uint8_t payload_data[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};
sample->bytes = (char *)payload_data;
sample->size = sizeof(payload_data);
@ -2576,7 +2576,7 @@ VOID TEST(KernelRTCTest, H265RtpPacketKeyframe)
pkt.set_payload(stap_payload, SrsRtpPacketPayloadTypeSTAPHevc);
// Create VPS NALU
SrsSample *vps = new SrsSample();
SrsNaluSample *vps = new SrsNaluSample();
uint8_t vps_data[] = {0x40, 0x01}; // VPS NALU header
vps->bytes = (char *)vps_data;
vps->size = sizeof(vps_data);
@ -2624,7 +2624,7 @@ VOID TEST(KernelRTCTest, H265RtpRawNALUsSkipBytes)
SrsRtpRawNALUs raw_nalus;
// Create sample HEVC NALU
SrsSample *sample = new SrsSample();
SrsNaluSample *sample = new SrsNaluSample();
uint8_t nalu_data[] = {0x26, 0x01, 0x12, 0x34, 0x56, 0x78}; // IDR slice
sample->bytes = (char *)nalu_data;
sample->size = sizeof(nalu_data);
@ -2635,7 +2635,7 @@ VOID TEST(KernelRTCTest, H265RtpRawNALUsSkipBytes)
EXPECT_EQ(0x26, header); // Should return first byte
// Verify remaining data
std::vector<SrsSample *> samples;
std::vector<SrsNaluSample *> samples;
HELPER_EXPECT_SUCCESS(raw_nalus.read_samples(samples, 4));
EXPECT_EQ(1, (int)samples.size());
EXPECT_EQ(4, samples[0]->size);
@ -2655,7 +2655,7 @@ VOID TEST(KernelRTCTest, H265RtpRawNALUsSkipBytes)
SrsRtpRawNALUs raw_nalus;
// Create sample H.264 NALU
SrsSample *sample = new SrsSample();
SrsNaluSample *sample = new SrsNaluSample();
uint8_t nalu_data[] = {0x65, 0x12, 0x34, 0x56}; // IDR slice
sample->bytes = (char *)nalu_data;
sample->size = sizeof(nalu_data);
@ -2666,7 +2666,7 @@ VOID TEST(KernelRTCTest, H265RtpRawNALUsSkipBytes)
EXPECT_EQ(0x65, header); // Should return first byte
// Verify remaining data
std::vector<SrsSample *> samples;
std::vector<SrsNaluSample *> samples;
HELPER_EXPECT_SUCCESS(raw_nalus.read_samples(samples, 3));
EXPECT_EQ(1, (int)samples.size());
EXPECT_EQ(3, samples[0]->size);

View File

@ -1543,7 +1543,7 @@ public:
return srs_success;
}
virtual srs_error_t on_frame(SrsSharedPtrMessage *frame)
virtual srs_error_t on_frame(SrsMediaPacket *frame)
{
frame_count++;
return srs_success;

View File

@ -22,7 +22,7 @@
using namespace std;
class MockPacket : public SrsPacket
class MockPacket : public SrsRtmpCommand
{
public:
int size;
@ -89,8 +89,7 @@ VOID TEST(ProtocolRTMPTest, PacketEncode)
}
if (true) {
SrsPacket pkt;
EXPECT_EQ(0, pkt.get_prefer_cid());
SrsRtmpCommand pkt;
EXPECT_EQ(0, pkt.get_message_type());
EXPECT_EQ(0, pkt.get_size());
}
@ -230,7 +229,7 @@ VOID TEST(ProtocolRTMPTest, SendPacketsError)
MockBufferIO io;
SrsProtocol p(&io);
SrsPacket *pkt = new SrsPacket();
SrsRtmpCommand *pkt = new SrsRtmpCommand();
HELPER_EXPECT_SUCCESS(p.send_and_free_packet(pkt, 1));
}
@ -251,11 +250,11 @@ VOID TEST(ProtocolRTMPTest, SendPacketsError)
pkt.header.initialize_audio(200, 1000, 1);
pkt.create_payload(256);
SrsSharedPtrMessage *msg = new SrsSharedPtrMessage();
msg->create(&pkt);
SrsUniquePtr<SrsSharedPtrMessage> msg_uptr(msg);
SrsMediaPacket *msg = new SrsMediaPacket();
pkt.to_msg(msg);
SrsUniquePtr<SrsMediaPacket> msg_uptr(msg);
SrsSharedPtrMessage *msgs[10240];
SrsMediaPacket *msgs[10240];
for (int i = 0; i < 10240; i++) {
msgs[i] = msg->copy();
}
@ -320,16 +319,16 @@ VOID TEST(ProtocolRTMPTest, SendZeroMessages)
if (true) {
MockBufferIO io;
SrsProtocol p(&io);
SrsSharedPtrMessage *msg = new SrsSharedPtrMessage();
SrsMediaPacket *msg = new SrsMediaPacket();
HELPER_EXPECT_SUCCESS(p.send_and_free_message(msg, 1));
}
if (true) {
MockBufferIO io;
SrsProtocol p(&io);
SrsSharedPtrMessage *msgs[1024];
SrsMediaPacket *msgs[1024];
for (int i = 0; i < 1024; i++) {
msgs[i] = new SrsSharedPtrMessage();
msgs[i] = new SrsMediaPacket();
}
HELPER_EXPECT_SUCCESS(p.send_and_free_messages(msgs, 1024, 0));
}
@ -346,8 +345,8 @@ VOID TEST(ProtocolRTMPTest, HugeMessages)
pkt.header.initialize_audio(200, 1000, 1);
pkt.create_payload(256);
SrsSharedPtrMessage *msg = new SrsSharedPtrMessage();
msg->create(&pkt);
SrsMediaPacket *msg = new SrsMediaPacket();
pkt.to_msg(msg);
HELPER_EXPECT_SUCCESS(p.send_and_free_message(msg, 1));
EXPECT_EQ(269, io.out_buffer.length());
@ -361,11 +360,11 @@ VOID TEST(ProtocolRTMPTest, HugeMessages)
pkt.header.initialize_audio(200, 1000, 1);
pkt.create_payload(256);
SrsSharedPtrMessage *msg = new SrsSharedPtrMessage();
msg->create(&pkt);
SrsUniquePtr<SrsSharedPtrMessage> msg_uptr(msg);
SrsMediaPacket *msg = new SrsMediaPacket();
pkt.to_msg(msg);
SrsUniquePtr<SrsMediaPacket> msg_uptr(msg);
SrsSharedPtrMessage *msgs[1024];
SrsMediaPacket *msgs[1024];
for (int i = 0; i < 1024; i++) {
msgs[i] = msg->copy();
}
@ -382,11 +381,11 @@ VOID TEST(ProtocolRTMPTest, HugeMessages)
pkt.header.initialize_audio(200, 1000, 1);
pkt.create_payload(256);
SrsSharedPtrMessage *msg = new SrsSharedPtrMessage();
msg->create(&pkt);
SrsUniquePtr<SrsSharedPtrMessage> msg_uptr(msg);
SrsMediaPacket *msg = new SrsMediaPacket();
pkt.to_msg(msg);
SrsUniquePtr<SrsMediaPacket> msg_uptr(msg);
SrsSharedPtrMessage *msgs[10240];
SrsMediaPacket *msgs[10240];
for (int i = 0; i < 10240; i++) {
msgs[i] = msg->copy();
}
@ -409,7 +408,7 @@ VOID TEST(ProtocolRTMPTest, DecodeMessages)
msg.header.initialize_amf0_script(1, 1);
msg.create_payload(1);
SrsPacket *pkt;
SrsRtmpCommand *pkt;
HELPER_EXPECT_FAILED(p.decode_message(&msg, &pkt));
}
}
@ -467,9 +466,9 @@ VOID TEST(ProtocolRTMPTest, OnDecodeMessages2)
SrsUniquePtr<SrsCommonMessage> msg_uptr(msg);
msg->header.message_type = RTMP_MSG_AMF3CommandMessage;
SrsPacket *pkt;
SrsRtmpCommand *pkt;
HELPER_EXPECT_SUCCESS(p.decode_message(msg, &pkt));
SrsUniquePtr<SrsPacket> pkt_uptr(pkt);
SrsUniquePtr<SrsRtmpCommand> pkt_uptr(pkt);
SrsCallPacket *call = (SrsCallPacket *)pkt;
EXPECT_STREQ("s", call->command_name.c_str());
@ -484,9 +483,9 @@ VOID TEST(ProtocolRTMPTest, OnDecodeMessages2)
SrsUniquePtr<SrsCommonMessage> msg_uptr(msg);
msg->header.message_type = RTMP_MSG_AMF3CommandMessage;
SrsPacket *pkt;
SrsRtmpCommand *pkt;
HELPER_EXPECT_FAILED(p.decode_message(msg, &pkt));
SrsUniquePtr<SrsPacket> pkt_uptr(pkt);
SrsUniquePtr<SrsRtmpCommand> pkt_uptr(pkt);
}
if (true) {
@ -498,9 +497,9 @@ VOID TEST(ProtocolRTMPTest, OnDecodeMessages2)
SrsUniquePtr<SrsCommonMessage> msg_uptr(msg);
msg->header.message_type = 0xff;
SrsPacket *pkt;
SrsRtmpCommand *pkt;
HELPER_EXPECT_SUCCESS(p.decode_message(msg, &pkt));
SrsUniquePtr<SrsPacket> pkt_uptr(pkt);
SrsUniquePtr<SrsRtmpCommand> pkt_uptr(pkt);
}
if (true) {
@ -512,9 +511,9 @@ VOID TEST(ProtocolRTMPTest, OnDecodeMessages2)
SrsUniquePtr<SrsCommonMessage> msg_uptr(msg);
msg->header.message_type = RTMP_MSG_AMF0DataMessage;
SrsPacket *pkt;
SrsRtmpCommand *pkt;
HELPER_EXPECT_SUCCESS(p.decode_message(msg, &pkt));
SrsUniquePtr<SrsPacket> pkt_uptr(pkt);
SrsUniquePtr<SrsRtmpCommand> pkt_uptr(pkt);
}
}
@ -531,10 +530,10 @@ VOID TEST(ProtocolRTMPTest, OnDecodeMessages3)
SrsUniquePtr<SrsCommonMessage> msg_uptr(msg);
msg->header.message_type = RTMP_MSG_AMF0DataMessage;
SrsPacket *pkt;
SrsRtmpCommand *pkt;
// Decode the response failed, no transaction ID was set by request.
HELPER_EXPECT_FAILED(p.decode_message(msg, &pkt));
SrsUniquePtr<SrsPacket> pkt_uptr(pkt);
SrsUniquePtr<SrsRtmpCommand> pkt_uptr(pkt);
}
if (true) {
@ -546,10 +545,10 @@ VOID TEST(ProtocolRTMPTest, OnDecodeMessages3)
SrsUniquePtr<SrsCommonMessage> msg_uptr(msg);
msg->header.message_type = RTMP_MSG_AMF3DataMessage;
SrsPacket *pkt;
SrsRtmpCommand *pkt;
// Decode the response failed, no transaction ID was set by request.
HELPER_EXPECT_FAILED(p.decode_message(msg, &pkt));
SrsUniquePtr<SrsPacket> pkt_uptr(pkt);
SrsUniquePtr<SrsRtmpCommand> pkt_uptr(pkt);
}
if (true) {
@ -561,10 +560,10 @@ VOID TEST(ProtocolRTMPTest, OnDecodeMessages3)
SrsUniquePtr<SrsCommonMessage> msg_uptr(msg);
msg->header.message_type = RTMP_MSG_AMF3CommandMessage;
SrsPacket *pkt;
SrsRtmpCommand *pkt;
// Decode the response failed, no transaction ID was set by request.
HELPER_EXPECT_FAILED(p.decode_message(msg, &pkt));
SrsUniquePtr<SrsPacket> pkt_uptr(pkt);
SrsUniquePtr<SrsRtmpCommand> pkt_uptr(pkt);
}
if (true) {
@ -579,10 +578,10 @@ VOID TEST(ProtocolRTMPTest, OnDecodeMessages3)
SrsCommonMessage *msg = _create_amf0((char *)bytes, sizeof(bytes), 1);
SrsUniquePtr<SrsCommonMessage> msg_uptr(msg);
SrsPacket *pkt;
SrsRtmpCommand *pkt;
// Without enough data, it fail when decoding the response packet.
HELPER_EXPECT_FAILED(p.decode_message(msg, &pkt));
SrsUniquePtr<SrsPacket> pkt_uptr(pkt);
SrsUniquePtr<SrsRtmpCommand> pkt_uptr(pkt);
}
if (true) {
@ -597,10 +596,10 @@ VOID TEST(ProtocolRTMPTest, OnDecodeMessages3)
SrsCommonMessage *msg = _create_amf0((char *)bytes, sizeof(bytes), 1);
SrsUniquePtr<SrsCommonMessage> msg_uptr(msg);
SrsPacket *pkt;
SrsRtmpCommand *pkt;
// Without enough data, it fail when decoding the response packet.
HELPER_EXPECT_FAILED(p.decode_message(msg, &pkt));
SrsUniquePtr<SrsPacket> pkt_uptr(pkt);
SrsUniquePtr<SrsRtmpCommand> pkt_uptr(pkt);
}
if (true) {
@ -615,10 +614,10 @@ VOID TEST(ProtocolRTMPTest, OnDecodeMessages3)
SrsCommonMessage *msg = _create_amf0((char *)bytes, sizeof(bytes), 1);
SrsUniquePtr<SrsCommonMessage> msg_uptr(msg);
SrsPacket *pkt;
SrsRtmpCommand *pkt;
// Without enough data, it fail when decoding the response packet.
HELPER_EXPECT_FAILED(p.decode_message(msg, &pkt));
SrsUniquePtr<SrsPacket> pkt_uptr(pkt);
SrsUniquePtr<SrsRtmpCommand> pkt_uptr(pkt);
}
if (true) {
@ -633,10 +632,10 @@ VOID TEST(ProtocolRTMPTest, OnDecodeMessages3)
SrsCommonMessage *msg = _create_amf0((char *)bytes, sizeof(bytes), 1);
SrsUniquePtr<SrsCommonMessage> msg_uptr(msg);
SrsPacket *pkt;
SrsRtmpCommand *pkt;
// Without enough data, it fail when decoding the response packet.
HELPER_EXPECT_FAILED(p.decode_message(msg, &pkt));
SrsUniquePtr<SrsPacket> pkt_uptr(pkt);
SrsUniquePtr<SrsRtmpCommand> pkt_uptr(pkt);
}
if (true) {
@ -652,10 +651,10 @@ VOID TEST(ProtocolRTMPTest, OnDecodeMessages3)
SrsCommonMessage *msg = _create_amf0((char *)bytes, sizeof(bytes), 1);
SrsUniquePtr<SrsCommonMessage> msg_uptr(msg);
SrsPacket *pkt;
SrsRtmpCommand *pkt;
// Without enough data, it fail when decoding the response packet.
HELPER_EXPECT_FAILED(p.decode_message(msg, &pkt));
SrsUniquePtr<SrsPacket> pkt_uptr(pkt);
SrsUniquePtr<SrsRtmpCommand> pkt_uptr(pkt);
}
if (true) {
@ -671,10 +670,10 @@ VOID TEST(ProtocolRTMPTest, OnDecodeMessages3)
SrsCommonMessage *msg = _create_amf0((char *)bytes, sizeof(bytes), 1);
SrsUniquePtr<SrsCommonMessage> msg_uptr(msg);
SrsPacket *pkt;
SrsRtmpCommand *pkt;
// Without enough data, it fail when decoding the response packet.
HELPER_EXPECT_FAILED(p.decode_message(msg, &pkt));
SrsUniquePtr<SrsPacket> pkt_uptr(pkt);
SrsUniquePtr<SrsRtmpCommand> pkt_uptr(pkt);
}
}
@ -690,10 +689,10 @@ VOID TEST(ProtocolRTMPTest, OnDecodeMessages4)
SrsCommonMessage *msg = _create_amf0((char *)bytes, sizeof(bytes), 1);
SrsUniquePtr<SrsCommonMessage> msg_uptr(msg);
SrsPacket *pkt;
SrsRtmpCommand *pkt;
// Without enough data, it fail when decoding the request packet.
HELPER_EXPECT_FAILED(p.decode_message(msg, &pkt));
SrsUniquePtr<SrsPacket> pkt_uptr(pkt);
SrsUniquePtr<SrsRtmpCommand> pkt_uptr(pkt);
}
if (true) {
@ -704,10 +703,10 @@ VOID TEST(ProtocolRTMPTest, OnDecodeMessages4)
SrsCommonMessage *msg = _create_amf0((char *)bytes, sizeof(bytes), 1);
SrsUniquePtr<SrsCommonMessage> msg_uptr(msg);
SrsPacket *pkt;
SrsRtmpCommand *pkt;
// Without enough data, it fail when decoding the request packet.
HELPER_EXPECT_FAILED(p.decode_message(msg, &pkt));
SrsUniquePtr<SrsPacket> pkt_uptr(pkt);
SrsUniquePtr<SrsRtmpCommand> pkt_uptr(pkt);
}
if (true) {
@ -718,10 +717,10 @@ VOID TEST(ProtocolRTMPTest, OnDecodeMessages4)
SrsCommonMessage *msg = _create_amf0((char *)bytes, sizeof(bytes), 1);
SrsUniquePtr<SrsCommonMessage> msg_uptr(msg);
SrsPacket *pkt;
SrsRtmpCommand *pkt;
// Without enough data, it fail when decoding the request packet.
HELPER_EXPECT_FAILED(p.decode_message(msg, &pkt));
SrsUniquePtr<SrsPacket> pkt_uptr(pkt);
SrsUniquePtr<SrsRtmpCommand> pkt_uptr(pkt);
}
if (true) {
@ -732,10 +731,10 @@ VOID TEST(ProtocolRTMPTest, OnDecodeMessages4)
SrsCommonMessage *msg = _create_amf0((char *)bytes, sizeof(bytes), 1);
SrsUniquePtr<SrsCommonMessage> msg_uptr(msg);
SrsPacket *pkt;
SrsRtmpCommand *pkt;
// Without enough data, it fail when decoding the request packet.
HELPER_EXPECT_FAILED(p.decode_message(msg, &pkt));
SrsUniquePtr<SrsPacket> pkt_uptr(pkt);
SrsUniquePtr<SrsRtmpCommand> pkt_uptr(pkt);
}
if (true) {
@ -746,10 +745,10 @@ VOID TEST(ProtocolRTMPTest, OnDecodeMessages4)
SrsCommonMessage *msg = _create_amf0((char *)bytes, sizeof(bytes), 1);
SrsUniquePtr<SrsCommonMessage> msg_uptr(msg);
SrsPacket *pkt;
SrsRtmpCommand *pkt;
// Without enough data, it fail when decoding the request packet.
HELPER_EXPECT_FAILED(p.decode_message(msg, &pkt));
SrsUniquePtr<SrsPacket> pkt_uptr(pkt);
SrsUniquePtr<SrsRtmpCommand> pkt_uptr(pkt);
}
if (true) {
@ -760,10 +759,10 @@ VOID TEST(ProtocolRTMPTest, OnDecodeMessages4)
SrsCommonMessage *msg = _create_amf0((char *)bytes, sizeof(bytes), 1);
SrsUniquePtr<SrsCommonMessage> msg_uptr(msg);
SrsPacket *pkt;
SrsRtmpCommand *pkt;
// Without enough data, it fail when decoding the request packet.
HELPER_EXPECT_FAILED(p.decode_message(msg, &pkt));
SrsUniquePtr<SrsPacket> pkt_uptr(pkt);
SrsUniquePtr<SrsRtmpCommand> pkt_uptr(pkt);
}
if (true) {
@ -774,10 +773,10 @@ VOID TEST(ProtocolRTMPTest, OnDecodeMessages4)
SrsCommonMessage *msg = _create_amf0((char *)bytes, sizeof(bytes), 1);
SrsUniquePtr<SrsCommonMessage> msg_uptr(msg);
SrsPacket *pkt;
SrsRtmpCommand *pkt;
// Without enough data, it fail when decoding the request packet.
HELPER_EXPECT_FAILED(p.decode_message(msg, &pkt));
SrsUniquePtr<SrsPacket> pkt_uptr(pkt);
SrsUniquePtr<SrsRtmpCommand> pkt_uptr(pkt);
}
if (true) {
@ -788,10 +787,10 @@ VOID TEST(ProtocolRTMPTest, OnDecodeMessages4)
SrsCommonMessage *msg = _create_amf0((char *)bytes, sizeof(bytes), 1);
SrsUniquePtr<SrsCommonMessage> msg_uptr(msg);
SrsPacket *pkt;
SrsRtmpCommand *pkt;
// Without enough data, it fail when decoding the request packet.
HELPER_EXPECT_FAILED(p.decode_message(msg, &pkt));
SrsUniquePtr<SrsPacket> pkt_uptr(pkt);
SrsUniquePtr<SrsRtmpCommand> pkt_uptr(pkt);
}
if (true) {
@ -802,10 +801,10 @@ VOID TEST(ProtocolRTMPTest, OnDecodeMessages4)
SrsCommonMessage *msg = _create_amf0((char *)bytes, sizeof(bytes), 1);
SrsUniquePtr<SrsCommonMessage> msg_uptr(msg);
SrsPacket *pkt;
SrsRtmpCommand *pkt;
// Without enough data, it fail when decoding the request packet.
HELPER_EXPECT_FAILED(p.decode_message(msg, &pkt));
SrsUniquePtr<SrsPacket> pkt_uptr(pkt);
SrsUniquePtr<SrsRtmpCommand> pkt_uptr(pkt);
}
if (true) {
@ -816,9 +815,9 @@ VOID TEST(ProtocolRTMPTest, OnDecodeMessages4)
SrsCommonMessage *msg = _create_amf0((char *)bytes, sizeof(bytes), 1);
SrsUniquePtr<SrsCommonMessage> msg_uptr(msg);
SrsPacket *pkt;
SrsRtmpCommand *pkt;
HELPER_EXPECT_SUCCESS(p.decode_message(msg, &pkt));
SrsUniquePtr<SrsPacket> pkt_uptr(pkt);
SrsUniquePtr<SrsRtmpCommand> pkt_uptr(pkt);
}
if (true) {
@ -829,10 +828,10 @@ VOID TEST(ProtocolRTMPTest, OnDecodeMessages4)
SrsCommonMessage *msg = _create_amf0((char *)bytes, sizeof(bytes), 1);
SrsUniquePtr<SrsCommonMessage> msg_uptr(msg);
SrsPacket *pkt;
SrsRtmpCommand *pkt;
// Without enough data, it fail when decoding the request packet.
HELPER_EXPECT_FAILED(p.decode_message(msg, &pkt));
SrsUniquePtr<SrsPacket> pkt_uptr(pkt);
SrsUniquePtr<SrsRtmpCommand> pkt_uptr(pkt);
}
if (true) {
@ -844,10 +843,10 @@ VOID TEST(ProtocolRTMPTest, OnDecodeMessages4)
msg->header.message_type = RTMP_MSG_AMF0CommandMessage;
SrsUniquePtr<SrsCommonMessage> msg_uptr(msg);
SrsPacket *pkt;
SrsRtmpCommand *pkt;
// Without enough data, it fail when decoding the request packet.
HELPER_EXPECT_FAILED(p.decode_message(msg, &pkt));
SrsUniquePtr<SrsPacket> pkt_uptr(pkt);
SrsUniquePtr<SrsRtmpCommand> pkt_uptr(pkt);
}
}
@ -2134,7 +2133,7 @@ VOID TEST(ProtocolRTMPTest, ServerResponseCommands)
srs_freep(pkt);
// onStatus(NetStream.Data.Start)
SrsPacket *bpkt = NULL;
SrsRtmpCommand *bpkt = NULL;
HELPER_ASSERT_SUCCESS(p.expect_message(&msg, &bpkt));
srs_freep(msg);
srs_freep(bpkt);
@ -2682,9 +2681,9 @@ VOID TEST(ProtocolRTMPTest, AgentMessageCodec)
HELPER_ASSERT_SUCCESS(p.recv_message(&msg));
SrsUniquePtr<SrsCommonMessage> msg_uptr(msg);
SrsPacket *pkt = NULL;
SrsRtmpCommand *pkt = NULL;
HELPER_EXPECT_SUCCESS(p.decode_message(msg, &pkt));
SrsUniquePtr<SrsPacket> pkt_uptr(pkt);
SrsUniquePtr<SrsRtmpCommand> pkt_uptr(pkt);
}
}
@ -2720,14 +2719,14 @@ VOID TEST(ProtocolRTMPTest, AgentMessageCodec)
HELPER_ASSERT_SUCCESS(p.recv_message(&msg));
SrsUniquePtr<SrsCommonMessage> msg_uptr(msg);
SrsPacket *pkt = NULL;
SrsRtmpCommand *pkt = NULL;
HELPER_EXPECT_SUCCESS(p.decode_message(msg, &pkt));
SrsUniquePtr<SrsPacket> pkt_uptr(pkt);
SrsUniquePtr<SrsRtmpCommand> pkt_uptr(pkt);
}
}
}
srs_error_t _mock_packet_to_shared_msg(SrsPacket *packet, int stream_id, SrsSharedPtrMessage *shared_msg)
srs_error_t _mock_packet_to_shared_msg(SrsRtmpCommand *packet, int stream_id, SrsMediaPacket *shared_msg)
{
srs_error_t err = srs_success;
@ -2739,9 +2738,7 @@ srs_error_t _mock_packet_to_shared_msg(SrsPacket *packet, int stream_id, SrsShar
return err;
}
if ((err = shared_msg->create(msg)) != srs_success) {
return err;
}
msg->to_msg(shared_msg);
return err;
}
@ -2755,18 +2752,18 @@ VOID TEST(ProtocolRTMPTest, CheckStreamID)
SrsRtmpClient p(&io);
if (true) {
SrsSharedPtrMessage *shared_msgs[2];
SrsMediaPacket *shared_msgs[2];
SrsConnectAppPacket *res = new SrsConnectAppPacket();
SrsUniquePtr<SrsConnectAppPacket> res_uptr(res);
if (true) {
SrsSharedPtrMessage *shared_msg = new SrsSharedPtrMessage();
SrsMediaPacket *shared_msg = new SrsMediaPacket();
HELPER_ASSERT_SUCCESS(_mock_packet_to_shared_msg(res, 1, shared_msg));
shared_msgs[0] = shared_msg;
}
if (true) {
SrsSharedPtrMessage *shared_msg = new SrsSharedPtrMessage();
SrsMediaPacket *shared_msg = new SrsMediaPacket();
HELPER_ASSERT_SUCCESS(_mock_packet_to_shared_msg(res, 2, shared_msg));
shared_msgs[1] = shared_msg;
}
@ -2800,7 +2797,7 @@ VOID TEST(ProtocolRTMPTest, AgentMessageTransform)
SrsRtmpClient p(&io);
if (true) {
SrsSharedPtrMessage *shared_msg = new SrsSharedPtrMessage();
SrsMediaPacket *shared_msg = new SrsMediaPacket();
SrsConnectAppPacket *res = new SrsConnectAppPacket();
HELPER_ASSERT_SUCCESS(_mock_packet_to_shared_msg(res, 1, shared_msg));
srs_freep(res);
@ -2821,7 +2818,7 @@ VOID TEST(ProtocolRTMPTest, AgentMessageTransform)
SrsRtmpClient p(&io);
if (true) {
SrsSharedPtrMessage *shared_msg = new SrsSharedPtrMessage();
SrsMediaPacket *shared_msg = new SrsMediaPacket();
SrsConnectAppPacket *res = new SrsConnectAppPacket();
HELPER_ASSERT_SUCCESS(_mock_packet_to_shared_msg(res, 1, shared_msg));
srs_freep(res);
@ -2842,7 +2839,7 @@ VOID TEST(ProtocolRTMPTest, AgentMessageTransform)
SrsRtmpServer p(&io);
if (true) {
SrsSharedPtrMessage *shared_msg = new SrsSharedPtrMessage();
SrsMediaPacket *shared_msg = new SrsMediaPacket();
SrsConnectAppPacket *res = new SrsConnectAppPacket();
HELPER_ASSERT_SUCCESS(_mock_packet_to_shared_msg(res, 1, shared_msg));
srs_freep(res);
@ -2863,7 +2860,7 @@ VOID TEST(ProtocolRTMPTest, AgentMessageTransform)
SrsRtmpServer p(&io);
if (true) {
SrsSharedPtrMessage *shared_msg = new SrsSharedPtrMessage();
SrsMediaPacket *shared_msg = new SrsMediaPacket();
SrsConnectAppPacket *res = new SrsConnectAppPacket();
HELPER_ASSERT_SUCCESS(_mock_packet_to_shared_msg(res, 1, shared_msg));
srs_freep(res);
@ -2929,7 +2926,7 @@ VOID TEST(ProtocolRTMPTest, CreateRTMPMessage)
// Invalid message type.
if (true) {
SrsSharedPtrMessage *msg = NULL;
SrsCommonMessage *msg = NULL;
HELPER_EXPECT_FAILED(srs_rtmp_create_msg(SrsFrameTypeForbidden, 0, _strcpy("Hello"), 5, 0, &msg));
EXPECT_TRUE(NULL == msg);
}
@ -2941,7 +2938,7 @@ VOID TEST(ProtocolRTMPTest, CreateRTMPMessage)
// Normal script message.
if (true) {
SrsSharedPtrMessage *msg = NULL;
SrsCommonMessage *msg = NULL;
HELPER_EXPECT_SUCCESS(srs_rtmp_create_msg(SrsFrameTypeScript, 0, _strcpy("Hello"), 5, 0, &msg));
EXPECT_STREQ("Hello", msg->payload());
srs_freep(msg);
@ -2949,7 +2946,7 @@ VOID TEST(ProtocolRTMPTest, CreateRTMPMessage)
// Normal video message.
if (true) {
SrsSharedPtrMessage *msg = NULL;
SrsCommonMessage *msg = NULL;
HELPER_EXPECT_SUCCESS(srs_rtmp_create_msg(SrsFrameTypeVideo, 0, _strcpy("Hello"), 5, 0, &msg));
EXPECT_STREQ("Hello", msg->payload());
srs_freep(msg);
@ -2957,7 +2954,7 @@ VOID TEST(ProtocolRTMPTest, CreateRTMPMessage)
// Normal audio message.
if (true) {
SrsSharedPtrMessage *msg = NULL;
SrsCommonMessage *msg = NULL;
HELPER_EXPECT_SUCCESS(srs_rtmp_create_msg(SrsFrameTypeAudio, 0, _strcpy("Hello"), 5, 0, &msg));
EXPECT_STREQ("Hello", msg->payload());
srs_freep(msg);
@ -3046,8 +3043,8 @@ VOID TEST(ProtocolRTMPTest, OthersAll)
SrsMessageArray *parr = &h;
SrsUniquePtr<SrsMessageArray> parr2(parr, srs_utest_free_message_array);
h.msgs[0] = new SrsSharedPtrMessage();
h.msgs[1] = new SrsSharedPtrMessage();
h.msgs[0] = new SrsMediaPacket();
h.msgs[1] = new SrsMediaPacket();
EXPECT_TRUE(NULL != h.msgs[0]);
EXPECT_TRUE(NULL != h.msgs[1]);