Commit graph

70 commits

Author SHA1 Message Date
Edward Hervey aab2f59d02 avviddec: Rename variables and fuse function
* gst_ffmpegviddec_frame() is the only caller of gst_ffmpegviddec_video_frame()
  and has the same signature. Just move the checks into a single function and
  use that.
* Make it clear which frames are the input and output ones in
  gst_ffmpegviddec_video_frame() to make issues like the one fixed in the previous
  commit more obvious.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6851>
2024-05-15 13:20:54 +00:00
Edward Hervey 64cac1ed99 avvidec: Fix dropping wrong "ghost" frames
This fixes the code regarding dropping "ghost frames", that is to say input
frames which ended up not producing any decoded frame.

The iteration itself makes sense.. but it was stopping at the "input" frame and
not the decoded frame we just got back.

When dealing with I-frame codecs, ffmpeg will decode frames in separate frames,
so there is no guarantee that they are decoding in order.

Fixes playback issues with such codecs

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6842>
2024-05-14 13:52:52 +02:00
Seungha Yang bc8a3ca526 avviddec: Fix AVPacket leak
av_packet_unref() does not release allocated memory.
av_packet_free() is the correct free function.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6544>
2024-04-04 19:39:09 +00:00
U. Artie Eoff 5fb2bbc2eb libav: guard dropped AV_OPT_TYPE_CHANNEL_LAYOUT
The FF_API_OLD_CHANNEL_LAYOUT api was dropped in upstream:

https://git.ffmpeg.org/gitweb/ffmpeg.git/commit/65ddc7498824

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6341>
2024-04-02 07:12:37 +00:00
U. Artie Eoff b699341ac9 libav: guard dropped AV_CODEC_ID_AYUV api
The FF_API_AYUV_CODECID api was dropped in upstream:

https://git.ffmpeg.org/gitweb/ffmpeg.git/commit/9ee59b63f5ea

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6341>
2024-04-02 07:12:37 +00:00
Piotr Brzeziński 55136c30c4 avaudenc: Avoid double-freeing frame's extended data
This occured when attempting to encode 16 channel audio, would crash on the first buffer.
We only need to store ext_data, old ext_data_array (frame->extended_data) is already freed by `av_frame_unref`.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6359>
2024-03-14 16:35:21 +00:00
Piotr Brzeziński a53ea3c61c avcodecmap: Increase max AAC channels to 16
This is the maximum amount supported by aacenc. 8-channel output fully works.
16-channel also encodes fine, but codec-utils isn't able to parse its channel config,
so output level will not be shown in caps. For that to work, GASpecificConfig parsing
needs to be implemented. It's not a critical issue and can be worked on at a later date.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6359>
2024-03-14 16:35:21 +00:00
Edward Hervey 086ecb008f avviddec: Fix how we get back the codec frame
With the new copy_opaque system, the corresponding frame is stored in the
picture opaque ref.

This also handles the case where the "regular" opaque might be empty in the
case of "DECODE_ONLY" frames, since it that field is set in `get_buffer2()`
which might not be called for those frames

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6301>
2024-03-11 10:17:41 +00:00
Edward Hervey eacd5c1cb1 avviddec: Improve debug statements
Add SFN to better track what is going on

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6301>
2024-03-11 10:17:41 +00:00
Seungha Yang 37578454b9 avviddec: Fix interlaced mode detection
Fixing regression introduced by the commit b46559102b

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6285>
2024-03-07 11:53:07 +00:00
Seungha Yang 781fc4a1b6 avviddec: Fix crash with FFmpeg n6.0
FFmpeg version 6.0 has an AV_CODEC_FLAG_COPY_OPAQUE related bug.

See a3bf63c26e

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6184>
2024-02-22 18:54:45 +00:00
Edward Hervey a1cbe351ec musepack: Prefer using FFmpeg musepack decoder/demuxer
* Bump the rank of the musepack v7/v8 FFmpeg demuxers to SECONDARY
* Bump the rank of the musepack v7/v8 FFmpeg audio decoders to SECONDARY
* Demote the rank of the musepackdec element to MARGINAL

This is for two reasons:
* The musepack library is no longer maintained, whereas the FFmpeg
  implementation can/will receive fixes
* The `musepackdec` implementation was a all-in-one "parsing and decoding" blob
  which doesn't play nicely with decodebin3 and others

Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/3033

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6074>
2024-02-09 12:15:14 +00:00
Edward Hervey 978b75b18a avauddec: Use proper version guard
Just like we do with avviddec

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5931>
2024-01-17 17:24:49 +01:00
L. E. Segovia b46559102b libav: Port deprecated AVFrame fields to flags
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5186>
2024-01-17 08:39:13 +00:00
L. E. Segovia 09de59477a libav: Port AVCodecContext.ticks_per_frame to AV_CODEC_PROP_FIELDS
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5186>
2024-01-17 08:39:13 +00:00
L. E. Segovia 4dc955e94a libav: Port reordered_opaque usage to ref-counted opaque_ref
Instead of passing along the system frame number, we pass along a reference to
the GstVideoCodecFrame.

