xref: /aosp_15_r20/external/v4l2_codec2/v4l2/V4L2ComponentCommon.cpp (revision 0ec5a0ec62797f775085659156625e7f1bdb369f)
1*0ec5a0ecSAndroid Build Coastguard Worker // Copyright 2020 The Chromium Authors. All rights reserved.
2*0ec5a0ecSAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*0ec5a0ecSAndroid Build Coastguard Worker // found in the LICENSE file.
4*0ec5a0ecSAndroid Build Coastguard Worker 
5*0ec5a0ecSAndroid Build Coastguard Worker //#define LOG_NDEBUG 0
6*0ec5a0ecSAndroid Build Coastguard Worker #define LOG_TAG "V4L2ComponentCommon"
7*0ec5a0ecSAndroid Build Coastguard Worker 
8*0ec5a0ecSAndroid Build Coastguard Worker #include <v4l2_codec2/v4l2/V4L2ComponentCommon.h>
9*0ec5a0ecSAndroid Build Coastguard Worker 
10*0ec5a0ecSAndroid Build Coastguard Worker #include <log/log.h>
11*0ec5a0ecSAndroid Build Coastguard Worker #include <set>
12*0ec5a0ecSAndroid Build Coastguard Worker 
13*0ec5a0ecSAndroid Build Coastguard Worker namespace android {
14*0ec5a0ecSAndroid Build Coastguard Worker 
15*0ec5a0ecSAndroid Build Coastguard Worker const std::string V4L2ComponentName::kH264Encoder = "c2.v4l2.avc.encoder";
16*0ec5a0ecSAndroid Build Coastguard Worker const std::string V4L2ComponentName::kVP8Encoder = "c2.v4l2.vp8.encoder";
17*0ec5a0ecSAndroid Build Coastguard Worker const std::string V4L2ComponentName::kVP9Encoder = "c2.v4l2.vp9.encoder";
18*0ec5a0ecSAndroid Build Coastguard Worker 
19*0ec5a0ecSAndroid Build Coastguard Worker const std::string V4L2ComponentName::kH264Decoder = "c2.v4l2.avc.decoder";
20*0ec5a0ecSAndroid Build Coastguard Worker const std::string V4L2ComponentName::kVP8Decoder = "c2.v4l2.vp8.decoder";
21*0ec5a0ecSAndroid Build Coastguard Worker const std::string V4L2ComponentName::kVP9Decoder = "c2.v4l2.vp9.decoder";
22*0ec5a0ecSAndroid Build Coastguard Worker const std::string V4L2ComponentName::kHEVCDecoder = "c2.v4l2.hevc.decoder";
23*0ec5a0ecSAndroid Build Coastguard Worker const std::string V4L2ComponentName::kH264SecureDecoder = "c2.v4l2.avc.decoder.secure";
24*0ec5a0ecSAndroid Build Coastguard Worker const std::string V4L2ComponentName::kVP8SecureDecoder = "c2.v4l2.vp8.decoder.secure";
25*0ec5a0ecSAndroid Build Coastguard Worker const std::string V4L2ComponentName::kVP9SecureDecoder = "c2.v4l2.vp9.decoder.secure";
26*0ec5a0ecSAndroid Build Coastguard Worker const std::string V4L2ComponentName::kHEVCSecureDecoder = "c2.v4l2.hevc.decoder.secure";
27*0ec5a0ecSAndroid Build Coastguard Worker 
28*0ec5a0ecSAndroid Build Coastguard Worker // static
isValid(const std::string & name)29*0ec5a0ecSAndroid Build Coastguard Worker bool V4L2ComponentName::isValid(const std::string& name) {
30*0ec5a0ecSAndroid Build Coastguard Worker     return name == kH264Encoder || name == kVP8Encoder || name == kVP9Encoder ||
31*0ec5a0ecSAndroid Build Coastguard Worker            name == kH264Decoder || name == kVP8Decoder || name == kVP9Decoder ||
32*0ec5a0ecSAndroid Build Coastguard Worker            name == kHEVCDecoder || name == kH264SecureDecoder || name == kVP8SecureDecoder ||
33*0ec5a0ecSAndroid Build Coastguard Worker            name == kVP9SecureDecoder || name == kHEVCSecureDecoder;
34*0ec5a0ecSAndroid Build Coastguard Worker }
35*0ec5a0ecSAndroid Build Coastguard Worker 
36*0ec5a0ecSAndroid Build Coastguard Worker // static
isEncoder(const std::string & name)37*0ec5a0ecSAndroid Build Coastguard Worker bool V4L2ComponentName::isEncoder(const std::string& name) {
38*0ec5a0ecSAndroid Build Coastguard Worker     ALOG_ASSERT(isValid(name));
39*0ec5a0ecSAndroid Build Coastguard Worker 
40*0ec5a0ecSAndroid Build Coastguard Worker     return name == kH264Encoder || name == kVP8Encoder || name == kVP9Encoder;
41*0ec5a0ecSAndroid Build Coastguard Worker }
42*0ec5a0ecSAndroid Build Coastguard Worker 
43*0ec5a0ecSAndroid Build Coastguard Worker // static
isDecoder(const std::string & name)44*0ec5a0ecSAndroid Build Coastguard Worker bool V4L2ComponentName::isDecoder(const std::string& name) {
45*0ec5a0ecSAndroid Build Coastguard Worker     ALOG_ASSERT(isValid(name));
46*0ec5a0ecSAndroid Build Coastguard Worker     static const std::set<std::string> kValidDecoders = {
47*0ec5a0ecSAndroid Build Coastguard Worker             kH264Decoder, kH264SecureDecoder, kVP8Decoder,  kVP8SecureDecoder,
48*0ec5a0ecSAndroid Build Coastguard Worker             kVP9Decoder,  kVP9SecureDecoder,  kHEVCDecoder, kHEVCSecureDecoder,
49*0ec5a0ecSAndroid Build Coastguard Worker     };
50*0ec5a0ecSAndroid Build Coastguard Worker 
51*0ec5a0ecSAndroid Build Coastguard Worker     return kValidDecoders.find(name) != kValidDecoders.end();
52*0ec5a0ecSAndroid Build Coastguard Worker }
53*0ec5a0ecSAndroid Build Coastguard Worker 
54*0ec5a0ecSAndroid Build Coastguard Worker // static
getCodec(const std::string & name)55*0ec5a0ecSAndroid Build Coastguard Worker std::optional<VideoCodec> V4L2ComponentName::getCodec(const std::string& name) {
56*0ec5a0ecSAndroid Build Coastguard Worker     ALOG_ASSERT(isValid(name));
57*0ec5a0ecSAndroid Build Coastguard Worker     static const std::map<std::string, VideoCodec> kNameToCodecs = {
58*0ec5a0ecSAndroid Build Coastguard Worker             {kH264Decoder, VideoCodec::H264}, {kH264SecureDecoder, VideoCodec::H264},
59*0ec5a0ecSAndroid Build Coastguard Worker             {kH264Encoder, VideoCodec::H264},
60*0ec5a0ecSAndroid Build Coastguard Worker 
61*0ec5a0ecSAndroid Build Coastguard Worker             {kVP8Decoder, VideoCodec::VP8},   {kVP8SecureDecoder, VideoCodec::VP8},
62*0ec5a0ecSAndroid Build Coastguard Worker             {kVP8Encoder, VideoCodec::VP8},
63*0ec5a0ecSAndroid Build Coastguard Worker 
64*0ec5a0ecSAndroid Build Coastguard Worker             {kVP9Decoder, VideoCodec::VP9},   {kVP9SecureDecoder, VideoCodec::VP9},
65*0ec5a0ecSAndroid Build Coastguard Worker             {kVP9Encoder, VideoCodec::VP9},
66*0ec5a0ecSAndroid Build Coastguard Worker 
67*0ec5a0ecSAndroid Build Coastguard Worker             {kHEVCDecoder, VideoCodec::HEVC}, {kHEVCSecureDecoder, VideoCodec::HEVC},
68*0ec5a0ecSAndroid Build Coastguard Worker     };
69*0ec5a0ecSAndroid Build Coastguard Worker 
70*0ec5a0ecSAndroid Build Coastguard Worker     auto iter = kNameToCodecs.find(name);
71*0ec5a0ecSAndroid Build Coastguard Worker     if (iter == kNameToCodecs.end()) {
72*0ec5a0ecSAndroid Build Coastguard Worker         return std::nullopt;
73*0ec5a0ecSAndroid Build Coastguard Worker     }
74*0ec5a0ecSAndroid Build Coastguard Worker     return iter->second;
75*0ec5a0ecSAndroid Build Coastguard Worker }
76*0ec5a0ecSAndroid Build Coastguard Worker 
77*0ec5a0ecSAndroid Build Coastguard Worker }  // namespace android
78