Add H.265 codec support

This commit is contained in:
Theelgirl 2021-02-24 09:17:03 -08:00
parent 701b78ddac
commit a13bdf72b9
6 changed files with 492 additions and 107 deletions

View File

@ -1,6 +1,7 @@
__Planned (1.1.0)__ __Planned (1.1.0)__
- GUI - GUI
- Use json-encoded strings instead of pickle for storing stuff - Use json-encoded strings instead of pickle for storing stuff
- Allow H.265 encoding/decoding with the -5 or --h265 flags. This makes the video file about 50% smaller, and decoding the pixels about 3x faster.
__1.0.0__ __1.0.0__

View File

@ -6,6 +6,7 @@ Planned (1.1.0)
- GUI - GUI
- Use json-encoded strings instead of pickle for storing stuff - Use json-encoded strings instead of pickle for storing stuff
- Allow H.265 encoding/decoding with the -5 or --h265 flags. This makes the video file about 50% smaller, and decoding the pixels about 3x faster.
1.0.0 1.0.0
===== =====

View File

@ -1,6 +1,9 @@
#cython: language_level = 3 #cython: language_level = 3
from distutils.core import Extension, setup from distutils.core import Extension, setup
from Cython.Build import cythonize from Cython.Build import cythonize
import os
os.environ['CFLAGS'] = "-march='native'"
ext = Extension(name="fvid_cython", sources=["fvid_cython.pyx"]) ext = Extension(name="fvid_cython", sources=["fvid_cython.pyx"])
setup(ext_modules=cythonize(ext, compiler_directives={'language_level': 3, 'infer_types': True})) setup(ext_modules=cythonize(ext, compiler_directives={'language_level': 3, 'infer_types': True}))

View File

@ -13,6 +13,7 @@ import json
import base64 import base64
import decimal import decimal
import random import random
import magic
from zfec import easyfec as ef from zfec import easyfec as ef
@ -22,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_get_bits_from_image as cy_gbfi from fvid_cython import cy_gbfi, cy_gbfi_h265
use_cython = True use_cython = True
except (ImportError, ModuleNotFoundError): except (ImportError, ModuleNotFoundError):
@ -38,12 +39,13 @@ NOTDEBUG = True
TEMPVIDEO = "_temp.mp4" TEMPVIDEO = "_temp.mp4"
FRAMERATE = "1" FRAMERATE = "1"
# DO NOT CHANGE: (2, 3) WORKS SOMETIMES # DO NOT CHANGE: (2, 3-8) works sometimes
# BUT SOMEHOW THIS IS THE ONLY COMBO THAT ALWAYS WORKS # this is the most effieicnt by far though
KVAL = 4 KVAL = 4
MVAL = 5 MVAL = 5
# THIS CAN BE ANY POWER OF 2 BUT MUST STAY SAME BETWEEN ENCODING/DECODING # this can by ANY integer that is a multiple of (KVAL/MVAL)
# RECOMMENDED 8-64 # but it MUST stay the same between encoding/decoding
# reccomended 8-64
BLOCK = 16 BLOCK = 16
@ -157,44 +159,59 @@ def get_bits_from_file(
return bitarray.bin return bitarray.bin
def get_bits_from_image(image: Image) -> str: def get_bits_from_image(image: Image, use_h265: bool) -> str:
""" """
extract bits from image (frame) pixels extract bits from image (frame) pixels
image -- png image file used to extract bits from image -- png image file used to extract bits from
""" """
if use_cython: # use two different functions so we can type pixel correctly
if use_cython and not use_h265:
return cy_gbfi(image) return cy_gbfi(image)
elif use_cython and use_h265:
return cy_gbfi_h265(image)
width, height = image.size width, height = image.size
px = image.load() px = image.load()
bits = "" bits = ""
for y in range(height): # use separate code path so we dont check inside every loop
for x in range(width): if not use_h265:
for y in range(height):
for x in range(width):
pixel = px[x, y]
pixel_bin_rep = "0"
pixel = px[x, y] # if the white difference is smaller, that means the pixel is
# closer to white, otherwise, the pixel must be black
if (
abs(pixel[0] - 255) < abs(pixel[0] - 0)
and abs(pixel[1] - 255) < abs(pixel[1] - 0)
and abs(pixel[2] - 255) < abs(pixel[2] - 0)
):
pixel_bin_rep = "1"
pixel_bin_rep = "0" # adding bits
bits += pixel_bin_rep
else:
for y in range(height):
for x in range(width):
pixel = px[x, y]
pixel_bin_rep = "0"
# if the white difference is smaller, that means the pixel is # pixel is either 0 or 255, black or white
# closer to white, otherwise, the pixel must be black if pixel == 255:
if ( pixel_bin_rep = "1"
abs(pixel[0] - 255) < abs(pixel[0] - 0)
and abs(pixel[1] - 255) < abs(pixel[1] - 0)
and abs(pixel[2] - 255) < abs(pixel[2] - 0)
):
pixel_bin_rep = "1"
# adding bits # adding bits
bits += pixel_bin_rep bits += pixel_bin_rep
return bits return bits
def get_bits_from_video(video_filepath: str) -> str: def get_bits_from_video(video_filepath: str, use_h265: bool) -> str:
""" """
extract the bits from a video by frame (using a sequence of images) extract the bits from a video by frame (using a sequence of images)
@ -204,14 +221,24 @@ def get_bits_from_video(video_filepath: str) -> str:
print("Reading video...") print("Reading video...")
image_sequence = [] image_sequence = []
os.system( if use_h265:
"ffmpeg -i " os.system(
+ video_filepath "ffmpeg -i "
+ " -c:v libx264rgb -filter:v fps=fps=" + video_filepath
+ FRAMERATE + " -c:v libx265 -filter:v fps=fps="
+ " " + FRAMERATE
+ TEMPVIDEO + " -x265-params lossless=1 -preset 6 -tune grain "
) + TEMPVIDEO
)
else:
os.system(
"ffmpeg -i "
+ video_filepath
+ " -c:v libx264rgb -filter:v fps=fps="
+ FRAMERATE
+ " "
+ TEMPVIDEO
)
os.system( os.system(
"ffmpeg -i " + TEMPVIDEO + " ./fvid_frames/decoded_frames_%d.png" "ffmpeg -i " + TEMPVIDEO + " ./fvid_frames/decoded_frames_%d.png"
) )
@ -230,7 +257,7 @@ def get_bits_from_video(video_filepath: str) -> str:
print("Using Cython...") print("Using Cython...")
for index in tqdm(range(sequence_length)): for index in tqdm(range(sequence_length)):
bits += get_bits_from_image(image_sequence[index]) bits += get_bits_from_image(image_sequence[index], use_h265)
return bits return bits
@ -290,6 +317,9 @@ def save_bits_to_file(
in_ = io.BytesIO() in_ = io.BytesIO()
in_.write(bitstring.bytes) in_.write(bitstring.bytes)
in_.seek(0) in_.seek(0)
# DOES NOT WORK IF WE DONT CHECK BUFFER, UNSURE WHY
filetype = magic.from_buffer(in_.read())
in_.seek(0)
with gzip.GzipFile(fileobj=in_, mode="rb") as fo: with gzip.GzipFile(fileobj=in_, mode="rb") as fo:
bitstring = fo.read() bitstring = fo.read()
# zip # zip
@ -388,7 +418,7 @@ def make_image_sequence(bitstring: BitArray, resolution: tuple = (1920, 1080)):
index += 1 index += 1
def make_video(output_filepath: str, framerate: int = FRAMERATE): def make_video(output_filepath: str, framerate: int = FRAMERATE, use_h265: bool = False):
""" """
Create video using ffmpeg Create video using ffmpeg
@ -401,13 +431,21 @@ def make_video(output_filepath: str, framerate: int = FRAMERATE):
else: else:
outputfile = output_filepath outputfile = output_filepath
os.system( if use_h265:
"ffmpeg -r " os.system(
+ framerate "ffmpeg -r "
+ " -i ./fvid_frames/encoded_frames_%d.png -c:v libx264rgb " + framerate
+ outputfile + " -i ./fvid_frames/encoded_frames_%d.png -c:v libx265 "
) + " -x265-params lossless=1 -preset 6 -tune grain "
+ outputfile
)
else:
os.system(
"ffmpeg -r "
+ framerate
+ " -i ./fvid_frames/encoded_frames_%d.png -c:v libx264rgb "
+ outputfile
)
def cleanup(): def cleanup():
""" """
@ -468,6 +506,12 @@ def main():
), ),
action="store_true", action="store_true",
) )
parser.add_argument(
"-5",
"--h265",
help="Use H.265 codec for improved efficiency",
action="store_true",
)
args = parser.parse_args() args = parser.parse_args()
@ -495,7 +539,7 @@ def main():
key = get_password(args.password) key = get_password(args.password)
if args.decode: if args.decode:
bits = get_bits_from_video(args.input) bits = get_bits_from_video(args.input, args.h265)
file_path = None file_path = None
@ -529,7 +573,7 @@ def main():
if args.output: if args.output:
video_file_path = args.output video_file_path = args.output
make_video(video_file_path, args.framerate) make_video(video_file_path, args.framerate, args.h265)
cleanup() cleanup()

