1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
package com.iailab.netsdk.lib.structure;
 
import com.iailab.netsdk.lib.NetSDKLib;
import com.iailab.netsdk.lib.enumeration.EM_H264_PROFILE_RANK;
import com.iailab.netsdk.lib.enumeration.STREAM_RATE_TYPE;
import com.iailab.netsdk.lib.enumeration.TALK_CODING_TYPE;
 
import static com.netsdk.lib.constant.SDKStructureFieldLenth.*;
 
/**
 * 码流配置对应能力
 *
 * @author 47040
 * @since Created at 2021/5/25 21:10
 */
public class NET_STREAM_CFG_CAPS extends NetSDKLib.SdkStructure {
    /**
     * 结构体大小
     */
    public int dwSize;
    /**
     * 支持的音频编码类型 枚举值数组 {@link TALK_CODING_TYPE}
     * 有效长度由 {@link #nAudioCompressionTypeNum} 决定
     */
    public int[] nAudioCompressionTypes = new int[CFG_MAX_AUDIO_ENCODE_TYPE];
    /**
     * 音频压缩格式个数
     * 代表 {@link #nAudioCompressionTypes} 的有效长度
     */
    public int nAudioCompressionTypeNum;
    /**
     * 视频编码模式掩码,详见 "编码模式"
     */
    public int dwEncodeModeMask;
    /**
     * 支持的视频分辨率
     * {@link #abIndivResolution} 为 0 时生效
     * 有效长度由 {@link #nResolutionTypeNum} 决定
     */
    public NetSDKLib.NET_RESOLUTION_INFO[] stuResolutionTypes = new NetSDKLib.NET_RESOLUTION_INFO[CFG_MAX_CAPTURE_SIZE_NUM];
    /**
     * 不同分辨率下帧率最大值
     * {@link #nFPSMax} 不为 0 时使用
     * 数组下标与 {@link #stuResolutionTypes} 匹配
     * 有效长度由 {@link #nResolutionTypeNum} 决定
     */
    public int[] nResolutionFPSMax = new int[CFG_MAX_CAPTURE_SIZE_NUM];
    /**
     * 视频分辨率个数 决定了以下数组的有效长度
     * {@link #stuResolutionTypes}
     * {@link #nResolutionFPSMax}
     */
    public int nResolutionTypeNum;
    /**
     * 最大视频码流(kbps)
     * 这里虽然是只限定了码流的上下界 但并不意味着配置的时候可以在界内随便填
     * 必须从 {@link STREAM_RATE_TYPE} 选择区间内的码流值
     */
    public int nMaxBitRateOptions;
    /**
     * 最小视频码流(kbps)
     * 这里虽然是只限定了码流的上下界 但并不意味着配置的时候可以在界内随便填
     * 必须从 {@link STREAM_RATE_TYPE} 选择区间内的码流值
     */
    public int nMinBitRateOptions;
    /**
     * 支持的 H.264 Profile等级 枚举值数组 {@link EM_H264_PROFILE_RANK}
     * 有效长度由 {@link #nH264ProfileRankNum} 决定
     */
    public byte[] bH264ProfileRank = new byte[EM_H264_PROFILE_RANK.NET_PROFILE_HIGH.getValue()];
    /**
     * 支持的 H.264 Profile 等级个数
     * 决定了 {@link #bH264ProfileRank} 的有效长度
     */
    public int nH264ProfileRankNum;
    /**
     * 当分辨率为 cif 时最大 p 帧(Kbps)
     */
    public int nCifPFrameMaxSize;
    /**
     * 当分辨率为 cif 时最小 p 帧(Kbps)
     */
    public int nCifPFrameMinSize;
    /**
     * 视频帧率最大值
     * 如果为 0 则以 {@link #nResolutionFPSMax} 为准
     */
    public int nFPSMax;
    /**
     * 支持的视频分辨率
     * {@link #abIndivResolution} 为 1 时生效
     * 本身是一个二维数组 出于 JNA 封装需要第二维单独封装成新结构体 {@link NET_RESOLUTION_INFO_ARRAY}
     * 每个第二维数组的有效长度由 {@link #nIndivResolutionNums} 决定 其数组下标和本字段的下标精确匹配
     */
    public NET_RESOLUTION_INFO_ARRAY[] stuIndivResolutionTypes = new NET_RESOLUTION_INFO_ARRAY[CFG_MAX_COMPRESSION_TYPES_NUM];
    /**
     * 标志位 用以区别能力集是否包含所有编码格式
     * 0 表示 {@link #stuResolutionTypes} {@link #nResolutionTypeNum} 有效
     * 1 表示 {@link #stuIndivResolutionTypes} {@link #nIndivResolutionNums} 有效
     */
    public int abIndivResolution;
    /**
     * 不同编码模式分别支持的视频分辨率个数
     * 代表 {@link #stuIndivResolutionTypes} 各个第二维数组的有效长度 其数组下标和本字段的下标精确匹配
     */
    public int[] nIndivResolutionNums = new int[CFG_MAX_COMPRESSION_TYPES_NUM];
 
    public NET_STREAM_CFG_CAPS() {
        dwSize = this.size();
        for (int i = 0; i < stuResolutionTypes.length; i++) {
            stuResolutionTypes[i] = new NetSDKLib.NET_RESOLUTION_INFO();
        }
        for (int i = 0; i < stuIndivResolutionTypes.length; i++) {
            stuIndivResolutionTypes[i] = new NET_RESOLUTION_INFO_ARRAY();
        }
    }
}