Commit Graph

65 Commits

Author SHA1 Message Date
Hironori Bono 4892060f50 lavc/videotoolboxenc: Add support for HEVC with Alpha.
This change supports the "HEVC Video with Alpha" profile introduced in WWDC 2019
<https://developer.apple.com/videos/play/wwdc2019/506/>. (This change is a
partial fix for Ticket #7965.)

For example, the following command converts an animation PNG file to an HEVC
with Alpha video:
./ffmpeg -i fate-suite/apng/clock.png -c:v hevc_videotoolbox -allow_sw 1 -alpha_quality 0.75 -vtag hvc1 clock.mov

(This change uses the "HEVC Video with Alpha" profile only when the
'-alpha_quality' value is not 0 for backward compatibility.)

Signed-off-by: Hironori Bono <bouno@rouge.plala.or.jp>
2021-03-19 14:50:48 -04:00
Simone Karin Lehmann efece4442f videotoolboxenc: enable constant quality with -q:v on Apple Silicon Macs and use b-frames für HEVC and H264 and b-pyramid for HEVC.
Signed-off-by: Simone Karin Lehmann <simone@lisanet.de>
Signed-off-by: Rick Kern <kernrj@gmail.com>
2021-03-19 14:50:48 -04:00
Andreas Rheinhardt 53db591a2e avcodec/videotoolboxenc: Fix SEI enum identifiers
Broken in 64b3aac8d0.

Tested-by: Mark Himsley <mark.himsley@gmail.com>
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
2021-01-22 13:31:16 +01:00
Mark Thompson 64b3aac8d0 h264: Use common SEI types 2021-01-21 17:13:54 +00:00
Rick Kern adcdf0bc60 libavcodec/videotoolboxenc: Fix crash when frame received after error
Signed-off-by: Rick Kern <kernrj@gmail.com>
2020-09-28 21:48:23 -04:00
Tian Qi 9837f5a643 avcodec/videotoolboxenc: move pthread_cond_signal after add buffer to the queue
In the VT encoding insertion by FFmpeg,
and vtenc_q_push is callback to add the encoded data
to the singly linked list group in VTEncContext,
and consumers are notified to fetch it.
However, because it first informs consumers of pthread_cond_signal,
and then inserts the data into the tail,
there is a multi-thread safety hazard.

Signed-off-by: Steven Liu <lq@chinaffmpeg.org>
Signed-off-by: Rick Kern <kernrj@gmail.com>
2020-09-28 21:46:40 -04:00
Tian Qi 1cbea3f9ca avcodec/videotoolboxenc: don't wait when flushing data
because there is run in thread mode, few times will block
the workflow at the wait, so check the status is flushing data,
don't wait when flushing data.

Signed-off-by: Tian Qi <tianqi@kuaishou.com>
Signed-off-by: Steven Liu <lq@chinaffmpeg.org>
Signed-off-by: Rick Kern <kernrj@gmail.com>
2020-09-28 21:46:30 -04:00
Zhao Zhili d80d91d213 avcodec/videotoolboxenc: fix use after destroy
The lock is used in clear_frame_queue().

Signed-off-by: Rick Kern <kernrj@gmail.com>
2020-09-28 21:46:23 -04:00
Zhao Zhili 419d2524a8 avcodec/videotoolboxenc: fix align issue
bool a53_cc is accessed as int:
src/libavutil/opt.c:129:9: runtime error: store to misaligned
address 0x7fbf454121a3 for type 'int', which requires 4 byte alignment

