Blame view

src/demo/main_nvdec.cpp1 14 KB
00b0fbdb   Hu Chunming   编译nvdec
1
2
  #include "FFNvDecoderManager.h"
  #include <iostream>
63e6f7bc   Hu Chunming   完成dvpp。但是nv和gb281...
3
  
5686354a   Hu Chunming   初步编译成功cuvid部分的
4
5
  // #include "cuda_kernels.h"
  // #include "NvJpegEncoder.h"
63e6f7bc   Hu Chunming   完成dvpp。但是nv和gb281...
6
  
00b0fbdb   Hu Chunming   编译nvdec
7
8
  #include <pthread.h>
  #include <thread>
63e6f7bc   Hu Chunming   完成dvpp。但是nv和gb281...
9
  
00b0fbdb   Hu Chunming   编译nvdec
10
  #include <chrono>
63e6f7bc   Hu Chunming   完成dvpp。但是nv和gb281...
11
  
00b0fbdb   Hu Chunming   编译nvdec
12
  #include <unistd.h>
63e6f7bc   Hu Chunming   完成dvpp。但是nv和gb281...
13
14
  
  
00b0fbdb   Hu Chunming   编译nvdec
15
16
17
18
  #ifdef _WIN32
  #include "Winsock2.h"
  #pragma comment(lib, "ws2_32.lib")
  #endif
63e6f7bc   Hu Chunming   完成dvpp。但是nv和gb281...
19
  
00b0fbdb   Hu Chunming   编译nvdec
20
21
22
  #ifdef __linux__
  #include "arpa/inet.h"
  #endif
63e6f7bc   Hu Chunming   完成dvpp。但是nv和gb281...
23
  
00b0fbdb   Hu Chunming   编译nvdec
24
  #include "utiltools.hpp"
63e6f7bc   Hu Chunming   完成dvpp。但是nv和gb281...
25
  
00b0fbdb   Hu Chunming   编译nvdec
26
27
  #define MIN_RTP_PORT		10000
  #define MAX_RTP_PORT		60000
63e6f7bc   Hu Chunming   完成dvpp。但是nv和gb281...
28
  
00b0fbdb   Hu Chunming   编译nvdec
29
30
  // ȡ MIN_RTP_PORT(10000)~MAX_RTP_PORT(60000)֮�������˿�(ż���������������˿ڿ���)
  int allocRtpPort() {
63e6f7bc   Hu Chunming   完成dvpp。但是nv和gb281...
31
  
00b0fbdb   Hu Chunming   编译nvdec
32
33
34
35
36
37
  	static int s_rtpPort = MIN_RTP_PORT;
  	if (MIN_RTP_PORT == s_rtpPort)
  	{
  		srand((unsigned int)time(NULL));
  		s_rtpPort = MIN_RTP_PORT + (rand() % MIN_RTP_PORT);
  	}
63e6f7bc   Hu Chunming   完成dvpp。但是nv和gb281...
38
  
00b0fbdb   Hu Chunming   编译nvdec
39
40
  	if (s_rtpPort % 2)
  		++s_rtpPort;
63e6f7bc   Hu Chunming   完成dvpp。但是nv和gb281...
41
  
00b0fbdb   Hu Chunming   编译nvdec
42
43
44
45
  	while (true)
  	{
  		s_rtpPort += 2;
  		s_rtpPort = s_rtpPort >= MAX_RTP_PORT ? MIN_RTP_PORT : s_rtpPort;
63e6f7bc   Hu Chunming   完成dvpp。但是nv和gb281...
46
  
00b0fbdb   Hu Chunming   编译nvdec
47
48
49
50
51
  		int i = 0;
  		for (; i < 2; i++)
  		{
  			sockaddr_in sRecvAddr;
  			int s = socket(AF_INET, SOCK_DGRAM, 0);
63e6f7bc   Hu Chunming   完成dvpp。但是nv和gb281...
52
  
00b0fbdb   Hu Chunming   编译nvdec
53
54
55
  			sRecvAddr.sin_family = AF_INET;        
  			sRecvAddr.sin_addr.s_addr = htonl(INADDR_ANY);    
  			sRecvAddr.sin_port = htons(s_rtpPort + i); 
63e6f7bc   Hu Chunming   完成dvpp。但是nv和gb281...
56
  
00b0fbdb   Hu Chunming   编译nvdec
57
58
59
60
61
  			int nResult = bind(s, (sockaddr *)&sRecvAddr, sizeof(sRecvAddr));
  			if (nResult != 0)
  			{
  				break;
  			}
63e6f7bc   Hu Chunming   完成dvpp。但是nv和gb281...
62
  
00b0fbdb   Hu Chunming   编译nvdec
63
64
65
66
67
68
69
  			nResult = close(s);
  			if (nResult != 0)
  			{
  				printf("closesocket failed:%d\n", nResult);
  				break;
  			}
  		}
63e6f7bc   Hu Chunming   完成dvpp。但是nv和gb281...
70
  
00b0fbdb   Hu Chunming   编译nvdec
71
72
73
  		if (i == 2)
  			break;
  	}
63e6f7bc   Hu Chunming   完成dvpp。但是nv和gb281...
74
  
00b0fbdb   Hu Chunming   编译nvdec
75
76
  	return s_rtpPort;
  }
