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