Re: [FFmpeg-devel] [PATCH 5/8] lavc/libvpxenc: handle frame durations and AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE

2023-03-01 Thread Anton Khirnov
Quoting James Almer (2023-03-01 00:30:25)
> On 2/28/2023 9:01 AM, Anton Khirnov wrote:
> > +#if FF_API_REORDERED_OPAQUE
> > +FF_DISABLE_DEPRECATION_WARNINGS
> > +avctx->reordered_opaque = fd.reordered_opaque;
> > +FF_ENABLE_DEPRECATION_WARNINGS
> > +#endif
> 
> If this was not being set before this patch, does it make sense at all 
> to set it considering it's a deprecated field? I remember for example we 
> would not fill avctx->coded_frame on new encoders after it was deprecated.

AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE currently guarantees that the
encoder will set reordered_opaque. The users might rely on it, so we
should keep the behavior until reordered_opaque is gone.

-- 
Anton Khirnov
___
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 5/8] lavc/libvpxenc: handle frame durations and AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE

2023-03-01 Thread Anton Khirnov
Quoting James Zern (2023-02-28 22:11:29)
> On Tue, Feb 28, 2023 at 4:01 AM Anton Khirnov  wrote:
> > diff --git a/libavcodec/libvpxenc.c b/libavcodec/libvpxenc.c
> > index 77921badba..af16e53deb 100644
> > --- a/libavcodec/libvpxenc.c
> > +++ b/libavcodec/libvpxenc.c
> > @@ -68,6 +68,14 @@ struct FrameListData {
> >
> >  typedef struct FrameData {
> >  int64_t pts;
> > +int64_t duration;
> > +
> > +#if FF_API_REORDERED_OPAQUE
> > +int64_t  reordered_opaque;
> > +#endif
> > +void*frame_opaque;
> > +AVBufferRef *frame_opaque_ref;
> > +
> >  AVBufferRef *hdr10_plus;
> >  } FrameData;
> >
> > @@ -329,32 +337,101 @@ static av_cold void free_frame_list(struct 
> > FrameListData *list)
> >  }
> >  }
> >
> > +static void frame_data_uninit(FrameData *fd)
> > +{
> > +av_buffer_unref(>frame_opaque_ref);
> > +av_buffer_unref(>hdr10_plus);
> > +}
> > +
> >  static av_cold void fifo_free(AVFifo **fifo)
> >  {
> >  FrameData fd;
> >  while (av_fifo_read(*fifo, , 1) >= 0)
> > -av_buffer_unref(_plus);
> > +frame_data_uninit();
> >  av_fifo_freep2(fifo);
> >  }
> >
> > -static int frame_data_apply(AVFifo *fifo, AVPacket *pkt)
> > +static int frame_data_submit(AVCodecContext *avctx, AVFifo *fifo,
> > + const AVFrame *frame)
> > +{
> > +VPxContext *ctx = avctx->priv_data;
> > +const struct vpx_codec_enc_cfg *enccfg = ctx->encoder.config.enc;
> > +
> > +FrameDatafd = { .pts = frame->pts };
> > +
> 
> The alignment of this declaration looks strange.

Ah yes, it's a remnant from before I moved it to a separate function.
Fixed locally.

> 
> > +AVFrameSideData *av_uninit(sd);
> > +int ret;
> > +
> > +#if CONFIG_LIBVPX_VP9_ENCODER
> > +// Keep HDR10+ if it has bit depth higher than 8 and
> > +// it has PQ trc (SMPTE2084).
> 
> Out of curiosity are there any HDR10+ files in fate?

Yes, there is hevc/hdr10_plus_h265_sample.hevc. I tested that the side
data does appear on output packets.

> 
> > [...]
> > diff --git a/libavcodec/version.h b/libavcodec/version.h
> > index 06631ffa8c..789d9047c2 100644
> > --- a/libavcodec/version.h
> > +++ b/libavcodec/version.h
> > @@ -30,7 +30,7 @@
> >  #include "version_major.h"
> >
> >  #define LIBAVCODEC_VERSION_MINOR   4
> > -#define LIBAVCODEC_VERSION_MICRO 100
> > +#define LIBAVCODEC_VERSION_MICRO 101
> >
> 
> This needs a rebase to apply cleanly.

Rebased locally.

-- 
Anton Khirnov
___
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 5/8] lavc/libvpxenc: handle frame durations and AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE

2023-02-28 Thread James Almer

On 2/28/2023 9:01 AM, Anton Khirnov wrote:

+#if FF_API_REORDERED_OPAQUE
+FF_DISABLE_DEPRECATION_WARNINGS
+avctx->reordered_opaque = fd.reordered_opaque;
+FF_ENABLE_DEPRECATION_WARNINGS
+#endif


If this was not being set before this patch, does it make sense at all 
to set it considering it's a deprecated field? I remember for example we 
would not fill avctx->coded_frame on new encoders after it was deprecated.

