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

Michael Dirks michael.dirks at xaymar.com
Mon Jan 14 22:15:55 EET 2019


On 14.01.2019 20:32, Carl Eugen Hoyos wrote:
> 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
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel

Thanks for pointing that out Carl, I forgot to re-run git format-patch before sending off the patch. The correct code should be:

> +        if (avctx->codec->id) {

should actually be

> +        if (avctx->codec->id == AV_CODEC_ID_H264) {

Should I resubmit with the corrected patch file?

Unfortunately I am currently only able to test the H.264 encoder, as 
initializing the H.265 encoder results in the Driver crashing with and 
without this patch applied. Assuming that ffmpeg doesn't do something 
weird with the AMF runtime, this behaviour should be working as is 
(similar code exists in obs-amd-encoder, the AMF integration for 
obs-studio).

Michael Fabian Dirks




More information about the ffmpeg-devel mailing list