1
0
Fork 0
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:
winlin 2017-02-12 18:18:18 +08:00
parent c4a510b834
commit d7458c4e72
18 changed files with 990 additions and 1150 deletions

View file

@ -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);
}

View file

@ -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

View file

@ -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;
}

View file

@ -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();