63e6f7bc   Hu Chunming   完成dvpp。但是nv和gb281...
77
78
79
80
81
  
  
  
  
  
00b0fbdb   Hu Chunming   编译nvdec
82
  unsigned char *pHwRgb[2] = {nullptr, nullptr};
63e6f7bc   Hu Chunming   完成dvpp。但是nv和gb281...
83
  
00b0fbdb   Hu Chunming   编译nvdec
84
85
  int sum1 = 0;
  int sum2 = 0;
63e6f7bc   Hu Chunming   完成dvpp。但是nv和gb281...
86
  
5686354a   Hu Chunming   初步编译成功cuvid部分的
87
  // cudaStream_t stream[2];
63e6f7bc   Hu Chunming   完成dvpp。但是nv和gb281...
88
  
00b0fbdb   Hu Chunming   编译nvdec
89
  string data_home = "/mnt/data/cmhu/tmp/";
63e6f7bc   Hu Chunming   完成dvpp。但是nv和gb281...
90
91
  
  
5686354a   Hu Chunming   初步编译成功cuvid部分的
92
93
94
95
  // #define checkCudaErrors(S) do {CUresult  status; \
  //         status = S; \
  //         if (status != CUDA_SUCCESS ) std::cout << __LINE__ <<" checkCudaErrors - status = " << status << std::endl; \
  //         } while (false)
63e6f7bc   Hu Chunming   完成dvpp。但是nv和gb281...
96
97
  
  
5686354a   Hu Chunming   初步编译成功cuvid部分的
98
99
100
  // static void gpu_helper(int gpuid)
  // {
  //     cudaSetDevice(gpuid);
63e6f7bc   Hu Chunming   完成dvpp。但是nv和gb281...
101
  
5686354a   Hu Chunming   初步编译成功cuvid部分的
102
103
  //     // int *dn;
  //     // cudaMalloc((void **)&dn, 1 * sizeof(int));
63e6f7bc   Hu Chunming   完成dvpp。但是nv和gb281...
104
  
5686354a   Hu Chunming   初步编译成功cuvid部分的
105
106
  // 	size_t free_byte;
  // 	size_t total_byte;
63e6f7bc   Hu Chunming   完成dvpp。但是nv和gb281...
107
  
5686354a   Hu Chunming   初步编译成功cuvid部分的
108
  // 	CUresult cuda_status = cuMemGetInfo(&free_byte, &total_byte);
63e6f7bc   Hu Chunming   完成dvpp。但是nv和gb281...
109
  
5686354a   Hu Chunming   初步编译成功cuvid部分的
110
111
112
113
114
115
  // 	const char *pStr = nullptr;
  // 	if (CUDA_SUCCESS != cuda_status) {
  // 		cuGetErrorString(cuda_status, &pStr);
  // 		printf("Error: cudaMemGetInfo fails, %s \n", pStr);
  // 		return;
  // 	}
