private void checkFrameRate(ContextInfo contextInfo) throws ConversionNotAllowedException { checkParameter(ResourceContextParameters.FRAME_RATE, ConversionParameterNameType.FRAME_RATE, contextInfo, (f1, f2) -> Objects.equals(ConversionHelper.parseEditRate(f1), ConversionHelper.parseEditRate(f2))); }
/** * Transforms a timecode string (hh:mm:ss:ff) to milliseconds according to the given edit rate (frame rate). * <p> * Currently works with non-drop timecodes only. * </p> * * @param tc an SMPTE timecode (hh:mm:ss:ff) * @param unitsInSecStr edit unit rate in a form "25 1" * @return a number of milliseconds */ public static long smpteTimecodeToMilliSeconds(String tc, String unitsInSecStr) { BigFraction unitsInSec = parseEditRate(unitsInSecStr); return smpteTimecodeToMilliSeconds(tc, unitsInSec); }
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; }
/** * 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))); } }
private Stream<Slice<PEltype>> split(Stream<PEltype> pStream) { SliceBuilder<PEltype> builder = new SliceBuilder<PEltype>() .setBeginGetter(p -> ConversionHelper.smpteTimecodeToMilliSeconds(p.getBegin(), frameRate)) .setEndGetter(p -> ConversionHelper.smpteTimecodeToMilliSeconds(p.getEnd(), frameRate)); return SplitUtils.split(pStream .map(builder::build) .collect(Collectors.toList())).stream(); }
@Override protected void doBuildDestContext() { DestTemplateParameterContext destContext = contextProvider.getDestContext(); // set interlaced to false if not specified String interlaced = destContext.getParameterValue(INTERLACED); destContext.addParameter(INTERLACED, interlaced == null ? Boolean.FALSE.toString() : interlaced); // define is dar provided destContext.addParameter(DEST_PARAM_VIDEO_IS_DAR_SPECIFIED, Boolean.toString(destContext.getParameterValue(DAR) != null)); // set frame rate for interlaced scan // for ffmpeg iFrameRate=frameRate*2 // for prenc iFrameRate=frameRate BigFraction iFrameRate = ConversionHelper.parseEditRate(destContext.getParameterValue(FRAME_RATE)); if (!SystemUtils.IS_OS_MAC_OSX) { iFrameRate = iFrameRate.multiply(2); } destContext.addParameter(DEST_PARAM_VIDEO_IFRAME_RATE, ConversionHelper.toREditRate(iFrameRate)); }
? ConversionHelper.parseEditRate(trackFileResource.getEditRate()) : compositionEditRate; contextProvider.getResourceContext().addResourceParameter(resourceKey, resourceId, ResourceContextParameters.EDIT_RATE, ConversionHelper.toEditRate(editRate));
BigFraction editRate = ConversionHelper.parseEditRate(contextProvider.getResourceContext() .getParameterValue(ResourceContextParameters.EDIT_RATE, contextInfo)); BigInteger durationEU = new BigInteger(contextProvider.getResourceContext() long durationMs = ConversionHelper.editUnitToMilliSeconds(durationEU, editRate); long startTimeMs = ConversionHelper.editUnitToMilliSeconds(startTimeEU, editRate); long endTimeMs = ConversionHelper.editUnitToMilliSeconds(endTimeEU, editRate); resourceContext.addResourceParameter(resourceKey, resUuid, ResourceContextParameters.DURATION_MS, String.valueOf(durationMs)); String durationTimecode = ConversionHelper.editUnitToTimecode(durationEU, editRate); String startTimeTimeCode = ConversionHelper.editUnitToTimecode(startTimeEU, editRate); String endTimeTimeCode = ConversionHelper.editUnitToTimecode(endTimeEU, editRate); resourceContext.addResourceParameter(resourceKey, resUuid, ResourceContextParameters.DURATION_TIMECODE, String.valueOf(durationTimecode));
String essence = resourceContext.getParameterValue(ResourceContextParameters.ESSENCE, contextInfo); String editRate = resourceContext.getParameterValue(ResourceContextParameters.EDIT_RATE, contextInfo); BigFraction editRateFraction = ConversionHelper.parseEditRate(editRate); videoEssences.put(essence, editRateFraction); resourceContext.getParameterValue(ResourceContextParameters.DURATION_EDIT_UNIT, contextInfo)); BigFraction editRate = ConversionHelper.parseEditRate( resourceContext.getParameterValue(ResourceContextParameters.EDIT_RATE, contextInfo)); String startTimeInFrames = String.valueOf(ConversionHelper.toNewEditRate(startTimeEU, editRate, videoEditRate)); String durationInFrames = String.valueOf(ConversionHelper.toNewEditRate(durationEU, editRate, videoEditRate));
@Test public void rFrameRateToEditRate() { assertEquals("50 1", ConversionHelper.rFrameRateToEditRate("50/1")); assertEquals("50 1", ConversionHelper.rFrameRateToEditRate("50")); assertEquals("25 2", ConversionHelper.rFrameRateToEditRate("25/2")); }
/** * Get dest context aspect ratio and convert to fraction. * * @return fraction corresponds to destination aspect ratio */ private BigFraction getDestAspectRatio() { DestTemplateParameterContext destContext = contextProvider.getDestContext(); return ConversionHelper.parseAspectRatio(destContext.getParameterValue(ASPECT_RATIO)); } }
@Test public void toEditRate() { assertEquals("30000 1001", ConversionHelper.toEditRate(new BigFraction(30000, 1001))); assertEquals("50 1", ConversionHelper.toEditRate(new BigFraction(50))); }
@Test public void toREditRate() { assertEquals("30000/1001", ConversionHelper.toREditRate(new BigFraction(30000, 1001))); assertEquals("50/1", ConversionHelper.toREditRate(new BigFraction(50))); }
@Test public void editUnitsToTimecode() { assertEquals("01:23:35.080", ConversionHelper.editUnitToTimecode(BigInteger.valueOf(125377), new BigFraction(25))); assertEquals("00:00:00.000", ConversionHelper.editUnitToTimecode(BigInteger.valueOf(0), new BigFraction(25))); assertEquals("00:00:02.000", ConversionHelper.editUnitToTimecode(BigInteger.valueOf(100), new BigFraction(50))); assertEquals("00:00:00.200", ConversionHelper.editUnitToTimecode(BigInteger.valueOf(10), new BigFraction(50))); }
@Test public void editUnitsToMilliseconds() { assertEquals(4000L, ConversionHelper.editUnitToMilliSeconds(BigInteger.valueOf(100), new BigFraction(25))); assertEquals(500L, ConversionHelper.editUnitToMilliSeconds(BigInteger.valueOf(25), new BigFraction(50))); assertEquals(3336L, ConversionHelper.editUnitToMilliSeconds(BigInteger.valueOf(100), new BigFraction(30000, 1001))); }
@Test public void smpteTimecodeToMilliseconds() { assertEquals(4000L, ConversionHelper.smpteTimecodeToMilliSeconds("00:00:04:00", "25")); assertEquals(4000L, ConversionHelper.smpteTimecodeToMilliSeconds("00:00:04:00", "25 1")); assertEquals(0L, ConversionHelper.smpteTimecodeToMilliSeconds("00:00:00:00", "25")); assertEquals(4000L, ConversionHelper.smpteTimecodeToMilliSeconds("00;00;04;00", "25")); assertEquals(4000L, ConversionHelper.smpteTimecodeToMilliSeconds("00.00.04.00", "25")); assertEquals(4000L, ConversionHelper.smpteTimecodeToMilliSeconds("00:00:04;00", "25")); assertEquals(4000L, ConversionHelper.smpteTimecodeToMilliSeconds("00:00:04.00", "25")); assertEquals(4000L, ConversionHelper.smpteTimecodeToMilliSeconds("0:0:4.0", "25")); assertEquals(4000L, ConversionHelper.smpteTimecodeToMilliSeconds("0:0:4:00", "25")); assertEquals(960L, ConversionHelper.smpteTimecodeToMilliSeconds("00:00:00:24", "25")); assertEquals(500L, ConversionHelper.smpteTimecodeToMilliSeconds("00:00:00:25", "50")); assertEquals(200L, ConversionHelper.smpteTimecodeToMilliSeconds("00:00:00:10", "50")); assertEquals(18243000L, ConversionHelper.smpteTimecodeToMilliSeconds("05:04:03:00", "25")); assertEquals(18243960L, ConversionHelper.smpteTimecodeToMilliSeconds("05:04:03:24", "25")); assertEquals(18243500L, ConversionHelper.smpteTimecodeToMilliSeconds("05:04:03:25", "50")); assertEquals(18243200L, ConversionHelper.smpteTimecodeToMilliSeconds("05:04:03:10", "50")); assertEquals(243200L, ConversionHelper.smpteTimecodeToMilliSeconds("00:4:3:10", "50")); }
BigFraction frameRate = ConversionHelper.parseEditRate(prevVirtualTrack.getParameters() .get(ResourceContextParameters.FRAME_RATE)); sequenceContext.addSequenceParameter( seqType, seqUuid, SequenceContextParameters.FRAME_RATE, ConversionHelper.toREditRate(frameRate));
? ConversionHelper.parseEditRate(trackFileResource.getEditRate()) : compositionEditRate; contextProvider.getResourceContext().addResourceParameter(resourceKey, resourceId, ResourceContextParameters.EDIT_RATE, ConversionHelper.toEditRate(editRate));
/** * Returns a fraction corresponding to the given edit rate string. * * @param editRate input in both forms "50 1" and "50/1" * @return a fraction object representing the edit rate. */ public static BigFraction parseEditRate(String editRate) { editRate = editRate.contains("/") ? rFrameRateToEditRate(editRate) : editRate; String[] parts = editRate.split(" "); try { if (parts.length == 2) { return new BigFraction(Long.parseLong(parts[0]), Long.parseLong(parts[1])); } else if (parts.length == 1) { return new BigFraction(Long.parseLong(parts[0])); } } catch (NumberFormatException e) { throw new ConversionHelperException("Incorrect edit rate! Edit rate must consist of two numbers.", e); } throw new ConversionHelperException("Incorrect edit rate! Edit rate must consist of two values."); }
@Test(expected = ConversionHelperException.class) public void safeParseIncorrectAspectRatioNotNumber() { ConversionHelper.parseAspectRatio("aaaaa"); } }