NetEq: Don't forget to save the codec name
BUG=chromium:661362 Review-Url: https://codereview.webrtc.org/2472083002 Cr-Commit-Position: refs/heads/master@{#14909}
This commit is contained in:
@ -27,24 +27,29 @@ DecoderDatabase::DecoderDatabase(
|
||||
DecoderDatabase::~DecoderDatabase() = default;
|
||||
|
||||
DecoderDatabase::DecoderInfo::DecoderInfo(const SdpAudioFormat& audio_format,
|
||||
AudioDecoderFactory* factory)
|
||||
: audio_format_(audio_format),
|
||||
AudioDecoderFactory* factory,
|
||||
const std::string& codec_name)
|
||||
: name_(codec_name),
|
||||
audio_format_(audio_format),
|
||||
factory_(factory),
|
||||
external_decoder_(nullptr),
|
||||
cng_decoder_(CngDecoder::Create(audio_format)),
|
||||
subtype_(SubtypeFromFormat(audio_format)) {}
|
||||
|
||||
DecoderDatabase::DecoderInfo::DecoderInfo(const SdpAudioFormat& audio_format,
|
||||
AudioDecoderFactory* factory)
|
||||
: DecoderInfo(audio_format, factory, audio_format.name) {}
|
||||
|
||||
DecoderDatabase::DecoderInfo::DecoderInfo(NetEqDecoder ct,
|
||||
AudioDecoderFactory* factory)
|
||||
: audio_format_(*acm2::RentACodec::NetEqDecoderToSdpAudioFormat(ct)),
|
||||
factory_(factory),
|
||||
external_decoder_(nullptr),
|
||||
cng_decoder_(CngDecoder::Create(audio_format_)),
|
||||
subtype_(SubtypeFromFormat(audio_format_)) {}
|
||||
: DecoderInfo(*acm2::RentACodec::NetEqDecoderToSdpAudioFormat(ct),
|
||||
factory) {}
|
||||
|
||||
DecoderDatabase::DecoderInfo::DecoderInfo(const SdpAudioFormat& audio_format,
|
||||
AudioDecoder* ext_dec)
|
||||
: audio_format_(audio_format),
|
||||
AudioDecoder* ext_dec,
|
||||
const std::string& codec_name)
|
||||
: name_(codec_name),
|
||||
audio_format_(audio_format),
|
||||
factory_(nullptr),
|
||||
external_decoder_(ext_dec),
|
||||
subtype_(Subtype::kNormal) {
|
||||
@ -135,8 +140,7 @@ int DecoderDatabase::RegisterPayload(uint8_t rtp_payload_type,
|
||||
if (!opt_format) {
|
||||
return kCodecNotSupported;
|
||||
}
|
||||
DecoderInfo info(*opt_format, decoder_factory_);
|
||||
info.name = name;
|
||||
DecoderInfo info(*opt_format, decoder_factory_, name);
|
||||
auto ret =
|
||||
decoders_.insert(std::make_pair(rtp_payload_type, std::move(info)));
|
||||
if (ret.second == false) {
|
||||
@ -176,8 +180,7 @@ int DecoderDatabase::InsertExternal(uint8_t rtp_payload_type,
|
||||
const SdpAudioFormat format = opt_db_format.value_or({"arbitrary", 0, 0});
|
||||
|
||||
std::pair<DecoderMap::iterator, bool> ret;
|
||||
DecoderInfo info(format, decoder);
|
||||
info.name = codec_name;
|
||||
DecoderInfo info(format, decoder, codec_name);
|
||||
ret = decoders_.insert(std::make_pair(rtp_payload_type, std::move(info)));
|
||||
if (ret.second == false) {
|
||||
// Database already contains a decoder with type |rtp_payload_type|.
|
||||
|
||||
@ -41,11 +41,16 @@ class DecoderDatabase {
|
||||
// Class that stores decoder info in the database.
|
||||
class DecoderInfo {
|
||||
public:
|
||||
DecoderInfo(const SdpAudioFormat& audio_format,
|
||||
AudioDecoderFactory* factory,
|
||||
const std::string& codec_name);
|
||||
explicit DecoderInfo(const SdpAudioFormat& audio_format,
|
||||
AudioDecoderFactory* factory = nullptr);
|
||||
explicit DecoderInfo(NetEqDecoder ct,
|
||||
AudioDecoderFactory* factory = nullptr);
|
||||
DecoderInfo(const SdpAudioFormat& audio_format, AudioDecoder* ext_dec);
|
||||
DecoderInfo(const SdpAudioFormat& audio_format,
|
||||
AudioDecoder* ext_dec,
|
||||
const std::string& codec_name);
|
||||
DecoderInfo(DecoderInfo&&);
|
||||
~DecoderInfo();
|
||||
|
||||
@ -85,12 +90,14 @@ class DecoderDatabase {
|
||||
// Returns true if the decoder's format is named |name|.
|
||||
bool IsType(const std::string& name) const;
|
||||
|
||||
// TODO(ossu): |name| is kept here while we retain the old external decoder
|
||||
// interface. Remove this once using an AudioDecoderFactory has
|
||||
// supplanted the old functionality.
|
||||
std::string name;
|
||||
const std::string& get_name() const { return name_; }
|
||||
|
||||
private:
|
||||
// TODO(ossu): |name_| is kept here while we retain the old external
|
||||
// decoder interface. Remove this once using an
|
||||
// AudioDecoderFactory has supplanted the old functionality.
|
||||
const std::string name_;
|
||||
|
||||
const SdpAudioFormat audio_format_;
|
||||
AudioDecoderFactory* const factory_;
|
||||
mutable std::unique_ptr<AudioDecoder> decoder_;
|
||||
|
||||
@ -81,7 +81,7 @@ TEST(DecoderDatabase, GetDecoderInfo) {
|
||||
info = db.GetDecoderInfo(kPayloadType);
|
||||
ASSERT_TRUE(info != NULL);
|
||||
EXPECT_TRUE(info->IsType("pcmu"));
|
||||
EXPECT_EQ(kCodecName, info->name);
|
||||
EXPECT_EQ(kCodecName, info->get_name());
|
||||
EXPECT_EQ(decoder, db.GetDecoder(kPayloadType));
|
||||
info = db.GetDecoderInfo(kPayloadType + 1); // Other payload type.
|
||||
EXPECT_TRUE(info == NULL); // Should not be found.
|
||||
@ -150,8 +150,8 @@ TEST(DecoderDatabase, ExternalDecoder) {
|
||||
info = db.GetDecoderInfo(kPayloadType);
|
||||
ASSERT_TRUE(info != NULL);
|
||||
EXPECT_TRUE(info->IsType("pcmu"));
|
||||
EXPECT_EQ(info->name, kCodecName);
|
||||
EXPECT_EQ(kCodecName, info->name);
|
||||
EXPECT_EQ(info->get_name(), kCodecName);
|
||||
EXPECT_EQ(kCodecName, info->get_name());
|
||||
// Expect not to delete the decoder when removing it from the database, since
|
||||
// it was declared externally.
|
||||
EXPECT_CALL(decoder, Die()).Times(0);
|
||||
|
||||
@ -478,7 +478,7 @@ rtc::Optional<CodecInst> NetEqImpl::GetDecoder(int payload_type) const {
|
||||
CodecInst ci = {0};
|
||||
rtc::MsanMarkUninitialized(rtc::MakeArrayView(&ci, 1));
|
||||
ci.pltype = payload_type;
|
||||
std::strncpy(ci.plname, di->name.c_str(), sizeof(ci.plname));
|
||||
std::strncpy(ci.plname, di->get_name().c_str(), sizeof(ci.plname));
|
||||
ci.plname[sizeof(ci.plname) - 1] = '\0';
|
||||
ci.plfreq = di->IsRed() || di->IsDtmf() ? 8000 : di->SampleRateHz();
|
||||
AudioDecoder* const decoder = di->GetDecoder();
|
||||
|
||||
Reference in New Issue
Block a user