mirror of
https://github.com/ossrs/srs.git
synced 2025-03-09 15:49:59 +00:00
For #299, refine the codec to format-frame-sample chain.
This commit is contained in:
parent
c4a510b834
commit
d7458c4e72
18 changed files with 990 additions and 1150 deletions
|
@ -26,24 +26,19 @@
|
|||
#include <srs_kernel_error.hpp>
|
||||
#include <srs_kernel_codec.hpp>
|
||||
#include <srs_rtmp_stack.hpp>
|
||||
#include <srs_kernel_buffer.hpp>
|
||||
#include <srs_core_autofree.hpp>
|
||||
#include <srs_kernel_utility.hpp>
|
||||
|
||||
SrsFormat::SrsFormat()
|
||||
SrsRtmpFormat::SrsRtmpFormat()
|
||||
{
|
||||
audio = video = NULL;
|
||||
}
|
||||
|
||||
SrsFormat::~SrsFormat()
|
||||
SrsRtmpFormat::~SrsRtmpFormat()
|
||||
{
|
||||
srs_freep(audio);
|
||||
srs_freep(video);
|
||||
}
|
||||
|
||||
int SrsFormat::initialize()
|
||||
{
|
||||
return ERROR_SUCCESS;
|
||||
}
|
||||
|
||||
int SrsFormat::on_metadata(SrsOnMetaDataPacket* meta)
|
||||
int SrsRtmpFormat::on_metadata(SrsOnMetaDataPacket* meta)
|
||||
{
|
||||
int ret = ERROR_SUCCESS;
|
||||
|
||||
|
@ -52,15 +47,31 @@ int SrsFormat::on_metadata(SrsOnMetaDataPacket* meta)
|
|||
return ret;
|
||||
}
|
||||
|
||||
int SrsFormat::on_audio(SrsSharedPtrMessage* shared_audio)
|
||||
int SrsRtmpFormat::on_audio(SrsSharedPtrMessage* shared_audio)
|
||||
{
|
||||
int ret = ERROR_SUCCESS;
|
||||
return ret;
|
||||
SrsSharedPtrMessage* msg = shared_audio;
|
||||
char* data = msg->payload;
|
||||
int size = msg->size;
|
||||
|
||||
return SrsFormat::on_audio(msg->timestamp, data, size);
|
||||
}
|
||||
|
||||
int SrsFormat::on_video(SrsSharedPtrMessage* shared_video, bool is_sequence_header)
|
||||
int SrsRtmpFormat::on_audio(int64_t timestamp, char* data, int size)
|
||||
{
|
||||
int ret = ERROR_SUCCESS;
|
||||
return ret;
|
||||
return SrsFormat::on_audio(timestamp, data, size);
|
||||
}
|
||||
|
||||
int SrsRtmpFormat::on_video(SrsSharedPtrMessage* shared_video)
|
||||
{
|
||||
SrsSharedPtrMessage* msg = shared_video;
|
||||
char* data = msg->payload;
|
||||
int size = msg->size;
|
||||
|
||||
return SrsFormat::on_video(msg->timestamp, data, size);
|
||||
}
|
||||
|
||||
int SrsRtmpFormat::on_video(int64_t timestamp, char* data, int size)
|
||||
{
|
||||
return SrsFormat::on_video(timestamp, data, size);
|
||||
}
|
||||
|
||||
|
|
|
@ -30,32 +30,33 @@
|
|||
|
||||
#include <srs_core.hpp>
|
||||
|
||||
class SrsFrame;
|
||||
#include <srs_kernel_codec.hpp>
|
||||
|
||||
class SrsBuffer;
|
||||
class SrsAudioFrame;
|
||||
class SrsVideoFrame;
|
||||
class SrsAudioCodec;
|
||||
class SrsVideoCodec;
|
||||
class SrsOnMetaDataPacket;
|
||||
class SrsSharedPtrMessage;
|
||||
|
||||
/**
|
||||
* 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.
|
||||
* Create special structure from RTMP stream, for example, the metadata.
|
||||
*/
|
||||
class SrsFormat
|
||||
class SrsRtmpFormat : public SrsFormat
|
||||
{
|
||||
public:
|
||||
SrsFrame* audio;
|
||||
SrsFrame* video;
|
||||
SrsRtmpFormat();
|
||||
virtual ~SrsRtmpFormat();
|
||||
public:
|
||||
SrsFormat();
|
||||
virtual ~SrsFormat();
|
||||
public:
|
||||
// Initialize the format.
|
||||
virtual int initialize();
|
||||
// Initialize the format from metadata, optional.
|
||||
virtual int on_metadata(SrsOnMetaDataPacket* meta);
|
||||
// When got a parsed audio packet.
|
||||
virtual int on_audio(SrsSharedPtrMessage* shared_audio);
|
||||
virtual int on_audio(int64_t timestamp, char* data, int size);
|
||||
// When got a parsed video packet.
|
||||
virtual int on_video(SrsSharedPtrMessage* shared_video, bool is_sequence_header);
|
||||
virtual int on_video(SrsSharedPtrMessage* shared_video);
|
||||
virtual int on_video(int64_t timestamp, char* data, int size);
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
@ -136,7 +136,7 @@ SrsRtpPacket::SrsRtpPacket()
|
|||
ssrc = 0;
|
||||
|
||||
payload = new SrsSimpleStream();
|
||||
audio_samples = new SrsCodecSample();
|
||||
audio = new SrsAudioFrame();
|
||||
chunked = false;
|
||||
completed = false;
|
||||
}
|
||||
|
@ -144,7 +144,7 @@ SrsRtpPacket::SrsRtpPacket()
|
|||
SrsRtpPacket::~SrsRtpPacket()
|
||||
{
|
||||
srs_freep(payload);
|
||||
srs_freep(audio_samples);
|
||||
srs_freep(audio);
|
||||
}
|
||||
|
||||
void SrsRtpPacket::copy(SrsRtpPacket* src)
|
||||
|
@ -161,7 +161,9 @@ void SrsRtpPacket::copy(SrsRtpPacket* src)
|
|||
|
||||
chunked = src->chunked;
|
||||
completed = src->completed;
|
||||
audio_samples = new SrsCodecSample();
|
||||
|
||||
srs_freep(audio);
|
||||
audio = new SrsAudioFrame();
|
||||
}
|
||||
|
||||
void SrsRtpPacket::reap(SrsRtpPacket* src)
|
||||
|
@ -172,9 +174,9 @@ void SrsRtpPacket::reap(SrsRtpPacket* src)
|
|||
payload = src->payload;
|
||||
src->payload = NULL;
|
||||
|
||||
srs_freep(audio_samples);
|
||||
audio_samples = src->audio_samples;
|
||||
src->audio_samples = NULL;
|
||||
srs_freep(audio);
|
||||
audio = src->audio;
|
||||
src->audio = NULL;
|
||||
}
|
||||
|
||||
int SrsRtpPacket::decode(SrsBuffer* stream)
|
||||
|
@ -263,7 +265,7 @@ int SrsRtpPacket::decode_97(SrsBuffer* stream)
|
|||
return ret;
|
||||
}
|
||||
|
||||
if ((ret = audio_samples->add_sample_unit(sample, sample_size)) != ERROR_SUCCESS) {
|
||||
if ((ret = audio->add_sample(sample, sample_size)) != ERROR_SUCCESS) {
|
||||
srs_error("rtsp: rtp type97 add sample failed. ret=%d", ret);
|
||||
return ret;
|
||||
}
|
||||
|
|
|
@ -41,7 +41,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|||
|
||||
class SrsBuffer;
|
||||
class SrsSimpleStream;
|
||||
class SrsCodecSample;
|
||||
class SrsAudioFrame;
|
||||
class ISrsProtocolReaderWriter;
|
||||
|
||||
// rtsp specification
|
||||
|
@ -299,7 +299,7 @@ public:
|
|||
/**
|
||||
* the audio samples, one rtp packets may contains multiple audio samples.
|
||||
*/
|
||||
SrsCodecSample* audio_samples;
|
||||
SrsAudioFrame* audio;
|
||||
public:
|
||||
SrsRtpPacket();
|
||||
virtual ~SrsRtpPacket();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue