From patchwork Thu May 7 19:19:34 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 19545 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 AF6B944A52F for ; Thu, 7 May 2020 22:20:21 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 93FC768AABE; Thu, 7 May 2020 22:20:21 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm1-f66.google.com (mail-wm1-f66.google.com [209.85.128.66]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id D93D068A7D8 for ; Thu, 7 May 2020 22:20:08 +0300 (EEST) Received: by mail-wm1-f66.google.com with SMTP id v8so8215560wma.0 for ; Thu, 07 May 2020 12:20:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=BfK/UenOsLxiUUIjCJm4unckz06jLOMm+RI9s2+yDTk=; b=KYPNLY09lAd8juXH+tgoYviOTLY4q2tgNrMviwVr23Ww1KIeWnhdQ5teBa4aBxE/Ob al6Mp5zm1n2m7X+IUlyCHI9aZ6ZJwUAer7YDmhOhF6UEghQwcFrBA4nObAbAaJQYtit+ KP73alnzdVhD5R6AAX8lMAwNy49f+fep6A/pd4hBU02i7vVlkUZAhUE4pDAAZYIpNBVc w4I0X98VzbjEYNTKeUxWI5dht600yQ+EtEBmSWsiXnMuTvr7nqEq3PqZ93I/TpQWRhr9 YLwZWDz/0dYMsfcLnCYbIW40cL+5dEHxAiEWiI02eqnac4rYZpqIIOIYmDP+vMMvo7M9 MBgw== 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:mime-version:content-transfer-encoding; bh=BfK/UenOsLxiUUIjCJm4unckz06jLOMm+RI9s2+yDTk=; b=q0P6MS77MZfh97Lcta9lNDdRv/v0O4+mkS3H1JecamvjVPh2Mza8GVHxy5dEZeHhvs sM2TzONyw90/9VOWr0soE50lyJ6eZ+Op2DWAX/NPGOAxb2r3ZXEfIqh0hI5KO5vRl3i+ 1wLu0T16l/kTx11DCb/z2CH5knwhYB1Z/OEdB8VfTt3LpNPNKolXJ3P+cR/xAdOPirnr 1A82P26HppAWbhbgULHIxcnnKlTEyhnH6q61fVoPDfxqUZxuIYnfXMeZ6YshIf+lCBza c288AtYQI+J87xVhzcwbPQKGNCzc+o3o0vTCStEBSWA5vA6sH9msyKtKJ/OwB5h+z79e V34g== X-Gm-Message-State: AGi0PuYDlKrspdWuYu+XKl5fyELKcSYy475z/uGJkZuhdlxFCavjxZ9T 1WNofupJJSjKC5yWWZHLl72NEqVC X-Google-Smtp-Source: APiQypKJKnlUV8HAD80kcZCKcj1rOXFQYRxSURIHtl1vDGdPEQtz10AP+caPDaNTfCSw/OtxLN63Tw== X-Received: by 2002:a1c:4b12:: with SMTP id y18mr12425073wma.149.1588879207871; Thu, 07 May 2020 12:20:07 -0700 (PDT) Received: from sblaptop.fritz.box (ipbcc1ab57.dynamic.kabel-deutschland.de. [188.193.171.87]) by smtp.gmail.com with ESMTPSA id m188sm8928964wme.47.2020.05.07.12.20.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 07 May 2020 12:20:07 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Thu, 7 May 2020 21:19:34 +0200 Message-Id: <20200507191937.16691-5-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200502171700.28991-8-andreas.rheinhardt@gmail.com> References: <20200502171700.28991-8-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 18/21] avformat/matroskaenc: Move mkv_write_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 Cc: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" This is needed so that it can access mkv_write_tag() and mkv_check_tag() without using forward declarations (which are unnecessary here). Signed-off-by: Andreas Rheinhardt --- libavformat/matroskaenc.c | 118 +++++++++++++++++++------------------- 1 file changed, 59 insertions(+), 59 deletions(-) diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index fad2c18e2b..9103d0a7be 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -1435,65 +1435,6 @@ static int mkv_write_tracks(AVFormatContext *s) MATROSKA_ID_TRACKS); } -static int mkv_write_chapters(AVFormatContext *s) -{ - MatroskaMuxContext *mkv = s->priv_data; - AVIOContext *dyn_cp = NULL, *pb = s->pb; - ebml_master editionentry; - AVRational scale = {1, 1E9}; - int i, ret; - - if (!s->nb_chapters || mkv->wrote_chapters) - return 0; - - for (i = 0; i < s->nb_chapters; i++) - if (!s->chapters[i]->id) { - mkv->chapter_id_offset = 1; - break; - } - - ret = start_ebml_master_crc32(&dyn_cp, mkv); - if (ret < 0) - return ret; - - editionentry = start_ebml_master(dyn_cp, MATROSKA_ID_EDITIONENTRY, 0); - if (mkv->mode != MODE_WEBM) - put_ebml_uint(dyn_cp, MATROSKA_ID_EDITIONFLAGDEFAULT, 1); - - for (i = 0; i < s->nb_chapters; i++) { - ebml_master chapteratom, chapterdisplay; - const AVChapter *c = s->chapters[i]; - int64_t chapterstart = av_rescale_q(c->start, c->time_base, scale); - int64_t chapterend = av_rescale_q(c->end, c->time_base, scale); - const AVDictionaryEntry *t; - if (chapterstart < 0 || chapterstart > chapterend || chapterend < 0) { - av_log(s, AV_LOG_ERROR, - "Invalid chapter start (%"PRId64") or end (%"PRId64").\n", - chapterstart, chapterend); - ffio_free_dyn_buf(&dyn_cp); - return AVERROR_INVALIDDATA; - } - - chapteratom = start_ebml_master(dyn_cp, MATROSKA_ID_CHAPTERATOM, 0); - put_ebml_uint(dyn_cp, MATROSKA_ID_CHAPTERUID, - (uint32_t)c->id + (uint64_t)mkv->chapter_id_offset); - put_ebml_uint(dyn_cp, MATROSKA_ID_CHAPTERTIMESTART, chapterstart); - put_ebml_uint(dyn_cp, MATROSKA_ID_CHAPTERTIMEEND, chapterend); - if ((t = av_dict_get(c->metadata, "title", NULL, 0))) { - chapterdisplay = start_ebml_master(dyn_cp, MATROSKA_ID_CHAPTERDISPLAY, 0); - put_ebml_string(dyn_cp, MATROSKA_ID_CHAPSTRING, t->value); - put_ebml_string(dyn_cp, MATROSKA_ID_CHAPLANG , "und"); - end_ebml_master(dyn_cp, chapterdisplay); - } - end_ebml_master(dyn_cp, chapteratom); - } - end_ebml_master(dyn_cp, editionentry); - mkv->wrote_chapters = 1; - - return end_ebml_master_crc32(pb, &dyn_cp, mkv, - MATROSKA_ID_CHAPTERS, 0, 0, 1); -} - static int mkv_write_simpletag(AVIOContext *pb, const AVDictionaryEntry *t) { uint8_t *key = av_strdup(t->key); @@ -1686,6 +1627,65 @@ static int mkv_write_tags(AVFormatContext *s) return 0; } +static int mkv_write_chapters(AVFormatContext *s) +{ + MatroskaMuxContext *mkv = s->priv_data; + AVIOContext *dyn_cp = NULL, *pb = s->pb; + ebml_master editionentry; + AVRational scale = {1, 1E9}; + int i, ret; + + if (!s->nb_chapters || mkv->wrote_chapters) + return 0; + + for (i = 0; i < s->nb_chapters; i++) + if (!s->chapters[i]->id) { + mkv->chapter_id_offset = 1; + break; + } + + ret = start_ebml_master_crc32(&dyn_cp, mkv); + if (ret < 0) + return ret; + + editionentry = start_ebml_master(dyn_cp, MATROSKA_ID_EDITIONENTRY, 0); + if (mkv->mode != MODE_WEBM) + put_ebml_uint(dyn_cp, MATROSKA_ID_EDITIONFLAGDEFAULT, 1); + + for (i = 0; i < s->nb_chapters; i++) { + ebml_master chapteratom, chapterdisplay; + const AVChapter *c = s->chapters[i]; + int64_t chapterstart = av_rescale_q(c->start, c->time_base, scale); + int64_t chapterend = av_rescale_q(c->end, c->time_base, scale); + const AVDictionaryEntry *t; + if (chapterstart < 0 || chapterstart > chapterend || chapterend < 0) { + av_log(s, AV_LOG_ERROR, + "Invalid chapter start (%"PRId64") or end (%"PRId64").\n", + chapterstart, chapterend); + ffio_free_dyn_buf(&dyn_cp); + return AVERROR_INVALIDDATA; + } + + chapteratom = start_ebml_master(dyn_cp, MATROSKA_ID_CHAPTERATOM, 0); + put_ebml_uint(dyn_cp, MATROSKA_ID_CHAPTERUID, + (uint32_t)c->id + (uint64_t)mkv->chapter_id_offset); + put_ebml_uint(dyn_cp, MATROSKA_ID_CHAPTERTIMESTART, chapterstart); + put_ebml_uint(dyn_cp, MATROSKA_ID_CHAPTERTIMEEND, chapterend); + if ((t = av_dict_get(c->metadata, "title", NULL, 0))) { + chapterdisplay = start_ebml_master(dyn_cp, MATROSKA_ID_CHAPTERDISPLAY, 0); + put_ebml_string(dyn_cp, MATROSKA_ID_CHAPSTRING, t->value); + put_ebml_string(dyn_cp, MATROSKA_ID_CHAPLANG , "und"); + end_ebml_master(dyn_cp, chapterdisplay); + } + end_ebml_master(dyn_cp, chapteratom); + } + end_ebml_master(dyn_cp, editionentry); + mkv->wrote_chapters = 1; + + return end_ebml_master_crc32(pb, &dyn_cp, mkv, + MATROSKA_ID_CHAPTERS, 0, 0, 1); +} + static const char *get_mimetype(const AVStream *st) { const AVDictionaryEntry *t;