* [FFmpeg-devel] [PATCH] avcodec/libdav1d: only return EAGAIN when there are no buffered packets
@ 2023-05-20 13:21 James Almer
2023-05-20 16:14 ` Anton Khirnov
0 siblings, 1 reply; 6+ messages in thread
From: James Almer @ 2023-05-20 13:21 UTC (permalink / raw)
To: ffmpeg-devel
Fixes decoding packets containing split temporal units, as generated for example
by the av1_frame_split bsf.
Signed-off-by: James Almer <jamrial@gmail.com>
---
libavcodec/libdav1d.c | 9 ++++++---
1 file changed, 6 insertions(+), 3 deletions(-)
diff --git a/libavcodec/libdav1d.c b/libavcodec/libdav1d.c
index c15e98cbd1..55ea9166b6 100644
--- a/libavcodec/libdav1d.c
+++ b/libavcodec/libdav1d.c
@@ -328,6 +328,7 @@ static int libdav1d_receive_frame(AVCodecContext *c, AVFrame *frame)
#endif
int res;
+again:
if (!data->sz) {
pkt = av_packet_alloc();
@@ -398,10 +399,12 @@ FF_ENABLE_DEPRECATION_WARNINGS
res = dav1d_get_picture(dav1d->c, p);
if (res < 0) {
- if (res == AVERROR(EINVAL))
- res = AVERROR_INVALIDDATA;
- else if (res == AVERROR(EAGAIN) && c->internal->draining)
+ if (res == AVERROR(EAGAIN)) {
+ if (!c->internal->draining)
+ goto again;
res = AVERROR_EOF;
+ } else if (res == AVERROR(EINVAL))
+ res = AVERROR_INVALIDDATA;
return res;
}
--
2.40.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] avcodec/libdav1d: only return EAGAIN when there are no buffered packets
2023-05-20 13:21 [FFmpeg-devel] [PATCH] avcodec/libdav1d: only return EAGAIN when there are no buffered packets James Almer
@ 2023-05-20 16:14 ` Anton Khirnov
2023-05-20 16:42 ` James Almer
0 siblings, 1 reply; 6+ messages in thread
From: Anton Khirnov @ 2023-05-20 16:14 UTC (permalink / raw)
To: FFmpeg development discussions and patches
Quoting James Almer (2023-05-20 15:21:13)
> Fixes decoding packets containing split temporal units, as generated for example
> by the av1_frame_split bsf.
>
> Signed-off-by: James Almer <jamrial@gmail.com>
> ---
> libavcodec/libdav1d.c | 9 ++++++---
> 1 file changed, 6 insertions(+), 3 deletions(-)
>
> diff --git a/libavcodec/libdav1d.c b/libavcodec/libdav1d.c
> index c15e98cbd1..55ea9166b6 100644
> --- a/libavcodec/libdav1d.c
> +++ b/libavcodec/libdav1d.c
> @@ -328,6 +328,7 @@ static int libdav1d_receive_frame(AVCodecContext *c, AVFrame *frame)
> #endif
> int res;
>
> +again:
yuck
--
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-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [FFmpeg-devel] [PATCH] avcodec/libdav1d: only return EAGAIN when there are no buffered packets
2023-05-20 16:14 ` Anton Khirnov
@ 2023-05-20 16:42 ` James Almer
2023-05-20 16:45 ` Anton Khirnov
0 siblings, 1 reply; 6+ messages in thread
From: James Almer @ 2023-05-20 16:42 UTC (permalink / raw)
To: ffmpeg-devel
On 5/20/2023 1:14 PM, Anton Khirnov wrote:
> Quoting James Almer (2023-05-20 15:21:13)
>> Fixes decoding packets containing split temporal units, as generated for example
>> by the av1_frame_split bsf.
>>
>> Signed-off-by: James Almer <jamrial@gmail.com>
>> ---
>> libavcodec/libdav1d.c | 9 ++++++---
>> 1 file changed, 6 insertions(+), 3 deletions(-)
>>
>> diff --git a/libavcodec/libdav1d.c b/libavcodec/libdav1d.c
>> index c15e98cbd1..55ea9166b6 100644
>> --- a/libavcodec/libdav1d.c
>> +++ b/libavcodec/libdav1d.c
>> @@ -328,6 +328,7 @@ static int libdav1d_receive_frame(AVCodecContext *c, AVFrame *frame)
>> #endif
>> int res;
>>
>> +again:
>
> yuck
I could make it a while loop, but then i need to reindent a lot of
lines. Is a goto that bad? We use that everywhere...
_______________________________________________
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] avcodec/libdav1d: only return EAGAIN when there are no buffered packets
2023-05-20 16:42 ` James Almer
@ 2023-05-20 16:45 ` Anton Khirnov
2023-05-20 17:23 ` James Almer
0 siblings, 1 reply; 6+ messages in thread
From: Anton Khirnov @ 2023-05-20 16:45 UTC (permalink / raw)
To: FFmpeg development discussions and patches
Quoting James Almer (2023-05-20 18:42:11)
> On 5/20/2023 1:14 PM, Anton Khirnov wrote:
> > Quoting James Almer (2023-05-20 15:21:13)
> >> Fixes decoding packets containing split temporal units, as generated for example
> >> by the av1_frame_split bsf.
> >>
> >> Signed-off-by: James Almer <jamrial@gmail.com>
> >> ---
> >> libavcodec/libdav1d.c | 9 ++++++---
> >> 1 file changed, 6 insertions(+), 3 deletions(-)
> >>
> >> diff --git a/libavcodec/libdav1d.c b/libavcodec/libdav1d.c
> >> index c15e98cbd1..55ea9166b6 100644
> >> --- a/libavcodec/libdav1d.c
> >> +++ b/libavcodec/libdav1d.c
> >> @@ -328,6 +328,7 @@ static int libdav1d_receive_frame(AVCodecContext *c, AVFrame *frame)
> >> #endif
> >> int res;
> >>
> >> +again:
> >
> > yuck
>
> I could make it a while loop, but then i need to reindent a lot of
> lines. Is a goto that bad? We use that everywhere...
I know people use it, but I personally find it very evil. It's making
the code significantly less readable (especially when it's further
modified in the future) just to avoid restructuring it properly.
Future readers will thank you for restructuring it now.
--
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-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 6+ messages in thread
* [FFmpeg-devel] [PATCH] avcodec/libdav1d: only return EAGAIN when there are no buffered packets
2023-05-20 16:45 ` Anton Khirnov
@ 2023-05-20 17:23 ` James Almer
2023-05-22 17:18 ` James Almer
0 siblings, 1 reply; 6+ messages in thread
From: James Almer @ 2023-05-20 17:23 UTC (permalink / raw)
To: ffmpeg-devel
Fixes decoding packets containing split temporal units, as generated for example
by the av1_frame_split bsf.
Signed-off-by: James Almer <jamrial@gmail.com>
---
libavcodec/libdav1d.c | 39 ++++++++++++++++++++++++++++-----------
1 file changed, 28 insertions(+), 11 deletions(-)
diff --git a/libavcodec/libdav1d.c b/libavcodec/libdav1d.c
index c15e98cbd1..f72ecf3d8a 100644
--- a/libavcodec/libdav1d.c
+++ b/libavcodec/libdav1d.c
@@ -316,20 +316,14 @@ static void libdav1d_user_data_free(const uint8_t *data, void *opaque) {
av_packet_free(&pkt);
}
-static int libdav1d_receive_frame(AVCodecContext *c, AVFrame *frame)
+static int libdav1d_receive_frame_internal(AVCodecContext *c, Dav1dPicture *p)
{
Libdav1dContext *dav1d = c->priv_data;
Dav1dData *data = &dav1d->data;
- Dav1dPicture pic = { 0 }, *p = &pic;
- AVPacket *pkt;
- OpaqueData *od = NULL;
-#if FF_DAV1D_VERSION_AT_LEAST(5,1)
- enum Dav1dEventFlags event_flags = 0;
-#endif
int res;
if (!data->sz) {
- pkt = av_packet_alloc();
+ AVPacket *pkt = av_packet_alloc();
if (!pkt)
return AVERROR(ENOMEM);
@@ -341,6 +335,8 @@ static int libdav1d_receive_frame(AVCodecContext *c, AVFrame *frame)
}
if (pkt->size) {
+ OpaqueData *od = NULL;
+
res = dav1d_data_wrap(data, pkt->data, pkt->size,
libdav1d_data_free, pkt->buf);
if (res < 0) {
@@ -400,12 +396,33 @@ FF_ENABLE_DEPRECATION_WARNINGS
if (res < 0) {
if (res == AVERROR(EINVAL))
res = AVERROR_INVALIDDATA;
- else if (res == AVERROR(EAGAIN) && c->internal->draining)
+ else if (res == AVERROR(EAGAIN)) {
+ if (!c->internal->draining)
+ return 1;
res = AVERROR_EOF;
-
- return res;
+ }
}
+ return res;
+}
+
+static int libdav1d_receive_frame(AVCodecContext *c, AVFrame *frame)
+{
+ Libdav1dContext *dav1d = c->priv_data;
+ Dav1dPicture pic = { 0 }, *p = &pic;
+ AVPacket *pkt;
+ OpaqueData *od = NULL;
+#if FF_DAV1D_VERSION_AT_LEAST(5,1)
+ enum Dav1dEventFlags event_flags = 0;
+#endif
+ int res;
+
+ do {
+ res = libdav1d_receive_frame_internal(c, p);
+ if (res < 0)
+ return res;
+ } while (res);
+
av_assert0(p->data[0] && p->allocator_data);
// This requires the custom allocator above
--
2.40.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] avcodec/libdav1d: only return EAGAIN when there are no buffered packets
2023-05-20 17:23 ` James Almer
@ 2023-05-22 17:18 ` James Almer
0 siblings, 0 replies; 6+ messages in thread
From: James Almer @ 2023-05-22 17:18 UTC (permalink / raw)
To: ffmpeg-devel
On 5/20/2023 2:23 PM, James Almer wrote:
> Fixes decoding packets containing split temporal units, as generated for example
> by the av1_frame_split bsf.
>
> Signed-off-by: James Almer <jamrial@gmail.com>
> ---
> libavcodec/libdav1d.c | 39 ++++++++++++++++++++++++++++-----------
> 1 file changed, 28 insertions(+), 11 deletions(-)
Will apply.
_______________________________________________
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:[~2023-05-22 17:18 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-05-20 13:21 [FFmpeg-devel] [PATCH] avcodec/libdav1d: only return EAGAIN when there are no buffered packets James Almer
2023-05-20 16:14 ` Anton Khirnov
2023-05-20 16:42 ` James Almer
2023-05-20 16:45 ` Anton Khirnov
2023-05-20 17:23 ` James Almer
2023-05-22 17:18 ` 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