Commit e01a039762b37c1c1012682a5d03031109655610

Authored by Hu Chunming
1 parent bf661eb0

代码优化;

src/decoder/dvpp/DvppDecoder.cpp
@@ -245,8 +245,6 @@ void DvppDecoder::close(){ @@ -245,8 +245,6 @@ void DvppDecoder::close(){
245 if(m_read_thread != 0){ 245 if(m_read_thread != 0){
246 pthread_join(m_read_thread,0); 246 pthread_join(m_read_thread,0);
247 } 247 }
248 -  
249 - m_recoderManager.close();  
250 } 248 }
251 249
252 void DvppDecoder::setPostDecArg(const void* postDecArg){ 250 void DvppDecoder::setPostDecArg(const void* postDecArg){
@@ -442,6 +440,8 @@ void DvppDecoder::read_thread() { @@ -442,6 +440,8 @@ void DvppDecoder::read_thread() {
442 decode_finished_cbk(m_finishedDecArg); 440 decode_finished_cbk(m_finishedDecArg);
443 } 441 }
444 442
  443 + m_recoderManager.close();
  444 +
445 LOG_INFO("[{}]- read thread exit.", m_dec_name); 445 LOG_INFO("[{}]- read thread exit.", m_dec_name);
446 m_bFinished = true; 446 m_bFinished = true;
447 release_ffmpeg(); 447 release_ffmpeg();
src/decoder/dvpp/FFRecoder.cpp
@@ -24,7 +24,6 @@ FFRecoder::FFRecoder() @@ -24,7 +24,6 @@ FFRecoder::FFRecoder()
24 24
25 FFRecoder::~FFRecoder() 25 FFRecoder::~FFRecoder()
26 { 26 {
27 - uninit();  
28 } 27 }
29 28
30 29
@@ -125,7 +124,7 @@ bool FFRecoder::init(AVStream* stream, AVCodecContext* avctx, const char* outfil @@ -125,7 +124,7 @@ bool FFRecoder::init(AVStream* stream, AVCodecContext* avctx, const char* outfil
125 124
126 codec_ctx_ = (AVCodecContext*)av_malloc(sizeof(AVCodecContext)); 125 codec_ctx_ = (AVCodecContext*)av_malloc(sizeof(AVCodecContext));
127 avcodec_copy_context(codec_ctx_, avctx); 126 avcodec_copy_context(codec_ctx_, avctx);
128 - codec_ctx_->time_base = stream->time_base; 127 + codec_ctx_->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
129 m_inStream = stream; 128 m_inStream = stream;
130 129
131 // [2] 创建输出上下文 130 // [2] 创建输出上下文
@@ -133,11 +132,19 @@ bool FFRecoder::init(AVStream* stream, AVCodecContext* avctx, const char* outfil @@ -133,11 +132,19 @@ bool FFRecoder::init(AVStream* stream, AVCodecContext* avctx, const char* outfil
133 132
134 // [3] 添加输出视频流 133 // [3] 添加输出视频流
135 out_stream_ = avformat_new_stream(fmt_ctx_, nullptr); 134 out_stream_ = avformat_new_stream(fmt_ctx_, nullptr);
  135 +
136 out_stream_->id = 0; 136 out_stream_->id = 0;
137 out_stream_->codecpar->codec_tag = 0; 137 out_stream_->codecpar->codec_tag = 0;
138 avcodec_parameters_from_context(out_stream_->codecpar, codec_ctx_); 138 avcodec_parameters_from_context(out_stream_->codecpar, codec_ctx_);
139 - // out_stream_->time_base = { 1,30 }; 139 + // out_stream_->time_base = { 1,25 };
140 out_stream_->time_base = stream->time_base; 140 out_stream_->time_base = stream->time_base;
  141 + out_stream_->r_frame_rate = stream->r_frame_rate;
  142 + out_stream_->avg_frame_rate = stream->r_frame_rate;
  143 +
  144 + codec_ctx_->time_base = out_stream_->time_base;
  145 +
  146 + av_opt_set(out_stream_->codec->priv_data, "preset", "ultrafast", 0);
  147 + av_opt_set(out_stream_->codec->priv_data, "tune", "zerolatency", 0);
141 148
142 av_dump_format(fmt_ctx_, out_stream_->id, outfile_name, 1); 149 av_dump_format(fmt_ctx_, out_stream_->id, outfile_name, 1);
143 150
@@ -154,6 +161,18 @@ bool FFRecoder::init(AVStream* stream, AVCodecContext* avctx, const char* outfil @@ -154,6 +161,18 @@ bool FFRecoder::init(AVStream* stream, AVCodecContext* avctx, const char* outfil
154 return true; 161 return true;
155 } 162 }
156 163
  164 +void FFRecoder::release() {
  165 + av_write_trailer(fmt_ctx_);
  166 +
  167 + avcodec_close(fmt_ctx_->streams[0]->codec);
  168 + av_freep(&fmt_ctx_->streams[0]->codec);
  169 + av_freep(&fmt_ctx_->streams[0]);
  170 +
  171 + avio_close(fmt_ctx_->pb);
  172 + av_free(fmt_ctx_);
  173 + fmt_ctx_ = nullptr;
  174 +}
  175 +
157 void FFRecoder::uninit() 176 void FFRecoder::uninit()
158 { 177 {
159 //if (out_buffer) { 178 //if (out_buffer) {
@@ -250,8 +269,7 @@ bool FFRecoder::write_pkt(AVPacket *pkt) { @@ -250,8 +269,7 @@ bool FFRecoder::write_pkt(AVPacket *pkt) {
250 // update_pts(pkt); 269 // update_pts(pkt);
251 // pkt->stream_index = out_stream_->index; 270 // pkt->stream_index = out_stream_->index;
252 271
253 - // if(pkt->pts==AV_NOPTS_VALUE)  
254 - { 272 + if(pkt->pts==AV_NOPTS_VALUE) {
255 // printf("frame_index:%d\n", frame_index); 273 // printf("frame_index:%d\n", frame_index);
256 //Write PTS 274 //Write PTS
257 AVRational time_base1 = codec_ctx_->time_base; 275 AVRational time_base1 = codec_ctx_->time_base;
@@ -262,15 +280,15 @@ bool FFRecoder::write_pkt(AVPacket *pkt) { @@ -262,15 +280,15 @@ bool FFRecoder::write_pkt(AVPacket *pkt) {
262 pkt->dts = pkt->pts; 280 pkt->dts = pkt->pts;
263 pkt->duration = (double)calc_duration / (double)(av_q2d(time_base1)*AV_TIME_BASE); 281 pkt->duration = (double)calc_duration / (double)(av_q2d(time_base1)*AV_TIME_BASE);
264 frame_index++; 282 frame_index++;
265 - } 283 + }
266 // Convert PTS/DTS 284 // Convert PTS/DTS
267 pkt->pts = av_rescale_q_rnd(pkt->pts, codec_ctx_->time_base, out_stream_->time_base, (enum AVRounding)(AV_ROUND_NEAR_INF | AV_ROUND_PASS_MINMAX)); 285 pkt->pts = av_rescale_q_rnd(pkt->pts, codec_ctx_->time_base, out_stream_->time_base, (enum AVRounding)(AV_ROUND_NEAR_INF | AV_ROUND_PASS_MINMAX));
268 pkt->dts = av_rescale_q_rnd(pkt->dts, codec_ctx_->time_base, out_stream_->time_base, (enum AVRounding)(AV_ROUND_NEAR_INF | AV_ROUND_PASS_MINMAX)); 286 pkt->dts = av_rescale_q_rnd(pkt->dts, codec_ctx_->time_base, out_stream_->time_base, (enum AVRounding)(AV_ROUND_NEAR_INF | AV_ROUND_PASS_MINMAX));
269 pkt->duration = av_rescale_q(pkt->duration, codec_ctx_->time_base, out_stream_->time_base); 287 pkt->duration = av_rescale_q(pkt->duration, codec_ctx_->time_base, out_stream_->time_base);
  288 +
270 pkt->pos = -1; 289 pkt->pos = -1;
271 -  
272 pkt->stream_index = out_stream_->index; 290 pkt->stream_index = out_stream_->index;
273 - 291 + fmt_ctx_->duration += pkt->duration;
274 292
275 // 将数据写入到输出流 293 // 将数据写入到输出流
276 int ret = av_interleaved_write_frame(fmt_ctx_, pkt); 294 int ret = av_interleaved_write_frame(fmt_ctx_, pkt);
@@ -336,6 +354,11 @@ bool FFRecoder::flush() @@ -336,6 +354,11 @@ bool FFRecoder::flush()
336 return write_frame(nullptr); 354 return write_frame(nullptr);
337 } 355 }
338 356
  357 +bool FFRecoder::flush_pkt()
  358 +{
  359 + return av_interleaved_write_frame(fmt_ctx_, nullptr);
  360 +}
  361 +
339 bool FFRecoder::bgr_to_yuv420p(const uint8_t* const buf_bgr, uint8_t* const buf_420p) 362 bool FFRecoder::bgr_to_yuv420p(const uint8_t* const buf_bgr, uint8_t* const buf_420p)
340 { 363 {
341 // 分配转换上下文 364 // 分配转换上下文
src/decoder/dvpp/FFRecoder.h
@@ -26,6 +26,8 @@ public: @@ -26,6 +26,8 @@ public:
26 // AVPacket 方式 26 // AVPacket 方式
27 bool init(AVStream* stream, AVCodecContext* avctx, const char* outfile_name); 27 bool init(AVStream* stream, AVCodecContext* avctx, const char* outfile_name);
28 bool write_pkt(AVPacket *pkt); 28 bool write_pkt(AVPacket *pkt);
  29 + bool flush_pkt();
  30 + void release();
29 31
30 private: 32 private:
31 bool bgr_to_yuv420p(const uint8_t* const buf_bgr, uint8_t* const buf_420p); 33 bool bgr_to_yuv420p(const uint8_t* const buf_bgr, uint8_t* const buf_420p);
src/decoder/dvpp/FFRecoderTaskManager.cpp
@@ -393,7 +393,7 @@ void FFRecoderTaskManager::recode_thread2() { @@ -393,7 +393,7 @@ void FFRecoderTaskManager::recode_thread2() {
393 end_frame_nb = (*it_save)->frame_nb; 393 end_frame_nb = (*it_save)->frame_nb;
394 } 394 }
395 395
396 - // ffrecoder.flush(); 396 + ffrecoder.flush_pkt();
397 ffrecoder.uninit(); 397 ffrecoder.uninit();
398 398
399 // 发送mq消息 399 // 发送mq消息
src/decoder/test_recoder.cpp
@@ -64,7 +64,7 @@ int main(){ @@ -64,7 +64,7 @@ int main(){
64 64
65 MgrDecConfig config; 65 MgrDecConfig config;
66 config.name = task_id; 66 config.name = task_id;
67 - config.cfg.uri = "rtsp://122.97.218.170:8604/openUrl/LBBYTra?params=eyJwcm90b2NhbCI6InJ0c3AiLCJjbGllbnRUeXBlIjoib3Blbl9hcGkiLCJleHByaWVUaW1lIjotMSwicHJvdG9jb2wiOiJydHNwIiwiZXhwaXJlVGltZSI6MzAwLCJlbmFibGVNR0MiOnRydWUsImV4cGFuZCI6InN0YW5kYXJkPXJ0c3Amc3RyZWFtZm9ybT1ydHAiLCJhIjoiOTgzYjRjMmUxMThlNGU1OTlkYThmMTI3NTkyMGViODV8MXwwfDEiLCJ0IjoxfQ=="; 67 + config.cfg.uri = "rtsp://admin:ad123456@192.168.60.165:554/cam/realmonitor?channel=1&subtype=0";
68 config.cfg.post_decoded_cbk = post_decod_cbk; 68 config.cfg.post_decoded_cbk = post_decod_cbk;
69 config.cfg.decode_finished_cbk = decode_finished_cbk; 69 config.cfg.decode_finished_cbk = decode_finished_cbk;
70 config.cfg.force_tcp = true; // rtsp用tcp 70 config.cfg.force_tcp = true; // rtsp用tcp