From: Anton Khirnov <anton@khirnov.net> To: ffmpeg-devel@ffmpeg.org Subject: [FFmpeg-devel] [PATCH 4/8] lavc/libvpxenc: rename hdr10_plus_fifo and related objects Date: Tue, 28 Feb 2023 13:01:00 +0100 Message-ID: <20230228120104.2347-4-anton@khirnov.net> (raw) In-Reply-To: <20230228120104.2347-1-anton@khirnov.net> This AVFifo is used to propagate HDR metadata from input frames to output packets, since libvpx does not allow passing through arbitrary user data. It will be extended to pass through other kinds of data in future commits, so give it a more generic name. --- libavcodec/libvpxenc.c | 51 +++++++++++++++++++++--------------------- 1 file changed, 26 insertions(+), 25 deletions(-) diff --git a/libavcodec/libvpxenc.c b/libavcodec/libvpxenc.c index abaa8c3513..77921badba 100644 --- a/libavcodec/libvpxenc.c +++ b/libavcodec/libvpxenc.c @@ -66,10 +66,10 @@ struct FrameListData { struct FrameListData *next; }; -typedef struct FrameHDR10Plus { +typedef struct FrameData { int64_t pts; AVBufferRef *hdr10_plus; -} FrameHDR10Plus; +} FrameData; typedef struct VPxEncoderContext { AVClass *class; @@ -130,7 +130,9 @@ typedef struct VPxEncoderContext { int corpus_complexity; int tpl_model; int min_gf_interval; - AVFifo *hdr10_plus_fifo; + + // This FIFO is used to propagate various properties from frames to packets. + AVFifo *fifo; /** * If the driver does not support ROI then warn the first time we * encounter a frame with ROI side data. @@ -327,32 +329,32 @@ static av_cold void free_frame_list(struct FrameListData *list) } } -static av_cold void free_hdr10_plus_fifo(AVFifo **fifo) +static av_cold void fifo_free(AVFifo **fifo) { - FrameHDR10Plus frame_hdr10_plus; - while (av_fifo_read(*fifo, &frame_hdr10_plus, 1) >= 0) - av_buffer_unref(&frame_hdr10_plus.hdr10_plus); + FrameData fd; + while (av_fifo_read(*fifo, &fd, 1) >= 0) + av_buffer_unref(&fd.hdr10_plus); av_fifo_freep2(fifo); } -static int copy_hdr10_plus_to_pkt(AVFifo *fifo, AVPacket *pkt) +static int frame_data_apply(AVFifo *fifo, AVPacket *pkt) { - FrameHDR10Plus frame_hdr10_plus; + FrameData fd; uint8_t *data; - if (!pkt || av_fifo_peek(fifo, &frame_hdr10_plus, 1, 0) < 0) + if (!pkt || av_fifo_peek(fifo, &fd, 1, 0) < 0) return 0; - if (!frame_hdr10_plus.hdr10_plus || frame_hdr10_plus.pts != pkt->pts) + if (!fd.hdr10_plus || fd.pts != pkt->pts) return 0; av_fifo_drain2(fifo, 1); - data = av_packet_new_side_data(pkt, AV_PKT_DATA_DYNAMIC_HDR10_PLUS, frame_hdr10_plus.hdr10_plus->size); + data = av_packet_new_side_data(pkt, AV_PKT_DATA_DYNAMIC_HDR10_PLUS, fd.hdr10_plus->size); if (!data) { - av_buffer_unref(&frame_hdr10_plus.hdr10_plus); + av_buffer_unref(&fd.hdr10_plus); return AVERROR(ENOMEM); } - memcpy(data, frame_hdr10_plus.hdr10_plus->data, frame_hdr10_plus.hdr10_plus->size); - av_buffer_unref(&frame_hdr10_plus.hdr10_plus); + memcpy(data, fd.hdr10_plus->data, fd.hdr10_plus->size); + av_buffer_unref(&fd.hdr10_plus); return 0; } @@ -447,8 +449,8 @@ static av_cold int vpx_free(AVCodecContext *avctx) av_freep(&avctx->stats_out); free_frame_list(ctx->coded_frame_list); free_frame_list(ctx->alpha_coded_frame_list); - if (ctx->hdr10_plus_fifo) - free_hdr10_plus_fifo(&ctx->hdr10_plus_fifo); + if (ctx->fifo) + fifo_free(&ctx->fifo); return 0; } @@ -919,9 +921,8 @@ static av_cold int vpx_init(AVCodecContext *avctx, // 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->hdr10_plus_fifo = av_fifo_alloc2(1, sizeof(FrameHDR10Plus), - AV_FIFO_FLAG_AUTO_GROW); - if (!ctx->hdr10_plus_fifo) + ctx->fifo = av_fifo_alloc2(1, sizeof(FrameData), AV_FIFO_FLAG_AUTO_GROW); + if (!ctx->fifo) return AVERROR(ENOMEM); } } @@ -1284,8 +1285,8 @@ 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->hdr10_plus_fifo) { - int err = copy_hdr10_plus_to_pkt(ctx->hdr10_plus_fifo, pkt); + if (ctx->fifo) { + int err = frame_data_apply(ctx->fifo, pkt); if (err < 0) return err; } @@ -1702,18 +1703,18 @@ static int vpx_encode(AVCodecContext *avctx, AVPacket *pkt, } } - if (ctx->hdr10_plus_fifo) { + if (ctx->fifo) { AVFrameSideData *hdr10_plus_metadata; // Add HDR10+ metadata to queue. hdr10_plus_metadata = av_frame_get_side_data(frame, AV_FRAME_DATA_DYNAMIC_HDR_PLUS); if (hdr10_plus_metadata) { int err; - struct FrameHDR10Plus data; + FrameData data; data.pts = frame->pts; data.hdr10_plus = av_buffer_ref(hdr10_plus_metadata->buf); if (!data.hdr10_plus) return AVERROR(ENOMEM); - err = av_fifo_write(ctx->hdr10_plus_fifo, &data, 1); + err = av_fifo_write(ctx->fifo, &data, 1); if (err < 0) { av_buffer_unref(&data.hdr10_plus); return err; -- 2.39.1 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
next prev parent reply other threads:[~2023-02-28 12:02 UTC|newest] Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top 2023-02-28 12:00 [FFmpeg-devel] [PATCH 1/8] lavu/frame: improve AVFrame.opaque[_ref] documentation Anton Khirnov 2023-02-28 12:00 ` [FFmpeg-devel] [PATCH 2/8] lavc/libvpxenc: drop frame_number Anton Khirnov 2023-02-28 20:50 ` James Zern 2023-02-28 12:00 ` [FFmpeg-devel] [PATCH 3/8] lavc/libvpxenc: reindent Anton Khirnov 2023-02-28 20:50 ` James Zern 2023-02-28 12:01 ` Anton Khirnov [this message] 2023-02-28 20:55 ` [FFmpeg-devel] [PATCH 4/8] lavc/libvpxenc: rename hdr10_plus_fifo and related objects James Zern 2023-02-28 12:01 ` [FFmpeg-devel] [PATCH 5/8] lavc/libvpxenc: handle frame durations and AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE Anton Khirnov 2023-02-28 21:11 ` James Zern 2023-03-01 12:01 ` Anton Khirnov 2023-02-28 23:30 ` James Almer 2023-03-01 12:04 ` Anton Khirnov 2023-02-28 12:01 ` [FFmpeg-devel] [PATCH 6/8] lavc/libvpxenc: drop a useless condition Anton Khirnov 2023-02-28 21:12 ` James Zern 2023-02-28 12:01 ` [FFmpeg-devel] [PATCH 7/8] lavc/libvpxenc: handle queue desync more gracefully Anton Khirnov 2023-02-28 12:01 ` [FFmpeg-devel] [PATCH 8/8] lavc/libvpxenc: drop FrameListData.duration Anton Khirnov 2023-02-28 21:16 ` James Zern 2023-03-01 12:07 ` Anton Khirnov
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20230228120104.2347-4-anton@khirnov.net \ --to=anton@khirnov.net \ --cc=ffmpeg-devel@ffmpeg.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel This inbox may be cloned and mirrored by anyone: git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \ ffmpegdev@gitmailbox.com public-inbox-index ffmpegdev Example config snippet for mirrors. AGPL code for this site: git clone https://public-inbox.org/public-inbox.git