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
This commit is contained in:
mflodman@webrtc.org 2012-01-17 12:12:42 +00:00
parent df9bd9bdbd
commit 7b3f3b1e42
2 changed files with 25 additions and 26 deletions

View File

@ -150,7 +150,8 @@ ViEExternalRendererImpl::ViEExternalRendererImpl()
: external_renderer_(NULL), : external_renderer_(NULL),
external_renderer_format_(kVideoUnknown), external_renderer_format_(kVideoUnknown),
external_renderer_width_(0), external_renderer_width_(0),
external_renderer_height_(0) { external_renderer_height_(0),
converted_frame_(new VideoFrame()){
} }
int ViEExternalRendererImpl::SetViEExternalRenderer( int ViEExternalRendererImpl::SetViEExternalRenderer(
@ -164,13 +165,23 @@ int ViEExternalRendererImpl::SetViEExternalRenderer(
WebRtc_Word32 ViEExternalRendererImpl::RenderFrame( WebRtc_Word32 ViEExternalRendererImpl::RenderFrame(
const WebRtc_UWord32 stream_id, const WebRtc_UWord32 stream_id,
VideoFrame& video_frame) { VideoFrame& video_frame) {
VideoFrame converted_frame; VideoFrame* out_frame = converted_frame_.get();
VideoFrame* p_converted_frame = &converted_frame;
// Convert to requested format. // 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_) { switch (external_renderer_format_) {
case kVideoI420: case kVideoI420:
p_converted_frame = &video_frame; out_frame = &video_frame;
break; break;
case kVideoYV12: case kVideoYV12:
case kVideoYUY2: case kVideoYUY2:
@ -178,43 +189,29 @@ WebRtc_Word32 ViEExternalRendererImpl::RenderFrame(
case kVideoARGB: case kVideoARGB:
case kVideoRGB24: 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, ConvertFromI420(video_frame.Buffer(), video_frame.Width(), type, 0,
video_frame.Width(), video_frame.Height(), video_frame.Width(), video_frame.Height(),
converted_frame.Buffer()); converted_frame_->Buffer());
} }
break; break;
case kVideoIYUV: case kVideoIYUV:
// no conversion available // no conversion available
break; break;
case kVideoRGB565: case kVideoRGB565:
converted_frame.VerifyAndAllocate(CalcBufferSize(kRGB565, ConvertI420ToRGB565(video_frame.Buffer(), converted_frame_->Buffer(),
video_frame.Width(),
video_frame.Height()));
ConvertI420ToRGB565(video_frame.Buffer(), converted_frame.Buffer(),
video_frame.Width(), video_frame.Height()); video_frame.Width(), video_frame.Height());
break; break;
case kVideoARGB4444: case kVideoARGB4444:
converted_frame.VerifyAndAllocate(CalcBufferSize(kARGB4444, ConvertI420ToARGB4444(video_frame.Buffer(), converted_frame_->Buffer(),
video_frame.Width(),
video_frame.Height()));
ConvertI420ToARGB4444(video_frame.Buffer(), converted_frame.Buffer(),
video_frame.Width(), video_frame.Height(), 0); video_frame.Width(), video_frame.Height(), 0);
break; break;
case kVideoARGB1555 : case kVideoARGB1555 :
converted_frame.VerifyAndAllocate(CalcBufferSize(kARGB1555, ConvertI420ToARGB1555(video_frame.Buffer(), converted_frame_->Buffer(),
video_frame.Width(),
video_frame.Height()));
ConvertI420ToARGB1555(video_frame.Buffer(), converted_frame.Buffer(),
video_frame.Width(), video_frame.Height(), 0); video_frame.Width(), video_frame.Height(), 0);
break; break;
default: default:
assert(false); assert(false);
p_converted_frame = NULL; out_frame = NULL;
break; break;
} }
@ -226,9 +223,9 @@ WebRtc_Word32 ViEExternalRendererImpl::RenderFrame(
external_renderer_height_, stream_id); external_renderer_height_, stream_id);
} }
if (p_converted_frame) { if (out_frame) {
external_renderer_->DeliverFrame(p_converted_frame->Buffer(), external_renderer_->DeliverFrame(out_frame->Buffer(),
p_converted_frame->Length(), out_frame->Length(),
video_frame.TimeStamp()); video_frame.TimeStamp());
} }
return 0; return 0;

View File

@ -13,6 +13,7 @@
#include "modules/video_render/main/interface/video_render_defines.h" #include "modules/video_render/main/interface/video_render_defines.h"
#include "system_wrappers/interface/map_wrapper.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/include/vie_render.h"
#include "video_engine/vie_frame_provider_base.h" #include "video_engine/vie_frame_provider_base.h"
@ -39,6 +40,7 @@ class ViEExternalRendererImpl : public VideoRenderCallback {
RawVideoType external_renderer_format_; RawVideoType external_renderer_format_;
WebRtc_UWord32 external_renderer_width_; WebRtc_UWord32 external_renderer_width_;
WebRtc_UWord32 external_renderer_height_; WebRtc_UWord32 external_renderer_height_;
scoped_ptr<VideoFrame> converted_frame_;
}; };
class ViERenderer: public ViEFrameCallback { class ViERenderer: public ViEFrameCallback {