Adding stride alignment
TEST= common_video_unittests and video_capture_module_test BUG=985 Review URL: https://webrtc-codereview.appspot.com/965005 git-svn-id: http://webrtc.googlecode.com/svn/trunk@3023 4adac7df-926f-26a2-2b94-8c16560cd09d
This commit is contained in:
parent
6ab92ed42d
commit
91a0340a61
@ -63,6 +63,15 @@ enum VideoRotationMode {
|
|||||||
// Return value: An aligned form of the input value.
|
// Return value: An aligned form of the input value.
|
||||||
int AlignInt(int value, int alignment);
|
int AlignInt(int value, int alignment);
|
||||||
|
|
||||||
|
// Align stride values for I420 Video frames.
|
||||||
|
// Input:
|
||||||
|
// - width : Image width.
|
||||||
|
// - stride_y : Pointer to the stride of the y plane.
|
||||||
|
// - stride_uv: Pointer to the stride of the u and v planes (setting identical
|
||||||
|
// values for both).
|
||||||
|
// Setting 16 byte alignment.
|
||||||
|
void Calc16ByteAlignedStride(int width, int* stride_y, int* stride_uv);
|
||||||
|
|
||||||
// Calculate the required buffer size.
|
// Calculate the required buffer size.
|
||||||
// Input:
|
// Input:
|
||||||
// - type :The type of the designated video frame.
|
// - type :The type of the designated video frame.
|
||||||
|
@ -138,8 +138,12 @@ TEST_F(TestLibYuv, ConvertTest) {
|
|||||||
printf("\nConvert #%d I420 <-> RGB24\n", j);
|
printf("\nConvert #%d I420 <-> RGB24\n", j);
|
||||||
scoped_array<uint8_t> res_rgb_buffer2(new uint8_t[width_ * height_ * 3]);
|
scoped_array<uint8_t> res_rgb_buffer2(new uint8_t[width_ * height_ * 3]);
|
||||||
I420VideoFrame res_i420_frame;
|
I420VideoFrame res_i420_frame;
|
||||||
res_i420_frame.CreateEmptyFrame(width_, height_, width_,
|
// Align the stride values for the output frame.
|
||||||
(width_ + 1) / 2, (width_ + 1) / 2);
|
int stride_y = 0;
|
||||||
|
int stride_uv = 0;
|
||||||
|
Calc16ByteAlignedStride(width_, &stride_y, &stride_uv);
|
||||||
|
res_i420_frame.CreateEmptyFrame(width_, height_, stride_y,
|
||||||
|
stride_uv, stride_uv);
|
||||||
EXPECT_EQ(0, ConvertFromI420(orig_frame, kRGB24, 0, res_rgb_buffer2.get()));
|
EXPECT_EQ(0, ConvertFromI420(orig_frame, kRGB24, 0, res_rgb_buffer2.get()));
|
||||||
|
|
||||||
EXPECT_EQ(0, ConvertToI420(kRGB24, res_rgb_buffer2.get(), 0, 0, width_,
|
EXPECT_EQ(0, ConvertToI420(kRGB24, res_rgb_buffer2.get(), 0, 0, width_,
|
||||||
@ -320,4 +324,21 @@ TEST_F(TestLibYuv, alignment) {
|
|||||||
EXPECT_EQ(0x400, AlignInt(value, 32)); // Low 5 bits are zero.
|
EXPECT_EQ(0x400, AlignInt(value, 32)); // Low 5 bits are zero.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(TestLibYuv, StrideAlignment) {
|
||||||
|
int stride_y = 0;
|
||||||
|
int stride_uv = 0;
|
||||||
|
int width = 52;
|
||||||
|
Calc16ByteAlignedStride(width, &stride_y, &stride_uv);
|
||||||
|
EXPECT_EQ(64, stride_y);
|
||||||
|
EXPECT_EQ(32, stride_uv);
|
||||||
|
width = 128;
|
||||||
|
Calc16ByteAlignedStride(width, &stride_y, &stride_uv);
|
||||||
|
EXPECT_EQ(128, stride_y);
|
||||||
|
EXPECT_EQ(64, stride_uv);
|
||||||
|
width = 127;
|
||||||
|
Calc16ByteAlignedStride(width, &stride_y, &stride_uv);
|
||||||
|
EXPECT_EQ(128, stride_y);
|
||||||
|
EXPECT_EQ(64, stride_uv);
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
@ -17,6 +17,8 @@
|
|||||||
|
|
||||||
namespace webrtc {
|
namespace webrtc {
|
||||||
|
|
||||||
|
const int k16ByteAlignment = 16;
|
||||||
|
|
||||||
VideoType RawVideoTypeToCommonVideoVideoType(RawVideoType type) {
|
VideoType RawVideoTypeToCommonVideoVideoType(RawVideoType type) {
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case kVideoI420:
|
case kVideoI420:
|
||||||
@ -58,6 +60,11 @@ int AlignInt(int value, int alignment) {
|
|||||||
return ((value + alignment - 1) & ~ (alignment - 1));
|
return ((value + alignment - 1) & ~ (alignment - 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Calc16ByteAlignedStride(int width, int* stride_y, int* stride_uv) {
|
||||||
|
*stride_y = AlignInt(width, k16ByteAlignment);
|
||||||
|
*stride_uv = AlignInt((width + 1) / 2, k16ByteAlignment);
|
||||||
|
}
|
||||||
|
|
||||||
int CalcBufferSize(VideoType type, int width, int height) {
|
int CalcBufferSize(VideoType type, int width, int height) {
|
||||||
int buffer_size = 0;
|
int buffer_size = 0;
|
||||||
switch (type) {
|
switch (type) {
|
||||||
|
@ -284,9 +284,12 @@ WebRtc_Word32 VideoCaptureImpl::IncomingFrame(
|
|||||||
// Setting absolute height (in case it was negative).
|
// Setting absolute height (in case it was negative).
|
||||||
// In Windows, the image starts bottom left, instead of top left.
|
// In Windows, the image starts bottom left, instead of top left.
|
||||||
// Setting a negative source height, inverts the image (within LibYuv).
|
// Setting a negative source height, inverts the image (within LibYuv).
|
||||||
|
int stride_y = 0;
|
||||||
|
int stride_uv = 0;
|
||||||
|
Calc16ByteAlignedStride(width, &stride_y, &stride_uv);
|
||||||
int ret = _captureFrame.CreateEmptyFrame(width, abs(height),
|
int ret = _captureFrame.CreateEmptyFrame(width, abs(height),
|
||||||
width, (width + 1) / 2,
|
stride_y,
|
||||||
(width + 1) / 2);
|
stride_uv, stride_uv);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, _id,
|
WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, _id,
|
||||||
@ -336,7 +339,6 @@ WebRtc_Word32 VideoCaptureImpl::IncomingFrameI420(
|
|||||||
const VideoFrameI420& video_frame, WebRtc_Word64 captureTime) {
|
const VideoFrameI420& video_frame, WebRtc_Word64 captureTime) {
|
||||||
|
|
||||||
CriticalSectionScoped cs(&_callBackCs);
|
CriticalSectionScoped cs(&_callBackCs);
|
||||||
// TODO(mikhal): Do we take the stride as is, or do we align it?
|
|
||||||
int size_y = video_frame.height * video_frame.y_pitch;
|
int size_y = video_frame.height * video_frame.y_pitch;
|
||||||
int size_u = video_frame.u_pitch * (video_frame.height + 1) / 2;
|
int size_u = video_frame.u_pitch * (video_frame.height + 1) / 2;
|
||||||
int size_v = video_frame.v_pitch * (video_frame.height + 1) / 2;
|
int size_v = video_frame.v_pitch * (video_frame.height + 1) / 2;
|
||||||
|
@ -98,7 +98,6 @@ public:
|
|||||||
protected:
|
protected:
|
||||||
VideoCaptureImpl(const WebRtc_Word32 id);
|
VideoCaptureImpl(const WebRtc_Word32 id);
|
||||||
virtual ~VideoCaptureImpl();
|
virtual ~VideoCaptureImpl();
|
||||||
// TODO(mikhal): Remove codec_type.
|
|
||||||
WebRtc_Word32 DeliverCapturedFrame(I420VideoFrame& captureFrame,
|
WebRtc_Word32 DeliverCapturedFrame(I420VideoFrame& captureFrame,
|
||||||
WebRtc_Word64 capture_time);
|
WebRtc_Word64 capture_time);
|
||||||
WebRtc_Word32 DeliverEncodedCapturedFrame(
|
WebRtc_Word32 DeliverEncodedCapturedFrame(
|
||||||
|
Loading…
x
Reference in New Issue
Block a user