This commit is contained in:
2025-10-03 13:25:14 +02:00
parent 3b0774686d
commit 3c56a880da
9 changed files with 277 additions and 1 deletions

54
mp4/context.py Normal file
View File

@ -0,0 +1,54 @@
# RozK
from . import libav
from .codec import Codec
from .stream import NullStream, Stream
from .packet import Packet
class Context:
__slots__ = '_ref'
def __init__(self):
self._ref = libav.alloc_context()
if not self._ref:
raise MemoryError
def __del__(self):
if self._ref:
libav.free_context(self._ref)
@property
def _as_parameter_(self):
return self._ref
def open_input(self, url):
if not self._ref:
return
errcode = libav.open_input(self._ref, url)
if errcode < 0:
raise Exception(f"Failed to open: {url}")
errcode = libav.find_stream_info(self._ref)
if errcode < 0:
libav.close_input(self._ref)
raise Exception("Failed to find stream info")
def close_input(self):
if self._ref:
libav.close_input(self._ref)
def find_stream(self, type):
if not self._ref:
return NullStream()
index, codec_ref = libav.find_best_stream(self._ref, type)
if index < 0 or not codec_ref:
return NullStream()
return Stream(index, Codec(codec_ref))
def read_packet(self):
if not self._ref:
return None
packet = Packet()
errcode = libav.read_frame(self._ref, packet)
if errcode < 0:
return None
return packet