From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTP id C83844887B for ; Sat, 20 Jan 2024 15:24:22 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 830F268D06F; Sat, 20 Jan 2024 17:24:19 +0200 (EET) Received: from mail-lj1-f170.google.com (mail-lj1-f170.google.com [209.85.208.170]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 8027568C8F6 for ; Sat, 20 Jan 2024 17:24:12 +0200 (EET) Received: by mail-lj1-f170.google.com with SMTP id 38308e7fff4ca-2cddb11b2e2so21697231fa.1 for ; Sat, 20 Jan 2024 07:24:12 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1705764250; x=1706369050; darn=ffmpeg.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=XLxj1p4SyKDWMmk7nddqLatiVArzjzK/0+I4DMeeSPk=; b=WE8kycdsDlDry918+46fJR2C2+v7haZJUq/n6l19qcgi6owfURsRUSAa22zwMWbubc LKMKro/j7e0qJEXpamagtZg2OChVlQloM//gNWs5/etZ/kX+5r9sg3AF3ZX/CFHJ8aNh 1WxN0cqfzqU5qUol2jPX8qfXbYPZ1WWaySP1ACoH+ILPEMU2rJ5CClTkaOzvlIRbKvg5 3Jumf+OlD4VdSy4MStHFoR93DUdJo3H6N1VKmfnQMap4BsFPRGWDl3SrLd4B2OpJU85Q E2vZhbxnYfb64RyKB2W8nvtaJZtaLPo46v3C3IQ2ap6TkVYEwURMm+h7DtT7pzaWbwRh 67wA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1705764250; x=1706369050; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=XLxj1p4SyKDWMmk7nddqLatiVArzjzK/0+I4DMeeSPk=; b=R0eSe70FdiwCHQkLcsWiSWuUeaJLK+IWZ+iuFbZbopqyCo+2BTQh3LOolKgCazLMs1 2RJ51EG573qh2k/aWta9xLwYJ2HPzcemdOre2EwM/QpO8tJKa2SjbcwQj6lh+OzQh2Gb VNOTRH8Kdb39cSkr7Wbu0KdDNcobBrRdQQfIQr26n7Cr3uybuUTpkajGCdLHWggpcI0T TBgKSMFtkKVLTkeB3QMl4RDbRw0raasBGuP9S81YAFZrZ2u7z8ThQC80Q7Urm0NJ3MG7 C6EpT1Xt3yzVipPSceNiC6D6d3yVuXDLsBLEktTsxYXbaCHq0ranj4EWMJYFqDJ9jPpf OfOw== X-Gm-Message-State: AOJu0Yx8oYmiABRPFcWOD0gYYO4Za7b2ciLIv+P2QywG3vcF/XEG7VCn ZzhrE1wgbNloz0xVymWrOdEwPxlddYqYTQaNLyL4pNzYvFY9441xlZTT2Imj X-Google-Smtp-Source: AGHT+IGHVeitv93H/5l/1mgYntOobNeoDoBbHv9lo00NoAB7MAcleQFctb2lu57ZhpUnGQoj3jl7+w== X-Received: by 2002:a05:6512:60e:b0:50f:105c:9c63 with SMTP id b14-20020a056512060e00b0050f105c9c63mr649167lfe.50.1705764250454; Sat, 20 Jan 2024 07:24:10 -0800 (PST) Received: from mariano (dynamic-adsl-84-220-189-10.clienti.tiscali.it. [84.220.189.10]) by smtp.gmail.com with ESMTPSA id vs7-20020a170907a58700b00a2caa85c56csm10546285ejc.38.2024.01.20.07.24.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 20 Jan 2024 07:24:10 -0800 (PST) Received: by mariano (Postfix, from userid 1000) id E9085BFCDC; Sat, 20 Jan 2024 16:24:08 +0100 (CET) From: Stefano Sabatini To: FFmpeg development discussions and patches Date: Sat, 20 Jan 2024 16:24:07 +0100 Message-Id: <20240120152408.606235-1-stefasab@gmail.com> X-Mailer: git-send-email 2.34.1 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 1/2] lavf/dvenc: improve error messaging X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 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: Stefano Sabatini Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: Provide useful information about the failure in the error message, do not let the user guess. --- libavformat/dvenc.c | 119 +++++++++++++++++++++++++++++++------------- 1 file changed, 85 insertions(+), 34 deletions(-) diff --git a/libavformat/dvenc.c b/libavformat/dvenc.c index 29d2dc47ac..9a89b8e4f5 100644 --- a/libavformat/dvenc.c +++ b/libavformat/dvenc.c @@ -39,6 +39,7 @@ #include "libavutil/fifo.h" #include "libavutil/mathematics.h" #include "libavutil/intreadwrite.h" +#include "libavutil/pixdesc.h" #include "libavutil/timecode.h" #define MAX_AUDIO_FRAME_SIZE 192000 // 1 second of 48khz 32-bit audio @@ -308,62 +309,112 @@ static int dv_assemble_frame(AVFormatContext *s, return 0; } -static DVMuxContext* dv_init_mux(AVFormatContext* s) +static int dv_init_mux(AVFormatContext* s) { DVMuxContext *c = s->priv_data; AVStream *vst = NULL; int i; - /* we support at most 1 video and 2 audio streams */ - if (s->nb_streams > 5) - return NULL; + if (s->nb_streams > 5) { + av_log(s, AV_LOG_ERROR, + "Invalid number of streams %d, the muxer supports at most 1 video channel and 4 audio channels.\n", + s->nb_streams); + return AVERROR_INVALIDDATA; + } /* We have to sort out where audio and where video stream is */ for (i=0; inb_streams; i++) { AVStream *st = s->streams[i]; switch (st->codecpar->codec_type) { case AVMEDIA_TYPE_VIDEO: - if (vst) return NULL; - if (st->codecpar->codec_id != AV_CODEC_ID_DVVIDEO) - goto bail_out; + if (vst) { + av_log(s, AV_LOG_ERROR, + "More than one video stream found, only one is accepted.\n"); + return AVERROR_INVALIDDATA; + } + if (st->codecpar->codec_id != AV_CODEC_ID_DVVIDEO) { + av_log(s, AV_LOG_ERROR, + "Invalid codec for video stream, only DVVIDEO is supported.\n"); + return AVERROR_INVALIDDATA; + } vst = st; break; case AVMEDIA_TYPE_AUDIO: - if (c->n_ast > 1) return NULL; + if (c->n_ast > 1) { + av_log(s, AV_LOG_ERROR, + "More than two audio streams found, at most 2 are accepted.\n"); + return AVERROR_INVALIDDATA; + } /* Some checks -- DV format is very picky about its incoming streams */ - if(st->codecpar->codec_id != AV_CODEC_ID_PCM_S16LE || - st->codecpar->ch_layout.nb_channels != 2) - goto bail_out; + if (st->codecpar->codec_id != AV_CODEC_ID_PCM_S16LE) { + av_log(s, AV_LOG_ERROR, + "Invalid codec for stream %d, only PCM_S16LE is supported\n.", i); + return AVERROR_INVALIDDATA; + } + if (st->codecpar->ch_layout.nb_channels != 2) { + av_log(s, AV_LOG_ERROR, + "Invalid number of audio channels %d for stream %d, only 2 channels are supported\n.", + st->codecpar->ch_layout.nb_channels, i); + return AVERROR_INVALIDDATA; + } if (st->codecpar->sample_rate != 48000 && st->codecpar->sample_rate != 44100 && - st->codecpar->sample_rate != 32000 ) - goto bail_out; + st->codecpar->sample_rate != 32000) { + av_log(s, AV_LOG_ERROR, + "Invalid audio sample rate %d for stream %d, only 32000, 44100, and 48000 are supported.\n", + st->codecpar->sample_rate, i); + return AVERROR_INVALIDDATA; + } c->ast[c->n_ast++] = st; break; default: - goto bail_out; + av_log(s, AV_LOG_ERROR, + "Invalid media type for stream %d, only audio and video are supported.\n", i); + return AVERROR_INVALIDDATA; } } - if (!vst) - goto bail_out; + if (!vst) { + av_log(s, AV_LOG_ERROR, + "Missing video stream, must be present\n"); + return AVERROR_INVALIDDATA; + } c->sys = av_dv_codec_profile2(vst->codecpar->width, vst->codecpar->height, vst->codecpar->format, vst->time_base); - if (!c->sys) - goto bail_out; + if (!c->sys) { + av_log(s, AV_LOG_ERROR, + "Could not find a valid video profile for size:%dx%d format:%s tb:%d%d\n", + vst->codecpar->width, vst->codecpar->height, + av_get_pix_fmt_name(vst->codecpar->format), + vst->time_base.num, vst->time_base.den); + return AVERROR_INVALIDDATA; + } if ((c->sys->time_base.den != 25 && c->sys->time_base.den != 50) || c->sys->time_base.num != 1) { - if (c->ast[0] && c->ast[0]->codecpar->sample_rate != 48000) - goto bail_out; - if (c->ast[1] && c->ast[1]->codecpar->sample_rate != 48000) - goto bail_out; + int j; + + for (j = 0; j < 2; j++) { + if (c->ast[j] && c->ast[j]->codecpar->sample_rate != 48000) { + av_log(s, AV_LOG_ERROR, + "Invalid sample rate %d for audio stream #%d for this video profile, must be 48000.\n", + c->ast[j]->codecpar->sample_rate, j); + return AVERROR_INVALIDDATA; + } + } } - if (((c->n_ast > 1) && (c->sys->n_difchan < 2)) || - ((c->n_ast > 2) && (c->sys->n_difchan < 4))) { - /* only 2 stereo pairs allowed in 50Mbps mode */ - goto bail_out; + if ((c->n_ast > 1) && (c->sys->n_difchan < 2)) { + av_log(s, AV_LOG_ERROR, + "Invalid number of channels %d, only 1 stereo pairs is allowed in 25Mps mode.\n", + c->n_ast); + return AVERROR_INVALIDDATA; + } + if ((c->n_ast > 2) && (c->sys->n_difchan < 4)) { + av_log(s, AV_LOG_ERROR, + "Invalid number of channels %d, only 2 stereo pairs are allowed in 50Mps mode.\n", + c->n_ast); + return AVERROR_INVALIDDATA; } /* Ok, everything seems to be in working order */ @@ -376,14 +427,14 @@ static DVMuxContext* dv_init_mux(AVFormatContext* s) if (!c->ast[i]) continue; c->audio_data[i] = av_fifo_alloc2(100 * MAX_AUDIO_FRAME_SIZE, 1, 0); - if (!c->audio_data[i]) - goto bail_out; + if (!c->audio_data[i]) { + av_log(s, AV_LOG_ERROR, + "Failed to allocate internal buffer.\n"); + return AVERROR(ENOMEM); + } } - return c; - -bail_out: - return NULL; + return 0; } static int dv_write_header(AVFormatContext *s) @@ -392,10 +443,10 @@ static int dv_write_header(AVFormatContext *s) DVMuxContext *dvc = s->priv_data; AVDictionaryEntry *tcr = av_dict_get(s->metadata, "timecode", NULL, 0); - if (!dv_init_mux(s)) { + if (dv_init_mux(s) < 0) { av_log(s, AV_LOG_ERROR, "Can't initialize DV format!\n" "Make sure that you supply exactly two streams:\n" - " video: 25fps or 29.97fps, audio: 2ch/48|44|32kHz/PCM\n" + " video: 25fps or 29.97fps, audio: 2ch/48000|44100|32000Hz/PCM\n" " (50Mbps allows an optional second audio stream)\n"); return -1; } -- 2.34.1 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".