Skip to content

Instantly share code, notes, and snippets.

Created April 27, 2016 12:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save anonymous/5393d6ec4d2c7f8431e2a97fd750a76d to your computer and use it in GitHub Desktop.
Save anonymous/5393d6ec4d2c7f8431e2a97fd750a76d to your computer and use it in GitHub Desktop.
Python script to extract NAL Units
import argparse
# ...
def extractLayers(inputFilename, outputFilename="", temporalLayer=None):
'''
VUL HIER CODE AAN
'''
voorsplit = open(inputFilename)
gesplit = split_file(voorsplit, "0x00".encode("cp1252"))
print(gesplit)
nalus = ""
filteredNalus = ""
print("Oorspronkelijk aantal NAL units =", len(nalus))
print("Overgebleven aantal NAL units =", len(filteredNalus))
print("Verwijderd aantal NAL units =", len(nalus) - len(filteredNalus))
# Methode voor de file te splitten in NAL-units.
def split_file(fp, marker):
# De standaard blocksize die we zullen uitlezen uit de file.
BLOCKSIZE = 4096
# De lijst die uiteindelijk zal teruggegeven worden : Declaratie
result = []
# De huidige collectie van bytes die we aan het bekijken zijn.
current = ''
# Voor elke @BLOCKSIZE bytes uit onze file, voeg deze toe aan onze @current collectie
for block in iter(lambda: fp.read(BLOCKSIZE), ''):
current += block
while 1:
# Vind de index van onze @marker (sequentie van bits). Geeft -1 terug indien er geen gevonden wordt in de
# @current collection. Bij het niet vinden van de @marker in de collection @current : Breek de lus af.
markerpos = current.find(marker)
if markerpos == -1:
break
# Voeg alles toe aan @result wat na de @markerpos komt in @current
result.append(current[:markerpos])
# Vervang @current door alles wat in @current zit tot en met (@markerpos + lengte @marker)
# Dus verwijderen van alle elementen in @current die na de index van (@markerpos + lengte @marker) komen.
current = current[markerpos + len(marker):]
# Voeg het laatste stuk van de file (het geen nog overblijft in @current) toe aan de lijst van resultaten.
result.append(current)
return result
# Definitie van de functie main()
def main():
# Creëer een parser object die onze commandolijn argumenten zal parsen.
parser = argparse.ArgumentParser(description='HEVC extractor.')
# Voeg de verschillende typen argumenten die mogelijk is, toe aan de parser. (Met bijhorende help)
parser.add_argument('-i', '--inputFile', type=str, help='Input bitstream file.', required=True)
parser.add_argument('-o', '--outputFile', type=str, default="", help='Output bitstream file.', required=False)
parser.add_argument('-t', '--temporalLayer', nargs='*', type=int,
help='Temporal layer(s) to extract. (E.g. -t 0 1 means that the result only keeps layer 0 and 1.',
required=False)
# Krijg alle argumenten met hun waarden terug als dict uit onze parser
args = vars(parser.parse_args())
# Roep de functie aan die uiteindelijk de bewerkingen zal uitvoeren op de verschillende stromen, met de correcte argumenten.
extractLayers(args['inputFile'], args['outputFile'], args['temporalLayer'])
# Run de main functie (Beschreven hierboven ^^ )
if __name__ == "__main__":
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment