mirror of https://github.com/AlfredoSequeida/fvid
Vastly speed up cython; misc other changes
This commit is contained in:
parent
456e0fd78e
commit
69b64cca77
|
@ -4,4 +4,4 @@ from distutils.core import Extension, setup
|
||||||
from Cython.Build import cythonize
|
from Cython.Build import cythonize
|
||||||
|
|
||||||
ext = Extension(name="fvid_cython", sources=["fvid_cython.pyx"], include_dirs=['/root/fvid', '/root/fvid/tests'])
|
ext = Extension(name="fvid_cython", sources=["fvid_cython.pyx"], include_dirs=['/root/fvid', '/root/fvid/tests'])
|
||||||
setup(ext_modules=cythonize(ext, compiler_directives={'language_level': 3, 'infer_types': True}))
|
setup(ext_modules=cythonize(ext, annotate=True, compiler_directives={'language_level': 3, 'infer_types': True}))
|
||||||
|
|
26
fvid/fvid.py
26
fvid/fvid.py
|
@ -23,7 +23,7 @@ from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC
|
||||||
from Crypto.Cipher import AES
|
from Crypto.Cipher import AES
|
||||||
|
|
||||||
try:
|
try:
|
||||||
from fvid_cython import cy_gbfi, cy_gbfi_h265
|
from fvid_cython import cy_gbfi, cy_gbfi_h265, cy_encode_zfec
|
||||||
|
|
||||||
use_cython = True
|
use_cython = True
|
||||||
except (ImportError, ModuleNotFoundError):
|
except (ImportError, ModuleNotFoundError):
|
||||||
|
@ -93,19 +93,21 @@ def encode_zfec(bit_array: BitArray) -> BitArray:
|
||||||
|
|
||||||
bits = bit_array.bin
|
bits = bit_array.bin
|
||||||
|
|
||||||
# split bits into blocks of bits
|
if use_cython:
|
||||||
byte_list = split_string_by_n(bits, BLOCK)
|
return BitArray(bytes=cy_encode_zfec(bits).encode('utf-8'))
|
||||||
|
else:
|
||||||
|
# split bits into blocks of bits
|
||||||
|
byte_list = split_string_by_n(bits, BLOCK)
|
||||||
|
|
||||||
|
ecc_bytes = ""
|
||||||
|
|
||||||
ecc_bytes = ""
|
print("Applying Zfec Error Correction...")
|
||||||
|
|
||||||
|
encoder = ef.Encoder(KVAL, MVAL)
|
||||||
|
for b in tqdm(byte_list):
|
||||||
|
ecc_bytes += ''.join(map(bytes.decode, encoder.encode(b.encode('utf-8'))))
|
||||||
|
|
||||||
print("Applying Zfec Error Correction...")
|
return BitArray(bytes=ecc_bytes.encode('utf-8'))
|
||||||
|
|
||||||
encoder = ef.Encoder(KVAL, MVAL)
|
|
||||||
for b in tqdm(byte_list):
|
|
||||||
ecc_bytes += ''.join(map(bytes.decode, encoder.encode(b.encode('utf-8'))))
|
|
||||||
|
|
||||||
return BitArray(bytes=ecc_bytes.encode('utf-8'))
|
|
||||||
|
|
||||||
def get_bits_from_file(
|
def get_bits_from_file(
|
||||||
filepath: str, key: bytes, zfec: bool
|
filepath: str, key: bytes, zfec: bool
|
||||||
|
@ -424,7 +426,7 @@ def make_image_sequence(bitstring: BitArray, resolution: tuple = (1920, 1080)):
|
||||||
index += 1
|
index += 1
|
||||||
|
|
||||||
|
|
||||||
def make_video(output_filepath: str, framerate: int = FRAMERATE, use_h265: bool = False, overwrite: bool= = False):
|
def make_video(output_filepath: str, framerate: int = FRAMERATE, use_h265: bool = False, overwrite: bool = False):
|
||||||
"""
|
"""
|
||||||
Create video using ffmpeg
|
Create video using ffmpeg
|
||||||
|
|
||||||
|
|
1427
fvid/fvid_cython.cpp
1427
fvid/fvid_cython.cpp
File diff suppressed because it is too large
Load Diff
|
@ -2,8 +2,10 @@
|
||||||
# cython: boundscheck=False
|
# cython: boundscheck=False
|
||||||
# cython: cdivision=True
|
# cython: cdivision=True
|
||||||
# cython: wraparound=False
|
# cython: wraparound=False
|
||||||
|
# cython: nonecheck=False
|
||||||
# cython: c_string_type=unicode, c_string_encoding=ascii
|
# cython: c_string_type=unicode, c_string_encoding=ascii
|
||||||
|
from tqdm import tqdm
|
||||||
|
from zfec import easyfec as ef
|
||||||
from libcpp.string cimport string
|
from libcpp.string cimport string
|
||||||
|
|
||||||
cpdef str cy_gbfi(image):
|
cpdef str cy_gbfi(image):
|
||||||
|
@ -37,4 +39,31 @@ cpdef str cy_gbfi_h265(image):
|
||||||
for x in range(width):
|
for x in range(width):
|
||||||
bits.append(b'1' if px[x, y] == 255 else b'0')
|
bits.append(b'1' if px[x, y] == 255 else b'0')
|
||||||
|
|
||||||
return bits
|
return bits
|
||||||
|
|
||||||
|
cpdef str cy_encode_zfec(string bits):
|
||||||
|
cdef int b, KVAL = 4, MVAL = 5, BLOCK = 16
|
||||||
|
cdef string ecc_bytes = b'', byte
|
||||||
|
cdef tuple byte_tuple
|
||||||
|
|
||||||
|
# cdef (string, string, string, string, string) temp
|
||||||
|
|
||||||
|
byte_tuple = split_string_by_n(bits, BLOCK)
|
||||||
|
|
||||||
|
print("Applying Zfec Error Correction...")
|
||||||
|
|
||||||
|
encoder = ef.Encoder(KVAL, MVAL)
|
||||||
|
|
||||||
|
for b in tqdm(range(len(byte_tuple))):
|
||||||
|
for byte in encoder.encode(byte_tuple[b].encode('utf-8')):
|
||||||
|
ecc_bytes.append(byte)
|
||||||
|
|
||||||
|
return ecc_bytes
|
||||||
|
|
||||||
|
cdef tuple split_string_by_n(str bitstring, int n):
|
||||||
|
cdef list bit_list = []
|
||||||
|
|
||||||
|
for i in range(0, len(bitstring), n):
|
||||||
|
bit_list.append(bitstring[i:i+n])
|
||||||
|
|
||||||
|
return tuple(bit_list)
|
|
@ -1,5 +1,5 @@
|
||||||
Pillow>=7.0.0
|
Pillow>=7.0.0
|
||||||
tqdm>=4.25.0
|
tqdm>=4.25.0
|
||||||
bitstring
|
bitstring>=3.1.6
|
||||||
pycryptography
|
pycryptography>=3.1.1
|
||||||
zfec
|
zfec
|
Loading…
Reference in New Issue