diff --git a/av/audio/codeccontext.pyi b/av/audio/codeccontext.pyi index d3f26e6a8..46e4bf853 100644 --- a/av/audio/codeccontext.pyi +++ b/av/audio/codeccontext.pyi @@ -9,22 +9,20 @@ from .format import AudioFormat from .frame import AudioFrame from .layout import AudioLayout -class _Format: - def __get__(self, i: object | None, owner: type | None = None) -> AudioFormat: ... - def __set__(self, instance: object, value: AudioFormat | str) -> None: ... - -class _Layout: - def __get__(self, i: object | None, owner: type | None = None) -> AudioLayout: ... - def __set__(self, instance: object, value: AudioLayout | str) -> None: ... - @final class AudioCodecContext(CodecContext): frame_size: int sample_rate: int rate: int type: Literal["audio"] - format: _Format - layout: _Layout + @property + def format(self) -> AudioFormat | None: ... + @format.setter + def format(self, value: AudioFormat | str) -> None: ... + @property + def layout(self) -> AudioLayout: ... + @layout.setter + def layout(self, value: AudioLayout | str) -> None: ... @property def channels(self) -> int: ... @property diff --git a/av/audio/frame.pyi b/av/audio/frame.pyi index 6e49d5641..e7b95c602 100644 --- a/av/audio/frame.pyi +++ b/av/audio/frame.pyi @@ -17,23 +17,16 @@ _SupportedNDarray = ( | np.ndarray[Any, np.dtype[np.uint8]] # u1 ) -class _Format: - def __get__(self, i: object | None, owner: type | None = None) -> AudioFormat: ... - def __set__(self, instance: object, value: AudioFormat | str) -> None: ... - -class _Layout: - def __get__(self, i: object | None, owner: type | None = None) -> AudioLayout: ... - def __set__(self, instance: object, value: AudioLayout | str) -> None: ... - @final class AudioFrame(Frame): planes: tuple[AudioPlane, ...] samples: int sample_rate: int rate: int - format: _Format - layout: _Layout - + @property + def format(self) -> AudioFormat: ... + @property + def layout(self) -> AudioLayout: ... def __init__( self, format: AudioFormat | str = "s16", diff --git a/av/audio/resampler.pyi b/av/audio/resampler.pyi index 357899762..e73e158fe 100644 --- a/av/audio/resampler.pyi +++ b/av/audio/resampler.pyi @@ -1,7 +1,5 @@ from typing import final -from av.filter.graph import Graph - from .format import AudioFormat from .frame import AudioFrame from .layout import AudioLayout @@ -14,7 +12,6 @@ class AudioResampler: format: AudioFormat layout: AudioLayout options: dict[str, str] - graph: Graph | None is_passthrough: bool def __init__( diff --git a/av/audio/stream.pyi b/av/audio/stream.pyi index c6749d333..346c8a84a 100644 --- a/av/audio/stream.pyi +++ b/av/audio/stream.pyi @@ -10,14 +10,6 @@ from .format import AudioFormat from .frame import AudioFrame from .layout import AudioLayout -class _Format: - def __get__(self, i: object | None, owner: type | None = None) -> AudioFormat: ... - def __set__(self, instance: object, value: AudioFormat | str) -> None: ... - -class _Layout: - def __get__(self, i: object | None, owner: type | None = None) -> AudioLayout: ... - def __set__(self, instance: object, value: AudioLayout | str) -> None: ... - @final class AudioStream(Stream): codec_context: AudioCodecContext @@ -39,5 +31,11 @@ class AudioStream(Stream): rate: int channels: int type: Literal["audio"] - format: _Format - layout: _Layout + @property + def format(self) -> AudioFormat | None: ... + @format.setter + def format(self, value: AudioFormat | str) -> None: ... + @property + def layout(self) -> AudioLayout: ... + @layout.setter + def layout(self, value: AudioLayout | str) -> None: ... diff --git a/av/filter/link.pyi b/av/filter/link.pyi index f7e88721d..86eb1860c 100644 --- a/av/filter/link.pyi +++ b/av/filter/link.pyi @@ -1,9 +1,12 @@ from typing import final +from typing_extensions import disjoint_base + from av.filter.context import FilterContext from av.filter.filter import Filter from av.filter.graph import Graph +@disjoint_base class FilterPad: filter: Filter context: FilterContext | None diff --git a/av/frame.pyi b/av/frame.pyi index ef0729e37..0d23a0fd8 100644 --- a/av/frame.pyi +++ b/av/frame.pyi @@ -1,8 +1,11 @@ from fractions import Fraction +from typing_extensions import disjoint_base + from av.rational import AVRational from av.sidedata.sidedata import SideDataContainer +@disjoint_base class Frame: dts: int | None pts: int | None diff --git a/av/logging.pyi b/av/logging.pyi index 96d6778f3..e489700f1 100644 --- a/av/logging.pyi +++ b/av/logging.pyi @@ -1,5 +1,5 @@ -from collections.abc import Callable -from typing import Any, final +from types import TracebackType +from typing import final PANIC: int FATAL: int @@ -29,7 +29,7 @@ class Capture: def __enter__(self) -> list[tuple[int, str, str]]: ... def __exit__( self, - type_: type | None, - value: Exception | None, - traceback: Callable[..., Any] | None, + type_: type[BaseException] | None, + value: BaseException | None, + traceback: TracebackType | None, ) -> None: ... diff --git a/av/plane.pyi b/av/plane.pyi index b32fcdb11..ac20a840f 100644 --- a/av/plane.pyi +++ b/av/plane.pyi @@ -1,5 +1,8 @@ +from typing_extensions import disjoint_base + from .buffer import Buffer from .frame import Frame +@disjoint_base class Plane(Buffer): def __init__(self, frame: Frame, index: int) -> None: ... diff --git a/av/stream.pyi b/av/stream.pyi index f1da81ae3..91f44628a 100644 --- a/av/stream.pyi +++ b/av/stream.pyi @@ -2,6 +2,8 @@ from enum import IntEnum, IntFlag from fractions import Fraction from typing import Literal, final +from typing_extensions import disjoint_base + from av.rational import AVRational from .codec import CodecContext @@ -38,6 +40,7 @@ class Discard(IntEnum): nonkey = ... all = ... +@disjoint_base class Stream: name: str | None container: Container diff --git a/tests/test_encode.py b/tests/test_encode.py index 8bcca66c1..524bc1626 100644 --- a/tests/test_encode.py +++ b/tests/test_encode.py @@ -202,6 +202,7 @@ def test_default_options(self) -> None: assert not stream.time_base # codec context properties + assert stream.format is not None assert stream.format.name == "s16" assert stream.sample_rate == 48000 @@ -243,6 +244,7 @@ def test_transcode(self) -> None: stream = container.streams[0] # codec context properties + assert stream.format is not None assert stream.format.name == "s16p" assert stream.sample_rate == sample_rate diff --git a/tests/test_file_probing.py b/tests/test_file_probing.py index 5469bc581..b4a157642 100644 --- a/tests/test_file_probing.py +++ b/tests/test_file_probing.py @@ -47,6 +47,7 @@ def test_stream_probing(self) -> None: assert stream.channels == 2 assert stream.codec.name == "aac_latm" assert stream.codec.long_name == "AAC LATM (Advanced Audio Coding LATM syntax)" + assert stream.format is not None assert stream.format.bits == 32 assert stream.format.name == "fltp" assert stream.layout.name == "stereo" diff --git a/tests/test_streams.py b/tests/test_streams.py index 5464820e4..85aba3e45 100644 --- a/tests/test_streams.py +++ b/tests/test_streams.py @@ -7,6 +7,7 @@ import av import av.datasets +import av.filter.loudnorm from .common import fate_suite diff --git a/tests/test_videoframe.py b/tests/test_videoframe.py index fb23a1ea4..cff564deb 100644 --- a/tests/test_videoframe.py +++ b/tests/test_videoframe.py @@ -7,6 +7,7 @@ import pytest import av +import av.filter from av import VideoFrame from av.video.frame import supported_np_pix_fmts from av.video.reformatter import Colorspace, Interpolation