On 14.01.2019 20:32, Carl Eugen Hoyos wrote:
2019-01-14 20:02 GMT+01:00, Michael Fabian 'Xaymar' Dirks <i...@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 <i...@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@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
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel