xref: /aosp_15_r20/frameworks/av/media/codec2/sfplugin/utils/Codec2CommonUtils.cpp (revision ec779b8e0859a360c3d303172224686826e6e0e1)
1 /*
2  * Copyright 2018, The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 //#define LOG_NDEBUG 0
18 #define LOG_TAG "Codec2BufferUtils"
19 #define ATRACE_TAG  ATRACE_TAG_VIDEO
20 #include <utils/Log.h>
21 
22 #include <android/hardware_buffer.h>
23 #include <android-base/properties.h>
24 #include <cutils/properties.h>
25 #include <media/hardware/HardwareAPI.h>
26 #include <system/graphics.h>
27 
28 #include <C2Debug.h>
29 
30 #include "Codec2CommonUtils.h"
31 
32 namespace android {
33 
34 
isAtLeast(int version,const std::string codeName)35 static bool isAtLeast(int version, const std::string codeName) {
36     static std::once_flag sCheckOnce;
37     static std::string sDeviceCodeName;
38     static int sDeviceApiLevel;
39     std::call_once(sCheckOnce, [&](){
40         sDeviceCodeName = base::GetProperty("ro.build.version.codename", "");
41         sDeviceApiLevel = android_get_device_api_level();
42     });
43     return sDeviceApiLevel >= version || sDeviceCodeName == codeName;
44 }
45 
isAtLeastT()46 bool isAtLeastT() {
47     return isAtLeast(__ANDROID_API_T__, "Tiramisu");
48 }
49 
isAtLeastU()50 bool isAtLeastU() {
51     return isAtLeast(__ANDROID_API_U__, "UpsideDownCake");
52 }
53 
isAtLeastV()54 bool isAtLeastV() {
55     return isAtLeast(__ANDROID_API_V__, "VanillaIceCream");
56 }
57 
isP010Allowed()58 static bool isP010Allowed() {
59     // The Vendor API level which is min(ro.product.first_api_level, ro.board.[first_]api_level).
60     // This is the api level to which VSR requirement the device conform.
61     static const int32_t kVendorApiLevel =
62         base::GetIntProperty<int32_t>("ro.vendor.api_level", 0);
63 
64     return kVendorApiLevel >= __ANDROID_API_T__;
65 }
66 
isP210Allowed()67 static bool isP210Allowed() {
68     static const int32_t kVendorApiLevel =
69         base::GetIntProperty<int32_t>("ro.vendor.api_level", 0);
70 
71     return kVendorApiLevel > __ANDROID_API_V__;
72 }
73 
isHalPixelFormatSupported(AHardwareBuffer_Format format)74 bool isHalPixelFormatSupported(AHardwareBuffer_Format format) {
75     // HAL_PIXEL_FORMAT_YCBCR_P010 requirement was added in T VSR, although it could have been
76     // supported prior to this.
77     //
78     // Unfortunately, we cannot detect if P010 is properly supported using AHardwareBuffer
79     // API alone. For now limit P010 to devices that launched with Android T or known to conform
80     // to Android T VSR (as opposed to simply limiting to a T vendor image).
81     if (format == (AHardwareBuffer_Format)HAL_PIXEL_FORMAT_YCBCR_P010 &&
82             !isP010Allowed()) {
83         return false;
84     }
85 
86     // P210 is not available before Android B
87     if (format == (AHardwareBuffer_Format)AHARDWAREBUFFER_FORMAT_YCbCr_P210 &&
88             !isP210Allowed()) {
89         return false;
90     }
91 
92     // Default scenario --- the consumer is display or GPU
93     const AHardwareBuffer_Desc consumableForDisplayOrGpu = {
94             .width = 320,
95             .height = 240,
96             .format = format,
97             .layers = 1,
98             .usage = AHARDWAREBUFFER_USAGE_CPU_READ_RARELY |
99                      AHARDWAREBUFFER_USAGE_CPU_WRITE_OFTEN |
100                      AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE |
101                      AHARDWAREBUFFER_USAGE_COMPOSER_OVERLAY,
102             .stride = 0,
103             .rfu0 = 0,
104             .rfu1 = 0,
105     };
106 
107     // The consumer is a HW encoder
108     const AHardwareBuffer_Desc consumableForHwEncoder = {
109             .width = 320,
110             .height = 240,
111             .format = format,
112             .layers = 1,
113             .usage = AHARDWAREBUFFER_USAGE_CPU_READ_RARELY |
114                      AHARDWAREBUFFER_USAGE_CPU_WRITE_OFTEN |
115                      AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE |
116                      AHARDWAREBUFFER_USAGE_VIDEO_ENCODE,
117             .stride = 0,
118             .rfu0 = 0,
119             .rfu1 = 0,
120     };
121 
122     // The consumer is a SW encoder
123     const AHardwareBuffer_Desc consumableForSwEncoder = {
124             .width = 320,
125             .height = 240,
126             .format = format,
127             .layers = 1,
128             .usage = AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN |
129                      AHARDWAREBUFFER_USAGE_CPU_WRITE_OFTEN |
130                      AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE |
131                      AHARDWAREBUFFER_USAGE_COMPOSER_OVERLAY,
132             .stride = 0,
133             .rfu0 = 0,
134             .rfu1 = 0,
135     };
136     // Some devices running versions prior to Android U aren't guaranteed to advertise support
137     // for some color formats when the consumer is an encoder. Hence limit these checks to
138     // Android U and beyond.
139     if (isAtLeastU()) {
140         return AHardwareBuffer_isSupported(&consumableForDisplayOrGpu)
141                 && AHardwareBuffer_isSupported(&consumableForHwEncoder)
142                 && AHardwareBuffer_isSupported(&consumableForSwEncoder);
143     } else {
144         return AHardwareBuffer_isSupported(&consumableForDisplayOrGpu);
145     }
146 }
147 
148 }  // namespace android
149