KoFilter::ConversionStatus VmlDrawingReader::read_xml() { unsigned index = 0; KoXmlWriter *oldBody = 0; while (!atEnd()) { readNext(); if (isEndElement() && qualifiedName() == "xml") { break; } if (isStartElement()) { if (name() == "shapetype") { TRY_READ(shapetype) } else if (name() == "shape") { oldBody = body; // Body protetion starts QBuffer frameBuf; KoXmlWriter frameWriter(&frameBuf); body = &frameWriter; TRY_READ(shape) //from vml m_content[m_currentVMLProperties.currentShapeId] = m_currentVMLProperties.imagedataPath; pushCurrentDrawStyle(new KoGenStyle(KoGenStyle::GraphicAutoStyle, "graphic")); createFrameStart(); popCurrentDrawStyle(); m_frames[m_currentVMLProperties.currentShapeId] = QString::fromUtf8(frameBuf.buffer(), frameBuf.buffer().size()).append(">"); body = oldBody; // Body protection ends ++index; } } } return KoFilter::OK; }
already_AddRefed<mozilla::MediaRawData> MP3Demuxer::GetNext() { static const int BUFFER_SIZE = 4096; uint8_t buffer[BUFFER_SIZE]; uint32_t read = 0; const uint8_t* frameBeg = nullptr; const uint8_t* bufferEnd = nullptr; while (frameBeg == bufferEnd && (read = Read(buffer, mOffset, BUFFER_SIZE)) > 0) { MOZ_ASSERT(mOffset + read > mOffset); mOffset += read; bufferEnd = buffer + read; frameBeg = mParser.Parse(buffer, bufferEnd); } if (frameBeg == bufferEnd || !mParser.CurrentFrame().Length()) { return nullptr; } // Valid frame header was fully parsed, let's read the whole frame. const int32_t frameLen = mParser.CurrentFrame().Length(); nsRefPtr<MediaRawData> frame = new MediaRawData(); frame->mOffset = mOffset - (bufferEnd - frameBeg) + 1; nsAutoPtr<MediaRawDataWriter> frameWriter(frame->CreateWriter()); if (!frameWriter->SetSize(frameLen)) { return nullptr; } read = Read(frameWriter->mData, frame->mOffset, frame->mSize); if (read != frame->mSize) { return nullptr; } // Prevent overflow. if (mTotalFrameLen + frameLen < 0) { // These variables have a linear dependency and are only used to derive the // average frame length. mTotalFrameLen /= 2; mNumParsedFrames /= 2; } // Full frame parsed, move offset to its end. mOffset = frame->mOffset + frame->mSize; MOZ_ASSERT(mOffset > frame->mOffset); mTotalFrameLen += frameLen; mSamplesPerFrame = mParser.CurrentFrame().Header().SamplesPerFrame(); mSamplesPerSecond = mParser.CurrentFrame().Header().SampleRate(); mChannels = mParser.CurrentFrame().Header().Channels(); ++mNumParsedFrames; ++mFrameIndex; MOZ_ASSERT(mFrameIndex > 0); frame->mTime = Duration(mFrameIndex - 1); frame->mDuration = Duration(1); if (mNumParsedFrames == 1) { // First frame parsed, let's read VBR info if available. // TODO: read info that helps with seeking (bug 1163667). mParser.ParseVBRHeader(frame->mData, frame->mData + frame->mSize); mFirstFrameOffset = frame->mOffset; } // Prepare the parser for the next frame parsing session. mParser.FinishParsing(); return frame.forget(); }