void inputOGG::getNext(bool smart) { if (!sortedSegments.size()){ for (std::set<int>::iterator it = selectedTracks.begin(); it != selectedTracks.end(); it++){ seekNextPage((*it)); } } if (sortedSegments.size()){ int tid = (*(sortedSegments.begin())).tid; bool addedPacket = false; while (!addedPacket){ segPart tmpPart; if (oggTracks[tid].myPage.getSegment(oggTracks[tid].nxtSegment, tmpPart.segData, tmpPart.len)){ if (oggTracks[tid].nxtSegment == 0 && oggTracks[tid].myPage.getHeaderType() && OGG::Continued){ segment tmpSeg = *(sortedSegments.begin()); tmpSeg.parts.push_back(tmpPart); sortedSegments.erase(sortedSegments.begin()); sortedSegments.insert(tmpSeg); }else{ segment tmpSeg; tmpSeg.parts.push_back(tmpPart); tmpSeg.tid = tid; tmpSeg.time = oggTracks[tid].lastTime; if (oggTracks[tid].codec == VORBIS) { std::string data; data.append(tmpPart.segData, tmpPart.len); unsigned int blockSize = 0; Utils::bitstreamLSBF packet; packet.append(data); if (!packet.get(1)) { blockSize = oggTracks[tid].blockSize[oggTracks[tid].vModes[packet.get(vorbis::ilog(oggTracks[tid].vModes.size() - 1))].blockFlag]; } oggTracks[tid].lastTime += oggTracks[tid].msPerFrame * (blockSize / oggTracks[tid].channels); } if (oggTracks[tid].codec == THEORA) { oggTracks[tid].lastTime += oggTracks[tid].msPerFrame; } sortedSegments.insert(tmpSeg); addedPacket = true; } oggTracks[tid].nxtSegment ++; }else{ if (!seekNextPage(tid)){ break; } } } std::string data; } }
bool InternalGenerator::writeDocumentEnd (const Word format, const PageLayout *) { #ifdef DEBUG_INTERNALGENERATOR m_device->debug ("!!!! InternalGenerator: writeDocumentEnd\n"); #endif m_header->setNumCharBytes (m_device->tellInternal () - 128); #ifdef DEBUG_INTERNALGENERATOR m_device->debug ("before charinfo seek next page: ", m_device->tellInternal ()); #endif if (!seekNextPage ()) return false; // from text pages #ifdef DEBUG_INTERNALGENERATOR m_device->debug ("!!!! InternalGenerator: Write characterInfo; page=", m_device->tellInternal () / 128); #endif FormatCharProperty defaultCharProperty; defaultCharProperty.setFontTable (m_fontTable); Font defaultFont ((const Byte *) "Arial"); // better than "unknown", I guess defaultCharProperty.setFont (&defaultFont); // write characterInfo pages m_characterInfo->setDevice (m_device); m_characterInfo->setHeader (m_header); m_characterInfo->setFontTable (m_fontTable); if (!m_characterInfo->writeToDevice (&defaultCharProperty)) return false; #ifdef DEBUG_INTERNALGENERATOR m_device->debug ("before parainfo seek next page: ", m_device->tellInternal ()); #endif if (!seekNextPage ()) return false; #ifdef DEBUG_INTERNALGENERATOR m_device->debug ("!!!! InternalGenerator: Write paragraphInfo; page=", m_device->tellInternal () / 128); #endif FormatParaProperty defaultParaProperty; defaultParaProperty.setMargins (m_pageLayout->getLeftMargin (), m_pageLayout->getRightMargin ()); // write paragraphInfo pages m_paragraphInfo->setDevice (m_device); m_paragraphInfo->setHeader (m_header); m_paragraphInfo->setMargins (m_pageLayout->getLeftMargin (), m_pageLayout->getRightMargin ()); if (!m_paragraphInfo->writeToDevice (&defaultParaProperty)) return false; #ifdef DEBUG_INTERNALGENERATOR m_device->debug ("!!!! InternalGenerator: Write footnoteTable\n"); #endif // there's "no such thing (tm)" as a FootnoteTable m_header->setPageFootnoteTable ((m_device->tellInternal () + 127) / 128); if (!seekNextPage ()) return false; #ifdef DEBUG_INTERNALGENERATOR m_device->debug ("!!!! InternalGenerator: Write pageLayout; page=", m_device->tellInternal () / 128); #endif m_pageLayout->setDevice (m_device); m_pageLayout->setHeader (m_header); if (!m_pageLayout->writeToDevice ()) return false; #ifdef DEBUG_INTERNALGENERATOR m_device->debug ("!!!! InternalGenerator: Write sectionTable\n"); #endif if (!seekNextPage ()) return false; m_sectionTable->setDevice (m_device); m_sectionTable->setHeader (m_header); if (!m_sectionTable->writeToDevice (m_pageLayout->getIsModified ())) return false; #ifdef DEBUG_INTERNALGENERATOR m_device->debug ("!!!! InternalGenerator: Write pageTable\n"); #endif if (!seekNextPage ()) return false; m_pageTable->setDevice (m_device); m_pageTable->setHeader (m_header); m_pageTable->setPageNumberStart (m_pageLayout->getPageNumberStart ()); if (!m_pageTable->writeToDevice ()) return false; #ifdef DEBUG_INTERNALGENERATOR m_device->debug ("!!!! InternalGenerator: Write fontTable\n"); #endif if (!seekNextPage ()) return false; m_fontTable->setDevice (m_device); m_fontTable->setHeader (m_header); if (!m_fontTable->writeToDevice ()) return false; #ifdef DEBUG_INTERNALGENERATOR m_device->debug ("!!!! InternalGenerator: Write header\n"); #endif // write header m_header->setFormat (format); m_header->setNumPages ((m_device->tellInternal () + 127) / 128); m_header->setDevice (m_device); if (!m_device->seekInternal (0 * 128, SEEK_SET)) return false; if (!m_header->writeToDevice ()) return false; // pad up to 128 (it seems that the ms programmers really did expect 128-byte pages) // BTW, if you look in a Write file, you can normally see some garbage after the // fontTable that appears to be part of an earlier part of the document // (or even some _other_ document!) suggesting that ms really did reuse their memory // and that we shouldn't be all that concerned with "unknown", "reserved" and "zero" // fields if (!m_device->seekInternal (m_header->getNumPages () * 128, SEEK_SET)) return false; return true; }