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);
		}
	}
}
Example #2
0
bool Extract(params_t &params, 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;
}