void AnnotationDataVisitor::visit(MongoDocument &document, void *data) { Annotation *anno = (Annotation *) data; if (anno->getScheme()) { if (anno->getScheme()->type == IAnnotation::TYPE::DISCRETE) { ssi_size_t id = (ssi_size_t)document.int32(Annotation::KEY_NAMES[Annotation::KEY::ANNOTATION_SEGMENT_ID]); ssi_time_t from = (ssi_time_t)document.real(Annotation::KEY_NAMES[Annotation::KEY::ANNOTATION_SEGMENT_FROM]); ssi_time_t to = (ssi_time_t)document.real(Annotation::KEY_NAMES[Annotation::KEY::ANNOTATION_SEGMENT_TO]); ssi_real_t conf = (ssi_real_t)document.real(Annotation::KEY_NAMES[Annotation::KEY::ANNOTATION_SEGMENT_CONF]); anno->add(from, to, id, conf); } else { ssi_real_t score = (ssi_real_t)document.real(Annotation::KEY_NAMES[Annotation::KEY::ANNOTATION_FRAME_SCORE]); ssi_real_t conf = (ssi_real_t)document.real(Annotation::KEY_NAMES[Annotation::KEY::ANNOTATION_FRAME_CONF]); anno->add(score, conf); } } }
bool Extract(params_t ¶ms, FilePath *inPath, FilePath *outPath, FilePath *annoPath) { ssi_char_t *toPath = 0; if (ssi_strcmp(outPath->getExtension(), annoPath ? SSI_FILE_TYPE_SAMPLES : SSI_FILE_TYPE_STREAM, false)) { toPath = ssi_strcpy(outPath->getPath()); } else { toPath = ssi_strcpy(outPath->getPathFull()); } Chain *chain = ssi_create_id(Chain, 0, "chain"); chain->getOptions()->set(params.chainPathAbsolute); ssi_stream_t from; bool result = false; bool isVideoFile = IsVideoFile(inPath->getNameFull()); bool isAudioFile = IsAudioFile(inPath->getNameFull()); if (isVideoFile) { if (annoPath) { ssi_wrn("cannot extract video features for an annotation"); return false; } FFMPEGReader *reader = ssi_create(FFMPEGReader, 0, false); reader->getOptions()->setUrl(inPath->getPathFull()); reader->getOptions()->bestEffort = true; FileWriter *writer = ssi_create(FileWriter, 0, false); writer->getOptions()->overwrite = true; writer->getOptions()->setPath(toPath); writer->getOptions()->type = File::BINARY; FileProvider *provider = new FileProvider(writer, chain); reader->setProvider(SSI_FFMPEGREADER_VIDEO_PROVIDER_NAME, provider); reader->connect(); reader->start(); reader->wait(); reader->stop(); reader->disconnect(); delete provider; delete reader; delete writer; } else if (isAudioFile) { FFMPEGReader *reader = ssi_create(FFMPEGReader, 0, false); reader->getOptions()->setUrl(inPath->getPathFull()); reader->getOptions()->ablock = 0.05; reader->getOptions()->bestEffort = true; if (!reader->initAudioStream(inPath->getPathFull(), from) || from.num == 0) { return false; } MemoryWriter *writer = ssi_create(MemoryWriter, 0, false); writer->setStream(from); FileProvider *provider = new FileProvider(writer); reader->setProvider(SSI_FFMPEGREADER_AUDIO_PROVIDER_NAME, provider); reader->connect(); reader->start(); reader->wait(); reader->stop(); reader->disconnect(); delete provider; delete reader; delete writer; result = true; } else { result = FileTools::ReadStreamFile(inPath->getPathFull(), from); } if (result) { ssi_stream_t to; if (annoPath) { Annotation annotation; if (result &= annotation.load(annoPath->getPathFull())) { if (annotation.getScheme()->type != SSI_SCHEME_TYPE::DISCRETE) { ssi_wrn("cannot extract features from a continuous annotation"); return false; } if (!ssi_strcmp(params.step, "0")) { ssi_size_t step = 0, left = 0, right = 0; if (!ssi_parse_samples(params.step, step, from.sr)) { ssi_wrn("could not parse step size '%s'", params.step); return false; } if (!ssi_parse_samples(params.left, left, from.sr)) { ssi_wrn("could not parse left size '%s'", params.left); return false; } if (!ssi_parse_samples(params.right, right, from.sr)) { ssi_wrn("could not parse right size '%s'", params.right); return false; } ssi_time_t step_t = step / from.sr; ssi_time_t left_t = left / from.sr; ssi_time_t right_t = right / from.sr; annotation.convertToFrames(step_t, params.restClassName[0] == '\0' ? 0 : params.restClassName); if (left_t > 0.0 || right_t > 0.0) { annotation.addOffset(left_t, right_t); } } SampleList samples; if (result &= annotation.extractSamples(from, &samples)) { ISTransform samples_t(&samples); samples_t.setTransformer(0, *chain); samples_t.callEnter(); result &= ModelTools::SaveSampleList(samples_t, toPath, params.ascii ? File::ASCII : File::BINARY); samples_t.callFlush(); } } } else { if (ssi_strcmp(params.step, "0")) { SignalTools::Transform(from, to, *chain, 0u); } else { SignalTools::Transform(from, to, *chain, params.step, params.left, params.right); } result &= FileTools::WriteStreamFile(params.ascii ? File::ASCII : File::BINARY, toPath, to); ssi_stream_destroy(to); } ssi_stream_destroy(from); } delete[] toPath; return result; }