Skip to content

Commit

Permalink
For #913, Kernel MP4 FLV HTTP support complex error.
Browse files Browse the repository at this point in the history
  • Loading branch information
winlinvip committed Dec 31, 2017
1 parent 9802dc3 commit 204ef04
Show file tree
Hide file tree
Showing 23 changed files with 1,411 additions and 1,658 deletions.
238 changes: 107 additions & 131 deletions trunk/src/app/srs_app_http_stream.cpp

Large diffs are not rendered by default.

72 changes: 36 additions & 36 deletions trunk/src/app/srs_app_http_stream.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -50,10 +50,10 @@ class SrsBufferCache : public ISrsCoroutineHandler
public:
SrsBufferCache(SrsSource* s, SrsRequest* r);
virtual ~SrsBufferCache();
virtual int update(SrsSource* s, SrsRequest* r);
virtual srs_error_t update(SrsSource* s, SrsRequest* r);
public:
virtual srs_error_t start();
virtual int dump_cache(SrsConsumer* consumer, SrsRtmpJitterAlgorithm jitter);
virtual srs_error_t dump_cache(SrsConsumer* consumer, SrsRtmpJitterAlgorithm jitter);
// interface ISrsEndlessThreadHandler.
public:
virtual srs_error_t cycle();
Expand All @@ -73,13 +73,13 @@ class ISrsBufferEncoder
* @param w the writer to write to http response.
* @param c the stream cache for audio stream fast startup.
*/
virtual int initialize(SrsFileWriter* w, SrsBufferCache* c) = 0;
virtual srs_error_t initialize(SrsFileWriter* w, SrsBufferCache* c) = 0;
/**
* write rtmp video/audio/metadata.
*/
virtual int write_audio(int64_t timestamp, char* data, int size) = 0;
virtual int write_video(int64_t timestamp, char* data, int size) = 0;
virtual int write_metadata(int64_t timestamp, char* data, int size) = 0;
virtual srs_error_t write_audio(int64_t timestamp, char* data, int size) = 0;
virtual srs_error_t write_video(int64_t timestamp, char* data, int size) = 0;
virtual srs_error_t write_metadata(int64_t timestamp, char* data, int size) = 0;
public:
/**
* for some stream, for example, mp3 and aac, the audio stream,
Expand All @@ -90,7 +90,7 @@ class ISrsBufferEncoder
/**
* dumps the cache of encoder to consumer.
*/
virtual int dump_cache(SrsConsumer* consumer, SrsRtmpJitterAlgorithm jitter) = 0;
virtual srs_error_t dump_cache(SrsConsumer* consumer, SrsRtmpJitterAlgorithm jitter) = 0;
};

/**
Expand All @@ -104,13 +104,13 @@ class SrsFlvStreamEncoder : public ISrsBufferEncoder
SrsFlvStreamEncoder();
virtual ~SrsFlvStreamEncoder();
public:
virtual int initialize(SrsFileWriter* w, SrsBufferCache* c);
virtual int write_audio(int64_t timestamp, char* data, int size);
virtual int write_video(int64_t timestamp, char* data, int size);
virtual int write_metadata(int64_t timestamp, char* data, int size);
virtual srs_error_t initialize(SrsFileWriter* w, SrsBufferCache* c);
virtual srs_error_t write_audio(int64_t timestamp, char* data, int size);
virtual srs_error_t write_video(int64_t timestamp, char* data, int size);
virtual srs_error_t write_metadata(int64_t timestamp, char* data, int size);
public:
virtual bool has_cache();
virtual int dump_cache(SrsConsumer* consumer, SrsRtmpJitterAlgorithm jitter);
virtual srs_error_t dump_cache(SrsConsumer* consumer, SrsRtmpJitterAlgorithm jitter);
};

#ifdef SRS_PERF_FAST_FLV_ENCODER
Expand All @@ -127,7 +127,7 @@ class SrsFastFlvStreamEncoder : public SrsFlvStreamEncoder
/**
* write the tags in a time.
*/
virtual int write_tags(SrsSharedPtrMessage** msgs, int count);
virtual srs_error_t write_tags(SrsSharedPtrMessage** msgs, int count);
};
#endif

