Search in sources :

Example 1 with MediaType

use of org.vitrivr.cineast.core.data.MediaType in project cineast by vitrivr.

the class GenericExtractionItemHandler method run.

@Override
@SuppressWarnings("unchecked")
public void run() {
    LOGGER.info("Starting extraction");
    this.executorService.execute(pipeline);
    final ObjectIdGenerator generator = this.context.objectIdGenerator();
    Pair<ExtractionItemContainer, MediaType> pair = null;
    /* Initalize all Metadata Extractors */
    for (MetadataExtractor extractor : this.metadataExtractors) {
        LOGGER.debug("Initializing metadata extractor {}", extractor.getClass().getSimpleName());
        if (extractor instanceof MetadataFeatureModule) {
            ((MetadataFeatureModule<?>) extractor).init(this.context.persistencyWriter());
        } else {
            extractor.init();
        }
    }
    /* Process until there's nothing left*/
    while ((pair = this.nextItem()) != null) {
        try {
            LOGGER.debug("Processing path {} and mediatype {}", pair.getLeft(), pair.getRight());
            if (handlerCache.get(pair.getRight()) == null) {
                LOGGER.error("Unknown mediatype {}, exiting extraction", pair.getRight());
                break;
            }
            /* Clear non-reusable segmenter */
            handlerCache.compute(pair.getRight(), (mediaType, cache) -> {
                Decoder decoder = null;
                if (cache.getLeft() != null) {
                    if (cache.getLeft().canBeReused()) {
                        decoder = cache.getLeft();
                    }
                }
                return ImmutablePair.of(decoder, null);
            });
            /* Put a new decoder in the cache if there's not one already there */
            if (handlerCache.get(pair.getRight()).getLeft() == null) {
                Decoder decoder = handlers.get(pair.getRight()).getLeft().get();
                handlerCache.compute(pair.getRight(), (mediaType, cache) -> new ImmutablePair<>(decoder, cache.getRight()));
            }
            /* Put a new segmenter in the cache if there's not one already there */
            if (handlerCache.get(pair.getRight()).getRight() == null) {
                Segmenter segmenter = handlers.get(pair.getRight()).getRight().get();
                handlerCache.compute(pair.getRight(), (mediaType, cache) -> new ImmutablePair<>(cache.getLeft(), segmenter));
            }
            Decoder decoder = handlerCache.get(pair.getRight()).getLeft();
            Segmenter segmenter = handlers.get(pair.getRight()).getRight().get();
            if (decoder.init(pair.getLeft().getPathForExtraction(), Config.sharedConfig().getDecoders().get(pair.getRight()), Config.sharedConfig().getCache())) {
                /* Create / lookup MediaObjectDescriptor for new file. */
                final MediaObjectDescriptor descriptor = this.fetchOrCreateMultimediaObjectDescriptor(generator, pair.getLeft(), pair.getRight());
                if (!this.checkAndPersistMultimediaObject(descriptor)) {
                    continue;
                }
                final String objectId = descriptor.getObjectId();
                int segmentNumber = 1;
                segmenter.init(decoder, descriptor);
                this.executorService.execute(segmenter);
                while (!segmenter.complete()) {
                    try {
                        final SegmentContainer container = segmenter.getNext();
                        if (container != null) {
                            /* Create segment-descriptor and try to persist it. */
                            MediaSegmentDescriptor mediaSegmentDescriptor;
                            if (container.getId() != null) {
                                mediaSegmentDescriptor = this.fetchOrCreateSegmentDescriptor(objectId, container.getId(), segmentNumber, container.getStart(), container.getEnd(), container.getAbsoluteStart(), container.getAbsoluteEnd());
                            /* Special case; segment ID is determined by container (image sequences only) */
                            } else {
                                mediaSegmentDescriptor = this.fetchOrCreateSegmentDescriptor(objectId, segmentNumber, container.getStart(), container.getEnd(), container.getAbsoluteStart(), container.getAbsoluteEnd());
                            }
                            container.setId(mediaSegmentDescriptor.getSegmentId());
                            container.setSuperId(mediaSegmentDescriptor.getObjectId());
                            if (!this.checkAndPersistSegment(mediaSegmentDescriptor)) {
                                continue;
                            }
                            int emissionTimeout = 1000;
                            while (!this.pipeline.emit(container, emissionTimeout)) {
                                LOGGER.debug("ExtractionPipeline is full - deferring emission of segment. Consider increasing the thread-pool count for the extraction pipeline.");
                                Thread.sleep(emissionTimeout);
                            // emissionTimeout += 500;
                            }
                            segmentNumber += 1;
                        }
                    } catch (InterruptedException e) {
                        LOGGER.log(Level.ERROR, "Thread was interrupted while the extraction process was running. Aborting...");
                        break;
                    }
                }
                List<MediaObjectMetadataDescriptor> metadata = pair.getLeft().getMetadata().stream().map(el -> MediaObjectMetadataDescriptor.fromExisting(el, objectId)).collect(Collectors.toList());
                this.metadataWriter.write(metadata);
                /* Extract metadata. */
                this.extractAndPersistMetadata(pair.getLeft(), objectId);
                /* Force flush the segment, object and metadata information. */
                this.mediaSegmentWriter.flush();
                this.objectWriter.flush();
                this.metadataWriter.flush();
            } else {
                LOGGER.error("Failed to initialize decoder. File is being skipped...");
            }
            /* Increment the files counter. */
            this.count_processed += 1;
            /*  Create new decoder pair for a new file if the decoder reports that it cannot be reused.*/
            if (!decoder.canBeReused()) {
                decoder.close();
                final MediaType type = pair.getRight();
                handlerCache.compute(type, (mediaType, cache) -> ImmutablePair.of(handlers.get(type).getLeft().get(), cache.getRight()));
            }
            for (ExtractionCompleteListener completeListener : this.completeListeners) {
                completeListener.onCompleted(pair.getLeft());
            }
            /*
         * Trigger garbage collection once in a while. This is specially relevant when many small files are processed, since unused allocated memory could accumulate and trigger swapping.
         */
            if (this.count_processed % 50 == 0) {
                System.gc();
            }
        } catch (Throwable t) {
            LOGGER.error("Exception while processing path {}, {}", pair.getLeft(), t.getMessage());
            t.printStackTrace();
        }
    }
    shutdown();
}
Also used : MetadataFeatureModule(org.vitrivr.cineast.core.features.abstracts.MetadataFeatureModule) MimeTypeHelper(org.vitrivr.cineast.core.util.MimeTypeHelper) Level(org.apache.logging.log4j.Level) MediaObjectDescriptor(org.vitrivr.cineast.core.data.entities.MediaObjectDescriptor) StringUtils(org.apache.commons.lang3.StringUtils) ExtractionContextProvider(org.vitrivr.cineast.core.extraction.ExtractionContextProvider) Pair(org.apache.commons.lang3.tuple.Pair) MediaObjectReader(org.vitrivr.cineast.core.db.dao.reader.MediaObjectReader) SegmentContainer(org.vitrivr.cineast.core.data.segments.SegmentContainer) Map(java.util.Map) Path(java.nio.file.Path) MediaSegmentDescriptor(org.vitrivr.cineast.core.data.entities.MediaSegmentDescriptor) ImageSequenceDecoder(org.vitrivr.cineast.core.extraction.decode.image.ImageSequenceDecoder) IdConfig(org.vitrivr.cineast.core.config.IdConfig) MediaObjectMetadataWriter(org.vitrivr.cineast.core.db.dao.writer.MediaObjectMetadataWriter) ExtractionPipeline(org.vitrivr.cineast.standalone.runtime.ExtractionPipeline) Collectors(java.util.stream.Collectors) Executors(java.util.concurrent.Executors) List(java.util.List) Logger(org.apache.logging.log4j.Logger) MediaSegmentWriter(org.vitrivr.cineast.core.db.dao.writer.MediaSegmentWriter) Optional(java.util.Optional) LogHelper(org.vitrivr.cineast.core.util.LogHelper) ModularMeshDecoder(org.vitrivr.cineast.core.extraction.decode.m3d.ModularMeshDecoder) MediaType(org.vitrivr.cineast.core.data.MediaType) ImageSequenceSegmenter(org.vitrivr.cineast.core.extraction.segmenter.image.ImageSequenceSegmenter) Config(org.vitrivr.cineast.standalone.config.Config) ReflectionHelper(org.vitrivr.cineast.core.util.ReflectionHelper) Model3DSegment(org.vitrivr.cineast.core.data.segments.Model3DSegment) DBSelector(org.vitrivr.cineast.core.db.DBSelector) HashMap(java.util.HashMap) Decoder(org.vitrivr.cineast.core.extraction.decode.general.Decoder) MediaObjectMetadataDescriptor(org.vitrivr.cineast.core.data.entities.MediaObjectMetadataDescriptor) Supplier(java.util.function.Supplier) ArrayList(java.util.ArrayList) Mesh(org.vitrivr.cineast.core.data.m3d.Mesh) PersistencyWriter(org.vitrivr.cineast.core.db.PersistencyWriter) FFMpegVideoDecoder(org.vitrivr.cineast.core.extraction.decode.video.FFMpegVideoDecoder) ExecutorService(java.util.concurrent.ExecutorService) Segmenter(org.vitrivr.cineast.core.extraction.segmenter.general.Segmenter) Files(java.nio.file.Files) MediaSegmentReader(org.vitrivr.cineast.core.db.dao.reader.MediaSegmentReader) ConstantLengthAudioSegmenter(org.vitrivr.cineast.core.extraction.segmenter.audio.ConstantLengthAudioSegmenter) MetadataExtractor(org.vitrivr.cineast.core.extraction.metadata.MetadataExtractor) PassthroughSegmenter(org.vitrivr.cineast.core.extraction.segmenter.general.PassthroughSegmenter) ObjectIdGenerator(org.vitrivr.cineast.core.extraction.idgenerator.ObjectIdGenerator) IngestConfig(org.vitrivr.cineast.standalone.config.IngestConfig) ImmutablePair(org.apache.commons.lang3.tuple.ImmutablePair) TimeUnit(java.util.concurrent.TimeUnit) Paths(java.nio.file.Paths) FFMpegAudioDecoder(org.vitrivr.cineast.core.extraction.decode.audio.FFMpegAudioDecoder) MediaObjectWriter(org.vitrivr.cineast.core.db.dao.writer.MediaObjectWriter) DefaultImageDecoder(org.vitrivr.cineast.core.extraction.decode.image.DefaultImageDecoder) VideoHistogramSegmenter(org.vitrivr.cineast.core.extraction.segmenter.video.VideoHistogramSegmenter) LogManager(org.apache.logging.log4j.LogManager) ImageSegmenter(org.vitrivr.cineast.core.extraction.segmenter.image.ImageSegmenter) ObjectIdGenerator(org.vitrivr.cineast.core.extraction.idgenerator.ObjectIdGenerator) MediaObjectDescriptor(org.vitrivr.cineast.core.data.entities.MediaObjectDescriptor) MetadataFeatureModule(org.vitrivr.cineast.core.features.abstracts.MetadataFeatureModule) ImageSequenceSegmenter(org.vitrivr.cineast.core.extraction.segmenter.image.ImageSequenceSegmenter) Segmenter(org.vitrivr.cineast.core.extraction.segmenter.general.Segmenter) ConstantLengthAudioSegmenter(org.vitrivr.cineast.core.extraction.segmenter.audio.ConstantLengthAudioSegmenter) PassthroughSegmenter(org.vitrivr.cineast.core.extraction.segmenter.general.PassthroughSegmenter) VideoHistogramSegmenter(org.vitrivr.cineast.core.extraction.segmenter.video.VideoHistogramSegmenter) ImageSegmenter(org.vitrivr.cineast.core.extraction.segmenter.image.ImageSegmenter) ImageSequenceDecoder(org.vitrivr.cineast.core.extraction.decode.image.ImageSequenceDecoder) ModularMeshDecoder(org.vitrivr.cineast.core.extraction.decode.m3d.ModularMeshDecoder) Decoder(org.vitrivr.cineast.core.extraction.decode.general.Decoder) FFMpegVideoDecoder(org.vitrivr.cineast.core.extraction.decode.video.FFMpegVideoDecoder) FFMpegAudioDecoder(org.vitrivr.cineast.core.extraction.decode.audio.FFMpegAudioDecoder) DefaultImageDecoder(org.vitrivr.cineast.core.extraction.decode.image.DefaultImageDecoder) MediaSegmentDescriptor(org.vitrivr.cineast.core.data.entities.MediaSegmentDescriptor) MediaType(org.vitrivr.cineast.core.data.MediaType) MetadataExtractor(org.vitrivr.cineast.core.extraction.metadata.MetadataExtractor) SegmentContainer(org.vitrivr.cineast.core.data.segments.SegmentContainer) MediaObjectMetadataDescriptor(org.vitrivr.cineast.core.data.entities.MediaObjectMetadataDescriptor)

