Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(550)

Unified Diff: webrtc/modules/video_coding/codec_database.cc

Issue 1474193002: Call InitDecode with proper resolution. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: best-effort width/height setting Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « webrtc/modules/video_coding/codec_database.h ('k') | webrtc/modules/video_coding/video_receiver.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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;
« no previous file with comments | « webrtc/modules/video_coding/codec_database.h ('k') | webrtc/modules/video_coding/video_receiver.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698