BleImage BleWindowsCaptureSource::getImage()
{
    BleAutoLocker(m_modifyMutex);

//    BleImage be;
//    be = m_image;
    return m_image.clone();
}
void BleImageCaptureThread::fini()
{
    BleAutoLocker(m_mutex);
    while (!m_queue.isEmpty()) {
        BleImage *image = m_queue.dequeue();
        BleFree(image);
    }
}
QQueue<BleImage *> BleImageProcessThread::getQueue()
{
    BleAutoLocker(m_modifyOutputMutex);

    QQueue<BleImage *> queue = m_outputQueue;
    m_outputQueue.clear();

    return queue;
}
int BleRtmpSendThread::service(BleRtmpMuxer & muxer)
{
    int ret = BLE_SUCESS;

    if ((ret = sendVideoSh(muxer)) != BLE_SUCESS) {
        return ret;
    }

    if ((ret = sendAudioSh(muxer)) != BLE_SUCESS) {
        return ret;
    }

    while (!m_stop) {
        QQueue<BleAVPacket *> pkts = BleAVQueue::instance()->dequeue();
        if (pkts.isEmpty()) {
            msleep(50);
            continue;
        }

        BleAutoLocker(m_mutex);

        while (!pkts.empty()) {
            BleAVPacket *pkt = pkts.dequeue();
            BleAutoFree(BleAVPacket, pkt);

            MStream &data = pkt->data;

            if (pkt->pktType == Packet_Type_Video) {
                if (muxer.addH264(data, pkt->dts) != TRUE ) {
                    ret = BLE_RTMPSEND_ERROR;
                    break;
                }

                m_videoKbps += (data.size() + 11);
                m_fps += 1;
            } else if (pkt->pktType == Packet_Type_Audio) {
                if (muxer.addAAC(data, pkt->dts) != TRUE ) {
                    ret = BLE_RTMPSEND_ERROR;
                    break;
                }

                m_audioKbps += (data.size() + 11);
            }

            m_sendDataCount += (data.size() + 11);
        }

        // if send failed, then pkts may has some pkt
        // we should delete it.
        for (int i = 0; i < pkts.size(); ++i) {
            BleAVPacket *pkt = pkts.at(i);
            BleFree(pkt);
        }
    }

    return ret;
}
QQueue<BleImage *> BleImageCaptureThread::getQueue()
{
    BleAutoLocker(m_mutex);

    QQueue<BleImage *> ret = m_queue;
    m_queue.clear();

    return ret;
}
QImage BleWindowsCaptureSource::getImage()
{
    BleAutoLocker(m_modifyMutex);
    return m_image;
}
void BleImageProcessThread::updateSources(QList<SourcePair> &sources)
{
    BleAutoLocker(m_updateMutex);
    m_sources = sources;
}
BleImage BleFileSource::getImage()
{
    BleAutoLocker(m_modifyMutex);
    return m_image.clone();
}
QImage BleCameraSource::getImage()
{
    BleAutoLocker(m_modifyMutex);
    return m_image.rgbSwapped();
}