___
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 5/8] lavc/libvpxenc: handle frame durations and AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE

2023-02-28 Thread James Zern
On Tue, Feb 28, 2023 at 4:01 AM Anton Khirnov  wrote:
>
> ---
>  libavcodec/libvpxenc.c | 139 +
>  libavcodec/version.h   |   2 +-
>  2 files changed, 100 insertions(+), 41 deletions(-)
>

lgtm

> diff --git a/libavcodec/libvpxenc.c b/libavcodec/libvpxenc.c
> index 77921badba..af16e53deb 100644
> --- a/libavcodec/libvpxenc.c
> +++ b/libavcodec/libvpxenc.c
> @@ -68,6 +68,14 @@ struct FrameListData {
>
>  typedef struct FrameData {
>  int64_t pts;
> +int64_t duration;
> +
> +#if FF_API_REORDERED_OPAQUE
> +int64_t  reordered_opaque;
> +#endif
> +void*frame_opaque;
> +AVBufferRef *frame_opaque_ref;
> +
>  AVBufferRef *hdr10_plus;
>  } FrameData;
>
> @@ -329,32 +337,101 @@ static av_cold void free_frame_list(struct 
> FrameListData *list)
>  }
>  }
>
> +static void frame_data_uninit(FrameData *fd)
> +{
> +av_buffer_unref(>frame_opaque_ref);
> +av_buffer_unref(>hdr10_plus);
> +}
> +
>  static av_cold void fifo_free(AVFifo **fifo)
>  {
>  FrameData fd;
>  while (av_fifo_read(*fifo, , 1) >= 0)
> -av_buffer_unref(_plus);
> +frame_data_uninit();
>  av_fifo_freep2(fifo);
>  }
>
> -static int frame_data_apply(AVFifo *fifo, AVPacket *pkt)
> +static int frame_data_submit(AVCodecContext *avctx, AVFifo *fifo,
> + const AVFrame *frame)
> +{
> +VPxContext *ctx = avctx->priv_data;
> +const struct vpx_codec_enc_cfg *enccfg = ctx->encoder.config.enc;
> +
> +FrameDatafd = { .pts = frame->pts };
> +

The alignment of this declaration looks strange.

> +AVFrameSideData *av_uninit(sd);
> +int ret;
> +
> +#if CONFIG_LIBVPX_VP9_ENCODER
> +// Keep HDR10+ if it has bit depth higher than 8 and
> +// it has PQ trc (SMPTE2084).

Out of curiosity are there any HDR10+ files in fate?

> [...]
> diff --git a/libavcodec/version.h b/libavcodec/version.h
> index 06631ffa8c..789d9047c2 100644
> --- a/libavcodec/version.h
> +++ b/libavcodec/version.h
> @@ -30,7 +30,7 @@
>  #include "version_major.h"
>
>  #define LIBAVCODEC_VERSION_MINOR   4
> -#define LIBAVCODEC_VERSION_MICRO 100
> +#define LIBAVCODEC_VERSION_MICRO 101
>

This needs a rebase to apply cleanly.
___
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 5/8] lavc/libvpxenc: handle frame durations and AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE

2023-02-28 Thread Anton Khirnov
---
 libavcodec/libvpxenc.c | 139 +
 libavcodec/version.h   |   2 +-
 2 files changed, 100 insertions(+), 41 deletions(-)

diff --git a/libavcodec/libvpxenc.c b/libavcodec/libvpxenc.c
index 77921badba..af16e53deb 100644
--- a/libavcodec/libvpxenc.c
+++ b/libavcodec/libvpxenc.c
@@ -68,6 +68,14 @@ struct FrameListData {
 
 typedef struct FrameData {
 int64_t pts;
+int64_t duration;
+
+#if FF_API_REORDERED_OPAQUE
+int64_t  reordered_opaque;
+#endif
+void*frame_opaque;
+AVBufferRef *frame_opaque_ref;
+
 AVBufferRef *hdr10_plus;
 } FrameData;
 
@@ -329,32 +337,101 @@ static av_cold void free_frame_list(struct FrameListData 
*list)
 }
 }
 
+static void frame_data_uninit(FrameData *fd)
+{
+av_buffer_unref(>frame_opaque_ref);
+av_buffer_unref(>hdr10_plus);
+}
+
 static av_cold void fifo_free(AVFifo **fifo)
 {
 FrameData fd;
 while (av_fifo_read(*fifo, , 1) >= 0)
-av_buffer_unref(_plus);
+frame_data_uninit();
 av_fifo_freep2(fifo);
 }
 
