private void processSubtitles() { int count = iTunesInputParameters.getSubFiles() == null ? contextProvider.getSequenceContext().getSequenceCount(SequenceType.SUBTITLE) : iTunesInputParameters.getSubFiles().size(); if (count == 0) { return; } IntStream.range(0, count) .mapToObj(i -> contextProvider.getDynamicContext().getParameterValueAsString(DYNAMIC_PARAM_SUBTITLE_ITT_PREFIX + i)) .map(fileName -> new File(inputParameters.getWorkingDirFile(), fileName)) .forEach(this::safeProcessSubtitles); }
private void buildDynamicContextPostCpl() throws IOException, XmlParsingException { logger.debug("Building Dynamic context after CPL is parsed..."); // build default dynamic parameters DynamicTemplateParameterContext dynamicContext = contextProvider.getDynamicContext(); SequenceTemplateParameterContext seqContext = contextProvider.getSequenceContext(); boolean hasAudio = seqContext.getSequenceCount(SequenceType.AUDIO) > 0; boolean hasVideo = seqContext.getSequenceCount(SequenceType.VIDEO) > 0; boolean hasSubtitle = seqContext.getSequenceCount(SequenceType.SUBTITLE) > 0; boolean singleAudio = seqContext.getSequenceCount(SequenceType.AUDIO) == 1; boolean singleSubtitle = seqContext.getSequenceCount(SequenceType.SUBTITLE) == 1; dynamicContext.addParameter(DynamicContextParameters.HAS_AUDIO, String.valueOf(hasAudio)); dynamicContext.addParameter(DynamicContextParameters.HAS_VIDEO, String.valueOf(hasVideo)); dynamicContext.addParameter(DynamicContextParameters.HAS_SUBTITLE, String.valueOf(hasSubtitle)); dynamicContext.addParameter(DynamicContextParameters.HAS_AUDIO_AND_VIDEO, String.valueOf(hasAudio && hasVideo)); dynamicContext.addParameter(DynamicContextParameters.HAS_AUDIO_ONLY, String.valueOf(hasAudio && !hasVideo)); dynamicContext.addParameter(DynamicContextParameters.HAS_VIDEO_ONLY, String.valueOf(!hasAudio && hasVideo)); dynamicContext.addParameter(DynamicContextParameters.SINGLE_AUDIO, String.valueOf(singleAudio)); dynamicContext.addParameter(DynamicContextParameters.SINGLE_SUBTITLE, String.valueOf(singleSubtitle)); // build format-specific dynamic parameters doBuildDynamicContextPostCpl(); logger.debug("Built Dynamic context after CPL is parsed: OK\n"); }
@Override protected void postConvert() throws IOException, XmlParsingException { logger.info("Conversion output:"); String fileName = getOutputName() + ".mxf"; logger.info("{}{}", LogHelper.TAB, new File(inputParameters.getWorkingDirFile(), fileName).getAbsoluteFile()); int subtitleCount = contextProvider.getSequenceContext().getSequenceCount(SequenceType.SUBTITLE); if (subtitleCount == 1) { fileName = getOutputName() + ".stl"; logger.info("{}{}\n", LogHelper.TAB, new File(inputParameters.getWorkingDirFile(), fileName).getAbsoluteFile()); } else { for (int i = 0; i < subtitleCount; i++) { fileName = getOutputName() + "-" + i + ".stl"; logger.info(i < subtitleCount - 1 ? "{}{}" : "{}{}\n", LogHelper.TAB, new File(inputParameters.getWorkingDirFile(), fileName).getAbsoluteFile()); } } } }
/** * Creates an audio map based on the channel layout information in the resource context * (this information is obtained from Essence Descriptors). * An audio map can be generated only if * <ul> * <li>All resources within a sequence has channel layout</li> * <li>All resources within a sequence has equal channel layout</li> * <li>For R48_2A: there are at least one stereo sequence</li> * <li>For R123_4B/C: there are one or two stereo sequences</li> * <li>For R123_16C: there are one or two 5.1 sequences</li> * <li>For R123_16D: there are exactly two 5.1 sequences with different languages (languages must be set)</li> * <li>For R123_16F: there are exactly three stereo sequences with different languages (languages must be set)</li> * </ul> * * @return an audio map instance or null if there is not audio. * @throws InvalidAudioChannelAssignmentException an exception with description why audio map can not ne generated * for the selected track allocation */ public AudioMapType guessAudioMap() throws InvalidAudioChannelAssignmentException { if (contextProvider.getSequenceContext().getSequenceCount(SequenceType.AUDIO) == 0) { return null; } logger.debug("Trying to generate an audiomap.xml based on the EssenceDescriptor..."); prepareContext(); // create the audio map AudioMapType audioMap = createAudioMap(); logger.info("Generated an audiomap.xml based on the EssenceDescriptor: OK"); return audioMap; }
/** * Inits a sequence (virtual track) parameter defined by the given UUID. Defines default parameters * (such as Sequence UUID, type and number). * The method must be called for each sequence before adding another parameters. * * @param seqType sequence type * @param uuid sequence UUID. * @return this sequence template parameters context. */ public SequenceTemplateParameterContext initSequence(SequenceType seqType, SequenceUUID uuid) { if (!sequences.containsKey(seqType) || !sequences.get(seqType).contains(uuid)) { int seqNum = getSequenceCount(seqType); doAddParameter(seqType, uuid, SequenceContextParameters.UUID, uuid.getUuid()); doAddParameter(seqType, uuid, SequenceContextParameters.TYPE, seqType.value()); doAddParameter(seqType, uuid, SequenceContextParameters.NUM, String.valueOf(seqNum)); } return this; }
@Test public void testSeqmentAndSequenceCount() throws Exception { assertEquals(1, contextProvider.getSegmentContext().getSegmentsNum()); assertEquals(1, contextProvider.getSequenceContext().getSequenceCount(SequenceType.VIDEO)); assertEquals(2, contextProvider.getSequenceContext().getSequenceCount(SequenceType.AUDIO)); }
@Test public void testVideoSequenceContext() throws Exception { assertEquals(1, sequenceContext.getSequenceCount(SequenceType.VIDEO)); // UUIDs as defined in CPL.xml assertArrayEquals( new SequenceUUID[]{SequenceUUID.create("urn:uuid:a4f226e7-adac-45a4-adbf-83335cf02d0d")}, sequenceContext.getUuids(SequenceType.VIDEO).toArray(new SequenceUUID[]{})); ContextInfo contextInfo = new ContextInfoBuilder().setSequenceType(SequenceType.VIDEO) .setSequenceUuid(SequenceUUID.create("urn:uuid:a4f226e7-adac-45a4-adbf-83335cf02d0d")).build(); assertEquals("urn:uuid:a4f226e7-adac-45a4-adbf-83335cf02d0d", sequenceContext.getParameterValue(SequenceContextParameters.UUID, contextInfo)); assertEquals("0", sequenceContext.getParameterValue(SequenceContextParameters.NUM, contextInfo)); assertEquals("video", sequenceContext.getParameterValue(SequenceContextParameters.TYPE, contextInfo)); }
@Override protected void doBuildDynamicContextPostCpl() throws IOException, XmlParsingException { // load, parse and validate metadata.xml (or generate default) initMetadata(); resolveLocaleAfterMetadataInit(); if (resolvePackageType() == ITunesPackageType.tv) { new DurationChecker(contextProvider).checkDuration(destContextMap); } // load, parse and validate audiomap.xml (or generate default) if audio exist if (contextProvider.getSequenceContext().getSequenceCount(SequenceType.AUDIO) > 0) { initAudioMap(); buildAudiomapParameters(); buildSilenceExprParameters(); resolveLocaleAfterAudiomapInit(); } if (metadataXmlProvider.getDescriptor().getPackageType() == ITunesPackageType.film) { buildSubtitleInputParameters(); } else { // TV package if (iTunesInputParameters.getSubFiles() != null && !iTunesInputParameters.getSubFiles().isEmpty()) { logger.info("Subtitles will not be processed for TV package type."); } } resolveSameFpsParameter(); }
@Test public void testAudioSequenceContext() throws Exception { assertEquals(2, sequenceContext.getSequenceCount(SequenceType.AUDIO)); // UUIDs as defined in CPL.xml assertArrayEquals( new SequenceUUID[]{ SequenceUUID.create("urn:uuid:63b41d86-c5df-4169-b036-3a25024bd711"), SequenceUUID.create("urn:uuid:63b41d86-c5df-4169-b036-3a25024bd712")}, sequenceContext.getUuids(SequenceType.AUDIO).toArray(new SequenceUUID[]{})); ContextInfo contextInfo = new ContextInfoBuilder().setSequenceType(SequenceType.AUDIO) .setSequenceUuid(SequenceUUID.create("urn:uuid:63b41d86-c5df-4169-b036-3a25024bd711")).build(); assertEquals("urn:uuid:63b41d86-c5df-4169-b036-3a25024bd711", sequenceContext.getParameterValue(SequenceContextParameters.UUID, contextInfo)); assertEquals("0", sequenceContext.getParameterValue(SequenceContextParameters.NUM, contextInfo)); assertEquals("audio", sequenceContext.getParameterValue(SequenceContextParameters.TYPE, contextInfo)); contextInfo = new ContextInfoBuilder().setSequenceType(SequenceType.AUDIO) .setSequenceUuid(SequenceUUID.create("urn:uuid:63b41d86-c5df-4169-b036-3a25024bd712")).build(); assertEquals("urn:uuid:63b41d86-c5df-4169-b036-3a25024bd712", sequenceContext.getParameterValue(SequenceContextParameters.UUID, contextInfo)); assertEquals("1", sequenceContext.getParameterValue(SequenceContextParameters.NUM, contextInfo)); assertEquals("audio", sequenceContext.getParameterValue(SequenceContextParameters.TYPE, contextInfo)); }
@Test public void testAddSequenceParameterInitsSequence() throws Exception { TemplateParameterContextProvider contextProvider = createDefaultContextProvider(); contextProvider.getSequenceContext().addSequenceParameter(SequenceType.VIDEO, SequenceUUID.create("urn:uuid:3333"), SequenceContextParameters.NUM, "5"); assertEquals(1, contextProvider.getSequenceContext().getSequenceCount(SequenceType.VIDEO)); assertArrayEquals( new SequenceUUID[]{SequenceUUID.create("urn:uuid:3333")}, contextProvider.getSequenceContext().getUuids(SequenceType.VIDEO).toArray()); assertDefaultSequenceParameters(contextProvider, 5, SequenceUUID.create("urn:uuid:3333"), SequenceType.VIDEO); }
@Test public void testSubtitleSequenceContext() throws Exception { assertEquals(6, sequenceContext.getSequenceCount(SequenceType.SUBTITLE));
@Test public void testInitSequenceOrder() throws Exception { TemplateParameterContextProvider contextProvider = createDefaultContextProvider(); contextProvider.getSequenceContext().initSequence(SequenceType.VIDEO, SequenceUUID.create("urn:uuid:3333")); contextProvider.getSequenceContext().initSequence(SequenceType.VIDEO, SequenceUUID.create("urn:uuid:1111")); contextProvider.getSequenceContext().initSequence(SequenceType.VIDEO, SequenceUUID.create("urn:uuid:2222")); contextProvider.getSequenceContext().initSequence(SequenceType.AUDIO, SequenceUUID.create("urn:uuid:2222")); contextProvider.getSequenceContext().initSequence(SequenceType.AUDIO, SequenceUUID.create("urn:uuid:3333")); contextProvider.getSequenceContext().initSequence(SequenceType.AUDIO, SequenceUUID.create("urn:uuid:1111")); contextProvider.getSequenceContext().initSequence(SequenceType.AUDIO, SequenceUUID.create("urn:uuid:4444")); assertEquals(3, contextProvider.getSequenceContext().getSequenceCount(SequenceType.VIDEO)); assertArrayEquals( new SequenceUUID[]{ SequenceUUID.create("urn:uuid:3333"), SequenceUUID.create("urn:uuid:1111"), SequenceUUID.create("urn:uuid:2222")}, contextProvider.getSequenceContext().getUuids(SequenceType.VIDEO).toArray()); assertEquals(4, contextProvider.getSequenceContext().getSequenceCount(SequenceType.AUDIO)); assertArrayEquals( new SequenceUUID[]{ SequenceUUID.create("urn:uuid:2222"), SequenceUUID.create("urn:uuid:3333"), SequenceUUID.create("urn:uuid:1111"), SequenceUUID.create("urn:uuid:4444")}, contextProvider.getSequenceContext().getUuids(SequenceType.AUDIO).toArray()); }
contextProvider.getSequenceContext().initSequence(SequenceType.AUDIO, SequenceUUID.create("urn:uuid:2222")); assertEquals(3, contextProvider.getSequenceContext().getSequenceCount(SequenceType.VIDEO)); assertArrayEquals( new SequenceUUID[]{ contextProvider.getSequenceContext().getUuids(SequenceType.VIDEO).toArray()); assertEquals(4, contextProvider.getSequenceContext().getSequenceCount(SequenceType.AUDIO)); assertArrayEquals( new SequenceUUID[]{