正在显示
3 个修改的文件
包含
68 行增加
和
8 行删除
@@ -28,12 +28,14 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | @@ -28,12 +28,14 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||
28 | #include <srs_core_error.hpp> | 28 | #include <srs_core_error.hpp> |
29 | #include <srs_core_stream.hpp> | 29 | #include <srs_core_stream.hpp> |
30 | #include <srs_core_log.hpp> | 30 | #include <srs_core_log.hpp> |
31 | +#include <srs_core_autofree.hpp> | ||
31 | 32 | ||
32 | SrsCodec::SrsCodec() | 33 | SrsCodec::SrsCodec() |
33 | { | 34 | { |
34 | width = 0; | 35 | width = 0; |
35 | height = 0; | 36 | height = 0; |
36 | duration = 0; | 37 | duration = 0; |
38 | + NAL_unit_length = 0; | ||
37 | frame_rate = 0; | 39 | frame_rate = 0; |
38 | video_data_rate = 0; | 40 | video_data_rate = 0; |
39 | video_codec_id = 0; | 41 | video_codec_id = 0; |
@@ -60,7 +62,7 @@ SrsCodec::~SrsCodec() | @@ -60,7 +62,7 @@ SrsCodec::~SrsCodec() | ||
60 | srs_freep(stream); | 62 | srs_freep(stream); |
61 | } | 63 | } |
62 | 64 | ||
63 | -int SrsCodec::parse_audio_codec(int8_t* data, int size) | 65 | +int SrsCodec::audio_aac_demux(int8_t* data, int size) |
64 | { | 66 | { |
65 | int ret = ERROR_SUCCESS; | 67 | int ret = ERROR_SUCCESS; |
66 | 68 | ||
@@ -115,6 +117,7 @@ int SrsCodec::parse_audio_codec(int8_t* data, int size) | @@ -115,6 +117,7 @@ int SrsCodec::parse_audio_codec(int8_t* data, int size) | ||
115 | } | 117 | } |
116 | } else if (aac_packet_type == SrsCodecAudioTypeRawData) { | 118 | } else if (aac_packet_type == SrsCodecAudioTypeRawData) { |
117 | // Raw AAC frame data in UI8 [] | 119 | // Raw AAC frame data in UI8 [] |
120 | + // 6.3 Raw Data, aac-iso-13818-7.pdf, page 28 | ||
118 | } else { | 121 | } else { |
119 | // ignored. | 122 | // ignored. |
120 | } | 123 | } |
@@ -125,7 +128,7 @@ int SrsCodec::parse_audio_codec(int8_t* data, int size) | @@ -125,7 +128,7 @@ int SrsCodec::parse_audio_codec(int8_t* data, int size) | ||
125 | return ret; | 128 | return ret; |
126 | } | 129 | } |
127 | 130 | ||
128 | -int SrsCodec::parse_video_codec(int8_t* data, int size) | 131 | +int SrsCodec::video_avc_demux(int8_t* data, int size) |
129 | { | 132 | { |
130 | int ret = ERROR_SUCCESS; | 133 | int ret = ERROR_SUCCESS; |
131 | 134 | ||
@@ -177,9 +180,62 @@ int SrsCodec::parse_video_codec(int8_t* data, int size) | @@ -177,9 +180,62 @@ int SrsCodec::parse_video_codec(int8_t* data, int size) | ||
177 | avc_extra_data = new char[avc_extra_size]; | 180 | avc_extra_data = new char[avc_extra_size]; |
178 | memcpy(avc_extra_data, data + stream->pos(), avc_extra_size); | 181 | memcpy(avc_extra_data, data + stream->pos(), avc_extra_size); |
179 | } | 182 | } |
183 | + | ||
184 | + if (!stream->require(6)) { | ||
185 | + ret = ERROR_HLS_DECODE_ERROR; | ||
186 | + srs_error("hls decode video avc sequenc header failed. ret=%d", ret); | ||
187 | + return ret; | ||
188 | + } | ||
189 | + //int8_t configurationVersion = stream->read_1bytes(); | ||
190 | + //int8_t AVCProfileIndication = stream->read_1bytes(); | ||
191 | + //int8_t profile_compatibility = stream->read_1bytes(); | ||
192 | + //int8_t AVCLevelIndication = stream->read_1bytes(); | ||
193 | + stream->skip(4); | ||
194 | + // parse the NALU size. | ||
195 | + int8_t lengthSizeMinusOne = stream->read_1bytes(); | ||
196 | + lengthSizeMinusOne &= 0x03; | ||
197 | + NAL_unit_length = lengthSizeMinusOne; | ||
198 | + /** | ||
199 | + * skip the following: | ||
200 | + * numOfSequenceParameterSets | ||
201 | + * donot parse the following: | ||
202 | + * sequenceParameterSetLength | ||
203 | + * sequenceParameterSetNALUnit | ||
204 | + * numOfPictureParameterSets | ||
205 | + * pictureParameterSetLength | ||
206 | + * pictureParameterSetNALUnit | ||
207 | + */ | ||
180 | } else if (avc_packet_type == SrsCodecVideoAVCTypeNALU){ | 208 | } else if (avc_packet_type == SrsCodecVideoAVCTypeNALU){ |
181 | // One or more NALUs (Full frames are required) | 209 | // One or more NALUs (Full frames are required) |
182 | // 5.3.4.2.1 Syntax, H.264-AVC-ISO_IEC_14496-15.pdf, page 20 | 210 | // 5.3.4.2.1 Syntax, H.264-AVC-ISO_IEC_14496-15.pdf, page 20 |
211 | + int PictureLength = size - stream->pos(); | ||
212 | + for (int i = 0; i < PictureLength;) { | ||
213 | + if (!stream->require(NAL_unit_length + 1)) { | ||
214 | + ret = ERROR_HLS_DECODE_ERROR; | ||
215 | + srs_error("hls decode video avc NALU size failed. ret=%d", ret); | ||
216 | + return ret; | ||
217 | + } | ||
218 | + int32_t NALUnitLength = 0; | ||
219 | + if (NAL_unit_length == 3) { | ||
220 | + NALUnitLength = stream->read_4bytes(); | ||
221 | + } else if (NALUnitLength == 2) { | ||
222 | + NALUnitLength = stream->read_3bytes(); | ||
223 | + } else if (NALUnitLength == 1) { | ||
224 | + NALUnitLength = stream->read_2bytes(); | ||
225 | + } else { | ||
226 | + NALUnitLength = stream->read_1bytes(); | ||
227 | + } | ||
228 | + // NALUnit | ||
229 | + if (!stream->require(NALUnitLength)) { | ||
230 | + ret = ERROR_HLS_DECODE_ERROR; | ||
231 | + srs_error("hls decode video avc NALU data failed. ret=%d", ret); | ||
232 | + return ret; | ||
233 | + } | ||
234 | + // 7.3.1 NAL unit syntax, H.264-AVC-ISO_IEC_14496-10.pdf, page 44. | ||
235 | + stream->skip(NALUnitLength); | ||
236 | + | ||
237 | + i += NAL_unit_length + 1 + NALUnitLength; | ||
238 | + } | ||
183 | } else { | 239 | } else { |
184 | // ignored. | 240 | // ignored. |
185 | } | 241 | } |
@@ -174,13 +174,17 @@ public: | @@ -174,13 +174,17 @@ public: | ||
174 | */ | 174 | */ |
175 | // @see: SrsCodecVideo | 175 | // @see: SrsCodecVideo |
176 | int video_codec_id; | 176 | int video_codec_id; |
177 | - u_int8_t profile; // profile_idc, page 45. | ||
178 | - u_int8_t level; // level_idc, page 45. | 177 | + // profile_idc, H.264-AVC-ISO_IEC_14496-10.pdf, page 45. |
178 | + u_int8_t profile; | ||
179 | + // level_idc, H.264-AVC-ISO_IEC_14496-10.pdf, page 45. | ||
180 | + u_int8_t level; | ||
179 | int width; | 181 | int width; |
180 | int height; | 182 | int height; |
181 | int video_data_rate; // in bps | 183 | int video_data_rate; // in bps |
182 | int frame_rate; | 184 | int frame_rate; |
183 | int duration; | 185 | int duration; |
186 | + // lengthSizeMinusOne, H.264-AVC-ISO_IEC_14496-15.pdf, page 16 | ||
187 | + int8_t NAL_unit_length; | ||
184 | /** | 188 | /** |
185 | * audio specified | 189 | * audio specified |
186 | */ | 190 | */ |
@@ -208,8 +212,8 @@ public: | @@ -208,8 +212,8 @@ public: | ||
208 | virtual ~SrsCodec(); | 212 | virtual ~SrsCodec(); |
209 | // the following function used for hls to build the codec info. | 213 | // the following function used for hls to build the codec info. |
210 | public: | 214 | public: |
211 | - virtual int parse_audio_codec(int8_t* data, int size); | ||
212 | - virtual int parse_video_codec(int8_t* data, int size); | 215 | + virtual int audio_aac_demux(int8_t* data, int size); |
216 | + virtual int video_avc_demux(int8_t* data, int size); | ||
213 | // the following function used to finger out the flv/rtmp packet detail. | 217 | // the following function used to finger out the flv/rtmp packet detail. |
214 | public: | 218 | public: |
215 | /** | 219 | /** |
@@ -134,7 +134,7 @@ int SrsHLS::on_audio(SrsCommonMessage* audio) | @@ -134,7 +134,7 @@ int SrsHLS::on_audio(SrsCommonMessage* audio) | ||
134 | { | 134 | { |
135 | int ret = ERROR_SUCCESS; | 135 | int ret = ERROR_SUCCESS; |
136 | 136 | ||
137 | - if ((ret = codec->parse_audio_codec(audio->payload, audio->size)) != ERROR_SUCCESS) { | 137 | + if ((ret = codec->audio_aac_demux(audio->payload, audio->size)) != ERROR_SUCCESS) { |
138 | return ret; | 138 | return ret; |
139 | } | 139 | } |
140 | 140 | ||
@@ -145,7 +145,7 @@ int SrsHLS::on_video(SrsCommonMessage* video) | @@ -145,7 +145,7 @@ int SrsHLS::on_video(SrsCommonMessage* video) | ||
145 | { | 145 | { |
146 | int ret = ERROR_SUCCESS; | 146 | int ret = ERROR_SUCCESS; |
147 | 147 | ||
148 | - if ((ret = codec->parse_video_codec(video->payload, video->size)) != ERROR_SUCCESS) { | 148 | + if ((ret = codec->video_avc_demux(video->payload, video->size)) != ERROR_SUCCESS) { |
149 | return ret; | 149 | return ret; |
150 | } | 150 | } |
151 | 151 |
-
请 注册 或 登录 后发表评论