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