vsrc_buffer: count the number of failed requests.
authorNicolas George <nicolas.george@normalesup.org>
Thu, 19 Apr 2012 14:31:20 +0000 (16:31 +0200)
committerNicolas George <nicolas.george@normalesup.org>
Mon, 23 Apr 2012 12:13:40 +0000 (14:13 +0200)
libavfilter/vsrc_buffer.c
libavfilter/vsrc_buffer.h

index a22665b..b3d1ef5 100644 (file)
@@ -40,6 +40,7 @@ typedef struct {
     AVRational        sample_aspect_ratio;
     char              sws_param[256];
     int eof;
+    unsigned          nb_failed_requests;
 } BufferSourceContext;
 
 #define CHECK_PARAM_CHANGE(s, c, width, height, format)\
@@ -123,6 +124,7 @@ int av_vsrc_buffer_add_video_buffer_ref(AVFilterContext *buffer_filter,
         avfilter_unref_buffer(buf);
         return ret;
     }
+    c->nb_failed_requests = 0;
 
     return 0;
 }
@@ -147,6 +149,7 @@ int av_buffersrc_buffer(AVFilterContext *s, AVFilterBufferRef *buf)
 
     if ((ret = av_fifo_generic_write(c->fifo, &buf, sizeof(buf), NULL)) < 0)
         return ret;
+    c->nb_failed_requests = 0;
 
     return 0;
 }
@@ -178,6 +181,11 @@ int av_vsrc_buffer_add_frame(AVFilterContext *buffer_src,
 }
 #endif
 
+unsigned av_vsrc_buffer_get_nb_failed_requests(AVFilterContext *buffer_src)
+{
+    return ((BufferSourceContext *)buffer_src->priv)->nb_failed_requests;
+}
+
 static av_cold int init(AVFilterContext *ctx, const char *args, void *opaque)
 {
     BufferSourceContext *c = ctx->priv;
@@ -249,6 +257,7 @@ static int request_frame(AVFilterLink *link)
     if (!av_fifo_size(c->fifo)) {
         if (c->eof)
             return AVERROR_EOF;
+        c->nb_failed_requests++;
         return AVERROR(EAGAIN);
     }
     av_fifo_generic_read(c->fifo, &buf, sizeof(buf), NULL);
index b661d41..7f25c98 100644 (file)
 int av_vsrc_buffer_add_video_buffer_ref(AVFilterContext *buffer_src,
                                         AVFilterBufferRef *picref, int flags);
 
+/**
+ * Get the number of failed requests.
+ *
+ * A failed request is when the request_frame method is called while no
+ * frame is present in the buffer.
+ * The number is reset when a frame is added.
+ */
+unsigned av_vsrc_buffer_get_nb_failed_requests(AVFilterContext *buffer_src);
+
 #endif /* AVFILTER_VSRC_BUFFER_H */