[FFmpeg-devel] [PATCH] amfenc: Add support for pict_type field

Carl Eugen Hoyos ceffmpeg at gmail.com
Mon Jan 14 21:32:14 EET 2019


2019-01-14 20:02 GMT+01:00, Michael Fabian 'Xaymar' Dirks <info at xaymar.com>:
> Adds support for the pict_type field in AVFrame to amf_h264 and amf_h265
> simultaneously. This field is needed in cases where the application wishes
> to override the frame type with another one, such as forcefully inserting a
> key frame for chapter markers or similar.
>
> Additionally this abuses AV_PICTURE_TYPE_S for marking Skip frames, a
> special type of frame in AVC, SVC and HEVC which is a flag for the decoder
> to repeat the last frame.
>
> Signed-off-by: Michael Fabian 'Xaymar' Dirks <info at xaymar.com>
> ---
>  libavcodec/amfenc.c | 46 +++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 46 insertions(+)
>
> diff --git a/libavcodec/amfenc.c b/libavcodec/amfenc.c
> index 384d8efc92..eb4b65e4f2 100644
> --- a/libavcodec/amfenc.c
> +++ b/libavcodec/amfenc.c
> @@ -680,6 +680,52 @@ int ff_amf_send_frame(AVCodecContext *avctx, const
> AVFrame *frame)
>              break;
>          }
>
> +        // Override Picture Type for Frame
> +        if (avctx->codec->id) {
> +            switch (frame->pict_type) {
> +            case AV_PICTURE_TYPE_I:
> +                AMF_ASSIGN_PROPERTY_INT64(res, surface,
> AMF_VIDEO_ENCODER_FORCE_PICTURE_TYPE, AMF_VIDEO_ENCODER_PICTURE_TYPE_I);
> +                break;
> +            case AV_PICTURE_TYPE_P:
> +                AMF_ASSIGN_PROPERTY_INT64(res, surface,
> AMF_VIDEO_ENCODER_FORCE_PICTURE_TYPE, AMF_VIDEO_ENCODER_PICTURE_TYPE_P);
> +                break;
> +            case AV_PICTURE_TYPE_B:
> +                AMF_ASSIGN_PROPERTY_INT64(res, surface,
> AMF_VIDEO_ENCODER_FORCE_PICTURE_TYPE, AMF_VIDEO_ENCODER_PICTURE_TYPE_B);
> +                break;
> +            case AV_PICTURE_TYPE_S:
> +                AMF_ASSIGN_PROPERTY_INT64(res, surface,
> AMF_VIDEO_ENCODER_FORCE_PICTURE_TYPE, AMF_VIDEO_ENCODER_PICTURE_TYPE_SKIP);
> +                break;
> +            default:
> +                AMF_ASSIGN_PROPERTY_INT64(res, surface,
> AMF_VIDEO_ENCODER_FORCE_PICTURE_TYPE, AMF_VIDEO_ENCODER_PICTURE_TYPE_NONE);
> +                break;
> +            }
> +            // Keyframe overrides previous assignment.
> +            if (frame->key_frame) {
> +                AMF_ASSIGN_PROPERTY_INT64(res, surface,
> AMF_VIDEO_ENCODER_FORCE_PICTURE_TYPE, AMF_VIDEO_ENCODER_PICTURE_TYPE_IDR);
> +            }

> +        } else if (avctx->codec->id == AV_CODEC_ID_HEVC) {

How can this be reached?
(Assuming you tested your patch, is the block unneeded?)

Carl Eugen


More information about the ffmpeg-devel mailing list