Created
April 27, 2016 12:00
-
-
Save anonymous/5393d6ec4d2c7f8431e2a97fd750a76d to your computer and use it in GitHub Desktop.
Python script to extract NAL Units
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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