Example #1
0
std::string RecpathConfig::GetNextPathForStream()
{
    logD(recpath, _func_);

    //m_mutex.lock();

    if(m_configs.size() == 0)
    {
        //m_mutex.unlock();
        logD(recpath, _func_, "Config is empty");
        return std::string("");
    }
    else
        logD(recpath, _func_, "Config size is ", m_configs.size());

    std::string next_path;
    while(true)
    {
        for(ConfigMap::const_iterator it = m_configs.begin(); it != m_configs.end(); ++it)
        {
            Int64 freeSize = MemoryDispatcher::Instance().GetDiskFreeSizeFromDiskname(it->first);
            logD(recpath, _func_, "diskname is ", it->first.c_str());
            logD(recpath, _func_, "freeSize is ", freeSize);
            if(freeSize > MINFREESIZE)
            {
                next_path = it->first;
                logD(recpath, _func_, "next_path is ", next_path.c_str());
                break;
            }
        }

        if(next_path.size())
        {
            break;
        }
        else
        {
            logD(recpath, _func_, "next_path is empty");
        }

        // cleaning
        logD(recpath, _func_, "CLEANING");
        ChannelChecker::ChannelFileDiskTimes channelFileDiskTimes;
        std::map<std::string, WeakRef<FFmpegStream> >::iterator itFFStream = m_pStreams->begin();
        for(itFFStream; itFFStream != m_pStreams->end(); itFFStream++)
        {
            logD(recpath, _func_, "channel_name = ", itFFStream->first.c_str());
            Ref<ChannelChecker> channelChecker = itFFStream->second.getRefPtr()->GetChannelChecker();
            std::pair<std::string, ChChDiskTimes> oldestFileDiskTimes = channelChecker->GetOldestFileDiskTimes();
            logD(recpath, _func_, "filename = ", oldestFileDiskTimes.first.c_str());
            logD(recpath, _func_, "diskname = ", oldestFileDiskTimes.second.diskName.c_str());
            logD(recpath, _func_, "beginTime = ", oldestFileDiskTimes.second.times.timeStart);
            logD(recpath, _func_, "endTime = ", oldestFileDiskTimes.second.times.timeEnd);
            if(oldestFileDiskTimes.first.size())
            {
                channelFileDiskTimes.insert(oldestFileDiskTimes);
            }
        }

        // find most older file
        int minTime = std::numeric_limits<int>::max();
        std::string fileName;
        std::string diskName;
        ChannelChecker::ChannelFileDiskTimes::iterator iter = channelFileDiskTimes.begin();
        for(iter; iter != channelFileDiskTimes.end(); iter++)
        {
            if(minTime > iter->second.times.timeStart)
            {
                minTime = iter->second.times.timeStart;
                fileName = iter->first;
                diskName = iter->second.diskName;
            }
        }

        logD(recpath, _func_, "minTime = ", minTime);
        logD(recpath, _func_, "minfileName = ", fileName.c_str());
        logD(recpath, _func_, "mindiskName = ", diskName.c_str());

        // delete it (if filename is not recorded at current time)
        StRef<String> dir_name = st_makeString(diskName.c_str());
        StRef<String> file_name = st_makeString(fileName.c_str());
        StRef<String> full_file_name = st_makeString(dir_name, "/", file_name, ".flv");
        if(!MemoryDispatcher::Instance().IsFilenameRecorded(full_file_name->cstr()))
        {
            Ref<Vfs> vfs = Vfs::createDefaultLocalVfs (dir_name->mem());

            StRef<String> const filenameFull = st_makeString(fileName.c_str(), ".flv");

            logD(recpath, _func_, "filenameFull to remove = ", filenameFull);

            vfs->removeFile (filenameFull->mem());
            vfs->removeSubdirsForFilename (filenameFull->mem());

            std::string channel_name = fileName.substr(0,fileName.find("/"));
            (*m_pStreams)[channel_name].getRefPtr()->GetChannelChecker()->DeleteFromCache(diskName, fileName);
        }
        else
        {
            break;
        }
    }

    //m_mutex.unlock();

    return next_path;
}