弄清楚竞争状况

时间:2016-08-22 04:04:19

标签: c++ multithreading

我正在构建一个屏幕录像机,我正在使用ffmpeg从我从谷歌浏览器获得的帧中制作视频。我在输出视频中看到了绿屏。我认为线程中存在竞争条件,因为我不允许使用主线程来进行处理。这里的代码如何

每次我得到一个新帧时,此函数都有效,我怀疑函数avpicture_fill& vpx_codec_get_cx_data之前正在重写write_ivf_frame_header WriteFile已完成。

我正在考虑创建一个队列,其中此函数推送对象pp::VideoFrame,然后另一个带有互斥锁的线程将出列并执行下面的处理。

这个问题的最佳解决方案是什么?什么是调试它的最佳方式

void EncoderInstance::OnGetFrame(int32_t result, pp::VideoFrame frame) {
    if (result != PP_OK)
        return;

    const uint8_t* data = static_cast<const uint8_t*>(frame.GetDataBuffer());
    pp::Size size;
    frame.GetSize(&size);
    uint32_t buffersize = frame.GetDataBufferSize();


    if (is_recording_) {
        vpx_codec_iter_t iter = NULL;
        const vpx_codec_cx_pkt_t *pkt;
        // copy the pixels into our "raw input" container.
        int bytes_filled = avpicture_fill(&pic_raw, data, AV_PIX_FMT_YUV420P, out_width, out_height);
        if(!bytes_filled) {
            Logger::Log("Cannot fill the raw input buffer");
            return;
        }

        if(vpx_codec_encode(&codec, &raw, frame_cnt, 1, flags, VPX_DL_REALTIME))
              die_codec(&codec, "Failed to encode frame");

        while( (pkt = vpx_codec_get_cx_data(&codec, &iter)) ) {
            switch(pkt->kind) {
                case VPX_CODEC_CX_FRAME_PKT:
                    glb_app_thread.message_loop().PostWork(callback_factory_.NewCallback(&EncoderInstance::write_ivf_frame_header, pkt));
                    glb_app_thread.message_loop().PostWork(callback_factory_.NewCallback(&EncoderInstance::WriteFile, pkt));
                    break;
                default:break;
            }
        }

        frame_cnt++;
    }

    video_track_.RecycleFrame(frame);
    if (need_config_) {
        ConfigureTrack();
        need_config_ = false;
    } else {
        video_track_.GetFrame(
                callback_factory_.NewCallbackWithOutput(
                        &EncoderInstance::OnGetFrame));
    }
}

0 个答案:

没有答案