Skip to content

Commit 77d78ea

Browse files
committed
for ossrs#293, add http ts stream framework.
1 parent 0f59073 commit 77d78ea

File tree

2 files changed

+64
-5
lines changed

2 files changed

+64
-5
lines changed

trunk/src/kernel/srs_kernel_ts.cpp

Lines changed: 60 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,18 +34,20 @@ using namespace std;
3434

3535
#include <srs_kernel_log.hpp>
3636
#include <srs_kernel_error.hpp>
37-
#include <srs_kernel_stream.hpp>
3837
#include <srs_kernel_file.hpp>
38+
#include <srs_kernel_avc.hpp>
3939

4040
SrsTsEncoder::SrsTsEncoder()
4141
{
4242
_fs = NULL;
43-
tag_stream = new SrsStream();
43+
codec = new SrsAvcAacCodec();
44+
sample = new SrsCodecSample();
4445
}
4546

4647
SrsTsEncoder::~SrsTsEncoder()
4748
{
48-
srs_freep(tag_stream);
49+
srs_freep(codec);
50+
srs_freep(sample);
4951
}
5052

5153
int SrsTsEncoder::initialize(SrsFileWriter* fs)
@@ -68,12 +70,67 @@ int SrsTsEncoder::initialize(SrsFileWriter* fs)
6870
int SrsTsEncoder::write_audio(int64_t timestamp, char* data, int size)
6971
{
7072
int ret = ERROR_SUCCESS;
73+
74+
sample->clear();
75+
if ((ret = codec->audio_aac_demux(data, size, sample)) != ERROR_SUCCESS) {
76+
srs_error("http: ts codec demux audio failed. ret=%d", ret);
77+
return ret;
78+
}
79+
80+
if (codec->audio_codec_id != SrsCodecAudioAAC) {
81+
return ret;
82+
}
83+
84+
// ignore sequence header
85+
if (sample->aac_packet_type == SrsCodecAudioTypeSequenceHeader) {
86+
return ret;
87+
}
88+
89+
// the dts calc from rtmp/flv header.
90+
// @remark for http ts stream, the timestamp is always monotonically increase,
91+
// for the packet is filtered by consumer.
92+
int64_t dts = timestamp * 90;
93+
94+
/*if ((ret = hls_cache->write_audio(codec, muxer, dts, sample)) != ERROR_SUCCESS) {
95+
srs_error("http: ts cache write audio failed. ret=%d", ret);
96+
return ret;
97+
}*/
98+
7199
return ret;
72100
}
73101

74102
int SrsTsEncoder::write_video(int64_t timestamp, char* data, int size)
75103
{
76104
int ret = ERROR_SUCCESS;
105+
106+
sample->clear();
107+
if ((ret = codec->video_avc_demux(data, size, sample)) != ERROR_SUCCESS) {
108+
srs_error("http: ts codec demux video failed. ret=%d", ret);
109+
return ret;
110+
}
111+
112+
// ignore info frame,
113+
// @see https://github.com/winlinvip/simple-rtmp-server/issues/288#issuecomment-69863909
114+
if (sample->frame_type == SrsCodecVideoAVCFrameVideoInfoFrame) {
115+
return ret;
116+
}
117+
118+
if (codec->video_codec_id != SrsCodecVideoAVC) {
119+
return ret;
120+
}
121+
122+
// ignore sequence header
123+
if (sample->frame_type == SrsCodecVideoAVCFrameKeyFrame
124+
&& sample->avc_packet_type == SrsCodecVideoAVCTypeSequenceHeader) {
125+
return ret;
126+
}
127+
128+
int64_t dts = timestamp * 90;
129+
/*if ((ret = hls_cache->write_video(codec, muxer, dts, sample)) != ERROR_SUCCESS) {
130+
srs_error("http: ts cache write video failed. ret=%d", ret);
131+
return ret;
132+
}*/
133+
77134
return ret;
78135
}
79136

trunk/src/kernel/srs_kernel_ts.hpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,10 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
3131

3232
#include <string>
3333

34-
class SrsStream;
3534
class SrsFileWriter;
3635
class SrsFileReader;
36+
class SrsAvcAacCodec;
37+
class SrsCodecSample;
3738

3839
/**
3940
* encode data to ts file.
@@ -43,7 +44,8 @@ class SrsTsEncoder
4344
private:
4445
SrsFileWriter* _fs;
4546
private:
46-
SrsStream* tag_stream;
47+
SrsAvcAacCodec* codec;
48+
SrsCodecSample* sample;
4749
public:
4850
SrsTsEncoder();
4951
virtual ~SrsTsEncoder();

0 commit comments

Comments
 (0)