Re: [FFmpeg-devel] [PATCH] avcodec/encode: restructure the core encoding code
On 6/9/2020 6:33 PM, Michael Niedermayer wrote: > On Tue, May 26, 2020 at 11:35:39AM -0300, James Almer wrote: >> This commit follows the same logic as 061a0c14bb, but for the encode API: The >> new public encoding API will no longer be a wrapper around the old deprecated >> one, and the internal API used by the encoders now consists of a single >> receive_packet() callback that pulls frames as required. >> >> amf encoders adapted by James Almer >> librav1e encoder adapted by James Almer >> nvidia encoders adapted by James Almer >> MediaFoundation encoders adapted by James Almer >> vaapi encoders adapted by Linjie Fu >> v4l2_m2m encoders adapted by Andriy Gelman >> >> Signed-off-by: James Almer >> --- >> libavcodec/amfenc.c | 43 ++--- >> libavcodec/amfenc.h | 2 - >> libavcodec/amfenc_h264.c| 1 - >> libavcodec/amfenc_hevc.c| 1 - >> libavcodec/avcodec.h| 12 +- >> libavcodec/encode.c | 286 >> libavcodec/encode.h | 39 + >> libavcodec/internal.h | 7 +- >> libavcodec/librav1e.c | 51 -- >> libavcodec/mfenc.c | 58 --- >> libavcodec/nvenc.c | 72 >> libavcodec/nvenc.h | 9 +- >> libavcodec/nvenc_h264.c | 6 - >> libavcodec/nvenc_hevc.c | 4 - >> libavcodec/utils.c | 10 +- >> libavcodec/v4l2_m2m.c | 8 + >> libavcodec/v4l2_m2m.h | 3 + >> libavcodec/v4l2_m2m_enc.c | 15 +- >> libavcodec/vaapi_encode.c | 26 ++- >> libavcodec/vaapi_encode.h | 3 +- >> libavcodec/vaapi_encode_h264.c | 1 - >> libavcodec/vaapi_encode_h265.c | 1 - >> libavcodec/vaapi_encode_mjpeg.c | 1 - >> libavcodec/vaapi_encode_mpeg2.c | 1 - >> libavcodec/vaapi_encode_vp8.c | 1 - >> libavcodec/vaapi_encode_vp9.c | 1 - >> 26 files changed, 442 insertions(+), 220 deletions(-) >> create mode 100644 libavcodec/encode.h > > this doesnt apply (anymore) automatically > > Applying: This commit follows the same logic as 061a0c14bb, but for the > encode API: The > Using index info to reconstruct a base tree... > M libavcodec/avcodec.h > M libavcodec/encode.c > M libavcodec/internal.h > M libavcodec/mfenc.c > M libavcodec/nvenc.c > M libavcodec/utils.c > M libavcodec/v4l2_m2m_enc.c > Falling back to patching base and 3-way merge... > Auto-merging libavcodec/v4l2_m2m_enc.c > Auto-merging libavcodec/utils.c > Auto-merging libavcodec/nvenc.c > Auto-merging libavcodec/mfenc.c > Auto-merging libavcodec/internal.h > Auto-merging libavcodec/encode.c > Auto-merging libavcodec/avcodec.h > CONFLICT (content): Merge conflict in libavcodec/avcodec.h Yeah, Anton moved AVCodec to codec.h, so i need to rebase. Will send an updated version soon. ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".
Re: [FFmpeg-devel] [PATCH] avcodec/encode: restructure the core encoding code
On Tue, May 26, 2020 at 11:35:39AM -0300, James Almer wrote: > This commit follows the same logic as 061a0c14bb, but for the encode API: The > new public encoding API will no longer be a wrapper around the old deprecated > one, and the internal API used by the encoders now consists of a single > receive_packet() callback that pulls frames as required. > > amf encoders adapted by James Almer > librav1e encoder adapted by James Almer > nvidia encoders adapted by James Almer > MediaFoundation encoders adapted by James Almer > vaapi encoders adapted by Linjie Fu > v4l2_m2m encoders adapted by Andriy Gelman > > Signed-off-by: James Almer > --- > libavcodec/amfenc.c | 43 ++--- > libavcodec/amfenc.h | 2 - > libavcodec/amfenc_h264.c| 1 - > libavcodec/amfenc_hevc.c| 1 - > libavcodec/avcodec.h| 12 +- > libavcodec/encode.c | 286 > libavcodec/encode.h | 39 + > libavcodec/internal.h | 7 +- > libavcodec/librav1e.c | 51 -- > libavcodec/mfenc.c | 58 --- > libavcodec/nvenc.c | 72 > libavcodec/nvenc.h | 9 +- > libavcodec/nvenc_h264.c | 6 - > libavcodec/nvenc_hevc.c | 4 - > libavcodec/utils.c | 10 +- > libavcodec/v4l2_m2m.c | 8 + > libavcodec/v4l2_m2m.h | 3 + > libavcodec/v4l2_m2m_enc.c | 15 +- > libavcodec/vaapi_encode.c | 26 ++- > libavcodec/vaapi_encode.h | 3 +- > libavcodec/vaapi_encode_h264.c | 1 - > libavcodec/vaapi_encode_h265.c | 1 - > libavcodec/vaapi_encode_mjpeg.c | 1 - > libavcodec/vaapi_encode_mpeg2.c | 1 - > libavcodec/vaapi_encode_vp8.c | 1 - > libavcodec/vaapi_encode_vp9.c | 1 - > 26 files changed, 442 insertions(+), 220 deletions(-) > create mode 100644 libavcodec/encode.h this doesnt apply (anymore) automatically Applying: This commit follows the same logic as 061a0c14bb, but for the encode API: The Using index info to reconstruct a base tree... M libavcodec/avcodec.h M libavcodec/encode.c M libavcodec/internal.h M libavcodec/mfenc.c M libavcodec/nvenc.c M libavcodec/utils.c M libavcodec/v4l2_m2m_enc.c Falling back to patching base and 3-way merge... Auto-merging libavcodec/v4l2_m2m_enc.c Auto-merging libavcodec/utils.c Auto-merging libavcodec/nvenc.c Auto-merging libavcodec/mfenc.c Auto-merging libavcodec/internal.h Auto-merging libavcodec/encode.c Auto-merging libavcodec/avcodec.h CONFLICT (content): Merge conflict in libavcodec/avcodec.h [...] -- Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB While the State exists there can be no freedom; when there is freedom there will be no State. -- Vladimir Lenin signature.asc Description: PGP signature ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".
Re: [FFmpeg-devel] [PATCH] avcodec/encode: restructure the core encoding code
On 5/26/2020 11:35 AM, James Almer wrote: > This commit follows the same logic as 061a0c14bb, but for the encode API: The > new public encoding API will no longer be a wrapper around the old deprecated > one, and the internal API used by the encoders now consists of a single > receive_packet() callback that pulls frames as required. > > amf encoders adapted by James Almer > librav1e encoder adapted by James Almer > nvidia encoders adapted by James Almer > MediaFoundation encoders adapted by James Almer > vaapi encoders adapted by Linjie Fu > v4l2_m2m encoders adapted by Andriy Gelman > > Signed-off-by: James Almer > --- > libavcodec/amfenc.c | 43 ++--- > libavcodec/amfenc.h | 2 - > libavcodec/amfenc_h264.c| 1 - > libavcodec/amfenc_hevc.c| 1 - > libavcodec/avcodec.h| 12 +- > libavcodec/encode.c | 286 > libavcodec/encode.h | 39 + > libavcodec/internal.h | 7 +- > libavcodec/librav1e.c | 51 -- > libavcodec/mfenc.c | 58 --- > libavcodec/nvenc.c | 72 > libavcodec/nvenc.h | 9 +- > libavcodec/nvenc_h264.c | 6 - > libavcodec/nvenc_hevc.c | 4 - > libavcodec/utils.c | 10 +- > libavcodec/v4l2_m2m.c | 8 + > libavcodec/v4l2_m2m.h | 3 + > libavcodec/v4l2_m2m_enc.c | 15 +- > libavcodec/vaapi_encode.c | 26 ++- > libavcodec/vaapi_encode.h | 3 +- > libavcodec/vaapi_encode_h264.c | 1 - > libavcodec/vaapi_encode_h265.c | 1 - > libavcodec/vaapi_encode_mjpeg.c | 1 - > libavcodec/vaapi_encode_mpeg2.c | 1 - > libavcodec/vaapi_encode_vp8.c | 1 - > libavcodec/vaapi_encode_vp9.c | 1 - > 26 files changed, 442 insertions(+), 220 deletions(-) > create mode 100644 libavcodec/encode.h Will apply soon now that 4.3 branch was created. ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".
Re: [FFmpeg-devel] [PATCH] avcodec/encode: restructure the core encoding code
> From: ffmpeg-devel On Behalf Of > James Almer > Sent: Tuesday, May 26, 2020 22:36 > To: ffmpeg-devel@ffmpeg.org > Subject: [FFmpeg-devel] [PATCH] avcodec/encode: restructure the core > encoding code > > This commit follows the same logic as 061a0c14bb, but for the encode API: > The > new public encoding API will no longer be a wrapper around the old > deprecated > one, and the internal API used by the encoders now consists of a single > receive_packet() callback that pulls frames as required. > > amf encoders adapted by James Almer > librav1e encoder adapted by James Almer > nvidia encoders adapted by James Almer > MediaFoundation encoders adapted by James Almer > vaapi encoders adapted by Linjie Fu > v4l2_m2m encoders adapted by Andriy Gelman > > Signed-off-by: James Almer > --- > > diff --git a/libavcodec/vaapi_encode.c b/libavcodec/vaapi_encode.c > index cb05ebd774..98026f451a 100644 > --- a/libavcodec/vaapi_encode.c > +++ b/libavcodec/vaapi_encode.c > @@ -25,6 +25,7 @@ > #include "libavutil/pixdesc.h" > > #include "vaapi_encode.h" > +#include "encode.h" > #include "avcodec.h" > > const AVCodecHWConfigInternal *ff_vaapi_encode_hw_configs[] = { > @@ -1043,7 +1044,7 @@ static int > vaapi_encode_check_frame(AVCodecContext *avctx, > return 0; > } > > -int ff_vaapi_encode_send_frame(AVCodecContext *avctx, const AVFrame > *frame) > +static int vaapi_encode_send_frame(AVCodecContext *avctx, AVFrame > *frame) > { > VAAPIEncodeContext *ctx = avctx->priv_data; > VAAPIEncodePicture *pic; > @@ -1066,9 +1067,7 @@ int > ff_vaapi_encode_send_frame(AVCodecContext *avctx, const AVFrame > *frame) > err = AVERROR(ENOMEM); > goto fail; > } > -err = av_frame_ref(pic->input_image, frame); > -if (err < 0) > -goto fail; > +av_frame_move_ref(pic->input_image, frame); Slight change for the vaapi part is needed here: av_frame_move_ref() would reset src(frame), hence we need to get all attributes passed from frame to pic before we call av_frame_move_ref(). Didn't notice this until encoding quality drop is observed in pre-check[1] for this patch set while verifying. (and sorry for didn't catch this earlier) After adding this fix, all pre-check is good. - Linjie [1] https://github.com/intel-media-ci/ffmpeg/pull/206 Details: diff --git a/libavcodec/vaapi_encode.c b/libavcodec/vaapi_encode.c index 98026f451a..e39db20200 100644 --- a/libavcodec/vaapi_encode.c +++ b/libavcodec/vaapi_encode.c @@ -1067,7 +1067,6 @@ static int vaapi_encode_send_frame(AVCodecContext *avctx, AVFrame *frame) err = AVERROR(ENOMEM); goto fail; } -av_frame_move_ref(pic->input_image, frame); if (ctx->input_order == 0 || frame->pict_type == AV_PICTURE_TYPE_I) pic->force_idr = 1; @@ -1075,6 +1074,8 @@ static int vaapi_encode_send_frame(AVCodecContext *avctx, AVFrame *frame) pic->input_surface = (VASurfaceID)(uintptr_t)frame->data[3]; pic->pts = frame->pts; +av_frame_move_ref(pic->input_image, frame); + if (ctx->input_order == 0) ctx->first_pts = pic->pts; if (ctx->input_order == ctx->decode_delay) -- ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".
[FFmpeg-devel] [PATCH] avcodec/encode: restructure the core encoding code
This commit follows the same logic as 061a0c14bb, but for the encode API: The new public encoding API will no longer be a wrapper around the old deprecated one, and the internal API used by the encoders now consists of a single receive_packet() callback that pulls frames as required. amf encoders adapted by James Almer librav1e encoder adapted by James Almer nvidia encoders adapted by James Almer MediaFoundation encoders adapted by James Almer vaapi encoders adapted by Linjie Fu v4l2_m2m encoders adapted by Andriy Gelman Signed-off-by: James Almer --- libavcodec/amfenc.c | 43 ++--- libavcodec/amfenc.h | 2 - libavcodec/amfenc_h264.c| 1 - libavcodec/amfenc_hevc.c| 1 - libavcodec/avcodec.h| 12 +- libavcodec/encode.c | 286 libavcodec/encode.h | 39 + libavcodec/internal.h | 7 +- libavcodec/librav1e.c | 51 -- libavcodec/mfenc.c | 58 --- libavcodec/nvenc.c | 72 libavcodec/nvenc.h | 9 +- libavcodec/nvenc_h264.c | 6 - libavcodec/nvenc_hevc.c | 4 - libavcodec/utils.c | 10 +- libavcodec/v4l2_m2m.c | 8 + libavcodec/v4l2_m2m.h | 3 + libavcodec/v4l2_m2m_enc.c | 15 +- libavcodec/vaapi_encode.c | 26 ++- libavcodec/vaapi_encode.h | 3 +- libavcodec/vaapi_encode_h264.c | 1 - libavcodec/vaapi_encode_h265.c | 1 - libavcodec/vaapi_encode_mjpeg.c | 1 - libavcodec/vaapi_encode_mpeg2.c | 1 - libavcodec/vaapi_encode_vp8.c | 1 - libavcodec/vaapi_encode_vp9.c | 1 - 26 files changed, 442 insertions(+), 220 deletions(-) create mode 100644 libavcodec/encode.h diff --git a/libavcodec/amfenc.c b/libavcodec/amfenc.c index 876fddd2b6..da0652943d 100644 --- a/libavcodec/amfenc.c +++ b/libavcodec/amfenc.c @@ -33,6 +33,7 @@ #include "libavutil/time.h" #include "amfenc.h" +#include "encode.h" #include "internal.h" #if CONFIG_D3D11VA @@ -588,17 +589,27 @@ static void amf_release_buffer_with_frame_ref(AMFBuffer *frame_ref_storage_buffe frame_ref_storage_buffer->pVtbl->Release(frame_ref_storage_buffer); } -int ff_amf_send_frame(AVCodecContext *avctx, const AVFrame *frame) +int ff_amf_receive_packet(AVCodecContext *avctx, AVPacket *avpkt) { AmfContext *ctx = avctx->priv_data; AMFSurface *surface; AMF_RESULT res; int ret; +AMF_RESULT res_query; +AMFData*data = NULL; +AVFrame*frame = ctx->delayed_frame; +int block_and_wait; if (!ctx->encoder) return AVERROR(EINVAL); -if (!frame) { // submit drain +if (!frame->buf[0]) { +ret = ff_encode_get_frame(avctx, frame); +if (ret < 0 && ret != AVERROR_EOF) +return ret; +} + +if (!frame->buf[0]) { // submit drain if (!ctx->eof) { // submit drain one time only if (ctx->delayed_surface != NULL) { ctx->delayed_drain = 1; // input queue is full: resubmit Drain() in ff_amf_receive_packet @@ -613,15 +624,10 @@ int ff_amf_send_frame(AVCodecContext *avctx, const AVFrame *frame) AMF_RETURN_IF_FALSE(ctx, res == AMF_OK, AVERROR_UNKNOWN, "Drain() failed with error %d\n", res); } } -} else{ -return AVERROR_EOF; } -} else { // submit frame +} else if (!ctx->delayed_surface) { // submit frame int hw_surface = 0; -if (ctx->delayed_surface != NULL) { -return AVERROR(EAGAIN); // should not happen when called from ffmpeg, other clients may resubmit -} // prepare surface from frame switch (frame->format) { #if CONFIG_D3D11VA @@ -693,38 +699,23 @@ int ff_amf_send_frame(AVCodecContext *avctx, const AVFrame *frame) break; } - // submit surface res = ctx->encoder->pVtbl->SubmitInput(ctx->encoder, (AMFData*)surface); if (res == AMF_INPUT_FULL) { // handle full queue //store surface for later submission ctx->delayed_surface = surface; -if (surface->pVtbl->GetMemoryType(surface) == AMF_MEMORY_DX11) { -av_frame_ref(ctx->delayed_frame, frame); -} } else { +int64_t pts = frame->pts; surface->pVtbl->Release(surface); AMF_RETURN_IF_FALSE(ctx, res == AMF_OK, AVERROR_UNKNOWN, "SubmitInput() failed with error %d\n", res); -if ((ret = timestamp_queue_enqueue(avctx, frame->pts)) < 0) { +av_frame_unref(frame); +if ((ret = timestamp_queue_enqueue(avctx, pts)) < 0) { return ret; } - } } -return 0; -} -int ff_amf_receive_packet(AVCodecContext *avctx, AVPacket *avpkt) -{ -int ret; -AMF_RESULT res; -AMF_RESULT