status_t MyVorbisExtractor::init() { mMeta = new MetaData; mMeta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_VORBIS); MediaBuffer *packet; status_t err; if ((err = readNextPacket(&packet)) != OK) { return err; } ALOGV("read packet of size %d\n", packet->range_length()); err = verifyHeader(packet, 1); packet->release(); packet = NULL; if (err != OK) { return err; } if ((err = readNextPacket(&packet)) != OK) { return err; } ALOGV("read packet of size %d\n", packet->range_length()); err = verifyHeader(packet, 3); packet->release(); packet = NULL; if (err != OK) { return err; } if ((err = readNextPacket(&packet)) != OK) { return err; } ALOGV("read packet of size %d\n", packet->range_length()); err = verifyHeader(packet, 5); packet->release(); packet = NULL; if (err != OK) { return err; } mFirstDataOffset = mOffset + mCurrentPageSize; off64_t size; uint64_t lastGranulePosition; if (mSource->getSize(&size) == OK && findPrevGranulePosition(size, &lastGranulePosition) == OK) { // Let's assume it's cheap to seek to the end. // The granule position of the final page in the stream will // give us the exact duration of the content, something that // we can only approximate using avg. bitrate if seeking to // the end is too expensive or impossible (live streaming). int64_t durationUs = lastGranulePosition * 1000000ll / mVi.rate; mMeta->setInt64(kKeyDuration, durationUs); buildTableOfContents(); } return OK; }
void AVIDecoder::readNextPacket() { uint32 nextTag = _fileStream->readUint32BE(); uint32 size = _fileStream->readUint32LE(); if (_fileStream->eos()) return; if (nextTag == ID_LIST) { // A list of audio/video chunks int32 startPos = _fileStream->pos(); if (_fileStream->readUint32BE() != ID_REC) error("Expected 'rec ' LIST"); size -= 4; // subtract list type // Decode chunks in the list while (_fileStream->pos() < startPos + (int32)size) readNextPacket(); return; } else if (nextTag == ID_JUNK || nextTag == ID_IDX1) { skipChunk(size); return; } Track *track = getTrack(getStreamIndex(nextTag)); if (!track) error("Cannot get track from tag '%s'", tag2str(nextTag)); Common::SeekableReadStream *chunk = 0; if (size != 0) { chunk = _fileStream->readStream(size); _fileStream->skip(size & 1); } if (track->getTrackType() == Track::kTrackTypeAudio) { if (getStreamType(nextTag) != kStreamTypeAudio) error("Invalid audio track tag '%s'", tag2str(nextTag)); assert(chunk); ((AVIAudioTrack *)track)->queueSound(chunk); } else { AVIVideoTrack *videoTrack = (AVIVideoTrack *)track; if (getStreamType(nextTag) == kStreamTypePaletteChange) { // Palette Change videoTrack->loadPaletteFromChunk(chunk); } else if (getStreamType(nextTag) == kStreamTypeRawVideo) { // TODO: Check if this really is uncompressed. Many videos // falsely put compressed data in here. error("Uncompressed AVI frame found"); } else { // Otherwise, assume it's a compressed frame videoTrack->decodeFrame(chunk); } } }
void RemoteBlockReader::skip(int64_t len) { int64_t todo = len; assert(cursor + len <= endOffset); try { while (todo > 0) { if (cursor >= endOffset) { THROW(HdfsIOException, "RemoteBlockReader: skip over block end from Datanode: %s, Block: %s.", datanode.formatAddress().c_str(), binfo.toString().c_str()); } if (position >= size) { readNextPacket(); } int batch = size - position; batch = batch < todo ? batch : static_cast<int>(todo); position += batch; cursor += batch; todo -= batch; } } catch (const HdfsTimeoutException & e) { NESTED_THROW(HdfsIOException, "RemoteBlockReader: failed to read Block: %s from Datanode: %s.", binfo.toString().c_str(), datanode.formatAddress().c_str()); } catch (const HdfsNetworkException & e) { NESTED_THROW(HdfsIOException, "RemoteBlockReader: failed to read Block: %s from Datanode: %s.", binfo.toString().c_str(), datanode.formatAddress().c_str()); } }
int32_t RemoteBlockReader::read(char * buf, int32_t len) { assert(0 != len && NULL != buf); if (cursor >= endOffset) { THROW(HdfsIOException, "RemoteBlockReader: read over block end from Datanode: %s, Block: %s.", datanode.formatAddress().c_str(), binfo.toString().c_str()); } try { if (position >= size) { readNextPacket(); } int32_t todo = len < size - position ? len : size - position; memcpy(buf, &buffer[position], todo); position += todo; cursor += todo; return todo; } catch (const HdfsTimeoutException & e) { NESTED_THROW(HdfsIOException, "RemoteBlockReader: failed to read Block: %s from Datanode: %s.", binfo.toString().c_str(), datanode.formatAddress().c_str()); } catch (const HdfsNetworkException & e) { NESTED_THROW(HdfsIOException, "RemoteBlockReader: failed to read Block: %s from Datanode: %s.", binfo.toString().c_str(), datanode.formatAddress().c_str()); } }
status_t MyVorbisExtractor::init() { mMeta = new MetaData; mMeta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_VORBIS); MediaBuffer *packet; status_t err; if ((err = readNextPacket(&packet)) != OK) { return err; } LOGV("read packet of size %d\n", packet->range_length()); err = verifyHeader(packet, 1); packet->release(); packet = NULL; if (err != OK) { return err; } if ((err = readNextPacket(&packet)) != OK) { return err; } LOGV("read packet of size %d\n", packet->range_length()); err = verifyHeader(packet, 3); packet->release(); packet = NULL; if (err != OK) { return err; } if ((err = readNextPacket(&packet)) != OK) { return err; } LOGV("read packet of size %d\n", packet->range_length()); err = verifyHeader(packet, 5); packet->release(); packet = NULL; if (err != OK) { return err; } mFirstDataOffset = mOffset + mCurrentPageSize; return OK; }
const Graphics::Surface *VideoDecoder::decodeNextFrame() { _needsUpdate = false; readNextPacket(); VideoTrack *track = findNextVideoTrack(); if (!track) return 0; const Graphics::Surface *frame = track->decodeNextFrame(); if (track->hasDirtyPalette()) { _palette = track->getPalette(); _dirtyPalette = true; } return frame; }
const Graphics::Surface *VideoDecoder::decodeNextFrame() { _needsUpdate = false; readNextPacket(); // If we have no next video track at this point, there shouldn't be // any frame available for us to display. if (!_nextVideoTrack) return 0; const Graphics::Surface *frame = _nextVideoTrack->decodeNextFrame(); if (_nextVideoTrack->hasDirtyPalette()) { _palette = _nextVideoTrack->getPalette(); _dirtyPalette = true; } // Look for the next video track here for the next decode. findNextVideoTrack(); return frame; }
struct jobInfoEnt * lsb_readjobinfo(int *more) { XDR xdrs; int num, i, aa; struct LSFHeader hdr; char *buffer = NULL; static struct jobInfoReply jobInfoReply; static struct jobInfoEnt jobInfo; static struct submitReq submitReq; static int first = TRUE; static int npids = 0; static struct pidInfo *pidInfo = NULL; static int npgids = 0; static int *pgid = NULL; TIMEIT(0, (num = readNextPacket(&buffer, _lsb_recvtimeout, &hdr, mbdSock)), "readNextPacket"); if (num < 0) { closeSession(mbdSock); lsberrno = LSBE_EOF; return NULL; } if (first) { if ( (submitReq.fromHost = malloc(MAXHOSTNAMELEN)) == NULL || (submitReq.jobFile = malloc(MAXFILENAMELEN)) == NULL || (submitReq.inFile = malloc(MAXFILENAMELEN)) == NULL || (submitReq.outFile = malloc(MAXFILENAMELEN)) == NULL || (submitReq.errFile = malloc(MAXFILENAMELEN)) == NULL || (submitReq.inFileSpool = malloc(MAXFILENAMELEN)) == NULL || (submitReq.commandSpool = malloc(MAXFILENAMELEN)) == NULL || (submitReq.hostSpec = malloc(MAXHOSTNAMELEN)) == NULL || (submitReq.chkpntDir = malloc(MAXFILENAMELEN)) == NULL || (submitReq.subHomeDir = malloc(MAXFILENAMELEN)) == NULL || (jobInfoReply.userName = malloc(MAXLSFNAMELEN)) == NULL || (submitReq.cwd = malloc(MAXFILENAMELEN)) == NULL) { lsberrno = LSBE_NO_MEM; FREEUP(submitReq.fromHost); FREEUP(submitReq.jobFile); FREEUP(submitReq.inFile); FREEUP(submitReq.outFile); FREEUP(submitReq.errFile); FREEUP(submitReq.inFileSpool); FREEUP(submitReq.commandSpool); FREEUP(submitReq.hostSpec); FREEUP(submitReq.chkpntDir); FREEUP(submitReq.subHomeDir); FREEUP(jobInfoReply.userName); FREEUP(submitReq.cwd); free(buffer); return NULL; } submitReq.xf = NULL; submitReq.nxf = 0; jobInfoReply.numToHosts = 0; submitReq.numAskedHosts = 0; first = FALSE; } jobInfoReply.jobBill = &submitReq; if (jobInfoReply.numToHosts > 0) { for (i=0; i<jobInfoReply.numToHosts; i++) FREEUP(jobInfoReply.toHosts[i]); FREEUP(jobInfoReply.toHosts); jobInfoReply.numToHosts = 0; jobInfoReply.toHosts = NULL; } if (submitReq.xf) { free(submitReq.xf); submitReq.xf = NULL; } FREEUP( jobInfoReply.execHome ); FREEUP( jobInfoReply.execCwd ); FREEUP( jobInfoReply.execUsername ); FREEUP( jobInfoReply.parentGroup ); FREEUP( jobInfoReply.jName ); TIMEIT(1, xdrmem_create(&xdrs, buffer, XDR_DECODE_SIZE_(hdr.length), XDR_DECODE), "xdrmem_create"); TIMEIT(1, (aa = xdr_jobInfoReply(&xdrs, &jobInfoReply, &hdr)), "xdr_jobInfoReply"); if (aa == FALSE) { lsberrno = LSBE_XDR; xdr_destroy(&xdrs); free(buffer); jobInfoReply.toHosts = NULL; jobInfoReply.numToHosts = 0; return NULL; } TIMEIT(1, xdr_destroy(&xdrs), "xdr_destroy"); free(buffer); jobInfo.jobId = jobInfoReply.jobId; jobInfo.status = jobInfoReply.status; jobInfo.numReasons = jobInfoReply.numReasons; jobInfo.reasonTb = jobInfoReply.reasonTb; jobInfo.reasons = jobInfoReply.reasons; jobInfo.subreasons = jobInfoReply.subreasons; jobInfo.startTime = jobInfoReply.startTime; jobInfo.predictedStartTime = jobInfoReply.predictedStartTime; jobInfo.endTime = jobInfoReply.endTime; jobInfo.cpuTime = jobInfoReply.cpuTime; jobInfo.numExHosts = jobInfoReply.numToHosts; jobInfo.exHosts = jobInfoReply.toHosts; jobInfo.nIdx = jobInfoReply.nIdx; jobInfo.loadSched = jobInfoReply.loadSched; jobInfo.loadStop = jobInfoReply.loadStop; jobInfo.exitStatus = jobInfoReply.exitStatus; jobInfo.reserveTime = jobInfoReply.reserveTime; jobInfo.jobPid = jobInfoReply.jobPid; jobInfo.port = jobInfoReply.port; jobInfo.jobPriority = jobInfoReply.jobPriority; jobInfo.user = jobInfoReply.userName; jobInfo.execUid = jobInfoReply.execUid; jobInfo.execHome = jobInfoReply.execHome; jobInfo.execCwd = jobInfoReply.execCwd; jobInfo.execUsername = jobInfoReply.execUsername; jobInfo.jType = jobInfoReply.jType; jobInfo.parentGroup = jobInfoReply.parentGroup; jobInfo.jName = jobInfoReply.jName; for (i=0; i<NUM_JGRP_COUNTERS; i++) jobInfo.counter[i] = jobInfoReply.counter[i]; jobInfo.submitTime = jobInfoReply.jobBill->submitTime; jobInfo.umask = jobInfoReply.jobBill->umask; jobInfo.cwd = jobInfoReply.jobBill->cwd; jobInfo.subHomeDir = jobInfoReply.jobBill->subHomeDir; jobInfo.submit.options = jobInfoReply.jobBill->options; jobInfo.submit.options2 = jobInfoReply.jobBill->options2; jobInfo.submit.numProcessors = jobInfoReply.jobBill->numProcessors; jobInfo.submit.maxNumProcessors = jobInfoReply.jobBill->maxNumProcessors; jobInfo.submit.jobName = jobInfoReply.jobBill->jobName; jobInfo.submit.command = jobInfoReply.jobBill->command; jobInfo.submit.resReq = jobInfoReply.jobBill->resReq; jobInfo.submit.queue = jobInfoReply.jobBill->queue; jobInfo.fromHost = jobInfoReply.jobBill->fromHost; jobInfo.submit.inFile = jobInfoReply.jobBill->inFile; jobInfo.submit.outFile = jobInfoReply.jobBill->outFile; jobInfo.submit.errFile = jobInfoReply.jobBill->errFile; jobInfo.submit.beginTime = jobInfoReply.jobBill->beginTime; jobInfo.submit.termTime = jobInfoReply.jobBill->termTime; jobInfo.submit.userPriority = jobInfoReply.jobBill->userPriority; for (i=0; i<LSF_RLIM_NLIMITS; i++) { jobInfo.submit.rLimits[i] = jobInfoReply.jobBill->rLimits[i]; } jobInfo.submit.hostSpec = jobInfoReply.jobBill->hostSpec; jobInfo.submit.sigValue = jobInfoReply.jobBill->sigValue; jobInfo.submit.chkpntDir = jobInfoReply.jobBill->chkpntDir; jobInfo.submit.dependCond = jobInfoReply.jobBill->dependCond; jobInfo.submit.preExecCmd = jobInfoReply.jobBill->preExecCmd; jobInfo.submit.chkpntPeriod = jobInfoReply.jobBill->chkpntPeriod; jobInfo.submit.numAskedHosts = jobInfoReply.jobBill->numAskedHosts; jobInfo.submit.askedHosts = jobInfoReply.jobBill->askedHosts; jobInfo.submit.projectName = jobInfoReply.jobBill->projectName; jobInfo.submit.mailUser = jobInfoReply.jobBill->mailUser; jobInfo.submit.loginShell = jobInfoReply.jobBill->loginShell; jobInfo.submit.nxf = jobInfoReply.jobBill->nxf; jobInfo.submit.xf = jobInfoReply.jobBill->xf; jobInfo.jRusageUpdateTime = jobInfoReply.jRusageUpdateTime; jobInfo.runRusage.npids = npids; jobInfo.runRusage.pidInfo = pidInfo; jobInfo.runRusage.npgids = npgids; jobInfo.runRusage.pgid = pgid; copyJUsage(&(jobInfo.runRusage), &jobInfoReply.runRusage); npids = jobInfo.runRusage.npids; pidInfo = jobInfo.runRusage.pidInfo; npgids = jobInfo.runRusage.npgids; pgid = jobInfo.runRusage.pgid; if (jobInfoReply.runRusage.npids > 0) { FREEUP(jobInfoReply.runRusage.pidInfo); jobInfoReply.runRusage.npids = 0; } if (jobInfoReply.runRusage.npgids > 0) { FREEUP(jobInfoReply.runRusage.pgid); jobInfoReply.runRusage.npgids = 0; } if (more) *more = hdr.reserved; return &jobInfo; }
void AVIDecoder::readNextPacket() { uint32 nextTag = _fileStream->readUint32BE(); uint32 size = _fileStream->readUint32LE(); if (_fileStream->eos()) return; if (nextTag == ID_LIST) { // A list of audio/video chunks int32 startPos = _fileStream->pos(); if (_fileStream->readUint32BE() != ID_REC) error("Expected 'rec ' LIST"); size -= 4; // subtract list type // Decode chunks in the list while (_fileStream->pos() < startPos + (int32)size) readNextPacket(); return; } else if (nextTag == ID_JUNK || nextTag == ID_IDX1) { skipChunk(size); return; } Track *track = getTrack(getStreamIndex(nextTag)); if (!track) error("Cannot get track from tag '%s'", tag2str(nextTag)); Common::SeekableReadStream *chunk = 0; if (size != 0) { chunk = _fileStream->readStream(size); _fileStream->skip(size & 1); } if (track->getTrackType() == Track::kTrackTypeAudio) { if (getStreamType(nextTag) != MKTAG16('w', 'b')) error("Invalid audio track tag '%s'", tag2str(nextTag)); assert(chunk); ((AVIAudioTrack *)track)->queueSound(chunk); } else { AVIVideoTrack *videoTrack = (AVIVideoTrack *)track; if (getStreamType(nextTag) == MKTAG16('p', 'c')) { // Palette Change assert(chunk); byte firstEntry = chunk->readByte(); uint16 numEntries = chunk->readByte(); chunk->readUint16LE(); // Reserved // 0 entries means all colors are going to be changed if (numEntries == 0) numEntries = 256; byte *palette = const_cast<byte *>(videoTrack->getPalette()); for (uint16 i = firstEntry; i < numEntries + firstEntry; i++) { palette[i * 3] = chunk->readByte(); palette[i * 3 + 1] = chunk->readByte(); palette[i * 3 + 2] = chunk->readByte(); chunk->readByte(); // Flags that don't serve us any purpose } delete chunk; videoTrack->markPaletteDirty(); } else if (getStreamType(nextTag) == MKTAG16('d', 'b')) { // TODO: Check if this really is uncompressed. Many videos // falsely put compressed data in here. error("Uncompressed AVI frame found"); } else { // Otherwise, assume it's a compressed frame videoTrack->decodeFrame(chunk); } } }
void AVIDecoder::readNextPacket() { if ((uint32)_fileStream->pos() >= _movieListEnd) { // Ugh, reached the end premature. forceVideoEnd(); return; } uint32 nextTag = _fileStream->readUint32BE(); uint32 size = _fileStream->readUint32LE(); if (_fileStream->eos()) { // Also premature end. forceVideoEnd(); return; } if (nextTag == ID_LIST) { // A list of audio/video chunks int32 startPos = _fileStream->pos(); if (_fileStream->readUint32BE() != ID_REC) error("Expected 'rec ' LIST"); size -= 4; // subtract list type // Decode chunks in the list while (_fileStream->pos() < startPos + (int32)size) readNextPacket(); return; } else if (nextTag == ID_JUNK || nextTag == ID_IDX1) { skipChunk(size); return; } Track *track = getTrack(getStreamIndex(nextTag)); if (!track) error("Cannot get track from tag '%s'", tag2str(nextTag)); Common::SeekableReadStream *chunk = 0; if (size != 0) { chunk = _fileStream->readStream(size); _fileStream->skip(size & 1); } if (track->getTrackType() == Track::kTrackTypeAudio) { if (getStreamType(nextTag) != kStreamTypeAudio) error("Invalid audio track tag '%s'", tag2str(nextTag)); assert(chunk); ((AVIAudioTrack *)track)->queueSound(chunk); } else { AVIVideoTrack *videoTrack = (AVIVideoTrack *)track; if (getStreamType(nextTag) == kStreamTypePaletteChange) { // Palette Change videoTrack->loadPaletteFromChunk(chunk); } else { // Otherwise, assume it's a compressed frame videoTrack->decodeFrame(chunk); } } }