Signed-off-by: Rick Kern <kernrj@gmail.com>
2020-09-28 21:45:54 -04:00
Harry Mallon e16788a323 avcodec/videotoolboxenc: Allow full range 10bit pixel format input
Signed-off-by: Harry Mallon <harry.mallon@codex.online>
Signed-off-by: Rick Kern <kernrj@gmail.com>
2020-09-28 20:46:36 -04:00
Harry Mallon 80384a6ec3 avcodec/videotoolboxenc: Set profile (main/main10) on HEVC encode
Signed-off-by: Harry Mallon <harry.mallon@codex.online>
Signed-off-by: Rick Kern <kernrj@gmail.com>
2020-09-28 20:46:05 -04:00
James Almer 0de01da1d2 avcodec: move ff_alloc_a53_sei() to atsc_53
Signed-off-by: James Almer <jamrial@gmail.com>
2020-08-15 13:01:25 -03:00
Nomis101 5e0a3278bb avcodec: Add more kCVImageBufferColorPrimaries to videotoolboxenc
Signed-off-by: Rick Kern <kernrj@gmail.com>
2019-11-17 16:30:15 -05:00
Rick Kern 1db6e47e85 avcodec/videotoolboxenc: warn user when output will use a different profile/level than requested.
Signed-off-by: Rick Kern <kernrj@gmail.com>
2019-09-16 09:02:59 -04:00
Limin Wang 57951f3019 avcodec/videotoolboxenc: add H264 Extended profile and level
Signed-off-by: Limin Wang <lance.lmwang@gmail.com>
Signed-off-by: Rick Kern <kernrj@gmail.com>
2019-09-16 09:00:39 -04:00
sharpbai 6966548c1b avcodec/videotoolboxenc: fix encoding frame crash on iOS 11
On iOS 11, encoding a frame may return error with log
"Error encoding frame 0", which means vtenc_output_callback
is called with status=0 and sample_buffer=NULL. Then the
encoding session will be crashed on next callback wether or not
closing the codec context.

Let us look through the link below introducing VTCompressionOutputCallback,

https://developer.apple.com/documentation/videotoolbox/vtcompressionoutputcallback?language=objc

"status=0" (noErr) means compression was successful.
"sampleBuffer=NULL" means the frame was dropped when compression
was successful (status=0) or compression was not successful (status!=0).

So we should not set AVERROR_EXTERNAL on "status=0" and "sample_buffer=NULL"
as it is not a error.

The fix is that we only set AVERROR_EXTERNAL with status value non zero.
When sample_buffer is NULL and status value is zero, we simply return
with no other operation.

This crash often occurs on iOS 11 for example encoding 720p@25fps.

Signed-off-by: sharpbai <sharpbai@gmail.com>
Signed-off-by: Rick Kern <kernrj@gmail.com>
2019-09-16 08:58:10 -04:00
Limin Wang 1ee863a7b0 lavc/videotoolboxenc: make transfer_fnc initialized for unsupport function
The current function will report one error message, but the caller func
haven't check it, so change the default to process as AVCOL_TRC_UNSPECIFIED.

Signed-off-by: Limin Wang <lance.lmwang@gmail.com>
Signed-off-by: Rick Kern <kernrj@gmail.com>
2019-08-11 10:52:15 -04:00
Limin Wang 391b67fcb5 lavc/videotoolboxenc: add hdr10, linear, hlg color transfer function for videotoolboxenc
Below is the testing ffmpeg command for the setting:
./ffmpeg -i input.ts -c:v hevc_videotoolbox -color_primaries bt2020 -colorspace bt2020_ncl -color_trc smpte2084 smpte2048.ts
./ffmpeg -i input.ts -c:v hevc_videotoolbox -color_primaries bt2020 -colorspace bt2020_ncl -color_trc linear linear.ts
./ffmpeg -i input.ts -c:v hevc_videotoolbox -color_primaries bt2020 -colorspace bt2020_ncl -color_trc arib-std-b67 hlg.ts

Signed-off-by: Limin Wang <lance.lmwang@gmail.com>
Signed-off-by: Rick Kern <kernrj@gmail.com>
2019-08-11 10:52:15 -04:00
Steven Liu 092bd1e54f avcodec/videotoolboxenc: remove unused variable
Signed-off-by: Steven Liu <lq@onvideo.cn>
2019-07-11 09:34:34 +08:00
Limin Wang 268ab17c51 libavcodec/videotoolboxenc: Fix compilation broken on macOS 10.12
Signed-off-by: Limin Wang <lance.lmwang@gmail.com>
Signed-off-by: Rick Kern <kernrj@gmail.com>
2019-06-17 22:54:04 -04:00
Rick Kern 98478c05ed lavc/videotoolboxenc: Add support for 10-bit HEVC encoding.
Hardware-accelerated encoding may not support 10-bit encoding. Use
'-require_sw 1' in this case.

Fixes: #7581

