Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
 help / color / mirror / Atom feed
* [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