diff --git a/src/ffx/ffx.py b/src/ffx/ffx.py index 4319ab3..256a637 100755 --- a/src/ffx/ffx.py +++ b/src/ffx/ffx.py @@ -181,7 +181,8 @@ def unmux(ctx, else: ctx.obj['logger'].info(f"\nUnmuxing file {fp.getFilename()}\n") - for trackDescriptor in sourceMediaDescriptor.getAllTrackDescriptors(): + # for trackDescriptor in sourceMediaDescriptor.getAllTrackDescriptors(): + for trackDescriptor in sourceMediaDescriptor.getTrackDescriptors(): if trackDescriptor.getType() == TrackType.SUBTITLE or not subtitles_only: @@ -626,12 +627,14 @@ def convert(ctx, showSeason, showEpisode) - ctx.obj['logger'].debug(f"tmd subindices: {[t.getIndex() for t in targetMediaDescriptor.getAllTrackDescriptors()]} {[t.getSubIndex() for t in targetMediaDescriptor.getAllTrackDescriptors()]} {[t.getDispositionFlag(TrackDisposition.DEFAULT) for t in targetMediaDescriptor.getAllTrackDescriptors()]}") + # ctx.obj['logger'].debug(f"tmd subindices: {[t.getIndex() for t in targetMediaDescriptor.getAllTrackDescriptors()]} {[t.getSubIndex() for t in targetMediaDescriptor.getAllTrackDescriptors()]} {[t.getDispositionFlag(TrackDisposition.DEFAULT) for t in targetMediaDescriptor.getAllTrackDescriptors()]}") + ctx.obj['logger'].debug(f"tmd subindices: {[t.getIndex() for t in targetMediaDescriptor.getTrackDescriptors()]} {[t.getSubIndex() for t in targetMediaDescriptor.getTrackDescriptors()]} {[t.getDispositionFlag(TrackDisposition.DEFAULT) for t in targetMediaDescriptor.getTrackDescriptors()]}") if cliOverrides: targetMediaDescriptor.applyOverrides(cliOverrides) - ctx.obj['logger'].debug(f"tmd subindices: {[t.getIndex() for t in targetMediaDescriptor.getAllTrackDescriptors()]} {[t.getSubIndex() for t in targetMediaDescriptor.getAllTrackDescriptors()]} {[t.getDispositionFlag(TrackDisposition.DEFAULT) for t in targetMediaDescriptor.getAllTrackDescriptors()]}") + # ctx.obj['logger'].debug(f"tmd subindices: {[t.getIndex() for t in targetMediaDescriptor.getAllTrackDescriptors()]} {[t.getSubIndex() for t in targetMediaDescriptor.getAllTrackDescriptors()]} {[t.getDispositionFlag(TrackDisposition.DEFAULT) for t in targetMediaDescriptor.getAllTrackDescriptors()]}") + ctx.obj['logger'].debug(f"tmd subindices: {[t.getIndex() for t in targetMediaDescriptor.getTrackDescriptors()]} {[t.getSubIndex() for t in targetMediaDescriptor.getTrackDescriptors()]} {[t.getDispositionFlag(TrackDisposition.DEFAULT) for t in targetMediaDescriptor.getTrackDescriptors()]}") ctx.obj['logger'].debug(f"Input mapping tokens (2nd pass): {targetMediaDescriptor.getInputMappingTokens()}") diff --git a/src/ffx/ffx_controller.py b/src/ffx/ffx_controller.py index ec90cac..51dda24 100644 --- a/src/ffx/ffx_controller.py +++ b/src/ffx/ffx_controller.py @@ -5,6 +5,7 @@ from ffx.media_descriptor_change_set import MediaDescriptorChangeSet from ffx.media_descriptor import MediaDescriptor from ffx.audio_layout import AudioLayout from ffx.track_type import TrackType +from ffx.track_codec import TrackCodec from ffx.video_encoder import VideoEncoder from ffx.process import executeProcess @@ -81,6 +82,10 @@ class FfxController(): '-auto-alt-ref', '1', '-lag-in-frames', '25'] + def generateVideoCopyTokens(self, subIndex): + return [f"-c:v:{int(subIndex)}", + 'copy'] + def generateCropTokens(self): @@ -107,7 +112,8 @@ class FfxController(): audioTokens = [] - targetAudioTrackDescriptors = [td for td in self.__targetMediaDescriptor.getAllTrackDescriptors() if td.getType() == TrackType.AUDIO] + # targetAudioTrackDescriptors = [td for td in self.__targetMediaDescriptor.getAllTrackDescriptors() if td.getType() == TrackType.AUDIO] + targetAudioTrackDescriptors = self.__targetMediaDescriptor.getTrackDescriptors(trackType=TrackType.AUDIO) trackSubIndex = 0 for trackDescriptor in targetAudioTrackDescriptors: @@ -180,9 +186,14 @@ class FfxController(): commandSequence += self.__mdcs.generateMetadataTokens() commandSequence += denoiseTokens - commandSequence += (self.generateAudioEncodingTokens() - + self.generateAV1Tokens(int(quality), int(preset)) - + self.generateAudioEncodingTokens()) + for td in self.__targetMediaDescriptor.getTrackDescriptors(trackType=TrackType.VIDEO): + if td.getCodec == TrackCodec.PNG: + # commandSequence += self.generateVideoCopyTokens(td.getSubIndex()) + pass + else: + commandSequence += self.generateAV1Tokens(int(quality), int(preset)) + + commandSequence += self.generateAudioEncodingTokens() if self.__context['perform_crop']: commandSequence += FfxController.generateCropTokens() @@ -208,7 +219,12 @@ class FfxController(): # Confirm or find better filter settings for 2-pass # commandSequence1 += self.__context['denoiser'].generateDenoiseTokens() - commandSequence1 += self.generateVP9Pass1Tokens(int(quality)) + for td in self.__targetMediaDescriptor.getTrackDescriptors(trackType=TrackType.VIDEO): + if td.getCodec == TrackCodec.PNG: + # commandSequence1 += self.generateVideoCopyTokens(td.getSubIndex()) + pass + else: + commandSequence1 += self.generateVP9Pass1Tokens(int(quality)) if self.__context['perform_crop']: commandSequence1 += self.generateCropTokens() @@ -232,7 +248,14 @@ class FfxController(): commandSequence2 += self.__mdcs.generateMetadataTokens() commandSequence2 += denoiseTokens - commandSequence2 += self.generateVP9Pass2Tokens(int(quality)) + self.generateAudioEncodingTokens() + for td in self.__targetMediaDescriptor.getTrackDescriptors(trackType=TrackType.VIDEO): + if td.getCodec == TrackCodec.PNG: + # commandSequence2 += self.generateVideoCopyTokens(td.getSubIndex()) + pass + else: + commandSequence2 += self.generateVP9Pass2Tokens(int(quality)) + + commandSequence2 += self.generateAudioEncodingTokens() if self.__context['perform_crop']: commandSequence2 += self.generateCropTokens() diff --git a/src/ffx/media_controller.py b/src/ffx/media_controller.py index f776cd8..bb2d0de 100644 --- a/src/ffx/media_controller.py +++ b/src/ffx/media_controller.py @@ -32,7 +32,8 @@ class MediaController(): for mediaTagKey, mediaTagValue in mediaDescriptor.getTags(): self.__tac.updateMediaTag(pid, mediaTagKey, mediaTagValue) - for trackDescriptor in mediaDescriptor.getAllTrackDescriptors(): + # for trackDescriptor in mediaDescriptor.getAllTrackDescriptors(): + for trackDescriptor in mediaDescriptor.getTrackDescriptors(): self.__tc.addTrack(trackDescriptor, patternId = pid) s.commit() diff --git a/src/ffx/media_descriptor.py b/src/ffx/media_descriptor.py index b580bf6..e060361 100644 --- a/src/ffx/media_descriptor.py +++ b/src/ffx/media_descriptor.py @@ -105,14 +105,16 @@ class MediaDescriptor: def setDefaultSubTrack(self, trackType: TrackType, subIndex: int): - for t in self.getAllTrackDescriptors(): + # for t in self.getAllTrackDescriptors(): + for t in self.getTrackDescriptors(): if t.getType() == trackType: t.setDispositionFlag( TrackDisposition.DEFAULT, t.getSubIndex() == int(subIndex) ) def setForcedSubTrack(self, trackType: TrackType, subIndex: int): - for t in self.getAllTrackDescriptors(): + # for t in self.getAllTrackDescriptors(): + for t in self.getTrackDescriptors(): if t.getType() == trackType: t.setDispositionFlag( TrackDisposition.FORCED, t.getSubIndex() == int(subIndex) @@ -188,7 +190,8 @@ class MediaDescriptor: def applySourceIndices(self, sourceMediaDescriptor: Self): - sourceTrackDescriptors = sourceMediaDescriptor.getAllTrackDescriptors() + # sourceTrackDescriptors = sourceMediaDescriptor.getAllTrackDescriptors() + sourceTrackDescriptors = sourceMediaDescriptor.getTrackDescriptors() numTrackDescriptors = len(self.__trackDescriptors) if len(sourceTrackDescriptors) != numTrackDescriptors: @@ -283,9 +286,9 @@ class MediaDescriptor: tdList[trackIndex].setIndex(trackIndex) - def getAllTrackDescriptors(self): - """Returns all track descriptors sorted by type: video, audio then subtitles""" - return self.getVideoTracks() + self.getAudioTracks() + self.getSubtitleTracks() + # def getAllTrackDescriptors(self): + # """Returns all track descriptors sorted by type: video, audio then subtitles""" + # return self.getVideoTracks() + self.getAudioTracks() + self.getSubtitleTracks() def getTrackDescriptors(self, @@ -344,42 +347,49 @@ class MediaDescriptor: """Tracks must be reordered for source index order""" inputMappingTokens = [] + + sortedTrackDescriptors = sorted(self.__trackDescriptors, key=lambda d: d.getIndex()) - filePointer = 1 - for trackIndex in range(len(self.__trackDescriptors)): - - td: TrackDescriptor = self.__trackDescriptors[trackIndex] + # raise click.ClickException(' '.join([f"\nindex={td.getIndex()} subIndex={td.getSubIndex()} srcIndex={td.getSourceIndex()} type={td.getType().label()}" for td in self.__trackDescriptors])) - stdi = self.__trackDescriptors[td.getSourceIndex()].getIndex() - stdsi = self.__trackDescriptors[td.getSourceIndex()].getSubIndex() + filePointer = 1 + for trackIndex in range(len(sortedTrackDescriptors)): - trackType = td.getType() + td: TrackDescriptor = sortedTrackDescriptors[trackIndex] - if (trackType == TrackType.VIDEO or not only_video): + if td.getCodec() != TrackCodec.PNG: - importedFilePath = td.getExternalSourceFilePath() + stdi = sortedTrackDescriptors[td.getSourceIndex()].getIndex() + stdsi = sortedTrackDescriptors[td.getSourceIndex()].getSubIndex() - if use_sub_index: + trackType = td.getType() + + # if ((trackType == TrackType.VIDEO and td.getCodec() != TrackCodec.PNG) or not only_video): + if (trackType == TrackType.VIDEO or not only_video): - if importedFilePath: + importedFilePath = td.getExternalSourceFilePath() - inputMappingTokens += [ - "-map", - f"{filePointer}:{trackType.indicator()}:0", - ] - filePointer += 1 + if use_sub_index: - else: + if importedFilePath: - if td.getCodec() != TrackCodec.PGS: inputMappingTokens += [ "-map", - f"0:{trackType.indicator()}:{stdsi}", + f"{filePointer}:{trackType.indicator()}:0", ] + filePointer += 1 + + else: + + if td.getCodec() != TrackCodec.PGS: + inputMappingTokens += [ + "-map", + f"0:{trackType.indicator()}:{stdsi}", + ] - else: - if td.getCodec() != TrackCodec.PGS: - inputMappingTokens += ["-map", f"0:{stdi}"] + else: + if td.getCodec() != TrackCodec.PGS: + inputMappingTokens += ["-map", f"0:{stdi}"] return inputMappingTokens @@ -463,7 +473,8 @@ class MediaDescriptor: def getConfiguration(self, label: str = ''): yield f"--- {label if label else 'MediaDescriptor '+str(id(self))} {' '.join([str(k)+'='+str(v) for k,v in self.__mediaTags.items()])}" - for td in self.getAllTrackDescriptors(): + # for td in self.getAllTrackDescriptors(): + for td in self.getTrackDescriptors(): yield (f"{td.getIndex()}:{td.getType().indicator()}:{td.getSubIndex()} " + '|'.join([d.indicator() for d in td.getDispositionSet()]) + ' ' + ' '.join([str(k)+'='+str(v) for k,v in td.getTags().items()])) diff --git a/src/ffx/media_details_screen.py b/src/ffx/media_details_screen.py index 5429e61..9afbd71 100644 --- a/src/ffx/media_details_screen.py +++ b/src/ffx/media_details_screen.py @@ -373,7 +373,8 @@ class MediaDetailsScreen(Screen): self.tracksTable.clear() - trackDescriptorList = self.__sourceMediaDescriptor.getAllTrackDescriptors() + # trackDescriptorList = self.__sourceMediaDescriptor.getAllTrackDescriptors() + trackDescriptorList = self.__sourceMediaDescriptor.getTrackDescriptors() typeCounter = {} @@ -611,7 +612,8 @@ class MediaDetailsScreen(Screen): if tagKey not in self.__ignoreGlobalKeys and not tagKey in self.__removeGlobalKeys: self.__tac.updateMediaTag(patternId, tagKey, tagValue) - for trackDescriptor in self.__sourceMediaDescriptor.getAllTrackDescriptors(): + # for trackDescriptor in self.__sourceMediaDescriptor.getAllTrackDescriptors(): + for trackDescriptor in self.__sourceMediaDescriptor.getTrackDescriptors(): self.__tc.addTrack(trackDescriptor, patternId = patternId) diff --git a/src/ffx/test/helper.py b/src/ffx/test/helper.py index 2c35734..619ad3d 100644 --- a/src/ffx/test/helper.py +++ b/src/ffx/test/helper.py @@ -164,7 +164,8 @@ def createMediaTestFile(mediaDescriptor: MediaDescriptor, subIndexCounter = {} - for trackDescriptor in mediaDescriptor.getAllTrackDescriptors(): + # for trackDescriptor in mediaDescriptor.getAllTrackDescriptors(): + for trackDescriptor in mediaDescriptor.getTrackDescriptors(): trackType = trackDescriptor.getType() diff --git a/src/ffx/test/scenario_2.py b/src/ffx/test/scenario_2.py index 08858a1..4fa7ea8 100644 --- a/src/ffx/test/scenario_2.py +++ b/src/ffx/test/scenario_2.py @@ -122,7 +122,8 @@ class Scenario2(Scenario): resultFileProperties = FileProperties(testContext, resultFile) resultMediaDescriptor = resultFileProperties.getMediaDescriptor() - resultMediaTracks = resultMediaDescriptor.getAllTrackDescriptors() + # resultMediaTracks = resultMediaDescriptor.getAllTrackDescriptors() + resultMediaTracks = resultMediaDescriptor.getTrackDescriptors() for assertIndex in range(len(assertSelectorList)): diff --git a/src/ffx/test/scenario_4.py b/src/ffx/test/scenario_4.py index f4f3efc..677da08 100644 --- a/src/ffx/test/scenario_4.py +++ b/src/ffx/test/scenario_4.py @@ -223,7 +223,8 @@ class Scenario4(Scenario): self._logger.debug(f"{variantLabel}: Result file properties: {rfp.getFilename()} season={rfp.getSeason()} episode={rfp.getEpisode()}") rmd = rfp.getMediaDescriptor() - rmt = rmd.getAllTrackDescriptors() + # rmt = rmd.getAllTrackDescriptors() + rmt = rmd.getTrackDescriptors() for l in rmd.getConfiguration(label = 'resultMediaDescriptor'): self._logger.debug(l)