hc
2024-05-10 9999e48639b3cecb08ffb37358bcba3b48161b29
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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
// Copyright 2019 Fuzhou Rockchip Electronics Co., Ltd. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
 
#ifndef EASYMEDIA_MEDIA_CONFIG_H_
#define EASYMEDIA_MEDIA_CONFIG_H_
 
#include "flow.h"
#include "image.h"
#include "media_type.h"
#include "sound.h"
 
typedef struct {
    ImageInfo image_info;
    CodecType codec_type;
    // for jpeg only
    int qfactor; // 1-99: higher value => higher quality
} ImageConfig;
 
typedef struct {
    ImageConfig image_cfg;
    int qp_init;
    int qp_step;
    int qp_min;
    int qp_max;
    int qp_max_i;
    int qp_min_i;
    int bit_rate;
    int bit_rate_max;
    int bit_rate_min;
    // The frame rate may be a fraction:
    //   @frame_rate: numerator of the output fps
    //   @frame_rate_den: denominator of the output fps.
    //   @frame_in_rate: numerator of the input fps.
    //   @frame_in_rate_den: denominator of the input fps.
    int frame_rate;
    int frame_rate_den;
    int frame_in_rate;
    int frame_in_rate_den;
    int trans_8x8; // h264 encoder
    int level;     // h264 encoder
    int gop_size;
    int profile; // h264 encoder
    // encoder work in fullrage mode.
    int full_range;
    // reference frame config.
    int ref_frm_cfg;
    // rotation:0, 90, 180, 270;
    int rotation;
    // quality - quality parameter
    //    (extra CQP level means special constant-qp (CQP) mode)
    //    (extra AQ_ONLY means special aq only mode)
    // "worst", "worse", "medium", "better", "best", "cqp", "aq_only"
    const char* rc_quality;
    // rc_mode - rate control mode
    // "vbr", "cbr", "fixqp"
    const char* rc_mode;
} VideoConfig;
 
typedef struct {
    SampleInfo sample_info;
    CodecType codec_type;
    // uint64_t channel_layout;
    int bit_rate;
    float quality; // vorbis: 0.0 ~ 1.0;
} AudioConfig;
 
typedef struct {
    union {
        VideoConfig vid_cfg;
        ImageConfig img_cfg;
        AudioConfig aud_cfg;
    };
    Type type;
} MediaConfig;
 
#define OSD_REGIONS_CNT 8
 
typedef struct {
    uint8_t* buffer; // Content: ID of palette
    uint32_t pos_x;
    uint32_t pos_y;
    uint32_t width;
    uint32_t height;
    uint32_t inverse;
    uint32_t region_id; // max = 8.
    uint8_t enable;
} OsdRegionData;
 
typedef struct {
    uint16_t x;           /**< horizontal position of top left corner */
    uint16_t y;           /**< vertical position of top left corner */
    uint16_t w;           /**< width of ROI rectangle */
    uint16_t h;           /**< height of ROI rectangle */
    uint16_t intra;       /**< flag of forced intra macroblock */
    int16_t quality;      /**<  qp of macroblock */
    uint16_t qp_area_idx; /**< qp min max area select*/
    uint8_t area_map_en;  /**< enable area map */
    uint8_t abs_qp_en;    /**< absolute qp enable flag*/
} EncROIRegion;
 
typedef struct {
    char* type;
    uint32_t max_bps;
    // KEY_WORST/KEY_WORSE/KEY_MEDIUM/KEY_BETTER/KEY_BEST
    const char* rc_quality;
    // KEY_VBR/KEY_CBR
    const char* rc_mode;
    uint16_t fps;
    uint16_t gop;
    // For AVC
    uint8_t profile;
    uint8_t enc_levle;
} VideoEncoderCfg;
 
typedef struct {
    int qp_init;
    int qp_step;
    int qp_min; // 0~48
    int qp_max; // 8-51
    int qp_min_i;
    int qp_max_i;
} VideoEncoderQp;
 
typedef enum
{
    GOP_MODE_NORMALP = 0, // normal p mode
    GOP_MODE_TSVC2,       // tsvc: 2 layer
    GOP_MODE_TSVC3,       // tsvc: 3 layer
    GOP_MODE_TSVC4,       // tsvc: 4 layer
    GOP_MODE_SMARTP,      // smart p mode
} EncGopMode;
 
