Re: [FFmpeg-devel] [PATCH 5/8] lavc/libvpxenc: handle frame durations and AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE
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
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
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
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
--- 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 =