From 28060d211388baf64d184d1d88e864fa82538a95 Mon Sep 17 00:00:00 2001 From: Thulinma Date: Fri, 16 Oct 2020 14:45:45 +0200 Subject: [PATCH] AAC RTMP/FLV input now ignore metadata and instead parse init data for channel count and sampling rate --- lib/adts.h | 30 ++++++++++++++++++++---------- lib/flv_tag.cpp | 5 +++++ 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/lib/adts.h b/lib/adts.h index 8e759515..1725fbc8 100644 --- a/lib/adts.h +++ b/lib/adts.h @@ -53,26 +53,36 @@ namespace aac { default: return 0; } } - static inline uint16_t channels(const std::string & conf){ + static inline uint16_t channels(const std::string &conf){ Utils::bitstream bs; bs.append(conf.data(), conf.size()); - if (bs.get(5) == 31){bs.skip(6);}//skip object type - if (bs.get(4) == 15){bs.skip(24);}//frequency index - return bs.get(4);//channel configuration + if (bs.get(5) == 31){bs.skip(6);}// skip object type + if (bs.get(4) == 15){bs.skip(24);}// frequency index + uint8_t chanConfig = bs.get(4); + if (chanConfig == 0){ + WARN_MSG("Unimplemented AAC AOT Specific Config parsing"); + return 8; + } + if (chanConfig > 7){ + WARN_MSG("Unimplemented AAC channel configuration %" PRIu8, chanConfig); + return 8; + } + if (chanConfig == 7){return 8;} + return chanConfig; } - static inline uint8_t objtype(const std::string & conf){ + static inline uint8_t objtype(const std::string &conf){ Utils::bitstream bs; bs.append(conf.data(), conf.size()); uint8_t ot = bs.get(5); - if (ot == 31){return bs.get(6)+32;} + if (ot == 31){return bs.get(6) + 32;} return ot; } - static inline uint16_t samples(const std::string & conf){ + static inline uint16_t samples(const std::string &conf){ Utils::bitstream bs; bs.append(conf.data(), conf.size()); - if (bs.get(5) == 31){bs.skip(6);}//skip object type - if (bs.get(4) == 15){bs.skip(24);}//frequency index - bs.skip(4);//channel configuration + if (bs.get(5) == 31){bs.skip(6);}// skip object type + if (bs.get(4) == 15){bs.skip(24);}// frequency index + bs.skip(4); // channel configuration if (bs.get(1)){ return 960; }else{ diff --git a/lib/flv_tag.cpp b/lib/flv_tag.cpp index 8f98d0a0..8052b9ad 100644 --- a/lib/flv_tag.cpp +++ b/lib/flv_tag.cpp @@ -6,6 +6,7 @@ #include "rtmpchunks.h" #include "timing.h" #include "util.h" +#include "adts.h" #include //for Tag::FileLoader #include #include //for Tag::FileLoader @@ -890,6 +891,10 @@ void FLV::Tag::toMeta(DTSC::Meta &metadata, AMF::Object &amf_storage, unsigned i }else{ metadata.tracks[reTrack].init = std::string((char *)data + 12, (size_t)len - 16); } + if (metadata.tracks[reTrack].codec == "AAC"){ + metadata.tracks[reTrack].rate = aac::AudSpecConf::rate(metadata.tracks[reTrack].init); + metadata.tracks[reTrack].channels = aac::AudSpecConf::channels(metadata.tracks[reTrack].init); + } } }