357 lines
19 KiB
C++

/*
* Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree. An additional intellectual property rights grant can be found
* in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree.
*/
#ifndef WEBRTC_COMMON_VIDEO_INTERFACE_VPLIB_H
#define WEBRTC_COMMON_VIDEO_INTERFACE_VPLIB_H
#include "typedefs.h"
namespace webrtc
{
// Supported video types
enum VideoType
{
kUnknown,
kI420,
kIYUV,
kRGB24,
kARGB,
kARGB4444,
kRGB565,
kARGB1555,
kYUY2,
kYV12,
kUYVY,
kMJPG,
kNV21,
kNV12,
kARGBMac,
kRGBAMac,
kNumberOfVideoTypes
};
// Supported rotation
enum VideoRotationMode
{
kRotateNone = 0,
kRotateClockwise = 90,
kRotateAntiClockwise = -90,
kRotate180 = 180,
};
// Calculate the required buffer size
// Input
// - type - The type of the designated video frame
// - width - frame width in pixels
// - height - frame height in pixels
// Output
// - The required size in bytes to accommodate the specified video frame
//
WebRtc_UWord32 CalcBufferSize(VideoType type, WebRtc_UWord32 width, WebRtc_UWord32 height);
// Calculate the required buffer size when converting from one type to another
// Input
// - incomingVideoType - The type of the existing video frame
// - convertedVideoType - width of the designated video frame
// - length - length in bytes of the data
// Output
// - The required size in bytes to accommodate the specified converted video frame
//
WebRtc_UWord32 CalcBufferSize(VideoType incomingVideoType, VideoType convertedVideoType,
WebRtc_UWord32 length);
//
// Convert To/From I420
//
// The following 2 functions convert an image to/from a I420 type to/from a specified
// format.
//
// Input:
// - incomingVideoType : Type of input video
// - incomingBuffer : Pointer to an input image.
// - width : Image width in pixels.
// - height : Image height in pixels.
// - outgoingBuffer : Pointer to converted image.
// - interlaced : Flag indicating if interlaced I420 output
// - rotate : Rotation mode of output image
// Return value : Size of converted image if OK, otherwise, the following error
// codes:
// -1 : Parameter error
// -2 : Unsupported command (parameter request)
//
// Note: the following functions includes the most common usage cases; for a more general
// usage, refer to explicit function
WebRtc_Word32 ConvertToI420(VideoType incomingVideoType,
const WebRtc_UWord8* incomingBuffer,
WebRtc_UWord32 width,
WebRtc_UWord32 height,
WebRtc_UWord8* outgoingBuffer,
bool interlaced = false ,
VideoRotationMode rotate = kRotateNone
);
WebRtc_Word32 ConvertFromI420(VideoType outgoingVideoType,
const WebRtc_UWord8* incomingBuffer,
WebRtc_UWord32 width,
WebRtc_UWord32 height,
WebRtc_UWord8* outgoingBuffer,
bool interlaced = false ,
VideoRotationMode rotate = kRotateNone
);
// Designated Convert Functions
// The following list describes the designated conversion function which are called by the
// 2 prior general conversion function.
// Input and output descriptions match the above descriptions, and are therefore omitted.
WebRtc_Word32 ConvertI420ToRGB24(const WebRtc_UWord8* inFrame, WebRtc_UWord8* outFrame,
WebRtc_UWord32 width, WebRtc_UWord32 height);
WebRtc_Word32 ConvertI420ToARGB(const WebRtc_UWord8* inFrame, WebRtc_UWord8* outFrame,
WebRtc_UWord32 width, WebRtc_UWord32 height,
WebRtc_UWord32 strideOut);
WebRtc_Word32 ConvertI420ToARGB4444(const WebRtc_UWord8* inFrame, WebRtc_UWord8* outFrame,
WebRtc_UWord32 width, WebRtc_UWord32 height,
WebRtc_UWord32 strideOut);
WebRtc_Word32 ConvertI420ToRGB565(const WebRtc_UWord8* inFrame, WebRtc_UWord8* outFrame,
WebRtc_UWord32 width, WebRtc_UWord32 height);
WebRtc_Word32 ConvertI420ToRGB565Android(const WebRtc_UWord8* inFrame,
WebRtc_UWord8* outFrame, WebRtc_UWord32 width,
WebRtc_UWord32 height);
WebRtc_Word32 ConvertI420ToARGB1555(const WebRtc_UWord8* inFrame, WebRtc_UWord8* outFrame,
WebRtc_UWord32 width, WebRtc_UWord32 height,
WebRtc_UWord32 strideOut);
WebRtc_Word32 ConvertI420ToARGBMac(const WebRtc_UWord8* inFrame, WebRtc_UWord8* outFrame,
WebRtc_UWord32 width, WebRtc_UWord32 height,
WebRtc_UWord32 strideOut);
WebRtc_Word32 ConvertI420ToRGBAMac(const WebRtc_UWord8* inFrame, WebRtc_UWord8* outFrame,
WebRtc_UWord32 width, WebRtc_UWord32 height,
WebRtc_UWord32 strideOut);
WebRtc_Word32 ConvertI420ToI420(const WebRtc_UWord8* inFrame, WebRtc_UWord8* outFrame,
WebRtc_UWord32 width, WebRtc_UWord32 height,
WebRtc_UWord32 strideOut = 0);
WebRtc_Word32 ConvertI420ToUYVY(const WebRtc_UWord8* inFrame, WebRtc_UWord8* outFrame,
WebRtc_UWord32 width, WebRtc_UWord32 height,
WebRtc_UWord32 strideOut = 0);
WebRtc_Word32 ConvertI420ToYUY2(const WebRtc_UWord8* inFrame, WebRtc_UWord8* outFrame,
WebRtc_UWord32 width, WebRtc_UWord32 height,
WebRtc_UWord32 strideOut = 0);
WebRtc_Word32 ConvertI420ToYV12(const WebRtc_UWord8* inFrame, WebRtc_UWord8* outFrame,
WebRtc_UWord32 width, WebRtc_UWord32 height,
WebRtc_UWord32 strideOut);
WebRtc_Word32 ConvertYUY2ToI420interlaced(const WebRtc_UWord8* inFrame, WebRtc_UWord32 inWidth,
WebRtc_UWord32 inHeight, WebRtc_UWord8* outFrame,
WebRtc_UWord32 outWidth, WebRtc_UWord32 outHeight);
WebRtc_Word32 ConvertYV12ToI420(const WebRtc_UWord8* inFrame, WebRtc_UWord32 width,
WebRtc_UWord32 height, WebRtc_UWord8* outFrame);
WebRtc_Word32 ConvertRGB24ToARGB(const WebRtc_UWord8* inFrame, WebRtc_UWord8* outFrame,
WebRtc_UWord32 width, WebRtc_UWord32 height,
WebRtc_UWord32 strideOut);
WebRtc_Word32 ConvertRGB24ToI420(WebRtc_Word32 width, WebRtc_Word32 height,
const WebRtc_UWord8* inFrame, WebRtc_UWord8* outFrame);
WebRtc_Word32 ConvertRGB565ToI420(const WebRtc_UWord8* inFrame, WebRtc_UWord32 width,
WebRtc_UWord32 height, WebRtc_UWord8* outFrame);
WebRtc_Word32 ConvertARGBMacToI420(WebRtc_UWord32 width, WebRtc_UWord32 height,
const WebRtc_UWord8* inFrame, WebRtc_UWord8* outFrame);
WebRtc_Word32 ConvertUYVYToI420(WebRtc_UWord32 width, WebRtc_UWord32 height,
const WebRtc_UWord8* inFrame, WebRtc_UWord8* outFrame);
// pad cut and convert
WebRtc_Word32 ConvertYUY2ToI420(const WebRtc_UWord8* inFrame, WebRtc_UWord32 inWidth,
WebRtc_UWord32 inHeight, WebRtc_UWord8* outFrame,
WebRtc_UWord32 outWidth, WebRtc_UWord32 outHeight);
WebRtc_Word32 ConvertUYVYToI420interlaced(const WebRtc_UWord8* inFrame,
WebRtc_UWord32 inWidth, WebRtc_UWord32 inHeight,
WebRtc_UWord8* outFrame, WebRtc_UWord32 outWidth,
WebRtc_UWord32 outHeight);
WebRtc_Word32 ConvertRGB24ToI420(const WebRtc_UWord8* inFrame, WebRtc_UWord32 inWidth,
WebRtc_UWord32 inHeight, WebRtc_UWord8* outFrame,
WebRtc_UWord32 outWidth, WebRtc_UWord32 outHeight);
WebRtc_Word32 ConvertI420ToI420(const WebRtc_UWord8* inFrame, WebRtc_UWord32 inWidth,
WebRtc_UWord32 inHeight, WebRtc_UWord8* outFrame,
WebRtc_UWord32 outWidth, WebRtc_UWord32 outHeight);
//NV12 Conversion/Rotation
WebRtc_Word32 ConvertNV12ToI420(const WebRtc_UWord8* inFrame, WebRtc_UWord8* outFrame,
WebRtc_UWord32 width, WebRtc_UWord32 height);
WebRtc_Word32 ConvertNV12ToI420AndRotate180(const WebRtc_UWord8* inFrame,
WebRtc_UWord8* outFrame, WebRtc_UWord32 width,
WebRtc_UWord32 height);
WebRtc_Word32 ConvertNV12ToI420AndRotateAntiClockwise(const WebRtc_UWord8* inFrame,
WebRtc_UWord8* outFrame,
WebRtc_UWord32 width,
WebRtc_UWord32 height);
WebRtc_Word32 ConvertNV12ToI420AndRotateClockwise(const WebRtc_UWord8* inFrame,
WebRtc_UWord8* outFrame,
WebRtc_UWord32 width,
WebRtc_UWord32 height);
WebRtc_Word32 ConvertNV12ToRGB565(const WebRtc_UWord8* inFrame, WebRtc_UWord8* outFrame,
WebRtc_UWord32 width, WebRtc_UWord32 height);
//NV21 Conversion/Rotation
WebRtc_Word32 ConvertNV21ToI420(const WebRtc_UWord8* inFrame, WebRtc_UWord8* outFrame,
WebRtc_UWord32 width, WebRtc_UWord32 height);
WebRtc_Word32 ConvertNV21ToI420AndRotate180(const WebRtc_UWord8* inFrame,
WebRtc_UWord8* outFrame,
WebRtc_UWord32 width, WebRtc_UWord32 height);
WebRtc_Word32 ConvertNV21ToI420AndRotateAntiClockwise(const WebRtc_UWord8* inFrame,
WebRtc_UWord8* outFrame,
WebRtc_UWord32 width,
WebRtc_UWord32 height);
WebRtc_Word32 ConvertNV21ToI420AndRotateClockwise(const WebRtc_UWord8* inFrame,
WebRtc_UWord8* outFrame,
WebRtc_UWord32 width,
WebRtc_UWord32 height);
//IPhone
WebRtc_Word32 ConvertI420ToRGBAIPhone(const WebRtc_UWord8* inFrame, WebRtc_UWord8* outFrame,
WebRtc_UWord32 width, WebRtc_UWord32 height,
WebRtc_UWord32 strideOut);
// I420 Cut and Pad - make a center cut
WebRtc_Word32 CutI420Frame(WebRtc_UWord8* frame, WebRtc_UWord32 fromWidth,
WebRtc_UWord32 fromHeight, WebRtc_UWord32 toWidth,
WebRtc_UWord32 toHeight);
// Pad an I420 frame
// Input:
// - inBuffer : Pointer to the input image component to be padded.
// - outBuffer : Pointer to the output padded image component.
// - fromWidth : Width in pixels of the inBuffer component.
// - fromHeight : Height in pixels of the inBuffer component.
// - toWidth : Width in pixels of the outBuffer component.
// - toHeight : Height in pixels of the outBuffer component.
// Return Value:
// - Length of the output component.
WebRtc_Word32 PadI420Frame(const WebRtc_UWord8* inBuffer, WebRtc_UWord8* outBuffer,
WebRtc_UWord32 fromWidth, WebRtc_UWord32 fromHeight,
WebRtc_UWord32 toWidth, WebRtc_UWord32 toHeight);
WebRtc_Word32 PadI420BottomRows(WebRtc_UWord8* buffer, WebRtc_UWord32 size,
WebRtc_UWord32 width, WebRtc_UWord32 height,
WebRtc_Word32 nrRows, WebRtc_UWord32& newLength);
// I420 Scale
// Scale an I420 frame:Half frame, quarter frame
// Input:
// - inFrame : Pointer to the image component to be scaled
// - width : Width in pixels of the output frame.
// - height : Height in pixels of the out frame.
// Return Value:
// - Length of the output component.
WebRtc_Word32 ScaleI420FrameQuarter(WebRtc_UWord32 width, WebRtc_UWord32 height,
WebRtc_UWord8* inFrame);
WebRtc_Word32 ScaleI420DownHalfFrame(WebRtc_UWord32 width, WebRtc_UWord32 height,
WebRtc_UWord8* inFrame);
WebRtc_Word32 ScaleI420UpHalfFrame(WebRtc_UWord32 width, WebRtc_UWord32 height,
WebRtc_UWord8* inFrame);
// Scales up an I420-frame to twice its width and height. Interpolates by using mean value
// of neighboring pixels.
// The following two function allow up-scaling by either twice or 3/2 of the original
// the width and height
// Input:
// - width : Width of input frame in pixels.
// - height : Height of input frame in pixels.
// - buffer : Reference to a buffer containing the frame.
// - size :Size of allocated buffer
// - scaledWidth : Reference to the width of scaled frame in pixels.
// - scaledHeight : Reference to the height of scaled frame in pixels.
// Return value:
// - (length) : Length of scaled frame.
// - (-1) : Error.
WebRtc_Word32 ScaleI420Up2(WebRtc_UWord32 width, WebRtc_UWord32 height,
WebRtc_UWord8*& buffer, WebRtc_UWord32 size,
WebRtc_UWord32 &scaledWidth, WebRtc_UWord32 &scaledHeight);
WebRtc_Word32 ScaleI420Up3_2(WebRtc_UWord32 width, WebRtc_UWord32 height,
WebRtc_UWord8*& buffer, WebRtc_UWord32 size,
WebRtc_UWord32 &scaledWidth, WebRtc_UWord32 &scaledHeight);
// Scales down an I420-frame to one third its width and height.
// Input:
// - width : Width of frame in pixels.
// - height : Height of frame in pixels.
// - videoBuffer : Reference to a buffer containing the frame.
// - scaledWidth : Width of scaled frame in pixels.
// - scaledHeight : Height of scaled frame in pixels.
// Return value:
// - (length) : Length of scaled frame.
// - (-1) : Error.
WebRtc_Word32 ScaleI420Down1_3(WebRtc_UWord32 width, WebRtc_UWord32 height,
WebRtc_UWord8*& buffer, WebRtc_UWord32 size,
WebRtc_UWord32 &scaledWidth, WebRtc_UWord32 &scaledHeight);
// Convert From I420/YV12 to I420 and Rotate clockwise
// Input:
// - srcBuffer : Reference to a buffer containing the source frame.
// - srcWidth : Width of source frame in pixels.
// - srcHeight : Height of source frame in pixels.
// - dstBuffer : Reference to a buffer containing the destination frame.
// - dstWidth : Width of destination frame in pixels.
// - dstHeight : Height of destination frame in pixels.
// - colorSpaceIn : Input color space
// Return value:
// - (length) : Length of scaled frame.
// - (-1) : Error.
WebRtc_Word32 ConvertToI420AndRotateClockwise(const WebRtc_UWord8* srcBuffer,
WebRtc_UWord32 srcWidth,
WebRtc_UWord32 srcHeight,
WebRtc_UWord8* dstBuffer,
WebRtc_UWord32 dstWidth,
WebRtc_UWord32 dstHeight,
VideoType colorSpaceIn);
// Convert From I420/YV12 to I420 and Rotate anti clockwise
// Inputs/outputs as the above function
WebRtc_Word32 ConvertToI420AndRotateAntiClockwise(const WebRtc_UWord8* srcBuffer,
WebRtc_UWord32 srcWidth,
WebRtc_UWord32 srcHeight,
WebRtc_UWord8* dstBuffer,
WebRtc_UWord32 dstWidth,
WebRtc_UWord32 dstHeight,
VideoType colorSpaceIn);
// Mirror functions
// The following 2 functions perform mirroring on a given image (LeftRight/UpDown)
// Input:
// - width : Image width in pixels.
// - height : Image height in pixels.
// - inFrame : Reference to input image.
// - outFrame : Reference to converted image.
// Return value: 0 if OK, < 0 otherwise.
WebRtc_Word32 MirrorI420LeftRight(const WebRtc_UWord8* inFrame, WebRtc_UWord8* outFrame,
WebRtc_UWord32 width, WebRtc_UWord32 height);
WebRtc_Word32 MirrorI420UpDown(const WebRtc_UWord8* inFrame, WebRtc_UWord8* outFrame,
WebRtc_UWord32 width, WebRtc_UWord32 height);
// Mirror functions - Don't work in place (srcBuffer == dstBuffer),
// and are therefore faster. Also combine mirroring with conversion to speed things up.
// Input:
// - srcBuffer : Pointer to source image.
// - dstBuffer : Pointer to destination image.
// - srcWidth : Width of input buffer.
// - srcHeight : Height of input buffer.
// - colorSpaceIn : Color space to convert from, I420 if no conversion should be done
// - dstBuffer : Pointer to converted/rotated image.
// Return value: 0 if OK, < 0 otherwise.
WebRtc_Word32 ConvertToI420AndMirrorUpDown(const WebRtc_UWord8* srcBuffer,
WebRtc_UWord8* dstBuffer,
WebRtc_UWord32 srcWidth,
WebRtc_UWord32 srcHeight,
VideoType colorSpaceIn = kI420);
}
#endif