private PEltype merge(Slice<PEltype> slice) { PEltype p = copy(slice.getContents().stream() .findFirst() .orElseThrow(() -> new ConvertException("At least one <p> must exist for content."))); p.setBegin(ConversionHelper.msToSmpteTimecode(slice.getBegin(), frameRate)); p.setEnd(ConversionHelper.msToSmpteTimecode(slice.getEnd(), frameRate)); p.getContent().clear(); p.getContent().addAll(mergeContent(slice.getContents())); return p; }
@Test public void msToSmpteTimecode() { assertEquals("00:06:12:12", ConversionHelper.msToSmpteTimecode(372480, new BigFraction(25))); assertEquals("00:06:12:11", ConversionHelper.msToSmpteTimecode(372470, new BigFraction(25, 1))); assertEquals("00:00:00:00", ConversionHelper.msToSmpteTimecode(0, new BigFraction(25))); assertEquals("00:00:00:00", ConversionHelper.msToSmpteTimecode(30, new BigFraction(25))); assertEquals("00:00:00:01", ConversionHelper.msToSmpteTimecode(40, new BigFraction(25))); assertEquals("00:00:01:00", ConversionHelper.msToSmpteTimecode(1000, new BigFraction(25))); assertEquals("00:00:00:24", ConversionHelper.msToSmpteTimecode(999, new BigFraction(25))); assertEquals("00:00:00:24", ConversionHelper.msToSmpteTimecode(970, new BigFraction(25))); assertEquals("00:00:00:24", ConversionHelper.msToSmpteTimecode(960, new BigFraction(25))); assertEquals("10:59:59:00", ConversionHelper.msToSmpteTimecode(39599000, new BigFraction(25))); assertEquals("10:59:59:24", ConversionHelper.msToSmpteTimecode(39599960, new BigFraction(25))); assertEquals("10:59:59:23", ConversionHelper.msToSmpteTimecode(39599959, new BigFraction(25))); }
long pE = ttConverter.parseTimeExpression(p.getEnd()); p.setBegin(ConversionHelper.msToSmpteTimecode(pB, mainConverter.getUnitsInSec())); p.setEnd(ConversionHelper.msToSmpteTimecode(pE, mainConverter.getUnitsInSec())); }) .forEachOrdered((p) -> {
/** * Check that total duration specified in Metadata.xml is less than total duration of the output file. * Otherwise conversion will abort at the very last step (BMX). It may make the user unhappy after a long conversion. */ private void checkTotalDuration() { String metadataTotalDurationTc = metadataXmlProvider.getDpp().getTechnical().getTimecodes().getTotalProgrammeDuration().getValue(); if (StringUtils.isEmpty(metadataTotalDurationTc)) { return; } String destFps = contextProvider.getDestContext().getParameterValue(DestContextParameters.FRAME_RATE); if (destFps == null) { destFps = MetadataXmlProvider.DEST_FRAME_RATE; } BigFraction fps = ConversionHelper.parseEditRate(destFps); long metadataTotalDurationMs = ConversionHelper.smpteTimecodeToMilliSeconds( metadataTotalDurationTc, fps); long cplTotalDurationMs = getCplTotalDurationMs(); // BMX accepts any total duration if zero timecode is specified in metadata.xml if (metadataTotalDurationMs == 0) { return; } if (metadataTotalDurationMs > cplTotalDurationMs) { throw new ConversionException( String.format("A total programme duration as specified in metadata.xml (%s, %s ms) exceeds a " + "total duration of the output as defined by the CPL (%s, %s ms) ", metadataTotalDurationTc, String.valueOf(metadataTotalDurationMs), ConversionHelper.msToSmpteTimecode(cplTotalDurationMs, fps), String.valueOf(cplTotalDurationMs))); } }
p.setBegin(ConversionHelper.msToSmpteTimecode(offsetMS + pBegin - startMS, frameRate == null ? ttConverter.getUnitsInSec() : frameRate)); p.setEnd(ConversionHelper.msToSmpteTimecode(offsetMS + pEnd - startMS, frameRate == null ? ttConverter.getUnitsInSec() : frameRate)); p.setDur(null);