From patchwork Sun Jul 5 15:49:43 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Thompson X-Patchwork-Id: 20822 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 2E08544BC3D for ; Sun, 5 Jul 2020 18:52:05 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id E34FA68921A; Sun, 5 Jul 2020 18:52:04 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f44.google.com (mail-wr1-f44.google.com [209.85.221.44]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id C25A5687FD3 for ; Sun, 5 Jul 2020 18:51:58 +0300 (EEST) Received: by mail-wr1-f44.google.com with SMTP id b6so38095018wrs.11 for ; Sun, 05 Jul 2020 08:51:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=jkqxz-net.20150623.gappssmtp.com; s=20150623; h=from:to:subject:date:message-id:mime-version :content-transfer-encoding; bh=meijq8S4lt99arWAlkyNHPuWp0H+AtBhMWBkhCssXqQ=; b=n7uN9x3bcXq31pwugnkvM/aAzWYZegsY3wY2qYaKHGqCdFJlJ0jQWF0MUDw4DGj8NI 8IA/V07Rc3ndEdb6cMiyylNnm3KJPsw/1UCkGyvQqW7EvYCab1ZS8pKzIR5zR+9UBVI4 z1RHb83Xe/J566YJq0gUmdZcSVL4Yq+qitHJifGhUaUZFwBOrytV8PjUijn/VFKoE5yU J8Fm0Bqpc/Osn9/aiMGJN2DpbS3PduQzy5kd/c4sYlAYZs82c9EGU228bZhaOdZm0vFw gWrgNTRgTmL9yvYbBVcB/PAPDU6r21yc/mnVdLM5h4PtOFJCEUcV3OcbeegMRP616a7u oMQA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:mime-version :content-transfer-encoding; bh=meijq8S4lt99arWAlkyNHPuWp0H+AtBhMWBkhCssXqQ=; b=CVt4oYrKAY4nTP6W1J9Ew4MEcF2sDfeeHPMShbax8U5clBwo9wS9Snp6JEoMaS0Io9 cKQfUuQZviueVOsuzHq0SP1YCFY8jznuNBrou8SvsHWj+qPghUnx3dO4yqqYpb0fVR9+ k7EXi3mL1ewloIZhpjHLSlUUAKf3TQKEEcbBLGDfbqc+NJ2dhNk8P33T5k/414nMMW/S VY3viItyw9EfaU9EwlBe0mmiZevwMIVHZxH6GM1wmmKM+KLdpTdHIADkFhZLWEXhDJjl C0elBLaa1ICeKtEZWJAD1KpkhQoi1gdk8aoLhnGzr1s98M4NDmXYDcZLbpgaye8HHdJ/ 6sbQ== X-Gm-Message-State: AOAM5301Yute4NBHj/NTOXoBvLYwIVLQ3OKkw2Kd5u7R57mtYywOX4zC pCFXVkwcniS0YhcfnsAjhYaRB5zgj2U= X-Google-Smtp-Source: ABdhPJzNTwEiuYwFo4ODR+5IkzJ0YyieT1Qgi7XIce59zjRoXzhRNcYCd5KKt4qC19xF+BQ1vYQrlg== X-Received: by 2002:adf:ef8a:: with SMTP id d10mr43634021wro.126.1593964317825; Sun, 05 Jul 2020 08:51:57 -0700 (PDT) Received: from localhost.localdomain (cpc91242-cmbg18-2-0-cust650.5-4.cable.virginm.net. [82.8.130.139]) by smtp.gmail.com with ESMTPSA id j4sm16070985wrp.51.2020.07.05.08.51.57 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 05 Jul 2020 08:51:57 -0700 (PDT) From: Mark Thompson To: ffmpeg-devel@ffmpeg.org Date: Sun, 5 Jul 2020 16:49:43 +0100 Message-Id: <20200705154946.401280-1-sw@jkqxz.net> X-Mailer: git-send-email 2.27.0 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 1/4] kmsgrab: Refactor and clean error cases 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" --- libavdevice/kmsgrab.c | 151 ++++++++++++++++++++++++++---------------- 1 file changed, 93 insertions(+), 58 deletions(-) diff --git a/libavdevice/kmsgrab.c b/libavdevice/kmsgrab.c index d0de774871..47ba15ca07 100644 --- a/libavdevice/kmsgrab.c +++ b/libavdevice/kmsgrab.c @@ -81,70 +81,42 @@ static void kmsgrab_free_frame(void *opaque, uint8_t *data) av_frame_free(&frame); } -static int kmsgrab_read_packet(AVFormatContext *avctx, AVPacket *pkt) +static int kmsgrab_get_fb(AVFormatContext *avctx, + drmModePlane *plane, + AVDRMFrameDescriptor *desc) { KMSGrabContext *ctx = avctx->priv_data; - drmModePlane *plane; - drmModeFB *fb; - AVDRMFrameDescriptor *desc; - AVFrame *frame; - int64_t now; + drmModeFB *fb = NULL; int err, fd; - now = av_gettime(); - if (ctx->frame_last) { - int64_t delay; - while (1) { - delay = ctx->frame_last + ctx->frame_delay - now; - if (delay <= 0) - break; - av_usleep(delay); - now = av_gettime(); - } - } - ctx->frame_last = now; - - plane = drmModeGetPlane(ctx->hwctx->fd, ctx->plane_id); - if (!plane) { - av_log(avctx, AV_LOG_ERROR, "Failed to get plane " - "%"PRIu32".\n", ctx->plane_id); - return AVERROR(EIO); - } - if (!plane->fb_id) { - av_log(avctx, AV_LOG_ERROR, "Plane %"PRIu32" no longer has " - "an associated framebuffer.\n", ctx->plane_id); - return AVERROR(EIO); - } - fb = drmModeGetFB(ctx->hwctx->fd, plane->fb_id); if (!fb) { av_log(avctx, AV_LOG_ERROR, "Failed to get framebuffer " "%"PRIu32".\n", plane->fb_id); - return AVERROR(EIO); + err = AVERROR(EIO); + goto fail; } if (fb->width != ctx->width || fb->height != ctx->height) { av_log(avctx, AV_LOG_ERROR, "Plane %"PRIu32" framebuffer " "dimensions changed: now %"PRIu32"x%"PRIu32".\n", ctx->plane_id, fb->width, fb->height); - return AVERROR(EIO); + err = AVERROR(EIO); + goto fail; } if (!fb->handle) { av_log(avctx, AV_LOG_ERROR, "No handle set on framebuffer.\n"); - return AVERROR(EIO); + err = AVERROR(EIO); + goto fail; } err = drmPrimeHandleToFD(ctx->hwctx->fd, fb->handle, O_RDONLY, &fd); if (err < 0) { - err = errno; + err = AVERROR(errno); av_log(avctx, AV_LOG_ERROR, "Failed to get PRIME fd from " "framebuffer handle: %s.\n", strerror(errno)); - return AVERROR(err); + goto fail; } - desc = av_mallocz(sizeof(*desc)); - if (!desc) - return AVERROR(ENOMEM); - *desc = (AVDRMFrameDescriptor) { .nb_objects = 1, .objects[0] = { @@ -164,31 +136,92 @@ static int kmsgrab_read_packet(AVFormatContext *avctx, AVPacket *pkt) }, }; + err = 0; +fail: + drmModeFreeFB(fb); + return err; +} + +static int kmsgrab_read_packet(AVFormatContext *avctx, AVPacket *pkt) +{ + KMSGrabContext *ctx = avctx->priv_data; + drmModePlane *plane = NULL; + AVDRMFrameDescriptor *desc = NULL; + AVFrame *frame = NULL; + int64_t now; + int err; + + now = av_gettime(); + if (ctx->frame_last) { + int64_t delay; + while (1) { + delay = ctx->frame_last + ctx->frame_delay - now; + if (delay <= 0) + break; + av_usleep(delay); + now = av_gettime(); + } + } + ctx->frame_last = now; + + plane = drmModeGetPlane(ctx->hwctx->fd, ctx->plane_id); + if (!plane) { + av_log(avctx, AV_LOG_ERROR, "Failed to get plane " + "%"PRIu32".\n", ctx->plane_id); + err = AVERROR(EIO); + goto fail; + } + if (!plane->fb_id) { + av_log(avctx, AV_LOG_ERROR, "Plane %"PRIu32" no longer has " + "an associated framebuffer.\n", ctx->plane_id); + err = AVERROR(EIO); + goto fail; + } + + desc = av_mallocz(sizeof(*desc)); + if (!desc) { + err = AVERROR(ENOMEM); + goto fail; + } + + err = kmsgrab_get_fb(avctx, plane, desc); + if (err < 0) + goto fail; + frame = av_frame_alloc(); - if (!frame) - return AVERROR(ENOMEM); + if (!frame) { + err = AVERROR(ENOMEM); + goto fail; + } frame->hw_frames_ctx = av_buffer_ref(ctx->frames_ref); - if (!frame->hw_frames_ctx) - return AVERROR(ENOMEM); + if (!frame->hw_frames_ctx) { + err = AVERROR(ENOMEM); + goto fail; + } frame->buf[0] = av_buffer_create((uint8_t*)desc, sizeof(*desc), &kmsgrab_free_desc, avctx, 0); - if (!frame->buf[0]) - return AVERROR(ENOMEM); + if (!frame->buf[0]) { + err = AVERROR(ENOMEM); + goto fail; + } frame->data[0] = (uint8_t*)desc; frame->format = AV_PIX_FMT_DRM_PRIME; - frame->width = fb->width; - frame->height = fb->height; + frame->width = ctx->width; + frame->height = ctx->height; - drmModeFreeFB(fb); drmModeFreePlane(plane); + plane = NULL; + desc = NULL; pkt->buf = av_buffer_create((uint8_t*)frame, sizeof(*frame), &kmsgrab_free_frame, avctx, 0); - if (!pkt->buf) - return AVERROR(ENOMEM); + if (!pkt->buf) { + err = AVERROR(ENOMEM); + goto fail; + } pkt->data = (uint8_t*)frame; pkt->size = sizeof(*frame); @@ -196,6 +229,12 @@ static int kmsgrab_read_packet(AVFormatContext *avctx, AVPacket *pkt) pkt->flags |= AV_PKT_FLAG_TRUSTED; return 0; + +fail: + drmModeFreePlane(plane); + av_freep(&desc); + av_frame_free(&frame); + return err; } static const struct { @@ -402,13 +441,9 @@ static av_cold int kmsgrab_read_header(AVFormatContext *avctx) err = 0; fail: - if (plane_res) - drmModeFreePlaneResources(plane_res); - if (plane) - drmModeFreePlane(plane); - if (fb) - drmModeFreeFB(fb); - + drmModeFreePlaneResources(plane_res); + drmModeFreePlane(plane); + drmModeFreeFB(fb); return err; }