blob: bf106f14b2f6bc48a1fce0aa259d36f1b2fb3dc3 [file] [log] [blame]
/*
* 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.
*/
/*
* WebRTC's Wrapper to libyuv.
*/
#ifndef WEBRTC_COMMON_VIDEO_LIBYUV_INCLUDE_LIBYUV_H_
#define WEBRTC_COMMON_VIDEO_LIBYUV_INCLUDE_LIBYUV_H_
#include "common_types.h" // RawVideoTypes.
#include "typedefs.h"
namespace webrtc {
// TODO(mikhal): 1. Sync libyuv and WebRtc meaning of stride.
// 2. Reorder parameters for consistency.
// Supported video types.
enum VideoType {
kUnknown,
kI420,
kIYUV,
kRGB24,
kABGR,
kARGB,
kARGB4444,
kRGB565,
kARGB1555,
kYUY2,
kYV12,
kUYVY,
kMJPG,
kNV21,
kNV12,
kBGRA,
};
// Conversion between the RawVideoType and the LibYuv videoType.
// TODO(wu): Consolidate types into one type throughout WebRtc.
VideoType RawVideoTypeToCommonVideoVideoType(RawVideoType type);
// Supported rotation
// Direction of rotation - clockwise.
enum VideoRotationMode {
kRotateNone = 0,
kRotate90 = 90,
kRotate180 = 180,
kRotate270 = 270,
};
// Calculate the required buffer size.
// Input:
// - type - The type of the designated video frame.
// - width - frame width in pixels.
// - height - frame height in pixels.
// Return value: The required size in bytes to accommodate the specified
// video frame or -1 in case of an error .
int CalcBufferSize(VideoType type, int width, int height);
// Compute required buffer size when converting from one type to another.
// Input:
// - src_video_type - Type of the existing video frame.
// - dst_video_type - Type of the designated video frame.
// - length - length in bytes of the data.
// Return value: The required size in bytes to accommodate the specified
// converted video frame or -1 in case of an error.
int CalcBufferSize(VideoType src_video_type,
VideoType dst_video_type,
int length);
// TODO (mikhal): Merge the two functions above.
// Convert To I420
// Input:
// - src_video_type : Type of input video.
// - src_frame : Pointer to a source frame.
// - crop_x/crop_y : Starting positions for cropping (0 for no crop).
// - src/dst_width : src/dst width in pixels.
// - src/dst_height : src/dst height in pixels.
// - sample_size : Required only for the parsing of MJPG (set to 0 else).
// - dst_stride : Number of bytes in a row of the dst Y plane.
// - rotate : Rotation mode of output image.
// Output:
// - dst_frame : Pointer to a destination frame.
// Return value: 0 if OK, < 0 otherwise.
int ConvertToI420(VideoType src_video_type,
const uint8_t* src_frame,
int crop_x, int crop_y,
int src_width, int src_height,
int sample_size,
int dst_width, int dst_height, int dst_stride,
VideoRotationMode rotation,
uint8_t* dst_frame);
// Convert From I420
// Input:
// - src_frame : Pointer to a source frame.
// - src_stride : Number of bytes in a row of the src Y plane.
// - dst_video_type : Type of output video.
// - dst_sample_size : Required only for the parsing of MJPG.
// - width : Width in pixels.
// - height : Height in pixels.
// - dst_frame : Pointer to a destination frame.
// Return value: 0 if OK, < 0 otherwise.
int ConvertFromI420(const uint8_t* src_frame, int src_stride,
VideoType dst_video_type, int dst_sample_size,
int width, int height,
uint8_t* dst_frame);
// ConvertFrom YV12.
// Interface - same as above.
int ConvertFromYV12(const uint8_t* src_frame, int src_stride,
VideoType dst_video_type, int dst_sample_size,
int width, int height,
uint8_t* dst_frame);
// The following list describes designated conversion functions which
// are not covered by the previous general functions.
// Input and output descriptions mostly match the above descriptions, and are
// therefore omitted.
// Possible additional input value - dst_stride - stride of the dst frame.
int ConvertI420ToARGB4444(const uint8_t* src_frame,
uint8_t* dst_frame,
int width,
int height,
int dst_stride);
int ConvertI420ToRGB565(const uint8_t* src_frame,
uint8_t* dst_frame,
int width,
int height);
int ConvertI420ToARGB1555(const uint8_t* src_frame,
uint8_t* dst_frame,
int width,
int height,
int dst_stride);
int ConvertRGB24ToARGB(const uint8_t* src_frame,
uint8_t* dst_frame,
int width, int height,
int dst_stride);
int ConvertNV12ToRGB565(const uint8_t* src_frame,
uint8_t* dst_frame,
int width, int height);
// 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.
// - src_frame : Pointer to a source frame.
// - dst_frame : Pointer to a destination frame.
// Return value: 0 if OK, < 0 otherwise.
int MirrorI420LeftRight(const uint8_t* src_frame,
uint8_t* dst_frame,
int width, int height);
int MirrorI420UpDown(const uint8_t* src_frame,
uint8_t* dst_frame,
int width, int height);
// Mirror functions + conversion
// Input:
// - src_frame : Pointer to source frame.
// - dst_frame : Pointer to destination frame.
// - src_width : Width of input buffer.
// - src_height : Height of input buffer.
// - src_color_space : Color space to convert from, I420 if no
// conversion should be done.
// Return value: 0 if OK, < 0 otherwise.
int ConvertToI420AndMirrorUpDown(const uint8_t* src_frame,
uint8_t* dst_frame,
int src_width,
int src_height,
VideoType src_video_type);
// Compute PSNR for an I420 frame (all planes).
double I420PSNR(const uint8_t* ref_frame,
const uint8_t* test_frame,
int width, int height);
// Compute SSIM for an I420 frame (all planes).
double I420SSIM(const uint8_t* ref_frame,
const uint8_t* test_frame,
int width, int height);
}
#endif // WEBRTC_COMMON_VIDEO_LIBYUV_INCLUDE_LIBYUV_H_