コード例 #1
0
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;
}
コード例 #2
0
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();
}