Remove VideoReceiveStream deregister of decoders.

Also doing some simplifications inside video_coding. No CHECKs added,
since they appear to have introduced breakages in downstream tests.

Overall reducing the number of potential ways a decoder could possibly
be set null. Removing deregistration of external decoders should also
give a quicker shutdown time since that may attempt to register
internal decoders.

BUG=chromium:563299
TBR=stefan@webrtc.org

Review URL: https://codereview.webrtc.org/1483423002 .

Cr-Commit-Position: refs/heads/master@{#10858}
This commit is contained in:
Peter Boström
2015-12-01 17:20:01 +01:00
parent 04a6bb9b63
commit 187db63fdf
7 changed files with 43 additions and 94 deletions

View File

@ -111,8 +111,12 @@ VCMCodecDataBase::VCMCodecDataBase(
dec_external_map_() {}
VCMCodecDataBase::~VCMCodecDataBase() {
ResetSender();
ResetReceiver();
DeleteEncoder();
ReleaseDecoder(ptr_decoder_);
for (auto& kv : dec_map_)
delete kv.second;
for (auto& kv : dec_external_map_)
delete kv.second;
}
void VCMCodecDataBase::Codec(VideoCodecType codec_type, VideoCodec* settings) {
@ -188,11 +192,6 @@ void VCMCodecDataBase::Codec(VideoCodecType codec_type, VideoCodec* settings) {
}
}
void VCMCodecDataBase::ResetSender() {
DeleteEncoder();
periodic_key_frames_ = false;
}
// Assuming only one registered encoder - since only one used, no need for more.
bool VCMCodecDataBase::SetSendCodec(const VideoCodec* send_codec,
int number_of_cores,
@ -397,22 +396,6 @@ bool VCMCodecDataBase::SetPeriodicKeyFrames(bool enable) {
return true;
}
void VCMCodecDataBase::ResetReceiver() {
ReleaseDecoder(ptr_decoder_);
ptr_decoder_ = nullptr;
memset(&receive_codec_, 0, sizeof(VideoCodec));
while (!dec_map_.empty()) {
DecoderMap::iterator it = dec_map_.begin();
delete (*it).second;
dec_map_.erase(it);
}
while (!dec_external_map_.empty()) {
ExternalDecoderMap::iterator external_it = dec_external_map_.begin();
delete (*external_it).second;
dec_external_map_.erase(external_it);
}
}
bool VCMCodecDataBase::DeregisterExternalDecoder(uint8_t payload_type) {
ExternalDecoderMap::iterator it = dec_external_map_.find(payload_type);
if (it == dec_external_map_.end()) {
@ -423,13 +406,13 @@ bool VCMCodecDataBase::DeregisterExternalDecoder(uint8_t payload_type) {
// because payload type may be out of date (e.g. before we decode the first
// frame after RegisterReceiveCodec)
if (ptr_decoder_ != nullptr &&
&ptr_decoder_->_decoder == (*it).second->external_decoder_instance) {
ptr_decoder_->_decoder == (*it).second->external_decoder_instance) {
// Release it if it was registered and in use.
ReleaseDecoder(ptr_decoder_);
ptr_decoder_ = nullptr;
}
DeregisterReceiveCodec(payload_type);
delete (*it).second;
delete it->second;
dec_external_map_.erase(it);
return true;
}
@ -476,8 +459,7 @@ bool VCMCodecDataBase::DeregisterReceiveCodec(
if (it == dec_map_.end()) {
return false;
}
VCMDecoderMapItem* dec_item = (*it).second;
delete dec_item;
delete it->second;
dec_map_.erase(it);
if (receive_codec_.plType == payload_type) {
// This codec is currently in use.
@ -533,10 +515,10 @@ VCMGenericDecoder* VCMCodecDataBase::GetDecoder(
void VCMCodecDataBase::ReleaseDecoder(VCMGenericDecoder* decoder) const {
if (decoder) {
assert(&decoder->_decoder);
assert(decoder->_decoder);
decoder->Release();
if (!decoder->External()) {
delete &decoder->_decoder;
delete decoder->_decoder;
}
delete decoder;
}
@ -571,7 +553,7 @@ VCMGenericDecoder* VCMCodecDataBase::CreateAndInitDecoder(
if (external_dec_item) {
// External codec.
ptr_decoder = new VCMGenericDecoder(
*external_dec_item->external_decoder_instance, true);
external_dec_item->external_decoder_instance, true);
} else {
// Create decoder.
ptr_decoder = CreateDecoder(decoder_item->settings->codecType);
@ -607,14 +589,14 @@ void VCMCodecDataBase::DeleteEncoder() {
VCMGenericDecoder* VCMCodecDataBase::CreateDecoder(VideoCodecType type) const {
switch (type) {
case kVideoCodecVP8:
return new VCMGenericDecoder(*(VP8Decoder::Create()));
return new VCMGenericDecoder(VP8Decoder::Create());
case kVideoCodecVP9:
return new VCMGenericDecoder(*(VP9Decoder::Create()));
return new VCMGenericDecoder(VP9Decoder::Create());
case kVideoCodecI420:
return new VCMGenericDecoder(*(new I420Decoder));
return new VCMGenericDecoder(new I420Decoder());
case kVideoCodecH264:
if (H264Decoder::IsSupported()) {
return new VCMGenericDecoder(*(H264Decoder::Create()));
return new VCMGenericDecoder(H264Decoder::Create());
}
break;
default: