/**
* Licensed to The Apereo Foundation under one or more contributor license
* agreements. See the NOTICE file distributed with this work for additional
* information regarding copyright ownership.
*
*
* The Apereo Foundation licenses this file to you under the Educational
* Community License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of the License
* at:
*
* http://opensource.org/licenses/ecl2.txt
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*
*/
package org.opencastproject.metadata.mpeg7;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import java.awt.Rectangle;
import java.io.File;
import java.io.InputStream;
import java.net.URI;
import de.schlichtherle.io.FileOutputStream;
/**
* Test class for the Mpeg-7 catalog implementation.
*/
public class Mpeg7Test {
/** The catalog name */
private String catalogName = "/mpeg7.xml";
/** The test catalog */
private File catalogFile = null;
/** Temp file for mpeg7 catalog contents */
private File mpeg7TempFile = null;
@Rule
public TemporaryFolder testFolder = new TemporaryFolder();
/**
* @throws java.lang.Exception
*/
@Before
public void setUp() throws Exception {
catalogFile = new File(this.getClass().getResource(catalogName).toURI());
if (!catalogFile.exists() || !catalogFile.canRead())
throw new Exception("Unable to access mpeg-7 test catalog '" + catalogName + "'");
}
/**
* @throws java.io.File.IOException
*/
@After
public void tearDown() throws Exception {
FileUtils.deleteQuietly(mpeg7TempFile);
}
/**
* Test method for {@link org.opencastproject.mediapackage.mpeg7.Mpeg7CatalogImpl#fromFile(java.io.File)} .
*/
@Test
public void testFromFile() throws Exception {
Mpeg7Catalog mpeg7 = new Mpeg7CatalogImpl(catalogFile.toURI().toURL().openStream());
testContent(mpeg7);
}
/**
* Test method for {@link org.opencastproject.mediapackage.mpeg7.Mpeg7CatalogImpl#save()}.
*/
@Test
public void testNewInstance() throws Exception {
// Read the sample catalog
Mpeg7Catalog mpeg7Sample = new Mpeg7CatalogImpl(catalogFile.toURI().toURL().openStream());
// Create a new catalog and fill it with a few fields
mpeg7TempFile = testFolder.newFile();
// TODO: Add sample tracks to new catalog
// TODO: Add sample video segments to new catalog
// TODO: Add sample annotations to new catalog
// Store the mpeg7 catalog contents in the temp file
Mpeg7CatalogService mpeg7Service = new Mpeg7CatalogService();
InputStream in = mpeg7Service.serialize(mpeg7Sample);
FileOutputStream out = new FileOutputStream(mpeg7TempFile);
IOUtils.copy(in, out);
// Re-read the saved catalog and test for its content
Mpeg7Catalog mpeg7NewFromDisk = new Mpeg7CatalogImpl(mpeg7TempFile.toURI().toURL().openStream());
// TODO: Test content
testContent(mpeg7NewFromDisk);
}
/**
* Tests the contents of the sample catalog mpeg7.xml.
*/
@SuppressWarnings("unchecked")
protected void testContent(Mpeg7Catalog mpeg7) {
// Check presence of content
assertTrue(mpeg7.hasAudioContent());
assertTrue(mpeg7.hasVideoContent());
assertFalse(mpeg7.hasAudioVisualContent());
// Check content size
assertTrue(mpeg7.getMultimediaContent(MultimediaContent.Type.AudioType).size() == 1);
assertTrue(mpeg7.getMultimediaContent(MultimediaContent.Type.VideoType).size() == 2);
// Check tracks
assertNotNull(mpeg7.getAudioById("track-1"));
assertNotNull(mpeg7.getVideoById("track-2"));
assertNotNull(mpeg7.getVideoById("track-3"));
//
// Check audio track (track-1)
//
MultimediaContentType track1 = mpeg7.getAudioById("track-1");
MediaTime audioMediaTime = track1.getMediaTime();
// Media locator
assertEquals(track1.getMediaLocator().getMediaURI(), URI.create("file:tracks/audio.pcm"));
// Media time point
assertEquals(0, audioMediaTime.getMediaTimePoint().getDay());
assertEquals(0, audioMediaTime.getMediaTimePoint().getHour());
assertEquals(0, audioMediaTime.getMediaTimePoint().getMinutes());
assertEquals(0, audioMediaTime.getMediaTimePoint().getSeconds());
assertEquals(25, audioMediaTime.getMediaTimePoint().getFractionsPerSecond());
assertEquals(0, audioMediaTime.getMediaTimePoint().getNFractions());
// Media duration
assertEquals(0, audioMediaTime.getMediaDuration().getDays());
assertEquals(1, audioMediaTime.getMediaDuration().getHours());
assertEquals(30, audioMediaTime.getMediaDuration().getMinutes());
assertEquals(0, audioMediaTime.getMediaDuration().getSeconds());
// Segments
assertFalse(track1.getTemporalDecomposition().segments().hasNext());
//
// Check video track (track-2)
//
MultimediaContentType track2 = mpeg7.getVideoById("track-2");
MediaTime v1MediaTime = track2.getMediaTime();
// Media locator
assertEquals(track2.getMediaLocator().getMediaURI(), URI.create("file:tracks/presentation.mp4"));
// Media time point
assertEquals(0, v1MediaTime.getMediaTimePoint().getDay());
assertEquals(0, v1MediaTime.getMediaTimePoint().getHour());
assertEquals(0, v1MediaTime.getMediaTimePoint().getMinutes());
assertEquals(0, v1MediaTime.getMediaTimePoint().getSeconds());
assertEquals(25, v1MediaTime.getMediaTimePoint().getFractionsPerSecond());
assertEquals(0, v1MediaTime.getMediaTimePoint().getNFractions());
// Media duration
assertEquals(0, v1MediaTime.getMediaDuration().getDays());
assertEquals(1, v1MediaTime.getMediaDuration().getHours());
assertEquals(30, v1MediaTime.getMediaDuration().getMinutes());
assertEquals(0, v1MediaTime.getMediaDuration().getSeconds());
// Segments
TemporalDecomposition<VideoSegment> v1Decomposition = (TemporalDecomposition<VideoSegment>) track2
.getTemporalDecomposition();
assertFalse(v1Decomposition.hasGap());
assertFalse(v1Decomposition.isOverlapping());
assertEquals(v1Decomposition.getCriteria(), TemporalDecomposition.DecompositionCriteria.Temporal);
assertTrue(v1Decomposition.segments().hasNext());
// Segment track-2.segment-1
VideoSegment v1Segment1 = v1Decomposition.getSegmentById("track-2.segment-1");
assertNotNull(v1Segment1);
MediaTime segment1MediaTime = v1Segment1.getMediaTime();
// Media time point
assertEquals(0, segment1MediaTime.getMediaTimePoint().getDay());
assertEquals(0, segment1MediaTime.getMediaTimePoint().getHour());
assertEquals(0, segment1MediaTime.getMediaTimePoint().getMinutes());
assertEquals(0, segment1MediaTime.getMediaTimePoint().getSeconds());
assertEquals(25, segment1MediaTime.getMediaTimePoint().getFractionsPerSecond());
assertEquals(0, segment1MediaTime.getMediaTimePoint().getNFractions());
// Media duration
assertEquals(0, segment1MediaTime.getMediaDuration().getDays());
assertEquals(1, segment1MediaTime.getMediaDuration().getHours());
assertEquals(7, segment1MediaTime.getMediaDuration().getMinutes());
assertEquals(35, segment1MediaTime.getMediaDuration().getSeconds());
// Text annotations
assertTrue(v1Segment1.hasTextAnnotations());
assertTrue(v1Segment1.hasTextAnnotations(0.4f, 0.5f));
assertFalse(v1Segment1.hasTextAnnotations(0.8f, 0.8f));
assertTrue(v1Segment1.hasTextAnnotations("de"));
assertFalse(v1Segment1.hasTextAnnotations("fr"));
// Keywords
TextAnnotation textAnnotation = v1Segment1.textAnnotations().next();
assertEquals("Armin", textAnnotation.keywordAnnotations().next().getKeyword());
assertEquals("Hint Armin", textAnnotation.freeTextAnnotations().next().getText());
// Spaciotemporal decomposition
SpatioTemporalDecomposition stdecomposition = v1Segment1.getSpatioTemporalDecomposition();
assertNotNull(stdecomposition);
assertTrue(stdecomposition.hasGap());
assertFalse(stdecomposition.isOverlapping());
// VideoText
assertEquals(1, stdecomposition.getVideoText().length);
VideoText videoText = stdecomposition.getVideoText("text1");
assertNotNull(videoText);
SpatioTemporalLocator locator = videoText.getSpatioTemporalLocator();
assertNotNull(locator);
MediaTime locatorMediaTime = locator.getMediaTime();
assertNotNull(locatorMediaTime);
assertEquals(MediaRelTimePointImpl.parseTimePoint("T00:00:00:0F25"), locatorMediaTime.getMediaTimePoint());
assertEquals(MediaDurationImpl.parseDuration("PT01H07M35S"), locatorMediaTime.getMediaDuration());
Textual textual = videoText.getText();
assertNotNull(textual);
assertEquals("Text", textual.getText());
assertEquals("en", textual.getLanguage());
Rectangle boundingBox = videoText.getBoundary();
assertNotNull(boundingBox);
assertEquals(10, (int) boundingBox.getX());
assertEquals(150, (int) boundingBox.getWidth());
assertEquals(20, (int) boundingBox.getY());
assertEquals(15, (int) boundingBox.getHeight());
//
// Check video track (track-3)
//
MultimediaContentType track3 = mpeg7.getVideoById("track-3");
MediaTime v2MediaTime = track3.getMediaTime();
// Media locator
assertEquals(track3.getMediaLocator().getMediaURI(), URI.create("file:tracks/presenter.mpg"));
// Media time point
assertEquals(0, v2MediaTime.getMediaTimePoint().getDay());
assertEquals(0, v2MediaTime.getMediaTimePoint().getHour());
assertEquals(0, v2MediaTime.getMediaTimePoint().getMinutes());
assertEquals(0, v2MediaTime.getMediaTimePoint().getSeconds());
assertEquals(25, v2MediaTime.getMediaTimePoint().getFractionsPerSecond());
assertEquals(0, v2MediaTime.getMediaTimePoint().getNFractions());
// Media duration
assertEquals(0, v2MediaTime.getMediaDuration().getDays());
assertEquals(1, v2MediaTime.getMediaDuration().getHours());
assertEquals(30, v2MediaTime.getMediaDuration().getMinutes());
assertEquals(0, v2MediaTime.getMediaDuration().getSeconds());
// Segments
TemporalDecomposition<VideoSegment> v2Decomposition = (TemporalDecomposition<VideoSegment>) track3
.getTemporalDecomposition();
assertFalse(v2Decomposition.segments().hasNext());
}
}