00b0fbdb   Hu Chunming   编译nvdec
116
  
5686354a   Hu Chunming   初步编译成功cuvid部分的
117
118
119
  // 	double free_db = (double)free_byte;
  // 	double total_db = (double)total_byte;
  // 	double used_db_1 = (total_db - free_db) / 1024.0 / 1024.0;
00b0fbdb   Hu Chunming   编译nvdec
120
  
5686354a   Hu Chunming   初步编译成功cuvid部分的
121
  // 	std::cout <<"显存已使用 " << used_db_1 << " MB\n";
00b0fbdb   Hu Chunming   编译nvdec
122
  
5686354a   Hu Chunming   初步编译成功cuvid部分的
123
124
  //     // cudaFree(dn);
  // }
00b0fbdb   Hu Chunming   编译nvdec
125
  
5686354a   Hu Chunming   初步编译成功cuvid部分的
126
127
128
  // int CheckCUDAProperty( int devId )
  // {
  //     cuInit(0);
00b0fbdb   Hu Chunming   编译nvdec
129
  
5686354a   Hu Chunming   初步编译成功cuvid部分的
130
131
132
133
134
  // 	CUdevice dev = devId;
  // 	size_t memSize = 0;
  // 	char devName[256] = {0};
  // 	int major = 0, minor = 0;
  // 	CUresult rlt = CUDA_SUCCESS;
00b0fbdb   Hu Chunming   编译nvdec
135
  
5686354a   Hu Chunming   初步编译成功cuvid部分的
136
137
  //     rlt = cuDeviceGetAttribute(&major, CU_DEVICE_ATTRIBUTE_COMPUTE_CAPABILITY_MAJOR, dev);
  //     checkCudaErrors( rlt );
00b0fbdb   Hu Chunming   编译nvdec
138
  
5686354a   Hu Chunming   初步编译成功cuvid部分的
139
140
  //     rlt = cuDeviceGetAttribute(&minor, CU_DEVICE_ATTRIBUTE_COMPUTE_CAPABILITY_MINOR, dev);
  // 	checkCudaErrors( rlt );
00b0fbdb   Hu Chunming   编译nvdec
141
  
5686354a   Hu Chunming   初步编译成功cuvid部分的
142
143
  // 	rlt = cuDeviceGetName( devName, sizeof( devName ), dev );
  // 	checkCudaErrors( rlt );
00b0fbdb   Hu Chunming   编译nvdec
144
  
5686354a   Hu Chunming   初步编译成功cuvid部分的
145
146
  // 	printf( "Using GPU Device %d: %s has SM %d.%d compute capability\n",
  // 		    dev, devName, major, minor );
00b0fbdb   Hu Chunming   编译nvdec
147
  
5686354a   Hu Chunming   初步编译成功cuvid部分的
148
149
  // 	rlt = cuDeviceTotalMem( &memSize, dev );
  // 	checkCudaErrors( rlt );
00b0fbdb   Hu Chunming   编译nvdec
150
  
5686354a   Hu Chunming   初步编译成功cuvid部分的
151
152
  // 	printf( "Total amount of global memory:   %4.4f MB\n",
  // 		   (float)memSize / ( 1024 * 1024 ) );
00b0fbdb   Hu Chunming   编译nvdec
153
  
5686354a   Hu Chunming   初步编译成功cuvid部分的
154
155
  // 	return 0;
  // }
