Commit 54f4a423431206237206bfdf92bcd4a4a00f00ed
1 parent
afd07f06
添加resize到1920,1080设置
Showing
15 changed files
with
302 additions
and
71 deletions
src/ai_platform/MultiSourceProcess.cpp
... | ... | @@ -84,17 +84,17 @@ CMultiSourceProcess::~CMultiSourceProcess(){ |
84 | 84 | } |
85 | 85 | |
86 | 86 | int CMultiSourceProcess::InitAlgorthim(tsl_aiplatform_param vptParam){ |
87 | -#ifdef USE_VILLAGE | |
88 | - if (!CheckTime()) { //时间限制 | |
89 | - std::cout << "sy_licence_check failed." << std::endl; | |
90 | - return AUTHOR_ERROR; | |
91 | - } | |
92 | -#else | |
93 | - if (!CheckLabel(vptParam.gpuid)) { //机器授权 | |
94 | - std::cout << "sy_licence_check failed." << std::endl; | |
95 | - return AUTHOR_ERROR; | |
96 | - } | |
97 | -#endif | |
87 | +// #ifdef USE_VILLAGE | |
88 | +// if (!CheckTime()) { //时间限制 | |
89 | +// std::cout << "sy_licence_check failed." << std::endl; | |
90 | +// return AUTHOR_ERROR; | |
91 | +// } | |
92 | +// #else | |
93 | +// if (!CheckLabel(vptParam.gpuid)) { //机器授权 | |
94 | +// std::cout << "sy_licence_check failed." << std::endl; | |
95 | +// return AUTHOR_ERROR; | |
96 | +// } | |
97 | +// #endif | |
98 | 98 | set_default_logger(LogLevel(vptParam.log_level), "multi_source_process", vptParam.log_path, vptParam.log_mem, vptParam.log_mem); |
99 | 99 | LOG_INFO("编译时间:{} {}", __DATE__, __TIME__); |
100 | 100 | |
... | ... | @@ -324,7 +324,8 @@ bool CMultiSourceProcess::AddTask(task_param _cur_task_param){ |
324 | 324 | config.cfg.force_tcp = true; // rtsp用tcp |
325 | 325 | config.cfg.gpuid = to_string(m_devId); |
326 | 326 | config.cfg.skip_frame = skip_frame_; |
327 | - | |
327 | + config.cfg.resize = true; | |
328 | + | |
328 | 329 | if (1 == _cur_task_param.dec_type){ |
329 | 330 | config.cfg.port = _cur_task_param.port; |
330 | 331 | config.dec_type = DECODER_TYPE_GB28181; |
... | ... | @@ -360,7 +361,7 @@ bool CMultiSourceProcess::AddTask(task_param _cur_task_param){ |
360 | 361 | |
361 | 362 | int input_image_width = 0; |
362 | 363 | int input_image_height = 0; |
363 | - pDecManager->getResolution(config.name, input_image_width, input_image_height); | |
364 | + pDecManager->getOutResolution(config.name, input_image_width, input_image_height); | |
364 | 365 | LOG_INFO("task_id: {} width: {} height:{}", task_id, input_image_width, input_image_height); |
365 | 366 | |
366 | 367 | // 所有参数都准备好之后再启动解码 |
... | ... | @@ -761,21 +762,21 @@ int CMultiSourceProcess::algorthim_process_thread(){ |
761 | 762 | ACL_CALL(aclrtCreateContext(&ctx, m_devId), ACL_SUCCESS, 1); |
762 | 763 | |
763 | 764 | while (true){ |
764 | -#ifdef USE_VILLAGE | |
765 | - if (!CheckTime()) { //时间限制 | |
766 | - LOG_FATAL("authority failed!"); | |
767 | - break; | |
768 | - } | |
769 | -#else | |
770 | - if (check_label == -1) { //机器授权 | |
771 | - LOG_FATAL("authority failed!"); | |
772 | - break; | |
773 | - } | |
774 | - if (!UpdateLabel()) { | |
775 | - LOG_FATAL("authority failed!"); | |
776 | - break; | |
777 | - } | |
778 | -#endif | |
765 | +// #ifdef USE_VILLAGE | |
766 | +// if (!CheckTime()) { //时间限制 | |
767 | +// LOG_FATAL("authority failed!"); | |
768 | +// break; | |
769 | +// } | |
770 | +// #else | |
771 | +// if (check_label == -1) { //机器授权 | |
772 | +// LOG_FATAL("authority failed!"); | |
773 | +// break; | |
774 | +// } | |
775 | +// if (!UpdateLabel()) { | |
776 | +// LOG_FATAL("authority failed!"); | |
777 | +// break; | |
778 | +// } | |
779 | +// #endif | |
779 | 780 | if(m_bfinish){ |
780 | 781 | break; |
781 | 782 | } | ... | ... |
src/decoder/dvpp/DvppDataMemory.hpp
1 | +#ifndef __DVPP_DATA_MEMORY_HPP__ | |
2 | +#define __DVPP_DATA_MEMORY_HPP__ | |
3 | + | |
1 | 4 | #include<string> |
2 | 5 | |
3 | 6 | #include "depend_headers.h" |
... | ... | @@ -66,11 +69,11 @@ public: |
66 | 69 | } |
67 | 70 | pHwRgb = nullptr; |
68 | 71 | } |
69 | - | |
70 | - | |
71 | - | |
72 | 72 | } |
73 | 73 | |
74 | 74 | public: |
75 | 75 | int data_type; // 0: rgb , 1: NV12 |
76 | -}; | |
77 | 76 | \ No newline at end of file |
77 | +}; | |
78 | + | |
79 | + | |
80 | +#endif // __DVPP_DATA_MEMORY_HPP__ | |
78 | 81 | \ No newline at end of file | ... | ... |
src/decoder/dvpp/DvppDecoder.cpp
... | ... | @@ -184,6 +184,9 @@ AVCodecContext* DvppDecoder::init_FFmpeg(FFDecConfig config){ |
184 | 184 | frame_height = codecpar->height; |
185 | 185 | pix_fmt = (AVPixelFormat)codecpar->format; |
186 | 186 | |
187 | + m_bResize = config.resize; | |
188 | + calcOutResolution(frame_width, frame_height); | |
189 | + | |
187 | 190 | if (stream->avg_frame_rate.den) { |
188 | 191 | m_fps = av_q2d(stream ->avg_frame_rate); |
189 | 192 | } else { |
... | ... | @@ -197,7 +200,7 @@ AVCodecContext* DvppDecoder::init_FFmpeg(FFDecConfig config){ |
197 | 200 | } |
198 | 201 | #endif |
199 | 202 | |
200 | - LOG_INFO("[{}]- init ffmpeg success! input:{} frame_width:{} frame_height:{} fps:{} ", m_dec_name, input_file, frame_width, frame_height, m_fps); | |
203 | + LOG_INFO("[{}]- init ffmpeg success! input:{} src:({}, {}) out:({}, {}) fps:{} ", m_dec_name, input_file, frame_width, frame_height, out_frame_width, out_frame_height, m_fps); | |
201 | 204 | |
202 | 205 | return avctx; |
203 | 206 | }while(0); |
... | ... | @@ -209,6 +212,33 @@ AVCodecContext* DvppDecoder::init_FFmpeg(FFDecConfig config){ |
209 | 212 | return nullptr; |
210 | 213 | } |
211 | 214 | |
215 | +void DvppDecoder::calcOutResolution(int width, int height) { | |
216 | + if(m_bResize) { | |
217 | + float srcRatio = width / (float)height; | |
218 | + float stdRatio = 1920.0 / 1080.0f ; | |
219 | + int outWidth = 1920; | |
220 | + int outHeight = 1080; | |
221 | + if (srcRatio > stdRatio) { | |
222 | + outHeight = static_cast<int>(outWidth * (float)height / width) ; | |
223 | + if (outHeight % 2 == 1) { | |
224 | + outHeight += 1; | |
225 | + } | |
226 | + } else if (srcRatio < stdRatio) { | |
227 | + outWidth = static_cast<int>(outHeight * (float)width / height) ; | |
228 | + if (outWidth % 2 == 1) { | |
229 | + outWidth += 1; | |
230 | + } | |
231 | + } | |
232 | + | |
233 | + out_frame_width = outWidth; | |
234 | + out_frame_height = outHeight; | |
235 | + } else { | |
236 | + out_frame_width = width; | |
237 | + out_frame_height = height; | |
238 | + } | |
239 | + | |
240 | +} | |
241 | + | |
212 | 242 | int DvppDecoder::getVdecType(int videoType, int profile) |
213 | 243 | { |
214 | 244 | int streamFormat = H264_MAIN_LEVEL; |
... | ... | @@ -277,6 +307,9 @@ int DvppDecoder::getVdecType(int videoType, int profile) |
277 | 307 | LOG_ERROR("[{}]-该设备channel已经用完了!", m_dec_name); |
278 | 308 | return false; |
279 | 309 | } |
310 | + | |
311 | + m_vpcUtils.init(m_dvpp_deviceId); | |
312 | + | |
280 | 313 | m_vdec_out_size = frame_width * frame_height * 3 / 2; |
281 | 314 | |
282 | 315 | LOG_INFO("[{}]- init vdpp success! device:{} channel:{}", m_dec_name, m_dvpp_deviceId, m_dvpp_channel); |
... | ... | @@ -353,6 +386,12 @@ bool DvppDecoder::getResolution(int &width, int &height){ |
353 | 386 | return true; |
354 | 387 | } |
355 | 388 | |
389 | +bool DvppDecoder::getOutResolution( int &width, int &height ) { | |
390 | + width = out_frame_width; | |
391 | + height = out_frame_height; | |
392 | + return true; | |
393 | +} | |
394 | + | |
356 | 395 | float DvppDecoder::fps(){ |
357 | 396 | return m_fps; |
358 | 397 | } |
... | ... | @@ -532,11 +571,6 @@ void DvppDecoder::read_thread() { |
532 | 571 | #endif |
533 | 572 | nSended = sendPkt(vdecChannelDesc, pkt, frame_nb); |
534 | 573 | |
535 | - if(!m_bReal && frame_nb > 20 && m_avg_decode_time > 0) | |
536 | - { | |
537 | - // 针对文件,根据解码时间做延时,避免占用过多显存 | |
538 | - std::this_thread::sleep_for(std::chrono::milliseconds(10)); | |
539 | - } | |
540 | 574 | } |
541 | 575 | |
542 | 576 | if(nSended < 0) { |
... | ... | @@ -767,12 +801,43 @@ void DvppDecoder::doVdppVdecCallBack(acldvppStreamDesc *input, acldvppPicDesc *o |
767 | 801 | // last_ts = get_cur_time_ms(); |
768 | 802 | |
769 | 803 | // 换成解码后数据, 这里这样做的是为了保证解码一直持续进行,避免后续操作阻碍文件读取和解码从而导致花屏 |
770 | - DvppDataMemory* mem = new DvppDataMemory(width, width_stride, height, height_stride, outputSize, m_dec_name, to_string(m_dvpp_deviceId), false, frame_nb, (unsigned char *)outputDataDev); | |
804 | + DvppDataMemory* mem = nullptr; | |
805 | + if (m_bResize && (width > 1920 || height > 1080)) { | |
806 | + float srcRatio = width / (float)height; | |
807 | + float stdRatio = 1920.0 / 1080.0f ; | |
808 | + int outWidth = 1920; | |
809 | + int outHeight = 1080; | |
810 | + if (srcRatio > stdRatio) { | |
811 | + outHeight = static_cast<int>(outWidth * (float)height / width) ; | |
812 | + if (outHeight % 2 == 1) | |
813 | + { | |
814 | + outHeight += 1; | |
815 | + } | |
816 | + } else if (srcRatio < stdRatio) { | |
817 | + outWidth = static_cast<int>(outHeight * (float)width / height) ; | |
818 | + if (outWidth % 2 == 1) | |
819 | + { | |
820 | + outWidth += 1; | |
821 | + } | |
822 | + } | |
823 | + | |
824 | + mem = m_vpcUtils.resize(output, outWidth, outHeight); | |
825 | + if (mem) { | |
826 | + acldvppFree(outputDataDev); | |
827 | + outputDataDev = nullptr; | |
828 | + | |
829 | + mem->setDeviceId(to_string(m_dvpp_deviceId)); | |
830 | + mem->setId(m_dec_name); | |
831 | + mem->setFrameNb(frame_nb); | |
832 | + } | |
833 | + } else { | |
834 | + mem = new DvppDataMemory(width, width_stride, height, height_stride, outputSize, m_dec_name, to_string(m_dvpp_deviceId), false, frame_nb, (unsigned char *)outputDataDev); | |
835 | + } | |
836 | + | |
771 | 837 | if(mem){ |
772 | 838 | m_decoded_data_queue.push(mem); |
773 | 839 | bCached = true; |
774 | 840 | } |
775 | - | |
776 | 841 | } |
777 | 842 | |
778 | 843 | if(!bCached) { | ... | ... |
src/decoder/dvpp/DvppDecoder.h
... | ... | @@ -12,6 +12,8 @@ |
12 | 12 | |
13 | 13 | #include "FFRecoderTaskManager.h" |
14 | 14 | |
15 | +#include "VpcUtils.h" | |
16 | + | |
15 | 17 | using namespace std; |
16 | 18 | |
17 | 19 | typedef void(*RECEIVER_FINISHED_CALLBACK)(const void* userPtr); |
... | ... | @@ -35,6 +37,7 @@ public: |
35 | 37 | bool isFinished(); |
36 | 38 | bool isPausing(); |
37 | 39 | bool getResolution( int &width, int &height ); |
40 | + bool getOutResolution( int &width, int &height ); | |
38 | 41 | |
39 | 42 | bool isSurport(FFDecConfig& cfg); |
40 | 43 | |
... | ... | @@ -77,6 +80,8 @@ private: |
77 | 80 | |
78 | 81 | int getVdecType(int videoType, int profile); |
79 | 82 | |
83 | + void calcOutResolution(int w, int h); | |
84 | + | |
80 | 85 | private: |
81 | 86 | FFDecConfig m_cfg; |
82 | 87 | string m_dec_name; |
... | ... | @@ -100,12 +105,15 @@ private: |
100 | 105 | |
101 | 106 | int frame_width{0}; |
102 | 107 | int frame_height{0}; |
108 | + int out_frame_width{0}; | |
109 | + int out_frame_height{0}; | |
103 | 110 | bool m_bReal {false}; // 是否实时流 |
104 | 111 | float m_fps{0.0}; |
105 | 112 | |
106 | 113 | std::thread* m_read_thread{nullptr}; |
107 | 114 | |
108 | 115 | bool m_dec_keyframe {false}; |
116 | + bool m_bResize {false}; | |
109 | 117 | |
110 | 118 | // 解码 |
111 | 119 | int m_dvpp_deviceId {-1}; |
... | ... | @@ -129,4 +137,6 @@ private: |
129 | 137 | uint64_t m_out_count {0}; |
130 | 138 | |
131 | 139 | std::atomic<int> m_DvppCacheCounter{0}; |
140 | + | |
141 | + VpcUtils m_vpcUtils; | |
132 | 142 | }; |
133 | 143 | \ No newline at end of file | ... | ... |
src/decoder/dvpp/DvppDecoderApi.cpp
... | ... | @@ -79,6 +79,13 @@ bool DvppDecoderApi::getResolution(int &width, int &height){ |
79 | 79 | return false; |
80 | 80 | } |
81 | 81 | |
82 | +bool DvppDecoderApi::getOutResolution(int &width, int &height){ | |
83 | + if(m_pDecoder != nullptr){ | |
84 | + return m_pDecoder->getOutResolution(width, height); | |
85 | + } | |
86 | + return false; | |
87 | +} | |
88 | + | |
82 | 89 | bool DvppDecoderApi::isSurport(FFDecConfig& cfg){ |
83 | 90 | if(m_pDecoder != nullptr){ |
84 | 91 | return m_pDecoder->isSurport(cfg); | ... | ... |
src/decoder/dvpp/DvppDecoderApi.h
src/decoder/dvpp/VpcPicConverter.cpp renamed to src/decoder/dvpp/VpcUtils.cpp
1 | -#include "VpcPicConverter.h" | |
1 | +#include "VpcUtils.h" | |
2 | 2 | #include "depend_headers.h" |
3 | 3 | |
4 | 4 | #define ALIGN_UP(val, align) (((val) % (align) == 0) ? (val) : (((val) / (align) + 1) * (align))) |
... | ... | @@ -12,17 +12,29 @@ |
12 | 12 | #define CHECK_AND_BREAK(ret, message) \ |
13 | 13 | if(ret != 0) {LOG_ERROR("{}", message); break;} |
14 | 14 | |
15 | -VpcPicConverter::VpcPicConverter(){ | |
15 | +VpcUtils::VpcUtils(){ | |
16 | 16 | |
17 | 17 | } |
18 | 18 | |
19 | -VpcPicConverter::~VpcPicConverter(){ | |
20 | - if(nullptr == stream_){ | |
19 | +VpcUtils::~VpcUtils(){ | |
20 | + if(nullptr != stream_){ | |
21 | 21 | aclrtDestroyStream(stream_); |
22 | 22 | } |
23 | + | |
24 | + if(context_){ | |
25 | + aclrtDestroyContext(context_); | |
26 | + } | |
27 | + | |
28 | + if (dvppChannelDesc_) { | |
29 | + (void)acldvppDestroyChannel(dvppChannelDesc_); | |
30 | + (void)acldvppDestroyChannelDesc(dvppChannelDesc_); | |
31 | + dvppChannelDesc_ = nullptr; | |
32 | + } | |
23 | 33 | } |
24 | 34 | |
25 | -int VpcPicConverter::init(){ | |
35 | +int VpcUtils::init(int devId){ | |
36 | + | |
37 | + m_devId = devId; | |
26 | 38 | |
27 | 39 | aclrtSetDevice(m_devId); |
28 | 40 | aclrtCreateContext(&context_, m_devId); |
... | ... | @@ -45,7 +57,7 @@ int VpcPicConverter::init(){ |
45 | 57 | return ret; |
46 | 58 | } |
47 | 59 | |
48 | -DvppDataMemory* VpcPicConverter::convert2bgr(acldvppPicDesc *inputDesc_, int out_width, int out_height, bool key_frame){ | |
60 | +DvppDataMemory* VpcUtils::convert2bgr(acldvppPicDesc *inputDesc_, int out_width, int out_height, bool key_frame){ | |
49 | 61 | |
50 | 62 | aclrtSetDevice(m_devId); |
51 | 63 | aclrtSetCurrentContext(context_); |
... | ... | @@ -91,7 +103,7 @@ DvppDataMemory* VpcPicConverter::convert2bgr(acldvppPicDesc *inputDesc_, int out |
91 | 103 | return rgbMem; |
92 | 104 | } |
93 | 105 | |
94 | -DvppDataMemory* VpcPicConverter::convert2bgr(DvppDataMemory* inMem){ | |
106 | +DvppDataMemory* VpcUtils::convert2bgr(DvppDataMemory* inMem){ | |
95 | 107 | |
96 | 108 | aclrtSetDevice(m_devId); |
97 | 109 | aclrtSetCurrentContext(context_); |
... | ... | @@ -149,4 +161,53 @@ DvppDataMemory* VpcPicConverter::convert2bgr(DvppDataMemory* inMem){ |
149 | 161 | } |
150 | 162 | |
151 | 163 | return rgbMem; |
164 | +} | |
165 | + | |
166 | +DvppDataMemory* VpcUtils::resize(acldvppPicDesc *inputDesc_, int out_width, int out_height){ | |
167 | + | |
168 | + aclrtSetDevice(m_devId); | |
169 | + aclrtSetCurrentContext(context_); | |
170 | + | |
171 | + int out_buf_width = ALIGN_UP(out_width, 16); | |
172 | + int out_buf_height = ALIGN_UP(out_height, 2); | |
173 | + int out_buf_size = out_buf_width * out_buf_height * 3 / 2; | |
174 | + | |
175 | + DvppDataMemory* rgbMem = new DvppDataMemory(1, out_width, out_buf_width, out_height, out_buf_height, out_buf_size, "", "", false, 0); | |
176 | + void *outBufferDev_ = (void*)rgbMem->getMem(); | |
177 | + | |
178 | + acldvppPicDesc *outputDesc_= acldvppCreatePicDesc(); | |
179 | + acldvppSetPicDescData(outputDesc_, outBufferDev_); | |
180 | + acldvppSetPicDescFormat(outputDesc_, acldvppGetPicDescFormat(inputDesc_)); | |
181 | + acldvppSetPicDescWidth(outputDesc_, out_width); | |
182 | + acldvppSetPicDescHeight(outputDesc_, out_height); | |
183 | + acldvppSetPicDescWidthStride(outputDesc_, out_buf_width); | |
184 | + acldvppSetPicDescHeightStride(outputDesc_, out_buf_height); | |
185 | + acldvppSetPicDescSize(outputDesc_, out_buf_size); | |
186 | + | |
187 | + acldvppResizeConfig *resizeConfig_ = acldvppCreateResizeConfig(); | |
188 | + | |
189 | + aclError ret = ACL_ERROR_NONE; | |
190 | + do{ | |
191 | + // 9. 执行异步色域转换,再调用aclrtSynchronizeStream接口阻塞程序运行,直到指定Stream中的所有任务都完成 | |
192 | + ret = acldvppVpcResizeAsync(dvppChannelDesc_, inputDesc_, outputDesc_, resizeConfig_, stream_); | |
193 | + if(ret != ACL_ERROR_NONE){ | |
194 | + LOG_ERROR("acldvppVpcResizeAsync failed - out_width:{} out_height:{} out_buf_width:{} out_buf_height:{} out_buf_size:{}", out_width, out_height, out_buf_width, out_buf_height, out_buf_size); | |
195 | + break; | |
196 | + } | |
197 | + ret = aclrtSynchronizeStream(stream_); | |
198 | + if(ret != ACL_ERROR_NONE){ | |
199 | + LOG_ERROR("aclrtSynchronizeStream failed - out_width:{} out_height:{} out_buf_width:{} out_buf_height:{} out_buf_size:{}", out_width, out_height, out_buf_width, out_buf_height, out_buf_size); | |
200 | + break; | |
201 | + } | |
202 | + }while(0); | |
203 | + | |
204 | + acldvppDestroyResizeConfig(resizeConfig_); | |
205 | + acldvppDestroyPicDesc(outputDesc_); | |
206 | + | |
207 | + if(ret != ACL_ERROR_NONE){ | |
208 | + delete rgbMem; | |
209 | + rgbMem = nullptr; | |
210 | + } | |
211 | + | |
212 | + return rgbMem; | |
152 | 213 | } |
153 | 214 | \ No newline at end of file | ... | ... |
src/decoder/dvpp/VpcPicConverter.h renamed to src/decoder/dvpp/VpcUtils.h
... | ... | @@ -3,15 +3,17 @@ |
3 | 3 | #include "DvppDataMemory.hpp" |
4 | 4 | |
5 | 5 | |
6 | -class VpcPicConverter{ | |
6 | +class VpcUtils{ | |
7 | 7 | public: |
8 | - VpcPicConverter(); | |
9 | - ~VpcPicConverter(); | |
10 | - int init(); | |
8 | + VpcUtils(); | |
9 | + ~VpcUtils(); | |
10 | + int init(int); | |
11 | 11 | |
12 | 12 | DvppDataMemory* convert2bgr(acldvppPicDesc *input, int out_width, int out_height, bool key_frame); |
13 | 13 | DvppDataMemory* convert2bgr(DvppDataMemory* inMem); |
14 | 14 | |
15 | + DvppDataMemory* resize(acldvppPicDesc *inputDesc_, int out_width, int out_height); | |
16 | + | |
15 | 17 | private: |
16 | 18 | aclrtContext context_; |
17 | 19 | aclrtStream stream_; | ... | ... |
src/decoder/dvpp/dvpp_headers.h
src/decoder/interface/AbstractDecoder.h
... | ... | @@ -18,12 +18,13 @@ public: |
18 | 18 | virtual void pause() = 0; |
19 | 19 | virtual void resume() = 0; |
20 | 20 | |
21 | - virtual void setDecKeyframe(bool bKeyframe) = 0; | |
21 | + virtual void setDecKeyframe(bool ) = 0; | |
22 | 22 | |
23 | 23 | virtual bool isRunning() = 0; |
24 | 24 | virtual bool isFinished() = 0; |
25 | 25 | virtual bool isPausing() = 0; |
26 | 26 | virtual bool getResolution( int &width, int &height ) = 0; |
27 | + virtual bool getOutResolution( int &width, int &height ) = 0; | |
27 | 28 | |
28 | 29 | virtual bool isSurport(FFDecConfig& cfg) = 0; |
29 | 30 | ... | ... |
src/decoder/interface/DecoderManager.cpp
... | ... | @@ -429,6 +429,27 @@ bool DecoderManager::getResolution(const string name, int &width, int &height) |
429 | 429 | return false; |
430 | 430 | } |
431 | 431 | |
432 | +bool DecoderManager::getOutResolution(const string name, int &width, int &height) | |
433 | +{ | |
434 | + if (name.empty()) | |
435 | + { | |
436 | + LOG_ERROR("name 为空!"); | |
437 | + return false; | |
438 | + } | |
439 | + | |
440 | + std::lock_guard<std::mutex> l(m_mutex); | |
441 | + | |
442 | + auto dec = decoderMap.find(name); | |
443 | + if (dec != decoderMap.end()) | |
444 | + { | |
445 | + dec->second->getOutResolution(width, height); | |
446 | + return true; | |
447 | + } | |
448 | + | |
449 | + LOG_ERROR("没有找到name为{}的解码器",name); | |
450 | + return false; | |
451 | +} | |
452 | + | |
432 | 453 | vector<string> DecoderManager::getAllDecodeName(){ |
433 | 454 | |
434 | 455 | closeAllFinishedDecoder(); | ... | ... |
src/decoder/interface/DecoderManager.h
... | ... | @@ -218,6 +218,8 @@ public: |
218 | 218 | **************************************************/ |
219 | 219 | bool getResolution(const string name, int &width, int &height); |
220 | 220 | |
221 | + bool getOutResolution(const string name, int &width, int &height); | |
222 | + | |
221 | 223 | /************************************************** |
222 | 224 | * 接口:getAllDecodeName |
223 | 225 | * 功能:获取全部解码器名称 | ... | ... |
src/decoder/interface/DeviceMemory.hpp
... | ... | @@ -30,6 +30,10 @@ public: |
30 | 30 | int getSize() { |
31 | 31 | return data_size; |
32 | 32 | } |
33 | + | |
34 | + void setSize(int size) { | |
35 | + data_size = size; | |
36 | + } | |
33 | 37 | |
34 | 38 | bool isIsused() { |
35 | 39 | return isused; |
... | ... | @@ -45,46 +49,90 @@ public: |
45 | 49 | return id; |
46 | 50 | } |
47 | 51 | |
52 | + void setId(string _id) { | |
53 | + id = _id; | |
54 | + } | |
55 | + | |
48 | 56 | string getDeviceId() { |
49 | 57 | return device_id; |
50 | 58 | } |
51 | 59 | |
60 | + void setDeviceId(string _device_id) { | |
61 | + device_id = _device_id; | |
62 | + } | |
63 | + | |
52 | 64 | unsigned char* getMem(){ |
53 | 65 | return pHwRgb; |
54 | 66 | } |
55 | 67 | |
68 | + void setMem(unsigned char* _pHwRgb) { | |
69 | + pHwRgb = _pHwRgb; | |
70 | + } | |
71 | + | |
56 | 72 | long long getTimesstamp(){ |
57 | 73 | return timestamp; |
58 | 74 | } |
59 | 75 | |
76 | + void setTimesstamp(long long _timestamp) { | |
77 | + timestamp = _timestamp; | |
78 | + } | |
79 | + | |
60 | 80 | int getWidth(){ |
61 | 81 | return width; |
62 | 82 | } |
63 | 83 | |
84 | + void setWidth(int _width) { | |
85 | + width = _width; | |
86 | + } | |
87 | + | |
64 | 88 | int getWidthStride(){ |
65 | 89 | return width_stride; |
66 | 90 | } |
67 | 91 | |
92 | + void setWidthStride(int _width_stride) { | |
93 | + width_stride = _width_stride; | |
94 | + } | |
95 | + | |
68 | 96 | int getHeight(){ |
69 | 97 | return height; |
70 | 98 | } |
71 | 99 | |
100 | + void setHeight(int _height) { | |
101 | + height = _height; | |
102 | + } | |
103 | + | |
72 | 104 | int getHeightStride(){ |
73 | 105 | return height_stride; |
74 | 106 | } |
75 | 107 | |
108 | + void setHeightStride(int _height_stride) { | |
109 | + height_stride = _height_stride; | |
110 | + } | |
111 | + | |
76 | 112 | int getChannel(){ |
77 | 113 | return channel; |
78 | 114 | } |
79 | 115 | |
116 | + void setChannel(int _channel) { | |
117 | + channel = _channel; | |
118 | + } | |
119 | + | |
80 | 120 | bool isKeyFrame(){ |
81 | 121 | return key_frame; |
82 | 122 | } |
83 | 123 | |
124 | + void setKeyFrame(bool _key_frame) { | |
125 | + key_frame = _key_frame; | |
126 | + } | |
127 | + | |
84 | 128 | unsigned long long getFrameNb() { |
85 | 129 | return frame_nb; |
86 | 130 | } |
87 | 131 | |
132 | + void setFrameNb(unsigned long long _frame_nb) { | |
133 | + frame_nb = _frame_nb; | |
134 | + } | |
135 | + | |
88 | 136 | public: |
89 | 137 | int data_size; |
90 | 138 | bool isused; | ... | ... |
src/decoder/interface/interface_headers.h
... | ... | @@ -35,6 +35,7 @@ struct FFDecConfig{ |
35 | 35 | bool force_tcp{true}; // 是否指定使用tcp连接 |
36 | 36 | int skip_frame{1}; // 跳帧数 |
37 | 37 | string dec_name; |
38 | + bool resize{false}; // 是否resize到1920,1080 | |
38 | 39 | |
39 | 40 | int port; // gb28181接收数据的端口号 |
40 | 41 | DECODE_REQUEST_STREAM_CALLBACK request_stream_cbk; // gb28181请求流 | ... | ... |
src/demo/demo.cpp
... | ... | @@ -998,6 +998,9 @@ string createTask(void *handle, std::vector<algorithm_type_t> algor_vec, int gi, |
998 | 998 | // FFmpeg生成的解码错误数据流 |
999 | 999 | tparam.ipc_url = "rtsp://192.168.10.4:8554/street"; |
1000 | 1000 | break; |
1001 | + case 27: | |
1002 | + tparam.ipc_url = "/data/share/data/Street_4k_265.mp4"; | |
1003 | + break; | |
1001 | 1004 | default: |
1002 | 1005 | tparam.ipc_url = "/opt/share/data/Street.uvf"; |
1003 | 1006 | break; |
... | ... | @@ -1123,26 +1126,31 @@ void test_gpu(int gpuID){ |
1123 | 1126 | algorithm_type_t::VEHICLE_SOLIDLINETURNAROUND}; |
1124 | 1127 | |
1125 | 1128 | |
1126 | - int repeat_num = 1000; | |
1127 | - createTask(handle, algor_vec2, 0, false); | |
1128 | - createTask(handle, algor_vec2, 2, false); | |
1129 | - while(repeat_num--) { | |
1130 | - printf("============================:%d\n",repeat_num); | |
1131 | - vector<string> task_ids; | |
1132 | - for (int i = 4; i < 10; i ++) { | |
1133 | - string task_id = createTask(handle, algor_vec2, i, false); | |
1134 | - task_ids.push_back(task_id); | |
1135 | - } | |
1129 | + // int repeat_num = 1000; | |
1130 | + // createTask(handle, algor_vec2, 0, false); | |
1131 | + // createTask(handle, algor_vec2, 2, false); | |
1132 | + // while(repeat_num--) { | |
1133 | + // printf("============================:%d\n",repeat_num); | |
1134 | + // vector<string> task_ids; | |
1135 | + // for (int i = 4; i < 10; i ++) { | |
1136 | + // string task_id = createTask(handle, algor_vec2, i, false); | |
1137 | + // task_ids.push_back(task_id); | |
1138 | + // } | |
1136 | 1139 | |
1137 | - // test_snapshot(handle); | |
1138 | - sleep(60); //60s | |
1139 | - close_all_task(handle); | |
1140 | - for (auto& task_id : task_ids) { | |
1141 | - finish_task(handle, (char*)task_id.data(), 0); | |
1142 | - sleep(5); | |
1143 | - } | |
1140 | + // // test_snapshot(handle); | |
1141 | + // sleep(60); //60s | |
1142 | + // close_all_task(handle); | |
1143 | + // for (auto& task_id : task_ids) { | |
1144 | + // finish_task(handle, (char*)task_id.data(), 0); | |
1145 | + // sleep(5); | |
1146 | + // } | |
1144 | 1147 | |
1145 | - } | |
1148 | + // } | |
1149 | + | |
1150 | + createTask(handle, algor_vec2, 8, false); | |
1151 | + createTask(handle, algor_vec2, 27, false); | |
1152 | + | |
1153 | + while (getchar() != 'q'); | |
1146 | 1154 | |
1147 | 1155 | /* |
1148 | 1156 | char ch = 'a'; | ... | ... |