Expand All @@ -142,13 +142,13 @@ class SrsTsStreamEncoder : public ISrsBufferEncoder
SrsTsStreamEncoder();
virtual ~SrsTsStreamEncoder();
public:
virtual int initialize(SrsFileWriter* w, SrsBufferCache* c);
virtual int write_audio(int64_t timestamp, char* data, int size);
virtual int write_video(int64_t timestamp, char* data, int size);
virtual int write_metadata(int64_t timestamp, char* data, int size);
virtual srs_error_t initialize(SrsFileWriter* w, SrsBufferCache* c);
virtual srs_error_t write_audio(int64_t timestamp, char* data, int size);
virtual srs_error_t write_video(int64_t timestamp, char* data, int size);
virtual srs_error_t write_metadata(int64_t timestamp, char* data, int size);
public:
virtual bool has_cache();
virtual int dump_cache(SrsConsumer* consumer, SrsRtmpJitterAlgorithm jitter);
virtual srs_error_t dump_cache(SrsConsumer* consumer, SrsRtmpJitterAlgorithm jitter);
};

/**
Expand All @@ -163,13 +163,13 @@ class SrsAacStreamEncoder : public ISrsBufferEncoder
SrsAacStreamEncoder();
virtual ~SrsAacStreamEncoder();
public:
virtual int initialize(SrsFileWriter* w, SrsBufferCache* c);
virtual int write_audio(int64_t timestamp, char* data, int size);
virtual int write_video(int64_t timestamp, char* data, int size);
virtual int write_metadata(int64_t timestamp, char* data, int size);
virtual srs_error_t initialize(SrsFileWriter* w, SrsBufferCache* c);
virtual srs_error_t write_audio(int64_t timestamp, char* data, int size);
virtual srs_error_t write_video(int64_t timestamp, char* data, int size);
virtual srs_error_t write_metadata(int64_t timestamp, char* data, int size);
public:
virtual bool has_cache();
virtual int dump_cache(SrsConsumer* consumer, SrsRtmpJitterAlgorithm jitter);
virtual srs_error_t dump_cache(SrsConsumer* consumer, SrsRtmpJitterAlgorithm jitter);
};

/**
Expand All @@ -184,13 +184,13 @@ class SrsMp3StreamEncoder : public ISrsBufferEncoder
SrsMp3StreamEncoder();
virtual ~SrsMp3StreamEncoder();
public:
virtual int initialize(SrsFileWriter* w, SrsBufferCache* c);
virtual int write_audio(int64_t timestamp, char* data, int size);
virtual int write_video(int64_t timestamp, char* data, int size);
virtual int write_metadata(int64_t timestamp, char* data, int size);
virtual srs_error_t initialize(SrsFileWriter* w, SrsBufferCache* c);
virtual srs_error_t write_audio(int64_t timestamp, char* data, int size);
virtual srs_error_t write_video(int64_t timestamp, char* data, int size);
virtual srs_error_t write_metadata(int64_t timestamp, char* data, int size);
public:
virtual bool has_cache();
virtual int dump_cache(SrsConsumer* consumer, SrsRtmpJitterAlgorithm jitter);
virtual srs_error_t dump_cache(SrsConsumer* consumer, SrsRtmpJitterAlgorithm jitter);
};

/**
Expand All @@ -204,14 +204,14 @@ class SrsBufferWriter : public SrsFileWriter
SrsBufferWriter(ISrsHttpResponseWriter* w);
virtual ~SrsBufferWriter();
public:
virtual int open(std::string file);
virtual srs_error_t open(std::string file);
virtual void close();
public:
virtual bool is_open();
virtual int64_t tellg();
public:
virtual int write(void* buf, size_t count, ssize_t* pnwrite);
virtual int writev(const iovec* iov, int iovcnt, ssize_t* pnwrite);
virtual srs_error_t write(void* buf, size_t count, ssize_t* pnwrite);
virtual srs_error_t writev(const iovec* iov, int iovcnt, ssize_t* pnwrite);
};

/**
Expand All @@ -227,11 +227,11 @@ class SrsLiveStream : public ISrsHttpHandler
public:
SrsLiveStream(SrsSource* s, SrsRequest* r, SrsBufferCache* c);
virtual ~SrsLiveStream();
virtual int update(SrsSource* s, SrsRequest* r);
virtual srs_error_t update(SrsSource* s, SrsRequest* r);
public:
virtual srs_error_t serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r);
private:
virtual int streaming_send_messages(ISrsBufferEncoder* enc, SrsSharedPtrMessage** msgs, int nb_msgs);
virtual srs_error_t streaming_send_messages(ISrsBufferEncoder* enc, SrsSharedPtrMessage** msgs, int nb_msgs);
};

/**
Expand Down Expand Up @@ -286,7 +286,7 @@ class SrsHttpStreamServer : virtual public ISrsReloadHandler
virtual srs_error_t initialize();
// http flv/ts/mp3/aac stream
public:
virtual int http_mount(SrsSource* s, SrsRequest* r);
virtual srs_error_t http_mount(SrsSource* s, SrsRequest* r);
virtual void http_unmount(SrsSource* s, SrsRequest* r);
// interface ISrsReloadHandler.
public:
Expand All @@ -296,8 +296,8 @@ class SrsHttpStreamServer : virtual public ISrsReloadHandler
public:
virtual srs_error_t hijack(ISrsHttpMessage* request, ISrsHttpHandler** ph);
private:
virtual int initialize_flv_streaming();
virtual int initialize_flv_entry(std::string vhost);
virtual srs_error_t initialize_flv_streaming();
virtual srs_error_t initialize_flv_entry(std::string vhost);
};

#endif
Expand Down
55 changes: 20 additions & 35 deletions trunk/src/kernel/srs_kernel_aac.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -39,55 +39,48 @@ using namespace std;
#include <srs_kernel_buffer.hpp>
#include <srs_kernel_file.hpp>
#include <srs_kernel_codec.hpp>
#include <srs_core_autofree.hpp>

SrsAacTransmuxer::SrsAacTransmuxer()
{
_fs = NULL;
got_sequence_header = false;
tag_stream = new SrsBuffer();
aac_object = SrsAacObjectTypeReserved;
}

SrsAacTransmuxer::~SrsAacTransmuxer()
{
srs_freep(tag_stream);
}

int SrsAacTransmuxer::initialize(SrsFileWriter* fs)
srs_error_t SrsAacTransmuxer::initialize(SrsFileWriter* fs)
{
int ret = ERROR_SUCCESS;
srs_error_t err = srs_success;

srs_assert(fs);

if (!fs->is_open()) {
ret = ERROR_KERNEL_AAC_STREAM_CLOSED;
srs_warn("stream is not open for encoder. ret=%d", ret);
return ret;
return srs_error_new(ERROR_KERNEL_AAC_STREAM_CLOSED, "stream is not open");
}

_fs = fs;

return ret;
return err;
}

int SrsAacTransmuxer::write_audio(int64_t timestamp, char* data, int size)
srs_error_t SrsAacTransmuxer::write_audio(int64_t timestamp, char* data, int size)
{
int ret = ERROR_SUCCESS;
srs_error_t err = srs_success;

srs_assert(data);

timestamp &= 0x7fffffff;

SrsBuffer* stream = tag_stream;
if ((ret = stream->initialize(data, size)) != ERROR_SUCCESS) {
return ret;
}
SrsBuffer* stream = new SrsBuffer(data, size);
SrsAutoFree(SrsBuffer, stream);

// audio decode
if (!stream->require(1)) {
ret = ERROR_AAC_DECODE_ERROR;
srs_error("aac decode audio sound_format failed. ret=%d", ret);
return ret;
return srs_error_new(ERROR_AAC_DECODE_ERROR, "aac decode audio sound_format failed");
}

// @see: E.4.2 Audio Tags, video_file_format_spec_v10_1.pdf, page 76
Expand All @@ -99,15 +92,11 @@ int SrsAacTransmuxer::write_audio(int64_t timestamp, char* data, int size)
sound_format = (sound_format >> 4) & 0x0f;

if ((SrsAudioCodecId)sound_format != SrsAudioCodecIdAAC) {
ret = ERROR_AAC_DECODE_ERROR;
srs_error("aac required, format=%d. ret=%d", sound_format, ret);
return ret;
return srs_error_new(ERROR_AAC_DECODE_ERROR, "aac required, format=%d", sound_format);
}

if (!stream->require(1)) {
ret = ERROR_AAC_DECODE_ERROR;
srs_error("aac decode aac_packet_type failed. ret=%d", ret);
return ret;
return srs_error_new(ERROR_AAC_DECODE_ERROR, "aac decode aac_packet_type failed");
}

SrsAudioAacFrameTrait aac_packet_type = (SrsAudioAacFrameTrait)stream->read_1bytes();
Expand All @@ -120,9 +109,7 @@ int SrsAacTransmuxer::write_audio(int64_t timestamp, char* data, int size)
// samplingFrequencyIndex, aac_sample_rate, 4bits.
// channelConfiguration, aac_channels, 4bits
if (!stream->require(2)) {
ret = ERROR_AAC_DECODE_ERROR;
srs_error("aac decode sequence header failed. ret=%d", ret);
return ret;
return srs_error_new(ERROR_AAC_DECODE_ERROR, "aac decode sequence header failed");
}

int8_t audioObjectType = stream->read_1bytes();
Expand All @@ -136,13 +123,11 @@ int SrsAacTransmuxer::write_audio(int64_t timestamp, char* data, int size)

got_sequence_header = true;

return ret;
return err;
}

if (!got_sequence_header) {
ret = ERROR_AAC_DECODE_ERROR;
srs_error("aac no sequence header. ret=%d", ret);
return ret;
return srs_error_new(ERROR_AAC_DECODE_ERROR, "aac no sequence header");
}

// the left is the aac raw frame data.
Expand Down Expand Up @@ -207,16 +192,16 @@ int SrsAacTransmuxer::write_audio(int64_t timestamp, char* data, int size)
}

// write 7bytes fixed header.
if ((ret = _fs->write(aac_fixed_header, 7, NULL)) != ERROR_SUCCESS) {
return ret;
if ((err = _fs->write(aac_fixed_header, 7, NULL)) != srs_success) {
return srs_error_wrap(err, "write aac header");
}

// write aac frame body.
if ((ret = _fs->write(data + stream->pos(), aac_raw_length, NULL)) != ERROR_SUCCESS) {
return ret;
if ((err = _fs->write(data + stream->pos(), aac_raw_length, NULL)) != srs_success) {
return srs_error_wrap(err, "write aac frame");
}

return ret;
return err;
}

#endif
Expand Down
6 changes: 2 additions & 4 deletions trunk/src/kernel/srs_kernel_aac.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,6 @@ class SrsAacTransmuxer
int8_t aac_sample_rate;
int8_t aac_channels;
bool got_sequence_header;
private:
SrsBuffer* tag_stream;
public:
SrsAacTransmuxer();
virtual ~SrsAacTransmuxer();
Expand All @@ -59,13 +57,13 @@ class SrsAacTransmuxer
* @remark user can initialize multiple times to encode multiple aac files.
* @remark, user must free the fs, aac encoder never close/free it.
*/
virtual int initialize(SrsFileWriter* fs);
virtual srs_error_t initialize(SrsFileWriter* fs);
public:
/**
* write audio/video packet.
* @remark assert data is not NULL.
*/
virtual int write_audio(int64_t timestamp, char* data, int size);
virtual srs_error_t write_audio(int64_t timestamp, char* data, int size);
};

#endif
Expand Down
Loading

0 comments on commit 204ef04

Please sign in to comment.