From 7b3f3b1e42669c6d2a0ea7d58ca374c24ebbb06c Mon Sep 17 00:00:00 2001 From: "mflodman@webrtc.org" Date: Tue, 17 Jan 2012 12:12:42 +0000 Subject: [PATCH] CalcBufferSize can return -1, which wasn't handled by ViERenderer. BUG=C-10532 Review URL: https://webrtc-codereview.appspot.com/345010 git-svn-id: http://webrtc.googlecode.com/svn/trunk@1438 4adac7df-926f-26a2-2b94-8c16560cd09d --- src/video_engine/vie_renderer.cc | 49 +++++++++++++++----------------- src/video_engine/vie_renderer.h | 2 ++ 2 files changed, 25 insertions(+), 26 deletions(-) diff --git a/src/video_engine/vie_renderer.cc b/src/video_engine/vie_renderer.cc index 9c0891272..530ae5569 100644 --- a/src/video_engine/vie_renderer.cc +++ b/src/video_engine/vie_renderer.cc @@ -150,7 +150,8 @@ ViEExternalRendererImpl::ViEExternalRendererImpl() : external_renderer_(NULL), external_renderer_format_(kVideoUnknown), external_renderer_width_(0), - external_renderer_height_(0) { + external_renderer_height_(0), + converted_frame_(new VideoFrame()){ } int ViEExternalRendererImpl::SetViEExternalRenderer( @@ -164,13 +165,23 @@ int ViEExternalRendererImpl::SetViEExternalRenderer( WebRtc_Word32 ViEExternalRendererImpl::RenderFrame( const WebRtc_UWord32 stream_id, VideoFrame& video_frame) { - VideoFrame converted_frame; - VideoFrame* p_converted_frame = &converted_frame; + VideoFrame* out_frame = converted_frame_.get(); // Convert to requested format. + VideoType type = + RawVideoTypeToCommonVideoVideoType(external_renderer_format_); + int buffer_size = CalcBufferSize(type, video_frame.Width(), + video_frame.Height()); + if (buffer_size <= 0) { + // Unsupported video format. + assert(false); + return -1; + } + converted_frame_->VerifyAndAllocate(buffer_size); + switch (external_renderer_format_) { case kVideoI420: - p_converted_frame = &video_frame; + out_frame = &video_frame; break; case kVideoYV12: case kVideoYUY2: @@ -178,43 +189,29 @@ WebRtc_Word32 ViEExternalRendererImpl::RenderFrame( case kVideoARGB: case kVideoRGB24: { - VideoType type = - RawVideoTypeToCommonVideoVideoType(external_renderer_format_); - converted_frame.VerifyAndAllocate(CalcBufferSize(type, - video_frame.Width(), - video_frame.Height())); ConvertFromI420(video_frame.Buffer(), video_frame.Width(), type, 0, video_frame.Width(), video_frame.Height(), - converted_frame.Buffer()); + converted_frame_->Buffer()); } break; case kVideoIYUV: // no conversion available break; case kVideoRGB565: - converted_frame.VerifyAndAllocate(CalcBufferSize(kRGB565, - video_frame.Width(), - video_frame.Height())); - ConvertI420ToRGB565(video_frame.Buffer(), converted_frame.Buffer(), + ConvertI420ToRGB565(video_frame.Buffer(), converted_frame_->Buffer(), video_frame.Width(), video_frame.Height()); break; case kVideoARGB4444: - converted_frame.VerifyAndAllocate(CalcBufferSize(kARGB4444, - video_frame.Width(), - video_frame.Height())); - ConvertI420ToARGB4444(video_frame.Buffer(), converted_frame.Buffer(), + ConvertI420ToARGB4444(video_frame.Buffer(), converted_frame_->Buffer(), video_frame.Width(), video_frame.Height(), 0); break; case kVideoARGB1555 : - converted_frame.VerifyAndAllocate(CalcBufferSize(kARGB1555, - video_frame.Width(), - video_frame.Height())); - ConvertI420ToARGB1555(video_frame.Buffer(), converted_frame.Buffer(), + ConvertI420ToARGB1555(video_frame.Buffer(), converted_frame_->Buffer(), video_frame.Width(), video_frame.Height(), 0); break; default: assert(false); - p_converted_frame = NULL; + out_frame = NULL; break; } @@ -226,9 +223,9 @@ WebRtc_Word32 ViEExternalRendererImpl::RenderFrame( external_renderer_height_, stream_id); } - if (p_converted_frame) { - external_renderer_->DeliverFrame(p_converted_frame->Buffer(), - p_converted_frame->Length(), + if (out_frame) { + external_renderer_->DeliverFrame(out_frame->Buffer(), + out_frame->Length(), video_frame.TimeStamp()); } return 0; diff --git a/src/video_engine/vie_renderer.h b/src/video_engine/vie_renderer.h index 899a82abb..028d72b05 100644 --- a/src/video_engine/vie_renderer.h +++ b/src/video_engine/vie_renderer.h @@ -13,6 +13,7 @@ #include "modules/video_render/main/interface/video_render_defines.h" #include "system_wrappers/interface/map_wrapper.h" +#include "system_wrappers/interface/scoped_ptr.h" #include "video_engine/include/vie_render.h" #include "video_engine/vie_frame_provider_base.h" @@ -39,6 +40,7 @@ class ViEExternalRendererImpl : public VideoRenderCallback { RawVideoType external_renderer_format_; WebRtc_UWord32 external_renderer_width_; WebRtc_UWord32 external_renderer_height_; + scoped_ptr converted_frame_; }; class ViERenderer: public ViEFrameCallback {