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