派生自 development/c++

chenshijun
2019-03-14 81d49a435bc67fa0be45056c743f2a5b46bad264
解决ffmpeg打开国标流失败导致段错误的问题
2个文件已修改
30 ■■■■ 已修改文件
QiaoJiaSystem/GB28181DecoderModel/FFmpegDecoderJPG.cpp 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
QiaoJiaSystem/GB28181DecoderModel/VideoCaptureElementWithRtp.cpp 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
QiaoJiaSystem/GB28181DecoderModel/FFmpegDecoderJPG.cpp
@@ -143,7 +143,7 @@
 */
void BASICGB28181::FFmpegDecoderJPG::BareFlowDecoderThd(FFmpegDecoderJPG *p_this) {
    DBG(p_this->m_camIdx << "  BareFlowDecoderThd ok ... gpuIdx is " << p_this->m_gpuIdx);
//    while(!p_this->m_running) {
    while(!p_this->m_running) {
        p_this->m_running = true;
//    av_register_all();
@@ -154,14 +154,14 @@
        if (!p_this->iobuffer) {
            ERR("av_malloc: err======" << p_this->m_camIdx);
            p_this->m_running = false;
            return;
            continue;
        }
        p_this->avio = avio_alloc_context(p_this->iobuffer, p_this->m_buf_size, 0, p_this, p_this->read_data, NULL,
                                          NULL);
        if (!p_this->avio) {
            ERR("avio_alloc_context: err======" << p_this->m_camIdx);
            p_this->m_running = false;
            return;
            continue;
        }
        p_this->ic->pb = p_this->avio;
@@ -169,13 +169,13 @@
        if (err) {
            ERR("av_probe_input_buffer: err======" << err  << p_this->m_camIdx);
            p_this->m_running = false;
            return;
            continue;
        }
        err = avformat_open_input(&p_this->ic, "", NULL, NULL);
        if (err) {
            ERR("avformat_open_input: err======" << err  << p_this->m_camIdx);
            p_this->m_running = false;
            return;
            continue;
        }
//    int err2 = avformat_find_stream_info(ic, nullptr);
        err = avformat_find_stream_info(p_this->ic, NULL);
@@ -184,7 +184,7 @@
//        avformat_close_input(&p_this->ic);
//        DBG("avformat_close_input(&p_this->ic);");
            p_this->m_running = false;
            return;
            continue;
        }
        int vi = -1;
        for (int i = 0; i < p_this->ic->nb_streams; ++i) {
@@ -202,7 +202,7 @@
//        avformat_close_input(&p_this->ic);
//        DBG("avformat_close_input(&p_this->ic);");
            p_this->m_running = false;
            return;
            continue;
        }
        p_this->codec = avcodec_find_decoder(p_this->ctx->codec_id);
@@ -231,7 +231,7 @@
//        avcodec_free_context(&p_this->ctx);
//        DBG("avcodec_free_context(&p_this->ctx);");
            p_this->m_running = false;
            return;
            continue;
        }
        av_init_packet(&p_this->pkt);
@@ -239,7 +239,7 @@
        p_this->frame = av_frame_alloc();
        unsigned int usleepTime = (1000 / p_this->m_fps) - 12;
        usleepTime *= 1000;
        DBG(" before while <<usleepTime is " << usleepTime);
        DBG("===open ok, camid: " << p_this->m_camIdx );
        while (p_this->m_running) {
#ifdef TestCode
            ClockTimer Test("while time");
@@ -322,7 +322,7 @@
        }
        DBG(" after while ");
        av_frame_free(&p_this->frame);
//    }
    }
}
bool BASICGB28181::FFmpegDecoderJPG::startThd(const std::string &camIdx, const int &fps, const int &gpuIdx) {
QiaoJiaSystem/GB28181DecoderModel/VideoCaptureElementWithRtp.cpp
@@ -101,12 +101,12 @@
                p_this->m_running = true;
                p_this->m_fFmpegDecoderJPG.startThd(p_this->m_chanPubID, p_this->m_fps, p_this->m_gpuIdx);
                while (p_this->m_running) {
                    if(p_this->m_fFmpegDecoderJPG.getRunning()) {
//                    if(p_this->m_fFmpegDecoderJPG.getRunning()) {
                        usleep(300000);
                    }else{
                        p_this->m_running = false;
                        break;
                    }
//                    }else{
//                        p_this->m_running = false;
//                        break;
//                    }
                }
                DBG("videoCaptureElementThd stop ...");
                C_RealVideoStop(lrealhandle);