* [FFmpeg-devel] [PATCH 1/5] avcodec/decode: add a function to set frame props from a user provided packet
@ 2022-12-08 14:07 James Almer
2022-12-08 14:07 ` [FFmpeg-devel] [PATCH 2/5] avcodec/decode: reindent after the previous commit James Almer
` (4 more replies)
0 siblings, 5 replies; 6+ messages in thread
From: James Almer @ 2022-12-08 14:07 UTC (permalink / raw)
To: ffmpeg-devel
It will be useful for decoders that don't rely on last_pkt_props to set frame
props.
Signed-off-by: James Almer <jamrial@gmail.com>
---
libavcodec/decode.c | 19 +++++++++++++++----
libavcodec/decode.h | 5 +++++
2 files changed, 20 insertions(+), 4 deletions(-)
diff --git a/libavcodec/decode.c b/libavcodec/decode.c
index b184c3f55b..8f7f0fadbe 100644
--- a/libavcodec/decode.c
+++ b/libavcodec/decode.c
@@ -1261,9 +1261,8 @@ static int add_metadata_from_side_data(const AVPacket *avpkt, AVFrame *frame)
return av_packet_unpack_dictionary(side_metadata, size, frame_md);
}
-int ff_decode_frame_props(AVCodecContext *avctx, AVFrame *frame)
+int ff_decode_frame_props_from_pkt(AVFrame *frame, const AVPacket *pkt)
{
- const AVPacket *pkt = avctx->internal->last_pkt_props;
static const struct {
enum AVPacketSideDataType packet;
enum AVFrameSideDataType frame;
@@ -1281,11 +1280,10 @@ int ff_decode_frame_props(AVCodecContext *avctx, AVFrame *frame)
{ AV_PKT_DATA_DYNAMIC_HDR10_PLUS, AV_FRAME_DATA_DYNAMIC_HDR_PLUS },
};
- if (!(ffcodec(avctx->codec)->caps_internal & FF_CODEC_CAP_SETS_FRAME_PROPS)) {
frame->pts = pkt->pts;
frame->pkt_pos = pkt->pos;
frame->duration = pkt->duration;
- frame->pkt_size = (int)(intptr_t)pkt->opaque;
+ frame->pkt_size = pkt->size;
for (int i = 0; i < FF_ARRAY_ELEMS(sd); i++) {
size_t size;
@@ -1307,6 +1305,19 @@ int ff_decode_frame_props(AVCodecContext *avctx, AVFrame *frame)
} else {
frame->flags = (frame->flags & ~AV_FRAME_FLAG_DISCARD);
}
+
+ return 0;
+}
+
+int ff_decode_frame_props(AVCodecContext *avctx, AVFrame *frame)
+{
+ const AVPacket *pkt = avctx->internal->last_pkt_props;
+
+ if (!(ffcodec(avctx->codec)->caps_internal & FF_CODEC_CAP_SETS_FRAME_PROPS)) {
+ int ret = ff_decode_frame_props_from_pkt(frame, pkt);
+ if (ret < 0)
+ return ret;
+ frame->pkt_size = (int)(intptr_t)pkt->opaque;
}
frame->reordered_opaque = avctx->reordered_opaque;
diff --git a/libavcodec/decode.h b/libavcodec/decode.h
index 5d95369b5e..906122b4a7 100644
--- a/libavcodec/decode.h
+++ b/libavcodec/decode.h
@@ -69,6 +69,11 @@ int ff_decode_receive_frame(AVCodecContext *avctx, AVFrame *frame);
*/
int ff_decode_get_packet(AVCodecContext *avctx, AVPacket *pkt);
+/**
+ * Set various frame properties from the provided packet.
+ */
+int ff_decode_frame_props_from_pkt(AVFrame *frame, const AVPacket *pkt);
+
/**
* Set various frame properties from the codec context / packet data.
*/
--
2.38.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".
^ permalink raw reply [flat|nested] 6+ messages in thread
* [FFmpeg-devel] [PATCH 2/5] avcodec/decode: reindent after the previous commit
2022-12-08 14:07 [FFmpeg-devel] [PATCH 1/5] avcodec/decode: add a function to set frame props from a user provided packet James Almer
@ 2022-12-08 14:07 ` James Almer
2022-12-08 14:07 ` [FFmpeg-devel] [PATCH 3/5] avcodec/libdav1d: don't use AVCodecInternal.in_pkt James Almer
` (3 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: James Almer @ 2022-12-08 14:07 UTC (permalink / raw)
To: ffmpeg-devel
Signed-off-by: James Almer <jamrial@gmail.com>
---
libavcodec/decode.c | 46 ++++++++++++++++++++++-----------------------
1 file changed, 23 insertions(+), 23 deletions(-)
diff --git a/libavcodec/decode.c b/libavcodec/decode.c
index 8f7f0fadbe..3e5be501b9 100644
--- a/libavcodec/decode.c
+++ b/libavcodec/decode.c
@@ -1280,31 +1280,31 @@ int ff_decode_frame_props_from_pkt(AVFrame *frame, const AVPacket *pkt)
{ AV_PKT_DATA_DYNAMIC_HDR10_PLUS, AV_FRAME_DATA_DYNAMIC_HDR_PLUS },
};
- frame->pts = pkt->pts;
- frame->pkt_pos = pkt->pos;
- frame->duration = pkt->duration;
- frame->pkt_size = pkt->size;
-
- for (int i = 0; i < FF_ARRAY_ELEMS(sd); i++) {
- size_t size;
- uint8_t *packet_sd = av_packet_get_side_data(pkt, sd[i].packet, &size);
- if (packet_sd) {
- AVFrameSideData *frame_sd = av_frame_new_side_data(frame,
- sd[i].frame,
- size);
- if (!frame_sd)
- return AVERROR(ENOMEM);
-
- memcpy(frame_sd->data, packet_sd, size);
- }
+ frame->pts = pkt->pts;
+ frame->pkt_pos = pkt->pos;
+ frame->duration = pkt->duration;
+ frame->pkt_size = pkt->size;
+
+ for (int i = 0; i < FF_ARRAY_ELEMS(sd); i++) {
+ size_t size;
+ uint8_t *packet_sd = av_packet_get_side_data(pkt, sd[i].packet, &size);
+ if (packet_sd) {
+ AVFrameSideData *frame_sd = av_frame_new_side_data(frame,
+ sd[i].frame,
+ size);
+ if (!frame_sd)
+ return AVERROR(ENOMEM);
+
+ memcpy(frame_sd->data, packet_sd, size);
}
- add_metadata_from_side_data(pkt, frame);
+ }
+ add_metadata_from_side_data(pkt, frame);
- if (pkt->flags & AV_PKT_FLAG_DISCARD) {
- frame->flags |= AV_FRAME_FLAG_DISCARD;
- } else {
- frame->flags = (frame->flags & ~AV_FRAME_FLAG_DISCARD);
- }
+ if (pkt->flags & AV_PKT_FLAG_DISCARD) {
+ frame->flags |= AV_FRAME_FLAG_DISCARD;
+ } else {
+ frame->flags = (frame->flags & ~AV_FRAME_FLAG_DISCARD);
+ }
return 0;
}
--
2.38.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".
^ permalink raw reply [flat|nested] 6+ messages in thread
* [FFmpeg-devel] [PATCH 3/5] avcodec/libdav1d: don't use AVCodecInternal.in_pkt
2022-12-08 14:07 [FFmpeg-devel] [PATCH 1/5] avcodec/decode: add a function to set frame props from a user provided packet James Almer
2022-12-08 14:07 ` [FFmpeg-devel] [PATCH 2/5] avcodec/decode: reindent after the previous commit James Almer
@ 2022-12-08 14:07 ` James Almer
2022-12-08 14:07 ` [FFmpeg-devel] [PATCH 4/5] avcodec/libdav1d: set frame props from the reordered packet James Almer
` (2 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: James Almer @ 2022-12-08 14:07 UTC (permalink / raw)
To: ffmpeg-devel
Allocate an AVPacket instead, which will be used in the following commit.
Signed-off-by: James Almer <jamrial@gmail.com>
---
libavcodec/libdav1d.c | 23 ++++++++++++-----------
1 file changed, 12 insertions(+), 11 deletions(-)
diff --git a/libavcodec/libdav1d.c b/libavcodec/libdav1d.c
index 028929404e..f98f351e49 100644
--- a/libavcodec/libdav1d.c
+++ b/libavcodec/libdav1d.c
@@ -41,9 +41,6 @@
typedef struct Libdav1dContext {
AVClass *class;
Dav1dContext *c;
- /* This packet coincides with AVCodecInternal.in_pkt
- * and is not owned by us. */
- AVPacket *pkt;
AVBufferPool *pool;
int pool_size;
@@ -219,8 +216,6 @@ static av_cold int libdav1d_init(AVCodecContext *c)
#endif
int res;
- dav1d->pkt = c->internal->in_pkt;
-
av_log(c, AV_LOG_INFO, "libdav1d %s\n", dav1d_version());
dav1d_default_settings(&s);
@@ -306,17 +301,22 @@ static int libdav1d_receive_frame(AVCodecContext *c, AVFrame *frame)
int res;
if (!data->sz) {
- AVPacket *const pkt = dav1d->pkt;
+ AVPacket *pkt = av_packet_alloc();
+
+ if (!pkt)
+ return AVERROR(ENOMEM);
res = ff_decode_get_packet(c, pkt);
- if (res < 0 && res != AVERROR_EOF)
+ if (res < 0 && res != AVERROR_EOF) {
+ av_packet_free(&pkt);
return res;
+ }
if (pkt->size) {
res = dav1d_data_wrap(data, pkt->data, pkt->size,
libdav1d_data_free, pkt->buf);
if (res < 0) {
- av_packet_unref(pkt);
+ av_packet_free(&pkt);
return res;
}
@@ -325,7 +325,7 @@ static int libdav1d_receive_frame(AVCodecContext *c, AVFrame *frame)
data->m.duration = pkt->duration;
pkt->buf = NULL;
- av_packet_unref(pkt);
+ av_packet_free(&pkt);
if (c->reordered_opaque != AV_NOPTS_VALUE) {
uint8_t *reordered_opaque = av_memdup(&c->reordered_opaque,
@@ -343,8 +343,9 @@ static int libdav1d_receive_frame(AVCodecContext *c, AVFrame *frame)
return res;
}
}
- } else if (res >= 0) {
- av_packet_unref(pkt);
+ } else {
+ av_packet_free(&pkt);
+ if (res >= 0)
return AVERROR(EAGAIN);
}
}
--
2.38.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".
^ permalink raw reply [flat|nested] 6+ messages in thread
* [FFmpeg-devel] [PATCH 4/5] avcodec/libdav1d: set frame props from the reordered packet
2022-12-08 14:07 [FFmpeg-devel] [PATCH 1/5] avcodec/decode: add a function to set frame props from a user provided packet James Almer
2022-12-08 14:07 ` [FFmpeg-devel] [PATCH 2/5] avcodec/decode: reindent after the previous commit James Almer
2022-12-08 14:07 ` [FFmpeg-devel] [PATCH 3/5] avcodec/libdav1d: don't use AVCodecInternal.in_pkt James Almer
@ 2022-12-08 14:07 ` James Almer
2022-12-08 14:07 ` [FFmpeg-devel] [PATCH 5/5] avcodec/libdav1d: reindent after the previous commit James Almer
2022-12-12 12:11 ` [FFmpeg-devel] [PATCH 1/5] avcodec/decode: add a function to set frame props from a user provided packet James Almer
4 siblings, 0 replies; 6+ messages in thread
From: James Almer @ 2022-12-08 14:07 UTC (permalink / raw)
To: ffmpeg-devel
Attach the AVPacket instead of only a few values to the corresponding Dav1dData
struct and use it to set all output frame props.
Signed-off-by: James Almer <jamrial@gmail.com>
---
libavcodec/libdav1d.c | 45 +++++++++++++++++++++++--------------------
1 file changed, 24 insertions(+), 21 deletions(-)
diff --git a/libavcodec/libdav1d.c b/libavcodec/libdav1d.c
index f98f351e49..d9542dd6a0 100644
--- a/libavcodec/libdav1d.c
+++ b/libavcodec/libdav1d.c
@@ -286,8 +286,10 @@ static void libdav1d_data_free(const uint8_t *data, void *opaque) {
}
static void libdav1d_user_data_free(const uint8_t *data, void *opaque) {
+ AVPacket *pkt = opaque;
av_assert0(data == opaque);
- av_free(opaque);
+ av_free(pkt->opaque);
+ av_packet_free(&pkt);
}
static int libdav1d_receive_frame(AVCodecContext *c, AVFrame *frame)
@@ -295,13 +297,14 @@ static int libdav1d_receive_frame(AVCodecContext *c, AVFrame *frame)
Libdav1dContext *dav1d = c->priv_data;
Dav1dData *data = &dav1d->data;
Dav1dPicture pic = { 0 }, *p = &pic;
+ AVPacket *pkt;
#if FF_DAV1D_VERSION_AT_LEAST(5,1)
enum Dav1dEventFlags event_flags = 0;
#endif
int res;
if (!data->sz) {
- AVPacket *pkt = av_packet_alloc();
+ pkt = av_packet_alloc();
if (!pkt)
return AVERROR(ENOMEM);
@@ -320,29 +323,28 @@ static int libdav1d_receive_frame(AVCodecContext *c, AVFrame *frame)
return res;
}
- data->m.timestamp = pkt->pts;
- data->m.offset = pkt->pos;
- data->m.duration = pkt->duration;
-
pkt->buf = NULL;
- av_packet_free(&pkt);
+ pkt->opaque = NULL;
if (c->reordered_opaque != AV_NOPTS_VALUE) {
- uint8_t *reordered_opaque = av_memdup(&c->reordered_opaque,
+ pkt->opaque = av_memdup(&c->reordered_opaque,
sizeof(c->reordered_opaque));
- if (!reordered_opaque) {
+ if (!pkt->opaque) {
+ av_packet_free(&pkt);
dav1d_data_unref(data);
return AVERROR(ENOMEM);
}
+ }
- res = dav1d_data_wrap_user_data(data, reordered_opaque,
- libdav1d_user_data_free, reordered_opaque);
+ res = dav1d_data_wrap_user_data(data, (const uint8_t *)pkt,
+ libdav1d_user_data_free, pkt);
if (res < 0) {
- av_free(reordered_opaque);
+ av_free(pkt->opaque);
+ av_packet_free(&pkt);
dav1d_data_unref(data);
return res;
}
- }
+ pkt = NULL;
} else {
av_packet_free(&pkt);
if (res >= 0)
@@ -411,17 +413,18 @@ static int libdav1d_receive_frame(AVCodecContext *c, AVFrame *frame)
INT_MAX);
ff_set_sar(c, frame->sample_aspect_ratio);
- if (p->m.user_data.data)
- memcpy(&frame->reordered_opaque, p->m.user_data.data, sizeof(frame->reordered_opaque));
+ pkt = (AVPacket *)p->m.user_data.data;
+ if (pkt->opaque)
+ memcpy(&frame->reordered_opaque, pkt->opaque, sizeof(frame->reordered_opaque));
else
frame->reordered_opaque = AV_NOPTS_VALUE;
// match timestamps and packet size
- frame->pts = p->m.timestamp;
- frame->pkt_dts = p->m.timestamp;
- frame->pkt_pos = p->m.offset;
- frame->pkt_size = p->m.size;
- frame->duration = p->m.duration;
+ res = ff_decode_frame_props_from_pkt(frame, pkt);
+ if (res < 0)
+ goto fail;
+
+ frame->pkt_dts = pkt->pts;
frame->key_frame = p->frame_hdr->frame_type == DAV1D_FRAME_TYPE_KEY;
switch (p->frame_hdr->frame_type) {
@@ -595,7 +598,7 @@ const FFCodec ff_libdav1d_decoder = {
.flush = libdav1d_flush,
FF_CODEC_RECEIVE_FRAME_CB(libdav1d_receive_frame),
.p.capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_OTHER_THREADS,
- .caps_internal = FF_CODEC_CAP_SETS_PKT_DTS |
+ .caps_internal = FF_CODEC_CAP_SETS_PKT_DTS | FF_CODEC_CAP_SETS_FRAME_PROPS |
FF_CODEC_CAP_AUTO_THREADS,
.p.priv_class = &libdav1d_class,
.p.wrapper_name = "libdav1d",
--
2.38.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".
^ permalink raw reply [flat|nested] 6+ messages in thread
* [FFmpeg-devel] [PATCH 5/5] avcodec/libdav1d: reindent after the previous commit
2022-12-08 14:07 [FFmpeg-devel] [PATCH 1/5] avcodec/decode: add a function to set frame props from a user provided packet James Almer
` (2 preceding siblings ...)
2022-12-08 14:07 ` [FFmpeg-devel] [PATCH 4/5] avcodec/libdav1d: set frame props from the reordered packet James Almer
@ 2022-12-08 14:07 ` James Almer
2022-12-12 12:11 ` [FFmpeg-devel] [PATCH 1/5] avcodec/decode: add a function to set frame props from a user provided packet James Almer
4 siblings, 0 replies; 6+ messages in thread
From: James Almer @ 2022-12-08 14:07 UTC (permalink / raw)
To: ffmpeg-devel
Signed-off-by: James Almer <jamrial@gmail.com>
---
libavcodec/libdav1d.c | 20 ++++++++++----------
1 file changed, 10 insertions(+), 10 deletions(-)
diff --git a/libavcodec/libdav1d.c b/libavcodec/libdav1d.c
index d9542dd6a0..2f151d2d1b 100644
--- a/libavcodec/libdav1d.c
+++ b/libavcodec/libdav1d.c
@@ -328,7 +328,7 @@ static int libdav1d_receive_frame(AVCodecContext *c, AVFrame *frame)
if (c->reordered_opaque != AV_NOPTS_VALUE) {
pkt->opaque = av_memdup(&c->reordered_opaque,
- sizeof(c->reordered_opaque));
+ sizeof(c->reordered_opaque));
if (!pkt->opaque) {
av_packet_free(&pkt);
dav1d_data_unref(data);
@@ -336,19 +336,19 @@ static int libdav1d_receive_frame(AVCodecContext *c, AVFrame *frame)
}
}
- res = dav1d_data_wrap_user_data(data, (const uint8_t *)pkt,
- libdav1d_user_data_free, pkt);
- if (res < 0) {
- av_free(pkt->opaque);
- av_packet_free(&pkt);
- dav1d_data_unref(data);
- return res;
- }
+ res = dav1d_data_wrap_user_data(data, (const uint8_t *)pkt,
+ libdav1d_user_data_free, pkt);
+ if (res < 0) {
+ av_free(pkt->opaque);
+ av_packet_free(&pkt);
+ dav1d_data_unref(data);
+ return res;
+ }
pkt = NULL;
} else {
av_packet_free(&pkt);
if (res >= 0)
- return AVERROR(EAGAIN);
+ return AVERROR(EAGAIN);
}
}
--
2.38.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".
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [FFmpeg-devel] [PATCH 1/5] avcodec/decode: add a function to set frame props from a user provided packet
2022-12-08 14:07 [FFmpeg-devel] [PATCH 1/5] avcodec/decode: add a function to set frame props from a user provided packet James Almer
` (3 preceding siblings ...)
2022-12-08 14:07 ` [FFmpeg-devel] [PATCH 5/5] avcodec/libdav1d: reindent after the previous commit James Almer
@ 2022-12-12 12:11 ` James Almer
4 siblings, 0 replies; 6+ messages in thread
From: James Almer @ 2022-12-12 12:11 UTC (permalink / raw)
To: ffmpeg-devel
On 12/8/2022 11:07 AM, James Almer wrote:
> It will be useful for decoders that don't rely on last_pkt_props to set frame
> props.
>
> Signed-off-by: James Almer <jamrial@gmail.com>
> ---
> libavcodec/decode.c | 19 +++++++++++++++----
> libavcodec/decode.h | 5 +++++
> 2 files changed, 20 insertions(+), 4 deletions(-)
Will apply set.
_______________________________________________
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".
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2022-12-12 12:11 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-12-08 14:07 [FFmpeg-devel] [PATCH 1/5] avcodec/decode: add a function to set frame props from a user provided packet James Almer
2022-12-08 14:07 ` [FFmpeg-devel] [PATCH 2/5] avcodec/decode: reindent after the previous commit James Almer
2022-12-08 14:07 ` [FFmpeg-devel] [PATCH 3/5] avcodec/libdav1d: don't use AVCodecInternal.in_pkt James Almer
2022-12-08 14:07 ` [FFmpeg-devel] [PATCH 4/5] avcodec/libdav1d: set frame props from the reordered packet James Almer
2022-12-08 14:07 ` [FFmpeg-devel] [PATCH 5/5] avcodec/libdav1d: reindent after the previous commit James Almer
2022-12-12 12:11 ` [FFmpeg-devel] [PATCH 1/5] avcodec/decode: add a function to set frame props from a user provided packet James Almer
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