00b0fbdb   Hu Chunming   编译nvdec
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
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
  
  /**
   * 注意: gpuFrame 在解码器设置的显卡上,后续操作要十分注意这一点,尤其是多线程情况
   * */
  static long lastpts = 0;
  void postDecoded(const void * userPtr, DeviceRgbMemory * gpuFrame){
      AbstractDecoder* decoder = (AbstractDecoder*)userPtr;
      if (decoder!= nullptr)
      {
          long curpts = UtilTools::get_cur_time_ms();
          cout <<  decoder->getName() << "  " << gpuFrame->getWidth() << "x" << gpuFrame->getHeight() << "  " << curpts - lastpts << endl;
          lastpts = curpts;
          delete gpuFrame;
          gpuFrame = nullptr;
  
              // const char* gpu_pixfmt = av_get_pix_fmt_name((AVPixelFormat)gpuFrame->format);
              // cout << "pixfmt: " << gpu_pixfmt << endl;
              // cout << "keyframe: " << gpuFrame->key_frame << " width: " << gpuFrame->width << " height: "<< gpuFrame->height << endl;
              // cout << "decode successed ✿✿ヽ(°▽°)ノ✿ " << endl;
  
              // int sum = sum1;
              // if (decoder->getName() == "dec0")
              // {
              //     sum1 ++ ;
              //     sum = sum1;
  
              //     if (gpuFrame->format == AV_PIX_FMT_CUDA)
              //     {   
              //         // cout << "gpuid = " << atoi(decoder->m_cfg.gpuid.c_str()) << endl;
              //         cudaSetDevice(atoi(decoder->m_cfg.gpuid.c_str()));
              //         cudaError_t cudaStatus;
              //         if(pHwRgb[0] == nullptr){
              //             // cudaStreamCreate(&stream[0]);
              //             cuda_common::setColorSpace( ITU_709, 0 );
              //             cudaStatus = cudaMalloc((void **)&pHwRgb[0], 3 * gpuFrame->width * gpuFrame->height * sizeof(unsigned char));
              //         }
              //         cudaStatus = cuda_common::CUDAToBGR((CUdeviceptr)gpuFrame->data[0],(CUdeviceptr)gpuFrame->data[1], gpuFrame->linesize[0], gpuFrame->linesize[1], pHwRgb[0], gpuFrame->width, gpuFrame->height);
              //         cudaDeviceSynchronize();
              //         if (cudaStatus != cudaSuccess) {
              //             cout << "CUDAToBGR failed !!!" << endl;
              //             return;
              //         }
  
              //         string path = data_home + decoder->getName() + ".jpg";
              //         saveJpeg(path.c_str(), pHwRgb[0], gpuFrame->width, gpuFrame->height, stream[0]);  // 验证 CUDAToRGB 
              //     }
              // } else if (decoder->getName() == "dec2") 
              // {
              //     sum2 ++ ;
              //     sum = sum2;
  
              //     if (gpuFrame->format == AV_PIX_FMT_CUDA)
              //     {   
              //         // cout << "gpuid = " << atoi(decoder->m_cfg.gpuid.c_str()) << endl;
              //         cudaSetDevice(atoi(decoder->m_cfg.gpuid.c_str()));
              //         cudaError_t cudaStatus;
              //         if(pHwRgb[1] == nullptr){
              //             // cudaStreamCreate(&stream[1]);
              //             cuda_common::setColorSpace( ITU_709, 0 );
              //             cudaStatus = cudaMalloc((void **)&pHwRgb[1], 3 * gpuFrame->width * gpuFrame->height * sizeof(unsigned char));
              //         }
              //         cudaStatus = cuda_common::CUDAToBGR((CUdeviceptr)gpuFrame->data[0],(CUdeviceptr)gpuFrame->data[1], gpuFrame->linesize[0], gpuFrame->linesize[1], pHwRgb[1], gpuFrame->width, gpuFrame->height);
              //         cudaDeviceSynchronize();
              //         if (cudaStatus != cudaSuccess) {
              //             cout << "CUDAToBGR failed !!!" << endl;
              //             return;
              //         }
  
              //         string path = data_home + decoder->getName() + ".jpg";
              //         saveJpeg(path.c_str(), pHwRgb[1], gpuFrame->width, gpuFrame->height, stream[1]);  // 验证 CUDAToRGB 
              //     }
              // }
      }
  }
  
  long start_time = 0;
  long end_time = 0;
  bool count_flag = false;
  int count = 0;
  int count_std = 100;
  
  
  static int sum = 0;
  unsigned char *pHwData = nullptr;
  
  void postDecoded0(const void * userPtr, DeviceRgbMemory* gpuFrame){
      // std::this_thread::sleep_for(std::chrono::milliseconds(30000));
  
      AbstractDecoder* decoder = (AbstractDecoder*)userPtr;
      if (decoder!= nullptr)
      {
          // cout << "decode name: " << decoder->getName() << endl;
          // if (decoder->getName() == "dec")
          // {
          //     if (! count_flag)
          //     {
          //         count_flag = true;
          //         count = 0;
          //         end_time = start_time = UtilTools::get_cur_time_ms();
          //     }
          //     count++;
          //     sum ++ ;
          //     if (count >= count_std)
          //     {
          //         // end_time = UtilTools::get_cur_time_ms();
          //         // long time_using = end_time - start_time;
          //         // double time_per_frame = double(time_using)/count_std ;
          //         // cout << count_std << "帧用时:" << time_using << "ms 每帧用时:" << time_per_frame << "ms" << endl;
          //         cout << decoder->getName() << " keyframe: " << gpuFrame->key_frame << " width: " << gpuFrame->width << " height: "<< gpuFrame->height << endl;
          //         // cout << gpuFrame->pts << endl;
  
          //         count_flag = false;
          //     }
          //     // cout << "帧数:" << sum << endl;
  
          //     if (gpuFrame->format == AV_PIX_FMT_CUDA)
          //     {   
          //         cudaSetDevice(atoi(decoder->m_cfg.gpuid.c_str()));
          //         // cout << "gpu id : " << decoder->m_cfg.gpuid.c_str() << endl;
          //         cudaError_t cudaStatus;
          //         if(pHwData == nullptr){
          //             cuda_common::setColorSpace( ITU_709, 0 );
          //             cudaStatus = cudaMalloc((void **)&pHwData, 3 * gpuFrame->width * gpuFrame->height * sizeof(unsigned char));
          //         }
          //         cudaStatus = cuda_common::CUDAToBGR((CUdeviceptr)gpuFrame->data[0],(CUdeviceptr)gpuFrame->data[1], gpuFrame->linesize[0], gpuFrame->linesize[1], pHwData, gpuFrame->width, gpuFrame->height);
          //         cudaDeviceSynchronize();
          //         if (cudaStatus != cudaSuccess) {
          //             cout << "CUDAToBGR failed !!!" << endl;
          //             return;
          //         }
  
          //         string path = data_home + decoder->getName() + ".jpg";
          //         saveJpeg(path.c_str(), pHwData, gpuFrame->width, gpuFrame->height, nullptr);  // 验证 CUDAToRGB 
          //     }
          // }
      }
  }
  
  void decode_finished_cbk(const void* userPtr){
      cout << "当前时间戳: " << UtilTools::get_cur_time_ms() << endl;
  }
  
  bool decode_request_stream_cbk(const char* deviceId){
      cout << "需在此请求流" << endl;
      return true;
  }
  
  // string test_uri = "rtmp://192.168.10.56:1935/objecteye/1";
  // string test_uri = "/home/cmhu/data/output_800x480.mp4";
  // string test_uri = "/home/cmhu/data/output_1920x1080.mp4";
  // string test_uri = "rtsp://176.10.0.2:8554/stream";
  // string test_uri = "/mnt/f/fiss/test_data/h265.mp4";
  string test_uri = "rtsp://176.10.0.4:8554/stream";
  
  void createDecode(int index, const char* gpu_id){
      FFNvDecoderManager* pDecManager = FFNvDecoderManager::getInstance();
      MgrDecConfig config;
      config.name = "dec" + to_string(index);
      config.cfg.uri = test_uri;
      config.cfg.post_decoded_cbk = postDecoded;
      config.cfg.decode_finished_cbk = decode_finished_cbk;
      config.cfg.force_tcp = true;
      config.dec_type = DECODER_TYPE_FFMPEG;
  
      config.cfg.gpuid = gpu_id;
      // if (index % 2 == 0)
      // {
      //     config.cfg.gpuid = "0";
      // }
      // else
      // {
      //     config.cfg.gpuid = "0";
      // }
63e6f7bc   Hu Chunming   完成dvpp。但是nv和gb281...
329
      
00b0fbdb   Hu Chunming   编译nvdec
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
      AbstractDecoder* decoder = pDecManager->createDecoder(config);
      if (!decoder)
      {
          return ;
      }
      pDecManager->setPostDecArg(config.name, decoder);
      pDecManager->setFinishedDecArg(config.name, decoder);
      pDecManager->startDecodeByName(config.name);
  }
  
  void createGB28181Decode(int index, char* gpu_id, int port){
      FFNvDecoderManager* pDecManager = FFNvDecoderManager::getInstance();
      MgrDecConfig config;
      config.name = "dec" + to_string(index);
      config.cfg.uri = config.name;
      config.cfg.post_decoded_cbk = postDecoded;
      config.cfg.decode_finished_cbk = decode_finished_cbk;
      config.cfg.request_stream_cbk = decode_request_stream_cbk;
      config.cfg.force_tcp = true;
  
      config.dec_type = DECODER_TYPE_GB28181;
      config.cfg.port = port;//allocRtpPort();
  
      config.cfg.gpuid = gpu_id;
63e6f7bc   Hu Chunming   完成dvpp。但是nv和gb281...
354
      
00b0fbdb   Hu Chunming   编译nvdec
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
      AbstractDecoder* decoder = pDecManager->createDecoder(config);
      if (!decoder)
      {
          return ;
      }
      pDecManager->setPostDecArg(config.name, decoder);
      pDecManager->setFinishedDecArg(config.name, decoder);
      pDecManager->startDecodeByName(config.name);
  }
  
  void logFF(void *, int level, const char *fmt, va_list ap)
  {
      vfprintf(stdout, fmt, ap);
  }
  
  
  int main(int argc, char* argv[]){
  
      test_uri = "rtsp://admin:admin@123456@192.168.60.176:554/cam/realmonitor?channel=1&subtype=0";//argv[1];
      char* gpuid = argv[2];
      int port = atoi(argv[3]);
      cout << test_uri << "   gpu_id:" << gpuid << "   port:" << port << endl;
  
      // av_log_set_callback(&logFF);
  
5686354a   Hu Chunming   初步编译成功cuvid部分的
380
      // CheckCUDAProperty(atoi(gpuid));
00b0fbdb   Hu Chunming   编译nvdec
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
  
      pthread_t m_decode_thread;
      pthread_create(&m_decode_thread,0,
          [](void* arg)
          {
              // cudaSetDevice(atoi(gpuid));
              while (true)
              {
                  std::this_thread::sleep_for(std::chrono::minutes(1));
                  FFNvDecoderManager* pDecManager = FFNvDecoderManager::getInstance();
                  int count = pDecManager->count();
                  cout << "当前时间:" << UtilTools::get_cur_time_ms() << "  当前运行路数: " << pDecManager->count() << endl;
              }  
  
              return (void*)0;
          }
      ,nullptr);
  
  
      FFNvDecoderManager* pDecManager = FFNvDecoderManager::getInstance();
      int i = 0;
  
      while (true)
      {
          int ch = getchar();
          if (ch == 'q')
          {
              break;
          }
  
          switch (ch)
          {
          case 'f':
          case 'F':
              createDecode(i, gpuid);
              i++;
              break;
          case 'g':
          case 'G':
              createGB28181Decode(i, gpuid, port);
              i++;
              break;
          case 'r':
          case 'R':
              pDecManager->resumeDecoder("dec0");
              break;
          case 'p':
          case 'P':
              pDecManager->pauseDecoder("dec0");
              break;
  
          case 'c':
          case 'C':
              i--;
              pDecManager->closeDecoderByName("dec" + to_string(i));
              break;
  
          case 'i':
          case 'I':
          {
              int w,h;
              pDecManager->getResolution("dec0", w,h);
              printf( "%s : %dx%d\n", "dec0" , w,h );
          }
              break;
  
          default:
              break;
          }
  
          /* code */
      }
  
      cout << "总共帧数:" << sum << endl;
      pDecManager->closeAllDecoder();
  }