Signed-off-by: Rick Kern <kernrj@gmail.com>
2019-05-12 16:30:11 -04:00
Rick Kern 714c8b0766 lavc/videotoolboxenc: simplify frame creation logic between OS X and iOS.
Signed-off-by: Rick Kern <kernrj@gmail.com>
2019-05-12 16:22:51 -04:00
Rick Kern 247bda442f lavc/videotoolboxenc: add require_sw option to force software encoding.
Signed-off-by: Rick Kern <kernrj@gmail.com>
2019-05-12 16:22:51 -04:00
Thilo Borgmann 72d9b8f4c5 lavc/videotoolboxenc: Fix compilation on osx 10.10.5 Yosemite
Signed-off-by: Aman Gupta <aman@tmm1.net>
2018-08-14 10:01:30 -07:00
Thomas Guillem 93e157f40f avcodec/videotoolboxenc: fix undefined behavior with rc_max_rate=0
On macOS, a zero rc_max_rate cause an error from
VTSessionSetProperty(kVTCompressionPropertyKey_DataRateLimits).

on iOS (depending on device/version), a zero rc_max_rate cause invalid
arguments from the vtenc_output_callback after few frames and then a crash
within the VideoToolbox library.

Signed-off-by: Aman Gupta <aman@tmm1.net>
2018-07-19 09:26:01 -07:00
Thomas Guillem 513e6a30fb avcodec/videotoolboxenc: fix invalid session on iOS
Cf. comment. Restart the VT session when the APP goes from foreground to
background and vice versa.

Signed-off-by: Aman Gupta <aman@tmm1.net>
2018-06-18 11:48:05 -07:00
Thomas Guillem 9e11d27c25 avcodec/videotoolboxenc: split initialization
Split vtenc_init() into vtenc_init() (VTEncContext initialization) and
vtenc_configure_encoder() (creates the vt session).

This commit will allow to restart the vt session while encoding.

Signed-off-by: Aman Gupta <aman@tmm1.net>
2018-06-18 11:48:05 -07:00
Thomas Guillem ce2330bdf8 avcodec/videotoolboxenc: fix mutex/cond leak in error path
The leak could happen when the vtenc_create_encoder() function failed.

Signed-off-by: Aman Gupta <aman@tmm1.net>
2018-06-18 11:48:05 -07:00
wm4 b945fed629 avcodec: add metadata to identify wrappers and hardware decoders
Explicitly identify decoder/encoder wrappers with a common name. This
saves API users from guessing by the name suffix. For example, they
don't have to guess that "h264_qsv" is the h264 QSV implementation, and
instead they can just check the AVCodec .codec and .wrapper_name fields.

Explicitly mark AVCodec entries that are hardware decoders or most
likely hardware decoders with new AV_CODEC_CAPs. The purpose is allowing
API users listing hardware decoders in a more generic way. The proposed
AVCodecHWConfig does not provide this information fully, because it's
concerned with decoder configuration, not information about the fact
whether the hardware is used or not.

AV_CODEC_CAP_HYBRID exists specifically for QSV, which can have software
implementations in case the hardware is not capable.

Based on a patch by Philip Langdale <philipl@overt.org>.

Merges Libav commit 47687a2f8a.
2017-12-14 19:37:56 +01:00
Aman Gupta c8b1a151ce avcodec/videotoolboxenc: remove spurious warning
Signed-off-by: Aman Gupta <aman@tmm1.net>
2017-11-13 14:32:48 -08:00
Aman Gupta 230b91cdfd avcodec/videotoolboxenc: re-indent code
Cosmetic change only.

Signed-off-by: Aman Gupta <aman@tmm1.net>
2017-11-13 14:28:36 -08:00
Aman Gupta e7a5249ab1 avcodec/videotoolboxenc: add hevc_videotoolbox encoder
Signed-off-by: Aman Gupta <aman@tmm1.net>
Reviewed-by: Rodger Combs <rodger.combs@gmail.com>
2017-11-13 14:28:14 -08:00
Mark Thompson 6eb102a616 h264_sei: Add namespace prefix to all SEI values
This avoids confusion with equivalent H.265 SEI values when both are
being used at the same time.

(cherry picked from commit 6ea220cbee)
2017-09-12 22:29:31 +01:00
jerett 9f26d670e4 lavc/videotoolboxenc: fix open videotoolbox bug on iOS8.4
Checks for NULL before using object.

