Exemple #1
0
void RobotDecoder::initRecordAndCuePositions() {
	PositionList recordSizes;
	_videoSizes.reserve(_numFramesTotal);
	_recordPositions.reserve(_numFramesTotal);
	recordSizes.reserve(_numFramesTotal);

	switch(_version) {
	case 5: // 16-bit sizes and positions
		for (int i = 0; i < _numFramesTotal; ++i) {
			_videoSizes.push_back(_stream->readUint16());
		}
		for (int i = 0; i < _numFramesTotal; ++i) {
			recordSizes.push_back(_stream->readUint16());
		}
		break;
	case 6: // 32-bit sizes and positions
		for (int i = 0; i < _numFramesTotal; ++i) {
			_videoSizes.push_back(_stream->readSint32());
		}
		for (int i = 0; i < _numFramesTotal; ++i) {
			recordSizes.push_back(_stream->readSint32());
		}
		break;
	default:
		error("Unknown Robot version %d", _version);
	}

	for (int i = 0; i < kCueListSize; ++i) {
		_cueTimes[i] = _stream->readSint32();
	}

	for (int i = 0; i < kCueListSize; ++i) {
		_cueValues[i] = _stream->readUint16();
	}

	Common::copy(_cueTimes, _cueTimes + kCueListSize, _masterCueTimes);

	int bytesRemaining = (_stream->pos() - _fileOffset) % kRobotFrameSize;
	if (bytesRemaining != 0) {
		_stream->seek(kRobotFrameSize - bytesRemaining, SEEK_CUR);
	}

	int position = _stream->pos();
	_recordPositions.push_back(position);
	for (int i = 0; i < _numFramesTotal - 1; ++i) {
		position += recordSizes[i];
		_recordPositions.push_back(position);
	}
}