From patchwork Wed Nov 6 02:49:08 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 16128 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 810E8447DB1 for ; Wed, 6 Nov 2019 04:50:58 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 6B1A668B09C; Wed, 6 Nov 2019 04:50:58 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm1-f67.google.com (mail-wm1-f67.google.com [209.85.128.67]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 7263A68B090 for ; Wed, 6 Nov 2019 04:50:47 +0200 (EET) Received: by mail-wm1-f67.google.com with SMTP id a17so488500wmb.0 for ; Tue, 05 Nov 2019 18:50:47 -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=FAPIzQhcveTzdkFwpCUS8FAOMAb0/Pbnuy6Nbq5c1iY=; b=aNsKIKGUTPU9n+b5wWxy8jAFhtKjjHxcpJKNvL3iePzkvb7ZbhU5qFB9DR7Yn2ivgv oXyAymL0ljPqeOIZE8lwwMFm7Xrnv+VM2qvFKwto7zsCgMfmwJAtLW5A2LnY9ojMYzhY nHFe9tnhJVC7tV6tY4r4+bsRPDVhhnSqWncFDhEMEethkynCErHPj46u4p9Om8FDu8bv jkgK83uBadfBBn5VT+oB0gBwjZ5CXezkjKlfH33nsg9ARQ1jK0aQI5ZXpGHhEGcJ0d7y 3DJgEbJ6dzoAimC9CKhV2NSysp+2Y0+XeyPW7iR1KE5kE3Al6lHAbEnQ1gDWiZ7fuZ+q 2EXQ== 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=FAPIzQhcveTzdkFwpCUS8FAOMAb0/Pbnuy6Nbq5c1iY=; b=Oztdu0DP5S79mDqacAwkjSo6rO4w3vmMtTdAHFLiGwdiSSvIJYNhb+BVIH/dPjjbdZ Iv/wXNEJbmbMNP6E6ywjdyBtjVylitloNAuuzbw+L/rpA2IgBVbF6ip6Tp8yLYl3AlcP GI+ZuGtmlZs2hwbRkjFyDv0NfChnq4o4Dfk0/Zblbqvm+hOSN4ef85rvVtoMeVfaovxH ddP7P7ysG+V4EIFlcRIZDUDtJNckfflKZ7KO0MjgriyZNtfGuIX93+cnIYYKj32sFGe4 HnjVXT1m8esCiwXI5+OVWuFT8ItlahuxUT9UbmcUeKHX26e7EOnJ3+EY0Lu+BFuDRMCQ 3CtA== X-Gm-Message-State: APjAAAUC0Ge1R2CP7cGKExeTc/VDoFQS7yx/gJgPI+tnF6ymylS8vZp/ IuZr7WTCQ/F5//r5mQeEdR6qrF+a X-Google-Smtp-Source: APXvYqzJVH7lFfhvCPmI/DShzm61jCh2In1ccRf6zsck9ba+59+2lv2k7NAKwAeEUJWr62jzZWkJhw== X-Received: by 2002:a1c:48c4:: with SMTP id v187mr316777wma.27.1573008646732; Tue, 05 Nov 2019 18:50:46 -0800 (PST) Received: from sblaptop.fritz.box (ipbcc08937.dynamic.kabel-deutschland.de. [188.192.137.55]) by smtp.gmail.com with ESMTPSA id l13sm1281710wmh.12.2019.11.05.18.50.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 05 Nov 2019 18:50:46 -0800 (PST) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Wed, 6 Nov 2019 03:49:08 +0100 Message-Id: <20191106024922.19228-9-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20191106024922.19228-1-andreas.rheinhardt@gmail.com> References: <20191106024922.19228-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 09/23] 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 --- libavformat/matroskaenc.c | 34 +++++++++++++++++++++------------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index 15b5ec833f..0c3796f924 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -95,6 +95,7 @@ typedef struct mkv_cues { typedef struct mkv_track { int write_dts; int has_cue; + int track_num; uint32_t uid; int sample_rate; int64_t sample_rate_offset; @@ -1136,8 +1137,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_uint (pb, MATROSKA_ID_TRACKUID, mkv->tracks[i].uid); put_ebml_uint (pb, MATROSKA_ID_TRACKFLAGLACING , 0); // no lacing (yet) @@ -1995,7 +1995,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; @@ -2094,6 +2094,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; @@ -2123,7 +2124,7 @@ static int mkv_write_vtt_blocks(AVFormatContext *s, AVIOContext *pb, AVPacket *p 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); @@ -2262,7 +2263,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"); @@ -2601,14 +2602,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 || @@ -2638,6 +2632,7 @@ static int mkv_init(struct AVFormatContext *s) av_lfg_init(&c, av_get_random_seed()); 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) { @@ -2648,6 +2643,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;