RGBToYCrCb422
Converts a 24-bit per-pixel RGB image to a 16-bit per-pixel YCrCb image. The function converts a gamma-corrected R'G'B' image into a Y'Cb'Cr' image according to the same formula as the function RGBToYCbCr. The difference is that HMPPI_RGBToYCrCb422 uses the 4:2:2 sampling format for converted image.
The bit depth of the converted buffer is 16 bits per pixel, while the bit depth of the original buffer is 24 bits.
The function interface declaration is as follows:
- Operation on pixel-order data:
HmppResult HMPPI_RGBToYCrCb422_8u_C3C2R(const uint8_t *src, int32_t srcStep, uint8_t *dst, int32_t dstStep, HmppiSize roiSize);
- Conversion from planar data to pixel-order data:
HmppResult HMPPI_RGBToYCrCb422_8u_P3C2R(const uint8_t *src[3], int32_t srcStep, uint8_t *dst, int32_t dstStep, HmppiSize roiSize);
Parameters
Parameter |
Description |
Value Range |
Input/Output |
|---|---|---|---|
src |
Pointer to the source image. An array of pointers to the color planes of the source planar image. |
The value cannot be NULL. |
Input |
srcStep |
Distance between starts of consecutive lines in the source image, in bytes |
The value must be zero or a positive integer. |
Input |
dst |
Pointer to the destination image ROI. An array of pointers to the color planes of the destination planar image. |
The value cannot be NULL. |
Output |
dstStep |
Distance between starts of consecutive lines in the destination image, in bytes |
The value must be zero or a positive integer. |
Input |
roiSize |
Size of the ROI of the source and destination images, in pixels |
roiSize.width ∈ (0, INT_MAX], roiSize.height ∈ (0, INT_MAX] |
Input |
Return Value
- Success: HMPP_STS_NO_ERR
- Failure: An error code is returned.
Error Codes
Error Code |
Description |
|---|---|
HMPP_STS_NULL_PTR_ERR |
The value of src is NULL. |
HMPP_STS_SIZE_ERR |
The value of roiSize is 0 or negative. |
HMPP_STS_STEP_ERR |
The value of srcStep is zero or negative. |
HMPP_STS_ROI_ERR |
roiSize.width x Number of channels x Number of bytes occupied by the data type > Step |
Example
#define SRC_BUFFER_SIZE_T 90
#define DST_BUFFER_SIZE_T 90
void TestExample_RGBToYCrCb422()
{
HmppiSize roi = { 4, 4 };
const uint8_t src[SRC_BUFFER_SIZE_T] = {
11, 22, 33, 44, 55, 66, 77, 88, 22, 88, 77, 66, 55, 44, 33,
11, 22, 33, 44, 55, 66, 77, 88, 22, 88, 77, 66, 55, 44, 33,
11, 22, 33, 44, 55, 66, 77, 88, 22, 88, 77, 66, 55, 44, 33,
11, 22, 33, 44, 55, 66, 77, 88, 22, 88, 77, 66, 55, 44, 33,
11, 22, 33, 44, 55, 66, 77, 88, 22, 88, 77, 66, 55, 44, 33,
11, 22, 33, 44, 55, 66, 77, 88, 22, 88, 77, 66, 55, 44, 33
};
int32_t srcStep = 20 * sizeof(uint8_t);
int32_t dstStep = 15 * sizeof(uint8_t);;
uint8_t dst[DST_BUFFER_SIZE_T] = {0};
HmppResult result = HMPPI_RGBToYCbCr422_8u_C3C2R(src, srcStep, dst, dstStep, roi);
printf("result = %d \ndst = ", result);
if (result != HMPP_STS_NO_ERR) {
printf("result error: %d\n", result);
}
int32_t dstWidth = dstStep / sizeof(uint8_t);
for(int32_t i = 0; i < DST_BUFFER_SIZE_T; i++){
if (i % dstWidth == 0) {
printf("\n");
}
printf("%3d ",dst[i]);
}
printf("\n");
}
int main()
{
TestExample_RGBToYCrCb422();
return 0;
}
Output:
result = 0 dst = 33 134 61 122 82 111 84 131 0 0 0 0 0 0 0 80 134 74 111 65 126 32 135 0 0 0 0 0 0 0 74 119 45 134 43 134 71 122 0 0 0 0 0 0 0 33 134 61 122 82 111 84 131 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0