use of org.opencastproject.job.api.Job in project opencast by opencast.
the class VideoSegmenterTest method testAnalyzeOptimization.
@Test
public void testAnalyzeOptimization() throws Exception {
Job receipt = vsegmenter1.segment(track1);
JobBarrier jobBarrier = new JobBarrier(null, serviceRegistry1, 1000, receipt);
jobBarrier.waitForJobs();
Catalog catalog = (Catalog) MediaPackageElementParser.getFromXml(receipt.getPayload());
Mpeg7Catalog mpeg7 = new Mpeg7CatalogImpl(catalog.getURI().toURL().openStream());
// Is there multimedia content in the mpeg7?
assertTrue("Audiovisual content was expected", mpeg7.hasVideoContent());
assertNotNull("Audiovisual content expected", mpeg7.multimediaContent().next().elements().hasNext());
MultimediaContentType contentType = mpeg7.multimediaContent().next().elements().next();
// Is there at least one segment?
TemporalDecomposition<? extends Segment> segments = contentType.getTemporalDecomposition();
Iterator<? extends Segment> si = segments.segments();
assertTrue(si.hasNext());
// Is the error of optimization small enough?
int segmentCounter = 0;
for (; si.hasNext(); ++segmentCounter) {
si.next();
}
float error = Math.abs((segmentCounter - vsegmenter1.prefNumber) / (float) vsegmenter1.prefNumber);
assertTrue("Error of Optimization is too big", error <= vsegmenter1.maxError);
}
use of org.opencastproject.job.api.Job in project opencast by opencast.
the class VideoSegmenterTest method testAnalyze.
@Test
public void testAnalyze() throws Exception {
Job receipt = vsegmenter.segment(track);
JobBarrier jobBarrier = new JobBarrier(null, serviceRegistry, 1000, receipt);
jobBarrier.waitForJobs();
Catalog catalog = (Catalog) MediaPackageElementParser.getFromXml(receipt.getPayload());
Mpeg7Catalog mpeg7 = new Mpeg7CatalogImpl(catalog.getURI().toURL().openStream());
// Is there multimedia content in the mpeg7?
assertTrue("Audiovisual content was expected", mpeg7.hasVideoContent());
assertNotNull("Audiovisual content expected", mpeg7.multimediaContent().next().elements().hasNext());
MultimediaContentType contentType = mpeg7.multimediaContent().next().elements().next();
// Is there at least one segment?
TemporalDecomposition<? extends Segment> segments = contentType.getTemporalDecomposition();
Iterator<? extends Segment> si = segments.segments();
assertTrue(si.hasNext());
Segment firstSegment = si.next();
MediaTime firstSegmentMediaTime = firstSegment.getMediaTime();
long startTime = firstSegmentMediaTime.getMediaTimePoint().getTimeInMilliseconds();
long duration = firstSegmentMediaTime.getMediaDuration().getDurationInMilliseconds();
assertEquals("Unexpected start time of first segment", 0, startTime);
assertEquals("Unexpected duration of first segment", firstSegmentDuration, duration);
// What about the second one?
assertTrue("Video is expected to have more than one segment", si.hasNext());
Segment secondSegment = si.next();
MediaTime secondSegmentMediaTime = secondSegment.getMediaTime();
startTime = secondSegmentMediaTime.getMediaTimePoint().getTimeInMilliseconds();
duration = secondSegmentMediaTime.getMediaDuration().getDurationInMilliseconds();
assertEquals("Unexpected start time of second segment", firstSegmentDuration, startTime);
assertEquals("Unexpected duration of second segment", secondSegmentDuration, duration);
// There should be no third segment
assertFalse("Found an unexpected third video segment", si.hasNext());
}
use of org.opencastproject.job.api.Job in project opencast by opencast.
the class VideoSegmenterTest method testAnalyzeOptimizedList.
@Test
public void testAnalyzeOptimizedList() throws Exception {
Job receipt = vsegmenter.segment(track);
JobBarrier jobBarrier = new JobBarrier(null, serviceRegistry, 1000, receipt);
jobBarrier.waitForJobs();
Catalog catalog = (Catalog) MediaPackageElementParser.getFromXml(receipt.getPayload());
Mpeg7Catalog mpeg7 = new Mpeg7CatalogImpl(catalog.getURI().toURL().openStream());
List<OptimizationStep> optimizedList = new LinkedList<OptimizationStep>();
OptimizationStep firstStep = new OptimizationStep(10, 0.015f, 46, 41, mpeg7, null);
OptimizationStep secondStep = new OptimizationStep(10, 0.167f, 34, 41, mpeg7, null);
OptimizationStep thirdStep = new OptimizationStep(10, 0.011f, 44, 41, mpeg7, null);
OptimizationStep fourthStep = new OptimizationStep(10, 0.200f, 23, 41, mpeg7, null);
// ~ 0.122
float error1 = (46 - 41) / (float) 41;
// ~ -0.171
float error2 = (34 - 41) / (float) 41;
// ~ 0.073
float error3 = (44 - 41) / (float) 41;
// ~ -0.439
float error4 = (23 - 41) / (float) 41;
optimizedList.add(firstStep);
optimizedList.add(secondStep);
optimizedList.add(thirdStep);
optimizedList.add(fourthStep);
Collections.sort(optimizedList);
// check if the errors were calculated correctly and whether the elements are in the correct order
assertEquals("first element of optimized list incorrect", error3, optimizedList.get(0).getError(), 0.0001f);
assertEquals("second element of optimized list incorrect", error1, optimizedList.get(1).getError(), 0.0001f);
assertEquals("third element of optimized list incorrect", error4, optimizedList.get(2).getError(), 0.0001f);
assertEquals("fourth element of optimized list incorrect", error2, optimizedList.get(3).getError(), 0.0001f);
assertTrue("first error in optimized list is not positive", optimizedList.get(0).getError() >= 0);
assertTrue("second error in optimized list is not bigger than first", optimizedList.get(1).getError() > optimizedList.get(0).getError());
assertTrue("third error in optimized list is not negative", optimizedList.get(2).getError() < 0);
assertTrue("fourth error in optimized list is smaller than third", optimizedList.get(3).getError() > optimizedList.get(2).getError());
}
use of org.opencastproject.job.api.Job in project opencast by opencast.
the class VideoSegmenterWorkflowOperationHandler method start.
/**
* {@inheritDoc}
*
* @see org.opencastproject.workflow.api.WorkflowOperationHandler#start(org.opencastproject.workflow.api.WorkflowInstance,
* JobContext)
*/
public WorkflowOperationResult start(final WorkflowInstance workflowInstance, JobContext context) throws WorkflowOperationException {
logger.debug("Running video segmentation on workflow {}", workflowInstance.getId());
WorkflowOperationInstance operation = workflowInstance.getCurrentOperation();
MediaPackage mediaPackage = workflowInstance.getMediaPackage();
// Find movie track to analyze
String trackFlavor = StringUtils.trimToNull(operation.getConfiguration(PROP_ANALYSIS_TRACK_FLAVOR));
List<String> targetTags = asList(operation.getConfiguration(PROP_TARGET_TAGS));
List<Track> candidates = new ArrayList<Track>();
if (trackFlavor != null)
candidates.addAll(Arrays.asList(mediaPackage.getTracks(MediaPackageElementFlavor.parseFlavor(trackFlavor))));
else
candidates.addAll(Arrays.asList(mediaPackage.getTracks(MediaPackageElements.PRESENTATION_SOURCE)));
// Remove unsupported tracks (only those containing video can be segmented)
Iterator<Track> ti = candidates.iterator();
while (ti.hasNext()) {
Track t = ti.next();
if (!t.hasVideo())
ti.remove();
}
// Found one?
if (candidates.size() == 0) {
logger.info("No matching tracks available for video segmentation in workflow {}", workflowInstance);
return createResult(Action.CONTINUE);
}
// More than one left? Let's be pragmatic...
if (candidates.size() > 1) {
logger.info("Found more than one track to segment, choosing the first one ({})", candidates.get(0));
}
Track track = candidates.get(0);
// Segment the media package
Catalog mpeg7Catalog = null;
Job job = null;
try {
job = videosegmenter.segment(track);
if (!waitForStatus(job).isSuccess()) {
throw new WorkflowOperationException("Video segmentation of " + track + " failed");
}
mpeg7Catalog = (Catalog) MediaPackageElementParser.getFromXml(job.getPayload());
mediaPackage.add(mpeg7Catalog);
mpeg7Catalog.setURI(workspace.moveTo(mpeg7Catalog.getURI(), mediaPackage.getIdentifier().toString(), mpeg7Catalog.getIdentifier(), "segments.xml"));
mpeg7Catalog.setReference(new MediaPackageReferenceImpl(track));
// Add target tags
for (String tag : targetTags) {
mpeg7Catalog.addTag(tag);
}
} catch (Exception e) {
throw new WorkflowOperationException(e);
}
logger.debug("Video segmentation completed");
return createResult(mediaPackage, Action.CONTINUE, job.getQueueTime());
}
use of org.opencastproject.job.api.Job in project opencast by opencast.
the class WaveformServiceRemote method createWaveformImage.
/**
* Takes the given track and returns the job that will create an waveform image using a remote service.
*
* @param sourceTrack the track to create waveform image from
* @return a job that will create a waveform image
* @throws MediaPackageException if the serialization of the given track fails
* @throws WaveformServiceException if the job can't be created for any reason
*/
@Override
public Job createWaveformImage(Track sourceTrack) throws MediaPackageException, WaveformServiceException {
HttpPost post = new HttpPost("/create");
try {
List<BasicNameValuePair> params = new ArrayList<>();
params.add(new BasicNameValuePair("track", MediaPackageElementParser.getAsXml(sourceTrack)));
post.setEntity(new UrlEncodedFormEntity(params));
} catch (Exception e) {
throw new WaveformServiceException(e);
}
HttpResponse response = null;
try {
response = getResponse(post);
if (response != null) {
try {
Job receipt = JobParser.parseJob(response.getEntity().getContent());
logger.info("Create waveform image from {}", sourceTrack);
return receipt;
} catch (Exception e) {
throw new WaveformServiceException("Unable to create waveform image from " + sourceTrack + " using a remote service", e);
}
}
} finally {
closeConnection(response);
}
throw new WaveformServiceException("Unable to create waveform image from " + sourceTrack + " using a remote service");
}
Aggregations