xref: /aosp_15_r20/frameworks/av/media/ndk/NdkMediaCodecInfoPriv.h (revision ec779b8e0859a360c3d303172224686826e6e0e1)
1 /*
2  * Copyright (C) 2024 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 #ifndef _NDK_MEDIA_CODEC_INFO_PRIV_H
18 #define _NDK_MEDIA_CODEC_INFO_PRIV_H
19 
20 #include <media/MediaCodecInfo.h>
21 #include <media/NdkMediaCodecInfo.h>
22 
23 struct ACodecAudioCapabilities {
24     std::shared_ptr<android::AudioCapabilities> mAudioCaps;
25 
26     std::vector<int> mSampleRates;
27     std::vector<AIntRange> mSampleRateRanges;
28     std::vector<AIntRange> mInputChannelCountRanges;
29 
initSampleRatesACodecAudioCapabilities30     void initSampleRates() {
31         mSampleRates = mAudioCaps->getSupportedSampleRates();
32     }
33 
initSampleRateRangesACodecAudioCapabilities34     void initSampleRateRanges() {
35         const std::vector<android::Range<int>>& sampleRateRanges
36                 = mAudioCaps->getSupportedSampleRateRanges();
37         for (auto it = sampleRateRanges.begin(); it != sampleRateRanges.end(); it++) {
38             mSampleRateRanges.emplace_back(it->lower(), it->upper());
39         }
40     }
41 
initInputChannelCountRangesACodecAudioCapabilities42     void initInputChannelCountRanges() {
43         const std::vector<android::Range<int>>& inputChannels
44                 = mAudioCaps->getInputChannelCountRanges();
45         for (auto it = inputChannels.begin(); it != inputChannels.end(); it++) {
46             mInputChannelCountRanges.emplace_back(it->lower(), it->upper());
47         }
48     }
49 
ACodecAudioCapabilitiesACodecAudioCapabilities50     ACodecAudioCapabilities(std::shared_ptr<android::AudioCapabilities> audioCaps)
51             : mAudioCaps(audioCaps) {
52         initSampleRates();
53         initSampleRateRanges();
54         initInputChannelCountRanges();
55     }
56 };
57 
58 struct ACodecPerformancePoint {
59     std::shared_ptr<const android::VideoCapabilities::PerformancePoint> mPerformancePoint;
60 
ACodecPerformancePointACodecPerformancePoint61     ACodecPerformancePoint(std::shared_ptr<const android::VideoCapabilities::PerformancePoint>
62             performancePoint) : mPerformancePoint(performancePoint) {}
63 };
64 
65 struct ACodecVideoCapabilities {
66     std::shared_ptr<android::VideoCapabilities> mVideoCaps;
67 
68     std::vector<ACodecPerformancePoint> mPerformancePoints;
69 
initPerformancePointsACodecVideoCapabilities70     void initPerformancePoints() {
71         const std::vector<android::VideoCapabilities::PerformancePoint>& performancePoints
72             = mVideoCaps->getSupportedPerformancePoints();
73         for (auto it = performancePoints.begin(); it != performancePoints.end(); it++) {
74             mPerformancePoints.emplace_back(
75                     std::shared_ptr<const android::VideoCapabilities::PerformancePoint>(&(*it)));
76         }
77     }
78 
ACodecVideoCapabilitiesACodecVideoCapabilities79     ACodecVideoCapabilities(std::shared_ptr<android::VideoCapabilities> videoCaps)
80             : mVideoCaps(videoCaps) {
81         initPerformancePoints();
82     }
83 };
84 
85 struct ACodecEncoderCapabilities {
86     std::shared_ptr<android::EncoderCapabilities> mEncoderCaps;
87 
ACodecEncoderCapabilitiesACodecEncoderCapabilities88     ACodecEncoderCapabilities(std::shared_ptr<android::EncoderCapabilities> encoderCaps)
89             : mEncoderCaps(encoderCaps) {}
90 };
91 
92 struct AMediaCodecInfo {
93     std::string mName;
94     android::sp<android::MediaCodecInfo> mInfo;
95     std::string mMediaType;
96     std::shared_ptr<android::CodecCapabilities> mCodecCaps;
97 
98     std::shared_ptr<const ACodecAudioCapabilities> mAAudioCaps;
99     std::shared_ptr<const ACodecVideoCapabilities> mAVideoCaps;
100     std::shared_ptr<const ACodecEncoderCapabilities> mAEncoderCaps;
101 
AMediaCodecInfoAMediaCodecInfo102     AMediaCodecInfo(std::string name, android::sp<android::MediaCodecInfo> info,
103             std::shared_ptr<android::CodecCapabilities> codecCaps, std::string mediaType)
104             : mName(name), mInfo(info), mMediaType(mediaType), mCodecCaps(codecCaps) {
105         if (!mName.empty() && mInfo != nullptr && !mMediaType.empty() && mCodecCaps != nullptr) {
106             if (mCodecCaps->getAudioCapabilities() != nullptr) {
107                 mAAudioCaps = std::make_shared<const ACodecAudioCapabilities>(
108                         mCodecCaps->getAudioCapabilities());
109             }
110             if (mCodecCaps->getVideoCapabilities() != nullptr) {
111                 mAVideoCaps = std::make_shared<const ACodecVideoCapabilities>(
112                         mCodecCaps->getVideoCapabilities());
113             }
114             if (mCodecCaps->getEncoderCapabilities() != nullptr) {
115                 mAEncoderCaps = std::make_shared<const ACodecEncoderCapabilities>(
116                     mCodecCaps->getEncoderCapabilities());
117             }
118         }
119     }
120 };
121 
122 #endif //_NDK_MEDIA_CODEC_INFO_PRIV_H