View File

@ -3,7 +3,6 @@
/* BEGIN: Cython Metadata /* BEGIN: Cython Metadata
{ {
"distutils": { "distutils": {
"language": "c",
"name": "fvid_cython", "name": "fvid_cython",
"sources": [ "sources": [
"fvid_cython.pyx" "fvid_cython.pyx"
@ -823,7 +822,7 @@ static const char *__pyx_f[] = {
struct __pyx_ctuple_int__and_int__and_int; struct __pyx_ctuple_int__and_int__and_int;
typedef struct __pyx_ctuple_int__and_int__and_int __pyx_ctuple_int__and_int__and_int; typedef struct __pyx_ctuple_int__and_int__and_int __pyx_ctuple_int__and_int__and_int;
/* "fvid_cython.pyx":9 /* "fvid_cython.pyx":30
* cdef int width, height, x, y * cdef int width, height, x, y
* cdef str pixel_bin_rep, bits * cdef str pixel_bin_rep, bits
* cdef (int, int, int) pixel # <<<<<<<<<<<<<< * cdef (int, int, int) pixel # <<<<<<<<<<<<<<
@ -1127,7 +1126,8 @@ static int __Pyx_InitStrings(__Pyx_StringTabEntry *t);
/* Module declarations from 'fvid_cython' */ /* Module declarations from 'fvid_cython' */
static PyObject *__pyx_f_11fvid_cython_cy_get_bits_from_image(PyObject *, int __pyx_skip_dispatch); /*proto*/ static PyObject *__pyx_f_11fvid_cython_cy_gbfi_h265(PyObject *, int __pyx_skip_dispatch); /*proto*/
static PyObject *__pyx_f_11fvid_cython_cy_gbfi(PyObject *, int __pyx_skip_dispatch); /*proto*/
#define __Pyx_MODULE_NAME "fvid_cython" #define __Pyx_MODULE_NAME "fvid_cython"
extern int __pyx_module_is_main_fvid_cython; extern int __pyx_module_is_main_fvid_cython;
int __pyx_module_is_main_fvid_cython = 0; int __pyx_module_is_main_fvid_cython = 0;
@ -1154,19 +1154,334 @@ static PyObject *__pyx_n_s_name;
static PyObject *__pyx_n_s_range; static PyObject *__pyx_n_s_range;
static PyObject *__pyx_n_s_size; static PyObject *__pyx_n_s_size;
static PyObject *__pyx_n_s_test; static PyObject *__pyx_n_s_test;
static PyObject *__pyx_pf_11fvid_cython_cy_get_bits_from_image(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_image); /* proto */ static PyObject *__pyx_pf_11fvid_cython_cy_gbfi_h265(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_image); /* proto */
static PyObject *__pyx_pf_11fvid_cython_2cy_gbfi(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_image); /* proto */
/* Late includes */ /* Late includes */
/* "fvid_cython.pyx":6 /* "fvid_cython.pyx":5
* # cython: wraparound=False * # cython: wraparound=False
* *
* cpdef str cy_get_bits_from_image(image): # <<<<<<<<<<<<<< * cpdef str cy_gbfi_h265(image): # <<<<<<<<<<<<<<
* cdef int width, height, x, y, pixel
* cdef str pixel_bin_rep, bits
*/
static PyObject *__pyx_pw_11fvid_cython_1cy_gbfi_h265(PyObject *__pyx_self, PyObject *__pyx_v_image); /*proto*/
static PyObject *__pyx_f_11fvid_cython_cy_gbfi_h265(PyObject *__pyx_v_image, CYTHON_UNUSED int __pyx_skip_dispatch) {
int __pyx_v_width;
int __pyx_v_height;
int __pyx_v_x;
int __pyx_v_y;
int __pyx_v_pixel;
PyObject *__pyx_v_pixel_bin_rep = 0;
PyObject *__pyx_v_bits = 0;
PyObject *__pyx_v_px = NULL;
PyObject *__pyx_r = NULL;
__Pyx_RefNannyDeclarations
PyObject *__pyx_t_1 = NULL;
PyObject *__pyx_t_2 = NULL;
PyObject *__pyx_t_3 = NULL;
PyObject *__pyx_t_4 = NULL;
PyObject *(*__pyx_t_5)(PyObject *);
int __pyx_t_6;
int __pyx_t_7;
int __pyx_t_8;
int __pyx_t_9;
int __pyx_t_10;
int __pyx_t_11;
int __pyx_t_12;
int __pyx_t_13;
__Pyx_RefNannySetupContext("cy_gbfi_h265", 0);
/* "fvid_cython.pyx":9
* cdef str pixel_bin_rep, bits
*
* width, height = image.size # <<<<<<<<<<<<<<
*
* px = image.load()
*/
__pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_image, __pyx_n_s_size); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 9, __pyx_L1_error)
__Pyx_GOTREF(__pyx_t_1);
if ((likely(PyTuple_CheckExact(__pyx_t_1))) || (PyList_CheckExact(__pyx_t_1))) {
PyObject* sequence = __pyx_t_1;
Py_ssize_t size = __Pyx_PySequence_SIZE(sequence);
if (unlikely(size != 2)) {
if (size > 2) __Pyx_RaiseTooManyValuesError(2);
else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
__PYX_ERR(0, 9, __pyx_L1_error)
}
#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
if (likely(PyTuple_CheckExact(sequence))) {
__pyx_t_2 = PyTuple_GET_ITEM(sequence, 0);
__pyx_t_3 = PyTuple_GET_ITEM(sequence, 1);
} else {
__pyx_t_2 = PyList_GET_ITEM(sequence, 0);
__pyx_t_3 = PyList_GET_ITEM(sequence, 1);
}
__Pyx_INCREF(__pyx_t_2);
__Pyx_INCREF(__pyx_t_3);
#else
__pyx_t_2 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 9, __pyx_L1_error)
__Pyx_GOTREF(__pyx_t_2);
__pyx_t_3 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 9, __pyx_L1_error)
__Pyx_GOTREF(__pyx_t_3);
#endif
__Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
} else {
Py_ssize_t index = -1;
__pyx_t_4 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 9, __pyx_L1_error)
__Pyx_GOTREF(__pyx_t_4);
__Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
__pyx_t_5 = Py_TYPE(__pyx_t_4)->tp_iternext;
index = 0; __pyx_t_2 = __pyx_t_5(__pyx_t_4); if (unlikely(!__pyx_t_2)) goto __pyx_L3_unpacking_failed;
__Pyx_GOTREF(__pyx_t_2);
index = 1; __pyx_t_3 = __pyx_t_5(__pyx_t_4); if (unlikely(!__pyx_t_3)) goto __pyx_L3_unpacking_failed;
__Pyx_GOTREF(__pyx_t_3);
if (__Pyx_IternextUnpackEndCheck(__pyx_t_5(__pyx_t_4), 2) < 0) __PYX_ERR(0, 9, __pyx_L1_error)
__pyx_t_5 = NULL;
__Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
goto __pyx_L4_unpacking_done;
__pyx_L3_unpacking_failed:;
__Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
__pyx_t_5 = NULL;
if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
__PYX_ERR(0, 9, __pyx_L1_error)
__pyx_L4_unpacking_done:;
}
__pyx_t_6 = __Pyx_PyInt_As_int(__pyx_t_2); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 9, __pyx_L1_error)
__Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
__pyx_t_7 = __Pyx_PyInt_As_int(__pyx_t_3); if (unlikely((__pyx_t_7 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 9, __pyx_L1_error)
__Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
__pyx_v_width = __pyx_t_6;
__pyx_v_height = __pyx_t_7;
/* "fvid_cython.pyx":11
* width, height = image.size
*
* px = image.load() # <<<<<<<<<<<<<<
* bits = ""
*
*/
__pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_image, __pyx_n_s_load); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 11, __pyx_L1_error)
__Pyx_GOTREF(__pyx_t_3);
__pyx_t_2 = NULL;
if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_3))) {
__pyx_t_2 = PyMethod_GET_SELF(__pyx_t_3);
if (likely(__pyx_t_2)) {
PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
__Pyx_INCREF(__pyx_t_2);
__Pyx_INCREF(function);
__Pyx_DECREF_SET(__pyx_t_3, function);
}
}
__pyx_t_1 = (__pyx_t_2) ? __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_2) : __Pyx_PyObject_CallNoArg(__pyx_t_3);
__Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 11, __pyx_L1_error)
__Pyx_GOTREF(__pyx_t_1);
__Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
__pyx_v_px = __pyx_t_1;
__pyx_t_1 = 0;
/* "fvid_cython.pyx":12
*
* px = image.load()
* bits = "" # <<<<<<<<<<<<<<
*
* for y in range(height):
*/
__Pyx_INCREF(__pyx_kp_u_);
__pyx_v_bits = __pyx_kp_u_;
/* "fvid_cython.pyx":14
* bits = ""
*
* for y in range(height): # <<<<<<<<<<<<<<
* for x in range(width):
* pixel = px[x, y]
*/
__pyx_t_7 = __pyx_v_height;
__pyx_t_6 = __pyx_t_7;
for (__pyx_t_8 = 0; __pyx_t_8 < __pyx_t_6; __pyx_t_8+=1) {
__pyx_v_y = __pyx_t_8;
/* "fvid_cython.pyx":15
*
* for y in range(height):
* for x in range(width): # <<<<<<<<<<<<<<
* pixel = px[x, y]
*
*/
__pyx_t_9 = __pyx_v_width;
__pyx_t_10 = __pyx_t_9;
for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) {
__pyx_v_x = __pyx_t_11;
/* "fvid_cython.pyx":16
* for y in range(height):
* for x in range(width):
* pixel = px[x, y] # <<<<<<<<<<<<<<
*
* pixel_bin_rep = <str>"0"
*/
__pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_x); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 16, __pyx_L1_error)
__Pyx_GOTREF(__pyx_t_1);
__pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_y); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 16, __pyx_L1_error)
__Pyx_GOTREF(__pyx_t_3);
__pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 16, __pyx_L1_error)
__Pyx_GOTREF(__pyx_t_2);
__Pyx_GIVEREF(__pyx_t_1);
PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);
__Pyx_GIVEREF(__pyx_t_3);
PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_3);
__pyx_t_1 = 0;
__pyx_t_3 = 0;
__pyx_t_3 = __Pyx_PyObject_GetItem(__pyx_v_px, __pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 16, __pyx_L1_error)
__Pyx_GOTREF(__pyx_t_3);
__Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
__pyx_t_12 = __Pyx_PyInt_As_int(__pyx_t_3); if (unlikely((__pyx_t_12 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 16, __pyx_L1_error)
__Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
__pyx_v_pixel = __pyx_t_12;
/* "fvid_cython.pyx":18
* pixel = px[x, y]
*
* pixel_bin_rep = <str>"0" # <<<<<<<<<<<<<<
*
* if pixel == 255:
*/
__pyx_t_3 = __pyx_kp_u_0;
__Pyx_INCREF(__pyx_t_3);
__Pyx_XDECREF_SET(__pyx_v_pixel_bin_rep, ((PyObject*)__pyx_t_3));
__pyx_t_3 = 0;
/* "fvid_cython.pyx":20
* pixel_bin_rep = <str>"0"
*
* if pixel == 255: # <<<<<<<<<<<<<<
* pixel_bin_rep = <str>"1"
*
*/
__pyx_t_13 = ((__pyx_v_pixel == 0xFF) != 0);
if (__pyx_t_13) {
/* "fvid_cython.pyx":21
*
* if pixel == 255:
* pixel_bin_rep = <str>"1" # <<<<<<<<<<<<<<
*
* bits += pixel_bin_rep
*/
__pyx_t_3 = __pyx_kp_u_1;
__Pyx_INCREF(__pyx_t_3);
__Pyx_DECREF_SET(__pyx_v_pixel_bin_rep, ((PyObject*)__pyx_t_3));
__pyx_t_3 = 0;
/* "fvid_cython.pyx":20
* pixel_bin_rep = <str>"0"
*
* if pixel == 255: # <<<<<<<<<<<<<<
* pixel_bin_rep = <str>"1"
*
*/
}
/* "fvid_cython.pyx":23
* pixel_bin_rep = <str>"1"
*
* bits += pixel_bin_rep # <<<<<<<<<<<<<<
*
* return bits
*/
__pyx_t_3 = __Pyx_PyUnicode_ConcatSafe(__pyx_v_bits, __pyx_v_pixel_bin_rep); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 23, __pyx_L1_error)
__Pyx_GOTREF(__pyx_t_3);
__Pyx_DECREF_SET(__pyx_v_bits, ((PyObject*)__pyx_t_3));
__pyx_t_3 = 0;
}
}
/* "fvid_cython.pyx":25
* bits += pixel_bin_rep
*
* return bits # <<<<<<<<<<<<<<
*
* cpdef str cy_gbfi(image):
*/
__Pyx_XDECREF(__pyx_r);
__Pyx_INCREF(__pyx_v_bits);
__pyx_r = __pyx_v_bits;
goto __pyx_L0;
/* "fvid_cython.pyx":5
* # cython: wraparound=False
*
* cpdef str cy_gbfi_h265(image): # <<<<<<<<<<<<<<
* cdef int width, height, x, y, pixel
* cdef str pixel_bin_rep, bits
*/
/* function exit code */
__pyx_L1_error:;
__Pyx_XDECREF(__pyx_t_1);
__Pyx_XDECREF(__pyx_t_2);
__Pyx_XDECREF(__pyx_t_3);
__Pyx_XDECREF(__pyx_t_4);
__Pyx_AddTraceback("fvid_cython.cy_gbfi_h265", __pyx_clineno, __pyx_lineno, __pyx_filename);
__pyx_r = 0;
__pyx_L0:;
__Pyx_XDECREF(__pyx_v_pixel_bin_rep);
__Pyx_XDECREF(__pyx_v_bits);
__Pyx_XDECREF(__pyx_v_px);
__Pyx_XGIVEREF(__pyx_r);
__Pyx_RefNannyFinishContext();
return __pyx_r;
}
/* Python wrapper */
static PyObject *__pyx_pw_11fvid_cython_1cy_gbfi_h265(PyObject *__pyx_self, PyObject *__pyx_v_image); /*proto*/
static PyObject *__pyx_pw_11fvid_cython_1cy_gbfi_h265(PyObject *__pyx_self, PyObject *__pyx_v_image) {
PyObject *__pyx_r = 0;
__Pyx_RefNannyDeclarations
__Pyx_RefNannySetupContext("cy_gbfi_h265 (wrapper)", 0);
__pyx_r = __pyx_pf_11fvid_cython_cy_gbfi_h265(__pyx_self, ((PyObject *)__pyx_v_image));
/* function exit code */
__Pyx_RefNannyFinishContext();
return __pyx_r;
}
static PyObject *__pyx_pf_11fvid_cython_cy_gbfi_h265(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_image) {
PyObject *__pyx_r = NULL;
__Pyx_RefNannyDeclarations
PyObject *__pyx_t_1 = NULL;
__Pyx_RefNannySetupContext("cy_gbfi_h265", 0);
__Pyx_XDECREF(__pyx_r);
__pyx_t_1 = __pyx_f_11fvid_cython_cy_gbfi_h265(__pyx_v_image, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 5, __pyx_L1_error)
__Pyx_GOTREF(__pyx_t_1);
__pyx_r = __pyx_t_1;
__pyx_t_1 = 0;
goto __pyx_L0;
/* function exit code */
__pyx_L1_error:;
__Pyx_XDECREF(__pyx_t_1);
__Pyx_AddTraceback("fvid_cython.cy_gbfi_h265", __pyx_clineno, __pyx_lineno, __pyx_filename);
__pyx_r = NULL;
__pyx_L0:;
__Pyx_XGIVEREF(__pyx_r);
__Pyx_RefNannyFinishContext();
return __pyx_r;
}
/* "fvid_cython.pyx":27
* return bits
*
* cpdef str cy_gbfi(image): # <<<<<<<<<<<<<<
* cdef int width, height, x, y * cdef int width, height, x, y
* cdef str pixel_bin_rep, bits * cdef str pixel_bin_rep, bits
*/ */
static PyObject *__pyx_pw_11fvid_cython_1cy_get_bits_from_image(PyObject *__pyx_self, PyObject *__pyx_v_image); /*proto*/ static PyObject *__pyx_pw_11fvid_cython_3cy_gbfi(PyObject *__pyx_self, PyObject *__pyx_v_image); /*proto*/
static PyObject *__pyx_f_11fvid_cython_cy_get_bits_from_image(PyObject *__pyx_v_image, CYTHON_UNUSED int __pyx_skip_dispatch) { static PyObject *__pyx_f_11fvid_cython_cy_gbfi(PyObject *__pyx_v_image, CYTHON_UNUSED int __pyx_skip_dispatch) {
int __pyx_v_width; int __pyx_v_width;
int __pyx_v_height; int __pyx_v_height;
int __pyx_v_x; int __pyx_v_x;
@ -1193,16 +1508,16 @@ static PyObject *__pyx_f_11fvid_cython_cy_get_bits_from_image(PyObject *__pyx_v_
long __pyx_t_14; long __pyx_t_14;
long __pyx_t_15; long __pyx_t_15;
int __pyx_t_16; int __pyx_t_16;
__Pyx_RefNannySetupContext("cy_get_bits_from_image", 0); __Pyx_RefNannySetupContext("cy_gbfi", 0);
/* "fvid_cython.pyx":11 /* "fvid_cython.pyx":32
* cdef (int, int, int) pixel * cdef (int, int, int) pixel
* *
* width, height = image.size # <<<<<<<<<<<<<< * width, height = image.size # <<<<<<<<<<<<<<
* *
* px = image.load() * px = image.load()
*/ */
__pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_image, __pyx_n_s_size); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 11, __pyx_L1_error) __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_image, __pyx_n_s_size); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 32, __pyx_L1_error)
__Pyx_GOTREF(__pyx_t_1); __Pyx_GOTREF(__pyx_t_1);
if ((likely(PyTuple_CheckExact(__pyx_t_1))) || (PyList_CheckExact(__pyx_t_1))) { if ((likely(PyTuple_CheckExact(__pyx_t_1))) || (PyList_CheckExact(__pyx_t_1))) {
PyObject* sequence = __pyx_t_1; PyObject* sequence = __pyx_t_1;
@ -1210,7 +1525,7 @@ static PyObject *__pyx_f_11fvid_cython_cy_get_bits_from_image(PyObject *__pyx_v_
if (unlikely(size != 2)) { if (unlikely(size != 2)) {
if (size > 2) __Pyx_RaiseTooManyValuesError(2); if (size > 2) __Pyx_RaiseTooManyValuesError(2);
else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
__PYX_ERR(0, 11, __pyx_L1_error) __PYX_ERR(0, 32, __pyx_L1_error)
} }
#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
if (likely(PyTuple_CheckExact(sequence))) { if (likely(PyTuple_CheckExact(sequence))) {
@ -1223,15 +1538,15 @@ static PyObject *__pyx_f_11fvid_cython_cy_get_bits_from_image(PyObject *__pyx_v_
__Pyx_INCREF(__pyx_t_2); __Pyx_INCREF(__pyx_t_2);
__Pyx_INCREF(__pyx_t_3); __Pyx_INCREF(__pyx_t_3);
#else #else
__pyx_t_2 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 11, __pyx_L1_error) __pyx_t_2 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 32, __pyx_L1_error)
__Pyx_GOTREF(__pyx_t_2); __Pyx_GOTREF(__pyx_t_2);
__pyx_t_3 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 11, __pyx_L1_error) __pyx_t_3 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 32, __pyx_L1_error)
__Pyx_GOTREF(__pyx_t_3); __Pyx_GOTREF(__pyx_t_3);
#endif #endif
__Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
} else { } else {
Py_ssize_t index = -1; Py_ssize_t index = -1;
__pyx_t_4 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 11, __pyx_L1_error) __pyx_t_4 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 32, __pyx_L1_error)
__Pyx_GOTREF(__pyx_t_4); __Pyx_GOTREF(__pyx_t_4);
__Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
__pyx_t_5 = Py_TYPE(__pyx_t_4)->tp_iternext; __pyx_t_5 = Py_TYPE(__pyx_t_4)->tp_iternext;
@ -1239,7 +1554,7 @@ static PyObject *__pyx_f_11fvid_cython_cy_get_bits_from_image(PyObject *__pyx_v_
__Pyx_GOTREF(__pyx_t_2); __Pyx_GOTREF(__pyx_t_2);
index = 1; __pyx_t_3 = __pyx_t_5(__pyx_t_4); if (unlikely(!__pyx_t_3)) goto __pyx_L3_unpacking_failed; index = 1; __pyx_t_3 = __pyx_t_5(__pyx_t_4); if (unlikely(!__pyx_t_3)) goto __pyx_L3_unpacking_failed;
__Pyx_GOTREF(__pyx_t_3); __Pyx_GOTREF(__pyx_t_3);
if (__Pyx_IternextUnpackEndCheck(__pyx_t_5(__pyx_t_4), 2) < 0) __PYX_ERR(0, 11, __pyx_L1_error) if (__Pyx_IternextUnpackEndCheck(__pyx_t_5(__pyx_t_4), 2) < 0) __PYX_ERR(0, 32, __pyx_L1_error)
__pyx_t_5 = NULL; __pyx_t_5 = NULL;
__Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
goto __pyx_L4_unpacking_done; goto __pyx_L4_unpacking_done;
@ -1247,24 +1562,24 @@ static PyObject *__pyx_f_11fvid_cython_cy_get_bits_from_image(PyObject *__pyx_v_
__Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
__pyx_t_5 = NULL; __pyx_t_5 = NULL;
if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index); if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
__PYX_ERR(0, 11, __pyx_L1_error) __PYX_ERR(0, 32, __pyx_L1_error)
__pyx_L4_unpacking_done:; __pyx_L4_unpacking_done:;
} }
__pyx_t_6 = __Pyx_PyInt_As_int(__pyx_t_2); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 11, __pyx_L1_error) __pyx_t_6 = __Pyx_PyInt_As_int(__pyx_t_2); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 32, __pyx_L1_error)
__Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
__pyx_t_7 = __Pyx_PyInt_As_int(__pyx_t_3); if (unlikely((__pyx_t_7 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 11, __pyx_L1_error) __pyx_t_7 = __Pyx_PyInt_As_int(__pyx_t_3); if (unlikely((__pyx_t_7 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 32, __pyx_L1_error)
__Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
__pyx_v_width = __pyx_t_6; __pyx_v_width = __pyx_t_6;
__pyx_v_height = __pyx_t_7; __pyx_v_height = __pyx_t_7;
/* "fvid_cython.pyx":13 /* "fvid_cython.pyx":34
* width, height = image.size * width, height = image.size
* *
* px = image.load() # <<<<<<<<<<<<<< * px = image.load() # <<<<<<<<<<<<<<
* bits = "" * bits = ""
* *
*/ */
__pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_image, __pyx_n_s_load); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 13, __pyx_L1_error) __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_image, __pyx_n_s_load); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 34, __pyx_L1_error)
__Pyx_GOTREF(__pyx_t_3); __Pyx_GOTREF(__pyx_t_3);
__pyx_t_2 = NULL; __pyx_t_2 = NULL;
if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_3))) { if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_3))) {
@ -1278,13 +1593,13 @@ static PyObject *__pyx_f_11fvid_cython_cy_get_bits_from_image(PyObject *__pyx_v_
} }
__pyx_t_1 = (__pyx_t_2) ? __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_2) : __Pyx_PyObject_CallNoArg(__pyx_t_3); __pyx_t_1 = (__pyx_t_2) ? __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_2) : __Pyx_PyObject_CallNoArg(__pyx_t_3);
__Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 13, __pyx_L1_error) if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 34, __pyx_L1_error)
__Pyx_GOTREF(__pyx_t_1); __Pyx_GOTREF(__pyx_t_1);
__Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
__pyx_v_px = __pyx_t_1; __pyx_v_px = __pyx_t_1;
__pyx_t_1 = 0; __pyx_t_1 = 0;
/* "fvid_cython.pyx":14 /* "fvid_cython.pyx":35
* *
* px = image.load() * px = image.load()
* bits = "" # <<<<<<<<<<<<<< * bits = "" # <<<<<<<<<<<<<<
@ -1294,7 +1609,7 @@ static PyObject *__pyx_f_11fvid_cython_cy_get_bits_from_image(PyObject *__pyx_v_
__Pyx_INCREF(__pyx_kp_u_); __Pyx_INCREF(__pyx_kp_u_);
__pyx_v_bits = __pyx_kp_u_; __pyx_v_bits = __pyx_kp_u_;
/* "fvid_cython.pyx":16 /* "fvid_cython.pyx":37
* bits = "" * bits = ""
* *
* for y in range(height): # <<<<<<<<<<<<<< * for y in range(height): # <<<<<<<<<<<<<<
@ -1306,7 +1621,7 @@ static PyObject *__pyx_f_11fvid_cython_cy_get_bits_from_image(PyObject *__pyx_v_
for (__pyx_t_8 = 0; __pyx_t_8 < __pyx_t_6; __pyx_t_8+=1) { for (__pyx_t_8 = 0; __pyx_t_8 < __pyx_t_6; __pyx_t_8+=1) {
__pyx_v_y = __pyx_t_8; __pyx_v_y = __pyx_t_8;
/* "fvid_cython.pyx":17 /* "fvid_cython.pyx":38
* *
* for y in range(height): * for y in range(height):
* for x in range(width): # <<<<<<<<<<<<<< * for x in range(width): # <<<<<<<<<<<<<<
@ -1318,18 +1633,18 @@ static PyObject *__pyx_f_11fvid_cython_cy_get_bits_from_image(PyObject *__pyx_v_
for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) { for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) {
__pyx_v_x = __pyx_t_11; __pyx_v_x = __pyx_t_11;
/* "fvid_cython.pyx":18 /* "fvid_cython.pyx":39
* for y in range(height): * for y in range(height):
* for x in range(width): * for x in range(width):
* pixel = px[x, y] # <<<<<<<<<<<<<< * pixel = px[x, y] # <<<<<<<<<<<<<<
* *
* pixel_bin_rep = <str>"0" * pixel_bin_rep = <str>"0"
*/ */
__pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_x); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 18, __pyx_L1_error) __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_x); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 39, __pyx_L1_error)
__Pyx_GOTREF(__pyx_t_1); __Pyx_GOTREF(__pyx_t_1);
__pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_y); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 18, __pyx_L1_error) __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_y); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 39, __pyx_L1_error)
__Pyx_GOTREF(__pyx_t_3); __Pyx_GOTREF(__pyx_t_3);
__pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 18, __pyx_L1_error) __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 39, __pyx_L1_error)
__Pyx_GOTREF(__pyx_t_2); __Pyx_GOTREF(__pyx_t_2);
__Pyx_GIVEREF(__pyx_t_1); __Pyx_GIVEREF(__pyx_t_1);
PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1); PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);
@ -1337,14 +1652,14 @@ static PyObject *__pyx_f_11fvid_cython_cy_get_bits_from_image(PyObject *__pyx_v_
PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_3); PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_3);
__pyx_t_1 = 0; __pyx_t_1 = 0;
__pyx_t_3 = 0; __pyx_t_3 = 0;
__pyx_t_3 = __Pyx_PyObject_GetItem(__pyx_v_px, __pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 18, __pyx_L1_error) __pyx_t_3 = __Pyx_PyObject_GetItem(__pyx_v_px, __pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 39, __pyx_L1_error)
__Pyx_GOTREF(__pyx_t_3); __Pyx_GOTREF(__pyx_t_3);
__Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
__pyx_t_12 = __pyx_convert__from_py___pyx_ctuple_int__and_int__and_int(__pyx_t_3); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 18, __pyx_L1_error) __pyx_t_12 = __pyx_convert__from_py___pyx_ctuple_int__and_int__and_int(__pyx_t_3); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 39, __pyx_L1_error)
__Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
__pyx_v_pixel = __pyx_t_12; __pyx_v_pixel = __pyx_t_12;
/* "fvid_cython.pyx":20 /* "fvid_cython.pyx":41
* pixel = px[x, y] * pixel = px[x, y]
* *
* pixel_bin_rep = <str>"0" # <<<<<<<<<<<<<< * pixel_bin_rep = <str>"0" # <<<<<<<<<<<<<<
@ -1356,49 +1671,49 @@ static PyObject *__pyx_f_11fvid_cython_cy_get_bits_from_image(PyObject *__pyx_v_
__Pyx_XDECREF_SET(__pyx_v_pixel_bin_rep, ((PyObject*)__pyx_t_3)); __Pyx_XDECREF_SET(__pyx_v_pixel_bin_rep, ((PyObject*)__pyx_t_3));
__pyx_t_3 = 0; __pyx_t_3 = 0;
/* "fvid_cython.pyx":24 /* "fvid_cython.pyx":45
* # if the white difference is smaller (comparison part 1), that means the pixel is closer * # if the white difference is smaller (comparison part 1), that means the pixel is closer
* # to white, otherwise, the pixel must be black * # to white, otherwise, the pixel must be black
* if abs(pixel[0] - 255) < abs(pixel[0] - 0) and abs(pixel[1] - 255) < abs(pixel[1] - 0) and abs(pixel[2] - 255) < abs(pixel[2] - 0): # <<<<<<<<<<<<<< * if abs(pixel[0] - 255) < abs(pixel[0] - 0) and abs(pixel[1] - 255) < abs(pixel[1] - 0) and abs(pixel[2] - 255) < abs(pixel[2] - 0): # <<<<<<<<<<<<<<
* pixel_bin_rep = <str>"1" * pixel_bin_rep = <str>"1"
* *
*/ */
__pyx_t_14 = labs((__pyx_v_pixel.f0 - 0xFF)); if (unlikely(__pyx_t_14 == ((long)-1))) __PYX_ERR(0, 24, __pyx_L1_error) __pyx_t_14 = labs((__pyx_v_pixel.f0 - 0xFF)); if (unlikely(__pyx_t_14 == ((long)-1))) __PYX_ERR(0, 45, __pyx_L1_error)
__pyx_t_15 = labs((__pyx_v_pixel.f0 - 0)); if (unlikely(__pyx_t_15 == ((long)-1))) __PYX_ERR(0, 24, __pyx_L1_error) __pyx_t_15 = labs((__pyx_v_pixel.f0 - 0)); if (unlikely(__pyx_t_15 == ((long)-1))) __PYX_ERR(0, 45, __pyx_L1_error)
__pyx_t_16 = ((__pyx_t_14 < __pyx_t_15) != 0); __pyx_t_16 = ((__pyx_t_14 < __pyx_t_15) != 0);
if (__pyx_t_16) { if (__pyx_t_16) {
} else { } else {
__pyx_t_13 = __pyx_t_16; __pyx_t_13 = __pyx_t_16;
goto __pyx_L10_bool_binop_done; goto __pyx_L10_bool_binop_done;
} }
__pyx_t_15 = labs((__pyx_v_pixel.f1 - 0xFF)); if (unlikely(__pyx_t_15 == ((long)-1))) __PYX_ERR(0, 24, __pyx_L1_error) __pyx_t_15 = labs((__pyx_v_pixel.f1 - 0xFF)); if (unlikely(__pyx_t_15 == ((long)-1))) __PYX_ERR(0, 45, __pyx_L1_error)
__pyx_t_14 = labs((__pyx_v_pixel.f1 - 0)); if (unlikely(__pyx_t_14 == ((long)-1))) __PYX_ERR(0, 24, __pyx_L1_error) __pyx_t_14 = labs((__pyx_v_pixel.f1 - 0)); if (unlikely(__pyx_t_14 == ((long)-1))) __PYX_ERR(0, 45, __pyx_L1_error)
__pyx_t_16 = ((__pyx_t_15 < __pyx_t_14) != 0); __pyx_t_16 = ((__pyx_t_15 < __pyx_t_14) != 0);
if (__pyx_t_16) { if (__pyx_t_16) {
} else { } else {
__pyx_t_13 = __pyx_t_16; __pyx_t_13 = __pyx_t_16;
goto __pyx_L10_bool_binop_done; goto __pyx_L10_bool_binop_done;
} }
__pyx_t_14 = labs((__pyx_v_pixel.f2 - 0xFF)); if (unlikely(__pyx_t_14 == ((long)-1))) __PYX_ERR(0, 24, __pyx_L1_error) __pyx_t_14 = labs((__pyx_v_pixel.f2 - 0xFF)); if (unlikely(__pyx_t_14 == ((long)-1))) __PYX_ERR(0, 45, __pyx_L1_error)
__pyx_t_15 = labs((__pyx_v_pixel.f2 - 0)); if (unlikely(__pyx_t_15 == ((long)-1))) __PYX_ERR(0, 24, __pyx_L1_error) __pyx_t_15 = labs((__pyx_v_pixel.f2 - 0)); if (unlikely(__pyx_t_15 == ((long)-1))) __PYX_ERR(0, 45, __pyx_L1_error)
__pyx_t_16 = ((__pyx_t_14 < __pyx_t_15) != 0); __pyx_t_16 = ((__pyx_t_14 < __pyx_t_15) != 0);
__pyx_t_13 = __pyx_t_16; __pyx_t_13 = __pyx_t_16;
__pyx_L10_bool_binop_done:; __pyx_L10_bool_binop_done:;
if (__pyx_t_13) { if (__pyx_t_13) {
/* "fvid_cython.pyx":25 /* "fvid_cython.pyx":46
* # to white, otherwise, the pixel must be black * # to white, otherwise, the pixel must be black
* if abs(pixel[0] - 255) < abs(pixel[0] - 0) and abs(pixel[1] - 255) < abs(pixel[1] - 0) and abs(pixel[2] - 255) < abs(pixel[2] - 0): * if abs(pixel[0] - 255) < abs(pixel[0] - 0) and abs(pixel[1] - 255) < abs(pixel[1] - 0) and abs(pixel[2] - 255) < abs(pixel[2] - 0):
* pixel_bin_rep = <str>"1" # <<<<<<<<<<<<<< * pixel_bin_rep = <str>"1" # <<<<<<<<<<<<<<
* *
* # adding bits * bits += pixel_bin_rep
*/ */
__pyx_t_3 = __pyx_kp_u_1; __pyx_t_3 = __pyx_kp_u_1;
__Pyx_INCREF(__pyx_t_3); __Pyx_INCREF(__pyx_t_3);
__Pyx_DECREF_SET(__pyx_v_pixel_bin_rep, ((PyObject*)__pyx_t_3)); __Pyx_DECREF_SET(__pyx_v_pixel_bin_rep, ((PyObject*)__pyx_t_3));
__pyx_t_3 = 0; __pyx_t_3 = 0;
/* "fvid_cython.pyx":24 /* "fvid_cython.pyx":45
* # if the white difference is smaller (comparison part 1), that means the pixel is closer * # if the white difference is smaller (comparison part 1), that means the pixel is closer
* # to white, otherwise, the pixel must be black * # to white, otherwise, the pixel must be black
* if abs(pixel[0] - 255) < abs(pixel[0] - 0) and abs(pixel[1] - 255) < abs(pixel[1] - 0) and abs(pixel[2] - 255) < abs(pixel[2] - 0): # <<<<<<<<<<<<<< * if abs(pixel[0] - 255) < abs(pixel[0] - 0) and abs(pixel[1] - 255) < abs(pixel[1] - 0) and abs(pixel[2] - 255) < abs(pixel[2] - 0): # <<<<<<<<<<<<<<
@ -1407,21 +1722,21 @@ static PyObject *__pyx_f_11fvid_cython_cy_get_bits_from_image(PyObject *__pyx_v_
*/ */
} }
/* "fvid_cython.pyx":28 /* "fvid_cython.pyx":48
* pixel_bin_rep = <str>"1"
* *
* # adding bits
* bits += pixel_bin_rep # <<<<<<<<<<<<<< * bits += pixel_bin_rep # <<<<<<<<<<<<<<
* *
* return bits * return bits
*/ */
__pyx_t_3 = __Pyx_PyUnicode_ConcatSafe(__pyx_v_bits, __pyx_v_pixel_bin_rep); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 28, __pyx_L1_error) __pyx_t_3 = __Pyx_PyUnicode_ConcatSafe(__pyx_v_bits, __pyx_v_pixel_bin_rep); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 48, __pyx_L1_error)
__Pyx_GOTREF(__pyx_t_3); __Pyx_GOTREF(__pyx_t_3);
__Pyx_DECREF_SET(__pyx_v_bits, ((PyObject*)__pyx_t_3)); __Pyx_DECREF_SET(__pyx_v_bits, ((PyObject*)__pyx_t_3));
__pyx_t_3 = 0; __pyx_t_3 = 0;
} }
} }
/* "fvid_cython.pyx":30 /* "fvid_cython.pyx":50
* bits += pixel_bin_rep * bits += pixel_bin_rep
* *
* return bits # <<<<<<<<<<<<<< * return bits # <<<<<<<<<<<<<<
@ -1431,10 +1746,10 @@ static PyObject *__pyx_f_11fvid_cython_cy_get_bits_from_image(PyObject *__pyx_v_
__pyx_r = __pyx_v_bits; __pyx_r = __pyx_v_bits;
goto __pyx_L0; goto __pyx_L0;
/* "fvid_cython.pyx":6 /* "fvid_cython.pyx":27
* # cython: wraparound=False * return bits
* *
* cpdef str cy_get_bits_from_image(image): # <<<<<<<<<<<<<< * cpdef str cy_gbfi(image): # <<<<<<<<<<<<<<
* cdef int width, height, x, y * cdef int width, height, x, y
* cdef str pixel_bin_rep, bits * cdef str pixel_bin_rep, bits
*/ */
@ -1445,7 +1760,7 @@ static PyObject *__pyx_f_11fvid_cython_cy_get_bits_from_image(PyObject *__pyx_v_
__Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_2);
__Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_3);
__Pyx_XDECREF(__pyx_t_4); __Pyx_XDECREF(__pyx_t_4);
__Pyx_AddTraceback("fvid_cython.cy_get_bits_from_image", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_AddTraceback("fvid_cython.cy_gbfi", __pyx_clineno, __pyx_lineno, __pyx_filename);
__pyx_r = 0; __pyx_r = 0;
__pyx_L0:; __pyx_L0:;
__Pyx_XDECREF(__pyx_v_pixel_bin_rep); __Pyx_XDECREF(__pyx_v_pixel_bin_rep);
@ -1457,25 +1772,25 @@ static PyObject *__pyx_f_11fvid_cython_cy_get_bits_from_image(PyObject *__pyx_v_
} }
/* Python wrapper */ /* Python wrapper */
static PyObject *__pyx_pw_11fvid_cython_1cy_get_bits_from_image(PyObject *__pyx_self, PyObject *__pyx_v_image); /*proto*/ static PyObject *__pyx_pw_11fvid_cython_3cy_gbfi(PyObject *__pyx_self, PyObject *__pyx_v_image); /*proto*/
static PyObject *__pyx_pw_11fvid_cython_1cy_get_bits_from_image(PyObject *__pyx_self, PyObject *__pyx_v_image) { static PyObject *__pyx_pw_11fvid_cython_3cy_gbfi(PyObject *__pyx_self, PyObject *__pyx_v_image) {
PyObject *__pyx_r = 0; PyObject *__pyx_r = 0;
__Pyx_RefNannyDeclarations __Pyx_RefNannyDeclarations
__Pyx_RefNannySetupContext("cy_get_bits_from_image (wrapper)", 0); __Pyx_RefNannySetupContext("cy_gbfi (wrapper)", 0);
__pyx_r = __pyx_pf_11fvid_cython_cy_get_bits_from_image(__pyx_self, ((PyObject *)__pyx_v_image)); __pyx_r = __pyx_pf_11fvid_cython_2cy_gbfi(__pyx_self, ((PyObject *)__pyx_v_image));
/* function exit code */ /* function exit code */
__Pyx_RefNannyFinishContext(); __Pyx_RefNannyFinishContext();
return __pyx_r; return __pyx_r;
} }
static PyObject *__pyx_pf_11fvid_cython_cy_get_bits_from_image(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_image) { static PyObject *__pyx_pf_11fvid_cython_2cy_gbfi(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_image) {
PyObject *__pyx_r = NULL; PyObject *__pyx_r = NULL;
__Pyx_RefNannyDeclarations __Pyx_RefNannyDeclarations
PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_1 = NULL;
__Pyx_RefNannySetupContext("cy_get_bits_from_image", 0); __Pyx_RefNannySetupContext("cy_gbfi", 0);
__Pyx_XDECREF(__pyx_r); __Pyx_XDECREF(__pyx_r);
__pyx_t_1 = __pyx_f_11fvid_cython_cy_get_bits_from_image(__pyx_v_image, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 6, __pyx_L1_error) __pyx_t_1 = __pyx_f_11fvid_cython_cy_gbfi(__pyx_v_image, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 27, __pyx_L1_error)
__Pyx_GOTREF(__pyx_t_1); __Pyx_GOTREF(__pyx_t_1);
__pyx_r = __pyx_t_1; __pyx_r = __pyx_t_1;
__pyx_t_1 = 0; __pyx_t_1 = 0;
@ -1484,7 +1799,7 @@ static PyObject *__pyx_pf_11fvid_cython_cy_get_bits_from_image(CYTHON_UNUSED PyO
/* function exit code */ /* function exit code */
__pyx_L1_error:; __pyx_L1_error:;
__Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_1);
__Pyx_AddTraceback("fvid_cython.cy_get_bits_from_image", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_AddTraceback("fvid_cython.cy_gbfi", __pyx_clineno, __pyx_lineno, __pyx_filename);
__pyx_r = NULL; __pyx_r = NULL;
__pyx_L0:; __pyx_L0:;
__Pyx_XGIVEREF(__pyx_r); __Pyx_XGIVEREF(__pyx_r);
@ -1493,7 +1808,8 @@ static PyObject *__pyx_pf_11fvid_cython_cy_get_bits_from_image(CYTHON_UNUSED PyO
} }
static PyMethodDef __pyx_methods[] = { static PyMethodDef __pyx_methods[] = {
{"cy_get_bits_from_image", (PyCFunction)__pyx_pw_11fvid_cython_1cy_get_bits_from_image, METH_O, 0}, {"cy_gbfi_h265", (PyCFunction)__pyx_pw_11fvid_cython_1cy_gbfi_h265, METH_O, 0},
{"cy_gbfi", (PyCFunction)__pyx_pw_11fvid_cython_3cy_gbfi, METH_O, 0},
{0, 0, 0, 0} {0, 0, 0, 0}
}; };
@ -1552,7 +1868,7 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = {
{0, 0, 0, 0, 0, 0, 0} {0, 0, 0, 0, 0, 0, 0}
}; };
static CYTHON_SMALL_CODE int __Pyx_InitCachedBuiltins(void) { static CYTHON_SMALL_CODE int __Pyx_InitCachedBuiltins(void) {
__pyx_builtin_range = __Pyx_GetBuiltinName(__pyx_n_s_range); if (!__pyx_builtin_range) __PYX_ERR(0, 16, __pyx_L1_error) __pyx_builtin_range = __Pyx_GetBuiltinName(__pyx_n_s_range); if (!__pyx_builtin_range) __PYX_ERR(0, 14, __pyx_L1_error)
return 0; return 0;
__pyx_L1_error:; __pyx_L1_error:;
return -1; return -1;
@ -1834,9 +2150,9 @@ if (!__Pyx_RefNanny) {
#endif #endif
/* "fvid_cython.pyx":1 /* "fvid_cython.pyx":1
* # distutils: language=c # <<<<<<<<<<<<<< * # cython: boundscheck=False # <<<<<<<<<<<<<<
* # cython: boundscheck=False
* # cython: cdivision=True * # cython: cdivision=True
* # cython: wraparound=False
*/ */
__pyx_t_1 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1, __pyx_L1_error) __pyx_t_1 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1, __pyx_L1_error)
__Pyx_GOTREF(__pyx_t_1); __Pyx_GOTREF(__pyx_t_1);

View File

@ -1,9 +1,30 @@
# distutils: language=c
# cython: boundscheck=False # cython: boundscheck=False
# cython: cdivision=True # cython: cdivision=True
# cython: wraparound=False # cython: wraparound=False
cpdef str cy_get_bits_from_image(image): cpdef str cy_gbfi_h265(image):
cdef int width, height, x, y, pixel
cdef str pixel_bin_rep, bits
width, height = image.size
px = image.load()
bits = ""
for y in range(height):
for x in range(width):
pixel = px[x, y]
pixel_bin_rep = <str>"0"
if pixel == 255:
pixel_bin_rep = <str>"1"
bits += pixel_bin_rep
return bits
cpdef str cy_gbfi(image):
cdef int width, height, x, y cdef int width, height, x, y
cdef str pixel_bin_rep, bits cdef str pixel_bin_rep, bits
cdef (int, int, int) pixel cdef (int, int, int) pixel
@ -24,7 +45,6 @@ cpdef str cy_get_bits_from_image(image):
if abs(pixel[0] - 255) < abs(pixel[0] - 0) and abs(pixel[1] - 255) < abs(pixel[1] - 0) and abs(pixel[2] - 255) < abs(pixel[2] - 0): if abs(pixel[0] - 255) < abs(pixel[0] - 0) and abs(pixel[1] - 255) < abs(pixel[1] - 0) and abs(pixel[2] - 255) < abs(pixel[2] - 0):
pixel_bin_rep = <str>"1" pixel_bin_rep = <str>"1"
# adding bits
bits += pixel_bin_rep bits += pixel_bin_rep
return bits return bits