diff --git a/DONATIONS.txt b/DONATIONS.txt index dbec0d490..0803f82d6 100644 --- a/DONATIONS.txt +++ b/DONATIONS.txt @@ -13,6 +13,7 @@ RMB 500-999 * [2015-xx-xx xx:xx] xxx RMB 100-499 +* [2015-03-29 11-07] 姚伟斌 * [2015-03-14 20:21] 万伟 * [2015-03-11 09:44] 叶发养 * [2015-02-08 21:10] 韩友洪 diff --git a/trunk/src/app/srs_app_hls.cpp b/trunk/src/app/srs_app_hls.cpp index f010f81d6..446946ba9 100644 --- a/trunk/src/app/srs_app_hls.cpp +++ b/trunk/src/app/srs_app_hls.cpp @@ -563,11 +563,11 @@ int SrsHlsMuxer::_refresh_m3u8(string m3u8_file) // #EXTM3U\n // #EXT-X-VERSION:3\n - // #EXT-X-ALLOW-CACHE:NO\n + // #EXT-X-ALLOW-CACHE:YES\n std::stringstream ss; ss << "#EXTM3U" << SRS_CONSTS_LF << "#EXT-X-VERSION:3" << SRS_CONSTS_LF - << "#EXT-X-ALLOW-CACHE:NO" << SRS_CONSTS_LF; + << "#EXT-X-ALLOW-CACHE:YES" << SRS_CONSTS_LF; srs_verbose("write m3u8 header success."); // #EXT-X-MEDIA-SEQUENCE:4294967295\n diff --git a/trunk/src/kernel/srs_kernel_ts.cpp b/trunk/src/kernel/srs_kernel_ts.cpp index 5766f3e5f..856482a24 100644 --- a/trunk/src/kernel/srs_kernel_ts.cpp +++ b/trunk/src/kernel/srs_kernel_ts.cpp @@ -1265,10 +1265,15 @@ int SrsTsPayloadPES::decode(SrsStream* stream, SrsTsMessage** ppmsg) msg = new SrsTsMessage(channel, packet); channel->msg = msg; } + + // we must cache the fresh state of msg, + // for the PES_packet_length is 0, the first payload_unit_start_indicator always 1, + // so should check for the fresh and not completed it. + bool is_fresh_msg = msg->fresh(); // check when fresh, the payload_unit_start_indicator // should be 1 for the fresh msg. - if (msg->fresh() && !packet->payload_unit_start_indicator) { + if (is_fresh_msg && !packet->payload_unit_start_indicator) { ret = ERROR_STREAM_CASTER_TS_PSE; srs_error("ts: PES fresh packet length=%d, us=%d, cc=%d. ret=%d", msg->PES_packet_length, packet->payload_unit_start_indicator, packet->continuity_counter, @@ -1278,7 +1283,7 @@ int SrsTsPayloadPES::decode(SrsStream* stream, SrsTsMessage** ppmsg) // check when not fresh and PES_packet_length>0, // the payload_unit_start_indicator should never be 1 when not completed. - if (!msg->fresh() && msg->PES_packet_length > 0 + if (!is_fresh_msg && msg->PES_packet_length > 0 && !msg->completed(packet->payload_unit_start_indicator) && packet->payload_unit_start_indicator ) { @@ -1295,7 +1300,7 @@ int SrsTsPayloadPES::decode(SrsStream* stream, SrsTsMessage** ppmsg) } // check the continuity counter - if (!msg->fresh()) { + if (!is_fresh_msg) { // late-incoming or duplicated continuity, drop message. // @remark check overflow, the counter plus 1 should greater when invalid. if (msg->continuity_counter >= packet->continuity_counter @@ -1322,7 +1327,7 @@ int SrsTsPayloadPES::decode(SrsStream* stream, SrsTsMessage** ppmsg) msg->continuity_counter = packet->continuity_counter; // for the PES_packet_length(0), reap when completed. - if (!msg->fresh() && msg->completed(packet->payload_unit_start_indicator)) { + if (!is_fresh_msg && msg->completed(packet->payload_unit_start_indicator)) { // reap previous PES packet. *ppmsg = msg; channel->msg = NULL; @@ -1358,7 +1363,7 @@ int SrsTsPayloadPES::decode(SrsStream* stream, SrsTsMessage** ppmsg) packet_start_code_prefix &= 0xFFFFFF; if (packet_start_code_prefix != 0x01) { ret = ERROR_STREAM_CASTER_TS_PSE; - srs_error("ts: demux PSE start code failed, expect=0x01, actual=%#x. ret=%d", packet_start_code_prefix, ret); + srs_error("ts: demux PES start code failed, expect=0x01, actual=%#x. ret=%d", packet_start_code_prefix, ret); return ret; } int pos_packet = stream->pos(); @@ -1380,7 +1385,7 @@ int SrsTsPayloadPES::decode(SrsStream* stream, SrsTsMessage** ppmsg) // 3B flags. if (!stream->require(3)) { ret = ERROR_STREAM_CASTER_TS_PSE; - srs_error("ts: demux PSE flags failed. ret=%d", ret); + srs_error("ts: demux PES flags failed. ret=%d", ret); return ret; } // 1B @@ -1419,7 +1424,7 @@ int SrsTsPayloadPES::decode(SrsStream* stream, SrsTsMessage** ppmsg) nb_required += PES_extension_flag? 1:0; if (!stream->require(nb_required)) { ret = ERROR_STREAM_CASTER_TS_PSE; - srs_error("ts: demux PSE payload failed. ret=%d", ret); + srs_error("ts: demux PES payload failed. ret=%d", ret); return ret; } @@ -1638,6 +1643,13 @@ int SrsTsPayloadPES::decode(SrsStream* stream, SrsTsMessage** ppmsg) srs_warn("ts: drop the pes packet %dB for stream_id=%#x", nb_drop, stream_id); } } + + // when fresh and the PES_packet_length is 0, + // the payload_unit_start_indicator always be 1, + // the message should never EOF for the first packet. + if (is_fresh_msg && msg->PES_packet_length == 0) { + return ret; + } // check msg, reap when completed. if (msg->completed(packet->payload_unit_start_indicator)) { diff --git a/trunk/src/protocol/srs_raw_avc.cpp b/trunk/src/protocol/srs_raw_avc.cpp index e25b6c5c7..d3efced03 100644 --- a/trunk/src/protocol/srs_raw_avc.cpp +++ b/trunk/src/protocol/srs_raw_avc.cpp @@ -438,6 +438,7 @@ int SrsRawAacStream::adts_demux(SrsStream* stream, char** pframe, int* pnb_frame codec.frame_length = frame_length; // @see srs_audio_write_raw_frame(). + // TODO: FIXME: maybe need to resample audio. codec.sound_format = 10; // AAC if (sampling_frequency_index <= 0x0c && sampling_frequency_index > 0x0a) { codec.sound_rate = SrsCodecAudioSampleRate5512; @@ -451,7 +452,7 @@ int SrsRawAacStream::adts_demux(SrsStream* stream, char** pframe, int* pnb_frame codec.sound_rate = SrsCodecAudioSampleRate44100; srs_warn("adts invalid sample rate for flv, rate=%#x", sampling_frequency_index); } - codec.sound_size = srs_max(0, srs_min(1, channel_configuration - 1)); + codec.sound_type = srs_max(0, srs_min(1, channel_configuration - 1)); // TODO: FIXME: finger it out the sound size by adts. codec.sound_size = 1; // 0(8bits) or 1(16bits).