Example 2 with MediaType

use of org.vitrivr.cineast.core.data.MediaType in project cineast by vitrivr.

the class GenericExtractionItemHandler method mergeItem.

/**
 * create a new descriptor based on the provided one.
 * <p>
 * if an id is already given in the descriptor, it takes precedence over generating a new one. if a new path is provided as an argument, it takes precedence over one which might already be existing in the descriptor. if a new type is provided as an argument, it takes precedence over one which might already be existing in the descriptor.
 * <p>
 * The exists variable is taken from the provided descriptor, since that is more current than the one provided in the item
 */
public static MediaObjectDescriptor mergeItem(MediaObjectDescriptor descriptor, ObjectIdGenerator generator, ExtractionItemContainer item, MediaType type) {
    Path _path = item.getPathForExtraction() == null ? Paths.get(descriptor.getPath()) : item.getPathForExtraction();
    String _name = StringUtils.isEmpty(item.getObject().getName()) ? StringUtils.isEmpty(descriptor.getName()) ? MediaObjectDescriptor.cleanPath(_path.getFileName()) : descriptor.getName() : item.getObject().getName();
    boolean exists = descriptor.exists();
    MediaType _type = type == null ? descriptor.getMediatype() : type;
    String _id = StringUtils.isEmpty(item.getObject().getObjectId()) ? StringUtils.isEmpty(descriptor.getObjectId()) ? generator.next(_path, _type) : descriptor.getObjectId() : item.getObject().getObjectId();
    String storagePath = StringUtils.isEmpty(item.getObject().getPath()) ? descriptor.getPath() : item.getObject().getPath();
    return new MediaObjectDescriptor(_id, _name, storagePath, _type, exists);
}
Also used : Path(java.nio.file.Path) MediaObjectDescriptor(org.vitrivr.cineast.core.data.entities.MediaObjectDescriptor) MediaType(org.vitrivr.cineast.core.data.MediaType)

Aggregations

Path (java.nio.file.Path)2 MediaType (org.vitrivr.cineast.core.data.MediaType)2 MediaObjectDescriptor (org.vitrivr.cineast.core.data.entities.MediaObjectDescriptor)2 Files (java.nio.file.Files)1 Paths (java.nio.file.Paths)1 ArrayList (java.util.ArrayList)1 HashMap (java.util.HashMap)1 List (java.util.List)1 Map (java.util.Map)1 Optional (java.util.Optional)1 ExecutorService (java.util.concurrent.ExecutorService)1 Executors (java.util.concurrent.Executors)1 TimeUnit (java.util.concurrent.TimeUnit)1 Supplier (java.util.function.Supplier)1 Collectors (java.util.stream.Collectors)1 StringUtils (org.apache.commons.lang3.StringUtils)1 ImmutablePair (org.apache.commons.lang3.tuple.ImmutablePair)1 Pair (org.apache.commons.lang3.tuple.Pair)1 Level (org.apache.logging.log4j.Level)1 LogManager (org.apache.logging.log4j.LogManager)1