From patchwork Thu Aug 11 12:58:10 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: sebechlebskyjan@gmail.com X-Patchwork-Id: 155 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.103.140.67 with SMTP id o64csp51928vsd; Thu, 11 Aug 2016 05:58:43 -0700 (PDT) X-Received: by 10.194.113.105 with SMTP id ix9mr9487096wjb.30.1470920323729; Thu, 11 Aug 2016 05:58:43 -0700 (PDT) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id q197si2835094wmb.145.2016.08.11.05.58.43; Thu, 11 Aug 2016 05:58:43 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 0DED168A64D; Thu, 11 Aug 2016 15:58:36 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm0-f65.google.com (mail-wm0-f65.google.com [74.125.82.65]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id C946268A64C for ; Thu, 11 Aug 2016 15:58:24 +0300 (EEST) Received: by mail-wm0-f65.google.com with SMTP id o80so1255588wme.0 for ; Thu, 11 Aug 2016 05:58:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=MgV4p4WYSmAXDZ9UE9lKYOT+m81bi3NiJ7sKXo9A1l0=; b=N5LUHLNBuwMGpKb9kvyuMsjkzmhVo3GzJOCxXPZGuzPVHRGLZ6nHnEWnZTn1dk53mf BMmWPxq8pI0HcBNcXp5kkGGtV28T4ND++AV3C4BlD18rTPtDLas3oTssTiMBxoPP/pHR jTd9AD99S4i4DVWgzDe+gsQigFIi1J8xxpHuERu81226BSEQxa3brZjrVlVZiq37tRtj KUcZ9N4davkOtrqz7jM1YifxNySZypTrOkrSPH3dufQnvQrIB28TdmISf/+7L51Uv4Wx t3aQb6hDKTI5G1hKMq7fcr0O1fwfX7wlKO2M2pE8y1wm5H9g3+n45glzpomOwyx59/GY bnSQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=MgV4p4WYSmAXDZ9UE9lKYOT+m81bi3NiJ7sKXo9A1l0=; b=F6qEgukWMIJfz7jQIUSOp0t1S737OfdDJU+CPr/YcNyOIjIdRsijnsHuXy6kRnu5zW zJavXjNSXqm6s0svDEEgnbxtqRapLuBLqGbBe3n0c3HaIxQgJhcCkfGcTHbb3hBjdY3Z bDD9SpVGns/fltXXV0RZ6FJW5dlILWUmEYeWPgzVbBrG1o4nI30LwTMe3LRjgGXdjQu+ C1IHMth2A6hHL5kxNLL3YigdJzEZWuADyRDZtDzVLzoU7+3+ZCl8xevdREuCaGA/eiD5 BfICkFnO7mE3Li20JKVHV/+jod33rlbROFziTK/Au5StXUIE2Hio6GaguMRVDzWcoNFg vfqg== X-Gm-Message-State: AEkooutMAsSMp5T0k8TFC9+lK6mMrCFw007Vo1jCHkna3gg+yMJmwT83oagQegNyroPeRQ== X-Received: by 10.28.37.71 with SMTP id l68mr9689968wml.50.1470920304611; Thu, 11 Aug 2016 05:58:24 -0700 (PDT) Received: from localhost.localdomain (157.174.broadband3.iol.cz. [85.70.174.157]) by smtp.gmail.com with ESMTPSA id d80sm8551wmd.14.2016.08.11.05.58.23 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 11 Aug 2016 05:58:24 -0700 (PDT) From: sebechlebskyjan@gmail.com To: ffmpeg-devel@ffmpeg.org Date: Thu, 11 Aug 2016 14:58:10 +0200 Message-Id: <1470920290-4356-1-git-send-email-sebechlebskyjan@gmail.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1470315855-19209-1-git-send-email-sebechlebskyjan@gmail.com> References: <1470315855-19209-1-git-send-email-sebechlebskyjan@gmail.com> Subject: [FFmpeg-devel] [PATCH v3 11/11] avformat/fifo: Add test for nonblocking mode X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Cc: Jan Sebechlebsky MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" From: Jan Sebechlebsky Signed-off-by: Jan Sebechlebsky --- No changes since the last version of the patch, just rebased because of changes in previous fate test patch. libavformat/tests/fifo_muxer.c | 139 +++++++++++++++++++++++++++++++++++++++++ tests/ref/fate/fifo-muxer-tst | 5 ++ 2 files changed, 144 insertions(+) diff --git a/libavformat/tests/fifo_muxer.c b/libavformat/tests/fifo_muxer.c index d6ce85d..deb2656 100644 --- a/libavformat/tests/fifo_muxer.c +++ b/libavformat/tests/fifo_muxer.c @@ -336,6 +336,137 @@ fail: return ret; } +static int retry_write_frame(AVFormatContext *oc, AVPacket *pkt, int max_retries) +{ + int ret = 0, retry_count = 0; + do { + ret = av_write_frame(oc, pkt); + if (ret == AVERROR(EAGAIN)) { + av_usleep(SLEEPTIME_10_MS); + retry_count++; + } + } while ( ret == AVERROR(EAGAIN) && retry_count < max_retries); + return ret; +} + +static int retry_write_trailer(AVFormatContext *oc, int max_retries) +{ + int ret = 0, retry_count = 0; + do { + ret = av_write_trailer(oc); + if (ret == AVERROR(EAGAIN)) { + av_usleep(SLEEPTIME_10_MS); + retry_count++; + } + } while (ret == AVERROR(EAGAIN) && retry_count < max_retries); + return ret; +} + +static int fifo_nonblock_test(AVFormatContext *oc, AVDictionary **opts, + const FailingMuxerPacketData *pkt_data) +{ + int ret = 0, i; + AVPacket pkt; + + av_init_packet(&pkt); + + oc->flags |= AVFMT_FLAG_NONBLOCK; + + ret = avformat_write_header(oc, opts); + if (ret) { + fprintf(stderr, "Unexpected write_header failure: %s\n", + av_err2str(ret)); + return ret; + } + + for (i = 0; i < 16; i++ ) { + ret = prepare_packet(&pkt, pkt_data, i); + if (ret < 0) { + fprintf(stderr, "Failed to prepare test packet: %s\n", + av_err2str(ret)); + goto fail; + } + ret = retry_write_frame(oc, &pkt, 100); + av_packet_unref(&pkt); + if (ret < 0) + break; + } + + if (ret) { + fprintf(stderr, "Unexpected write_packet error: %s\n", av_err2str(ret)); + goto fail; + } + + ret = retry_write_trailer(oc, 100); + if (ret == AVERROR(EAGAIN)) { + fprintf(stderr, "write_trailer() operation timeout\n"); + goto fail; + } else if (ret < 0) + fprintf(stderr, "Unexpected write_trailer error: %s\n", av_err2str(ret)); + + return ret; +fail: + avformat_write_abort(oc); + return ret; +} + +static int fifo_nonblock_abort_test(AVFormatContext *oc, AVDictionary **opts, + const FailingMuxerPacketData *pkt_data) +{ + int ret = 0, i; + AVPacket pkt; + int64_t start_time, end_time, duration; + + av_init_packet(&pkt); + + oc->flags |= AVFMT_FLAG_NONBLOCK; + + ret = avformat_write_header(oc, opts); + if (ret) { + fprintf(stderr, "Unexpected write header failure: %s\n", + av_err2str(ret)); + goto fail; + } + + av_assert0(pkt_data->sleep_time > 0); + + start_time = av_gettime_relative(); + for (i = 0; i < 16; i++ ) { + ret = prepare_packet(&pkt, pkt_data, i); + if (ret < 0) { + fprintf(stderr, "Failed to prepare test packet: %s\n", + av_err2str(ret)); + goto fail; + } + ret = retry_write_frame(oc, &pkt, 100); + av_packet_unref(&pkt); + if (ret < 0) + break; + } + + if (ret) { + fprintf(stderr, "Unexpected write_packet error: %s\n", av_err2str(ret)); + goto fail; + } + + avformat_write_abort(oc); + + end_time = av_gettime_relative(); + duration = end_time - start_time; + + if (duration > (16*pkt_data->sleep_time)/2 ) { + fprintf(stderr, "Aborting output took too much time: %u us," + " expected time if not aborted %u us\n", + (unsigned) duration, 16*pkt_data->sleep_time); + ret = AVERROR(ETIMEDOUT); + } + + return ret; +fail: + avformat_write_abort(oc); + return ret; +} + typedef struct TestCase { int (*test_func)(AVFormatContext *, AVDictionary **,const FailingMuxerPacketData *pkt_data); const char *test_name; @@ -423,6 +554,14 @@ const TestCase tests[] = { {fifo_overflow_drop_test, "overflow with packet dropping", "queue_size=3:drop_pkts_on_overflow=1", 0, 0, 0, {0, 0, SLEEPTIME_50_MS}}, + /* Simple test of nonblocking mode, the consumer should receive all the packets. */ + {fifo_nonblock_test, "nonblocking mode test", "queue_size=3", + 1, 0, 0, {0, 0, SLEEPTIME_10_MS}}, + + /* Test of terminating fifo muxer with av_abort_format() */ + {fifo_nonblock_abort_test, "abort in nonblocking mode", "queue_size=16", + 0, 0, 0, {0, 0, SLEEPTIME_50_MS}}, + {NULL} }; diff --git a/tests/ref/fate/fifo-muxer-tst b/tests/ref/fate/fifo-muxer-tst index ca7e294..1c18887 100644 --- a/tests/ref/fate/fifo-muxer-tst +++ b/tests/ref/fate/fifo-muxer-tst @@ -9,3 +9,8 @@ pts seen nr: 15 pts seen: 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14 overflow without packet dropping: ok overflow with packet dropping: ok +flush count: 0 +pts seen nr: 16 +pts seen: 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 +nonblocking mode test: ok +abort in nonblocking mode: ok