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..ca80c8818bb73c01ca51d5d13d35153886af70e5 100644 |
--- a/webrtc/modules/video_coding/codec_database.cc |
+++ b/webrtc/modules/video_coding/codec_database.cc |
@@ -508,7 +508,9 @@ 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_; |
} |
@@ -518,7 +520,7 @@ VCMGenericDecoder* VCMCodecDataBase::GetDecoder( |
ptr_decoder_ = NULL; |
memset(&receive_codec_, 0, sizeof(VideoCodec)); |
} |
- ptr_decoder_ = CreateAndInitDecoder(payload_type, &receive_codec_); |
+ ptr_decoder_ = CreateAndInitDecoder(frame, &receive_codec_); |
if (!ptr_decoder_) { |
return NULL; |
} |
@@ -558,8 +560,9 @@ 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) { |
@@ -581,10 +584,19 @@ VCMGenericDecoder* VCMCodecDataBase::CreateAndInitDecoder( |
if (!ptr_decoder) |
return NULL; |
+ // 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; |
mflodman
2015/11/27 09:20:21
I'd prefer to use NULL or nullptr, not mix both in
pbos-webrtc
2015/11/27 13:23:40
Done.
|
} |
memcpy(new_codec, decoder_item->settings.get(), sizeof(VideoCodec)); |
return ptr_decoder; |