Re: [FFmpeg-devel] [PATCH] avcodec/encode: restructure the core encoding code

2020-06-09 Thread James Almer
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

2020-06-09 Thread Michael Niedermayer
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

2020-06-09 Thread James Almer
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

2020-05-27 Thread Fu, Linjie
> 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

2020-05-26 Thread James Almer
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