From patchwork Tue Aug 2 13:24:22 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: 67 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.103.140.67 with SMTP id o64csp219961vsd; Tue, 2 Aug 2016 06:43:27 -0700 (PDT) X-Received: by 10.194.221.134 with SMTP id qe6mr56859391wjc.165.1470145407775; Tue, 02 Aug 2016 06:43:27 -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 m20si2767392wjr.109.2016.08.02.06.43.27; Tue, 02 Aug 2016 06:43:27 -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 833E3689F41; Tue, 2 Aug 2016 16:43:19 +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 60397689CB4 for ; Tue, 2 Aug 2016 16:43:12 +0300 (EEST) Received: by mail-wm0-f65.google.com with SMTP id i5so30911706wmg.2 for ; Tue, 02 Aug 2016 06:43:18 -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=fMd4w5kBhIjGyrsgAMWHzJKq2Sg74LkI5SsIp03ulZI=; b=MoIHo1oBmZZHd2WE8GdUlgi3WAIIVQ6Hys8EEnCXx4VPnmKSGn46UMUiYYuYyRxP4Z ETaOBs+9Iy9mx2OlY9q0c8prAnOkQCHG7q7cLfRKANhOmCT2eX636rwIJ8EvZxCGaRgn b2VomHQl0M73tU3bRwyv/XjtTap/dQUYgJm5KrQcq4Knpj6PnogO16QTL173p6IRsCDw BY1KYveklpTmaODBcgIWFJVMYYykEJbfCMZv3WyFgzQU6KMyuigzKlnWdJO05X348MXT QPLcSaLOoaLtDh0A50WMe0btLog7LbF6PddPef4vUXVE7XXnP6oLdvTv+jd4SgEM4hMC BtTQ== 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=fMd4w5kBhIjGyrsgAMWHzJKq2Sg74LkI5SsIp03ulZI=; b=ceU1t0czGEFDQ7p++z4ZkwdB9fZBTsXOU8y595xeJPCocl7e7Fjpr8p/98bzh52Yob D2mK+ALAWHpFj7dAnyhAbdZCP1uBhWzXk7oYGOyQ/8su9TeXZtq8i2XtfhfFjgw/D//Q +t/tFHNuVXwvyai21hzihsl8u4ukXB1he3LA06lLhjv/5XwsDglh/uEAkLQW8rWY17oA ZiWHQUatoJVMrpapuhtgprjec1AIhHsEqtMzEODCUhU5FvDun0u2NeP8vEpArc2iJW6r Zc5ISKy0fOxfnKndaXeDDB0Z+VaG6l0S+1KrkG0EZ/qbffkUx1dI4zfHSAV54N4VTo0W ARsA== X-Gm-Message-State: AEkoouvpGnq5eTpirgSdmPo3EY3TEa9L7QU+ZSfOCGTPCuxwQB0oJwyM/SJDpRIHY+xJxA== X-Received: by 10.194.113.9 with SMTP id iu9mr56418192wjb.118.1470144283774; Tue, 02 Aug 2016 06:24:43 -0700 (PDT) Received: from localhost.localdomain (157.174.broadband3.iol.cz. [85.70.174.157]) by smtp.gmail.com with ESMTPSA id n131sm22060902wmd.3.2016.08.02.06.24.42 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 02 Aug 2016 06:24:43 -0700 (PDT) From: sebechlebskyjan@gmail.com To: ffmpeg-devel@ffmpeg.org Date: Tue, 2 Aug 2016 15:24:22 +0200 Message-Id: <1470144262-13167-12-git-send-email-sebechlebskyjan@gmail.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1470144262-13167-1-git-send-email-sebechlebskyjan@gmail.com> References: <1470144262-13167-1-git-send-email-sebechlebskyjan@gmail.com> Subject: [FFmpeg-devel] [PATCH 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 --- 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..0a90f36 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: + av_abort_output(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; + } + + av_abort_output(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: + av_abort_output(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