typedef struct {
    EncGopMode mode;
    int gop_size;
    int ip_qp_delta; // qp delta between I frame and P frame.
    int interval;    // interval for smartp
    int vi_qp_delta; // virtual I frame qp delta for smartp.
} EncGopModeParam;
 
#include <map>
 
namespace easymedia
{
    extern const char* rc_quality_strings[7];
    extern const char* rc_mode_strings[3];
    const char* ConvertRcQuality(const std::string& s);
    const char* ConvertRcMode(const std::string& s);
    bool ParseMediaConfigFromMap(std::map<std::string, std::string>& params, MediaConfig& mc);
    _API std::vector<EncROIRegion> StringToRoiRegions(const std::string& str_regions);
    _API std::string to_param_string(const ImageConfig& img_cfg);
    _API std::string to_param_string(const VideoConfig& vid_cfg);
    _API std::string to_param_string(const AudioConfig& aud_cfg);
    _API std::string to_param_string(const MediaConfig& mc, const std::string& out_type);
    _API std::string get_video_encoder_config_string(const ImageInfo& info, const VideoEncoderCfg& cfg);
    _API int video_encoder_set_bps(std::shared_ptr<Flow>& enc_flow, unsigned int target, unsigned int min = 0,
                                   unsigned int max = 0);
    // rc_quality Ranges:
    //   KEY_WORST/KEY_WORSE/KEY_MEDIUM/KEY_BETTER/KEY_BEST
    _API int video_encoder_set_rc_quality(std::shared_ptr<Flow>& enc_flow, const char* rc_quality);
    // rc_mode Ranges:KEY_VBR/KEY_CBR
    _API int video_encoder_set_rc_mode(std::shared_ptr<Flow>& enc_flow, const char* rc_mode);
    _API int video_encoder_set_qp(std::shared_ptr<Flow>& enc_flow, VideoEncoderQp& qps);
    _API int video_encoder_force_idr(std::shared_ptr<Flow>& enc_flow);
    _API int video_encoder_set_fps(std::shared_ptr<Flow>& enc_flow, uint8_t out_num, uint8_t out_den,
                                   uint8_t in_num = 0, uint8_t in_den = 0);
    _API int video_encoder_set_osd_plt(std::shared_ptr<Flow>& enc_flow, const uint32_t* yuv_plt);
    _API int video_encoder_set_osd_region(std::shared_ptr<Flow>& enc_flow, OsdRegionData* region_data);
    _API int video_encoder_set_move_detection(std::shared_ptr<Flow>& enc_flow, std::shared_ptr<Flow>& md_flow);
    _API int video_encoder_set_roi_regions(std::shared_ptr<Flow>& enc_flow, EncROIRegion* regions, int region_cnt);
    _API int video_encoder_set_roi_regions(std::shared_ptr<Flow>& enc_flow, std::string roi_param);
    _API int video_encoder_set_gop_size(std::shared_ptr<Flow>& enc_flow, int gop);
    _API int video_move_detect_set_rects(std::shared_ptr<Flow>& md_flow, ImageRect* rects, int rect_cnt);
    _API int video_move_detect_set_rects(std::shared_ptr<Flow>& md_flow, std::string rects_param);
    _API int video_encoder_set_avc_profile(std::shared_ptr<Flow>& enc_flow, int profile_idc, int level = 0);
 
    // mode: slice split mode
    // 0 - No slice is split
    // 1 - Slice is split by byte number
    // 2 - Slice is split by macroblock / ctu number
    //
    // szie: slice split size parameter
    // When split by byte number this value is the max byte number for each slice.
    // When split by macroblock / ctu number this value is the MB/CTU number
    // for each slice.
    _API int video_encoder_set_split(std::shared_ptr<Flow>& enc_flow, unsigned int mode, unsigned int size);
    _API int video_encoder_set_gop_mode(std::shared_ptr<Flow>& enc_flow, EncGopModeParam* params);
    _API int video_encoder_set_userdata(std::shared_ptr<Flow>& enc_flow, void* data, int len, int all_frames = 0);
    _API int video_encoder_enable_statistics(std::shared_ptr<Flow>& enc_flow, int enable);
    // Set jpeg encoder qfactor, value frome 1 to 99.
    _API int jpeg_encoder_set_qfactor(std::shared_ptr<Flow>& enc_flow, int qfactor);
} // namespace easymedia
 
#endif // #ifndef EASYMEDIA_MEDIA_CONFIG_H_