diff --git a/talk/media/base/videoframe.cc b/talk/media/base/videoframe.cc index 96da6a3cb3..304d65b24a 100644 --- a/talk/media/base/videoframe.cc +++ b/talk/media/base/videoframe.cc @@ -80,9 +80,25 @@ rtc::StreamResult VideoFrame::Write(rtc::StreamInterface* stream, return result; } +size_t VideoFrame::CopyToBuffer(uint8* buffer, size_t size) const { + const size_t y_size = GetHeight() * GetYPitch(); + const size_t u_size = GetUPitch() * GetChromaHeight(); + const size_t v_size = GetVPitch() * GetChromaHeight(); + const size_t needed = y_size + u_size + v_size; + if (size < needed) + return needed; + CopyToPlanes(buffer, buffer + y_size, buffer + y_size + u_size, + GetYPitch(), GetUPitch(), GetVPitch()); + return needed; +} + bool VideoFrame::CopyToPlanes( uint8* dst_y, uint8* dst_u, uint8* dst_v, int32 dst_pitch_y, int32 dst_pitch_u, int32 dst_pitch_v) const { + if (!GetYPlane() || !GetUPlane() || !GetVPlane()) { + LOG(LS_ERROR) << "NULL plane pointer."; + return false; + } int32 src_width = static_cast(GetWidth()); int32 src_height = static_cast(GetHeight()); return libyuv::I420Copy(GetYPlane(), GetYPitch(), diff --git a/talk/media/base/videoframe.h b/talk/media/base/videoframe.h index 7c5ce5b820..8d39f7120f 100644 --- a/talk/media/base/videoframe.h +++ b/talk/media/base/videoframe.h @@ -142,7 +142,7 @@ class VideoFrame { // sufficient size. Returns the frame's actual size, regardless of whether // it was written or not (like snprintf). If there is insufficient space, // nothing is written. - virtual size_t CopyToBuffer(uint8 *buffer, size_t size) const = 0; + virtual size_t CopyToBuffer(uint8 *buffer, size_t size) const; // Writes the frame into the given planes, stretched to the given width and // height. The parameter "interpolate" controls whether to interpolate or just diff --git a/talk/media/webrtc/webrtcvideoframe.cc b/talk/media/webrtc/webrtcvideoframe.cc index 6a49d9b838..adb35aab0d 100644 --- a/talk/media/webrtc/webrtcvideoframe.cc +++ b/talk/media/webrtc/webrtcvideoframe.cc @@ -250,18 +250,6 @@ bool WebRtcVideoFrame::MakeExclusive() { return true; } -size_t WebRtcVideoFrame::CopyToBuffer(uint8* buffer, size_t size) const { - if (!frame()->Buffer()) { - return 0; - } - - size_t needed = frame()->Length(); - if (needed <= size) { - memcpy(buffer, frame()->Buffer(), needed); - } - return needed; -} - size_t WebRtcVideoFrame::ConvertToRgbBuffer(uint32 to_fourcc, uint8* buffer, size_t size, int stride_rgb) const { if (!frame()->Buffer()) { diff --git a/talk/media/webrtc/webrtcvideoframe.h b/talk/media/webrtc/webrtcvideoframe.h index 4e89897fb8..4de12b224c 100644 --- a/talk/media/webrtc/webrtcvideoframe.h +++ b/talk/media/webrtc/webrtcvideoframe.h @@ -138,7 +138,6 @@ class WebRtcVideoFrame : public VideoFrame { virtual VideoFrame* Copy() const; virtual bool MakeExclusive(); - virtual size_t CopyToBuffer(uint8* buffer, size_t size) const; virtual size_t ConvertToRgbBuffer(uint32 to_fourcc, uint8* buffer, size_t size, int stride_rgb) const;