Skip to content

Commit

Permalink
expose discard, trusted and disposable packet flags
Browse files Browse the repository at this point in the history
---------

Co-authored-by: Scott Kirklin <[email protected]>
Co-authored-by: WyattBlue <[email protected]>
Co-authored-by: JoeUgly <[email protected]>
  • Loading branch information
4 people committed Mar 8, 2024
1 parent ac0353d commit 9ad1d91
Show file tree
Hide file tree
Showing 4 changed files with 62 additions and 1 deletion.
3 changes: 3 additions & 0 deletions av/packet.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@ class Packet:
duration: int | None
is_keyframe: bool
is_corrupt: bool
is_discard: bool
is_trusted: bool
is_disposable: bool

def __init__(self, input: int | None = None) -> None: ...
def decode(self) -> Iterator[SubtitleSet]: ...
16 changes: 15 additions & 1 deletion av/packet.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -189,11 +189,25 @@ cdef class Packet(Buffer):
self.ptr.flags &= ~(lib.AV_PKT_FLAG_KEY)

@property
def is_corrupt(self): return bool(self.ptr.flags & lib.AV_PKT_FLAG_CORRUPT)
def is_corrupt(self):
return bool(self.ptr.flags & lib.AV_PKT_FLAG_CORRUPT)

@is_corrupt.setter
def is_corrupt(self, v):
if v:
self.ptr.flags |= lib.AV_PKT_FLAG_CORRUPT
else:
self.ptr.flags &= ~(lib.AV_PKT_FLAG_CORRUPT)

@property
def is_discard(self):
return bool(self.ptr.flags & lib.AV_PKT_FLAG_DISCARD)

@property
def is_trusted(self):
return bool(self.ptr.flags & lib.AV_PKT_FLAG_TRUSTED)

@property
def is_disposable(self):
return bool(self.ptr.flags & lib.AV_PKT_FLAG_DISPOSABLE)

3 changes: 3 additions & 0 deletions include/libavcodec/avcodec.pxd
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,9 @@ cdef extern from "libavcodec/avcodec.h" nogil:
cdef enum:
AV_PKT_FLAG_KEY
AV_PKT_FLAG_CORRUPT
AV_PKT_FLAG_DISCARD
AV_PKT_FLAG_TRUSTED
AV_PKT_FLAG_DISPOSABLE

cdef enum:
AV_FRAME_FLAG_CORRUPT
Expand Down
41 changes: 41 additions & 0 deletions tests/test_packet.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import av

from .common import TestCase, fate_suite


class TestProperties(TestCase):
def test_is_keyframe(self):
with av.open(fate_suite("h264/interlaced_crop.mp4")) as container:
stream = container.streams.video[0]
for i, packet in enumerate(container.demux(stream)):
if i in (0, 21, 45, 69, 93, 117):
self.assertTrue(packet.is_keyframe)
else:
self.assertFalse(packet.is_keyframe)

def test_is_corrupt(self):
with av.open(fate_suite("mov/white_zombie_scrunch-part.mov")) as container:
stream = container.streams.video[0]
for i, packet in enumerate(container.demux(stream)):
if i == 65:
self.assertTrue(packet.is_corrupt)
else:
self.assertFalse(packet.is_corrupt)

def test_is_discard(self):
with av.open(fate_suite("mov/mov-1elist-ends-last-bframe.mov")) as container:
stream = container.streams.video[0]
for i, packet in enumerate(container.demux(stream)):
if i == 46:
self.assertTrue(packet.is_discard)
else:
self.assertFalse(packet.is_discard)

def test_is_disposable(self):
with av.open(fate_suite("hap/HAPQA_NoSnappy_127x1.mov")) as container:
stream = container.streams.video[0]
for i, packet in enumerate(container.demux(stream)):
if i == 0:
self.assertTrue(packet.is_disposable)
else:
self.assertFalse(packet.is_disposable)

0 comments on commit 9ad1d91

Please sign in to comment.