Index: webrtc/modules/video_coding/codec_database.cc |
diff --git a/webrtc/modules/video_coding/codec_database.cc b/webrtc/modules/video_coding/codec_database.cc |
index a43943bee044ead65b7ccbf44adb23534b72de44..5849ce19508a6687b104fdbbd6cc47a809dfce47 100644 |
--- a/webrtc/modules/video_coding/codec_database.cc |
+++ b/webrtc/modules/video_coding/codec_database.cc |
@@ -66,9 +66,9 @@ VideoCodecH264 VideoEncoder::GetDefaultH264Settings() { |
h264_settings.profile = kProfileBase; |
h264_settings.frameDroppingOn = true; |
h264_settings.keyFrameInterval = 3000; |
- h264_settings.spsData = NULL; |
+ h264_settings.spsData = nullptr; |
h264_settings.spsLen = 0; |
- h264_settings.ppsData = NULL; |
+ h264_settings.ppsData = nullptr; |
h264_settings.ppsLen = 0; |
return h264_settings; |
@@ -102,11 +102,11 @@ VCMCodecDataBase::VCMCodecDataBase( |
send_codec_(), |
receive_codec_(), |
encoder_payload_type_(0), |
- external_encoder_(NULL), |
+ external_encoder_(nullptr), |
internal_source_(false), |
encoder_rate_observer_(encoder_rate_observer), |
encoded_frame_callback_(encoded_frame_callback), |
- ptr_decoder_(NULL), |
+ ptr_decoder_(nullptr), |
dec_map_(), |
dec_external_map_() {} |
@@ -300,7 +300,7 @@ bool VCMCodecDataBase::DeregisterExternalEncoder( |
*was_send_codec = true; |
} |
encoder_payload_type_ = 0; |
- external_encoder_ = NULL; |
+ external_encoder_ = nullptr; |
internal_source_ = false; |
return true; |
} |
@@ -318,9 +318,8 @@ void VCMCodecDataBase::RegisterExternalEncoder( |
} |
bool VCMCodecDataBase::RequiresEncoderReset(const VideoCodec& new_send_codec) { |
- if (ptr_encoder_ == NULL) { |
+ if (!ptr_encoder_) |
return true; |
- } |
// Does not check startBitrate or maxFramerate |
if (new_send_codec.codecType != send_codec_.codecType || |
@@ -400,7 +399,7 @@ bool VCMCodecDataBase::SetPeriodicKeyFrames(bool enable) { |
void VCMCodecDataBase::ResetReceiver() { |
ReleaseDecoder(ptr_decoder_); |
- ptr_decoder_ = NULL; |
+ ptr_decoder_ = nullptr; |
memset(&receive_codec_, 0, sizeof(VideoCodec)); |
while (!dec_map_.empty()) { |
DecoderMap::iterator it = dec_map_.begin(); |
@@ -423,11 +422,11 @@ bool VCMCodecDataBase::DeregisterExternalDecoder(uint8_t payload_type) { |
// We can't use payload_type to check if the decoder is currently in use, |
// because payload type may be out of date (e.g. before we decode the first |
// frame after RegisterReceiveCodec) |
- if (ptr_decoder_ != NULL && |
+ if (ptr_decoder_ != nullptr && |
&ptr_decoder_->_decoder == (*it).second->external_decoder_instance) { |
// Release it if it was registered and in use. |
ReleaseDecoder(ptr_decoder_); |
- ptr_decoder_ = NULL; |
+ ptr_decoder_ = nullptr; |
} |
DeregisterReceiveCodec(payload_type); |
delete (*it).second; |
@@ -508,28 +507,30 @@ VideoCodecType VCMCodecDataBase::ReceiveCodec() const { |
} |
VCMGenericDecoder* VCMCodecDataBase::GetDecoder( |
- uint8_t payload_type, VCMDecodedFrameCallback* decoded_frame_callback) { |
+ const VCMEncodedFrame& frame, |
+ VCMDecodedFrameCallback* decoded_frame_callback) { |
+ uint8_t payload_type = frame.PayloadType(); |
if (payload_type == receive_codec_.plType || payload_type == 0) { |
return ptr_decoder_; |
} |
// Check for exisitng decoder, if exists - delete. |
if (ptr_decoder_) { |
ReleaseDecoder(ptr_decoder_); |
- ptr_decoder_ = NULL; |
+ ptr_decoder_ = nullptr; |
memset(&receive_codec_, 0, sizeof(VideoCodec)); |
} |
- ptr_decoder_ = CreateAndInitDecoder(payload_type, &receive_codec_); |
+ ptr_decoder_ = CreateAndInitDecoder(frame, &receive_codec_); |
if (!ptr_decoder_) { |
- return NULL; |
+ return nullptr; |
} |
VCMReceiveCallback* callback = decoded_frame_callback->UserReceiveCallback(); |
if (callback) callback->OnIncomingPayloadType(receive_codec_.plType); |
if (ptr_decoder_->RegisterDecodeCompleteCallback(decoded_frame_callback) |
< 0) { |
ReleaseDecoder(ptr_decoder_); |
- ptr_decoder_ = NULL; |
+ ptr_decoder_ = nullptr; |
memset(&receive_codec_, 0, sizeof(VideoCodec)); |
- return NULL; |
+ return nullptr; |
} |
return ptr_decoder_; |
} |
@@ -548,7 +549,7 @@ void VCMCodecDataBase::ReleaseDecoder(VCMGenericDecoder* decoder) const { |
bool VCMCodecDataBase::SupportsRenderScheduling() const { |
const VCMExtDecoderMapItem* ext_item = FindExternalDecoderItem( |
receive_codec_.plType); |
- if (ext_item == nullptr) |
+ if (!ext_item) |
return true; |
return ext_item->internal_render_timing; |
} |
@@ -558,16 +559,17 @@ bool VCMCodecDataBase::MatchesCurrentResolution(int width, int height) const { |
} |
VCMGenericDecoder* VCMCodecDataBase::CreateAndInitDecoder( |
- uint8_t payload_type, |
+ const VCMEncodedFrame& frame, |
VideoCodec* new_codec) const { |
+ uint8_t payload_type = frame.PayloadType(); |
assert(new_codec); |
const VCMDecoderMapItem* decoder_item = FindDecoderItem(payload_type); |
if (!decoder_item) { |
LOG(LS_ERROR) << "Can't find a decoder associated with payload type: " |
<< static_cast<int>(payload_type); |
- return NULL; |
+ return nullptr; |
} |
- VCMGenericDecoder* ptr_decoder = NULL; |
+ VCMGenericDecoder* ptr_decoder = nullptr; |
const VCMExtDecoderMapItem* external_dec_item = |
FindExternalDecoderItem(payload_type); |
if (external_dec_item) { |
@@ -579,12 +581,21 @@ VCMGenericDecoder* VCMCodecDataBase::CreateAndInitDecoder( |
ptr_decoder = CreateDecoder(decoder_item->settings->codecType); |
} |
if (!ptr_decoder) |
- return NULL; |
+ return nullptr; |
+ // Copy over input resolutions to prevent codec reinitialization due to |
+ // the first frame being of a different resolution than the database values. |
+ // This is best effort, since there's no guarantee that width/height have been |
+ // parsed yet (and may be zero). |
+ if (frame.EncodedImage()._encodedWidth > 0 && |
+ frame.EncodedImage()._encodedHeight > 0) { |
+ decoder_item->settings->width = frame.EncodedImage()._encodedWidth; |
+ decoder_item->settings->height = frame.EncodedImage()._encodedHeight; |
+ } |
if (ptr_decoder->InitDecode(decoder_item->settings.get(), |
decoder_item->number_of_cores) < 0) { |
ReleaseDecoder(ptr_decoder); |
- return NULL; |
+ return nullptr; |
} |
memcpy(new_codec, decoder_item->settings.get(), sizeof(VideoCodec)); |
return ptr_decoder; |
@@ -614,7 +625,7 @@ VCMGenericDecoder* VCMCodecDataBase::CreateDecoder(VideoCodecType type) const { |
break; |
} |
LOG(LS_WARNING) << "No internal decoder of this type exists."; |
- return NULL; |
+ return nullptr; |
} |
const VCMDecoderMapItem* VCMCodecDataBase::FindDecoderItem( |
@@ -623,7 +634,7 @@ const VCMDecoderMapItem* VCMCodecDataBase::FindDecoderItem( |
if (it != dec_map_.end()) { |
return (*it).second; |
} |
- return NULL; |
+ return nullptr; |
} |
const VCMExtDecoderMapItem* VCMCodecDataBase::FindExternalDecoderItem( |
@@ -632,6 +643,6 @@ const VCMExtDecoderMapItem* VCMCodecDataBase::FindExternalDecoderItem( |
if (it != dec_external_map_.end()) { |
return (*it).second; |
} |
- return NULL; |
+ return nullptr; |
} |
} // namespace webrtc |