winlin

for #635, refine hls open/close gop.

@@ -1070,11 +1070,6 @@ int SrsHlsCache::write_video(SrsAvcAacCodec* codec, SrsHlsMuxer* muxer, int64_t @@ -1070,11 +1070,6 @@ int SrsHlsCache::write_video(SrsAvcAacCodec* codec, SrsHlsMuxer* muxer, int64_t
1070 // a. wait keyframe and got keyframe. 1070 // a. wait keyframe and got keyframe.
1071 // b. always reap when not wait keyframe. 1071 // b. always reap when not wait keyframe.
1072 if (!muxer->wait_keyframe() || sample->frame_type == SrsCodecVideoAVCFrameKeyFrame) { 1072 if (!muxer->wait_keyframe() || sample->frame_type == SrsCodecVideoAVCFrameKeyFrame) {
1073 - // when wait keyframe, there must exists idr frame in sample, or NonIDR(open gop) specified.  
1074 - if (!sample->open_gop && !sample->has_idr && muxer->wait_keyframe()) {  
1075 - srs_warn("hls: ts starts without IDR, first nalu=%d, idr=%d", sample->first_nalu_type, sample->has_idr);  
1076 - }  
1077 -  
1078 // reap the segment, which will also flush the video. 1073 // reap the segment, which will also flush the video.
1079 if ((ret = reap_segment("video", muxer, cache->video->dts)) != ERROR_SUCCESS) { 1074 if ((ret = reap_segment("video", muxer, cache->video->dts)) != ERROR_SUCCESS) {
1080 return ret; 1075 return ret;
@@ -1274,8 +1269,6 @@ void SrsHls::on_unpublish() @@ -1274,8 +1269,6 @@ void SrsHls::on_unpublish()
1274 srs_error("ignore m3u8 muxer flush/close audio failed. ret=%d", ret); 1269 srs_error("ignore m3u8 muxer flush/close audio failed. ret=%d", ret);
1275 } 1270 }
1276 1271
1277 - sample->reset();  
1278 -  
1279 hls_enabled = false; 1272 hls_enabled = false;
1280 } 1273 }
1281 1274
@@ -324,20 +324,13 @@ SrsCodecSampleUnit::~SrsCodecSampleUnit() @@ -324,20 +324,13 @@ SrsCodecSampleUnit::~SrsCodecSampleUnit()
324 324
325 SrsCodecSample::SrsCodecSample() 325 SrsCodecSample::SrsCodecSample()
326 { 326 {
327 - reset(); 327 + clear();
328 } 328 }
329 329
330 SrsCodecSample::~SrsCodecSample() 330 SrsCodecSample::~SrsCodecSample()
331 { 331 {
332 } 332 }
333 333
334 -void SrsCodecSample::reset()  
335 -{  
336 - clear();  
337 -  
338 - open_gop = false;  
339 -}  
340 -  
341 void SrsCodecSample::clear() 334 void SrsCodecSample::clear()
342 { 335 {
343 is_video = false; 336 is_video = false;
@@ -346,7 +339,7 @@ void SrsCodecSample::clear() @@ -346,7 +339,7 @@ void SrsCodecSample::clear()
346 cts = 0; 339 cts = 0;
347 frame_type = SrsCodecVideoAVCFrameReserved; 340 frame_type = SrsCodecVideoAVCFrameReserved;
348 avc_packet_type = SrsCodecVideoAVCTypeReserved; 341 avc_packet_type = SrsCodecVideoAVCTypeReserved;
349 - has_aud = has_idr = false; 342 + has_sps_pps = has_aud = has_idr = false;
350 first_nalu_type = SrsAvcNaluTypeReserved; 343 first_nalu_type = SrsAvcNaluTypeReserved;
351 344
352 acodec = SrsCodecAudioReserved1; 345 acodec = SrsCodecAudioReserved1;
@@ -377,6 +370,8 @@ int SrsCodecSample::add_sample_unit(char* bytes, int size) @@ -377,6 +370,8 @@ int SrsCodecSample::add_sample_unit(char* bytes, int size)
377 370
378 if (nal_unit_type == SrsAvcNaluTypeIDR) { 371 if (nal_unit_type == SrsAvcNaluTypeIDR) {
379 has_idr = true; 372 has_idr = true;
  373 + } else if (nal_unit_type == SrsAvcNaluTypeSPS || nal_unit_type == SrsAvcNaluTypePPS) {
  374 + has_sps_pps = true;
380 } else if (nal_unit_type == SrsAvcNaluTypeAccessUnitDelimiter) { 375 } else if (nal_unit_type == SrsAvcNaluTypeAccessUnitDelimiter) {
381 has_aud = true; 376 has_aud = true;
382 } 377 }
@@ -773,11 +768,6 @@ int SrsAvcAacCodec::video_nalu_demux(SrsStream* stream, SrsCodecSample* sample) @@ -773,11 +768,6 @@ int SrsAvcAacCodec::video_nalu_demux(SrsStream* stream, SrsCodecSample* sample)
773 srs_info("hls decode avc payload in annexb format."); 768 srs_info("hls decode avc payload in annexb format.");
774 } 769 }
775 770
776 - // for keyframe, but not IDR, it's open gop.  
777 - if (sample->frame_type == SrsCodecVideoAVCFrameKeyFrame && !sample->has_idr) {  
778 - sample->open_gop = true;  
779 - }  
780 -  
781 return ret; 771 return ret;
782 } 772 }
783 773
@@ -387,13 +387,11 @@ public: @@ -387,13 +387,11 @@ public:
387 bool has_idr; 387 bool has_idr;
388 // Whether exists AUD NALU. 388 // Whether exists AUD NALU.
389 bool has_aud; 389 bool has_aud;
  390 + // Whether exists SPS/PPS NALU.
  391 + bool has_sps_pps;
