xref: /aosp_15_r20/external/v4l2_codec2/README.md (revision 0ec5a0ec62797f775085659156625e7f1bdb369f)
1*0ec5a0ecSAndroid Build Coastguard Worker## General Information
2*0ec5a0ecSAndroid Build Coastguard Worker
3*0ec5a0ecSAndroid Build Coastguard Worker### Scope of this document
4*0ec5a0ecSAndroid Build Coastguard Worker
5*0ec5a0ecSAndroid Build Coastguard WorkerThis document is aimed to provide information about the v4l2\_codec2 project.
6*0ec5a0ecSAndroid Build Coastguard WorkerThe target readers of this document are the developers and following maintainers
7*0ec5a0ecSAndroid Build Coastguard Workerof this project, and the partners who are willing to use the V4L2 components.
8*0ec5a0ecSAndroid Build Coastguard Worker
9*0ec5a0ecSAndroid Build Coastguard Worker### Introduction
10*0ec5a0ecSAndroid Build Coastguard Worker
11*0ec5a0ecSAndroid Build Coastguard Workerv4l2\_codec2 project provides a component implementation of Codec2 framework,
12*0ec5a0ecSAndroid Build Coastguard Workerthe next-generation codec framework. The component implementation delegates the
13*0ec5a0ecSAndroid Build Coastguard Workerrequest to the driver via the V4L2 API.
14*0ec5a0ecSAndroid Build Coastguard Worker
15*0ec5a0ecSAndroid Build Coastguard Worker## Quick Start Guide
16*0ec5a0ecSAndroid Build Coastguard Worker
17*0ec5a0ecSAndroid Build Coastguard Worker### Prerequisites
18*0ec5a0ecSAndroid Build Coastguard Worker
19*0ec5a0ecSAndroid Build Coastguard Worker*   Gralloc support for graphic buffer allocation
20*0ec5a0ecSAndroid Build Coastguard Worker*   ION or Gralloc support for linear buffer allocation
21*0ec5a0ecSAndroid Build Coastguard Worker*   Kernel v5.3+ or [this patch][1] backported for buffer identification
22*0ec5a0ecSAndroid Build Coastguard Worker*   [V4L2 stateful decoding API](https://www.kernel.org/doc/html/latest/userspace-api/media/v4l/dev-decoder.html)
23*0ec5a0ecSAndroid Build Coastguard Worker*   [V4L2 encoding API](https://www.kernel.org/doc/html/latest/userspace-api/media/v4l/dev-encoder.html)
24*0ec5a0ecSAndroid Build Coastguard Worker*   Widevine DRM for secure playback
25*0ec5a0ecSAndroid Build Coastguard Worker
26*0ec5a0ecSAndroid Build Coastguard Worker### Enable V4L2 Components
27*0ec5a0ecSAndroid Build Coastguard Worker
28*0ec5a0ecSAndroid Build Coastguard WorkerInstall the build package and files, and set the parameters in device.mk
29*0ec5a0ecSAndroid Build Coastguard Worker
30*0ec5a0ecSAndroid Build Coastguard Worker```makefile
31*0ec5a0ecSAndroid Build Coastguard Worker# Add the folder to the namespace.
32*0ec5a0ecSAndroid Build Coastguard WorkerPRODUCT_SOONG_NAMESPACES += external/v4l2_codec2
33*0ec5a0ecSAndroid Build Coastguard Worker
34*0ec5a0ecSAndroid Build Coastguard Worker# Add the build target.
35*0ec5a0ecSAndroid Build Coastguard WorkerPRODUCT_PACKAGES += \
36*0ec5a0ecSAndroid Build Coastguard Worker    [email protected] \
37*0ec5a0ecSAndroid Build Coastguard Worker    libc2plugin_store
38*0ec5a0ecSAndroid Build Coastguard Worker
39*0ec5a0ecSAndroid Build Coastguard Worker# If a customized allocator is needed, then add this package.
40*0ec5a0ecSAndroid Build Coastguard Worker# See more detail at "Customized allocator" section.
41*0ec5a0ecSAndroid Build Coastguard WorkerPRODUCT_PACKAGES += \
42*0ec5a0ecSAndroid Build Coastguard Worker    libv4l2_codec2_vendor_allocator
43*0ec5a0ecSAndroid Build Coastguard Worker
44*0ec5a0ecSAndroid Build Coastguard Worker# Install media_codecs_c2.xml.
45*0ec5a0ecSAndroid Build Coastguard Worker# The destination is: /vendor/etc/media_codecs_c2.xml
46*0ec5a0ecSAndroid Build Coastguard WorkerPRODUCT_COPY_FILES += \
47*0ec5a0ecSAndroid Build Coastguard Worker    <path_to_file>:$(TARGET_COPY_OUT_VENDOR)/etc/media_codecs_c2.xml
48*0ec5a0ecSAndroid Build Coastguard Worker
49*0ec5a0ecSAndroid Build Coastguard Worker# Set the customized property of v4l2_codec2, including:
50*0ec5a0ecSAndroid Build Coastguard Worker# - The maximum concurrent instances for decoder/encoder.
51*0ec5a0ecSAndroid Build Coastguard Worker#   It should be the same as "concurrent-instances" at media_codec_c2.xml.
52*0ec5a0ecSAndroid Build Coastguard WorkerPRODUCT_PROPERTY_OVERRIDES += \
53*0ec5a0ecSAndroid Build Coastguard Worker    ro.vendor.v4l2_codec2.decode_concurrent_instances=8 \
54*0ec5a0ecSAndroid Build Coastguard Worker    ro.vendor.v4l2_codec2.encode_concurrent_instances=8
55*0ec5a0ecSAndroid Build Coastguard Worker
56*0ec5a0ecSAndroid Build Coastguard Worker# Codec2.0 poolMask:
57*0ec5a0ecSAndroid Build Coastguard Worker#   ION(16)
58*0ec5a0ecSAndroid Build Coastguard Worker#   BUFFERQUEUE(18)
59*0ec5a0ecSAndroid Build Coastguard Worker#   BLOB(19)
60*0ec5a0ecSAndroid Build Coastguard Worker#   V4L2_BUFFERQUEUE(20)
61*0ec5a0ecSAndroid Build Coastguard Worker#   V4L2_BUFFERPOOL(21)
62*0ec5a0ecSAndroid Build Coastguard Worker#   SECURE_LINEAR(22)
63*0ec5a0ecSAndroid Build Coastguard Worker#   SECURE_GRAPHIC(23)
64*0ec5a0ecSAndroid Build Coastguard Worker#
65*0ec5a0ecSAndroid Build Coastguard Worker# For linear buffer allocation:
66*0ec5a0ecSAndroid Build Coastguard Worker#   If ION is chosen, then the mask should be 0xf50000
67*0ec5a0ecSAndroid Build Coastguard Worker#   If BLOB is chosen, then the mask should be 0xfc0000
68*0ec5a0ecSAndroid Build Coastguard WorkerPRODUCT_PROPERTY_OVERRIDES += \
69*0ec5a0ecSAndroid Build Coastguard Worker    debug.stagefright.c2-poolmask=0xf50000
70*0ec5a0ecSAndroid Build Coastguard Worker
71*0ec5a0ecSAndroid Build Coastguard Worker# Install extended policy for codec2.
72*0ec5a0ecSAndroid Build Coastguard Worker# The destination is: /vendor/etc/seccomp_policy/codec2.vendor.ext.policy
73*0ec5a0ecSAndroid Build Coastguard WorkerPRODUCT_COPY_FILES += \
74*0ec5a0ecSAndroid Build Coastguard Worker    <path_to_policy>:$(TARGET_COPY_OUT_VENDOR)/etc/seccomp_policy/codec2.vendor.ext.policy
75*0ec5a0ecSAndroid Build Coastguard Worker```
76*0ec5a0ecSAndroid Build Coastguard Worker
77*0ec5a0ecSAndroid Build Coastguard WorkerAdd decode and encode components in media\_codecs\_c2.xml
78*0ec5a0ecSAndroid Build Coastguard Worker
79*0ec5a0ecSAndroid Build Coastguard Worker```xml
80*0ec5a0ecSAndroid Build Coastguard Worker<?xml version="1.0" encoding="utf-8" ?>
81*0ec5a0ecSAndroid Build Coastguard Worker<MediaCodecs>
82*0ec5a0ecSAndroid Build Coastguard Worker   <Encoders>
83*0ec5a0ecSAndroid Build Coastguard Worker       <MediaCodec name="c2.v4l2.avc.encoder" type="video/avc">
84*0ec5a0ecSAndroid Build Coastguard Worker           <Limit name="size" min="32x32" max="1920x1088" />
85*0ec5a0ecSAndroid Build Coastguard Worker           <Limit name="alignment" value="2x2" />
86*0ec5a0ecSAndroid Build Coastguard Worker           <Limit name="block-size" value="16x16" />
87*0ec5a0ecSAndroid Build Coastguard Worker           <Limit name="blocks-per-second" range="1-244800" />
88*0ec5a0ecSAndroid Build Coastguard Worker           <Limit name="bitrate" range="1-12000000" />
89*0ec5a0ecSAndroid Build Coastguard Worker           <Limit name="concurrent-instances" max="8" />
90*0ec5a0ecSAndroid Build Coastguard Worker           <Limit name="performance-point-1280x720" range="30-30" />
91*0ec5a0ecSAndroid Build Coastguard Worker       </MediaCodec>
92*0ec5a0ecSAndroid Build Coastguard Worker
93*0ec5a0ecSAndroid Build Coastguard Worker       <MediaCodec name="c2.v4l2.vp8.encoder" type="video/x-vnd.on2.vp8">
94*0ec5a0ecSAndroid Build Coastguard Worker           <Limit name="size" min="32x32" max="1920x1088" />
95*0ec5a0ecSAndroid Build Coastguard Worker           <Limit name="alignment" value="2x2" />
96*0ec5a0ecSAndroid Build Coastguard Worker           <Limit name="block-size" value="16x16" />
97*0ec5a0ecSAndroid Build Coastguard Worker           <Limit name="blocks-per-second" range="1-244800" />
98*0ec5a0ecSAndroid Build Coastguard Worker           <Limit name="bitrate" range="1-12000000" />
99*0ec5a0ecSAndroid Build Coastguard Worker           <Limit name="concurrent-instances" max="8" />
100*0ec5a0ecSAndroid Build Coastguard Worker           <Limit name="performance-point-1280x720" range="30-30" />
101*0ec5a0ecSAndroid Build Coastguard Worker       </MediaCodec>
102*0ec5a0ecSAndroid Build Coastguard Worker
103*0ec5a0ecSAndroid Build Coastguard Worker       <MediaCodec name="c2.v4l2.vp9.encoder" type="video/x-vnd.on2.vp9">
104*0ec5a0ecSAndroid Build Coastguard Worker           <Limit name="size" min="32x32" max="1920x1088" />
105*0ec5a0ecSAndroid Build Coastguard Worker           <Limit name="alignment" value="2x2" />
106*0ec5a0ecSAndroid Build Coastguard Worker           <Limit name="block-size" value="16x16" />
107*0ec5a0ecSAndroid Build Coastguard Worker           <Limit name="blocks-per-second" range="1-244800" />
108*0ec5a0ecSAndroid Build Coastguard Worker           <Limit name="bitrate" range="1-12000000" />
109*0ec5a0ecSAndroid Build Coastguard Worker           <Limit name="concurrent-instances" max="8" />
110*0ec5a0ecSAndroid Build Coastguard Worker           <Limit name="performance-point-1280x720" range="30-30" />
111*0ec5a0ecSAndroid Build Coastguard Worker       </MediaCodec>
112*0ec5a0ecSAndroid Build Coastguard Worker   </Encoders>
113*0ec5a0ecSAndroid Build Coastguard Worker
114*0ec5a0ecSAndroid Build Coastguard Worker   <Decoders>
115*0ec5a0ecSAndroid Build Coastguard Worker       <MediaCodec name="c2.v4l2.avc.decoder" type="video/avc" >
116*0ec5a0ecSAndroid Build Coastguard Worker           <Limit name="size" min="16x16" max="4096x4096" />
117*0ec5a0ecSAndroid Build Coastguard Worker           <Limit name="alignment" value="2x2" />
118*0ec5a0ecSAndroid Build Coastguard Worker           <Limit name="block-size" value="16x16" />
119*0ec5a0ecSAndroid Build Coastguard Worker           <Limit name="blocks-per-second" min="1" max="1879200" />
120*0ec5a0ecSAndroid Build Coastguard Worker           <Limit name="bitrate" range="1-62500000" />
121*0ec5a0ecSAndroid Build Coastguard Worker           <Limit name="concurrent-instances" max="8" />
122*0ec5a0ecSAndroid Build Coastguard Worker           <Limit name="performance-point-3840x2160" range="30-30" />
123*0ec5a0ecSAndroid Build Coastguard Worker           <Feature name="adaptive-playback" />
124*0ec5a0ecSAndroid Build Coastguard Worker       </MediaCodec>
125*0ec5a0ecSAndroid Build Coastguard Worker
126*0ec5a0ecSAndroid Build Coastguard Worker       <MediaCodec name="c2.v4l2.vp8.decoder" type="video/x-vnd.on2.vp8" >
127*0ec5a0ecSAndroid Build Coastguard Worker           <Limit name="size" min="16x16" max="4096x4096" />
128*0ec5a0ecSAndroid Build Coastguard Worker           <Limit name="alignment" value="2x2" />
129*0ec5a0ecSAndroid Build Coastguard Worker           <Limit name="block-size" value="16x16" />
130*0ec5a0ecSAndroid Build Coastguard Worker           <Limit name="blocks-per-second" min="1" max="1984500" />
131*0ec5a0ecSAndroid Build Coastguard Worker           <Limit name="bitrate" range="1-62500000" />
132*0ec5a0ecSAndroid Build Coastguard Worker           <Limit name="concurrent-instances" max="8" />
133*0ec5a0ecSAndroid Build Coastguard Worker           <Limit name="performance-point-3840x2160" range="30-30" />
134*0ec5a0ecSAndroid Build Coastguard Worker           <Feature name="adaptive-playback" />
135*0ec5a0ecSAndroid Build Coastguard Worker       </MediaCodec>
136*0ec5a0ecSAndroid Build Coastguard Worker
137*0ec5a0ecSAndroid Build Coastguard Worker       <MediaCodec name="c2.v4l2.vp9.decoder" type="video/x-vnd.on2.vp9" >
138*0ec5a0ecSAndroid Build Coastguard Worker           <Limit name="size" min="16x16" max="4096x4096" />
139*0ec5a0ecSAndroid Build Coastguard Worker           <Limit name="alignment" value="2x2" />
140*0ec5a0ecSAndroid Build Coastguard Worker           <Limit name="block-size" value="16x16" />
141*0ec5a0ecSAndroid Build Coastguard Worker           <Limit name="blocks-per-second" min="1" max="2073600" />
142*0ec5a0ecSAndroid Build Coastguard Worker           <Limit name="bitrate" range="1-62500000" />
143*0ec5a0ecSAndroid Build Coastguard Worker           <Limit name="concurrent-instances" max="8" />
144*0ec5a0ecSAndroid Build Coastguard Worker           <Limit name="performance-point-3840x2160" range="30-30" />
145*0ec5a0ecSAndroid Build Coastguard Worker           <Feature name="adaptive-playback" />
146*0ec5a0ecSAndroid Build Coastguard Worker       </MediaCodec>
147*0ec5a0ecSAndroid Build Coastguard Worker
148*0ec5a0ecSAndroid Build Coastguard Worker       <MediaCodec name="c2.v4l2.avc.decoder.secure" type="video/avc" >
149*0ec5a0ecSAndroid Build Coastguard Worker           <Limit name="size" min="16x16" max="4096x4096" />
150*0ec5a0ecSAndroid Build Coastguard Worker           <Limit name="alignment" value="2x2" />
151*0ec5a0ecSAndroid Build Coastguard Worker           <Limit name="block-size" value="16x16" />
152*0ec5a0ecSAndroid Build Coastguard Worker           <Limit name="blocks-per-second" min="1" max="1879200" />
153*0ec5a0ecSAndroid Build Coastguard Worker           <Limit name="bitrate" range="1-62500000" />
154*0ec5a0ecSAndroid Build Coastguard Worker           <Limit name="concurrent-instances" max="8" />
155*0ec5a0ecSAndroid Build Coastguard Worker           <Limit name="performance-point-3840x2160" range="30-30" />
156*0ec5a0ecSAndroid Build Coastguard Worker           <Feature name="adaptive-playback" />
157*0ec5a0ecSAndroid Build Coastguard Worker           <Feature name="secure-playback" required="true" />
158*0ec5a0ecSAndroid Build Coastguard Worker       </MediaCodec>
159*0ec5a0ecSAndroid Build Coastguard Worker
160*0ec5a0ecSAndroid Build Coastguard Worker       <MediaCodec name="c2.v4l2.vp8.decoder.secure" type="video/x-vnd.on2.vp8" >
161*0ec5a0ecSAndroid Build Coastguard Worker           <Limit name="size" min="16x16" max="4096x4096" />
162*0ec5a0ecSAndroid Build Coastguard Worker           <Limit name="alignment" value="2x2" />
163*0ec5a0ecSAndroid Build Coastguard Worker           <Limit name="block-size" value="16x16" />
164*0ec5a0ecSAndroid Build Coastguard Worker           <Limit name="blocks-per-second" min="1" max="1984500" />
165*0ec5a0ecSAndroid Build Coastguard Worker           <Limit name="bitrate" range="1-62500000" />
166*0ec5a0ecSAndroid Build Coastguard Worker           <Limit name="concurrent-instances" max="8" />
167*0ec5a0ecSAndroid Build Coastguard Worker           <Limit name="performance-point-3840x2160" range="30-30" />
168*0ec5a0ecSAndroid Build Coastguard Worker           <Feature name="adaptive-playback" />
169*0ec5a0ecSAndroid Build Coastguard Worker           <Feature name="secure-playback" required="true" />
170*0ec5a0ecSAndroid Build Coastguard Worker       </MediaCodec>
171*0ec5a0ecSAndroid Build Coastguard Worker
172*0ec5a0ecSAndroid Build Coastguard Worker       <MediaCodec name="c2.v4l2.vp9.decoder.secure" type="video/x-vnd.on2.vp9" >
173*0ec5a0ecSAndroid Build Coastguard Worker           <Limit name="size" min="16x16" max="4096x4096" />
174*0ec5a0ecSAndroid Build Coastguard Worker           <Limit name="alignment" value="2x2" />
175*0ec5a0ecSAndroid Build Coastguard Worker           <Limit name="block-size" value="16x16" />
176*0ec5a0ecSAndroid Build Coastguard Worker           <Limit name="blocks-per-second" min="1" max="2073600" />
177*0ec5a0ecSAndroid Build Coastguard Worker           <Limit name="bitrate" range="1-62500000" />
178*0ec5a0ecSAndroid Build Coastguard Worker           <Limit name="concurrent-instances" max="8" />
179*0ec5a0ecSAndroid Build Coastguard Worker           <Limit name="performance-point-3840x2160" range="30-30" />
180*0ec5a0ecSAndroid Build Coastguard Worker           <Feature name="adaptive-playback" />
181*0ec5a0ecSAndroid Build Coastguard Worker           <Feature name="secure-playback" required="true" />
182*0ec5a0ecSAndroid Build Coastguard Worker       </MediaCodec>
183*0ec5a0ecSAndroid Build Coastguard Worker   </Decoders>
184*0ec5a0ecSAndroid Build Coastguard Worker</MediaCodecs>
185*0ec5a0ecSAndroid Build Coastguard Worker```
186*0ec5a0ecSAndroid Build Coastguard Worker
187*0ec5a0ecSAndroid Build Coastguard WorkerSet SELinux file policy in sepolicy/file\_contexts
188*0ec5a0ecSAndroid Build Coastguard Worker
189*0ec5a0ecSAndroid Build Coastguard Worker```
190*0ec5a0ecSAndroid Build Coastguard Worker/vendor/bin/hw/android\.hardware\.media\.c2@1\.0-service-v4l2(.*)?  u:object_r:mediacodec_exec:s0
191*0ec5a0ecSAndroid Build Coastguard Worker```
192*0ec5a0ecSAndroid Build Coastguard Worker
193*0ec5a0ecSAndroid Build Coastguard WorkerAdd additional permission in codec2.vendor.ext.policy
194*0ec5a0ecSAndroid Build Coastguard Worker
195*0ec5a0ecSAndroid Build Coastguard Worker```
196*0ec5a0ecSAndroid Build Coastguard Worker_llseek: 1
197*0ec5a0ecSAndroid Build Coastguard Workerepoll_create1: 1
198*0ec5a0ecSAndroid Build Coastguard Workerepoll_ctl: 1
199*0ec5a0ecSAndroid Build Coastguard Workerepoll_pwait: 1
200*0ec5a0ecSAndroid Build Coastguard Workereventfd2: 1
201*0ec5a0ecSAndroid Build Coastguard Workerfstat64: 1
202*0ec5a0ecSAndroid Build Coastguard Workerfstatat64: 1
203*0ec5a0ecSAndroid Build Coastguard Workerfstatfs64: 1
204*0ec5a0ecSAndroid Build Coastguard Workergetcwd: 1
205*0ec5a0ecSAndroid Build Coastguard Workergetdents64: 1
206*0ec5a0ecSAndroid Build Coastguard Workergetuid32: 1
207*0ec5a0ecSAndroid Build Coastguard Workermmap2: 1
208*0ec5a0ecSAndroid Build Coastguard Workerpselect6: 1
209*0ec5a0ecSAndroid Build Coastguard Workerstatfs64: 1
210*0ec5a0ecSAndroid Build Coastguard Workersysinfo: 1
211*0ec5a0ecSAndroid Build Coastguard Workerugetrlimit: 1
212*0ec5a0ecSAndroid Build Coastguard Worker```
213*0ec5a0ecSAndroid Build Coastguard Worker
214*0ec5a0ecSAndroid Build Coastguard WorkerSet file permission in ueventd.rc
215*0ec5a0ecSAndroid Build Coastguard Worker
216*0ec5a0ecSAndroid Build Coastguard Worker```
217*0ec5a0ecSAndroid Build Coastguard Worker/dev/video*    0600   media      media
218*0ec5a0ecSAndroid Build Coastguard Worker```
219*0ec5a0ecSAndroid Build Coastguard Worker
220*0ec5a0ecSAndroid Build Coastguard Worker### Customized Allocator
221*0ec5a0ecSAndroid Build Coastguard Worker
222*0ec5a0ecSAndroid Build Coastguard WorkerThe default allocator of the decoder's output buffer is C2AllocatorGralloc.
223*0ec5a0ecSAndroid Build Coastguard WorkerHowever, C2AllocatorGralloc might not fit the requirement for secure playback.
224*0ec5a0ecSAndroid Build Coastguard WorkerIn this case, we can implement a customized C2Allocator, and load it at
225*0ec5a0ecSAndroid Build Coastguard Workerrun-time. Please create a library `libv4l2_codec2_vendor_allocator`, and export
226*0ec5a0ecSAndroid Build Coastguard Workera function `CreateVendorAllocator() `for creating the customized C2Allocator.
227*0ec5a0ecSAndroid Build Coastguard WorkerHere is an example below.
228*0ec5a0ecSAndroid Build Coastguard Worker
229*0ec5a0ecSAndroid Build Coastguard Worker#### Example of Android.bp
230*0ec5a0ecSAndroid Build Coastguard Worker
231*0ec5a0ecSAndroid Build Coastguard Worker```json
232*0ec5a0ecSAndroid Build Coastguard Workercc_library_shared {
233*0ec5a0ecSAndroid Build Coastguard Worker    name: "libv4l2_codec2_vendor_allocator",
234*0ec5a0ecSAndroid Build Coastguard Worker    vendor: true,
235*0ec5a0ecSAndroid Build Coastguard Worker
236*0ec5a0ecSAndroid Build Coastguard Worker    defaults: [
237*0ec5a0ecSAndroid Build Coastguard Worker        "libcodec2-impl-defaults",
238*0ec5a0ecSAndroid Build Coastguard Worker    ],
239*0ec5a0ecSAndroid Build Coastguard Worker
240*0ec5a0ecSAndroid Build Coastguard Worker    srcs: [
241*0ec5a0ecSAndroid Build Coastguard Worker        "C2VendorAllocatorFactory.cpp",
242*0ec5a0ecSAndroid Build Coastguard Worker    ],
243*0ec5a0ecSAndroid Build Coastguard Worker
244*0ec5a0ecSAndroid Build Coastguard Worker    shared_libs: [
245*0ec5a0ecSAndroid Build Coastguard Worker        "libc2plugin_store",
246*0ec5a0ecSAndroid Build Coastguard Worker    ],
247*0ec5a0ecSAndroid Build Coastguard Worker}
248*0ec5a0ecSAndroid Build Coastguard Worker```
249*0ec5a0ecSAndroid Build Coastguard Worker
250*0ec5a0ecSAndroid Build Coastguard Worker#### Example of C2VendorAllocatorFactory.cpp
251*0ec5a0ecSAndroid Build Coastguard Worker
252*0ec5a0ecSAndroid Build Coastguard Worker```cpp
253*0ec5a0ecSAndroid Build Coastguard Worker//#define LOG_NDEBUG 0
254*0ec5a0ecSAndroid Build Coastguard Worker#define LOG_TAG "C2VendorAllocatorFactory"
255*0ec5a0ecSAndroid Build Coastguard Worker
256*0ec5a0ecSAndroid Build Coastguard Worker#include <C2AllocatorGralloc.h>
257*0ec5a0ecSAndroid Build Coastguard Worker#include <utils/Log.h>
258*0ec5a0ecSAndroid Build Coastguard Worker#include <v4l2_codec2/plugin_store/V4L2AllocatorId.h>
259*0ec5a0ecSAndroid Build Coastguard Worker
260*0ec5a0ecSAndroid Build Coastguard Workernamespace android {
261*0ec5a0ecSAndroid Build Coastguard Worker
262*0ec5a0ecSAndroid Build Coastguard Worker::C2Allocator* CreateVendorAllocator(::C2Allocator::id_t allocatorId) {
263*0ec5a0ecSAndroid Build Coastguard Worker    ALOGV("%s(%d)", __func__, allocatorId);
264*0ec5a0ecSAndroid Build Coastguard Worker
265*0ec5a0ecSAndroid Build Coastguard Worker    // Change to create vendor-customized implementation.
266*0ec5a0ecSAndroid Build Coastguard Worker    switch (allocatorId) {
267*0ec5a0ecSAndroid Build Coastguard Worker    case V4L2AllocatorId::V4L2_BUFFERQUEUE:
268*0ec5a0ecSAndroid Build Coastguard Worker        return new C2AllocatorGralloc(V4L2AllocatorId::V4L2_BUFFERQUEUE, true);
269*0ec5a0ecSAndroid Build Coastguard Worker    case V4L2AllocatorId::V4L2_BUFFERPOOL:
270*0ec5a0ecSAndroid Build Coastguard Worker        return new C2AllocatorGralloc(V4L2AllocatorId::V4L2_BUFFERPOOL, true);
271*0ec5a0ecSAndroid Build Coastguard Worker    case V4L2AllocatorId::SECURE_LINEAR:
272*0ec5a0ecSAndroid Build Coastguard Worker        return new C2AllocatorGralloc(V4L2AllocatorId::SECURE_LINEAR, true);
273*0ec5a0ecSAndroid Build Coastguard Worker    case V4L2AllocatorId::SECURE_GRAPHIC:
274*0ec5a0ecSAndroid Build Coastguard Worker        return new C2AllocatorGralloc(V4L2AllocatorId::SECURE_GRAPHIC, true);
275*0ec5a0ecSAndroid Build Coastguard Worker    default:
276*0ec5a0ecSAndroid Build Coastguard Worker        ALOGE("%s(): Unknown allocator ID: %d", __func__, allocatorId);
277*0ec5a0ecSAndroid Build Coastguard Worker    }
278*0ec5a0ecSAndroid Build Coastguard Worker    return nullptr;
279*0ec5a0ecSAndroid Build Coastguard Worker}
280*0ec5a0ecSAndroid Build Coastguard Worker
281*0ec5a0ecSAndroid Build Coastguard Worker}  // namespace android
282*0ec5a0ecSAndroid Build Coastguard Worker
283*0ec5a0ecSAndroid Build Coastguard Workerextern "C" ::C2Allocator* CreateAllocator(::C2Allocator::id_t allocatorId) {
284*0ec5a0ecSAndroid Build Coastguard Worker    return ::android::CreateVendorAllocator(allocatorId);
285*0ec5a0ecSAndroid Build Coastguard Worker}
286*0ec5a0ecSAndroid Build Coastguard Worker```
287*0ec5a0ecSAndroid Build Coastguard Worker
288*0ec5a0ecSAndroid Build Coastguard Worker## V4L2 Encoder
289*0ec5a0ecSAndroid Build Coastguard Worker
290*0ec5a0ecSAndroid Build Coastguard Worker### Supported Codecs
291*0ec5a0ecSAndroid Build Coastguard Worker
292*0ec5a0ecSAndroid Build Coastguard WorkerCurrently the V4L2 encoder has support for the H.264, VP8 and VP9 codecs. Codec
293*0ec5a0ecSAndroid Build Coastguard Workerselection can be done by selecting the encoder with the appropriate name.
294*0ec5a0ecSAndroid Build Coastguard Worker
295*0ec5a0ecSAndroid Build Coastguard Worker- H26: *c2.v4l2.avc.encoder*
296*0ec5a0ecSAndroid Build Coastguard Worker- VP8: *c2.v4l2.vp8.encoder*
297*0ec5a0ecSAndroid Build Coastguard Worker- VP9: *c2.v4l2.vp9.encoder*
298*0ec5a0ecSAndroid Build Coastguard Worker
299*0ec5a0ecSAndroid Build Coastguard Worker### Supported Parameters:
300*0ec5a0ecSAndroid Build Coastguard Worker
301*0ec5a0ecSAndroid Build Coastguard WorkerThe following parameters are static and can not be changed at run-time:
302*0ec5a0ecSAndroid Build Coastguard Worker
303*0ec5a0ecSAndroid Build Coastguard Worker- *C2_PARAMKEY_PICTURE_SIZE*: This parameter can be used to configure the
304*0ec5a0ecSAndroid Build Coastguard Workerresolution of the encoded video stream.
305*0ec5a0ecSAndroid Build Coastguard Worker- *C2_PARAMKEY_PROFILE_LEVEL*: This parameter can be used to adjust the desired
306*0ec5a0ecSAndroid Build Coastguard Workerprofile level. When using the H.264 codec the profile level might be adjusted to
307*0ec5a0ecSAndroid Build Coastguard Workerconform to the minimum requirements for the specified bitrate and framerate.
308*0ec5a0ecSAndroid Build Coastguard Worker- *C2_PARAMKEY_SYNC_FRAME_INTERVAL*: This parameter can be used to configure the
309*0ec5a0ecSAndroid Build Coastguard Workerdesired time between subsequent key frames in microseconds.
310*0ec5a0ecSAndroid Build Coastguard Worker- *C2_PARAMKEY_BITRATE_MODE*: This parameter can be used to switch between
311*0ec5a0ecSAndroid Build Coastguard Workerconstant (*C2Config::BITRATE_CONST*) and variable (*C2Config::BITRATE_VARIABLE*)
312*0ec5a0ecSAndroid Build Coastguard Workerbitrate modes. When using CBR the encoder will try to maintain a constant
313*0ec5a0ecSAndroid Build Coastguard Workerbitrate. This mode is preferable for video conferencing where maintaining a
314*0ec5a0ecSAndroid Build Coastguard Workerstable bitrate is more important than quality. When using VBR the encoder will
315*0ec5a0ecSAndroid Build Coastguard Workerbe allowed to dynamically adjust the bitrate to maintain a constant quality. As
316*0ec5a0ecSAndroid Build Coastguard Workerthe mediacodec framework does not provide facilities to configure the peak
317*0ec5a0ecSAndroid Build Coastguard Workerbitrate when using VBR, it is currently always set to 2x the target bitrate.
318*0ec5a0ecSAndroid Build Coastguard Worker
319*0ec5a0ecSAndroid Build Coastguard WorkerThe following parameters are dynamic, and can be freely adjusted at run-time:
320*0ec5a0ecSAndroid Build Coastguard Worker
321*0ec5a0ecSAndroid Build Coastguard Worker- *C2_PARAMKEY_BITRATE*: Use this parameter to specify the desired bitrate.
322*0ec5a0ecSAndroid Build Coastguard Worker- *C2_PARAMKEY_FRAME_RATE*: This parameter can be used to configure the desired
323*0ec5a0ecSAndroid Build Coastguard Workerframerate. Note that the encoder will automatically try to adjust the framerate
324*0ec5a0ecSAndroid Build Coastguard Workerif the timestamps on the input video frames don't match the configured
325*0ec5a0ecSAndroid Build Coastguard Workerframerate.
326*0ec5a0ecSAndroid Build Coastguard Worker- *C2_PARAMKEY_REQUEST_SYNC_FRAME*: This parameter can be used to request
327*0ec5a0ecSAndroid Build Coastguard Workeradditional key frames in addition to the periodic ones requested through the
328*0ec5a0ecSAndroid Build Coastguard Worker*C2_PARAMKEY_SYNC_FRAME_INTERVAL* parameter.
329*0ec5a0ecSAndroid Build Coastguard Worker
330*0ec5a0ecSAndroid Build Coastguard Worker### Supported Input Pixel Formats:
331*0ec5a0ecSAndroid Build Coastguard Worker
332*0ec5a0ecSAndroid Build Coastguard WorkerThe V4L2 encoder supports various input pixel formats, however frames are
333*0ec5a0ecSAndroid Build Coastguard Workercurrently always passed to the V4L2 encoder in the NV12 format. If a video frame
334*0ec5a0ecSAndroid Build Coastguard Workerusing a different pixel format is passed to the encoder, format conversion will
335*0ec5a0ecSAndroid Build Coastguard Workerbe performed to convert the frame to the NV12 format.
336*0ec5a0ecSAndroid Build Coastguard Worker
337*0ec5a0ecSAndroid Build Coastguard Worker### Additional Features:
338*0ec5a0ecSAndroid Build Coastguard Worker
339*0ec5a0ecSAndroid Build Coastguard WorkerTo improve the resilience of H.264 video streams when data is missing, SPS and
340*0ec5a0ecSAndroid Build Coastguard WorkerPPS NAL units are prepended to IDR frames by enabling the
341*0ec5a0ecSAndroid Build Coastguard Worker*V4L2_CID_MPEG_VIDEO_PREPEND_SPSPPS_TO_IDR* control. If the V4L2 driver does not
342*0ec5a0ecSAndroid Build Coastguard Workersupport this control the encoder will manually cache and prepend SPS and PPS NAL
343*0ec5a0ecSAndroid Build Coastguard Workerunits.
344*0ec5a0ecSAndroid Build Coastguard Worker
345*0ec5a0ecSAndroid Build Coastguard Worker[1]: https://android.googlesource.com/kernel/common/+/ed63bb1d1f8469586006a9ca63c42344401aa2ab
346