@@ -34,18 +34,20 @@ using namespace std;
34
34
35
35
#include < srs_kernel_log.hpp>
36
36
#include < srs_kernel_error.hpp>
37
- #include < srs_kernel_stream.hpp>
38
37
#include < srs_kernel_file.hpp>
38
+ #include < srs_kernel_avc.hpp>
39
39
40
40
SrsTsEncoder::SrsTsEncoder ()
41
41
{
42
42
_fs = NULL ;
43
- tag_stream = new SrsStream ();
43
+ codec = new SrsAvcAacCodec ();
44
+ sample = new SrsCodecSample ();
44
45
}
45
46
46
47
SrsTsEncoder::~SrsTsEncoder ()
47
48
{
48
- srs_freep (tag_stream);
49
+ srs_freep (codec);
50
+ srs_freep (sample);
49
51
}
50
52
51
53
int SrsTsEncoder::initialize (SrsFileWriter* fs)
@@ -68,12 +70,67 @@ int SrsTsEncoder::initialize(SrsFileWriter* fs)
68
70
int SrsTsEncoder::write_audio (int64_t timestamp, char * data, int size)
69
71
{
70
72
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
+
71
99
return ret;
72
100
}
73
101
74
102
int SrsTsEncoder::write_video (int64_t timestamp, char * data, int size)
75
103
{
76
104
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
+
77
134
return ret;
78
135
}
79
136
0 commit comments