diff --git a/trunk/src/app/srs_app_mpegts_udp.cpp b/trunk/src/app/srs_app_mpegts_udp.cpp index c84c052ac..e510ea736 100644 --- a/trunk/src/app/srs_app_mpegts_udp.cpp +++ b/trunk/src/app/srs_app_mpegts_udp.cpp @@ -38,6 +38,7 @@ using namespace std; #include #include #include +#include #ifdef SRS_AUTO_STREAM_CASTER @@ -160,8 +161,8 @@ int SrsMpegtsOverUdp::on_ts_message(SrsTsMessage* msg) // for example, when SrsTsStream of SrsTsChannel indicates stream_type is SrsTsStreamVideoMpeg4 and SrsTsStreamAudioMpeg4, // the elementary stream can be mux in "2.11 Carriage of ISO/IEC 14496 data" in hls-mpeg-ts-iso13818-1.pdf, page 103 // @remark, the most popular stream_id is 0xe0 for h.264 over mpegts, which indicates the stream_id is video and - // stream_number is 0, where I guess the elementary is specified in 13818-2(video part). - // because when audio stream_number is 0, the elementary is ADTS specified in 13818-7(aac part). + // stream_number is 0, where I guess the elementary is specified in annexb format(H.264-AVC-ISO_IEC_14496-10.pdf, page 211). + // because when audio stream_number is 0, the elementary is ADTS(aac-mp4a-format-ISO_IEC_14496-3+2001.pdf, page 75, 1.A.2.2 ADTS). // about the bytes of PES_packet_data_byte, defined in hls-mpeg-ts-iso13818-1.pdf, page 58 // PES_packet_data_byte ¨C PES_packet_data_bytes shall be contiguous bytes of data from the elementary stream @@ -193,11 +194,19 @@ int SrsMpegtsOverUdp::on_ts_message(SrsTsMessage* msg) // 14496-2 video stream number xxxx // ((stream_id >> 4) & 0x0f) == SrsTsPESStreamIdVideo - srs_trace("mpegts: got %s dts=%"PRId64", pts=%"PRId64", size=%d, us=%d, cc=%d, sid=%#x(%s-%d)", - (msg->channel->apply == SrsTsPidApplyVideo)? "Video":"Audio", msg->dts, msg->pts, msg->payload->length(), - msg->packet->payload_unit_start_indicator, msg->continuity_counter, msg->sid, + srs_trace("mpegts: got %s stream=%s, dts=%"PRId64", pts=%"PRId64", size=%d, us=%d, cc=%d, sid=%#x(%s-%d)", + (msg->channel->apply == SrsTsPidApplyVideo)? "Video":"Audio", srs_ts_stream2string(msg->channel->stream).c_str(), + msg->dts, msg->pts, msg->payload->length(), msg->packet->payload_unit_start_indicator, msg->continuity_counter, msg->sid, msg->is_audio()? "A":msg->is_video()? "V":"N", msg->stream_number()); + // when not audio/video, or not adts/annexb format, donot support. + if (msg->stream_number() != 0) { + ret = ERROR_STREAM_CASTER_TS_ES; + srs_error("mpegts: unsupported stream format, sid=%#x(%s-%d). ret=%d", + msg->sid, msg->is_audio()? "A":msg->is_video()? "V":"N", msg->stream_number(), ret); + return ret; + } + // TODO: FIXME: implements it. return ret; } diff --git a/trunk/src/core/srs_core.hpp b/trunk/src/core/srs_core.hpp index 1d21f36e4..740f71905 100644 --- a/trunk/src/core/srs_core.hpp +++ b/trunk/src/core/srs_core.hpp @@ -31,7 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // current release version #define VERSION_MAJOR 2 #define VERSION_MINOR 0 -#define VERSION_REVISION 108 +#define VERSION_REVISION 109 // server info. #define RTMP_SIG_SRS_KEY "SRS" diff --git a/trunk/src/kernel/srs_kernel_error.hpp b/trunk/src/kernel/srs_kernel_error.hpp index 3cfa87d98..f97443b60 100644 --- a/trunk/src/kernel/srs_kernel_error.hpp +++ b/trunk/src/kernel/srs_kernel_error.hpp @@ -227,6 +227,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #define ERROR_STREAM_CASTER_TS_PAT 4017 #define ERROR_STREAM_CASTER_TS_PMT 4018 #define ERROR_STREAM_CASTER_TS_PSE 4019 +#define ERROR_STREAM_CASTER_TS_ES 4020 /** * whether the error code is an system control error. diff --git a/trunk/src/kernel/srs_kernel_ts.cpp b/trunk/src/kernel/srs_kernel_ts.cpp index 51665d4a9..26766d01b 100644 --- a/trunk/src/kernel/srs_kernel_ts.cpp +++ b/trunk/src/kernel/srs_kernel_ts.cpp @@ -402,6 +402,21 @@ SrsMpegtsFrame::SrsMpegtsFrame() key = false; } +string srs_ts_stream2string(SrsTsStream stream) +{ + switch (stream) { + case SrsTsStreamReserved: return "Reserved"; + case SrsTsStreamAudioMp3: return "MP3"; + case SrsTsStreamAudioAAC: return "AAC"; + case SrsTsStreamAudioAC3: return "AC3"; + case SrsTsStreamAudioDTS: return "AudioDTS"; + case SrsTsStreamVideoH264: return "H.264"; + case SrsTsStreamVideoMpeg4: return "MP4"; + case SrsTsStreamAudioMpeg4: return "MP4A"; + default: return "Other"; + } +} + SrsTsChannel::SrsTsChannel() { pid = 0; diff --git a/trunk/src/kernel/srs_kernel_ts.hpp b/trunk/src/kernel/srs_kernel_ts.hpp index 9fe15f64f..4c5d325cd 100644 --- a/trunk/src/kernel/srs_kernel_ts.hpp +++ b/trunk/src/kernel/srs_kernel_ts.hpp @@ -174,6 +174,7 @@ enum SrsTsStream SrsTsStreamAudioAC3 = 0x81, SrsTsStreamAudioDTS = 0x8a, }; +std::string srs_ts_stream2string(SrsTsStream stream); /** * the ts channel.