From patchwork Tue Oct 30 14:38:42 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: joshdk@ob-encoder.com X-Patchwork-Id: 10853 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 4712044C27D for ; Tue, 30 Oct 2018 16:45:20 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id B35F568A772; Tue, 30 Oct 2018 16:44:51 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm1-f54.google.com (mail-wm1-f54.google.com [209.85.128.54]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 2572868A748 for ; Tue, 30 Oct 2018 16:44:45 +0200 (EET) Received: by mail-wm1-f54.google.com with SMTP id a8-v6so11573144wmf.1 for ; Tue, 30 Oct 2018 07:45:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ob-encoder-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=8rIy5AeumzWgcrvvTjo/aMpYe/W0yB1F3cOVnuIVH9I=; b=zLpZ3mrJ322TyWmZzON0CzXHgO4acABvPg/ew7xp89rISwtH0ObDkjx+bwrzHqYvPe +qucNBB0HG7/6P60U2nNNKmbj/bN7nTTCsfFXM4RBl/uev7Ao0M1X2jq/n/xWUeRGKJk y/4qj7CoBJ1oGf1eT2e26BJ5zEdevuF3fgxF+rkqUjnE0Pz5pmHKRl3YulJWPJmB7NgN XqGtVZPQS8AtlyWISAPgTpiOVK7H+MZzkDX9bv+JEZJ+ex6VgeoXwYlrsK7nFoPK3hVO 3xue+PD5riYuAIllYoNIBZtn/uLn9acdd703qTFFjkO3Io0JIe8EXKnd8Q3nG0/TOJ0X XdPg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=8rIy5AeumzWgcrvvTjo/aMpYe/W0yB1F3cOVnuIVH9I=; b=PyYIL2oxKTntm1Su9oo4N0UILA8oWeQ9fNGFzYNxlSLyxd2cEYZ/3tMHENMfTk9G1+ ppr89W7CTcx95Itgz3tMvqCUH7FYj875YzqlXRxOv2CmP+InNo7rAYeIGCPOVqcXaAfz vocHLT62t25C8rHTNeIocJU9pOIQhnmVxUcFzfGJ1jnos+qjIOQmYh+gDND0OsCCQjpE Mq8yiEvPnsBWkv9POJIFaTounBH/dkQcEEnzNVpVCCMWYf4BWzzynQZiSuXll8oKp+6d +NhlT9qsYQt9OQZEVt3r8cmYDdY1D7Z4aEW8TgAvNeUqkVsP3RfCUxXfmxjoZmJhXTnh KrLA== X-Gm-Message-State: AGRZ1gJTZUVK5FsAMj/2CrvChyYTG+SqqXm+eJR5HIGDHygrzSawU7IC tctgRQ4bXryFwaA65SrB6TgzNPvXu80= X-Google-Smtp-Source: AJdET5cvSaMWH3K81rIOzvrGEYJRFLlhXyoZXN2DwK8+Jr/Z02a0QyFUHJWuBoISZrxUdn+/EWSufw== X-Received: by 2002:a1c:1752:: with SMTP id 79-v6mr2064232wmx.145.1540910325445; Tue, 30 Oct 2018 07:38:45 -0700 (PDT) Received: from localhost.localdomain (cpc107625-sotn16-2-0-cust150.15-1.cable.virginm.net. [81.104.78.151]) by smtp.gmail.com with ESMTPSA id b8-v6sm15535450wme.1.2018.10.30.07.38.43 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 30 Oct 2018 07:38:44 -0700 (PDT) From: joshdk@ob-encoder.com X-Google-Original-From: joshdk@obe.tv To: ffmpeg-devel@ffmpeg.org Date: Tue, 30 Oct 2018 14:38:42 +0000 Message-Id: <20181030143842.3858-1-joshdk@obe.tv> X-Mailer: git-send-email 2.17.1 In-Reply-To: References: Subject: [FFmpeg-devel] [PATCH v3] fate/api-h264-slice-test: use cleaner error handling 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: Josh de Kock MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" From: Josh de Kock Fix ticket #7521 --- tests/api/api-h264-slice-test.c | 88 +++++++++++++++++++-------------- 1 file changed, 51 insertions(+), 37 deletions(-) diff --git a/tests/api/api-h264-slice-test.c b/tests/api/api-h264-slice-test.c index 57e7dc79c3..ebc90b5b57 100644 --- a/tests/api/api-h264-slice-test.c +++ b/tests/api/api-h264-slice-test.c @@ -48,7 +48,7 @@ static int header = 0; -static void decode(AVCodecContext *dec_ctx, AVFrame *frame, +static int decode(AVCodecContext *dec_ctx, AVFrame *frame, AVPacket *pkt) { static uint64_t frame_cnt = 0; @@ -57,20 +57,20 @@ static void decode(AVCodecContext *dec_ctx, AVFrame *frame, ret = avcodec_send_packet(dec_ctx, pkt); if (ret < 0) { fprintf(stderr, "Error sending a packet for decoding: %s\n", av_err2str(ret)); - exit(1); + return ret; } while (ret >= 0) { const AVPixFmtDescriptor *desc; - char *sum; + char sum[AV_HASH_MAX_SIZE * 2 + 1]; struct AVHashContext *hash; ret = avcodec_receive_frame(dec_ctx, frame); if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) { - return; + return 0; } else if (ret < 0) { fprintf(stderr, "Error during decoding: %s\n", av_err2str(ret)); - exit(1); + return ret; } if (!header) { @@ -87,9 +87,10 @@ static void decode(AVCodecContext *dec_ctx, AVFrame *frame, header = 1; } desc = av_pix_fmt_desc_get(dec_ctx->pix_fmt); - av_hash_alloc(&hash, "md5"); + if ((ret = av_hash_alloc(&hash, "md5")) < 0) { + return ret; + } av_hash_init(hash); - sum = av_mallocz(av_hash_get_size(hash) * 2 + 1); for (int i = 0; i < frame->height; i++) av_hash_update(hash, &frame->data[0][i * frame->linesize[0]], frame->width); @@ -104,25 +105,25 @@ static void decode(AVCodecContext *dec_ctx, AVFrame *frame, (frame->width * frame->height + 2 * (frame->height >> desc->log2_chroma_h) * (frame->width >> desc->log2_chroma_w)), sum); frame_cnt += 1; av_hash_freep(&hash); - av_free(sum); } + return 0; } int main(int argc, char **argv) { - const AVCodec *codec; + const AVCodec *codec = NULL; AVCodecContext *c = NULL; - AVFrame *frame; + AVFrame *frame = NULL; unsigned int threads; AVPacket *pkt; - FILE *fd; + FILE *file = NULL; char nal[MAX_SLICES * UINT16_MAX + AV_INPUT_BUFFER_PADDING_SIZE]; - int nals = 0; + int nals = 0, ret = 0; char *p = nal; if (argc < 4) { fprintf(stderr, "Usage: %s \n", argv[0]); - exit(1); + return -1; } if (!(threads = strtoul(argv[1], NULL, 0))) @@ -134,17 +135,20 @@ int main(int argc, char **argv) setmode(fileno(stdout), O_BINARY); #endif - if (!(pkt = av_packet_alloc())) - exit(1); + if (!(pkt = av_packet_alloc())) { + return -1; + } if (!(codec = avcodec_find_decoder(AV_CODEC_ID_H264))) { fprintf(stderr, "Codec not found\n"); - exit(1); + ret = -1; + goto err; } if (!(c = avcodec_alloc_context3(codec))) { fprintf(stderr, "Could not allocate video codec context\n"); - exit(1); + ret = -1; + goto err; } c->width = 352; @@ -154,15 +158,16 @@ int main(int argc, char **argv) c->thread_type = FF_THREAD_SLICE; c->thread_count = threads; - if (avcodec_open2(c, codec, NULL) < 0) { + if ((ret = avcodec_open2(c, codec, NULL)) < 0) { fprintf(stderr, "Could not open codec\n"); - exit(1); + goto err; } #if HAVE_THREADS if (c->active_thread_type != FF_THREAD_SLICE) { fprintf(stderr, "Couldn't activate slice threading: %d\n", c->active_thread_type); - exit(1); + ret = -1; + goto err; } #else fprintf(stderr, "WARN: not using threads, only checking decoding slice NALUs\n"); @@ -170,34 +175,39 @@ int main(int argc, char **argv) if (!(frame = av_frame_alloc())) { fprintf(stderr, "Could not allocate video frame\n"); - exit(1); + ret = -1; + goto err; } - if (!(fd = fopen(argv[2], "rb"))) { + if (!(file = fopen(argv[2], "rb"))) { fprintf(stderr, "Couldn't open NALU file: %s\n", argv[2]); - exit(1); + ret = -1; + goto err; } while(1) { uint16_t size = 0; - ssize_t ret = fread(&size, 1, sizeof(uint16_t), fd); - if (ret < 0) { - perror("Couldn't read size"); - exit(1); - } else if (ret != sizeof(uint16_t)) + + size_t ret = fread(&size, 1, sizeof(uint16_t), file); + if (ret != sizeof(uint16_t)) break; + size = ntohs(size); - ret = fread(p, 1, size, fd); - if (ret < 0 || ret != size) { + + ret = fread(p, 1, size, file); + if (ret != size) { perror("Couldn't read data"); - exit(1); + goto err; } p += ret; if (++nals >= threads) { + int decret = 0; pkt->data = nal; pkt->size = p - nal; - decode(c, frame, pkt); + if ((decret = decode(c, frame, pkt)) < 0) { + goto err; + } memset(nal, 0, MAX_SLICES * UINT16_MAX + AV_INPUT_BUFFER_PADDING_SIZE); nals = 0; p = nal; @@ -207,15 +217,19 @@ int main(int argc, char **argv) if (nals) { pkt->data = nal; pkt->size = p - nal; - decode(c, frame, pkt); + if ((ret = decode(c, frame, pkt)) < 0) { + goto err; + } } - decode(c, frame, NULL); + ret = decode(c, frame, NULL); - fclose(fd); - avcodec_free_context(&c); +err: + if (file) + fclose(file); av_frame_free(&frame); + avcodec_free_context(&c); av_packet_free(&pkt); - return 0; + return ret; }