-static int frame_data_apply(AVFifo *fifo, AVPacket *pkt)
+static int frame_data_submit(AVCodecContext *avctx, AVFifo *fifo,
+ const AVFrame *frame)
+{
+VPxContext *ctx = avctx->priv_data;
+const struct vpx_codec_enc_cfg *enccfg = ctx->encoder.config.enc;
+
+FrameDatafd = { .pts = frame->pts };
+
+AVFrameSideData *av_uninit(sd);
+int ret;
+
+#if CONFIG_LIBVPX_VP9_ENCODER
+// Keep HDR10+ if it has bit depth higher than 8 and
+// it has PQ trc (SMPTE2084).
+sd = av_frame_get_side_data(frame, AV_FRAME_DATA_DYNAMIC_HDR_PLUS);
+if (avctx->codec_id == AV_CODEC_ID_VP9 && sd &&
+enccfg->g_bit_depth > 8 && avctx->color_trc == AVCOL_TRC_SMPTE2084) {
+fd.hdr10_plus = av_buffer_ref(sd->buf);
+if (!fd.hdr10_plus)
+return AVERROR(ENOMEM);
+}
+#endif
+
+fd.duration = frame->duration;
+fd.frame_opaque = frame->opaque;
+if (avctx->flags & AV_CODEC_FLAG_COPY_OPAQUE && frame->opaque_ref) {
+ret = av_buffer_replace(_opaque_ref, frame->opaque_ref);
+if (ret < 0)
+goto fail;
+}
+#if FF_API_REORDERED_OPAQUE
+FF_DISABLE_DEPRECATION_WARNINGS
+fd.reordered_opaque = frame->reordered_opaque;
+FF_ENABLE_DEPRECATION_WARNINGS
+#endif
+
+ret = av_fifo_write(fifo, , 1);
+if (ret < 0)
+goto fail;
+
+return 0;
+fail:
+frame_data_uninit();
+return ret;
+}
+
+static int frame_data_apply(AVCodecContext *avctx, AVFifo *fifo, AVPacket *pkt)
 {
 FrameData fd;
 uint8_t *data;
 if (!pkt || av_fifo_peek(fifo, , 1, 0) < 0)
 return 0;
-if (!fd.hdr10_plus || fd.pts != pkt->pts)
+if (fd.pts != pkt->pts)
 return 0;
 av_fifo_drain2(fifo, 1);
 
-data = av_packet_new_side_data(pkt, AV_PKT_DATA_DYNAMIC_HDR10_PLUS, 
fd.hdr10_plus->size);
-if (!data) {
+#if FF_API_REORDERED_OPAQUE
+FF_DISABLE_DEPRECATION_WARNINGS
+avctx->reordered_opaque = fd.reordered_opaque;
+FF_ENABLE_DEPRECATION_WARNINGS
+#endif
+
+pkt->duration = fd.duration;
+if (avctx->flags & AV_CODEC_FLAG_COPY_OPAQUE) {
+pkt->opaque = fd.frame_opaque;
+pkt->opaque_ref = fd.frame_opaque_ref;
+fd.frame_opaque_ref = NULL;
+}
+av_buffer_unref(_opaque_ref);
+
+if (fd.hdr10_plus) {
+data = av_packet_new_side_data(pkt, AV_PKT_DATA_DYNAMIC_HDR10_PLUS, 
fd.hdr10_plus->size);
+if (!data) {
+av_buffer_unref(_plus);
+return AVERROR(ENOMEM);
+}
+
+memcpy(data, fd.hdr10_plus->data, fd.hdr10_plus->size);
 av_buffer_unref(_plus);
-return AVERROR(ENOMEM);
 }
 
-memcpy(data, fd.hdr10_plus->data, fd.hdr10_plus->size);
-av_buffer_unref(_plus);
 return 0;
 }
 
@@ -914,17 +991,14 @@ static av_cold int vpx_init(AVCodecContext *avctx,
 return AVERROR(EINVAL);
 }
 
+ctx->fifo = av_fifo_alloc2(1, sizeof(FrameData), AV_FIFO_FLAG_AUTO_GROW);
+if (!ctx->fifo)
+return AVERROR(ENOMEM);
+
 #if CONFIG_LIBVPX_VP9_ENCODER
 if (avctx->codec_id == AV_CODEC_ID_VP9) {
 if (set_pix_fmt(avctx, codec_caps, , , _fmt))
 return AVERROR(EINVAL);
-// Keep HDR10+ if it has bit depth higher than 8 and
-// it has PQ trc (SMPTE2084).
-if (enccfg.g_bit_depth > 8 && avctx->color_trc == AVCOL_TRC_SMPTE2084) 
{
-ctx->fifo = av_fifo_alloc2(1, sizeof(FrameData), 
AV_FIFO_FLAG_AUTO_GROW);
-if (!ctx->fifo)
-return AVERROR(ENOMEM);
-}
 }
 #endif
 
@@ -1285,11 +1359,9 @@ static int storeframe(AVCodecContext *avctx, struct 
FrameListData *cx_frame,
 AV_WB64(side_data, 1);
 memcpy(side_data + 8, alpha_cx_frame->buf, alpha_cx_frame->sz);
 }
-if (ctx->fifo) {
-int err = frame_data_apply(ctx->fifo, pkt);
-if (err < 0)
-return err;
-}
+ret =