From 885b9af122cb9f2fb1ec57787f73bae73c9e9a50 Mon Sep 17 00:00:00 2001 From: winlin Date: Sun, 8 Mar 2015 17:56:49 +0800 Subject: [PATCH] for #310, refine code to support he/hev2, use aac object. --- trunk/src/app/srs_app_source.cpp | 6 +++--- trunk/src/app/srs_app_statistic.cpp | 8 ++++---- trunk/src/app/srs_app_statistic.hpp | 4 ++-- trunk/src/kernel/srs_kernel_aac.cpp | 5 +++-- trunk/src/kernel/srs_kernel_aac.hpp | 2 +- trunk/src/kernel/srs_kernel_codec.cpp | 6 +++--- trunk/src/kernel/srs_kernel_codec.hpp | 2 +- trunk/src/kernel/srs_kernel_ts.cpp | 3 ++- trunk/src/protocol/srs_raw_avc.cpp | 6 +++--- trunk/src/protocol/srs_raw_avc.hpp | 2 +- 10 files changed, 23 insertions(+), 21 deletions(-) diff --git a/trunk/src/app/srs_app_source.cpp b/trunk/src/app/srs_app_source.cpp index cf8883620..f11758dcd 100644 --- a/trunk/src/app/srs_app_source.cpp +++ b/trunk/src/app/srs_app_source.cpp @@ -1397,15 +1397,15 @@ int SrsSource::on_audio(SrsCommonMessage* __audio) // when got audio stream info. SrsStatistic* stat = SrsStatistic::instance(); - if ((ret = stat->on_audio_info(_req, SrsCodecAudioAAC, sample.sound_rate, sample.sound_type, codec.aac_profile)) != ERROR_SUCCESS) { + if ((ret = stat->on_audio_info(_req, SrsCodecAudioAAC, sample.sound_rate, sample.sound_type, codec.aac_object)) != ERROR_SUCCESS) { return ret; } srs_trace("%dB audio sh, " - "codec(%d, profile=%d, %dchannels, %dkbps, %dHZ), " + "codec(%d, profile=%s, %dchannels, %dkbps, %dHZ), " "flv(%dbits, %dchannels, %dHZ)", msg.size, codec.audio_codec_id, - codec.aac_profile, codec.aac_channels, + srs_codec_aac_object2str(codec.aac_object).c_str(), codec.aac_channels, codec.audio_data_rate / 1000, aac_sample_rates[codec.aac_sample_rate], flv_sample_sizes[sample.sound_size], flv_sound_types[sample.sound_type], flv_sample_rates[sample.sound_rate]); diff --git a/trunk/src/app/srs_app_statistic.cpp b/trunk/src/app/srs_app_statistic.cpp index c1a9dbbfa..aa1de908b 100644 --- a/trunk/src/app/srs_app_statistic.cpp +++ b/trunk/src/app/srs_app_statistic.cpp @@ -60,7 +60,7 @@ SrsStatisticStream::SrsStatisticStream() acodec = SrsCodecAudioReserved1; asample_rate = SrsCodecAudioSampleRateReserved; asound_type = SrsCodecAudioSoundTypeReserved; - aac_profile = SrsAacProfileReserved; + aac_object = SrsAacObjectTypeReserved; } SrsStatisticStream::~SrsStatisticStream() @@ -128,7 +128,7 @@ int SrsStatistic::on_video_info(SrsRequest* req, int SrsStatistic::on_audio_info(SrsRequest* req, SrsCodecAudio acodec, SrsCodecAudioSampleRate asample_rate, SrsCodecAudioSoundType asound_type, - SrsAacProfile aac_profile + SrsAacObjectType aac_object ) { int ret = ERROR_SUCCESS; @@ -139,7 +139,7 @@ int SrsStatistic::on_audio_info(SrsRequest* req, stream->acodec = acodec; stream->asample_rate = asample_rate; stream->asound_type = asound_type; - stream->aac_profile = aac_profile; + stream->aac_object = aac_object; return ret; } @@ -257,7 +257,7 @@ int SrsStatistic::dumps_streams(stringstream& ss) << __SRS_JFIELD_STR("codec", srs_codec_audio2str(stream->acodec)) << __SRS_JFIELD_CONT << __SRS_JFIELD_ORG("sample_rate", (int)flv_sample_rates[stream->asample_rate]) << __SRS_JFIELD_CONT << __SRS_JFIELD_ORG("channel", (int)stream->asound_type + 1) << __SRS_JFIELD_CONT - << __SRS_JFIELD_STR("profile", srs_codec_aac_profile2str(stream->aac_profile)) + << __SRS_JFIELD_STR("profile", srs_codec_aac_object2str(stream->aac_object)) << __SRS_JOBJECT_END; } diff --git a/trunk/src/app/srs_app_statistic.hpp b/trunk/src/app/srs_app_statistic.hpp index 0cf7ea0b5..7af080a6a 100644 --- a/trunk/src/app/srs_app_statistic.hpp +++ b/trunk/src/app/srs_app_statistic.hpp @@ -73,7 +73,7 @@ public: * 1.5.1.1 Audio object type definition, page 23, * in aac-mp4a-format-ISO_IEC_14496-3+2001.pdf. */ - SrsAacProfile aac_profile; + SrsAacObjectType aac_object; public: SrsStatisticStream(); virtual ~SrsStatisticStream(); @@ -120,7 +120,7 @@ public: */ virtual int on_audio_info(SrsRequest* req, SrsCodecAudio acodec, SrsCodecAudioSampleRate asample_rate, SrsCodecAudioSoundType asound_type, - SrsAacProfile aac_profile + SrsAacObjectType aac_object ); /** * when close stream. diff --git a/trunk/src/kernel/srs_kernel_aac.cpp b/trunk/src/kernel/srs_kernel_aac.cpp index 4cfbd47bb..18193fbe1 100644 --- a/trunk/src/kernel/srs_kernel_aac.cpp +++ b/trunk/src/kernel/srs_kernel_aac.cpp @@ -43,7 +43,7 @@ SrsAacEncoder::SrsAacEncoder() _fs = NULL; got_sequence_header = false; tag_stream = new SrsStream(); - aac_profile = SrsAacProfileReserved; + aac_object = SrsAacObjectTypeReserved; } SrsAacEncoder::~SrsAacEncoder() @@ -131,7 +131,7 @@ int SrsAacEncoder::write_audio(int64_t timestamp, char* data, int size) aac_sample_rate = ((audioObjectType << 1) & 0x0e) | ((aac_sample_rate >> 7) & 0x01); audioObjectType = (audioObjectType >> 3) & 0x1f; - aac_profile = srs_codec_aac_rtmp2ts((SrsAacObjectType)audioObjectType); + aac_object = (SrsAacObjectType)audioObjectType; got_sequence_header = true; @@ -186,6 +186,7 @@ int SrsAacEncoder::write_audio(int64_t timestamp, char* data, int size) // channel_configuration 3 uimsbf // original/copy 1 bslbf // home 1 bslbf + SrsAacProfile aac_profile = srs_codec_aac_rtmp2ts(aac_object); *pp++ = ((aac_profile << 6) & 0xc0) | ((aac_sample_rate << 2) & 0x3c) | ((aac_channels >> 2) & 0x01); // 4bits left. // adts_variable_header(), 1.A.2.2.2 Variable Header of ADTS diff --git a/trunk/src/kernel/srs_kernel_aac.hpp b/trunk/src/kernel/srs_kernel_aac.hpp index 4aaa890d9..e29ce9f17 100644 --- a/trunk/src/kernel/srs_kernel_aac.hpp +++ b/trunk/src/kernel/srs_kernel_aac.hpp @@ -45,7 +45,7 @@ class SrsAacEncoder private: SrsFileWriter* _fs; private: - SrsAacProfile aac_profile; + SrsAacObjectType aac_object; int8_t aac_sample_rate; int8_t aac_channels; bool got_sequence_header; diff --git a/trunk/src/kernel/srs_kernel_codec.cpp b/trunk/src/kernel/srs_kernel_codec.cpp index afd0d3280..4898017c5 100644 --- a/trunk/src/kernel/srs_kernel_codec.cpp +++ b/trunk/src/kernel/srs_kernel_codec.cpp @@ -294,7 +294,7 @@ SrsAvcAacCodec::SrsAvcAacCodec() avc_profile = 0; avc_level = 0; - aac_profile = SrsAacProfileReserved; + aac_object = SrsAacObjectTypeReserved; aac_sample_rate = __SRS_AAC_SAMPLE_RATE_UNSET; // sample rate ignored aac_channels = 0; avc_extra_size = 0; @@ -493,8 +493,8 @@ int SrsAvcAacCodec::audio_aac_sequence_header_demux(char* data, int size) aac_sample_rate = samplingFrequencyIndex; // convert the object type in sequence header to aac profile of ADTS. - aac_profile = srs_codec_aac_rtmp2ts((SrsAacObjectType)profile_ObjectType); - if (aac_profile == SrsAacProfileReserved) { + aac_object = (SrsAacObjectType)profile_ObjectType; + if (aac_object == SrsAacObjectTypeReserved) { ret = ERROR_HLS_DECODE_ERROR; srs_error("audio codec decode aac sequence header failed, " "adts object=%d invalid. ret=%d", profile_ObjectType, ret); diff --git a/trunk/src/kernel/srs_kernel_codec.hpp b/trunk/src/kernel/srs_kernel_codec.hpp index 950ffb1e4..6729dbb73 100644 --- a/trunk/src/kernel/srs_kernel_codec.hpp +++ b/trunk/src/kernel/srs_kernel_codec.hpp @@ -472,7 +472,7 @@ public: * 1.5.1.1 Audio object type definition, page 23, * in aac-mp4a-format-ISO_IEC_14496-3+2001.pdf. */ - SrsAacProfile aac_profile; + SrsAacObjectType aac_object; /** * samplingFrequencyIndex */ diff --git a/trunk/src/kernel/srs_kernel_ts.cpp b/trunk/src/kernel/srs_kernel_ts.cpp index 5438cf7e8..1b871f8c8 100644 --- a/trunk/src/kernel/srs_kernel_ts.cpp +++ b/trunk/src/kernel/srs_kernel_ts.cpp @@ -2797,7 +2797,8 @@ int SrsTsCache::do_cache_aac(SrsAvcAacCodec* codec, SrsCodecSample* sample) int8_t number_of_raw_data_blocks_in_frame; //2bits, 0 indicating 1 raw_data_block() */ // profile, 2bits - adts_header[2] = (codec->aac_profile << 6) & 0xc0; + SrsAacProfile aac_profile = srs_codec_aac_rtmp2ts(codec->aac_object); + adts_header[2] = (aac_profile << 6) & 0xc0; // sampling_frequency_index 4bits adts_header[2] |= (codec->aac_sample_rate << 2) & 0x3c; // channel_configuration 3bits diff --git a/trunk/src/protocol/srs_raw_avc.cpp b/trunk/src/protocol/srs_raw_avc.cpp index f288792e7..e25b6c5c7 100644 --- a/trunk/src/protocol/srs_raw_avc.cpp +++ b/trunk/src/protocol/srs_raw_avc.cpp @@ -432,7 +432,7 @@ int SrsRawAacStream::adts_demux(SrsStream* stream, char** pframe, int* pnb_frame // the codec info. codec.protection_absent = protection_absent; - codec.profile = (SrsAacProfile)profile; + codec.aac_object = srs_codec_aac_ts2rtmp((SrsAacProfile)profile); codec.sampling_frequency_index = sampling_frequency_index; codec.channel_configuration = channel_configuration; codec.frame_length = frame_length; @@ -471,11 +471,11 @@ int SrsRawAacStream::mux_sequence_header(SrsRawAacStreamCodec* codec, string& sh int ret = ERROR_SUCCESS; // only support aac profile 1-4. - if (codec->profile == SrsAacProfileReserved) { + if (codec->aac_object == SrsAacObjectTypeReserved) { return ERROR_AAC_DATA_INVALID; } - SrsAacObjectType audioObjectType = srs_codec_aac_ts2rtmp(codec->profile); + SrsAacObjectType audioObjectType = codec->aac_object; char channelConfiguration = codec->channel_configuration; char samplingFrequencyIndex = codec->sampling_frequency_index; diff --git a/trunk/src/protocol/srs_raw_avc.hpp b/trunk/src/protocol/srs_raw_avc.hpp index 03c99125f..0dc05dc6f 100644 --- a/trunk/src/protocol/srs_raw_avc.hpp +++ b/trunk/src/protocol/srs_raw_avc.hpp @@ -94,7 +94,7 @@ public: struct SrsRawAacStreamCodec { int8_t protection_absent; - SrsAacProfile profile; + SrsAacObjectType aac_object; int8_t sampling_frequency_index; int8_t channel_configuration; int16_t frame_length;