From 367cb440d8186d963b3476d91af4f11ec2497736 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Tronel?= Date: Wed, 29 Oct 2025 12:37:51 +0100 Subject: [PATCH] Even more linting: function names with snake case, remove unused variables, wrong format f-strings, masked parameters. --- removeads.py | 906 +++++++++++++++++++++++++-------------------------- 1 file changed, 444 insertions(+), 462 deletions(-) diff --git a/removeads.py b/removeads.py index 577eed3..74f151d 100755 --- a/removeads.py +++ b/removeads.py @@ -53,7 +53,7 @@ from iso639.exceptions import InvalidLanguageValue # Then finally, change the Private Codec Data in the final MKV. -def checkRequiredTools() -> tuple[bool,list[str]]: +def check_required_tools() -> tuple[bool,list[str]]: """Check if required external tools are installed. Args: @@ -83,11 +83,11 @@ def checkRequiredTools() -> tuple[bool,list[str]]: return all_optional_tools, paths -def getTesseractSupportedLang(tesseract:str) -> dict[str,str]|None: +def get_tesseract_supported_lang(tesseract_path:str) -> dict[str,str]|None: """Returns the set of natural languages supported by Tesseract OCR tool. Args: - tesseract: str: path to tesseract binary. + tesseract_path: str: path to tesseract binary. Returns: dict[str, str] : a mapping .... @@ -95,7 +95,7 @@ def getTesseractSupportedLang(tesseract:str) -> dict[str,str]|None: logger = logging.getLogger(__name__) res = {} - with Popen([tesseract, '--list-langs'], stdout=PIPE) as tesseract: + with Popen([tesseract_path, '--list-langs'], stdout=PIPE) as tesseract: for line in tesseract.stdout: line = line.decode('utf8') p = re.compile('(?P[a-z]{3})\n') @@ -117,7 +117,7 @@ def getTesseractSupportedLang(tesseract:str) -> dict[str,str]|None: return res -def getFrameRate(ffprobe:str, inputFile) -> float|None: +def get_frame_rate(ffprobe_path:str, inputFile) -> float|None: logger = logging.getLogger(__name__) infd = inputFile.fileno() @@ -131,7 +131,7 @@ def getFrameRate(ffprobe:str, inputFile) -> float|None: max_ts = None interlaced = False - params = [ffprobe, '-loglevel', 'quiet', '-select_streams', 'v', '-show_frames', + params = [ffprobe_path, '-loglevel', 'quiet', '-select_streams', 'v', '-show_frames', '-read_intervals', '00%+30', '-of', 'json', f'/proc/self/fd/{infd:d}'] env = {**os.environ, 'LANG': 'C'} with Popen(params, stdout=PIPE, close_fds=False, env=env) as ffprobe: @@ -182,11 +182,11 @@ def getFrameRate(ffprobe:str, inputFile) -> float|None: return None -def getSubTitlesTracks(ffprobe:str, mkvPath: str) -> dict[str,str]|None: +def get_subtitles_tracks(ffprobe_path:str, mkvPath: str) -> dict[str,str]|None: logger = logging.getLogger(__name__) tracks={} - with Popen([ffprobe, '-loglevel', 'quiet', '-select_streams', 's', '-show_entries', + with Popen([ffprobe_path, '-loglevel', 'quiet', '-select_streams', 's', '-show_entries', 'stream=index,codec_name:stream_tags=language', '-of', 'json', mkvPath], stdout=PIPE) as ffprobe: out, _ = ffprobe.communicate() @@ -200,9 +200,9 @@ def getSubTitlesTracks(ffprobe:str, mkvPath: str) -> dict[str,str]|None: if lang not in tracks: tracks[lang] = [index] else: - l = tracks[lang] - l.append(index) - tracks[lang] = l + current_langs = tracks[lang] + current_langs.append(index) + tracks[lang] = current_langs else: return None @@ -214,7 +214,7 @@ def getSubTitlesTracks(ffprobe:str, mkvPath: str) -> dict[str,str]|None: return tracks -def extractSRT(mkvextract:str, fileName:str, subtitles:str, langs:list[str]) -> list|None: +def extract_srt(mkvextract:str, fileName:str, subtitles:str, langs:list[str]) -> list|None: logger = logging.getLogger(__name__) params = [mkvextract, fileName, 'tracks'] @@ -270,7 +270,7 @@ def extractSRT(mkvextract:str, fileName:str, subtitles:str, langs:list[str]) -> logger.error('Mkvextract returns an error code: %d', extract.returncode) return None -def doOCR(vobsubocr, idxs, duration, temporaries, dumpMemFD=False): +def do_ocr(vobsubocr, idxs, duration, temporaries, dumpMemFD=False): logger = logging.getLogger(__name__) res = [] @@ -353,7 +353,7 @@ class SupportedFormat(IntEnum): # -report -loglevel 0 -f null - # Found codec private data using mkvinfo -def getCodecPrivateDataFromMKV(mkvinfo, inputFile): +def get_codec_private_data_from_mkv(mkvinfo_path, inputFile): logger = logging.getLogger(__name__) infd = inputFile.fileno() @@ -366,7 +366,7 @@ def getCodecPrivateDataFromMKV(mkvinfo, inputFile): # 64 00 28 ac d9 40 78 04 4f dc d4 04 04 05 00 00 92 ef 00 1d ad a6 1f 16 2d 96 01 00 06 68 fb\ # a3 cb 22 c0 fd f8 f8 00 at 406 size 51 data size 48 - with Popen([mkvinfo, '-z', '-X', '-P', f'/proc/self/fd/{infd:d}'], stdout=PIPE, + with Popen([mkvinfo_path, '-z', '-X', '-P', f'/proc/self/fd/{infd:d}'], stdout=PIPE, close_fds=False, env=env) as mkvinfo: out, _ = mkvinfo.communicate() out = out.decode('utf8') @@ -395,63 +395,56 @@ def getCodecPrivateDataFromMKV(mkvinfo, inputFile): # ISO/IEC H.264-201602 # ISO/IEC 14496-15 -def readBit(buf, bit_position): - # pylint: disable=W0612 - logger = logging.getLogger(__name__) +def read_bit(buf, bit_position): byte_position = floor(floor(bit_position/8)) byte = buf[byte_position] bit = (byte >> (7-(bit_position % 8))) & 1 return bit_position+1, bit -def readBoolean(buf, bit_position): - bit_position, b = readBit(buf, bit_position) +def read_boolean(buf, bit_position): + bit_position, b = read_bit(buf, bit_position) return bit_position, b==1 -def readBits(buf, bit_position, nbBits): - logger = logging.getLogger(__name__) +def read_bits(buf, bit_position, nbBits): v = 0 for _ in range(0, nbBits): - bit_position, bit = readBit(buf, bit_position) + bit_position, bit = read_bit(buf, bit_position) v = v*2+bit return bit_position, v -def readByte(buf, bit_position): - bit_position, b = readBits(buf, bit_position, 8) +def read_byte(buf, bit_position): + bit_position, b = read_bits(buf, bit_position, 8) return bit_position, b -def readWord(buf, bit_position): - bit_position, w = readBits(buf, bit_position, 16) +def read_word(buf, bit_position): + bit_position, w = read_bits(buf, bit_position, 16) return bit_position, w -def readLong(buf, bit_position): - bit_position, l = readBits(buf, bit_position, 32) - return bit_position, l +def read_long(buf, bit_position): + bit_position, value = read_bits(buf, bit_position, 32) + return bit_position, value -def readUnsignedExpGolomb(buf, bit_position): +def read_unsigned_exp_golomb(buf, bit_position): nb_zeroes=0 while True: - bit_position, b = readBit(buf, bit_position) + bit_position, b = read_bit(buf, bit_position) if b!=0: break nb_zeroes+=1 v1 = 1 - bit_position, v2 = readBits(buf, bit_position, nb_zeroes) + bit_position, v2 = read_bits(buf, bit_position, nb_zeroes) v = (v1<>1) else: return bit_position, (v+1)>>1 -def writeBit(buf, bit_position, b): - logger = logging.getLogger(__name__) - +def write_bit(buf, bit_position, b): buf_length = len(buf) byte_position = floor(bit_position/8) @@ -464,72 +457,69 @@ def writeBit(buf, bit_position, b): return bit_position -def writeBoolean(buf, bit_position, b): +def write_boolean(buf, bit_position, b): if b: - bit_position = writeBit(buf, bit_position, 1) + bit_position = write_bit(buf, bit_position, 1) else: - bit_position = writeBit(buf, bit_position, 0) + bit_position = write_bit(buf, bit_position, 0) return bit_position -def writeBits(buf, bit_position, v, size): +def write_bits(buf, bit_position, v, size): for i in range(size-1,-1,-1): b = (v>>i)&1 - bit_position = writeBit(buf, bit_position, b) + bit_position = write_bit(buf, bit_position, b) return bit_position -def writeByte(buf, bit_position, v): - bit_position = writeBits(buf, bit_position, v, 8) +def write_byte(buf, bit_position, v): + bit_position = write_bits(buf, bit_position, v, 8) return bit_position -def writeWord(buf, bit_position, v): - bit_position = writeBits(buf, bit_position, v, 16) +def write_word(buf, bit_position, v): + bit_position = write_bits(buf, bit_position, v, 16) return bit_position -def writeLong(buf, bit_position, v): - bit_position = writeBits(buf, bit_position, v, 32) +def write_long(buf, bit_position, v): + bit_position = write_bits(buf, bit_position, v, 32) return bit_position -def writeUnsignedExpGolomb(buf, bit_position, v): - logger = logging.getLogger(__name__) +def write_unsigned_exp_golomb(buf, bit_position, v): n = floor(log(v+1)/log(2))+1 # Write zeroes - bit_position = writeBits(buf, bit_position, 0, n-1) - bit_position = writeBit(buf, bit_position, 1) - bit_position = writeBits(buf, bit_position, v+1, n-1) + bit_position = write_bits(buf, bit_position, 0, n-1) + bit_position = write_bit(buf, bit_position, 1) + bit_position = write_bits(buf, bit_position, v+1, n-1) return bit_position -def writeSignedExpGolomb(buf, bit_position, v): +def write_signed_exp_golomb(buf, bit_position, v): if v <= 0: - bit_position = writeUnsignedExpGolomb(buf, bit_position, -v*2) + bit_position = write_unsigned_exp_golomb(buf, bit_position, -v*2) else: - bit_position = writeUnsignedExpGolomb(buf, bit_position, v*2-1) + bit_position = write_unsigned_exp_golomb(buf, bit_position, v*2-1) return bit_position -def parseRBSPTrailingBits(buf, bit_position): - logger = logging.getLogger(__name__) - - bit_position, one = readBit(buf, bit_position) +def parse_rbsp_trailing_bits(buf, bit_position): + bit_position, one = read_bit(buf, bit_position) if one==0: raise ValueError(f'Stop bit should be equal to one. Read: {one:d}') while bit_position%8 != 0: - bit_position, zero = readBit(buf, bit_position) + bit_position, zero = read_bit(buf, bit_position) if zero==1: raise ValueError('Trailing bit should be equal to zero') return bit_position -def writeRBSPTrailingBits(buf, bit_position): - bit_position = writeBit(buf, bit_position, 1) +def write_rbsp_trailing_bits(buf, bit_position): + bit_position = write_bit(buf, bit_position, 1) while bit_position%8 != 0: - bit_position = writeBit(buf, bit_position, 0) + bit_position = write_bit(buf, bit_position, 0) return bit_position -def moreRBSPData(buf, bit_position): +def more_rbsp_data(buf, bit_position): logger = logging.getLogger(__name__) logger.debug('Is there more data in buffer of length: %d at bit position: %d', len(buf), bit_position) @@ -543,7 +533,7 @@ def moreRBSPData(buf, bit_position): else: found = False for i in range(bit_length-1,-1,-1): - pos, b = readBit(buf, i) + pos, b = read_bit(buf, i) if b == 1: found = True break @@ -558,7 +548,7 @@ def moreRBSPData(buf, bit_position): return True # Convert from RBSP (Raw Byte Sequence Payload) to SODB (String Of Data Bits) -def RBSP2SODB(buf): +def rbsp_to_sodb(buf): logger = logging.getLogger(__name__) logger.debug('RBSP: %s', hexdump.dump(buf, sep=':')) @@ -573,7 +563,7 @@ def RBSP2SODB(buf): return res # Reverse operation SODB to RBSP. -def SODB2RBSP(buf): +def sodb_to_rbsp(buf): logger = logging.getLogger(__name__) logger.debug('SODB: %s', hexdump.dump(buf, sep=':')) @@ -587,15 +577,13 @@ def SODB2RBSP(buf): return res # Useful for SPS and PPS -def parseScalingList(buf, bit_position, size): - logger = logging.getLogger(__name__) - +def parse_scaling_list(buf, bit_position, size): res = [] last_scale = 8 next_scale = 8 for _ in range(0, size): if next_scale != 0: - bit_position, delta_scale = readSignedExpGolomb(buf, bit_position) + bit_position, delta_scale = read_signed_exp_golomb(buf, bit_position) next_scale = (last_scale+delta_scale+256) % 256 v = last_scale if next_scale==0 else next_scale res.append(v) @@ -606,7 +594,7 @@ def parseScalingList(buf, bit_position, size): # TODO: test optimized version. # The ISO/IEC H.264-201602 seems to take into account the case where the end of the deltas list # is full of zeroes. -def writeScalingList(buf, bit_position, size, matrix, optimized=False): +def write_scaling_list(buf, bit_position, size, matrix, optimized=False): logger = logging.getLogger(__name__) logger.debug('Dumping matrix: %s of size: %d, size parameter: %d.', matrix, len(matrix), size) @@ -620,7 +608,7 @@ def writeScalingList(buf, bit_position, size, matrix, optimized=False): if not optimized: for delta in deltas: - bit_position = writeSignedExpGolomb(buf, bit_position, delta) + bit_position = write_signed_exp_golomb(buf, bit_position, delta) else: logger.error('Not yet implemented') exit(-1) @@ -636,7 +624,7 @@ def writeScalingList(buf, bit_position, size, matrix, optimized=False): # if compressed: # deltas.append(0) # for delta in deltas: - # bit_position = writeSignedExpGolomb(buf, bit_position, delta) + # bit_position = write_signed_exp_golomb(buf, bit_position, delta) return bit_position @@ -659,38 +647,38 @@ class HRD: self.cbr_flag = {} def fromBytes(self, buf, bit_position): - bit_position, self.cpb_cnt_minus1 = readUnsignedExpGolomb(buf, bit_position) - bit_position, self.bit_rate_scale = readBits(buf, bit_position, 4) - bit_position, self.cpb_size_scale = readBits(buf, bit_position, 4) + bit_position, self.cpb_cnt_minus1 = read_unsigned_exp_golomb(buf, bit_position) + bit_position, self.bit_rate_scale = read_bits(buf, bit_position, 4) + bit_position, self.cpb_size_scale = read_bits(buf, bit_position, 4) for i in range(0, self.cpb_cnt_minus1+1): - bit_position, v = readUnsignedExpGolomb(buf, bit_position) + bit_position, v = read_unsigned_exp_golomb(buf, bit_position) self.bit_rate_value_minus1[i] = v - bit_position, v = readUnsignedExpGolomb(buf, bit_position) + bit_position, v = read_unsigned_exp_golomb(buf, bit_position) self.cpb_size_value_minus1[i] = v - bit_position, b = readBoolean(buf, bit_position) + bit_position, b = read_boolean(buf, bit_position) self.cbr_flag[i] = b - bit_position, self.initial_cpb_removal_delay_length_minus1 = readBits(buf, bit_position, 5) - bit_position, self.cpb_removal_delay_length_minus1 = readBits(buf, bit_position, 5) - bit_position, self.dpb_output_delay_length_minus1 = readBits(buf, bit_position, 5) - bit_position, self.time_offset_length = readBits(buf, bit_position, 5) + bit_position, self.initial_cpb_removal_delay_length_minus1 = read_bits(buf, bit_position, 5) + bit_position, self.cpb_removal_delay_length_minus1 = read_bits(buf, bit_position, 5) + bit_position, self.dpb_output_delay_length_minus1 = read_bits(buf, bit_position, 5) + bit_position, self.time_offset_length = read_bits(buf, bit_position, 5) return bit_position def toBytes(self, buf, bit_position): - bit_position = writeUnsignedExpGolomb(buf, bit_position, self.cpb_cnt_minus1) - bit_position = writeBits(buf, bit_position, self.bit_rate_scale, 4) - bit_position = writeBits(buf, bit_position, self.cpb_size_scale, 4) + bit_position = write_unsigned_exp_golomb(buf, bit_position, self.cpb_cnt_minus1) + bit_position = write_bits(buf, bit_position, self.bit_rate_scale, 4) + bit_position = write_bits(buf, bit_position, self.cpb_size_scale, 4) for i in range(0, self.cpb_cnt_minus1+1): v = self.bit_rate_value_minus1[i] - bit_position = writeUnsignedExpGolomb(buf, bit_position, v) + bit_position = write_unsigned_exp_golomb(buf, bit_position, v) v = self.cpb_size_value_minus1[i] - bit_position = writeUnsignedExpGolomb(buf, bit_position, v) + bit_position = write_unsigned_exp_golomb(buf, bit_position, v) b = self.cbr_flag[i] - bit_position = writeBoolean(buf, bit_position, b) - bit_position = writeBits(buf, bit_position, self.initial_cpb_removal_delay_length_minus1, 5) - bit_position = writeBits(buf, bit_position, self.cpb_removal_delay_length_minus1, 5) - bit_position = writeBits(buf, bit_position, self.dpb_output_delay_length_minus1, 5) - bit_position = writeBits(buf, bit_position, self.time_offset_length, 5) + bit_position = write_boolean(buf, bit_position, b) + bit_position = write_bits(buf, bit_position, self.initial_cpb_removal_delay_length_minus1, 5) + bit_position = write_bits(buf, bit_position, self.cpb_removal_delay_length_minus1, 5) + bit_position = write_bits(buf, bit_position, self.dpb_output_delay_length_minus1, 5) + bit_position = write_bits(buf, bit_position, self.time_offset_length, 5) return bit_position @@ -734,118 +722,114 @@ class VUI: # This structure is not guaranteed to be located at a byte boundary. # We must explicitely indicate bit offset. def fromBytes(self, buf, bit_position): - logger = logging.getLogger(__name__) - - bit_position, self.aspect_ratio_info_present_flag = readBoolean(buf, bit_position) + bit_position, self.aspect_ratio_info_present_flag = read_boolean(buf, bit_position) if self.aspect_ratio_info_present_flag: - bit_position, self.aspect_ratio_idc = readByte(buf, bit_position) + bit_position, self.aspect_ratio_idc = read_byte(buf, bit_position) if self.aspect_ratio_idc == 255: # Extended_SAR - bit_position, self.sar_width = readWord(buf, bit_position) - bit_position, self.sar_height = readWord(buf, bit_position) - bit_position, self.overscan_info_present_flag = readBoolean(buf, bit_position) + bit_position, self.sar_width = read_word(buf, bit_position) + bit_position, self.sar_height = read_word(buf, bit_position) + bit_position, self.overscan_info_present_flag = read_boolean(buf, bit_position) if self.overscan_info_present_flag: - bit_position, self.overscan_appropriate_flag = readBoolean(buf, bit_position) - bit_position, self.video_signal_type_present_flag = readBoolean(buf, bit_position) + bit_position, self.overscan_appropriate_flag = read_boolean(buf, bit_position) + bit_position, self.video_signal_type_present_flag = read_boolean(buf, bit_position) if self.video_signal_type_present_flag: - bit_position, self.video_format = readBits(buf, bit_position, 3) - bit_position, self.video_full_range_flag = readBoolean(buf, bit_position) - bit_position, self.colour_description_present_flag = readBoolean(buf, bit_position) + bit_position, self.video_format = read_bits(buf, bit_position, 3) + bit_position, self.video_full_range_flag = read_boolean(buf, bit_position) + bit_position, self.colour_description_present_flag = read_boolean(buf, bit_position) if self.colour_description_present_flag: - bit_position, self.colour_primaries = readByte(buf, bit_position) - bit_position, self.transfer_characteristics = readByte(buf, bit_position) - bit_position, self.matrix_coefficients = readByte(buf, bit_position) - bit_position, self.chroma_loc_info_present_flag = readBoolean(buf, bit_position) + bit_position, self.colour_primaries = read_byte(buf, bit_position) + bit_position, self.transfer_characteristics = read_byte(buf, bit_position) + bit_position, self.matrix_coefficients = read_byte(buf, bit_position) + bit_position, self.chroma_loc_info_present_flag = read_boolean(buf, bit_position) if self.chroma_loc_info_present_flag: bit_position, self.chroma_sample_loc_type_top_field =\ - readUnsignedExpGolomb(buf, bit_position) + read_unsigned_exp_golomb(buf, bit_position) bit_position, self.chroma_sample_loc_type_bottom_field =\ - readUnsignedExpGolomb(buf,bit_position) - bit_position, self.timing_info_present_flag = readBoolean(buf, bit_position) + read_unsigned_exp_golomb(buf,bit_position) + bit_position, self.timing_info_present_flag = read_boolean(buf, bit_position) if self.timing_info_present_flag: - bit_position, self.num_units_in_tick = readLong(buf, bit_position) - bit_position, self.time_scale = readLong(buf, bit_position) - bit_position, self.fixed_frame_rate_flag = readBoolean(buf, bit_position) - bit_position, self.nal_hrd_parameters_present_flag = readBoolean(buf, bit_position) + bit_position, self.num_units_in_tick = read_long(buf, bit_position) + bit_position, self.time_scale = read_long(buf, bit_position) + bit_position, self.fixed_frame_rate_flag = read_boolean(buf, bit_position) + bit_position, self.nal_hrd_parameters_present_flag = read_boolean(buf, bit_position) if self.nal_hrd_parameters_present_flag: hrd = HRD() bit_position = hrd.fromBytes(buf, bit_position) self.hrd_parameters = hrd - bit_position, self.vcl_hrd_parameters_present_flag = readBoolean(buf, bit_position) + bit_position, self.vcl_hrd_parameters_present_flag = read_boolean(buf, bit_position) if self.vcl_hrd_parameters_present_flag: hrd = HRD() bit_position = hrd.fromBytes(buf, bit_position) self.vcl_hrd_parameters = hrd if self.nal_hrd_parameters_present_flag or self.vcl_hrd_parameters_present_flag: - bit_position, self.low_delay_hrd_flag = readBoolean(buf, bit_position) - bit_position, self.pic_struct_present_flag = readBoolean(buf, bit_position) - bit_position, self.bitstream_restriction_flag = readBoolean(buf, bit_position) + bit_position, self.low_delay_hrd_flag = read_boolean(buf, bit_position) + bit_position, self.pic_struct_present_flag = read_boolean(buf, bit_position) + bit_position, self.bitstream_restriction_flag = read_boolean(buf, bit_position) if self.bitstream_restriction_flag: bit_position, self.motion_vectors_over_pic_boundaries_flag =\ - readBoolean(buf, bit_position) - bit_position, self.max_bytes_per_pic_denom = readUnsignedExpGolomb(buf, bit_position) - bit_position, self.max_bits_per_mb_denom = readUnsignedExpGolomb(buf, bit_position) - bit_position, self.log2_max_mv_length_horizontal = readUnsignedExpGolomb(buf, + read_boolean(buf, bit_position) + bit_position, self.max_bytes_per_pic_denom = read_unsigned_exp_golomb(buf, bit_position) + bit_position, self.max_bits_per_mb_denom = read_unsigned_exp_golomb(buf, bit_position) + bit_position, self.log2_max_mv_length_horizontal = read_unsigned_exp_golomb(buf, bit_position) - bit_position, self.log2_max_mv_length_vertical = readUnsignedExpGolomb(buf, + bit_position, self.log2_max_mv_length_vertical = read_unsigned_exp_golomb(buf, bit_position) - bit_position, self.max_num_reorder_frames = readUnsignedExpGolomb(buf, bit_position) - bit_position, self.max_dec_frame_buffering = readUnsignedExpGolomb(buf, bit_position) + bit_position, self.max_num_reorder_frames = read_unsigned_exp_golomb(buf, bit_position) + bit_position, self.max_dec_frame_buffering = read_unsigned_exp_golomb(buf, bit_position) return bit_position def toBytes(self, buf, bit_position): - logger = logging.getLogger(__name__) - - bit_position = writeBoolean(buf, bit_position, self.aspect_ratio_info_present_flag) + bit_position = write_boolean(buf, bit_position, self.aspect_ratio_info_present_flag) if self.aspect_ratio_info_present_flag: - bit_position = writeByte(buf, bit_position, self.aspect_ratio_idc) + bit_position = write_byte(buf, bit_position, self.aspect_ratio_idc) if self.aspect_ratio_idc == 255: # Extended_SAR - bit_position = writeWord(buf, bit_position, self.sar_width) - bit_position = writeWord(buf, bit_position, self.sar_height) - bit_position = writeBoolean(buf, bit_position, self.overscan_info_present_flag) + bit_position = write_word(buf, bit_position, self.sar_width) + bit_position = write_word(buf, bit_position, self.sar_height) + bit_position = write_boolean(buf, bit_position, self.overscan_info_present_flag) if self.overscan_info_present_flag: - bit_position = writeBoolean(buf, bit_position, self.overscan_appropriate_flag) - bit_position = writeBoolean(buf, bit_position, self.video_signal_type_present_flag) + bit_position = write_boolean(buf, bit_position, self.overscan_appropriate_flag) + bit_position = write_boolean(buf, bit_position, self.video_signal_type_present_flag) if self.video_signal_type_present_flag: - bit_position = writeBits(buf, bit_position, self.video_format, 3) - bit_position = writeBoolean(buf, bit_position, self.video_full_range_flag) - bit_position = writeBoolean(buf, bit_position, self.colour_description_present_flag) + bit_position = write_bits(buf, bit_position, self.video_format, 3) + bit_position = write_boolean(buf, bit_position, self.video_full_range_flag) + bit_position = write_boolean(buf, bit_position, self.colour_description_present_flag) if self.colour_description_present_flag: - bit_position = writeByte(buf, bit_position, self.colour_primaries) - bit_position = writeByte(buf, bit_position, self.transfer_characteristics) - bit_position = writeByte(buf, bit_position, self.matrix_coefficients) - bit_position = writeBoolean(buf, bit_position, self.chroma_loc_info_present_flag) + bit_position = write_byte(buf, bit_position, self.colour_primaries) + bit_position = write_byte(buf, bit_position, self.transfer_characteristics) + bit_position = write_byte(buf, bit_position, self.matrix_coefficients) + bit_position = write_boolean(buf, bit_position, self.chroma_loc_info_present_flag) if self.chroma_loc_info_present_flag: - bit_position = writeUnsignedExpGolomb(buf, bit_position, + bit_position = write_unsigned_exp_golomb(buf, bit_position, self.chroma_sample_loc_type_top_field) - bit_position = writeUnsignedExpGolomb(buf, bit_position, + bit_position = write_unsigned_exp_golomb(buf, bit_position, self.chroma_sample_loc_type_bottom_field) - bit_position = writeBoolean(buf, bit_position, self.timing_info_present_flag ) + bit_position = write_boolean(buf, bit_position, self.timing_info_present_flag ) if self.timing_info_present_flag: - bit_position = writeLong(buf, bit_position, self.num_units_in_tick ) - bit_position = writeLong(buf, bit_position, self.time_scale) - bit_position = writeBoolean(buf, bit_position, self.fixed_frame_rate_flag) - bit_position = writeBoolean(buf, bit_position, self.nal_hrd_parameters_present_flag) + bit_position = write_long(buf, bit_position, self.num_units_in_tick ) + bit_position = write_long(buf, bit_position, self.time_scale) + bit_position = write_boolean(buf, bit_position, self.fixed_frame_rate_flag) + bit_position = write_boolean(buf, bit_position, self.nal_hrd_parameters_present_flag) if self.nal_hrd_parameters_present_flag: bit_position = self.hrd_parameters.toBytes(buf, bit_position) - bit_position = writeBoolean(buf, bit_position, self.vcl_hrd_parameters_present_flag) + bit_position = write_boolean(buf, bit_position, self.vcl_hrd_parameters_present_flag) if self.vcl_hrd_parameters_present_flag: bit_position = self.vcl_hrd_parameters.toBytes(buf, bit_position) if self.nal_hrd_parameters_present_flag or self.vcl_hrd_parameters_present_flag: - bit_position = writeBoolean(buf, bit_position, self.low_delay_hrd_flag) - bit_position = writeBoolean(buf, bit_position, self.pic_struct_present_flag) - bit_position = writeBoolean(buf, bit_position, self.bitstream_restriction_flag) + bit_position = write_boolean(buf, bit_position, self.low_delay_hrd_flag) + bit_position = write_boolean(buf, bit_position, self.pic_struct_present_flag) + bit_position = write_boolean(buf, bit_position, self.bitstream_restriction_flag) if self.bitstream_restriction_flag: - bit_position = writeBoolean(buf, bit_position, + bit_position = write_boolean(buf, bit_position, self.motion_vectors_over_pic_boundaries_flag) - bit_position = writeUnsignedExpGolomb(buf, bit_position, self.max_bytes_per_pic_denom) - bit_position = writeUnsignedExpGolomb(buf, bit_position, self.max_bits_per_mb_denom) - bit_position = writeUnsignedExpGolomb(buf, bit_position, + bit_position = write_unsigned_exp_golomb(buf, bit_position, self.max_bytes_per_pic_denom) + bit_position = write_unsigned_exp_golomb(buf, bit_position, self.max_bits_per_mb_denom) + bit_position = write_unsigned_exp_golomb(buf, bit_position, self.log2_max_mv_length_horizontal) - bit_position = writeUnsignedExpGolomb(buf, bit_position, + bit_position = write_unsigned_exp_golomb(buf, bit_position, self.log2_max_mv_length_vertical) - bit_position = writeUnsignedExpGolomb(buf, bit_position, self.max_num_reorder_frames) - bit_position = writeUnsignedExpGolomb(buf, bit_position, self.max_dec_frame_buffering) + bit_position = write_unsigned_exp_golomb(buf, bit_position, self.max_num_reorder_frames) + bit_position = write_unsigned_exp_golomb(buf, bit_position, self.max_dec_frame_buffering) return bit_position @@ -945,81 +929,81 @@ class SPS: bit_position=0 # NAL Unit SPS - bit_position, zero = readBit(buf, bit_position) + bit_position, zero = read_bit(buf, bit_position) if zero != 0: raise ValueError(f'Reserved bit is not equal to 0: {zero:d}') - bit_position, nal_ref_idc = readBits(buf, bit_position,2) + bit_position, nal_ref_idc = read_bits(buf, bit_position,2) if nal_ref_idc != 3: raise ValueError(f'NAL ref idc is not equal to 3: {nal_ref_idc:d}') - bit_position, nal_unit_type = readBits(buf, bit_position,5) + bit_position, nal_unit_type = read_bits(buf, bit_position,5) if nal_unit_type != 7: raise ValueError(f'NAL unit type is not a SPS: {nal_unit_type:d}') - bit_position, self.profile_idc = readByte(buf, bit_position) - bit_position, self.constraint_set0_flag = readBit(buf,bit_position) - bit_position, self.constraint_set1_flag = readBit(buf,bit_position) - bit_position, self.constraint_set2_flag = readBit(buf,bit_position) - bit_position, self.constraint_set3_flag = readBit(buf,bit_position) - bit_position, self.constraint_set4_flag = readBit(buf,bit_position) - bit_position, self.constraint_set5_flag = readBit(buf,bit_position) - bit_position, v = readBits(buf, bit_position, 2) + bit_position, self.profile_idc = read_byte(buf, bit_position) + bit_position, self.constraint_set0_flag = read_bit(buf,bit_position) + bit_position, self.constraint_set1_flag = read_bit(buf,bit_position) + bit_position, self.constraint_set2_flag = read_bit(buf,bit_position) + bit_position, self.constraint_set3_flag = read_bit(buf,bit_position) + bit_position, self.constraint_set4_flag = read_bit(buf,bit_position) + bit_position, self.constraint_set5_flag = read_bit(buf,bit_position) + bit_position, v = read_bits(buf, bit_position, 2) if v!=0: raise ValueError(f'Reserved bits different from 0b00: {v:x}') - bit_position, self.level_idc = readByte(buf, bit_position) - bit_position, self.seq_parameter_set_id = readUnsignedExpGolomb(buf, bit_position) + bit_position, self.level_idc = read_byte(buf, bit_position) + bit_position, self.seq_parameter_set_id = read_unsigned_exp_golomb(buf, bit_position) if self.profile_idc in [44, 83, 86, 100, 110, 118, 122, 128, 134, 135, 138, 139, 244]: - bit_position, self.chroma_format_idc = readUnsignedExpGolomb(buf, bit_position) + bit_position, self.chroma_format_idc = read_unsigned_exp_golomb(buf, bit_position) if self.chroma_format_idc==3: - bit_position, self.separate_colour_plane_flag=readBit(buf, bit_position) - bit_position, self.bit_depth_luma_minus8 = readUnsignedExpGolomb(buf, bit_position) - bit_position, self.bit_depth_chroma_minus8 = readUnsignedExpGolomb(buf, bit_position) - bit_position, self.qpprime_y_zero_transform_bypass_flag = readBoolean(buf, bit_position) - bit_position, self.seq_scaling_matrix_present_flag = readBoolean(buf, bit_position) + bit_position, self.separate_colour_plane_flag=read_bit(buf, bit_position) + bit_position, self.bit_depth_luma_minus8 = read_unsigned_exp_golomb(buf, bit_position) + bit_position, self.bit_depth_chroma_minus8 = read_unsigned_exp_golomb(buf, bit_position) + bit_position, self.qpprime_y_zero_transform_bypass_flag = read_boolean(buf, bit_position) + bit_position, self.seq_scaling_matrix_present_flag = read_boolean(buf, bit_position) if self.seq_scaling_matrix_present_flag: nb_matrices = 12 if self.chroma_format_idc == 3 else 8 for i in range(0, nb_matrices): - bit_position, present = readBoolean(buf, bit_position) + bit_position, present = read_boolean(buf, bit_position) if present: if i<6: - bit_position, matrix = parseScalingList(buf, bit_position, 16) + bit_position, matrix = parse_scaling_list(buf, bit_position, 16) self.scaling_list[i] = matrix else: - bit_position, matrix = parseScalingList(buf, bit_position, 64) + bit_position, matrix = parse_scaling_list(buf, bit_position, 64) self.scaling_list[i] = matrix else: self.scaling_list[i] = [] - bit_position, self.log2_max_frame_num_minus4 = readUnsignedExpGolomb(buf, bit_position) - bit_position , self.pic_order_cnt_type = readUnsignedExpGolomb(buf, bit_position) + bit_position, self.log2_max_frame_num_minus4 = read_unsigned_exp_golomb(buf, bit_position) + bit_position , self.pic_order_cnt_type = read_unsigned_exp_golomb(buf, bit_position) if self.pic_order_cnt_type == 0: bit_position, self.log2_max_pic_order_cnt_lsb_minus4 =\ - readUnsignedExpGolomb(buf, bit_position) + read_unsigned_exp_golomb(buf, bit_position) elif self.pic_order_cnt_type == 1: - bit_position, self.delta_pic_order_always_zero_flag = readBoolean(buf, bit_position) - bit_position, self.offset_for_non_ref_pic = readSignedExpGolomb(buf, bit_position) - bit_position, self.offset_for_top_to_bottom_field = readSignedExpGolomb(buf, + bit_position, self.delta_pic_order_always_zero_flag = read_boolean(buf, bit_position) + bit_position, self.offset_for_non_ref_pic = read_signed_exp_golomb(buf, bit_position) + bit_position, self.offset_for_top_to_bottom_field = read_signed_exp_golomb(buf, bit_position) bit_position, self.num_ref_frames_in_pic_order_cnt_cycle =\ - readUnsignedExpGolomb(buf, bit_position) + read_unsigned_exp_golomb(buf, bit_position) for i in range(0, self.num_ref_frames_in_pic_order_cnt_cycle): - bit_position, v = readUnsignedExpGolomb(buf, bit_position) + bit_position, v = read_unsigned_exp_golomb(buf, bit_position) self.offset_for_ref_frame[i]=v - bit_position, self.max_num_ref_frames = readUnsignedExpGolomb(buf, bit_position) - bit_position, self.gaps_in_frame_num_value_allowed_flag = readBoolean(buf, bit_position) - bit_position, self.pic_width_in_mbs_minus1 = readUnsignedExpGolomb(buf, bit_position) - bit_position, self.pic_height_in_map_units_minus1 = readUnsignedExpGolomb(buf, bit_position) - bit_position, self.frame_mbs_only_flag = readBoolean(buf, bit_position) + bit_position, self.max_num_ref_frames = read_unsigned_exp_golomb(buf, bit_position) + bit_position, self.gaps_in_frame_num_value_allowed_flag = read_boolean(buf, bit_position) + bit_position, self.pic_width_in_mbs_minus1 = read_unsigned_exp_golomb(buf, bit_position) + bit_position, self.pic_height_in_map_units_minus1 = read_unsigned_exp_golomb(buf, bit_position) + bit_position, self.frame_mbs_only_flag = read_boolean(buf, bit_position) if not self.frame_mbs_only_flag: - bit_position, self.mb_adaptive_frame_field_flag = readBoolean(buf, bit_position) - bit_position, self.direct_8x8_inference_flag = readBoolean(buf, bit_position) - bit_position, self.frame_cropping_flag = readBoolean(buf, bit_position) + bit_position, self.mb_adaptive_frame_field_flag = read_boolean(buf, bit_position) + bit_position, self.direct_8x8_inference_flag = read_boolean(buf, bit_position) + bit_position, self.frame_cropping_flag = read_boolean(buf, bit_position) if self.frame_cropping_flag: - bit_position, self.frame_crop_left_offset = readUnsignedExpGolomb(buf, bit_position) - bit_position, self.frame_crop_right_offset = readUnsignedExpGolomb(buf, bit_position) - bit_position, self.frame_crop_top_offset = readUnsignedExpGolomb(buf, bit_position) - bit_position, self.frame_crop_bottom_offset = readUnsignedExpGolomb(buf, bit_position) - bit_position, self.vui_parameters_present_flag = readBoolean(buf, bit_position) + bit_position, self.frame_crop_left_offset = read_unsigned_exp_golomb(buf, bit_position) + bit_position, self.frame_crop_right_offset = read_unsigned_exp_golomb(buf, bit_position) + bit_position, self.frame_crop_top_offset = read_unsigned_exp_golomb(buf, bit_position) + bit_position, self.frame_crop_bottom_offset = read_unsigned_exp_golomb(buf, bit_position) + bit_position, self.vui_parameters_present_flag = read_boolean(buf, bit_position) if self.vui_parameters_present_flag: self.vui = VUI() @@ -1028,7 +1012,7 @@ class SPS: logger.debug('Parse end of SPS. Bit position: %d. Remaining bytes: %s.', bit_position, hexdump.dump(buf[floor(bit_position/8):], sep=':')) - bit_position = parseRBSPTrailingBits(buf, bit_position) + bit_position = parse_rbsp_trailing_bits(buf, bit_position) logger.debug('End of SPS: %d. Remaining bytes: %s', bit_position, hexdump.dump(buf[floor(bit_position/8):], sep=':')) return bit_position @@ -1038,77 +1022,77 @@ class SPS: buf = bytearray() bit_position = 0 - bit_position = writeBit(buf, bit_position,0) - bit_position = writeBits(buf, bit_position, 3, 2) - bit_position = writeBits(buf, bit_position, 7, 5) - bit_position = writeByte(buf, bit_position, self.profile_idc) - bit_position = writeBit(buf, bit_position, self.constraint_set0_flag) - bit_position = writeBit(buf, bit_position, self.constraint_set1_flag) - bit_position = writeBit(buf, bit_position, self.constraint_set2_flag) - bit_position = writeBit(buf, bit_position, self.constraint_set3_flag) - bit_position = writeBit(buf, bit_position, self.constraint_set4_flag) - bit_position = writeBit(buf, bit_position, self.constraint_set5_flag) - bit_position = writeBits(buf, bit_position, 0, 2) - bit_position = writeByte(buf, bit_position, self.level_idc) - bit_position = writeUnsignedExpGolomb(buf, bit_position, self.seq_parameter_set_id) + bit_position = write_bit(buf, bit_position,0) + bit_position = write_bits(buf, bit_position, 3, 2) + bit_position = write_bits(buf, bit_position, 7, 5) + bit_position = write_byte(buf, bit_position, self.profile_idc) + bit_position = write_bit(buf, bit_position, self.constraint_set0_flag) + bit_position = write_bit(buf, bit_position, self.constraint_set1_flag) + bit_position = write_bit(buf, bit_position, self.constraint_set2_flag) + bit_position = write_bit(buf, bit_position, self.constraint_set3_flag) + bit_position = write_bit(buf, bit_position, self.constraint_set4_flag) + bit_position = write_bit(buf, bit_position, self.constraint_set5_flag) + bit_position = write_bits(buf, bit_position, 0, 2) + bit_position = write_byte(buf, bit_position, self.level_idc) + bit_position = write_unsigned_exp_golomb(buf, bit_position, self.seq_parameter_set_id) if self.profile_idc in [44, 83, 86, 100, 110, 118, 122, 128, 134, 135, 138, 139, 244]: - bit_position = writeUnsignedExpGolomb(buf, bit_position, self.chroma_format_idc) + bit_position = write_unsigned_exp_golomb(buf, bit_position, self.chroma_format_idc) if self.chroma_format_idc==3: - bit_position = writeBit(buf, bit_position, self.separate_colour_plane_flag) - bit_position = writeUnsignedExpGolomb(buf, bit_position, self.bit_depth_luma_minus8) - bit_position = writeUnsignedExpGolomb(buf, bit_position, self.bit_depth_chroma_minus8) - bit_position = writeBoolean(buf, bit_position, + bit_position = write_bit(buf, bit_position, self.separate_colour_plane_flag) + bit_position = write_unsigned_exp_golomb(buf, bit_position, self.bit_depth_luma_minus8) + bit_position = write_unsigned_exp_golomb(buf, bit_position, self.bit_depth_chroma_minus8) + bit_position = write_boolean(buf, bit_position, self.qpprime_y_zero_transform_bypass_flag) - bit_position = writeBoolean(buf, bit_position, self.seq_scaling_matrix_present_flag) + bit_position = write_boolean(buf, bit_position, self.seq_scaling_matrix_present_flag) if self.seq_scaling_matrix_present_flag: nb_matrices = 12 if self.chroma_format_idc == 3 else 8 for i in range(0, nb_matrices): matrix = self.scaling_list[i] present = (len(matrix))!=0 - bit_position = writeBoolean(buf, bit_position, present) + bit_position = write_boolean(buf, bit_position, present) if present: if i<6: - bit_position = writeScalingList(buf, bit_position, 16, matrix) + bit_position = write_scaling_list(buf, bit_position, 16, matrix) else: - bit_position = writeScalingList(buf, bit_position, 64, matrix) + bit_position = write_scaling_list(buf, bit_position, 64, matrix) - bit_position = writeUnsignedExpGolomb(buf, bit_position, self.log2_max_frame_num_minus4) - bit_position = writeUnsignedExpGolomb(buf, bit_position, self.pic_order_cnt_type) + bit_position = write_unsigned_exp_golomb(buf, bit_position, self.log2_max_frame_num_minus4) + bit_position = write_unsigned_exp_golomb(buf, bit_position, self.pic_order_cnt_type) if self.pic_order_cnt_type == 0: - bit_position = writeUnsignedExpGolomb(buf, bit_position, + bit_position = write_unsigned_exp_golomb(buf, bit_position, self.log2_max_pic_order_cnt_lsb_minus4) elif self.pic_order_cnt_type == 1: - bit_position = writeBoolean(buf, bit_position, self.delta_pic_order_always_zero_flag) - bit_position = writeSignedExpGolomb(buf, bit_position, self.offset_for_non_ref_pic) - bit_position = writeSignedExpGolomb(buf, bit_position, + bit_position = write_boolean(buf, bit_position, self.delta_pic_order_always_zero_flag) + bit_position = write_signed_exp_golomb(buf, bit_position, self.offset_for_non_ref_pic) + bit_position = write_signed_exp_golomb(buf, bit_position, self.offset_for_top_to_bottom_field) - bit_position = writeUnsignedExpGolomb(buf, bit_position, + bit_position = write_unsigned_exp_golomb(buf, bit_position, self.num_ref_frames_in_pic_order_cnt_cycle) for i in range(0, self.num_ref_frames_in_pic_order_cnt_cycle): v = self.offset_for_ref_frame[i] - bit_position = writeUnsignedExpGolomb(buf, bit_position, v) - bit_position = writeUnsignedExpGolomb(buf, bit_position, self.max_num_ref_frames) - bit_position = writeBoolean(buf, bit_position, self.gaps_in_frame_num_value_allowed_flag) - bit_position = writeUnsignedExpGolomb(buf, bit_position, self.pic_width_in_mbs_minus1) - bit_position = writeUnsignedExpGolomb(buf, bit_position, + bit_position = write_unsigned_exp_golomb(buf, bit_position, v) + bit_position = write_unsigned_exp_golomb(buf, bit_position, self.max_num_ref_frames) + bit_position = write_boolean(buf, bit_position, self.gaps_in_frame_num_value_allowed_flag) + bit_position = write_unsigned_exp_golomb(buf, bit_position, self.pic_width_in_mbs_minus1) + bit_position = write_unsigned_exp_golomb(buf, bit_position, self.pic_height_in_map_units_minus1) - bit_position = writeBoolean(buf, bit_position, self.frame_mbs_only_flag) + bit_position = write_boolean(buf, bit_position, self.frame_mbs_only_flag) if not self.frame_mbs_only_flag: - bit_position = writeBoolean(buf, bit_position, self.mb_adaptive_frame_field_flag) - bit_position = writeBoolean(buf, bit_position, self.direct_8x8_inference_flag) - bit_position = writeBoolean(buf, bit_position, self.frame_cropping_flag) + bit_position = write_boolean(buf, bit_position, self.mb_adaptive_frame_field_flag) + bit_position = write_boolean(buf, bit_position, self.direct_8x8_inference_flag) + bit_position = write_boolean(buf, bit_position, self.frame_cropping_flag) if self.frame_cropping_flag: - bit_position = writeUnsignedExpGolomb(buf, bit_position, self.frame_crop_left_offset) - bit_position = writeUnsignedExpGolomb(buf, bit_position, self.frame_crop_right_offset) - bit_position = writeUnsignedExpGolomb(buf, bit_position, self.frame_crop_top_offset) - bit_position = writeUnsignedExpGolomb(buf, bit_position, self.frame_crop_bottom_offset) - bit_position = writeBoolean(buf, bit_position, self.vui_parameters_present_flag) + bit_position = write_unsigned_exp_golomb(buf, bit_position, self.frame_crop_left_offset) + bit_position = write_unsigned_exp_golomb(buf, bit_position, self.frame_crop_right_offset) + bit_position = write_unsigned_exp_golomb(buf, bit_position, self.frame_crop_top_offset) + bit_position = write_unsigned_exp_golomb(buf, bit_position, self.frame_crop_bottom_offset) + bit_position = write_boolean(buf, bit_position, self.vui_parameters_present_flag) if self.vui_parameters_present_flag: logger.debug('SPS has VUI. Writing VUI at position: %d', bit_position) bit_position = self.vui.toBytes(buf, bit_position) logger.debug('VUI written. New bit position: %d', bit_position) - bit_position = writeRBSPTrailingBits(buf, bit_position) + bit_position = write_rbsp_trailing_bits(buf, bit_position) return buf @@ -1156,64 +1140,64 @@ class PPS: bit_position=0 # NAL Unit PPS - bit_position, zero = readBit(buf, bit_position) + bit_position, zero = read_bit(buf, bit_position) if zero != 0: raise ValueError(f'Reserved bit is not equal to 0: {zero:d}') - bit_position, nal_ref_idc = readBits(buf, bit_position,2) + bit_position, nal_ref_idc = read_bits(buf, bit_position,2) if nal_ref_idc != 3: raise ValueError(f'NAL ref idc is not equal to 3: {nal_ref_idc:d}') - bit_position, nal_unit_type = readBits(buf, bit_position,5) + bit_position, nal_unit_type = read_bits(buf, bit_position,5) if nal_unit_type != 8: raise ValueError(f'NAL unit type is not a PPS: {nal_unit_type:d}') - bit_position, self.pic_parameter_set_id = readUnsignedExpGolomb(buf, bit_position) - bit_position, self.seq_parameter_set_id = readUnsignedExpGolomb(buf, bit_position) - bit_position, self.entropy_coding_mode_flag = readBoolean(buf, bit_position) + bit_position, self.pic_parameter_set_id = read_unsigned_exp_golomb(buf, bit_position) + bit_position, self.seq_parameter_set_id = read_unsigned_exp_golomb(buf, bit_position) + bit_position, self.entropy_coding_mode_flag = read_boolean(buf, bit_position) bit_position, self.bottom_field_pic_order_in_frame_present_flag =\ - readBoolean(buf, bit_position) - bit_position, self.num_slice_groups_minus1 = readUnsignedExpGolomb(buf, bit_position) + read_boolean(buf, bit_position) + bit_position, self.num_slice_groups_minus1 = read_unsigned_exp_golomb(buf, bit_position) if self.num_slice_groups_minus1>0: - bit_position, self.slice_group_map_type = readUnsignedExpGolomb(buf, bit_position) + bit_position, self.slice_group_map_type = read_unsigned_exp_golomb(buf, bit_position) if self.slice_group_map_type == 0: for i in range(0, self.num_slice_groups_minus1): - bit_position, v = readUnsignedExpGolomb(buf, bit_position) + bit_position, v = read_unsigned_exp_golomb(buf, bit_position) self.run_length_minus1[i]=v elif self.slice_group_map_type == 2: for i in range(0, self.num_slice_groups_minus1): - bit_position, v = readUnsignedExpGolomb(buf, bit_position) + bit_position, v = read_unsigned_exp_golomb(buf, bit_position) self.top_left[i] = v - bit_position, v = readUnsignedExpGolomb(buf, bit_position) + bit_position, v = read_unsigned_exp_golomb(buf, bit_position) self.bottom_right[i] = v elif self.slice_group_map_type in [3,4,5]: - bit_position, self.slice_group_change_direction_flag = readBoolean(buf, + bit_position, self.slice_group_change_direction_flag = read_boolean(buf, bit_position) bit_position, self.slice_group_change_rate_minus1 =\ - readUnsignedExpGolomb(buf, bit_position) + read_unsigned_exp_golomb(buf, bit_position) elif self.slice_group_map_type == 6: bit_position, self.pic_size_in_map_units_minus1 =\ - readUnsignedExpGolomb(buf, bit_position) - l = ceil(log(self.num_slice_groups_minus1+1)) + read_unsigned_exp_golomb(buf, bit_position) + nb_bits = ceil(log(self.num_slice_groups_minus1+1)) for i in range(0, self.pic_size_in_map_units_minus1): - bit_position, v = readBits(buf, bit_position, l) + bit_position, v = read_bits(buf, bit_position, nb_bits) self.slice_group_id[i]=v bit_position, self.num_ref_idx_l0_default_active_minus1 =\ - readUnsignedExpGolomb(buf, bit_position) + read_unsigned_exp_golomb(buf, bit_position) bit_position, self.num_ref_idx_l2_default_active_minus1 =\ - readUnsignedExpGolomb(buf, bit_position) - bit_position, self.weighted_pred_flag = readBoolean(buf, bit_position) - bit_position, self.weighted_bipred_idc = readBits(buf, bit_position, 2) - bit_position, self.pic_init_qp_minus26 = readSignedExpGolomb(buf, bit_position) - bit_position, self.pic_init_qs_minus26 = readSignedExpGolomb(buf, bit_position) - bit_position, self.chroma_qp_index_offset = readSignedExpGolomb(buf, bit_position) - bit_position, self.deblocking_filter_control_present_flag = readBoolean(buf, bit_position) - bit_position, self.constrained_intra_pred_flag = readBoolean(buf, bit_position) - bit_position, self.redundant_pic_cnt_present_flag = readBoolean(buf, bit_position) + read_unsigned_exp_golomb(buf, bit_position) + bit_position, self.weighted_pred_flag = read_boolean(buf, bit_position) + bit_position, self.weighted_bipred_idc = read_bits(buf, bit_position, 2) + bit_position, self.pic_init_qp_minus26 = read_signed_exp_golomb(buf, bit_position) + bit_position, self.pic_init_qs_minus26 = read_signed_exp_golomb(buf, bit_position) + bit_position, self.chroma_qp_index_offset = read_signed_exp_golomb(buf, bit_position) + bit_position, self.deblocking_filter_control_present_flag = read_boolean(buf, bit_position) + bit_position, self.constrained_intra_pred_flag = read_boolean(buf, bit_position) + bit_position, self.redundant_pic_cnt_present_flag = read_boolean(buf, bit_position) - if moreRBSPData(buf, bit_position): - bit_position, self.transform_8x8_mode_flag = readBoolean(buf, bit_position) - bit_position, self.pic_scaling_matrix_present_flag = readBoolean(buf, bit_position) + if more_rbsp_data(buf, bit_position): + bit_position, self.transform_8x8_mode_flag = read_boolean(buf, bit_position) + bit_position, self.pic_scaling_matrix_present_flag = read_boolean(buf, bit_position) if self.pic_scaling_matrix_present_flag: nb_matrices = 6 if chroma_format_idc == 3 else 2 if self.transform_8x8_mode_flag: @@ -1221,21 +1205,21 @@ class PPS: else: nb_matrices = 6 for i in range(0, nb_matrices): - bit_position, present = readBoolean(buf, bit_position) + bit_position, present = read_boolean(buf, bit_position) if present: if i<6: - bit_position, matrix = parseScalingList(buf, bit_position, 16) + bit_position, matrix = parse_scaling_list(buf, bit_position, 16) self.pic_scaling_list.append(matrix) else: - bit_position, matrix = parseScalingList(buf, bit_position, 64) + bit_position, matrix = parse_scaling_list(buf, bit_position, 64) self.pic_scaling_list.append(matrix) else: self.pic_scaling_list.append([]) - bit_position, self.second_chroma_qp_index_offset = readSignedExpGolomb(buf, + bit_position, self.second_chroma_qp_index_offset = read_signed_exp_golomb(buf, bit_position) logger.info("parse RBSP") - bit_position = parseRBSPTrailingBits(buf, bit_position) + bit_position = parse_rbsp_trailing_bits(buf, bit_position) return bit_position @@ -1245,57 +1229,57 @@ class PPS: buf = bytearray() bit_position = 0 # NAL Unit PPS - bit_position = writeBit(buf, bit_position, 0) - bit_position = writeBits(buf, bit_position, 3, 2) - bit_position = writeBits(buf, bit_position, 8, 5) + bit_position = write_bit(buf, bit_position, 0) + bit_position = write_bits(buf, bit_position, 3, 2) + bit_position = write_bits(buf, bit_position, 8, 5) - bit_position = writeUnsignedExpGolomb(buf, bit_position, self.pic_parameter_set_id) - bit_position = writeUnsignedExpGolomb(buf, bit_position, self.seq_parameter_set_id) - bit_position = writeBoolean(buf, bit_position, self.entropy_coding_mode_flag) - bit_position = writeBoolean(buf, bit_position,\ + bit_position = write_unsigned_exp_golomb(buf, bit_position, self.pic_parameter_set_id) + bit_position = write_unsigned_exp_golomb(buf, bit_position, self.seq_parameter_set_id) + bit_position = write_boolean(buf, bit_position, self.entropy_coding_mode_flag) + bit_position = write_boolean(buf, bit_position,\ self.bottom_field_pic_order_in_frame_present_flag) - bit_position = writeUnsignedExpGolomb(buf, bit_position, self.num_slice_groups_minus1) + bit_position = write_unsigned_exp_golomb(buf, bit_position, self.num_slice_groups_minus1) if self.num_slice_groups_minus1>0: - bit_position = writeUnsignedExpGolomb(buf, bit_position, self.slice_group_map_type) + bit_position = write_unsigned_exp_golomb(buf, bit_position, self.slice_group_map_type) if self.slice_group_map_type == 0: for i in range(0, self.num_slice_groups_minus1): v = self.run_length_minus1[i] - bit_position = writeUnsignedExpGolomb(buf, bit_position, v) + bit_position = write_unsigned_exp_golomb(buf, bit_position, v) elif self.slice_group_map_type == 2: for i in range(0, self.num_slice_groups_minus1): v = self.top_left[i] - bit_position = writeUnsignedExpGolomb(buf, bit_position, v) + bit_position = write_unsigned_exp_golomb(buf, bit_position, v) v = self.bottom_right[i] - bit_position = writeUnsignedExpGolomb(buf, bit_position, v) + bit_position = write_unsigned_exp_golomb(buf, bit_position, v) elif self.slice_group_map_type in [3,4,5]: - bit_position = writeBoolean(buf, bit_position, + bit_position = write_boolean(buf, bit_position, self.slice_group_change_direction_flag) - bit_position = writeUnsignedExpGolomb(buf, bit_position, + bit_position = write_unsigned_exp_golomb(buf, bit_position, self.slice_group_change_rate_minus1) elif self.slice_group_map_type == 6: - bit_position = writeUnsignedExpGolomb(buf, bit_position, + bit_position = write_unsigned_exp_golomb(buf, bit_position, self.pic_size_in_map_units_minus1) - l = ceil(log(self.num_slice_groups_minus1+1)) + nb_bits = ceil(log(self.num_slice_groups_minus1+1)) for i in range(0, self.pic_size_in_map_units_minus1): v = self.slice_group_id[i] - bit_position, v = writeBits(buf, bit_position, v, l) + bit_position, v = write_bits(buf, bit_position, v, nb_bits) - bit_position = writeUnsignedExpGolomb(buf, bit_position, + bit_position = write_unsigned_exp_golomb(buf, bit_position, self.num_ref_idx_l0_default_active_minus1) - bit_position = writeUnsignedExpGolomb(buf, bit_position, + bit_position = write_unsigned_exp_golomb(buf, bit_position, self.num_ref_idx_l2_default_active_minus1) - bit_position = writeBoolean(buf, bit_position, self.weighted_pred_flag) - bit_position = writeBits(buf, bit_position, self.weighted_bipred_idc, 2) - bit_position = writeSignedExpGolomb(buf, bit_position, self.pic_init_qp_minus26) - bit_position = writeSignedExpGolomb(buf, bit_position, self.pic_init_qs_minus26) - bit_position = writeSignedExpGolomb(buf, bit_position, self.chroma_qp_index_offset) - bit_position = writeBoolean(buf, bit_position, self.deblocking_filter_control_present_flag) - bit_position = writeBoolean(buf, bit_position, self.constrained_intra_pred_flag) - bit_position = writeBoolean(buf, bit_position, self.redundant_pic_cnt_present_flag) + bit_position = write_boolean(buf, bit_position, self.weighted_pred_flag) + bit_position = write_bits(buf, bit_position, self.weighted_bipred_idc, 2) + bit_position = write_signed_exp_golomb(buf, bit_position, self.pic_init_qp_minus26) + bit_position = write_signed_exp_golomb(buf, bit_position, self.pic_init_qs_minus26) + bit_position = write_signed_exp_golomb(buf, bit_position, self.chroma_qp_index_offset) + bit_position = write_boolean(buf, bit_position, self.deblocking_filter_control_present_flag) + bit_position = write_boolean(buf, bit_position, self.constrained_intra_pred_flag) + bit_position = write_boolean(buf, bit_position, self.redundant_pic_cnt_present_flag) - bit_position = writeBoolean(buf, bit_position, self.transform_8x8_mode_flag) - bit_position = writeBoolean(buf, bit_position, self.pic_scaling_matrix_present_flag) + bit_position = write_boolean(buf, bit_position, self.transform_8x8_mode_flag) + bit_position = write_boolean(buf, bit_position, self.pic_scaling_matrix_present_flag) if self.pic_scaling_matrix_present_flag: nb_matrices = 6 if chroma_format_idc == 3 else 2 if self.transform_8x8_mode_flag: @@ -1307,17 +1291,17 @@ class PPS: logger.info("Retrieved pic scaling matrix: %s %d", matrix, len(matrix)) present = len(matrix)!=0 logger.info("Matrix is present: %s", present) - bit_position = writeBoolean(buf, bit_position, present) + bit_position = write_boolean(buf, bit_position, present) if present: if i<6: logger.info("Writing matrix: %s", matrix) - bit_position = writeScalingList(buf, bit_position, 16, matrix) + bit_position = write_scaling_list(buf, bit_position, 16, matrix) else: logger.info("Writing matrix: %s", matrix) - bit_position = writeScalingList(buf, bit_position, 64, matrix) - bit_position = writeSignedExpGolomb(buf, bit_position, self.second_chroma_qp_index_offset) + bit_position = write_scaling_list(buf, bit_position, 64, matrix) + bit_position = write_signed_exp_golomb(buf, bit_position, self.second_chroma_qp_index_offset) - bit_position = writeRBSPTrailingBits(buf, bit_position) + bit_position = write_rbsp_trailing_bits(buf, bit_position) return buf @@ -1347,26 +1331,26 @@ class AVCDecoderConfiguration: logger = logging.getLogger(__name__) logger.debug('Parsing: %s', (hexdump.dump(buf,sep=':'))) bit_position = 0 - bit_position, self.configurationVersion = readByte(buf, bit_position) - bit_position, self.AVCProfileIndication = readByte(buf, bit_position) - bit_position, self.profile_compatibility = readByte(buf, bit_position) - bit_position, self.AVCLevelIndication = readByte(buf, bit_position) - bit_position, v = readBits(buf, bit_position, 6) + bit_position, self.configurationVersion = read_byte(buf, bit_position) + bit_position, self.AVCProfileIndication = read_byte(buf, bit_position) + bit_position, self.profile_compatibility = read_byte(buf, bit_position) + bit_position, self.AVCLevelIndication = read_byte(buf, bit_position) + bit_position, v = read_bits(buf, bit_position, 6) if v != 0b111111: raise ValueError(f'Reserved bits are not equal to 0b111111: {v:x}') - bit_position, self.lengthSizeMinusOne = readBits(buf, bit_position, 2) - bit_position, v = readBits(buf, bit_position, 3) + bit_position, self.lengthSizeMinusOne = read_bits(buf, bit_position, 2) + bit_position, v = read_bits(buf, bit_position, 3) if v != 0b111: raise ValueError(f'Reserved bits are not equal to 0b111: {v:x}') - bit_position, self.numOfSequenceParameterSets= readBits(buf, bit_position, 5) + bit_position, self.numOfSequenceParameterSets= read_bits(buf, bit_position, 5) logger.debug('Number of SPS: %d', self.numOfSequenceParameterSets) for _ in range(0,self.numOfSequenceParameterSets): - bit_position, length = readWord(buf, bit_position) + bit_position, length = read_word(buf, bit_position) if bit_position % 8 != 0: raise ValueError(f'SPS is not located at a byte boundary: {bit_position:d}') sps = SPS() - sodb = RBSP2SODB(buf[floor(bit_position/8):]) + sodb = rbsp_to_sodb(buf[floor(bit_position/8):]) bit_length = sps.fromBytes(sodb) spsid = sps.seq_parameter_set_id self.sps[spsid] = sps @@ -1381,15 +1365,15 @@ class AVCDecoderConfiguration: logger.debug('Bit position:%d. Reading one byte of: %s', bit_position, hexdump.dump(buf[floor(bit_position/8):], sep=':')) - bit_position, self.numOfPictureParameterSets = readByte(buf, bit_position) + bit_position, self.numOfPictureParameterSets = read_byte(buf, bit_position) logger.debug('Number of PPS: %d', self.numOfPictureParameterSets) for _ in range(0,self.numOfPictureParameterSets): - bit_position, length = readWord(buf, bit_position) + bit_position, length = read_word(buf, bit_position) if bit_position % 8 != 0: raise ValueError('PPS is not located at a byte boundary: {bit_position:d}') pps = PPS() - sodb = RBSP2SODB(buf[floor(bit_position/8):]) + sodb = rbsp_to_sodb(buf[floor(bit_position/8):]) bit_length = pps.fromBytes(sodb, self.chroma_format) ppsid = pps.pic_parameter_set_id self.pps[ppsid] = pps @@ -1405,19 +1389,19 @@ class AVCDecoderConfiguration: logger.debug('Remaining bits: %s', hexdump.dump(buf[floor(bit_position/8):])) if self.AVCProfileIndication in [100, 110, 122, 144]: - bit_position, reserved = readBits(buf, bit_position, 6) + bit_position, reserved = read_bits(buf, bit_position, 6) if reserved != 0b111111: raise ValueError(f'Reserved bits are different from 111111: {reserved:x}') - bit_position, self.chroma_format = readBits(buf, bit_position, 2) - bit_position, reserved = readBits(buf, bit_position, 5) + bit_position, self.chroma_format = read_bits(buf, bit_position, 2) + bit_position, reserved = read_bits(buf, bit_position, 5) if reserved != 0b11111: raise ValueError(f'Reserved bits are different from 11111: {reserved:x}') - bit_position, self.bit_depth_luma_minus8 = readBits(buf, bit_position, 3) - bit_position, reserved = readBits(buf, bit_position, 5) + bit_position, self.bit_depth_luma_minus8 = read_bits(buf, bit_position, 3) + bit_position, reserved = read_bits(buf, bit_position, 5) if reserved != 0b11111: raise ValueError(f'Reserved bits are different from 11111: {reserved:x}') - bit_position, self.bit_depth_chroma_minus8 = readBits(buf, bit_position, 3) - bit_position, self.numOfSequenceParameterSetExt = readByte(buf, bit_position) + bit_position, self.bit_depth_chroma_minus8 = read_bits(buf, bit_position, 3) + bit_position, self.numOfSequenceParameterSetExt = read_byte(buf, bit_position) for _ in range(0, self.numOfSequenceParameterSetExt): # TODO: parse SPSextended logger.error('Parsing of SPS extended not yet implemented !') @@ -1430,53 +1414,53 @@ class AVCDecoderConfiguration: buf = bytearray() bit_position = 0 - bit_position = writeByte(buf, bit_position, self.configurationVersion) - bit_position = writeByte(buf, bit_position, self.AVCProfileIndication) - bit_position = writeByte(buf, bit_position, self.profile_compatibility) - bit_position = writeByte(buf, bit_position, self.AVCLevelIndication) - bit_position = writeBits(buf, bit_position, 0b111111, 6) - bit_position = writeBits(buf, bit_position, self.lengthSizeMinusOne, 2) - bit_position = writeBits(buf, bit_position, 0b111, 3) - bit_position = writeBits(buf, bit_position, self.numOfSequenceParameterSets, 5) + bit_position = write_byte(buf, bit_position, self.configurationVersion) + bit_position = write_byte(buf, bit_position, self.AVCProfileIndication) + bit_position = write_byte(buf, bit_position, self.profile_compatibility) + bit_position = write_byte(buf, bit_position, self.AVCLevelIndication) + bit_position = write_bits(buf, bit_position, 0b111111, 6) + bit_position = write_bits(buf, bit_position, self.lengthSizeMinusOne, 2) + bit_position = write_bits(buf, bit_position, 0b111, 3) + bit_position = write_bits(buf, bit_position, self.numOfSequenceParameterSets, 5) for spsid in self.sps: sps = self.sps[spsid] sodb = sps.toBytes() sodb_length = len(sodb) - rbsp = SODB2RBSP(sodb) + rbsp = sodb_to_rbsp(sodb) rbsp_length = len(rbsp) logger.debug('SODB length: %d RBSP length:%d', sodb_length, rbsp_length) - bit_position = writeWord(buf, bit_position, rbsp_length) + bit_position = write_word(buf, bit_position, rbsp_length) buf.extend(rbsp) bit_position+=rbsp_length*8 logger.debug('2. Buffer: %s', hexdump.dump(buf, sep=':')) - bit_position = writeByte(buf, bit_position, self.numOfPictureParameterSets) + bit_position = write_byte(buf, bit_position, self.numOfPictureParameterSets) for ppsid in self.pps: logger.debug('Writing PPS: %d', ppsid) pps = self.pps[ppsid] # TODO: does chroma_format should come from self ? sodb = pps.toBytes(self.chroma_format) sodb_length = len(sodb) - rbsp = SODB2RBSP(sodb) + rbsp = sodb_to_rbsp(sodb) rbsp_length = len(rbsp) logger.debug('SODB length: %d RBSP length:%d', sodb_length, rbsp_length) - bit_position = writeWord(buf, bit_position, rbsp_length) + bit_position = write_word(buf, bit_position, rbsp_length) buf.extend(rbsp) bit_position+=rbsp_length*8 if self.AVCProfileIndication in [ 100, 110, 122, 144]: - bit_position = writeBits(buf, bit_position, 0b111111, 6) - bit_position = writeBits(buf, bit_position, self.chroma_format, 2) - bit_position = writeBits(buf, bit_position, 0b11111, 5) - bit_position = writeBits(buf, bit_position, self.bit_depth_luma_minus8, 3) - bit_position = writeBits(buf, bit_position, 0b11111, 5) - bit_position = writeBits(buf, bit_position, self.bit_depth_chroma_minus8, 3) - bit_position = writeByte(buf, bit_position, self.numOfSequenceParameterSetExt) + bit_position = write_bits(buf, bit_position, 0b111111, 6) + bit_position = write_bits(buf, bit_position, self.chroma_format, 2) + bit_position = write_bits(buf, bit_position, 0b11111, 5) + bit_position = write_bits(buf, bit_position, self.bit_depth_luma_minus8, 3) + bit_position = write_bits(buf, bit_position, 0b11111, 5) + bit_position = write_bits(buf, bit_position, self.bit_depth_chroma_minus8, 3) + bit_position = write_byte(buf, bit_position, self.numOfSequenceParameterSetExt) for _ in range(0, self.numOfSequenceParameterSetExt): # TODO: dump SPSextended logger.error('Dumping SPS extended not yet implemented') @@ -1535,7 +1519,7 @@ class AVCDecoderConfiguration: # TODO: do the same with extended SPS ! -def parseCodecPrivate(codecPrivateData): +def parse_codec_private(codecPrivateData): if codecPrivateData[0] != 0x63: raise ValueError(f'Matroska header is wrong: {codecPrivateData[0]:x}') if codecPrivateData[1] != 0xA2: @@ -1544,7 +1528,7 @@ def parseCodecPrivate(codecPrivateData): if length == 0: raise ValueError('Matroska length cannot start with zero byte.') for nb_zeroes in range(0,8): - b = readBit(codecPrivateData[2:], nb_zeroes) + b = read_bit(codecPrivateData[2:], nb_zeroes) if b != 0: break mask = 2^(7-nb_zeroes)-1 @@ -1558,22 +1542,22 @@ def parseCodecPrivate(codecPrivateData): return avcconfig -def getAvcConfigFromH264(inputFile): +def get_avc_config_from_h264(inputFile): logger = logging.getLogger(__name__) # TODO: improve this ... rbsp = inputFile.read(1000) - sodb = RBSP2SODB(rbsp) + sodb = rbsp_to_sodb(rbsp) bit_position = 0 - bit_position, start_code = readLong(sodb, bit_position) + bit_position, start_code = read_long(sodb, bit_position) if start_code != 1: raise ValueError(f'Starting code not detected: {start_code:x}') sps = SPS() bit_length = sps.fromBytes(sodb[4:]) bit_position+=bit_length - bit_position, start_code = readLong(sodb, bit_position) + bit_position, start_code = read_long(sodb, bit_position) if start_code != 1: raise ValueError(f'Starting code not detected: {start_code:x}') pps = PPS() @@ -1598,14 +1582,12 @@ def getAvcConfigFromH264(inputFile): return avcconfig def getCodecPrivateDataFromH264(inputFile): - logger = logging.getLogger(__name__) - - avcconfig = getAvcConfigFromH264(inputFile) - res = dumpCodecPrivateData(avcconfig) + avcconfig = get_avc_config_from_h264(inputFile) + res = dump_codec_private_data(avcconfig) return res -def parseMKVTree(mkvinfo, inputFile): +def parse_mkv_tree(mkvinfo_path, inputFile): logger = logging.getLogger(__name__) infd = inputFile.fileno() @@ -1614,7 +1596,7 @@ def parseMKVTree(mkvinfo, inputFile): env = {**os.environ, 'LANG': 'C'} elements = {} - with Popen([mkvinfo, '-z', '-X', '-P', f'/proc/self/fd/{infd:d}'], stdout=PIPE, + with Popen([mkvinfo_path, '-z', '-X', '-P', f'/proc/self/fd/{infd:d}'], stdout=PIPE, close_fds=False, env=env) as mkvinfo: out, _ = mkvinfo.communicate() out = out.decode('utf8') @@ -1686,10 +1668,10 @@ def parseMKVTree(mkvinfo, inputFile): # value 0 to 2^56-2 -def getEBMLLength(length): +def get_ebml_length(length): logger = logging.getLogger(__name__) - if (0 <= length) and (length <= 2**7-2): + if 0 <= length <= 2**7-2: size = 1 elif length <= 2**14-2: size = 2 @@ -1717,7 +1699,7 @@ def getEBMLLength(length): return res -def dumpCodecPrivateData(AVCDecoderConfiguration): +def dump_codec_private_data(AVCDecoderConfiguration): logger = logging.getLogger(__name__) # Rebuild a Matroska Codec Private Element res = bytearray() @@ -1727,7 +1709,7 @@ def dumpCodecPrivateData(AVCDecoderConfiguration): logger.debug('AVC configuration bitstream: %s (length: %d))', hexdump.dump(buf, sep=':'), len(buf)) - embl_length = getEBMLLength(len(buf)) + embl_length = get_ebml_length(len(buf)) logger.debug('EMBL encoded length: %s', hexdump.dump(embl_length, sep=':')) res.extend(embl_length) res.extend(buf) @@ -1794,7 +1776,7 @@ def changeEBMLElementSize(inputFile, position, addendum): delta = 0 if new_size > max_size: # TODO: Test this code ... - new_encoded_size = getEBMLLength(new_size) + new_encoded_size = get_ebml_length(new_size) size_of_new_encoded_size = len(new_encoded_size) if size_of_new_encoded_size <= size_of_data_size: logger.error('New encoded size is smaller (%d) or equal than previous size (%d).\ @@ -1835,7 +1817,7 @@ def changeCodecPrivateData(mkvinfo, inputFile, codecData): current_length = fstat(infd).st_size logger.info('Current size of file: %d', current_length) - position, current_data = getCodecPrivateDataFromMKV(mkvinfo, inputFile) + position, current_data = get_codec_private_data_from_mkv(mkvinfo, inputFile) current_data_length = len(current_data) future_length = current_length - current_data_length + len(codecData) logger.info('Expected size of file: %d', future_length) @@ -1843,7 +1825,7 @@ def changeCodecPrivateData(mkvinfo, inputFile, codecData): logger.info('Current data at position %d: %s', position, hexdump.dump(current_data, sep=":")) logger.info('Future data: %s', hexdump.dump(codecData, sep=":")) - elements = parseMKVTree(mkvinfo, inputFile) + elements = parse_mkv_tree(mkvinfo, inputFile) found = False for key in elements: @@ -1898,13 +1880,13 @@ def changeCodecPrivateData(mkvinfo, inputFile, codecData): # been resized). delta+=changeEBMLElementSize(inputFile, pos, delta) -def getFormat(ffprobe, inputFile): +def getFormat(ffprobe_path, inputFile): logger = logging.getLogger(__name__) infd = inputFile.fileno() lseek(infd, 0, SEEK_SET) set_inheritable(infd, True) - with Popen([ffprobe, '-loglevel', 'quiet', '-show_format', '-of', 'json', '-i', + with Popen([ffprobe_path, '-loglevel', 'quiet', '-show_format', '-of', 'json', '-i', f'/proc/self/fd/{infd:d}'], stdout=PIPE, close_fds=False) as ffprobe: out, _ = ffprobe.communicate() out = json.load(BytesIO(out)) @@ -1916,13 +1898,13 @@ def getFormat(ffprobe, inputFile): return None -def getMovieDuration(ffprobe, inputFile): +def getMovieDuration(ffprobe_path, inputFile): logger = logging.getLogger(__name__) infd = inputFile.fileno() lseek(infd, 0, SEEK_SET) set_inheritable(infd, True) - with Popen([ffprobe, '-loglevel', 'quiet', '-show_format', '-of', 'json', '-i', + with Popen([ffprobe_path, '-loglevel', 'quiet', '-show_format', '-of', 'json', '-i', f'/proc/self/fd/{infd:d}'], stdout=PIPE, close_fds=False) as ffprobe: out, _ = ffprobe.communicate() out = json.load(BytesIO(out)) @@ -1936,13 +1918,13 @@ def getMovieDuration(ffprobe, inputFile): return None # ffprobe -loglevel quiet -select_streams v:0 -show_entries stream=width,height -of json sample.ts -def getVideoDimensions(ffprobe, inputFile): +def getVideoDimensions(ffprobe_path, inputFile): logger = logging.getLogger(__name__) infd = inputFile.fileno() lseek(infd, 0, SEEK_SET) set_inheritable(infd, True) - with Popen([ffprobe, '-loglevel', 'quiet', '-select_streams', 'v:0', '-show_entries',\ + with Popen([ffprobe_path, '-loglevel', 'quiet', '-select_streams', 'v:0', '-show_entries',\ 'stream=width,height', '-of', 'json', '-i', f'/proc/self/fd/{infd:d}'],\ stdout=PIPE, close_fds=False) as ffprobe: out, _ = ffprobe.communicate() @@ -1956,13 +1938,13 @@ def getVideoDimensions(ffprobe, inputFile): exit(-1) -def getStreams(ffprobe, inputFile): +def get_streams(ffprobe_path, inputFile): logger = logging.getLogger(__name__) infd = inputFile.fileno() lseek(infd, 0, SEEK_SET) set_inheritable(infd, True) - with Popen([ffprobe, '-loglevel', 'quiet', '-show_streams', '-of', 'json', '-i', + with Popen([ffprobe_path, '-loglevel', 'quiet', '-show_streams', '-of', 'json', '-i', f'/proc/self/fd/{infd:d}'], stdout=PIPE, close_fds=False) as ffprobe: out, _ = ffprobe.communicate() out = json.load(BytesIO(out)) @@ -1973,13 +1955,13 @@ def getStreams(ffprobe, inputFile): return None -def withSubtitles(ffprobe, inputFile): +def withSubtitles(ffprobe_path, inputFile): logger = logging.getLogger(__name__) infd = inputFile.fileno() lseek(infd, 0, SEEK_SET) set_inheritable(infd, True) - with Popen([ffprobe, '-loglevel', 'quiet', '-show_streams', '-of', 'json', '-i', + with Popen([ffprobe_path, '-loglevel', 'quiet', '-show_streams', '-of', 'json', '-i', f'/proc/self/fd/{infd:d}'], stdout=PIPE, close_fds=False) as ffprobe: out, _ = ffprobe.communicate() out = json.load(BytesIO(out)) @@ -1993,7 +1975,7 @@ def withSubtitles(ffprobe, inputFile): return False -def parseTimestamp(ts): +def parse_timestamp(ts): logger = logging.getLogger(__name__) ts_reg_exp = (r'^(?P[0-9]{1,2}):(?P[0-9]{1,2})' @@ -2118,11 +2100,11 @@ def compareTimeInterval(interval1, interval2): else: return 0 -def ffmpegConvert(ffmpeg, ffprobe, inputFile, inputFormat, outputFile, outputFormat, duration): +def ffmpeg_convert(ffmpeg_path, ffprobe_path, inputFile, inputFormat, outputFile, outputFormat, duration): logger = logging.getLogger(__name__) - width, height = getVideoDimensions(ffprobe, inputFile) - subtitles = withSubtitles(ffprobe, inputFile) + width, height = getVideoDimensions(ffprobe_path, inputFile) + subtitles = withSubtitles(ffprobe_path, inputFile) infd = inputFile.fileno() outfd = outputFile.fileno() @@ -2134,7 +2116,7 @@ def ffmpegConvert(ffmpeg, ffprobe, inputFile, inputFormat, outputFile, outputFor else: log = [ '-loglevel', 'quiet' ] - params = [ffmpeg, '-y',]+log+['-progress', '/dev/stdout', '-canvas_size', + params = [ffmpeg_path, '-y',]+log+['-progress', '/dev/stdout', '-canvas_size', f'{width:d}x{height:d}', '-f', inputFormat, '-i', f'/proc/self/fd/{infd:d}', '-map', '0:v', '-map', '0:a'] @@ -2154,7 +2136,7 @@ def ffmpegConvert(ffmpeg, ffprobe, inputFile, inputFormat, outputFile, outputFor for line in pb: if line.startswith('out_time='): ts = line.split('=')[1].strip() - ts = parseTimestamp(ts) + ts = parse_timestamp(ts) if ts is not None: pb.n = int(ts/timedelta(seconds=1)) pb.update() @@ -2189,12 +2171,12 @@ def getPacketDuration(packet): return duration -def getFramesInStream(ffprobe, inputFile, begin, end, streamKind, subStreamId=0): +def getFramesInStream(ffprobe_path, inputFile, begin, end, streamKind, subStreamId=0): logger = logging.getLogger(__name__) infd = inputFile.fileno() set_inheritable(infd, True) - command = [ffprobe, '-loglevel', 'quiet', '-read_intervals', f'{begin}%{end}','-show_entries', + command = [ffprobe_path, '-loglevel', 'quiet', '-read_intervals', f'{begin}%{end}','-show_entries', 'frame', '-select_streams', f'{streamKind}:{subStreamId:d}','-of', 'json', f'/proc/self/fd/{infd:d}'] logger.debug('Executing: %s', command) @@ -2215,7 +2197,7 @@ def getFramesInStream(ffprobe, inputFile, begin, end, streamKind, subStreamId=0) ts = getTSFrame(frame) if ts is None: return None - if begin <= ts and ts <= end: + if begin <= ts <= end: tmp[ts]=frame res = [] @@ -2228,7 +2210,7 @@ def getFramesInStream(ffprobe, inputFile, begin, end, streamKind, subStreamId=0) return None # TODO: Finish implementation of this function and use it. -def getNearestIDRFrame(ffprobe, inputFile, timestamp, before=True, delta=timedelta(seconds=2)): +def getNearestIDRFrame(ffprobe_path, inputFile, timestamp, before=True, delta=timedelta(seconds=2)): # pylint: disable=W0613 logger = logging.getLogger(__name__) @@ -2246,7 +2228,7 @@ def getNearestIDRFrame(ffprobe, inputFile, timestamp, before=True, delta=timedel idrs = [] # Retains only IDR frame - with Popen([ffprobe, '-loglevel', 'quiet', '-read_intervals', f'{tbegin}%{tend}','-skip_frame', + with Popen([ffprobe_path, '-loglevel', 'quiet', '-read_intervals', f'{tbegin}%{tend}','-skip_frame', 'nokey', '-show_entries', 'frame', '-select_streams', 'v:0', '-of', 'json', f'/proc/self/fd/{infd:d}'], stdout=PIPE, close_fds=False) as ffprobe: out, _ = ffprobe.communicate() @@ -2262,14 +2244,14 @@ def getNearestIDRFrame(ffprobe, inputFile, timestamp, before=True, delta=timedel ts = getTSFrame(frame) if ts is None: return None - if tbegin <= ts and ts <= tend: + if tbegin <= ts <= tend: idrs.append(frame) else: logger.error('Impossible to retrieve IDR frames inside file around [%s,%s]', tbegin, tend) return None -def getNearestIFrame(ffprobe, inputFile, timestamp, before=True, deltaMax=timedelta(seconds=15)): +def getNearestIFrame(ffprobe_path, inputFile, timestamp, before=True, deltaMax=timedelta(seconds=15)): logger = logging.getLogger(__name__) infd = inputFile.fileno() @@ -2292,7 +2274,7 @@ def getNearestIFrame(ffprobe, inputFile, timestamp, before=True, deltaMax=timede tbegin = zero logger.debug('Looking for an iframe in [%s, %s]', tbegin, tend) - frames = getFramesInStream(ffprobe, inputFile=inputFile, begin=tbegin, end=tend, + frames = getFramesInStream(ffprobe_path, inputFile=inputFile, begin=tbegin, end=tend, streamKind='v') if frames is None: logger.debug('Found no frame in [%s, %s]', tbegin, tend) @@ -2336,11 +2318,11 @@ def getNearestIFrame(ffprobe, inputFile, timestamp, before=True, deltaMax=timede continue if before: - if its <= ts and ts <= timestamp: + if its <= ts <= timestamp: logger.info("Retrieve a frame between %s and %s at %s", its, timestamp, ts) nb_frames = nb_frames+1 else: - if timestamp <= ts and ts <= its: + if timestamp <= ts <= its: logger.info("Retrieve a frame between %s and %s at %s", timestamp, ts, its) nb_frames = nb_frames+1 else: @@ -2349,7 +2331,7 @@ def getNearestIFrame(ffprobe, inputFile, timestamp, before=True, deltaMax=timede return(nb_frames, iframe) -def extractMKVPart(mkvmerge, inputFile, outputFile, begin, end): +def extractMKVPart(mkvmerge_path, inputFile, outputFile, begin, end): logger = logging.getLogger(__name__) logger.info('Extract video between I-frames at %s and %s', begin,end) @@ -2362,7 +2344,7 @@ def extractMKVPart(mkvmerge, inputFile, outputFile, begin, end): env = {**os.environ, 'LANG': 'C'} warnings = [] - command = [mkvmerge, '-o', f'/proc/self/fd/{outfd:d}', '--split', f'parts:{begin}-{end}', + command = [mkvmerge_path, '-o', f'/proc/self/fd/{outfd:d}', '--split', f'parts:{begin}-{end}', f'/proc/self/fd/{infd:d}'] logger.debug('Executing: %s', command) @@ -2390,7 +2372,7 @@ def extractMKVPart(mkvmerge, inputFile, outputFile, begin, end): elif status == 2: logger.error('Extraction returns errors') -def extractPictures(ffmpeg, inputFile, begin, nbFrames, width=640, height=480): +def extractPictures(ffmpeg_path, inputFile, begin, nbFrames, width=640, height=480): logger = logging.getLogger(__name__) infd = inputFile.fileno() @@ -2405,7 +2387,7 @@ def extractPictures(ffmpeg, inputFile, begin, nbFrames, width=640, height=480): length = image_length*nbFrames logger.debug("Estimated length: %d", length) - command = [ffmpeg, '-loglevel', 'quiet' ,'-y', '-ss', f'{begin}', '-i', f'/proc/self/fd/{infd}', + command = [ffmpeg_path, '-loglevel', 'quiet' ,'-y', '-ss', f'{begin}', '-i', f'/proc/self/fd/{infd}', '-s', f'{width:d}x{height:d}', '-vframes', f'{nbFrames:d}', '-c:v', 'ppm','-f', 'image2pipe', f'/proc/self/fd/{outfd:d}'] logger.debug('Executing: %s', command) @@ -2426,7 +2408,7 @@ def extractPictures(ffmpeg, inputFile, begin, nbFrames, width=640, height=480): lseek(outfd, 0, SEEK_SET) return images, outfd -def extractSound(ffmpeg, inputFile, begin, outputFileName, packet_duration, subChannel=0, +def extractSound(ffmpeg_path, inputFile, begin, outputFileName, packet_duration, subChannel=0, nb_packets=0, sample_rate=48000, nb_channels=2): logger = logging.getLogger(__name__) @@ -2438,7 +2420,7 @@ def extractSound(ffmpeg, inputFile, begin, outputFileName, packet_duration, subC sound = bytes() length = int(nb_channels*sample_rate*4*nb_packets*packet_duration/1000) - command = [ffmpeg, '-y', '-loglevel', 'quiet', '-ss', f'{begin}', '-i', f'/proc/self/fd/{infd}', + command = [ffmpeg_path, '-y', '-loglevel', 'quiet', '-ss', f'{begin}', '-i', f'/proc/self/fd/{infd}', f'-frames:a:{subChannel:d}', f'{nb_packets+1:d}', '-c:a', 'pcm_s32le', '-sample_rate', f'{sample_rate:d}', '-channels', f'{nb_channels:d}', '-f', 's32le', f'/proc/self/fd/{outfd:d}'] @@ -2508,17 +2490,17 @@ def dumpPPM(pictures, prefix, temporaries): logger.error('Impossible to create file: %s', filename) -def extractAllStreams(ffmpeg, ffprobe, inputFile, begin, end, streams, filesPrefix, nbFrames, +def extractAllStreams(ffmpeg_path, ffprobe_path, inputFile, begin, end, streams, filesPrefix, nbFrames, framerate, width, height, temporaries, dumpMemFD=False): logger = logging.getLogger(__name__) # The command line for encoding only video track - video_encoder_params = [ ffmpeg, '-y', '-loglevel', 'quiet'] + video_encoder_params = [ ffmpeg_path, '-y', '-loglevel', 'quiet'] video_input_params = [] video_codec_params = [] # The command line to create a MKV file with the rest of tracks - generic_encoder_params = [ ffmpeg, '-y', '-loglevel', 'quiet' ] + generic_encoder_params = [ ffmpeg_path, '-y', '-loglevel', 'quiet' ] generic_input_params = [] generic_codec_params = [] @@ -2568,7 +2550,7 @@ def extractAllStreams(ffmpeg, ffprobe, inputFile, begin, end, streams, filesPref logger.warning('Missing DAR adjustment for: %s', dar) logger.warning('Missing treatment for chroma location: %s', chroma_location) codec = stream['codec_name'] - images_bytes, memfd = extractPictures(ffmpeg, inputFile=inputFile, begin=begin, + images_bytes, memfd = extractPictures(ffmpeg_path, inputFile=inputFile, begin=begin, nbFrames=nbFrames, width=width, height=height) if images_bytes is None: logger.error('Impossible to extract picture from video stream.') @@ -2603,9 +2585,9 @@ def extractAllStreams(ffmpeg, ffprobe, inputFile, begin, end, streams, filesPref codec = stream['codec_name'] if 'tags' in stream: if 'language' in stream['tags']: - generic_codec_params.extend([f'-metadata:s:a:{audio_id:d}', - f'language={stream['tags']['language']}']) - packets = getFramesInStream(ffprobe, inputFile=inputFile, begin=begin, end=end, + generic_codec_params.extend([f'-metadata:s:a:{audio_id:d}', + f"language={stream['tags']['language']}"]) + packets = getFramesInStream(ffprobe_path, inputFile=inputFile, begin=begin, end=end, streamKind='a', subStreamId=audio_id) nb_packets = len(packets) logger.debug("Found %d packets to be extracted from audio track.", nb_packets) @@ -2619,7 +2601,7 @@ def extractAllStreams(ffmpeg, ffprobe, inputFile, begin, end, streams, filesPref logger.info("Extracting %d packets of audio stream: a:%d" , nb_packets, audio_id) tmpname = f'{filesPrefix}-{audio_id:d}.pcm' - sound_bytes, memfd = extractSound(ffmpeg=ffmpeg, inputFile=inputFile, begin=begin, + sound_bytes, memfd = extractSound(ffmpeg_path=ffmpeg_path, inputFile=inputFile, begin=begin, nb_packets=nb_packets, packet_duration=packet_duration, outputFileName=tmpname, sample_rate=sample_rate, @@ -2659,7 +2641,7 @@ def extractAllStreams(ffmpeg, ffprobe, inputFile, begin, end, streams, filesPref if 'tags' in stream: if 'language' in stream['tags']: generic_codec_params.extend([f'-metadata:s:s:{subtitle_id:d}', - f'language={stream['tags']['language']}']) + f"language={stream['tags']['language']}"]) generic_codec_params.extend([f'-c:s:{subtitle_id:d}', 'copy']) subtitle_id=subtitle_id+1 else: @@ -2749,7 +2731,7 @@ def extractAllStreams(ffmpeg, ffprobe, inputFile, begin, end, streams, filesPref return None, None # Merge a list of mkv files passed as input, and produce a new MKV as output -def mergeMKVs(mkvmerge, inputs, outputName, concatenate=True, timestamps=None): +def merge_mkvs(mkvmerge_path, inputs, outputName, concatenate=True, timestamps=None): logger = logging.getLogger(__name__) fds = [] @@ -2767,7 +2749,7 @@ def mergeMKVs(mkvmerge, inputs, outputName, concatenate=True, timestamps=None): # Timestamps of merged tracks are modified by the length of the preceding track. # The default mode ('file') is using the largest timestamp of the whole file which may create # desynchronize video and sound. - merge_params = [mkvmerge, '--append-mode', 'track'] + merge_params = [mkvmerge_path, '--append-mode', 'track'] first = True partnum = 0 @@ -2826,14 +2808,14 @@ def mergeMKVs(mkvmerge, inputs, outputName, concatenate=True, timestamps=None): return out -def findSubtitlesTracks(ffprobe, inputFile): +def findSubtitlesTracks(ffprobe_path, inputFile): logger = logging.getLogger(__name__) infd = inputFile.fileno() lseek(infd, 0, SEEK_SET) set_inheritable(infd, True) - command = [ffprobe, '-loglevel','quiet', '-i', f'/proc/self/fd/{infd:d}', '-select_streams', + command = [ffprobe_path, '-loglevel','quiet', '-i', f'/proc/self/fd/{infd:d}', '-select_streams', 's', '-show_entries', 'stream=index:stream_tags=language', '-of', 'json'] logger.debug('Executing: %s', command) @@ -2847,7 +2829,7 @@ def findSubtitlesTracks(ffprobe, inputFile): ffprobe.wait() -def extractTrackFromMKV(mkvextract, inputFile, index, outputFile, timestamps): +def extract_track_from_mkv(mkvextract_path, inputFile, index, outputFile, timestamps): logger = logging.getLogger(__name__) infd = inputFile.fileno() @@ -2862,7 +2844,7 @@ def extractTrackFromMKV(mkvextract, inputFile, index, outputFile, timestamps): lseek(tsfd, 0, SEEK_SET) set_inheritable(tsfd, True) - params = [ mkvextract, f'/proc/self/fd/{infd:d}', 'tracks', + params = [ mkvextract_path, f'/proc/self/fd/{infd:d}', 'tracks', f'{index:d}:/proc/self/fd/{outfd:d}', 'timestamps_v2', f'{index:d}:/proc/self/fd/{tsfd:d}'] @@ -2891,7 +2873,7 @@ def extractTrackFromMKV(mkvextract, inputFile, index, outputFile, timestamps): else: logger.info('Track %d was succesfully extracted.', index) -def removeVideoTracksFromMKV(mkvmerge, inputFile, outputFile): +def removeVideoTracksFromMKV(mkvmerge_path, inputFile, outputFile): logger = logging.getLogger(__name__) outfd = outputFile.fileno() @@ -2901,7 +2883,7 @@ def removeVideoTracksFromMKV(mkvmerge, inputFile, outputFile): set_inheritable(infd, True) set_inheritable(outfd, True) - params = [ mkvmerge, '-o', f'/proc/self/fd/{outfd:d}', '-D', f'/proc/self/fd/{infd:d}'] + params = [ mkvmerge_path, '-o', f'/proc/self/fd/{outfd:d}', '-D', f'/proc/self/fd/{infd:d}'] logger.debug('Executing: LANG=C %s', params) env = {**os.environ, 'LANG': 'C'} @@ -2927,7 +2909,7 @@ def removeVideoTracksFromMKV(mkvmerge, inputFile, outputFile): else: logger.info('Video tracks were succesfully extracted.') -def remuxSRTSubtitles(mkvmerge, inputFile, outputFileName, subtitles): +def remuxSRTSubtitles(mkvmerge_path, inputFile, outputFileName, subtitles): logger = logging.getLogger(__name__) try: @@ -2942,7 +2924,7 @@ def remuxSRTSubtitles(mkvmerge, inputFile, outputFileName, subtitles): set_inheritable(infd, True) set_inheritable(outfd, True) - mkv_merge_params = [mkvmerge, f'/proc/self/fd/{infd:d}'] + mkv_merge_params = [mkvmerge_path, f'/proc/self/fd/{infd:d}'] for fd, lang in subtitles: lseek(fd, 0, SEEK_SET) set_inheritable(fd, True) @@ -3032,7 +3014,7 @@ def concatenateH264TSParts(h264TSParts, output): first = False # TODO: finish this procedure -def doCoarseProcessing(ffmpeg, ffprobe, mkvmerge, inputFile, begin, end, nbFrames, framerate, +def do_coarse_processing(ffmpeg_path, ffprobe_path, mkvmerge_path, inputFile, begin, end, nbFrames, framerate, filesPrefix, streams, width, height, temporaries, dumpMemFD): # pylint: disable=W0613 logger = logging.getLogger(__name__) @@ -3047,7 +3029,7 @@ def doCoarseProcessing(ffmpeg, ffprobe, mkvmerge, inputFile, begin, end, nbFrame exit(-1) # Extract internal part of MKV - extractMKVPart(mkvmerge=mkvmerge, inputFile=inputFile, outputFile=internal_mkv, begin=begin, + extractMKVPart(mkvmerge_path=mkvmerge_path, inputFile=inputFile, outputFile=internal_mkv, begin=begin, end=end) temporaries.append(internal_mkv) @@ -3097,7 +3079,7 @@ def main(): if (not args.coarse) and args.threshold is None: args.threshold = 0 - all_optional_tools, paths = checkRequiredTools() + all_optional_tools, paths = check_required_tools() # Flatten args.parts intervals = [] @@ -3149,7 +3131,7 @@ def main(): logger.info("Durée de l'enregistrement: %s", duration) if args.framerate is None: - framerate = getFrameRate(paths['ffprobe'], input_file) + framerate = get_frame_rate(paths['ffprobe'], input_file) if framerate is None: logger.error('Impossible to estimate frame rate !') exit(-1) @@ -3173,7 +3155,7 @@ def main(): logger.info("Converting TS to MP4 (to fix timestamps).") try: with open(mp4filename, 'w+', encoding='utf8') as mp4: - ffmpegConvert(paths['ffmpeg'], paths['ffprobe'], input_file, 'mpegts', mp4, 'mp4', + ffmpeg_convert(paths['ffmpeg'], paths['ffprobe'], input_file, 'mpegts', mp4, 'mp4', duration) temporaries.append(mp4) logger.info("Converting MP4 to MKV.") @@ -3182,7 +3164,7 @@ def main(): except IOError: logger.error('') - ffmpegConvert(paths['ffmpeg'], paths['ffprobe'], mp4, 'mp4', mkv, 'matroska', + ffmpeg_convert(paths['ffmpeg'], paths['ffprobe'], mp4, 'mp4', mkv, 'matroska', duration) if nb_parts > 0: temporaries.append(mkv) @@ -3195,7 +3177,7 @@ def main(): mkv = open(mkvfilename, 'w+', encoding='utf8') except IOError: logger.error('') - ffmpegConvert(paths['ffmpeg'], paths['ffprobe'], input_file, 'mp4', mkv, 'matroska', + ffmpeg_convert(paths['ffmpeg'], paths['ffprobe'], input_file, 'mp4', mkv, 'matroska', duration) if nb_parts > 0: temporaries.append(mkv) @@ -3203,7 +3185,7 @@ def main(): logger.info("Already in MKV") mkv = input_file - streams = getStreams(paths['ffprobe'], mkv) + streams = get_streams(paths['ffprobe'], mkv) logger.debug('Streams: %s', streams) main_video = None @@ -3228,16 +3210,16 @@ def main(): exit(-1) # We retrieve the main private codec data - _, main_codec_private_data = getCodecPrivateDataFromMKV(mkvinfo=paths['mkvinfo'], inputFile=mkv) + _, main_codec_private_data = get_codec_private_data_from_mkv(mkvinfo_path=paths['mkvinfo'], inputFile=mkv) logger.debug('Main video stream has following private data: %s', hexdump.dump(main_codec_private_data, sep=':')) # We parse them - main_avc_config = parseCodecPrivate(main_codec_private_data) + main_avc_config = parse_codec_private(main_codec_private_data) logger.debug('AVC configuration: %s', main_avc_config) # We check if the parse and dump operations are idempotent. - private_data = dumpCodecPrivateData(main_avc_config) + private_data = dump_codec_private_data(main_avc_config) logger.debug('Redump AVC configuration: %s', hexdump.dump(private_data, sep=':')) # In rare occasion, the PPS has trailing zeroes that do not seem to be related to useful data # but they differ from the private data we generate that do not contain them. @@ -3245,7 +3227,7 @@ def main(): # the same. if main_codec_private_data != private_data: logger.warning('Difference detected in bitstream !!') - iso_avc_config = parseCodecPrivate(private_data) + iso_avc_config = parse_codec_private(private_data) logger.debug('Reread AVC configuration: %s', iso_avc_config) # If there exists a difference between our own reconstructed AVC configuration and the # original one, we abandon @@ -3314,7 +3296,7 @@ def main(): # TODO: separate pipeline processing between coarse and not fine grain options. # if args.coarse: - # doCoarseProcessing(ffmpeg=paths['ffmpeg'], ffprobe=paths['ffprobe'], inputFile=mkv, + # do_coarse_processing(ffmpeg=paths['ffmpeg'], ffprobe=paths['ffprobe'], inputFile=mkv, # begin=ts1, end=head_iframe_ts, nbFrames=nb_head_frames-1, # frameRate=frameRate, filesPrefix='part-%d-head' % (partnum), # streams=streams, width=width, height=height, @@ -3330,8 +3312,8 @@ def main(): if (not args.coarse) and (nb_head_frames > args.threshold): # We extract all frames between the beginning upto the frame that immediately preceeds # the I-frame. - h264_head, h264_head_ts, mkv_head = extractAllStreams(ffmpeg=paths['ffmpeg'], - ffprobe=paths['ffprobe'], + h264_head, h264_head_ts, mkv_head = extractAllStreams(ffmpeg_path=paths['ffmpeg'], + ffprobe_path=paths['ffprobe'], inputFile=mkv, begin=ts1, end=head_iframe_ts, nbFrames=nb_head_frames-1, @@ -3346,7 +3328,7 @@ def main(): if mkv_head is not None: subparts.append(mkv_head) if h264_head is not None: - avcconfig = getAvcConfigFromH264(h264_head) + avcconfig = get_avc_config_from_h264(h264_head) other_avc_configs.append(avcconfig) h264parts.append(h264_head) if h264_head_ts is not None: @@ -3388,17 +3370,17 @@ def main(): # logger.info('Merge header, middle and trailer subpart into: %s' % internal_mkv_name) # Extract internal part of MKV - extractMKVPart(mkvmerge=paths['mkvmerge'], inputFile=mkv, outputFile=internal_mkv, + extractMKVPart(mkvmerge_path=paths['mkvmerge'], inputFile=mkv, outputFile=internal_mkv, begin=head_iframe_ts, end=tail_iframe_ts) # Extract video stream of internal part as a raw H264 and its timestamps. logger.info('Extract video track as raw H264 file.') - extractTrackFromMKV(mkvextract=paths['mkvextract'], inputFile=internal_mkv, index=0, + extract_track_from_mkv(mkvextract_path=paths['mkvextract'], inputFile=internal_mkv, index=0, outputFile=internal_h264, timestamps=internal_h264_ts) # Remove video track from internal part of MKV logger.info('Remove video track from %s', internal_mkv_name) - removeVideoTracksFromMKV(mkvmerge=paths['mkvmerge'], inputFile=internal_mkv, + removeVideoTracksFromMKV(mkvmerge_path=paths['mkvmerge'], inputFile=internal_mkv, outputFile=internal_novideo_mkv) temporaries.append(internal_mkv) @@ -3412,8 +3394,8 @@ def main(): if (not args.coarse) and (nb_tail_frames > args.threshold): # We extract all frames between the I-frame (including it) upto the end. - h264_tail, h264_tail_ts, mkv_tail = extractAllStreams(ffmpeg=paths['ffmpeg'], - ffprobe=paths['ffprobe'], + h264_tail, h264_tail_ts, mkv_tail = extractAllStreams(ffmpeg_path=paths['ffmpeg'], + ffprobe_path=paths['ffprobe'], inputFile=mkv, begin=tail_iframe_ts, end=ts2, nbFrames=nb_tail_frames, framerate=framerate, @@ -3426,14 +3408,14 @@ def main(): if mkv_tail is not None: subparts.append(mkv_tail) if h264_tail is not None: - avcconfig = getAvcConfigFromH264(h264_tail) + avcconfig = get_avc_config_from_h264(h264_tail) other_avc_configs.append(avcconfig) h264parts.append(h264_tail) if h264_tail_ts is not None: h264_ts.append(h264_tail_ts) logger.info('Merging MKV: %s', subparts) - part = mergeMKVs(mkvmerge=paths['mkvmerge'], inputs=subparts, + part = merge_mkvs(mkvmerge_path=paths['mkvmerge'], inputs=subparts, outputName=f'part-{partnum:d}.mkv', concatenate=True) mkvparts.append(part) temporaries.append(part) @@ -3475,7 +3457,7 @@ def main(): if nb_mkv_parts > 1: logger.info('Merging all audio and subtitles parts: %s', mkvparts) - mergeMKVs(mkvmerge=paths['mkvmerge'], inputs=mkvparts, outputName=final_novideo_name, + merge_mkvs(mkvmerge_path=paths['mkvmerge'], inputs=mkvparts, outputName=final_novideo_name, concatenate=True) elif nb_mkv_parts == 1: copyfile('part-1.mkv', final_novideo_name) @@ -3495,10 +3477,10 @@ def main(): full_h264_ts.seek(0) logger.info('Merging final video track and all other tracks together') - final_with_video = mergeMKVs(mkvmerge=paths['mkvmerge'], inputs=[full_h264, final_novideo], + final_with_video = merge_mkvs(mkvmerge_path=paths['mkvmerge'], inputs=[full_h264, final_novideo], outputName=final_with_video_name, concatenate=False, timestamps={0: full_h264_ts}) - final_codec_private_data = dumpCodecPrivateData(main_avc_config) + final_codec_private_data = dump_codec_private_data(main_avc_config) logger.debug('Final codec private data: %s', hexdump.dump(final_codec_private_data, sep=':')) logger.info('Changing codec private data with the new one.') changeCodecPrivateData(paths['mkvinfo'], final_with_video, final_codec_private_data) @@ -3511,7 +3493,7 @@ def main(): # Final cut is not any more the final step. temporaries.append(final_with_video) duration = getMovieDuration(paths['ffprobe'], final_with_video) - supported_langs = getTesseractSupportedLang(paths['tesseract']) + supported_langs = get_tesseract_supported_lang(paths['tesseract']) logger.info('Supported lang: %s', supported_langs) logger.info('Find subtitles tracks and language.') subtitles = findSubtitlesTracks(paths['ffprobe'], final_with_video) @@ -3535,7 +3517,7 @@ def main(): logger.info(sts) if len(sts) > 0: - list_of_subtitles = extractSRT(paths['mkvextract'], final_with_video_name, sts, + list_of_subtitles = extract_srt(paths['mkvextract'], final_with_video_name, sts, supported_langs) logger.info(list_of_subtitles) for idx_name, sub_name, _, _ in list_of_subtitles: @@ -3553,7 +3535,7 @@ def main(): temporaries.append(idx) temporaries.append(sub) - ocr = doOCR(paths['vobsubocr'], list_of_subtitles, duration, temporaries, args.dump) + ocr = do_ocr(paths['vobsubocr'], list_of_subtitles, duration, temporaries, args.dump) logger.info(ocr) # Remux SRT subtitles