From patchwork Sun Apr 5 15:59:15 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 18673 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 5605944BE3F for ; Sun, 5 Apr 2020 19:00:17 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 3D7D168B481; Sun, 5 Apr 2020 19:00:17 +0300 (EEST) 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 A164E68B1DC for ; Sun, 5 Apr 2020 19:00:05 +0300 (EEST) Received: by mail-wr1-f67.google.com with SMTP id p10so14409924wrt.6 for ; Sun, 05 Apr 2020 09:00:05 -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=ni8QELsvjygjV0XmGZmuEEmtu6WGqS4wGaXxHHzuylI=; b=HFgSidEimdWmVhAuFtSYMelEr09cLP2N6nhDRGULAChb27wAz2HI0u4/jJ+QldkmuH MqeNVDjIhvNjhTHCYk7Sm/SZbVJqeMxmnbmpH4Ny4oo4eUaXSLmHSpMuwvoU8fSu8+B8 JAaDHSI9AlA8lVzWTKfv7qwWwIY914xK5e8oytSUiX6e7QcVA029JzMM12xp3F3kU7v/ LCJED2lOXNLYqf2ahc3nT3llZvx7nxzO8STroMpwW0lLS5DzwvXa9zg86YpmYUq56TqX X4AJcjoY0xnijKh6G5Z+o8pj5zKk/O+6lS2arYk9vHdsjUzc2/QDScEBBH7mbeKvwbSQ 7jkQ== 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=ni8QELsvjygjV0XmGZmuEEmtu6WGqS4wGaXxHHzuylI=; b=O73hL4l+z3IPqy0rgf1P3OKJxJgKe8Mmb5HEBJ9qKBUmAnbUijYsoBK08QJgPfc80Y yJDnUdHc+BSR+X4SnVfgbByrBYwKsjU34VPIhhRBt3Ll9+28aXxkVn/jwqEbPNeXaJ3C h5RbAyaLNZJYfCKhz+WWqYpm+BOmsmmKhjKyxEFtkSheAnv8FcFLqdbDUb1QbMn/dnBZ 892eGBeTQCG3dPls1roDsFu5eHO7tSguhhOZ6wjicRfmcFXVtvO+Izdfz/6kwUHdTKUF f5LbLEqa83y7B4I6bIG4Xra5iLi7PttQEJvrtgGixSsrGbI3KQfxKpKcPEHtAO6Lmhn4 sG8w== X-Gm-Message-State: AGi0PuZgG/Opz+slQn67+j7teW22MzllxPaSXbM0b+K80ZWipV9HG715 xRQ/zLLpPt2pvedAhyoaK/FwbPfX X-Google-Smtp-Source: APiQypLTNArSzCyK4VE2IjkHQ2Vr0Bd0qmQtnTqa7Ywx0MWA8dqY8zBKbyY86UvSnlyEIy7bRE2vxw== X-Received: by 2002:a5d:4acd:: with SMTP id y13mr19547016wrs.61.1586102404580; Sun, 05 Apr 2020 09:00:04 -0700 (PDT) Received: from sblaptop.fritz.box (ipbcc1ab57.dynamic.kabel-deutschland.de. [188.193.171.87]) by smtp.gmail.com with ESMTPSA id v21sm20014567wmh.26.2020.04.05.09.00.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 05 Apr 2020 09:00:04 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Sun, 5 Apr 2020 17:59:15 +0200 Message-Id: <20200405155928.9323-8-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200405155928.9323-1-andreas.rheinhardt@gmail.com> References: <20200405155928.9323-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 07/20] avformat/matroskaenc: Ignore AttachedFiles 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. Also use unsigned variables for the variables denoting TrackNumbers as negative TrackNumbers are impossible. (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 TrackNumbers as this patch does, because greater numbers need more bytes to encode.) Signed-off-by: Andreas Rheinhardt --- libavformat/matroskaenc.c | 39 ++++++++++++++++++++++++--------------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index cf2bb7b933..4607ddd6ad 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -95,6 +95,7 @@ typedef struct mkv_track { int write_dts; int has_cue; uint64_t uid; + unsigned track_num; int sample_rate; int64_t sample_rate_offset; int64_t last_timestamp; @@ -1112,8 +1113,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) @@ -1966,7 +1966,7 @@ static int mkv_write_block(AVFormatContext *s, AVIOContext *pb, int64_t ts = track->write_dts ? pkt->dts : pkt->pts; uint64_t additional_id; int64_t discard_padding = 0; - uint8_t track_number = (mkv->is_dash ? mkv->dash_track_number : (pkt->stream_index + 1)); + unsigned track_number = track->track_num; ebml_master block_group, block_additions, block_more; ts += track->ts_offset; @@ -1976,7 +1976,7 @@ static int mkv_write_block(AVFormatContext *s, AVIOContext *pb, av_log(s, AV_LOG_DEBUG, "Writing block of size %d with pts %" PRId64 ", dts %" PRId64 ", " "duration %" PRId64 " at relative offset %" PRId64 " in cluster " - "at offset %" PRId64 ". TrackNumber %d, keyframe %d\n", + "at offset %" PRId64 ". TrackNumber %u, keyframe %d\n", pkt->size, pkt->pts, pkt->dts, pkt->duration, avio_tell(pb), mkv->cluster_pos, track_number, keyframe != 0); @@ -2074,6 +2074,7 @@ static int 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; @@ -2095,15 +2096,15 @@ static int mkv_write_vtt_blocks(AVFormatContext *s, AVIOContext *pb, AVPacket *p av_log(s, AV_LOG_DEBUG, "Writing block of size %d with pts %" PRId64 ", dts %" PRId64 ", " "duration %" PRId64 " at relative offset %" PRId64 " in cluster " - "at offset %" PRId64 ". TrackNumber %d, keyframe %d\n", + "at offset %" PRId64 ". TrackNumber %u, 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); @@ -2232,7 +2233,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; + unsigned tracknum = track->track_num; if (ts == AV_NOPTS_VALUE) { av_log(s, AV_LOG_ERROR, "Can't write packet with unknown timestamp\n"); @@ -2587,15 +2588,9 @@ static int mkv_init(struct AVFormatContext *s) { MatroskaMuxContext *mkv = s->priv_data; AVLFG c; + unsigned nb_tracks = 0; 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); - } - for (i = 0; i < s->nb_streams; i++) { if (s->streams[i]->codecpar->codec_id == AV_CODEC_ID_ATRAC3 || s->streams[i]->codecpar->codec_id == AV_CODEC_ID_COOK || @@ -2629,6 +2624,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) { @@ -2639,6 +2635,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, + "%u > "AV_STRINGIFY(MAX_TRACKS)" tracks (excluding attachments)" + " not supported for muxing in Matroska\n", nb_tracks); + return AVERROR(EINVAL); } return 0;