From patchwork Wed Nov 27 06:11:21 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 16437 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 ABCBE4488D8 for ; Wed, 27 Nov 2019 08:11:35 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 8817E68B053; Wed, 27 Nov 2019 08:11:35 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f67.google.com (mail-wr1-f67.google.com [209.85.221.67]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id C0DA568B009 for ; Wed, 27 Nov 2019 08:11:28 +0200 (EET) Received: by mail-wr1-f67.google.com with SMTP id w9so25259542wrr.0 for ; Tue, 26 Nov 2019 22:11:28 -0800 (PST) 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=b1xtz3eaP1xJzflpMhD79UhRIjHCN0HfHqNTTzqrmTg=; b=vCQkcQ/XxOiAG6kOTui+5t/SB1eV74EBRbvJnQWqimMy4dykg6X4v2/kn/ZlK4bwK0 F3vT3AuRtWxL/ItAB+r4P2+Xs9VLIZTbgKdjZDos4RdFS3q/OXuMRruNH3Ld3cwUs4m0 2hX8NgPVrTXb+RSPmJEiJ3PXv8/geQ0GEaFTnHjEtrJwmEKww8Mkz1p653mCYLx/fvbh 4ky0VVuGiUO4WZ/1lzF/wedn037+Lcam3M6CqzrubviHWnrLMD23OSHqAudktBPoU+A1 49dWDCI/AKwK7HYQCmXQkvHoktNARE4dg0rYQujKnH73Ar5wpD8xqfox4kdatj8MbNja IsVQ== 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=b1xtz3eaP1xJzflpMhD79UhRIjHCN0HfHqNTTzqrmTg=; b=L2vB3Al7YEOm7XzBY4hCx6VRrAa8vIt4shongn4i04mTm5PebBTX6B7rec4lAUh5jd dZGuiIsmCm9qybdMrHUcDOJiBCxyloLxJnpUjZF6wfApl7CQdfwy7VdsJ9lY4QMzWLt4 jnsKI7KcekRTHzQDbe+btvKxu+e8IX/mF1eqAKFNo/GjuJD2jeT6K85prSnMnWIgXWdL oU16YtRz5E1Vuk6F0ikYP22tDFUl5TXk+ogiAtB6FYHa91VaZzjeOhpR3qfUVlKOeH8z zl7BAG8LcAjx7wCGt+YMBOMIbSqT1DR25VQaNyQViqzOmRJYZ06voYjxjbMo3YhCp5Lm GMaw== X-Gm-Message-State: APjAAAVjZcO1lWFN9Jqj3v4Lec8shp3zXVLXMc4DGQeTVuHEUjVQ6K13 OnbnAOX5pe90y5PqK4wlPZF6klmp X-Google-Smtp-Source: APXvYqwL4ZEK/u93Z+7pLptcDiATlxNIZ7wSe/rcxqnYtba0R6pZGVRatNRxF+LgzEVinEsKWW7oyQ== X-Received: by 2002:adf:f60a:: with SMTP id t10mr40974764wrp.29.1574835087937; Tue, 26 Nov 2019 22:11:27 -0800 (PST) Received: from sblaptop.fritz.box (ipbcc08e23.dynamic.kabel-deutschland.de. [188.192.142.35]) by smtp.gmail.com with ESMTPSA id c72sm5905271wmd.11.2019.11.26.22.11.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 26 Nov 2019 22:11:27 -0800 (PST) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Wed, 27 Nov 2019 07:11:21 +0100 Message-Id: <20191127061121.21139-1-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20191126112857.20426-1-andreas.rheinhardt@gmail.com> References: <20191126112857.20426-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v3] avformat/matroskaenc: Ignore attachments for track limit 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" Attachments are streams in FFmpeg, but they are not tracks in Matroska. Yet they were counted when checking a limit for the number of tracks that the Matroska muxer imposes. This is unnecessary and has been changed. (The Matroska file format actually has practically no limit on the number of tracks and this is purely what our muxer supports. But even if this limit were removed/relaxed in the future, it still makes sense to use small track numbers as this patch does, because greater numbers need more bytes to encode.) Signed-off-by: Andreas Rheinhardt --- Resending because of a merge conflict resulting from changing the type of uid to 64 bits. libavformat/matroskaenc.c | 36 ++++++++++++++++++++++-------------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index 86822371d1..0bef626482 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -96,6 +96,7 @@ typedef struct mkv_track { int write_dts; int has_cue; uint64_t uid; + int track_num; int sample_rate; int64_t sample_rate_offset; int64_t last_timestamp; @@ -1148,8 +1149,7 @@ static int mkv_write_track(AVFormatContext *s, MatroskaMuxContext *mkv, } track = start_ebml_master(pb, MATROSKA_ID_TRACKENTRY, 0); - put_ebml_uint (pb, MATROSKA_ID_TRACKNUMBER, - mkv->is_dash ? mkv->dash_track_number : i + 1); + put_ebml_uint (pb, MATROSKA_ID_TRACKNUMBER, mkv->tracks[i].track_num); put_ebml_uid (pb, MATROSKA_ID_TRACKUID, mkv->tracks[i].uid); put_ebml_uint (pb, MATROSKA_ID_TRACKFLAGLACING , 0); // no lacing (yet) @@ -2004,7 +2004,7 @@ static void mkv_write_block(AVFormatContext *s, AVIOContext *pb, int64_t ts = track->write_dts ? pkt->dts : pkt->pts; uint64_t additional_id = 0; int64_t discard_padding = 0; - uint8_t track_number = (mkv->is_dash ? mkv->dash_track_number : (pkt->stream_index + 1)); + int track_number = track->track_num; ebml_master block_group, block_additions, block_more; ts += track->ts_offset; @@ -2103,6 +2103,7 @@ static void mkv_write_block(AVFormatContext *s, AVIOContext *pb, static int mkv_write_vtt_blocks(AVFormatContext *s, AVIOContext *pb, AVPacket *pkt) { MatroskaMuxContext *mkv = s->priv_data; + mkv_track *track = &mkv->tracks[pkt->stream_index]; ebml_master blockgroup; int id_size, settings_size, size; uint8_t *id, *settings; @@ -2126,13 +2127,13 @@ static int mkv_write_vtt_blocks(AVFormatContext *s, AVIOContext *pb, AVPacket *p "duration %" PRId64 " at relative offset %" PRId64 " in cluster " "at offset %" PRId64 ". TrackNumber %d, keyframe %d\n", size, pkt->pts, pkt->dts, pkt->duration, avio_tell(pb), - mkv->cluster_pos, pkt->stream_index + 1, 1); + mkv->cluster_pos, track->track_num, 1); blockgroup = start_ebml_master(pb, MATROSKA_ID_BLOCKGROUP, mkv_blockgroup_size(size)); put_ebml_id(pb, MATROSKA_ID_BLOCK); put_ebml_num(pb, size + 4, 0); - avio_w8(pb, 0x80 | (pkt->stream_index + 1)); // this assumes stream_index is less than 126 + avio_w8(pb, 0x80 | track->track_num); // this assumes track_num is less than 126 avio_wb16(pb, ts - mkv->cluster_pts); avio_w8(pb, flags); avio_printf(pb, "%.*s\n%.*s\n%.*s", id_size, id, settings_size, settings, pkt->size, pkt->data); @@ -2271,7 +2272,7 @@ static int mkv_write_packet_internal(AVFormatContext *s, AVPacket *pkt, int add_ int ret; int64_t ts = track->write_dts ? pkt->dts : pkt->pts; int64_t relative_packet_pos; - int tracknum = mkv->is_dash ? mkv->dash_track_number : pkt->stream_index + 1; + int tracknum = track->track_num; if (ts == AV_NOPTS_VALUE) { av_log(s, AV_LOG_ERROR, "Can't write packet with unknown timestamp\n"); @@ -2608,14 +2609,7 @@ static int mkv_init(struct AVFormatContext *s) { MatroskaMuxContext *mkv = s->priv_data; AVLFG c; - int i; - - if (s->nb_streams > MAX_TRACKS) { - av_log(s, AV_LOG_ERROR, - "At most %d streams are supported for muxing in Matroska\n", - MAX_TRACKS); - return AVERROR(EINVAL); - } + int i, nb_tracks = 0; for (i = 0; i < s->nb_streams; i++) { if (s->streams[i]->codecpar->codec_id == AV_CODEC_ID_ATRAC3 || @@ -2650,6 +2644,7 @@ static int mkv_init(struct AVFormatContext *s) } for (i = 0; i < s->nb_streams; i++) { + AVStream *st = s->streams[i]; mkv_track *track = &mkv->tracks[i]; if (s->flags & AVFMT_FLAG_BITEXACT) { @@ -2660,6 +2655,19 @@ static int mkv_init(struct AVFormatContext *s) // ms precision is the de-facto standard timescale for mkv files avpriv_set_pts_info(s->streams[i], 64, 1, 1000); + + if (st->codecpar->codec_type == AVMEDIA_TYPE_ATTACHMENT) + continue; + + nb_tracks++; + track->track_num = mkv->is_dash ? mkv->dash_track_number : nb_tracks; + } + + if (nb_tracks > MAX_TRACKS) { + av_log(s, AV_LOG_ERROR, + "%d > "AV_STRINGIFY(MAX_TRACKS)" tracks (excluding attachments)" + " not supported for muxing in Matroska\n", nb_tracks); + return AVERROR(EINVAL); } return 0;