38 lines
1.3 KiB
Cython
38 lines
1.3 KiB
Cython
from av.video.frame cimport VideoFrame
|
|
|
|
|
|
cdef class VideoPlane(Plane):
|
|
def __cinit__(self, VideoFrame frame, int index):
|
|
# The palette plane has no associated component or linesize; set fields manually
|
|
if frame.format.name == "pal8" and index == 1:
|
|
self.width = 256
|
|
self.height = 1
|
|
self.buffer_size = 256 * 4
|
|
return
|
|
|
|
for i in range(frame.format.ptr.nb_components):
|
|
if frame.format.ptr.comp[i].plane == index:
|
|
component = frame.format.components[i]
|
|
self.width = component.width
|
|
self.height = component.height
|
|
break
|
|
else:
|
|
raise RuntimeError(f"could not find plane {index} of {frame.format!r}")
|
|
|
|
# Sometimes, linesize is negative (and that is meaningful). We are only
|
|
# insisting that the buffer size be based on the extent of linesize, and
|
|
# ignore it's direction.
|
|
self.buffer_size = abs(self.frame.ptr.linesize[self.index]) * self.height
|
|
|
|
cdef size_t _buffer_size(self):
|
|
return self.buffer_size
|
|
|
|
@property
|
|
def line_size(self):
|
|
"""
|
|
Bytes per horizontal line in this plane.
|
|
|
|
:type: int
|
|
"""
|
|
return self.frame.ptr.linesize[self.index]
|