示例#1
0
void StreamReader::addToMedia(Media *media)
{
    lock(); // Make sure we can lock in read().

    media->addOption(QLatin1String("imem-cat=4"));
    media->addOption(QLatin1String("imem-data="), INTPTR_PTR(this));
    media->addOption(QLatin1String("imem-get="), INTPTR_FUNC(readCallback));
    media->addOption(QLatin1String("imem-release="), INTPTR_FUNC(readDoneCallback));
    media->addOption(QLatin1String("imem-seek="), INTPTR_FUNC(seekCallback));

    // if stream has known size, we may pass it
    // imem module will use it and pass it to demux
    if (streamSize() > 0) {
        media->addOption(QString("imem-size=%1").arg(streamSize()));
    }
}
示例#2
0
              HRESULT read(LONGLONG pos, LONG length, BYTE *buffer, LONG *actual)
              {
                  QMutexLocker locker(&m_mutexRead);

                  if (m_mediaGraph->isStopping()) {
                      return VFW_E_WRONG_STATE;
                  }

                  if(streamSize() != 1 && pos + length > streamSize()) {
                      //it tries to read outside of the boundaries
                      return E_FAIL;
                  }

                  if (currentPos() - currentBufferSize() != pos) {
                      if (!streamSeekable()) {
                          return S_FALSE;
                      }
                      setCurrentPos(pos);
                  }

                  int oldSize = currentBufferSize();
                  while (currentBufferSize() < int(length)) {
                      needData();
                      if (m_mediaGraph->isStopping()) {
                          return VFW_E_WRONG_STATE;
                      }

                      if (oldSize == currentBufferSize()) {
                          break; //we didn't get any data
                      }
                      oldSize = currentBufferSize();
                  }

                  DWORD bytesRead = qMin(currentBufferSize(), int(length));
                  {
                      QWriteLocker locker(&m_lock);
                      qMemCopy(buffer, m_buffer.data(), bytesRead);
                      //truncate the buffer
                      m_buffer = m_buffer.mid(bytesRead);
                  }

                  if (actual) {
                      *actual = bytesRead; //initialization
                  }

                  return bytesRead == length ? S_OK : S_FALSE;
              }
示例#3
0
ImagePtr MagickImageLoader::load(std::istream& stream) {
    if (stream.fail())
        throw Exception("[MagickImageLoader::load] invalid stream given");

    long int stream_size = streamSize(stream);
    if (stream_size < 1)
        throw Exception("[MagickImageLoader::load] empty stream given");

    boost::scoped_array<char> tmp(new char[stream_size]);
    Magick::Blob blob;
    blob.updateNoCopy(tmp.get(), stream_size);
    try {
        Magick::Image image;
        image.density("10");
        image.ping(blob);
        convertImageDpi(image);
        image.read(blob);

        return load(image);
    } catch (Magick::Exception &e) {
        cfError(MODULE_RDIB) << e.what();
        throw Exception("[MagickImageLoader::load] failed");
    }
}
示例#4
0
int
LogStream::needToCycle ()
{
  return cycle && (streamSize () >= cycle);
}