56 lines
1.4 KiB
Python
56 lines
1.4 KiB
Python
import cython
|
|
from cython.cimports import libav as lib
|
|
from cython.cimports.av.error import err_check
|
|
from cython.cimports.av.packet import Packet
|
|
from cython.cimports.av.subtitles.subtitle import SubtitleProxy, SubtitleSet
|
|
|
|
|
|
@cython.cclass
|
|
class SubtitleCodecContext(CodecContext):
|
|
@cython.cfunc
|
|
def _send_packet_and_recv(self, packet: Packet | None):
|
|
if packet is None:
|
|
raise RuntimeError("packet cannot be None")
|
|
|
|
proxy: SubtitleProxy = SubtitleProxy()
|
|
got_frame: cython.int = 0
|
|
|
|
err_check(
|
|
lib.avcodec_decode_subtitle2(
|
|
self.ptr,
|
|
cython.address(proxy.struct),
|
|
cython.address(got_frame),
|
|
packet.ptr,
|
|
)
|
|
)
|
|
|
|
if got_frame:
|
|
return SubtitleSet(proxy)
|
|
return []
|
|
|
|
@cython.ccall
|
|
def decode2(self, packet: Packet):
|
|
"""
|
|
Returns SubtitleSet if you really need it.
|
|
"""
|
|
if not self.codec.ptr:
|
|
raise ValueError("cannot decode unknown codec")
|
|
|
|
self.open(strict=False)
|
|
|
|
proxy: SubtitleProxy = SubtitleProxy()
|
|
got_frame: cython.int = 0
|
|
|
|
err_check(
|
|
lib.avcodec_decode_subtitle2(
|
|
self.ptr,
|
|
cython.address(proxy.struct),
|
|
cython.address(got_frame),
|
|
packet.ptr,
|
|
)
|
|
)
|
|
|
|
if got_frame:
|
|
return SubtitleSet(proxy)
|
|
return None
|