From patchwork Thu Aug 4 13:05:18 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: 92 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.103.140.67 with SMTP id o64csp1189907vsd; Thu, 4 Aug 2016 06:05:40 -0700 (PDT) X-Received: by 10.28.96.11 with SMTP id u11mr75465400wmb.5.1470315940561; Thu, 04 Aug 2016 06:05:40 -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 fd4si13521863wjb.204.2016.08.04.06.05.38; Thu, 04 Aug 2016 06:05:40 -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 BEE8468A4B6; Thu, 4 Aug 2016 16:05:29 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm0-f66.google.com (mail-wm0-f66.google.com [74.125.82.66]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 12F6168A48B for ; Thu, 4 Aug 2016 16:05:21 +0300 (EEST) Received: by mail-wm0-f66.google.com with SMTP id x83so44134128wma.3 for ; Thu, 04 Aug 2016 06:05:28 -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; bh=Eb8HzkSsWsnip1AFHTXbL1xdsgPHx3EogRJr9MHGJz4=; b=ATzo4/k9b9/2mtOOuitXjH3U/Y5/1RO2y1CKOGgXiu4k4DSKRXEYR0YkjENR3e5z8E TAPHIG1dW5NI2oU/ZbVtAjmv17osQUL39xzN4Kx/hqEaskG3702NKQ86USFLY35ocL1A B+4MIvnxGIs7tdGak7+NnzTb1J3JL9nL9F3YbaNa2ZYcsWEkc8Jq20t4Zj7Ncf1TpkQf oAacA/rlVZ8jvZ66dSB/sDg0gSok/RdInexLZwxBSgFFkDxsOEeXs7zCTA64GIMeXE9X dZLS0np+MZ9QGrJ/6YiRGtCyp6jV3Ldxv9W8hXjc9MNvMIyPZYDlql+K6dCq3E59FqdU 1nNA== 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; bh=Eb8HzkSsWsnip1AFHTXbL1xdsgPHx3EogRJr9MHGJz4=; b=RuK1pUkr3ptfzg6qfm9/x0yvlY6QgIVz3jW401ZxfCvO/7rJzs1PSBLf5Kr6oW7j/F GZyL8FVqSp04yHWxYDDqOHvR4iSoqBIAlZezV3JYQz6sE2z3AkzHpVqUpKyWGvYM8Zor S/RY30+WeK2C9z1CdwvnUfkO5Txms2J4BJKPDkk/Lvk0ou2rmDPCKcQjSeI92yMdlwqU R5I6pF3CbKd7jJgE17sO6qIZnhIBbHfERPo/yI35AfjaAkGmEtl6zM/H51hxMJc2SjPw fDeJiItrN33sRGGmH7Q23lhDkYIcd7lg1Dl6CWuBW65j6hm8DKjMRzWBUudT961QaXMj gymQ== X-Gm-Message-State: AEkooutTG2uFNSAvsgp5kNLjmD8WsSTJp623leIpbGJiI7DjmzQjN5Uh5PFen0n2xAgM+Q== X-Received: by 10.194.185.202 with SMTP id fe10mr63787635wjc.93.1470315928293; Thu, 04 Aug 2016 06:05:28 -0700 (PDT) Received: from localhost.localdomain (157.174.broadband3.iol.cz. [85.70.174.157]) by smtp.gmail.com with ESMTPSA id r127sm3564318wmf.23.2016.08.04.06.05.27 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 04 Aug 2016 06:05:27 -0700 (PDT) From: sebechlebskyjan@gmail.com To: ffmpeg-devel@ffmpeg.org Date: Thu, 4 Aug 2016 15:05:18 +0200 Message-Id: <1470315918-19383-1-git-send-email-sebechlebskyjan@gmail.com> X-Mailer: git-send-email 1.9.1 Subject: [FFmpeg-devel] [PATCH v2 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 --- Changes from last version: - av_abort_output was renamed to avformat_write_abort 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 0b5a95e..9801810 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