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())); } }
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; }
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"); } }
int LogStream::needToCycle () { return cycle && (streamSize () >= cycle); }