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 info structure.

This commit is contained in:
winlin 2017-02-11 23:09:23 +08:00
parent 5e419c66f8
commit c4a510b834
10 changed files with 574 additions and 298 deletions

View file

@ -50,6 +50,7 @@ using namespace std;
#include <srs_kernel_ts.hpp>
#include <srs_app_utility.hpp>
#include <srs_app_http_hooks.hpp>
#include <srs_protocol_format.hpp>
// drop the segment when duration of ts too small.
#define SRS_AUTO_HLS_SEGMENT_MIN_DURATION_MS 100
@ -1117,13 +1118,12 @@ SrsHls::SrsHls()
{
req = NULL;
hub = NULL;
format = NULL;
enabled = false;
disposable = false;
last_update_time = 0;
codec = new SrsAvcAacCodec();
sample = new SrsCodecSample();
jitter = new SrsRtmpJitter();
muxer = new SrsHlsMuxer();
@ -1135,8 +1135,6 @@ SrsHls::SrsHls()
SrsHls::~SrsHls()
{
srs_freep(codec);
srs_freep(sample);
srs_freep(jitter);
srs_freep(muxer);
@ -1188,12 +1186,13 @@ int SrsHls::cycle()
return ret;
}
int SrsHls::initialize(SrsOriginHub* h, SrsRequest* r)
int SrsHls::initialize(SrsOriginHub* h, SrsFormat* f, SrsRequest* r)
{
int ret = ERROR_SUCCESS;
hub = h;
req = r;
format = f;
if ((ret = muxer->initialize()) != ERROR_SUCCESS) {
return ret;

View file

@ -36,12 +36,11 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#include <srs_kernel_file.hpp>
#include <srs_app_async_call.hpp>
class SrsFormat;
class SrsSharedPtrMessage;
class SrsCodecSample;
class SrsAmf0Object;
class SrsRtmpJitter;
class SrsTSMuxer;
class SrsAvcAacCodec;
class SrsRequest;
class SrsPithyPrint;
class SrsSource;
@ -343,8 +342,7 @@ private:
};
/**
* delivery RTMP stream to HLS(m3u8 and ts),
* SrsHls provides interface with SrsSource.
* Transmux RTMP stream to HLS(m3u8 and ts).
* TODO: FIXME: add utest for hls.
*/
class SrsHls
@ -359,8 +357,7 @@ private:
int64_t last_update_time;
private:
SrsOriginHub* hub;
SrsAvcAacCodec* codec;
SrsCodecSample* sample;
SrsFormat* format;
SrsRtmpJitter* jitter;
SrsPithyPrint* pprint;
/**
@ -387,7 +384,7 @@ public:
/**
* initialize the hls by handler and source.
*/
virtual int initialize(SrsOriginHub* h, SrsRequest* r);
virtual int initialize(SrsOriginHub* h, SrsFormat* f, SrsRequest* r);
/**
* publish stream event, continue to write the m3u8,
* for the muxer object not destroyed.

View file

@ -48,6 +48,7 @@ using namespace std;
#include <srs_protocol_utility.hpp>
#include <srs_app_ng_exec.hpp>
#include <srs_app_dash.hpp>
#include <srs_protocol_format.hpp>
#define CONST_MAX_JITTER_MS 250
#define CONST_MAX_JITTER_MS_NEG -250
@ -853,6 +854,7 @@ SrsOriginHub::SrsOriginHub()
hds = new SrsHds();
#endif
ng_exec = new SrsNgExec();
format = new SrsFormat();
_srs_config->subscribe(this);
}
@ -871,6 +873,7 @@ SrsOriginHub::~SrsOriginHub()
}
srs_freep(ng_exec);
srs_freep(format);
srs_freep(hls);
srs_freep(dash);
srs_freep(dvr);
@ -889,7 +892,11 @@ int SrsOriginHub::initialize(SrsSource* s, SrsRequest* r)
req = r;
source = s;
if ((ret = hls->initialize(this, req)) != ERROR_SUCCESS) {
if ((ret = format->initialize()) != ERROR_SUCCESS) {
return ret;
}
if ((ret = hls->initialize(this, format, req)) != ERROR_SUCCESS) {
return ret;
}
@ -924,10 +931,15 @@ int SrsOriginHub::cycle()
return ret;
}
int SrsOriginHub::on_meta_data(SrsSharedPtrMessage* shared_metadata)
int SrsOriginHub::on_meta_data(SrsSharedPtrMessage* shared_metadata, SrsOnMetaDataPacket* packet)
{
int ret = ERROR_SUCCESS;
if ((ret = format->on_metadata(packet)) != ERROR_SUCCESS) {
srs_error("Codec parse metadata failed, ret=%d", ret);
return ret;
}
// copy to all forwarders
if (true) {
std::vector<SrsForwarder*>::iterator it;
@ -954,6 +966,11 @@ int SrsOriginHub::on_audio(SrsSharedPtrMessage* shared_audio)
SrsSharedPtrMessage* msg = shared_audio;
if ((ret = format->on_audio(msg)) != ERROR_SUCCESS) {
srs_error("Codec parse audio failed, ret=%d", ret);
return ret;
}
if ((ret = hls->on_audio(msg)) != ERROR_SUCCESS) {
// apply the error strategy for hls.
// @see https://github.com/ossrs/srs/issues/264
@ -1027,6 +1044,11 @@ int SrsOriginHub::on_video(SrsSharedPtrMessage* shared_video, bool is_sequence_h
SrsSharedPtrMessage* msg = shared_video;
if ((ret = format->on_video(msg, is_sequence_header)) != ERROR_SUCCESS) {
srs_error("Codec parse video failed, ret=%d", ret);
return ret;
}
if ((ret = hls->on_video(msg, is_sequence_header)) != ERROR_SUCCESS) {
// apply the error strategy for hls.
// @see https://github.com/ossrs/srs/issues/264
@ -2048,7 +2070,7 @@ int SrsSource::on_meta_data(SrsCommonMessage* msg, SrsOnMetaDataPacket* metadata
}
// Copy to hub to all utilities.
return hub->on_meta_data(meta->data());
return hub->on_meta_data(meta->data(), metadata);
}
int SrsSource::on_audio(SrsCommonMessage* shared_audio)

View file

@ -38,6 +38,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#include <srs_app_reload.hpp>
#include <srs_core_performance.hpp>
class SrsFormat;
class SrsConsumer;
class SrsPlayEdge;
class SrsPublishEdge;
@ -421,6 +422,8 @@ private:
// Whether the stream hub is active, or stream is publishing.
bool is_active;
private:
// The format, codec information.
SrsFormat* format;
// hls handler.
SrsHls* hls;
// The DASH encoder.
@ -454,7 +457,7 @@ public:
virtual int cycle();
public:
// When got a parsed metadata.
virtual int on_meta_data(SrsSharedPtrMessage* shared_metadata);
virtual int on_meta_data(SrsSharedPtrMessage* shared_metadata, SrsOnMetaDataPacket* packet);
// When got a parsed audio packet.
virtual int on_audio(SrsSharedPtrMessage* shared_audio);
// When got a parsed video packet.