* [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