Commit Graph

128 Commits

Author SHA1 Message Date
Martin Pulec
c14ad5f95e pixfmt_conv.h: small doxy update
\+ added some direct pixfmt_conv.h includes (in attempt to remove its
inclusion from video_codec.h, which finally didn't take place but still
it is better to include this directly)
2023-11-13 10:27:09 +01:00
Martin Pulec
9f5530df1b build: hedge lavc depends
Allow linking libavcodec conversions outside UG with reasonably small
amount of dependencies.
2023-11-10 15:49:53 +01:00
Martin Piatka
01023463a6 lavc_common: get_avpixfmts_names: Clear buf first
Since the buffer is static, it contains stuff from previous run of the
function. We need to clear it before appending new pixfmts in the loop.
2023-11-07 15:44:53 +01:00
Martin Pulec
9938f6b082 av_log_ug_callback: handle overflow
If the buffer is full, flush the output even if there is no NL at the
end and issue a warning (should be handled - either some error or some
module produces unexpectedly long output).
2023-11-01 17:01:32 +01:00
Martin Pulec
fea0d10f67 improved UG FFmpeg logger
do not prefix messages not starting on new line by timestamps, eg.:

    $ uv -s embedded -t testcard -d file:n=/dev/null -V
    [1698853041.393] [lavc]   Stream #0:0[1698853041.393] : Video: rawvideo, 1 reference frame (UYVY / 0x59565955), uyvy422, 1920x1080 (0x0), q=2-31, 829440 kb/s[1698853041.393] , [1698853041.393] 25 tbn[1698853041.393]

Flush the output only on NL and before it store it in internal
thread-local buffer.

Locking was removed as static data are now thread-local.

this improves 808b3de3
2023-11-01 17:01:31 +01:00
Martin Pulec
5d3c31c115 to_lavc_vid_conv: cp metadata out to tmp (refactor)
Set metadata to out_frame only and copy it to tmp_frame (not to repeat
every assignment and potentially forgotting something).

\+ check tmp_frame afor allocation failure
2023-10-31 11:03:36 +01:00
Martin Pulec
37ae3935e9 to_lavc_vid_conv: set AVFrame CS and range
Some encoders use `colorspace` and `color_range` from AVFrame,
eg. _hevc_videotoolbox_:

   uv -t testcard -c libavcodec:encoder=hevc_videotoolbox

(defaults to bgra, because other foramts don't keep 4:2:2 subsampling,
supported at the time: videotoolbox_vld nv12 yuv420p bgra p010le).