390 // The first nalu type. 392 // The first nalu type.
391 SrsAvcNaluType first_nalu_type; 393 SrsAvcNaluType first_nalu_type;
392 public: 394 public:
393 - // Whether stream is open gop, which means the keyframe is not IDR but NonIDR.  
394 - // @remark we will identify whether stream is open-gop util reset.  
395 - bool open_gop;  
396 -public:  
397 // audio specified 395 // audio specified
398 SrsCodecAudio acodec; 396 SrsCodecAudio acodec;
399 // audio aac specified. 397 // audio aac specified.
@@ -405,8 +403,6 @@ public: @@ -405,8 +403,6 @@ public:
405 SrsCodecSample(); 403 SrsCodecSample();
406 virtual ~SrsCodecSample(); 404 virtual ~SrsCodecSample();
407 public: 405 public:
408 - // Reset the sample, clear the sample-base and stream-base data.  
409 - void reset();  
410 /** 406 /**
411 * clear all samples. 407 * clear all samples.
412 * the sample units never copy the bytes, it directly use the ptr, 408 * the sample units never copy the bytes, it directly use the ptr,
@@ -2927,10 +2927,8 @@ int SrsTsCache::do_cache_aac(SrsAvcAacCodec* codec, SrsCodecSample* sample) @@ -2927,10 +2927,8 @@ int SrsTsCache::do_cache_aac(SrsAvcAacCodec* codec, SrsCodecSample* sample)
2927 return ret; 2927 return ret;
2928 } 2928 }
2929 2929
2930 -int SrsTsCache::do_cache_avc(SrsAvcAacCodec* codec, SrsCodecSample* sample) 2930 +void srs_avc_insert_aud(SrsSimpleBuffer* payload, bool& aud_inserted)
2931 { 2931 {
2932 - int ret = ERROR_SUCCESS;  
2933 -  
2934 // mux the samples in annexb format, 2932 // mux the samples in annexb format,
2935 // H.264-AVC-ISO_IEC_14496-10-2012.pdf, page 324. 2933 // H.264-AVC-ISO_IEC_14496-10-2012.pdf, page 324.
2936 /** 2934 /**
@@ -2977,84 +2975,56 @@ int SrsTsCache::do_cache_avc(SrsAvcAacCodec* codec, SrsCodecSample* sample) @@ -2977,84 +2975,56 @@ int SrsTsCache::do_cache_avc(SrsAvcAacCodec* codec, SrsCodecSample* sample)
2977 static u_int8_t fresh_nalu_header[] = { 0x00, 0x00, 0x00, 0x01 }; 2975 static u_int8_t fresh_nalu_header[] = { 0x00, 0x00, 0x00, 0x01 };
2978 static u_int8_t cont_nalu_header[] = { 0x00, 0x00, 0x01 }; 2976 static u_int8_t cont_nalu_header[] = { 0x00, 0x00, 0x01 };
2979 2977
2980 - // the aud(access unit delimiter) before each frame.  
2981 - // 7.3.2.4 Access unit delimiter RBSP syntax  
2982 - // H.264-AVC-ISO_IEC_14496-10-2012.pdf, page 66.  
2983 - //  
2984 - // primary_pic_type u(3), the first 3bits, primary_pic_type indicates that the slice_type values  
2985 - // for all slices of the primary coded picture are members of the set listed in Table 7-5 for  
2986 - // the given value of primary_pic_type.  
2987 - // 0, slice_type 2, 7  
2988 - // 1, slice_type 0, 2, 5, 7  
2989 - // 2, slice_type 0, 1, 2, 5, 6, 7  
2990 - // 3, slice_type 4, 9  
2991 - // 4, slice_type 3, 4, 8, 9  
2992 - // 5, slice_type 2, 4, 7, 9  
2993 - // 6, slice_type 0, 2, 3, 4, 5, 7, 8, 9  
2994 - // 7, slice_type 0, 1, 2, 3, 4, 5, 6, 7, 8, 9  
2995 - // 7.4.2.4 Access unit delimiter RBSP semantics  
2996 - // H.264-AVC-ISO_IEC_14496-10-2012.pdf, page 102.  
2997 - //  
2998 - // slice_type specifies the coding type of the slice according to Table 7-6.  
2999 - // 0, P (P slice)  
3000 - // 1, B (B slice)  
3001 - // 2, I (I slice)  
3002 - // 3, SP (SP slice)  
3003 - // 4, SI (SI slice)  
3004 - // 5, P (P slice)  
3005 - // 6, B (B slice)  
3006 - // 7, I (I slice)  
3007 - // 8, SP (SP slice)  
3008 - // 9, SI (SI slice)  
3009 - // H.264-AVC-ISO_IEC_14496-10-2012.pdf, page 105.  
3010 - static u_int8_t aud_nalu_7[] = { 0x09, 0xf0};  
3011 -  
3012 - // For NonIDR(open gop), we directly appends all frames.  
3013 - if (sample->open_gop) {  
3014 - for (int i = 0; i < sample->nb_sample_units; i++) {  
3015 - SrsCodecSampleUnit* sample_unit = &sample->sample_units[i];  
3016 - int32_t size = sample_unit->size;  
3017 -  
3018 - if (!sample_unit->bytes || size <= 0) {  
3019 - ret = ERROR_HLS_AVC_SAMPLE_SIZE;  
3020 - srs_error("invalid avc sample length=%d, ret=%d", size, ret);  
3021 - return ret;  
3022 - }  
3023 -  
3024 - // insert nalu header before rbsp.  
3025 - if (i == 0) {  
3026 - video->payload->append((const char*)fresh_nalu_header, 4);  
3027 - } else {  
3028 - video->payload->append((const char*)cont_nalu_header, 3);  
3029 - }  
3030 -  
3031 - // sample data  
3032 - video->payload->append(sample_unit->bytes, sample_unit->size);  
3033 - }  
3034 -  
3035 - return ret; 2978 + if (!aud_inserted) {
  2979 + aud_inserted = true;
  2980 + payload->append((const char*)fresh_nalu_header, 4);
  2981 + } else {
  2982 + payload->append((const char*)cont_nalu_header, 3);
3036 } 2983 }
  2984 +}
  2985 +
  2986 +int SrsTsCache::do_cache_avc(SrsAvcAacCodec* codec, SrsCodecSample* sample)
  2987 +{
  2988 + int ret = ERROR_SUCCESS;
3037 2989
3038 - // always append a aud nalu for each frame.  
3039 - video->payload->append((const char*)fresh_nalu_header, 4);  
3040 - video->payload->append((const char*)aud_nalu_7, 2);  
3041 -  
3042 - // when ts message(samples) contains IDR, insert sps+pps.  
3043 - if (sample->has_idr) {  
3044 - // fresh nalu header before sps.  
3045 - if (codec->sequenceParameterSetLength > 0) {  
3046 - // AnnexB prefix, for sps always 4 bytes header  
3047 - video->payload->append((const char*)fresh_nalu_header, 4);  
3048 - // sps  
3049 - video->payload->append(codec->sequenceParameterSetNALUnit, codec->sequenceParameterSetLength);  
3050 - }  
3051 - // cont nalu header before pps.  
3052 - if (codec->pictureParameterSetLength > 0) {  
3053 - // AnnexB prefix, for pps always 3 bytes header  
3054 - video->payload->append((const char*)cont_nalu_header, 3);  
3055 - // pps  
3056 - video->payload->append(codec->pictureParameterSetNALUnit, codec->pictureParameterSetLength);  
3057 - } 2990 + // Whether aud inserted.
  2991 + bool aud_inserted = false;
  2992 +
  2993 + // Insert a default AUD NALU when no AUD in samples.
  2994 + if (!sample->has_aud) {
  2995 + // the aud(access unit delimiter) before each frame.
  2996 + // 7.3.2.4 Access unit delimiter RBSP syntax
  2997 + // H.264-AVC-ISO_IEC_14496-10-2012.pdf, page 66.
  2998 + //
  2999 + // primary_pic_type u(3), the first 3bits, primary_pic_type indicates that the slice_type values
  3000 + // for all slices of the primary coded picture are members of the set listed in Table 7-5 for
  3001 + // the given value of primary_pic_type.
  3002 + // 0, slice_type 2, 7
  3003 + // 1, slice_type 0, 2, 5, 7
  3004 + // 2, slice_type 0, 1, 2, 5, 6, 7
  3005 + // 3, slice_type 4, 9
  3006 + // 4, slice_type 3, 4, 8, 9
  3007 + // 5, slice_type 2, 4, 7, 9
  3008 + // 6, slice_type 0, 2, 3, 4, 5, 7, 8, 9
  3009 + // 7, slice_type 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
  3010 + // 7.4.2.4 Access unit delimiter RBSP semantics
  3011 + // H.264-AVC-ISO_IEC_14496-10-2012.pdf, page 102.
  3012 + //
  3013 + // slice_type specifies the coding type of the slice according to Table 7-6.
  3014 + // 0, P (P slice)
  3015 + // 1, B (B slice)
  3016 + // 2, I (I slice)
  3017 + // 3, SP (SP slice)
  3018 + // 4, SI (SI slice)
  3019 + // 5, P (P slice)
  3020 + // 6, B (B slice)
  3021 + // 7, I (I slice)
  3022 + // 8, SP (SP slice)
  3023 + // 9, SI (SI slice)
  3024 + // H.264-AVC-ISO_IEC_14496-10-2012.pdf, page 105.
  3025 + static u_int8_t default_aud_nalu[] = { 0x09, 0xf0};
  3026 + srs_avc_insert_aud(video->payload, aud_inserted);
  3027 + video->payload->append((const char*)default_aud_nalu, 2);
3058 } 3028 }
3059 3029
3060 // all sample use cont nalu header, except the sps-pps before IDR frame. 3030 // all sample use cont nalu header, except the sps-pps before IDR frame.
@@ -3072,20 +3042,21 @@ int SrsTsCache::do_cache_avc(SrsAvcAacCodec* codec, SrsCodecSample* sample) @@ -3072,20 +3042,21 @@ int SrsTsCache::do_cache_avc(SrsAvcAacCodec* codec, SrsCodecSample* sample)
3072 // H.264-AVC-ISO_IEC_14496-10-2012.pdf, page 83. 3042 // H.264-AVC-ISO_IEC_14496-10-2012.pdf, page 83.
3073 SrsAvcNaluType nal_unit_type = (SrsAvcNaluType)(sample_unit->bytes[0] & 0x1f); 3043 SrsAvcNaluType nal_unit_type = (SrsAvcNaluType)(sample_unit->bytes[0] & 0x1f);
3074 3044
3075 - // ignore SPS/PPS/AUD  
3076 - switch (nal_unit_type) {  
3077 - case SrsAvcNaluTypeSPS:  
3078 - case SrsAvcNaluTypePPS:  
3079 - case SrsAvcNaluTypeAccessUnitDelimiter:  
3080 - continue;  
3081 - default:  
3082 - break; 3045 + // Insert sps/pps before IDR when there is no sps/pps in samples.
  3046 + // The sps/pps is parsed from sequence header(generally the first flv packet).
  3047 + if (nal_unit_type == SrsAvcNaluTypeIDR && !sample->has_sps_pps) {
  3048 + if (codec->sequenceParameterSetLength > 0) {
  3049 + srs_avc_insert_aud(video->payload, aud_inserted);
  3050 + video->payload->append(codec->sequenceParameterSetNALUnit, codec->sequenceParameterSetLength);
  3051 + }
  3052 + if (codec->pictureParameterSetLength > 0) {
  3053 + srs_avc_insert_aud(video->payload, aud_inserted);
  3054 + video->payload->append(codec->pictureParameterSetNALUnit, codec->pictureParameterSetLength);
  3055 + }
3083 } 3056 }
3084 3057
3085 - // insert cont nalu header before frame.  
3086 - video->payload->append((const char*)cont_nalu_header, 3);  
3087 -  
3088 - // sample data 3058 + // Insert the NALU to video in annexb.
  3059 + srs_avc_insert_aud(video->payload, aud_inserted);
3089 video->payload->append(sample_unit->bytes, sample_unit->size); 3060 video->payload->append(sample_unit->bytes, sample_unit->size);
3090 } 3061 }
3091 3062
@@ -3132,8 +3103,6 @@ int SrsTsEncoder::initialize(SrsFileWriter* fw) @@ -3132,8 +3103,6 @@ int SrsTsEncoder::initialize(SrsFileWriter* fw)
3132 return ret; 3103 return ret;
3133 } 3104 }
3134 3105
3135 - sample->reset();  
3136 -  
3137 return ret; 3106 return ret;
3138 } 3107 }
3139 3108