diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 7baadb4a8..2f0bd681c 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -23,6 +23,7 @@ v14.1.0 (Unreleased) Features - Add hardware decoding by :gh-user:`matthewlai` and :gh-user:`WyattBlue` in (:pr:`1685`). +- Add ``Stream.disposition`` and ``Disposition`` enum by :gh-user:`WyattBlue` in (:pr:`1720`). - Add ``VideoFrame.rotation`` by :gh-user:`lgeiger` in (:pr:`1675`). - Support grayf32le and gbrapf32le in numpy convertion by :gh-user:`robinechuca` in (:pr:`1712`). diff --git a/av/stream.pyi b/av/stream.pyi index 82bb672b2..a2a2e439c 100644 --- a/av/stream.pyi +++ b/av/stream.pyi @@ -1,9 +1,31 @@ +from enum import Flag from fractions import Fraction from typing import Literal from .codec import Codec, CodecContext from .container import Container +class Disposition(Flag): + default: int + dub: int + original: int + comment: int + lyrics: int + karaoke: int + forced: int + hearing_impaired: int + visual_impaired: int + clean_effects: int + attached_pic: int + timed_thumbnails: int + non_diegetic: int + captions: int + descriptions: int + metadata: int + dependent: int + still_image: int + multilayer: int + class Stream: name: str | None container: Container @@ -20,6 +42,7 @@ class Stream: guessed_rate: Fraction | None start_time: int | None duration: int | None + disposition: Disposition frames: int language: str | None type: Literal["video", "audio", "data", "subtitle", "attachment"] diff --git a/av/stream.pyx b/av/stream.pyx index 35b85acdf..d0ecf37ad 100644 --- a/av/stream.pyx +++ b/av/stream.pyx @@ -1,6 +1,6 @@ cimport libav as lib -from enum import Enum +from enum import Flag from av.error cimport err_check from av.packet cimport Packet @@ -12,6 +12,28 @@ from av.utils cimport ( ) +class Disposition(Flag): + default = 1 << 0 + dub = 1 << 1 + original = 1 << 2 + comment = 1 << 3 + lyrics = 1 << 4 + karaoke = 1 << 5 + forced = 1 << 6 + hearing_impaired = 1 << 7 + visual_impaired = 1 << 8 + clean_effects = 1 << 9 + attached_pic = 1 << 10 + timed_thumbnails = 1 << 11 + non_diegetic = 1 << 12 + captions = 1 << 16 + descriptions = 1 << 17 + metadata = 1 << 18 + dependent = 1 << 19 + still_image = 1 << 20 + multilayer = 1 << 21 + + cdef object _cinit_bypass_sentinel = object() cdef Stream wrap_stream(Container container, lib.AVStream *c_stream, CodecContext codec_context): @@ -96,6 +118,9 @@ cdef class Stream: if name == "id": self._set_id(value) return + if name == "disposition": + self.ptr.disposition = value + return # Convenience setter for codec context properties. if self.codec_context is not None: @@ -230,6 +255,10 @@ cdef class Stream: """ return self.metadata.get("language") + @property + def disposition(self): + return Disposition(self.ptr.disposition) + @property def type(self): """ diff --git a/include/libav.pxd b/include/libav.pxd index e2fe323a4..568913208 100644 --- a/include/libav.pxd +++ b/include/libav.pxd @@ -24,6 +24,5 @@ include "libavfilter/buffersrc.pxd" cdef extern from "stdio.h" nogil: - cdef int snprintf(char *output, int n, const char *format, ...) cdef int vsnprintf(char *output, int n, const char *format, va_list args) diff --git a/include/libavcodec/avcodec.pxd b/include/libavcodec/avcodec.pxd index bcb342373..ee832dd04 100644 --- a/include/libavcodec/avcodec.pxd +++ b/include/libavcodec/avcodec.pxd @@ -8,6 +8,16 @@ cdef extern from "libavcodec/codec_id.h": AVCodecID av_codec_get_id(const AVCodecTag *const *tags, uint32_t tag) +cdef extern from "libavcodec/packet.h" nogil: + AVPacketSideData* av_packet_side_data_new( + AVPacketSideData **sides, + int *nb_sides, + AVPacketSideDataType type, + size_t size, + int free_opaque + ) + + cdef extern from "libavutil/channel_layout.h": ctypedef enum AVChannelOrder: AV_CHANNEL_ORDER_UNSPEC @@ -542,6 +552,10 @@ cdef extern from "libavcodec/avcodec.h" nogil: cdef struct AVCodecParameters: AVMediaType codec_type AVCodecID codec_id + AVPacketSideData *coded_side_data + int nb_coded_side_data + uint8_t *extradata + int extradata_size cdef int avcodec_parameters_copy( AVCodecParameters *dst, diff --git a/include/libavformat/avformat.pxd b/include/libavformat/avformat.pxd index 5fa25043a..cec89bd38 100644 --- a/include/libavformat/avformat.pxd +++ b/include/libavformat/avformat.pxd @@ -30,18 +30,16 @@ cdef extern from "libavformat/avformat.h" nogil: cdef struct AVStream: int index int id + int disposition AVCodecParameters *codecpar - AVRational time_base int64_t start_time int64_t duration int64_t nb_frames int64_t cur_dts - AVDictionary *metadata - AVRational avg_frame_rate AVRational r_frame_rate AVRational sample_aspect_ratio diff --git a/include/libavutil/avutil.pxd b/include/libavutil/avutil.pxd index 58dd43922..49be65f69 100644 --- a/include/libavutil/avutil.pxd +++ b/include/libavutil/avutil.pxd @@ -30,6 +30,7 @@ cdef extern from "libavutil/avutil.h" nogil: cdef enum AVPixelFormat: AV_PIX_FMT_NONE AV_PIX_FMT_YUV420P + AV_PIX_FMT_RGBA AV_PIX_FMT_RGB24 PIX_FMT_RGB24 PIX_FMT_RGBA diff --git a/tests/test_colorspace.py b/tests/test_colorspace.py index 7574c147d..c76416c80 100644 --- a/tests/test_colorspace.py +++ b/tests/test_colorspace.py @@ -31,6 +31,8 @@ def test_sky_timelapse() -> None: ) stream = container.streams.video[0] + assert stream.disposition == av.stream.Disposition.default + assert stream.codec_context.color_range == 1 assert stream.codec_context.color_range == ColorRange.MPEG assert stream.codec_context.color_primaries == 1