Fixed error was producing this message:
````
[lavc hevc_videotoolbox @ 0x12fc04190] Could not get pixel format for color format 'bgra' range 'unknown'.
[lavc hevc_videotoolbox @ 0x12fc04190] Error: Cannot convert format 28 color_range 0: -22
```
2023-10-31 10:57:07 +01:00
Martin Pulec
c3e4e2cc5d to_lavc_vid_conv: added rgb_to_yuv444p
For following command, deduced conversion is to 10-bit YUV:

    $ uv -t testcard:c=RGB -c libavcodec:enc=libx264 -d gl
    [to_lavc_vid_conv] converting RGB to yuv444p10le over R12L

(and over R10k for RGBA) which is correct, because we don't have any
8-bit YUV pixfmt keeping 4:4:4 subsampling.

But this is quite ineffective because the conversions are more expensive
and we are needlessly compressing 10-bit YUV instead of 8-bit.

Thus (as we don't have any UG 8-bit YUV444 pixfmt) the rgb_to_yuv444p
conversion was added.
2023-10-12 10:21:08 +02:00
Martin Pulec
2a73855c05 fixed new Coverity issues
fixes CID 41741{7,8}
2023-10-10 08:16:09 +02:00
Martin Pulec
778fd40fb1 lavd video: use get_avpixfmts_names
Simplifies the code + removed in that function leading space (used in
original code but the function shouldn't produce leading space).
2023-10-06 16:44:15 +02:00
Martin Pulec
15fe21df4f lavd video: check vid subs from sw_pix_fmt
Check if video subsampling is 4:2:0 from sw_pix_fmt than iterating over
received pix_fmts. This is simplier and more effective since the SW
format is set the get_format() callback to the nominal SW format (if any).
2023-10-06 11:19:11 +02:00
Martin Pulec
ac110f1b49 vaapi dec.: deduce SW format to reported valid
Set AVHWFramesContext::sw_format to first of av_hwframe_transfer_get_formats().

This is consistent how MPV does that. Fixes NV12 being transmitted
despite AVHWFramesContext::sw_format was set to yuv420p causing chroma
channels corruption (because the nv12 data was misinterpreted as the
latter one) occuring on AMD cards, steps to reproduce:
```
uv -t testcard -c lavc:enc=libx264:safe -d gl --param use-hw-accel=vaapi
```

See also:
<66e30e7f2f>
2023-10-06 11:19:11 +02:00
Martin Pulec
11bf11c784 removed DPX10 pixfmt
Not used anymore by any module. Actually the Bluefish444 that seem to
have handled that doesn't advertise other codec than UYVY by get_property.
2023-10-06 11:19:06 +02:00
Martin Pulec
b62566ca72 lavd: advertise accelerated codesc if probed
Advertise conversion to HW-accelerated codecs (eg. HW_VDPAU, RPI4_8)
only if probe (which now works in the same way as regular init since
HEAD^) would initialize to an accelerated codec.

This would prevent situations, when eg. `--param use-hw-accel=vaapi -d
gl` is used, in which case HW_VDPAU was selected as a display codec,
although not intended.
2023-10-06 08:07:19 +02:00
Martin Pulec
d72d1cf3c4 document pixfmt conversion files 2023-09-21 09:07:22 +02:00
Martin Pulec
c44d4bd78d file: old channel_layout API format
added compatibility with older FFmpeg libraries

see also
<7544fcb525 (r126660408)>
2023-09-11 10:54:45 +02:00
Martin Pulec
fa60441fde display file: make other audio compress working
Make working compressions other than Opus, taking sample format other
than S16 (interleaved).

Accept also S16P and FLTP (needed for AAC, MP3, Vorbis).

\+ also process stereo input (as currently only mono are accepted)
2023-09-07 16:07:44 +02:00
Martin Pulec
435c712acf display file: don't write uncompressed by default
Write uncompressed output only if user explicitly specifies NUT container
to avoid unexpected results when `-d file` is writing overwhelming amount
of data.
2023-09-06 14:39:40 +02:00
Martin Pulec
7544fcb525 file display: added audio output 2023-09-06 12:43:47 +02:00
Martin Pulec
fc742b69de lavc_common.h: do not define R,G,B globally
When included prior to (Mingw-W64) windows.h, it causes compilation
fail, because "R" is used as a param name in transitively included
avx512fp16intrin.h.
2023-09-05 09:37:07 +02:00
Martin Pulec
4fbe76085e lavd_flush: print error msgs, not only numbers 2023-08-15 16:26:59 +02:00
Martin Pulec
0017e57134 compat/qsort_s.h: do not require include 1st
Do not enforce the file to be either included before stdlib.h or stdlib.h
to be using __STDC_WANT_LIB_EXT1__ = 1. The bound checking API is
currently nowhere implemented, anyways, and we may use system native secure
qsort implementation (qsort_r in *NIX, MS variant of qsort_s).
2023-08-14 16:06:15 +02:00
Martin Pulec
ef751e16ff print_decoder_error: no extra space after mod_name
mod_name usually already contains trailing space (eg. "[lavd] ") so do
not produce an extra one.

+ reindent
2023-06-15 11:29:58 +02:00
Martin Pulec
2961fe2f44 lavc video: print used thread count and mode 2023-05-17 11:48:08 +02:00
Martin Pulec
59a1cb1b24 lavc_common.h: removed further compat
AV_ prefix was added already in 2015 (FF commit def97856)
2023-05-05 11:34:13 +02:00
Martin Pulec
f7e29f1d81 remove more FFmpeg compat
according to FFmpeg commit 80154b1b, the current cut-off in UG was lavc
version 57.107.100 (incl), which corresponds to lavu 55.78.100 (incl).
2023-05-05 10:25:46 +02:00
Martin Pulec
3a8440a650 fixed build of blank without libavcodec 2023-05-05 08:50:09 +02:00
Martin Pulec
21ce56d42f lavc common: removed compat + moved func to .c
Removed some old FFmpeg compat functions that cannot be used, since UG
won't compile with that version anyways (even newer compat was already
removed).

+ moved some function definitions from header to implementation file
  (perhaps needlessly in header and it worsens readibility)
2023-05-02 15:22:57 +02:00
Martin Pulec
04a0bf581b removed ATTRIBUTE macros
This was unnecessary compat macro, since we always build with a compiler
that understands __attribute__ except of the AJA module in MSW, which
uses MSVC compiler
2023-05-02 15:22:55 +02:00
Martin Pulec
3ec7d9fd88 comparators: fix descending last-resort sorting
As a last resort sort tie-break, codec_t value was used but the sorting
was actually descending. It is perhaps more natural to have it ascending
(although not so important).
2023-03-07 08:28:24 +01:00
Martin Pulec
602d75e9cd from_lavc_vid_conv: fixed inverted operator 2023-03-02 11:13:59 +01:00
Martin Pulec
78000712b0 libavcodec: lavc_compare_convs - fixed ordering
Fixed wrong ordering in rare cases, eg.:

1. R10k->UYVY->yuv444p
2. R10k->UYVY->yuv422p

For both conversion chain, the same property 10b 4:2:2 is selected. But
as a tie-break, R10k is compared with resulting AVPixelFormat's
properties, winning #1 because seemingly keeping 4:4:4 subsampling, not
reflecting the degradation in chain.

To fix it up, use for the second comparison the minimum of src pixfmt
desc and the conversions' chain (for both are the same as mentioned in
previous paragraph).

+ improved debugging (in debug2, print comparison results & print
  property of the uv->uv-only conversions)
2023-02-23 09:06:48 +01:00
Martin Pulec
90aa548c02 lavc: allow also depth and rgb/yuv specification
This will allow user more control over compression if requiring a
different properties than would default sorting select.

This is mostly to avoid user specifying '--param lavc-use-codec', which
is not supported, anyways.
2023-02-22 10:57:39 +01:00
Martin Pulec
9c14552afd to_lavc_vid_conv: use struct for enforced params 2023-02-22 09:42:05 +01:00
Martin Pulec
717b575d87 qsort_s comparator compat macro
comparators can be defined utilizing the macro to avoid fiddling with
ifdefs

+ use it in lavc conversions
2023-02-21 10:46:47 +01:00
Martin Pulec
1f34ebc571 lavd: split convert (+sws) reconf and conv
configure av_to_uv_conversion and swscale only once if needed

This has on one hand performance advantages. More importantely,
from_lavc_vid_conv now generates a warning on depth/subsampling
degradation. If it is the case, without this change, output would be
spammed by that warning for every decoded frame.

Steps to reproduce the fixed behavior:

    uv -t testcard:codec=R10k -d dummy:codec=v210 -c libavcodec
2023-02-21 10:28:05 +01:00
Martin Pulec
11fe526619 from_lavc_vid_conv.c: memcpy_data can be unused 2023-02-21 10:28:04 +01:00
Martin Pulec
f943807b66 lavd: also check if we are not degrading
Similarly to lavc, print warning if we are degrading format somewhere in
chain.
2023-02-21 10:28:04 +01:00
Martin Pulec
e720acba5e lavc: print a warning if there is quality degradation 2023-02-21 10:28:04 +01:00
Martin Pulec
e9d91e778f to_lavc_vid_comp: improved av pixfmt comparison
Improved/fixed AV pixfmt comparison algorighm (get_available_pix_fmts).

If UV->UV->AV is involved, the lower bound of properties (bitrate,
subsampling) is used for the comparison. This would prevent eg.
conversion chain v210->UYVY->10b to be incorrectly treated as 10 bit
(because there is 8 bit format in the chain).
2023-02-21 10:28:04 +01:00
Martin Pulec
014279af62 pixfmt_desc + compare_pixdesc: removed identity
removed .id member from struct pixfmt_desc and the comparator

compare_pixfmt is not usually used directly as a comparator itself but
called from within another comparator. If 2 pixels format have the same
properties, the caller should rather decide by itself if there is some
other metrics to conside or just compare according to identity in the
end.
2023-02-21 10:28:04 +01:00
Martin Pulec
f7a070f899 to_lavc_vid_conv: small improvements
- renamed in_frame - now it is actually out_frame from our perspective
- same_linesizes - exit early + doxy documentation
- other docuementation improvements
2023-02-21 10:28:04 +01:00
Martin Pulec
c4c3ffd5dc lavc: fixed test
changed prototype of some functions:

- to_lavc_vid_conv - accept (char *) instead of (struct video_frame)
- get_av_pixfmt_details - (enum AVPixelFormat) instead of int

+ make to_lavc_vid_conv.c partially C++ compatible (I attempted first to
  include it as was it libavcodec.cpp), so leave it (just in case)
2023-02-21 10:28:04 +01:00
Martin Pulec
bd994f4bfd lavc: encapsulate input conversion
Handle conversion to codec supported input pixel format entirely in
to_lavc_vid_conv.

+ removed AVPixelFormats (both codec input and sws input) from struct
  (no longer needed)
+ cleanup - set sws pointer to NULL (prevent potential double free)
2023-02-21 10:28:04 +01:00
Martin Pulec
67e6326434 simplify get_av_pixfmt_details
YUV is always limited rante BT.709, RGB full range. Thus it doesn't need
to be in the conversion table for every one pixfmt. Also UG pixfmt was
actually useless in the prototype.
2023-02-21 10:28:03 +01:00
Martin Pulec
710c667f88 to_lavc_vid_conv.c: removed no longer used func 2023-02-21 10:27:47 +01:00
Martin Pulec
1b0a28cd09 lavc: refactor
- moved conversion related functions to to_lavd_vid_conv.c
- removed struct uv_to_av_conversion from to_lavd_vid_conv API
2023-02-21 10:07:04 +01:00
Martin Pulec
240f512b7e from_lavc_vid_conv: removed unneeded memsets
The relevant members are already empty-initialized by the caller.

For some reason, this fixes the test crash:

     https://github.com/CESNET/UltraGrid/actions/runs/4220022764/jobs/7325933580
2023-02-20 14:34:23 +01:00
Martin Pulec
467056530c lavd vid conv: added some mappings
FFmpeg's Y210 and Y212 can be directly mapped to UG Y216 (have
just lower bits unused). This shouldn't, however, be given directly to
uv_to_av_pixfmts, because the mapping isn't 1:1. If it would, for
encoder, eg. the conversion Y216->Y210 will be considered as lossless
but it is reducing depth 16->10 b. So added just dummy conversions for
them.

Also removed RG48 and RGB dummy conversions to corresponding AV pixel
formats. This is the opposite case as mentioned in previous paragraph,
the correspondence is 1:1. Also the conversion/memcpy is dispatched
directly in av_to_uv_convert().
2023-02-10 10:02:34 +01:00
Martin Pulec
b7af377936 lavd: accept EAGAIN as success when flushing
this is consistent with FFmpeg examples

+ move common audio and video code to lavc_common.c
2023-02-09 11:50:31 +01:00