summaryrefslogtreecommitdiff
path: root/libavcodec/vaapi_encode_h264.c
Commit message (Collapse)AuthorAge
* lavc/vaapi_encode: add FF_CODEC_CAP_INIT_CLEANUP caps for encodersLinjie Fu2020-05-04
| | | | | | | | | | | | | | | ff_vaapi_encode_close() is not enough to free the resources like cbs if initialization failure happens after codec->configure (except for vp8/vp9). We need to call avctx->codec->close() to deallocate, otherwise memory leak happens. Add FF_CODEC_CAP_INIT_CLEANUP for vaapi encoders and deallocate the resources at free_and_end inside avcodec_open2(). Reviewed-by: Timo Rothenpieler <timo@rothenpieler.org> Signed-off-by: Linjie Fu <linjie.fu@intel.com>
* lavc/vaapi_encode: Add hardware config metadataMark Thompson2020-04-26
| | | | These encoders all accept VAAPI surfaces in a hardware frames context.
* vaapi_encode: Add ROI supportMark Thompson2019-07-28
|
* vaapi_encode: Refactor encode misc parameter buffer creationMark Thompson2019-06-03
| | | | | | This removes the use of the nonstandard combined structures, which generated some warnings with clang and will cause alignment problems with some parameter buffer types.
* lavc/h264_levels: add MaxMBPS checking and update fate test.Decai Lin2019-03-27
| | | | | | | | | 1. add MaxMBPS checking for level idc setting to align with AVC spec AnnexA table A-1/A-6 level limits. 2. update h264 level fate test. Signed-off-by: Decai Lin <decai.lin@intel.com> Signed-off-by: Mark Thompson <sw@jkqxz.net>
* vaapi_encode_h264: Enable support for more RC modesMark Thompson2019-02-25
| | | | | Also fixes QP going out of range when modified by the quant factor/offset values.
* vaapi_encode: Do not zero access unit structuresMark Thompson2019-02-25
| | | | | | | Following b8c45bbcbc207293f955e838ea66106f4b65b1ac they contain allocated unit arrays which will get leaked. These operations were inconsistently applied and never actually needed (the old uninit left them in the correct state), so just drop them entirely.
* libavcodec/cbs: Stop needlessly reallocating the units arrayAndreas Rheinhardt2019-02-25
| | | | | | | | | | | | | | | | | Currently, a fragment's unit array is constantly reallocated during splitting of a packet. This commit changes this: One can keep the units array by distinguishing between the number of allocated and the number of valid units in the units array. The more units a packet is split into, the bigger the benefit. So MPEG-2 benefits the most; for a video coming from an NTSC-DVD (usually 32 units per frame) the average cost of cbs_insert_unit (for a single unit) went down from 6717 decicycles to 450 decicycles (based upon 10 runs with 4194304 runs each); if each packet consists of only one unit, it went down from 2425 to 448; for a H.264 video where most packets contain nine units, it went from 4431 to 450. Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@googlemail.com>
* vaapi_encode_h264: Support more complex reference structuresMark Thompson2019-01-23
|
* vaapi_encode: Convert to send/receive APIMark Thompson2019-01-23
| | | | | | | | | | | | | This attaches the logic of picking the mode of for the next picture to the output, which simplifies some choices by removing the concept of the picture for which input is not yet available. At the same time, we allow more complex reference structures and track more reference metadata (particularly the contents of the DPB) for use in the codec-specific code. It also adds flags to explicitly track the available features of the different codecs. The new structure also allows open-GOP support, so that is now available for codecs which can do it.
* vaapi_encode_h264: Reduce SAR to valid rangeMark Thompson2018-11-18
| | | | | | | | | The SAR of the input could have a numerator or denominator greater than 2^16 which would then be truncated to a 16-bit integer when written to the VUI parameters, giving a random result. Instead, reduce the SAR to the nearest representable fraction. Fixes #7502.
* vaapi_encode_h264: Enable multiple-slice supportMark Thompson2018-10-27
|
* cbs_h264: Fix default value for max mv lengthsMark Thompson2018-09-23
| | | | | | A recent version of the standard changed the max and default to 15, from 16 in older versions. This updates the default to 15 to match, but the max stays as 16 so that we don't reject older streams.
* vaapi_encode_h264: Set level based on stream if not set by userMark Thompson2018-09-23
|
* vaapi_encode_h26[45]: Make the AUD option a booleanMark Thompson2018-09-23
|
* vaapi_encode_h264: Properly set constraint flagsMark Thompson2018-09-23
| | | | | | | | | | | | | | | | | | constraint_set1_flag should be set for constrained baseline and main profiles, because the stream conforms to main profile. constraint_set3_flag should be set for high profile when the stream is intra-only. constraint_set4_flag should always be set for main and high profiles because interlaced encoding is not supported. constraint_set5_flag should be set for main and high profiles when B-frames are not used. Also fix the setting of max_num_ref_frames - use the gop_size value to check for intra-only rather than the constraint flag (which is not necessarily set).
* vaapi_encode: Clean up the packed header configurationMark Thompson2018-09-23
| | | | | | Add a larger warning more clearly explaining the consequences of missing packed header support in the driver. Also only write the extradata if the user actually requests it via the GLOBAL_HEADER flag.
* vaapi_encode: Clean up the GOP structure configurationMark Thompson2018-09-23
| | | | | | Choose what types of reference frames will be used based on what types are available, and make the intra-only mode explicit (GOP size one, which must be used for MJPEG).
* vaapi_encode: Add support for max QP in rate controlMark Thompson2018-09-23
| | | | | | This was added in libva 2.1.0 (VAAPI 1.1.0). Use AVCodecContext.qmax, matching the existing behaviour for qmin, and clean up the defaults so that we only pass min/max when explicitly set.
* vaapi_encode: Clean up rate control configurationMark Thompson2018-09-23
| | | | | | Query which modes are supported and select between VBR and CBR based on that - this removes all of the codec-specific rate control mode selection code.
* vaapi_encode: Clean up the encode quality configurationMark Thompson2018-09-23
|
* vaapi_encode: Add common options between all encodersMark Thompson2018-09-23
| | | | | The only common option here is low_power - it was previously supported for H.264 only, that specific option is removed.
* vaapi_encode: Choose profiles dynamicallyMark Thompson2018-09-23
| | | | | | | | | | | Previously there was one fixed choice for each codec (e.g. H.265 -> Main profile), and using anything else then required an explicit option from the user. This changes to selecting the profile based on the input format and the set of profiles actually supported by the driver (e.g. P010 input will choose Main 10 profile for H.265 if the driver supports it). The entrypoint and render target format are also chosen dynamically in the same way, removing those explicit selections from the per-codec code.
* vaapi_encode: Remove common priv_data and options fieldsMark Thompson2018-08-27
| | | | | The codec-specific context now contains both the common context and the codec-specific options directly.
* vaapi_encode_h264: Move options and common structures into contextMark Thompson2018-08-27
| | | | | This will make it easier to support options in common between different encoders. It also cleans up some of the field naming.
* vaapi_encode_h264: Take VAAPIEncodeH264Context::sei_needed as an ORed valueHaihao Xiang2018-05-03
| | | | | | We may check priv->sei_needed only when writing SEI messages. Signed-off-by: Haihao Xiang <haihao.xiang@intel.com>
* Merge commit 'ce5870a3a8f2b10668ee4f04c2ae0287f66f31b2'Mark Thompson2018-02-21
|\ | | | | | | | | | | | | | | | | * commit 'ce5870a3a8f2b10668ee4f04c2ae0287f66f31b2': cbs: Refcount all the things! Some changes for bitstream API. Merged-by: Mark Thompson <sw@jkqxz.net>
| * cbs: Refcount all the things!Mark Thompson2018-02-20
| | | | | | | | | | | | | | | | This makes it easier for users of the CBS API to get alloc/free right - all subelements use the buffer API so that it's clear how to free them. It also allows eliding some redundant copies: the packet -> fragment copy disappears after this change if the input packet is refcounted, and more codec-specific cases are now possible (but not included in this patch).
| * cbs: Allocate the context inside the init functionMark Thompson2018-02-20
| | | | | | | | | | ... instead of making callers allocate it themselves. This is more consistent with other APIs in libav.
| * avcodec: add metadata to identify wrappers and hardware decoderswm42017-12-14
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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>. Signed-off-by: Luca Barbato <lu_zero@gentoo.org>
| * vaapi_h264: Add named options for setting profile and levelMark Thompson2017-12-06
| |
| * vaapi_h264: Fix VUI max_dec_frame_bufferingJun Zhao2017-12-02
| | | | | | | | | | | | | | | | | | This should refer to the existing SPS structure, not the VAAPI sequence parameter buffer (which is not yet initialised). From ffmpeg commit f31478ba1472afe5c1eed60f219ae331816425a2. Signed-off-by: Mark Thompson <sw@jkqxz.net>
| * vaapi_h264: Add missing return value checkMark Thompson2017-11-12
| |
| * vaapi_h264: Do not use deprecated header typeMark Thompson2017-11-12
| | | | | | | | | | SEI headers should be inserted as generic raw data (the old specific type has been deprecated in libva2).
* | avcodec: add metadata to identify wrappers and hardware decoderswm42017-12-14
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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 47687a2f8aca3f65b6fdd117b1cb66a7409a7fd1.
* | vaapi_h264: Add named options for setting profile and levelMark Thompson2017-12-04
| |
* | Merge commit 'ff007e30d8d45ba1ff2b2a4615f1cd5bafb50626'Mark Thompson2017-11-15
|\| | | | | | | | | | | | | * commit 'ff007e30d8d45ba1ff2b2a4615f1cd5bafb50626': vaapi_h264: Add workaround for bad SEI in old Intel drivers Merged-by: Mark Thompson <sw@jkqxz.net>
| * vaapi_h264: Add workaround for bad SEI in old Intel driversMark Thompson2017-11-12
| | | | | | | | | | | | | | | | | | | | | | | | | | | | With pre-2.0 Intel drivers in CBR mode, if an explicit SEI message with the old (now deprecated) type is not included, the driver generates and inserts some timing SEI which is almost certainly invlaid. Before 7a4fac5e91789b73e07bd4ad20493cfde028df76 we always inserted our own SEI so this would not be visible, but since then it has been possible to disable that. We would also like to avoid using the deprecated type, and using the new type, while working in old drivers, does not suppress the spurious message like the old type does. Therefore, suppress the bad SEI insertion by providing a zero-length buffer with the old type, which the driver can insert harmlessly.
| * vaapi: Remove H.264 baseline profileMark Thompson2017-10-24
| | | | | | | | | | | | This has been deprecated in libva2 because hardware does not and will not support it. Therefore never consider it for decode, and for encode assume the user meant constrained baseline profile instead.
| * vaapi_h264: Fix CPB/DPB delaysMark Thompson2017-09-12
| | | | | | | | | | This should be ticks, not time_scale steps - it was wrong for all framerates not a multiple of 1/2.
| * vaapi_h264: Add support for SEI recovery pointsMark Thompson2017-08-13
| | | | | | | | Included by default with non-IDR intra frames.
| * vaapi_h264: Add support for AUD NAL unitsMark Thompson2017-08-13
| | | | | | | | Adds a new private option to enable them (off by default).
| * vaapi_h264: Convert to use coded bitstream infrastructureMark Thompson2017-08-13
| |
| * vaapi_encode: Move quality option to common codeMark Thompson2017-08-06
| | | | | | | | | | | | | | | | | | Use AVCodecContext.compression_level rather than a private option, replacing the H.264-specific quality option (which stays only for compatibility). This now works with the H.265 encoder in the i965 driver, as well as the existing cases with the H.264 encoder.
| * h264_sei: Add namespace prefix to all SEI valuesMark Thompson2017-05-16
| | | | | | | | | | This avoids confusion with equivalent H.265 SEI values when both are being used at the same time.
| * vaapi_encode: Use gop_size consistently in RC parametersMark Thompson2017-04-26
| | | | | | | | | | | | | | | | The non-H.26[45] codecs already use this form. Since we don't currently generate I frames for codecs which support them separately to IDR, the p_per_i variable is set to infinity by default so that it doesn't interfere with any other calculation. (All the code for I frames still exists, and it works for H.264 if set manually.)
| * vaapi_h264: Enable VBR modeMark Thompson2017-01-30
| | | | | | | | | | | | | | | | Default to using VBR when a target bitrate is set, unless the max rate is also set and matches the target. Changes to the Intel driver mean that min_qp is also respected in this case, so set a codec default to unset the value rather than using the current default inherited from the MPEG-4 part 2 encoder.
| * vaapi_h264: Scale log2_max_pic_order_cnt_lsb with max_b_framesMark Thompson2017-01-11
| | | | | | | | | | | | | | Before this change, it was possible to overflow pic_order_cnt_lsb and generate a stream with invalid POC numbering. This makes sure that the field is large enough that a single IDR B* P sequence uses fewer than half the available POC lsb values.
| * vaapi_h264: Fix POC on IDR framesJun Zhao2017-01-04
| | | | | | | | | | | | | | | | | | | | In H.264 section 8.2.1, we have that "The bitstream shall not contain data that result in Min(TopFieldOrderCnt, BottomFieldOrderCnt) not equal to 0 for a coded IDR frame". This fixes the encoder to always conform to this - previously the POC values formed an unbroken sequence, not resetting to zero on IDR frames. Signed-off-by: Mark Thompson <sw@jkqxz.net>
| * vaapi_h264: Write bitstream restriction fieldsMark Thompson2016-10-02
| |