In order for all internal cleanup to happen properly, this also requires
switching to the proper AVPacket creation/destruction methods (av_packet_alloc()
and av_packet_unref())

Fixes #2568

Co-authored-by: Edward Hervey <edward@centricular.com>
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5186>
2024-01-17 08:39:13 +00:00
L. E. Segovia f2c9d9baa1 libav: Port frame counting to frame_num
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5186>
2024-01-17 08:39:13 +00:00
L. E. Segovia bbf6b4e634 libav: Port channel layout and counting to AVChannelLayout
Fixes #2833

Co-authored-by: Edward Hervey <edward@centricular.com>
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5186>
2024-01-17 08:39:13 +00:00
Philippe Normand 84d9e5b6e7 avviddec: Calculate latency only for fixed framerate
The framerate was checked correctly in _negotiate, but not in _set_format.

Also fix loss of precision in _negotiate when calculating the framerate.

Fixes #3093

Co-authored-by: Sebastian Dröge <sebastian@centricular.com>
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5600>
2023-12-17 12:48:44 +00:00
Seungha Yang d2c9200828 avviddec: Unlock stream lock while waiting for decoded frame
FFmpeg might request buffer from other threads, it will result
in deadlock

Fixes: https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/2558
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5681>
2023-11-16 18:02:30 +00:00
Guillaume Desmottes 6d94b77ae8 libav: expose fake booleans properties as enums
Some ffmpeg options claims to be booleans but are actually 3-values enums
with -1 as default instead of 1 or 0. Handle those using a custom enum
so we keep the same defaults as ffmpeg and users can properly configure them
if they need to.

See https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/3035
for an actual example of this problem. The GStreamer element was
automatically enabling a non-default option, leading to strange behavior
in the AAC encoder.

Fix #3035

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5507>
2023-10-19 12:39:06 +00:00
Chris Wiggins c3b6479755 avcodecmap: Add MxPEG codec ID
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5361>
2023-09-21 15:03:01 +00:00
Carlos Rafael Giani 34238e251d libav: Integrate FFmpeg's DSD support with GstDsd caps
Code is partially based on the DSD of Robert Tiemann <rtie@gmx.de>:
https://gitlab.freedesktop.org/rtiemann/gstreamer/-/tree/dsd

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3901>
2023-06-23 01:27:04 +00:00
Edward Hervey ebf7966a26 avvidec: Fix more deprecated symbol
We only used these fields for debugging anyway

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4635>
2023-06-13 20:12:11 +00:00
Edward Hervey 447ee0b566 avvidec: Fix usage of deprecated field
Since ffmpeg 6.0 frame_num is used instead of frame_number

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4635>
2023-06-13 20:12:11 +00:00
Sebastian Dröge 186d8a99cc avviddec: Temporarily unlock stream lock while flushing buffers
This can call into the decoder again from other threads and try to take
the stream lock from there, which would cause a deadlock.

Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/2558

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4610>
2023-05-13 10:20:32 +00:00
U. Artie Eoff 649d59b88b gst-libav: add avvideocompare element
The avvideocompare element compares two incoming video buffers using
the specified comparison method (e.g. ssim or psnr).  The first
video buffer is passthrough, unchanged.

The comparison is calculated by using libav's ssim or psnr filters.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3366>
2023-05-04 19:34:06 +00:00
Stéphane Cerveau f0d61ac8b0 libav: set the frame rate values in ffmpeg stream context
To avoid a default value to be used in mux.c+304, give the
frame rate detected from the caps.

Fix IVF header.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4248>
2023-04-27 06:45:26 +00:00
Stéphane Cerveau 6f21ef9d3a libav: add av1 to gst_ffmpeg_caps_to_codecid
Restrict the stream-format to obu-stream
and the alignment to "tu" and "frame" as "obu"
is not properly supported by libav.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4248>
2023-04-27 06:45:26 +00:00
U. Artie Eoff bab573b59c gst-libav: map P010, VUYA, Y410, P012, Y212, and Y412
P010 has been around for a long time.

VUYX introduced in:

cc5a5c9860

P012, Y212, XV30 (Y410), and XV36 (Y412) introduced in:

d75c4693fe

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4454>
2023-04-19 16:47:17 -04:00
Tim-Philipp Müller a40c38eddf avmux: fix element leak
Fixes #2473

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4384>
2023-04-10 18:06:17 +01:00
Tim-Philipp Müller c723d9a1e0 avdeinterlace: fix element leak
Fixes #2473

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4384>
2023-04-10 17:59:30 +01:00
Tobias Rapp b30f982cf5 gst-libav: Update codec mapping for FFVHuff video
Replaces the ad-hoc type string 'video/x-gst-av-ffvhuff' with
'video/x-ffvhuff' for the avdec_ffvhuff and avenc_ffvhuff elements.