Signed-off-by: Rick Kern <kernrj@gmail.com>
2017-06-23 09:37:34 -04:00
jerett 82a8724df2 lavc/videotoolboxenc: fix loadVTEncSymbols crash when symbol not found
Signed-off-by: Rick Kern <kernrj@gmail.com>
2017-06-23 09:37:34 -04:00
Muhammad Faiz 31f61b0d4f avcodec: do not use AVFrame accessor
Reviewed-by: wm4 <nfxjfg@googlemail.com>
Signed-off-by: Muhammad Faiz <mfcc64@gmail.com>
2017-04-23 14:27:47 +07:00
James Almer 05510ec067 avcodec/videotoolboxenc: remove unused atomic header
Signed-off-by: James Almer <jamrial@gmail.com>
2017-03-23 11:51:00 -03:00
Steven Liu 0052f3f527 avcodec/videotoolboxenc: add rc_max_bitrate control into videotoolbox
add kVTCompressionPropertyKey_DataRateLimits support by rc_max_bitrate

Reviewed-by: Rick Kern <kernrj@gmail.com>
Signed-off-by: Steven Liu <lq@chinaffmpeg.org>
2017-03-15 09:37:25 -04:00
Rick Kern 70ebc05bce lavc/videotoolboxenc: fix symbol linking
Removes explicit reference to symbols and fixes dereferencing issue.

Signed-off-by: Rick Kern <kernrj@gmail.com>
2017-03-01 10:43:08 -05:00
Rick Kern dcd3418a35 lavc/videotoolboxenc: check for dictionary key symbols
Fixes #6081. Some dictionary keys are not present on OS X 10.8.
This loads the symbols and uses a default value if not present.

Signed-off-by: Rick Kern <kernrj@gmail.com>
2017-02-23 00:05:01 -05:00
Aman Gupta f45d5e07dd lavc/videotoolboxenc: skip SEI allocation when side data is not present
Signed-off-by: Rick Kern <kernrj@gmail.com>
2016-10-18 19:51:42 -04:00
Carl Eugen Hoyos f04c27fe7c lavc/videotoolboxenc: Enable a53cc by default. 2016-10-17 17:50:29 +02:00
Rick Kern d3874b74f3 lavc/videotoolboxenc: Error log formatting.
Signed-off-by: Rick Kern <kernrj@gmail.com>
2016-10-17 08:58:17 -04:00
Rick Kern 9875695e2c lavc/videotoolboxenc: Update a53cc handling
Handles insertion into existing SEI NAL unit, inserts emulation
prevention bytes.

Signed-off-by: Rick Kern <kernrj@gmail.com>
2016-10-17 08:58:17 -04:00
Rick Kern aa413b810a lavc/videotoolboxenc: flush/free frames on close
Prevents encode callback from running after codec is closed.
Fixes a crash when an error is returned.

Signed-off-by: Rick Kern <kernrj@gmail.com>
2016-10-17 08:58:17 -04:00
Aman Gupta 9ea91e4114 lavc/videotoolboxenc: implement a53cc
Signed-off-by: Rick Kern <kernrj@gmail.com>
2016-10-17 08:58:17 -04:00
Rick Kern 8b069b1cd5 lavc/videotoolboxenc: remove unnecessary logging
Signed-off-by: Rick Kern <kernrj@gmail.com>
2016-06-16 21:22:13 -04:00
Rick Kern 98a3355c6a lavc/videotoolboxenc: set extradata when opening codec
VideoToolbox doesn't supply parameter sets until the first frame is done
encoding. This spins up a temporary encoder and encodes a single frame to
get this data.

Signed-off-by: Rick Kern <kernrj@gmail.com>
2016-06-11 10:30:34 -04:00
Rick Kern c5a5ca754b lavc/videotoolboxenc: fix allocated buffer size
Allocates a buffer with padding, and with enough room for start codes when
length codes are smaller.

Signed-off-by: Rick Kern <kernrj@gmail.com>
2016-06-11 10:30:34 -04:00
Rick Kern dc750194b6 lavc/videotoolboxenc: Set colorimetry values
Signed-off-by: Rick Kern <kernrj@gmail.com>
2016-05-04 18:40:40 +02:00