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:
parent
df9bd9bdbd
commit
7b3f3b1e42
@ -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;
|
||||||
|
@ -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 {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user