Related to #2389.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4250>
2023-03-23 14:30:59 +00:00
Tim-Philipp Müller 3ad4128084 gst-libav: re-indent with GNU indent 2.2.12
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4182>
2023-03-17 03:18:54 +00:00
Nicolas Dufresne 83985ae1fa avviddec: Drop decoder stream lock when calling send_packet
This is already done for every other calls to send_packet. The deadlock occures
since FFMPeg 6.0. The decoder tries to get a buffer from a thread during
the draining process, and blocks trying to get the video decoder stream lock
already heald by the drain function.

Fixes #2383

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4171>
2023-03-15 16:52:57 +00:00
Sebastian Dröge 236465e5d4 ffmpeg: avauddec/avviddec: Free packet side data after usage
As we don't use proper refcounting with AVPacket we have to manage this
ourselves.

Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/2006

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4076>
2023-02-28 12:01:57 +00:00
U. Artie Eoff 233de05a98 avviddec: change AV_CODEC_CAP_AUTO_THREADS->AV_CODEC_CAP_OTHER_THREADS
This fixes a compile error with recent upstream FFmpeg.

The AV_CODEC_CAP_AUTO_THREADS was deprecated and renamed to
AV_CODEC_CAP_OTHER_THREADS in FFmpeg upstream commit
7d09579190de (lavc 58.132.100).

The AV_CODEC_CAP_AUTO_THREADS was finally removed in FFmpeg upstream
commit 10c9a0874cb3 (lavc 59.63.100).

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3951>
2023-02-14 09:01:04 -05:00
Tim-Philipp Müller 8a047a619e gst-libav: drop use of GSlice allocator
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3784>
2023-02-03 17:48:09 +00:00
Sebastian Dröge 13fc49770e avvidenc: Don't take ffmpeg timestamps verbatim but only use them to calculate DTS
The ffmpeg timestamps are inaccurate and only in framerate granularity.
To avoid generating inaccurate output timestamps, especially with
variable framerate streams, only use the ffmpeg timestamps for
calculating the DTS.

Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/1544
again.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3780>
2023-01-24 13:50:11 +00:00
Sebastian Dröge 5372b77987 Revert "avvidenc: Set timebase in the ffmpeg context to nanoseconds and set framerate"
This reverts commit 50db59449e.

This broke the MPEG-1 video encoder as it requires the framerate to be
used for the timebase.

Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/1734

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3780>
2023-01-24 13:50:11 +00:00
Sebastian Dröge 79e8d2c03e avvidenc: Offset PTS to zero to fix bitrate control
Otherwise ffmpeg's rate control algorithm will not work correctly as
it is based on the absolute PTS values.

Fixes https://gitlab.freedesktop.org/gstreamer/gst-libav/-/issues/91

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3718>
2023-01-13 17:18:38 +00:00
Guillaume Desmottes f7e1505a5e libav: avaudec: display flow return name instead of value
More convenient to read in logs. gstavviddec already does it.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3700>
2023-01-09 13:25:05 +01:00
Sebastian Dröge 50db59449e avvidenc: Set timebase in the ffmpeg context to nanoseconds and set framerate
As we now actually use the timestamps from ffmpeg for timestamping the
output we would lose a lot of accuracy if the framerate is used.

Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/1544

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3634>
2023-01-03 16:46:14 +00:00
Sebastian Dröge 1cbb145c50 avviddec: Disable AV1 decoder
We have various elements for AV1 decoding, the ffmpeg one only works if
hardware support is available and seems to require special signalling.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3610>
2022-12-20 14:10:01 +02:00
Sebastian Dröge 925715c734 av{aud,vid}dec: Report decoding errors to the base class
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1889>
2022-12-01 13:40:53 +00:00
Philippe Normand 090cf943ed avviddec: Report flow error when decoder refused packet
In cases where an invalid input packet is submitted to the decoder we emit a
warning but reporting the flow error upstream would also be useful. This came up
with a case were the application interacts directly with the decoder, using a
mechanism similar to GstHarness.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3463>
2022-11-30 11:51:12 +00:00
Edward Hervey c39400b52c avviddec: Report a latency even without upstream framerate
There are cases where upstream will not provide a framerate, or it won't be
fixed. But if there is latency introduced by the decoder we do want to report
it.

Therefore use the framerate stored in the actual decoder, which will have a
default.

Fixes hangs when playing back such streams with decodebin3 (where the multiqueue
will not have been informed of that downstream latency and not grow accordingly)

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3391>
2022-11-16 10:42:18 +00:00
Edward Hervey 6582cd514a avvidenc: Don't leak AVPacket on EOF
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3390>
2022-11-13 06:59:11 +01:00
Edward Hervey 47833c8b36 avcfg: Don't leak the support GArray when registering flag/enums
* Only create it if we are attempting to put values in it
* If we sucessfully registered the values, only free the GArray
* IF we didn't, also free the backing memory

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3390>
2022-11-13 06:59:11 +01:00
Edward Hervey 052f23a310 avvidenc: Don't leak filename
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3390>
2022-11-12 10:33:51 +01:00