1 /*
2  * Copyright (C) 2024 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef FRAMEWORKS_INNERKITSIMPL_UTILS_INCLUDE_PIXEL_YUV_UTILS_H
17 #define FRAMEWORKS_INNERKITSIMPL_UTILS_INCLUDE_PIXEL_YUV_UTILS_H
18 
19 #include <cstdlib>
20 #include <cstdio>
21 #include <string>
22 #include "image_type.h"
23 #include "iosfwd"
24 
25 #ifdef __cplusplus
26 extern "C" {
27 #endif
28 #include "libavfilter/avfilter.h"
29 #include "libavutil/avstring.h"
30 #include "libavfilter/buffersrc.h"
31 #include "libavfilter/buffersink.h"
32 #include "libavutil/frame.h"
33 #include "libavutil/imgutils.h"
34 #include "libavutil/pixfmt.h"
35 #include "libswscale/swscale.h"
36 #ifdef __cplusplus
37 }
38 #endif
39 
40 namespace OHOS {
41 namespace Media {
42 
43 struct XYaxis {
44     float xAxis = 0;
45     float yAxis = 0;
46 };
47 
48 struct PixelSize {
49     int32_t srcW = 0;
50     int32_t srcH = 0;
51     int32_t dstW = 0;
52     int32_t dstH = 0;
53 };
54 
55 struct YuvImageInfo {
56     AVPixelFormat format = AVPixelFormat::AV_PIX_FMT_NONE;
57     int32_t width;
58     int32_t height;
59     PixelFormat yuvFormat;
60     YUVDataInfo yuvDataInfo;
61 };
62 
63 struct YuvPixelsP010Translate {
64     uint16_t *srcPixels;
65     uint16_t *dstPixels;
66 };
67 
68 class PixelYuvUtils {
69 public:
70     static int32_t YuvConvertOption(const AntiAliasingOption &option);
71     static bool WriteYuvConvert(const void *srcPixels, const ImageInfo &srcInfo, void *dstPixels,
72         const Position &dstPos, const YUVDataInfo &yuvDataInfo);
73     static bool ReadYuvConvert(const void *srcPixels, const Position &srcPos, YuvImageInfo &srcInfo,
74         void *dstPixels, const ImageInfo &dstInfo);
75     static void SetTranslateDataDefault(uint8_t *srcPixels, int32_t width, int32_t height, PixelFormat format,
76         YUVStrideInfo &dstStrides);
77     static uint8_t GetYuv420Y(uint32_t x, uint32_t y, YUVDataInfo &info, const uint8_t *in);
78     static uint8_t GetYuv420U(uint32_t x, uint32_t y, YUVDataInfo &info, PixelFormat format,
79         const uint8_t *in);
80     static uint8_t GetYuv420V(uint32_t x, uint32_t y, YUVDataInfo &info, PixelFormat format,
81         const uint8_t *in);
82     static AVPixelFormat ConvertFormat(const PixelFormat &pixelFormat);
83     static bool BGRAToYuv420(const uint8_t *src, YuvImageInfo &srcInfo, uint8_t *dst, YuvImageInfo &dstInfo);
84     static bool Yuv420ToBGRA(const uint8_t *in, YuvImageInfo &srcInfo, uint8_t *out,
85         YuvImageInfo &dstInfo);
86     static bool Yuv420ToARGB(const uint8_t *in, YuvImageInfo &srcInfo, uint8_t *out, YuvImageInfo &dstInfo);
87     static bool YuvTranslate(const uint8_t *srcPixels, YUVDataInfo &yuvInfo, uint8_t *dstPixels, XYaxis &xyAxis,
88         ImageInfo &info, YUVStrideInfo &dstStrides);
89     static bool Yuv420WritePixels(const YUVDataInfo &yuvInfo, uint8_t *srcPixels, ImageInfo &info,
90         const uint32_t &color);
91     static bool YuvWritePixel(uint8_t *srcPixels, const YUVDataInfo &yuvDataInfo, const PixelFormat &format,
92         const Position &pos, const uint32_t &color);
93     static bool YuvCrop(uint8_t *srcData, YuvImageInfo &srcInfo, uint8_t *dstData, const Rect &rect,
94         YUVStrideInfo &dstStrides);
95     static bool YuvRotate(uint8_t *srcData, YuvImageInfo &srcInfo,
96         uint8_t *dstData, YuvImageInfo &dstInfo, int32_t degrees);
97     static bool YuvFlip(uint8_t *srcData, YuvImageInfo &srcInfo, uint8_t *dstData, bool xAxis);
98     static bool YuvReversal(uint8_t *srcData, YuvImageInfo &srcInfo, uint8_t *dstData, YuvImageInfo &dstInfo);
99     static int32_t YuvScale(uint8_t *srcPixels, YuvImageInfo &srcInfo,
100         uint8_t *dstPixels, YuvImageInfo &dstInfo, int32_t module);
101     static void Yuv420SPTranslate(const uint8_t *srcPixels, YUVDataInfo &yuvInfo,
102         uint8_t *dstPixels, XYaxis &xyAxis, ImageInfo &info, YUVStrideInfo &strides);
103 };
104 } // namespace Media
105 } // namespace OHOS
106 
107 #endif // FRAMEWORKS_INNERKITSIMPL_UTILS_INCLUDE_PIXEL_YUV_UTILS_H
108