From patchwork Mon Aug 31 12:20:11 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul B Mahol X-Patchwork-Id: 22018 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 5CD4644A853 for ; Mon, 31 Aug 2020 15:21:50 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 3A3E06880D5; Mon, 31 Aug 2020 15:21:50 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-ed1-f65.google.com (mail-ed1-f65.google.com [209.85.208.65]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 1BEAD6806AA for ; Mon, 31 Aug 2020 15:21:48 +0300 (EEST) Received: by mail-ed1-f65.google.com with SMTP id l23so5198940edv.11 for ; Mon, 31 Aug 2020 05:21:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id; bh=TK1UKq+KgVW2Ss3LHRfw2a35/EPqSw9emo7cJezQDrQ=; b=oeuiM2lE9flJ6F2X0mY6h4sNnxg4fKXm0OjPY8RoOggkUHkzZLX9GKQ/u0wVlQB9HC 12e2ugUT58AunF3N3VLqvsegbDw2s91cCgivX+9nZqtZM6PDIMYuUa2KztJb8KqA1LG3 alFdGa+UcN7mMtUuHoE8ztyDI3O+/2P51XAmfu+XzJLraZnAhm6iupFyuftkiQQALPsp +fI4w1v1wkBuKcxN9UW+U8Et8Kt1DFeP7IrI8ufDkgJvF371fW7a6/8/9zw30QAzIzO1 OdYsnF7+me0tkek8Y9aYbaiQHU7yrrejVmstTRTYfZ5FVxYVZpt3bcy8ZWw4BnVg2CTt b9Fg== 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; bh=TK1UKq+KgVW2Ss3LHRfw2a35/EPqSw9emo7cJezQDrQ=; b=DeuplSTXjjNquiHn9l4KDfwTng2t7YK/ff5tMvWRHsTIQRwFrrQhD3dy0rukBoCyeW DaR1s1V5HGg4fpx6u7vNEzKFQGDl2t5LifhtlHXFnCOwrVspcL9nJYoVKx1blPjKYbAH hMY6YAVmhWWyuNCuSWZp4ygJdUt+NqVWocMwtXV1MPQWI0eG8Xdre3IZ8M9MhCXsy9ES aeUBstIqEx3IE0GkdAyMhtgFDlBhWtRho6TZqWNoy2K1b7ZvNfbLQnx3FK0wpwc5dPv4 EOPXiDzBmmD7pfEQoHEU6tU2CNclP4emDu+u7FYu56XOLX0h214yxjZvSnJ4uXCGUuZS uo3w== X-Gm-Message-State: AOAM5317CVtj37kCPSb+nenauVUYm0EA4rPoqvyew+8qS3Wv1O/4Xrnk RJ7Cs0VZztHSgZPPNUggGCkaKUQOHS+j6Q== X-Google-Smtp-Source: ABdhPJyf/27um+tXHXkoXQWmLaVaFmcTxMsZaYTOPFjKQMNOvBoVv1gFqXrnf32ofDcvzWlVyPf5lg== X-Received: by 2002:a05:6402:b32:: with SMTP id bo18mr999378edb.201.1598876508149; Mon, 31 Aug 2020 05:21:48 -0700 (PDT) Received: from localhost.localdomain ([31.45.254.223]) by smtp.gmail.com with ESMTPSA id q7sm7452234edw.96.2020.08.31.05.21.47 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 31 Aug 2020 05:21:47 -0700 (PDT) From: Paul B Mahol To: ffmpeg-devel@ffmpeg.org Date: Mon, 31 Aug 2020 14:20:11 +0200 Message-Id: <20200831122011.2786-1-onemda@gmail.com> X-Mailer: git-send-email 2.17.1 Subject: [FFmpeg-devel] [PATCH] avformat/wavdec: add support for chapters 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 MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Support parsing 'cue ' and 'adtl' chunks. Signed-off-by: Paul B Mahol --- libavformat/wavdec.c | 50 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/libavformat/wavdec.c b/libavformat/wavdec.c index 5b3c481421..545f04c742 100644 --- a/libavformat/wavdec.c +++ b/libavformat/wavdec.c @@ -500,6 +500,7 @@ static int wav_read_header(AVFormatContext *s) wav->smv_cur_pt = 0; goto break_loop; case MKTAG('L', 'I', 'S', 'T'): + case MKTAG('l', 'i', 's', 't'): if (size < 4) { av_log(s, AV_LOG_ERROR, "too short LIST tag\n"); return AVERROR_INVALIDDATA; @@ -507,6 +508,37 @@ static int wav_read_header(AVFormatContext *s) switch (avio_rl32(pb)) { case MKTAG('I', 'N', 'F', 'O'): ff_read_riff_info(s, size - 4); + break; + case MKTAG('a', 'd', 't', 'l'): + if (s->nb_chapters > 0) { + while (avio_tell(pb) < next_tag_ofs) { + AVChapter *chapter = NULL; + char cue_label[512]; + unsigned id, sub_size; + + if (avio_feof(pb)) + break; + if (avio_rl32(pb) != MKTAG('l', 'a', 'b', 'l')) + break; + + sub_size = avio_rl32(pb); + if (sub_size < 5) + break; + id = avio_rl32(pb); + avio_get_str(pb, sub_size - 4, cue_label, sizeof(cue_label)); + avio_skip(pb, avio_tell(pb) & 1); + + for (int i = 0; i < s->nb_chapters; i++) { + if (s->chapters[i]->id == id) { + chapter = s->chapters[i]; + break; + } + } + if (chapter) + av_dict_set(&chapter->metadata, "title", cue_label, 0); + } + } + break; } break; case MKTAG('I', 'D', '3', ' '): @@ -521,6 +553,24 @@ static int wav_read_header(AVFormatContext *s) ff_id3v2_free_extra_meta(&id3v2_extra_meta); } break; + case MKTAG('c', 'u', 'e', ' '): + if (size >= 4 && got_fmt && st->codecpar->sample_rate > 0) { + AVRational tb = {1, st->codecpar->sample_rate}; + unsigned nb_cues = avio_rl32(pb); + + if (size >= nb_cues * 24LL) { + for (int i = 0; i < nb_cues; i++) { + unsigned offset, id = avio_rl32(pb); + + avio_skip(pb, 16); + offset = avio_rl32(pb); + + if (!avpriv_new_chapter(s, id, tb, offset, AV_NOPTS_VALUE, NULL)) + return AVERROR(ENOMEM); + } + } + } + break; } /* seek to next tag unless we know that we'll run into EOF */