From patchwork Mon Sep 23 05:19:37 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marth64 X-Patchwork-Id: 51722 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:d154:0:b0:48e:c0f8:d0de with SMTP id bt20csp2245910vqb; Sun, 22 Sep 2024 22:29:17 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCVDirAh7Hz71In/OnzQ4FlEOd2vuhKpPVvmwNJS7c111OZcKsSQWjfuRpsJrUoRMllPMfp1QXJqPUUe1EWXPXYt@gmail.com X-Google-Smtp-Source: AGHT+IGjpig5PAHz4b+/LmdUDYH+dRz8sQDf+ghaiNyfXFZwKimDyhBWg1eA/oqc2JtWgb+4KNCK X-Received: by 2002:a17:907:9444:b0:a8d:2faf:d341 with SMTP id a640c23a62f3a-a90d4fdf18emr1235165066b.10.1727069357564; Sun, 22 Sep 2024 22:29:17 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1727069357; cv=none; d=google.com; s=arc-20240605; b=HsjYv8seYsvDNQlq0rSHhmfq0MYvOkV3Q1PzkiPYrSAk+qEw6pw606iYMADEXN6EE6 jVSXUEn2USmjMrjEFLBLTGHFORgsMNz57CpM1YUJUljRwftKErPFUJhIXcU33qdCKROE SL38+d2JGhP8M/ENF+AaK6Lo1omBqeUQ+9ijIHhlEXkvmv1QrOfGHKsx7PtzfXDOFotf w3X+OeB1jUgyUkgLnebp/j3ozjQXBPqCgZNU8DoI3+0RjvAsk9wkf3vNvqaslaIhvcQO VjgA05VB0qxoVuQ3ntOZcMlk5drykVJWZnTzsoN5/sutZqOpX+QXhmGvq6mNoCyyZzrW uM7A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to :message-id:date:to:from:dkim-signature:delivered-to; bh=U1rvw81cY55sRprpZy2+G2XwRhgQ8M5K9Y50kC6SeM4=; fh=PlWMzmI9LD2qGS7ipLrQl8z0iaQTLQLHzoGuXcBzpCg=; b=k/VU6evhLy7I9UeR6uUXsrzDYCOphQPSlcH5d7gCsWrY15p1TgiBCikksdV2+6fPyR MnBAJEPAlougDfx0NU/5HWk9M9QXD8rgkJq2J4HbScB1bgIvcRhsiNO8j30mdqL8pvhz mtMDuBxxKvkT90p0YqGiAr90xNhsJ3EiVQwXhnpYfg/AHxRTh/nNTLG8kQUlM7UtCMlT 0Ey+FkV2jafzpiCm5kwkF0mHjaxWnlCOtWQtt6vbFcJBdxFjGkgfSrSdJnidybSvEBph GZwZz+l3LwGtF++VmofdPdxw4uT+8nB5S/tGXLAOHSoDE4azq2EkmyTiTDzyoEhbiruP 4Mjw==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@proxyid.net header.s=google header.b=aPryyKan; 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; dara=fail header.i=@gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id a640c23a62f3a-a906109a234si1345290266b.181.2024.09.22.22.29.17; Sun, 22 Sep 2024 22:29:17 -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=@proxyid.net header.s=google header.b=aPryyKan; 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; dara=fail header.i=@gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 27D5D68DBE9; Mon, 23 Sep 2024 08:20:04 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-oo1-f98.google.com (mail-oo1-f98.google.com [209.85.161.98]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 5198D68DA3A for ; Mon, 23 Sep 2024 08:19:51 +0300 (EEST) Received: by mail-oo1-f98.google.com with SMTP id 006d021491bc7-5dc93fa5639so2064201eaf.1 for ; Sun, 22 Sep 2024 22:19:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=proxyid.net; s=google; t=1727068790; x=1727673590; darn=ffmpeg.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=Dv+9QsPaxdhTx3uEbz8qkYRyT2WbZAm/NLnb9voK3Bc=; b=aPryyKanv2UpVBy4FJ7TAFkxDfH6aa+CJ6pZ32ewGM2frrKoxCYv0rwKm2js6t7q7r ColUgPzihCFPSXavqLszg4Gc04z6OfuZVFWaQI3cRrau5uI9B3UMol5Ni/Xdwh+A/Rgz BEpZTHlBv0ErgmgrwuqUS05kc6vvhF2IU3RRAmq/q4u1EehtNVbF5zYajl3ZgQD5hAN9 1pl/PcZpmjRhOkdX+igZmVN12iAKSyE7mjXwyBK6EyTynmKRlto23nxrmTzx72F+Pxxj PlyLdmbPLaBHFrjEVCSFleFsABM8v77oRJaP/NEvEykjVMe/ifCPGTZOJYBVslYg1Vvu tPng== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1727068790; x=1727673590; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Dv+9QsPaxdhTx3uEbz8qkYRyT2WbZAm/NLnb9voK3Bc=; b=oyJlvjUPXTRJgtUdHTqICfyOfUf9sFUsK4PP57JygmfDnLuM/eYnzjjuhIKsax8zsV z/PA3HqV/cPU3sWASAGkDcPs3gx14ssGf+kU5eq8hG918yC5z0MntCHGGyIe49cWpdxW QYlmJjcXW9I0CT7YyHWHirF4IhGHlEDwvyZKrkCK6oYR0bRZoI930l2rEHHJIabio1ur 4cvit3yJ5NcV1edlnxoKYQszFR3Y1/38ldSXmUicIrmVJkO7D4vwolMNIjk7hDTok2hJ CIhI3PkuQAy3Jpj1S440brhSHd9ZWAGtM7l661NI/oubsKtJXwSTq16Vko2wSLORQK4R PTPQ== X-Gm-Message-State: AOJu0Yz/QKREvJofUPD2Ji3PDGbaw0/VX1FY33+2B5T7m0r6P3vEy4XV gnwndGv9HeY2fzr7zgfiIYXhwo6rkfMTa4AsRFGEuSm8vS/bdvNTrb/DOfx30kKIXf1vLCNVGlP 0MEE1tvj1h2jgKKjSc58YJhcyfVXNGSCFnG8kdXcu X-Received: by 2002:a05:6820:210:b0:5e3:b6f9:1f8e with SMTP id 006d021491bc7-5e58ba5ceb5mr5328800eaf.3.1727068789995; Sun, 22 Sep 2024 22:19:49 -0700 (PDT) Received: from localhost.localdomain (c-69-245-177-215.hsd1.il.comcast.net. [69.245.177.215]) by smtp-relay.gmail.com with ESMTPS id 006d021491bc7-5e3bc69661csm202010eaf.20.2024.09.22.22.19.49 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Sun, 22 Sep 2024 22:19:49 -0700 (PDT) X-Relaying-Domain: proxyid.net From: Marth64 To: ffmpeg-devel@ffmpeg.org Date: Mon, 23 Sep 2024 00:19:37 -0500 Message-Id: <20240923051941.54124-8-marth64@proxyid.net> X-Mailer: git-send-email 2.39.5 (Apple Git-154) In-Reply-To: <20240923051941.54124-1-marth64@proxyid.net> References: <20240923051941.54124-1-marth64@proxyid.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2 07/11] avformat/dvdvideodec: enable chapter calculation for menus 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: Marth64 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: MajbcdF3LaAu Menus are generally segmented by cell, so use them as the marker delimiters. Requires preindex option to be enabled. Signed-off-by: Marth64 --- doc/demuxers.texi | 1 - libavformat/dvdvideodec.c | 53 ++++++++++++++++++++++++++------------- 2 files changed, 35 insertions(+), 19 deletions(-) diff --git a/doc/demuxers.texi b/doc/demuxers.texi index 74b68778bd..a03e80732a 100644 --- a/doc/demuxers.texi +++ b/doc/demuxers.texi @@ -405,7 +405,6 @@ which requires a slow second pass read in order to index the chapter marker timestamps from NAV packets. This is non-ideal extra work for real optical drives. It is recommended and faster to use this option with a backup of the DVD structure stored on a hard drive. Not compatible with @option{pgc} and @option{pg}. -Not applicable to menus. Default is 0, false. @item trim @var{bool} diff --git a/libavformat/dvdvideodec.c b/libavformat/dvdvideodec.c index 066edaaa27..5df123ac44 100644 --- a/libavformat/dvdvideodec.c +++ b/libavformat/dvdvideodec.c @@ -909,19 +909,26 @@ static int dvdvideo_chapters_setup_preindex(AVFormatContext *s) { DVDVideoDemuxContext *c = s->priv_data; - int ret = 0, interrupt = 0; - int nb_chapters = 0, last_ptt = c->opt_chapter_start; + int ret, partn, last_partn; + int interrupt = 0, nb_chapters = 0; uint64_t cur_chapter_offset = 0, cur_chapter_duration = 0; DVDVideoPlaybackState state = {0}; uint8_t nav_buf[DVDVIDEO_BLOCK_SIZE]; - int nav_event; + int is_nav_packet; if (c->opt_chapter_start == c->opt_chapter_end) - return ret; + return 0; - if ((ret = dvdvideo_play_open(s, &state)) < 0) - return ret; + if (c->opt_menu) { + if ((ret = dvdvideo_menu_open(s, &state)) < 0) + return ret; + last_partn = state.celln; + } else { + if ((ret = dvdvideo_play_open(s, &state)) < 0) + return ret; + last_partn = c->opt_chapter_start; + } if (state.pgc->nr_of_programs == 1) goto end_close; @@ -930,15 +937,22 @@ static int dvdvideo_chapters_setup_preindex(AVFormatContext *s) "Indexing chapter markers, this will take a long time. Please wait...\n"); while (!(interrupt = ff_check_interrupt(&s->interrupt_callback))) { - ret = dvdvideo_play_next_ps_block(s, &state, nav_buf, DVDVIDEO_BLOCK_SIZE, - &nav_event, NULL); + if (c->opt_menu) + ret = dvdvideo_menu_next_ps_block(s, &state, nav_buf, DVDVIDEO_BLOCK_SIZE, &is_nav_packet, + NULL); + else + ret = dvdvideo_play_next_ps_block(s, &state, nav_buf, DVDVIDEO_BLOCK_SIZE, &is_nav_packet, + NULL); + if (ret < 0 && ret != AVERROR_EOF) goto end_close; - if (nav_event != DVDNAV_NAV_PACKET && ret != AVERROR_EOF) + if (!is_nav_packet && ret != AVERROR_EOF) continue; - if (state.ptt == last_ptt) { + partn = c->opt_menu ? state.celln : state.ptt; + + if (partn == last_partn) { cur_chapter_duration += state.vobu_duration; /* ensure we add the last chapter */ if (ret != AVERROR_EOF) @@ -957,7 +971,7 @@ static int dvdvideo_chapters_setup_preindex(AVFormatContext *s) cur_chapter_offset += cur_chapter_duration; cur_chapter_duration = state.vobu_duration; - last_ptt = state.ptt; + last_partn = partn; if (ret == AVERROR_EOF) break; @@ -977,7 +991,10 @@ static int dvdvideo_chapters_setup_preindex(AVFormatContext *s) ret = 0; end_close: - dvdvideo_play_close(s, &state); + if (c->opt_menu) + dvdvideo_menu_close(s, &state); + else + dvdvideo_play_close(s, &state); return ret; } @@ -1523,11 +1540,10 @@ static int dvdvideo_read_header(AVFormatContext *s) if (c->opt_menu) { if (c->opt_region || c->opt_title > 1 || - c->opt_preindex || c->opt_chapter_start > 1 || c->opt_chapter_end > 0) { av_log(s, AV_LOG_ERROR, "-menu is not compatible with the -region, -title, " - "-preindex, or -chapter_start/-chapter_end options\n"); + "or -chapter_start/-chapter_end options\n"); return AVERROR(EINVAL); } @@ -1544,10 +1560,11 @@ static int dvdvideo_read_header(AVFormatContext *s) c->opt_menu_lu = 1; } - if ((ret = dvdvideo_ifo_open(s)) < 0 || - (ret = dvdvideo_menu_open(s, &c->play_state)) < 0 || - (ret = dvdvideo_subdemux_open(s)) < 0 || - (ret = dvdvideo_video_stream_setup(s)) < 0 || + if ((ret = dvdvideo_ifo_open(s)) < 0 || + (c->opt_preindex && (ret = dvdvideo_chapters_setup_preindex(s)) < 0) || + (ret = dvdvideo_menu_open(s, &c->play_state)) < 0 || + (ret = dvdvideo_subdemux_open(s)) < 0 || + (ret = dvdvideo_video_stream_setup(s)) < 0 || (ret = dvdvideo_audio_stream_add_all(s)) < 0) return ret;