From patchwork Thu May 7 19:19:30 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 19538 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 7035A44A07C for ; Thu, 7 May 2020 22:19:51 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 4E97668A76C; Thu, 7 May 2020 22:19:51 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f68.google.com (mail-wr1-f68.google.com [209.85.221.68]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 14344689E33 for ; Thu, 7 May 2020 22:19:45 +0300 (EEST) Received: by mail-wr1-f68.google.com with SMTP id y4so7721520wrm.11 for ; Thu, 07 May 2020 12:19:45 -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=TqAPTojSueVJu377Drq2kQO9o9J4y+PAgGpCBaB/JBU=; b=ZWAdAdXMXskSgcM3rW6qIaRL5SK4ocbNunBBZ/o0FB1J3W1jCUaZydkIQwOqtu/Sg0 L3ruGRY/UcToCy3H0hnq++XEpP0QBrRz3gJj8y7DYcdMYf2i3ZOmCB6yPaMcytdWgGJ+ PvGCQah3ZSwJ/xtsJUTUclZR7u4vYj6Yx0lVqv9EFziObz+EHa7ar0Yl+K4jtu5StFzz OVF4DCKOy/9GIkhsHHktzop+sR4QFrKxxIKATlNkUAakQWRGLyri6eFVgpiiMsSuxVYG H8lAZuHfNAm8SaXuuue79ESej0FbJKQM8AsFGCO2Zf2YHdKfntv9h4KR4srgc57/A2Xm fyfA== 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=TqAPTojSueVJu377Drq2kQO9o9J4y+PAgGpCBaB/JBU=; b=tr9qHKYIqwpoVYTf9pfQR/dYbhtZP+YhuA28UQsMQE/orYhhhP257fpXqtryjvDEKV sRUk7W6yOXfyV3IQ8AancglNb53jz3xZMvcg8397eIswEQ98dSQx02TVOAuELFDnKyBD cMjdTMJNCImQKjz+enBm7Peb5/3Ttdd3/SZMPmfAGDbBT0cMDh2eFrC5/IA6kKkn2ANB kHSf1Hl2PknSFMYCV5bM6gCwSH8F9xTYIfn3vNo4UXlY0WOjcDrZd3oFG3DMFktDC+Uy DzKFp/HZukk1jWM6+U1Dyd0QyALm6G2jK9p3h6NGFAPAe7b7/ASPquF4QWaZKvSSDQqe bgZQ== X-Gm-Message-State: AGi0PuYImMqwvXtHvaT/dmUc33Gv+4M3agz/EPQHlYGHaDC8/WmSf8fA 1ZzBffUvLTFjR0l9cdTj8QuB6Bf1 X-Google-Smtp-Source: APiQypLzUsdXXOwqIh2EboxIjNLKgxTjLaeQRklmipSsS8wAHdTJsadcZdooYxY80WRxneMywOctXg== X-Received: by 2002:adf:9d8b:: with SMTP id p11mr16988112wre.322.1588879184137; Thu, 07 May 2020 12:19:44 -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.19.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 07 May 2020 12:19:43 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Thu, 7 May 2020 21:19:30 +0200 Message-Id: <20200507191937.16691-1-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 14/21] avformat/matroskaenc: Make mkv_write_video_projection() return void 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" It can't fail since 9c8aa86883f28fc27ca790b290c3be2d347b0d19. Signed-off-by: Andreas Rheinhardt --- libavformat/matroskaenc.c | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index d16d607269..158193738e 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -915,8 +915,8 @@ static void mkv_write_video_color(AVIOContext *pb, const AVStream *st, put_ebml_binary(pb, MATROSKA_ID_VIDEOCOLOR, colour, colorinfo_size); } -static int mkv_write_video_projection(AVFormatContext *s, AVIOContext *pb, - const AVStream *st) +static void mkv_write_video_projection(AVFormatContext *s, AVIOContext *pb, + const AVStream *st) { ebml_master projection; int side_data_size = 0; @@ -927,13 +927,13 @@ static int mkv_write_video_projection(AVFormatContext *s, AVIOContext *pb, &side_data_size); if (!side_data_size) - return 0; + return; if (spherical->projection != AV_SPHERICAL_EQUIRECTANGULAR && spherical->projection != AV_SPHERICAL_EQUIRECTANGULAR_TILE && spherical->projection != AV_SPHERICAL_CUBEMAP) { av_log(s, AV_LOG_WARNING, "Unknown projection type\n"); - return 0; + return; } // Maximally 4 8-byte elements with id-length 2 + 1 byte length field @@ -981,8 +981,6 @@ static int mkv_write_video_projection(AVFormatContext *s, AVIOContext *pb, (double) spherical->roll / (1 << 16)); end_ebml_master(pb, projection); - - return 0; } static void mkv_write_field_order(AVIOContext *pb, int mode, @@ -1306,10 +1304,8 @@ static int mkv_write_track(AVFormatContext *s, MatroskaMuxContext *mkv, put_ebml_binary(pb, MATROSKA_ID_VIDEOCOLORSPACE, &color_space, sizeof(color_space)); } mkv_write_video_color(pb, st, par); + mkv_write_video_projection(s, pb, st); - ret = mkv_write_video_projection(s, pb, st); - if (ret < 0) - return ret; end_ebml_master(pb, subinfo); break; From patchwork Thu May 7 19:19:31 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 19539 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 5DB3A44A52F for ; Thu, 7 May 2020 22:20:13 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 4349268A8E9; Thu, 7 May 2020 22:20:13 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f65.google.com (mail-wr1-f65.google.com [209.85.221.65]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 7AB8B68A450 for ; Thu, 7 May 2020 22:20:05 +0300 (EEST) Received: by mail-wr1-f65.google.com with SMTP id l18so7731811wrn.6 for ; Thu, 07 May 2020 12:20: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=YAjnkeKxkevgjVm+cg0+57BQGOhwwbtzsP/gGvZExHk=; b=EjgEoashUVWPOhUS6HSrfQXsB2rfqsj4v+Zt3fWPcNY21fy3bgCXGcGvVvftRZNtBV Zh4YmTRBtbnFanvFhXEVSrOrzcQyLl196G+CmpjLPwWeBbM7uXOJpgsqws/dj5fsbvhd HpOKz2MRRjn+FWT6NjUkMt4+OiiRWk91AUGHFR1Z9J0GCld3BqnqKa5juvMruNn50vJt EpRYKKNZLHhokSp+WFz9Hqzr/0MhS+kWh5G0iZfdLXK+TIUgyj3idsNQJvY2SUmN49j8 KiwuHu+XnxdR5I2Wz/x+ay280yAgSmm+kAg+lwwwnPyJGHqw/Tqj8ShnmcyDm0XznlGI QqaQ== 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=YAjnkeKxkevgjVm+cg0+57BQGOhwwbtzsP/gGvZExHk=; b=PSa7xP7Q6yisOi+81cWhYHvTk4k5dvU+y1K8z2xzGIWezH5ywavo08UIUelIpjCiEO lkHcMX4/N7A4SYwT0riha40XN/65QirJ6RtRLA2DumbaH97oCAErlmah9n/0/9ZdsNnX wP7PDgJcvYabf2inm8gMcK8mwn8/0voOUK3bEzam3ZEB5drRmaQPPjVVmCBfBdIXEBEC pJeCduVIeAzNrWivnf1qZEg2l+5Do6k4Gc+omNCNdw72N+rAOYiCfqYGXiW9OFhY1J6r iQPIHQgTWAAhopgFaHOeeHzJlfxNGE4TutbOOxHWXjXnFw9s1aNtDqoanFP1QgQ4Jh9b 0W1w== X-Gm-Message-State: AGi0Pua+qr9xpcUng8oq+BQX1DrxESKDtzUpGLk7gq5no2/5RH53Iwn9 2p4yKaghxQBbCJEXCLmo0ULKatIx X-Google-Smtp-Source: APiQypKAtUsh6UvgTqm4Gzz+rcSUXLD+qHFBLrQGKbcvlAIhgMEzE6zwGfpoF7uEVemmsjIiypqcyA== X-Received: by 2002:adf:fe90:: with SMTP id l16mr9511187wrr.222.1588879204727; Thu, 07 May 2020 12:20:04 -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.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 07 May 2020 12:20:04 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Thu, 7 May 2020 21:19:31 +0200 Message-Id: <20200507191937.16691-2-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 15/21] avformat/matroskaenc: Use av_stream_get_side_data() instead of loop 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" in mkv_write_stereo_mode(). Also check the size of the AVStereo3D side data. Signed-off-by: Andreas Rheinhardt --- libavformat/matroskaenc.c | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index 158193738e..4bb6a0e0d4 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -1029,6 +1029,8 @@ static int mkv_write_stereo_mode(AVFormatContext *s, AVIOContext *pb, int ret = 0; const AVDictionaryEntry *tag; MatroskaVideoStereoModeType format = MATROSKA_VIDEO_STEREOMODE_TYPE_NB; + const AVStereo3D *stereo; + int side_data_size = 0; *h_width = 1; *h_height = 1; @@ -1051,12 +1053,9 @@ static int mkv_write_stereo_mode(AVFormatContext *s, AVIOContext *pb, } } - // iterate to find the stereo3d side data - for (i = 0; i < st->nb_side_data; i++) { - AVPacketSideData sd = st->side_data[i]; - if (sd.type == AV_PKT_DATA_STEREO3D) { - AVStereo3D *stereo = (AVStereo3D *)sd.data; - + stereo = (const AVStereo3D*)av_stream_get_side_data(st, AV_PKT_DATA_STEREO3D, + &side_data_size); + if (side_data_size >= sizeof(AVStereo3D)) { switch (stereo->type) { case AV_STEREO3D_2D: format = MATROSKA_VIDEO_STEREOMODE_TYPE_MONO; @@ -1096,8 +1095,6 @@ static int mkv_write_stereo_mode(AVFormatContext *s, AVIOContext *pb, format++; break; } - break; - } } if (format == MATROSKA_VIDEO_STEREOMODE_TYPE_NB) From patchwork Thu May 7 19:19:32 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 19542 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 4943B44A52F for ; Thu, 7 May 2020 22:20:16 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 3AAD968AA4D; Thu, 7 May 2020 22:20:16 +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 8C55F68A71D for ; Thu, 7 May 2020 22:20:06 +0300 (EEST) Received: by mail-wr1-f67.google.com with SMTP id w7so6911477wre.13 for ; Thu, 07 May 2020 12:20:06 -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=/fK+WEwLcTCEicEc3qSo093kw3y75lpY3ocHPsFO0Z8=; b=BERGJBxhx+hvXlRthm3Cu+mTiJTBtMYlcBMQmP1UWqYRyH8iF1MC8dOp8woY3esOS2 v3lBSuu8ws4sz2iCYPAnxQC6iZ67seEphtHceDzUyO3hUXDuBX34ZqzLRK6eJHOd1X4b Rp2UTd552dTCoqyPUjqZsQJOhtDvBJZZw/Yqx2gpsw/aldN8zsLWcotd7bMQva71lOZd MF5EAuoUiHVmbMH9eR9CK8yh3BwKHG03LXmXjPNYAxO8gznrHLjXgqg9PsXlRt4pVRUz guMB6o2052fW3X54/Gb+tN4muqVTna8yCfocP939tQrn+NLok/Ql4nXpiK98+cOCBIXu WPUQ== 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=/fK+WEwLcTCEicEc3qSo093kw3y75lpY3ocHPsFO0Z8=; b=pP3/TXveLucYly9QXbwzhv02ahTNuIWC1CtGxLfJjSQu0l5Gq1uhGiz+F106mvoRF3 +ryKaM2alHL+EljhjwhrVJAxR0EW6JGHxurcBegBXiGE2ytxCbCz3yik2/xOlIeu04zE ofXYK4pdfob8gsCKMjm7VCc0RM0spvW6yvMwixelRX1JYRq15JCafTZR3wX3xGtddUGr 0CprWY5cDAduC5BESeyvECpGp385xqrzKTe9Vdk3R59MvBsyw4dZxjmT5LCpNjhaYgEl 1F6aGHdFd/0HOuoDRSppZehjj016+um9PRNYI7wECcMKlGN0oJC22kWQyKYcOcFDBmjn 8YXw== X-Gm-Message-State: AGi0PuZyXwj0jsH6sD3kMfNBRhaXaQuv9Gf820+TQGhqcHrW9RD+HMkW Z7zJ+oyPNcmtk+guvYMoPZoMCNpQ X-Google-Smtp-Source: APiQypJi71nFez8bTKzR1pfb28u3a+IPz0B7wuLWe6yjDOzLoMuz/ItAn/jTs6N+/s2Ara5e4/99qA== X-Received: by 2002:adf:b301:: with SMTP id j1mr16851911wrd.221.1588879205649; Thu, 07 May 2020 12:20:05 -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.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 07 May 2020 12:20:05 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Thu, 7 May 2020 21:19:32 +0200 Message-Id: <20200507191937.16691-3-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 16/21] avformat/matroskaenc: Clean up mkv_write_stereo_mode() 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" Mostly reindentation after the last commit. Also remove a variable that is always zero; move another variable to a more local scope and don't assign a value to a local variable immediately before leaving the function. Signed-off-by: Andreas Rheinhardt --- libavformat/matroskaenc.c | 87 +++++++++++++++++++-------------------- 1 file changed, 42 insertions(+), 45 deletions(-) diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index 4bb6a0e0d4..c888f537fb 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -1025,8 +1025,6 @@ static void mkv_write_field_order(AVIOContext *pb, int mode, static int mkv_write_stereo_mode(AVFormatContext *s, AVIOContext *pb, AVStream *st, int mode, int *h_width, int *h_height) { - int i; - int ret = 0; const AVDictionaryEntry *tag; MatroskaVideoStereoModeType format = MATROSKA_VIDEO_STEREOMODE_TYPE_NB; const AVStereo3D *stereo; @@ -1039,7 +1037,7 @@ static int mkv_write_stereo_mode(AVFormatContext *s, AVIOContext *pb, (tag = av_dict_get( s->metadata, "stereo_mode", NULL, 0))) { int stereo_mode = atoi(tag->value); - for (i=0; ivalue, ff_matroska_video_stereo_mode[i])){ stereo_mode = i; break; @@ -1056,49 +1054,49 @@ static int mkv_write_stereo_mode(AVFormatContext *s, AVIOContext *pb, stereo = (const AVStereo3D*)av_stream_get_side_data(st, AV_PKT_DATA_STEREO3D, &side_data_size); if (side_data_size >= sizeof(AVStereo3D)) { - switch (stereo->type) { - case AV_STEREO3D_2D: - format = MATROSKA_VIDEO_STEREOMODE_TYPE_MONO; - break; - case AV_STEREO3D_SIDEBYSIDE: - format = (stereo->flags & AV_STEREO3D_FLAG_INVERT) - ? MATROSKA_VIDEO_STEREOMODE_TYPE_RIGHT_LEFT - : MATROSKA_VIDEO_STEREOMODE_TYPE_LEFT_RIGHT; - *h_width = 2; - break; - case AV_STEREO3D_TOPBOTTOM: - format = MATROSKA_VIDEO_STEREOMODE_TYPE_TOP_BOTTOM; - if (stereo->flags & AV_STEREO3D_FLAG_INVERT) - format--; - *h_height = 2; - break; - case AV_STEREO3D_CHECKERBOARD: - format = MATROSKA_VIDEO_STEREOMODE_TYPE_CHECKERBOARD_LR; - if (stereo->flags & AV_STEREO3D_FLAG_INVERT) - format--; - break; - case AV_STEREO3D_LINES: - format = MATROSKA_VIDEO_STEREOMODE_TYPE_ROW_INTERLEAVED_LR; - if (stereo->flags & AV_STEREO3D_FLAG_INVERT) - format--; - *h_height = 2; - break; - case AV_STEREO3D_COLUMNS: - format = MATROSKA_VIDEO_STEREOMODE_TYPE_COL_INTERLEAVED_LR; - if (stereo->flags & AV_STEREO3D_FLAG_INVERT) - format--; - *h_width = 2; - break; - case AV_STEREO3D_FRAMESEQUENCE: - format = MATROSKA_VIDEO_STEREOMODE_TYPE_BOTH_EYES_BLOCK_LR; - if (stereo->flags & AV_STEREO3D_FLAG_INVERT) - format++; - break; - } + switch (stereo->type) { + case AV_STEREO3D_2D: + format = MATROSKA_VIDEO_STEREOMODE_TYPE_MONO; + break; + case AV_STEREO3D_SIDEBYSIDE: + format = (stereo->flags & AV_STEREO3D_FLAG_INVERT) + ? MATROSKA_VIDEO_STEREOMODE_TYPE_RIGHT_LEFT + : MATROSKA_VIDEO_STEREOMODE_TYPE_LEFT_RIGHT; + *h_width = 2; + break; + case AV_STEREO3D_TOPBOTTOM: + format = MATROSKA_VIDEO_STEREOMODE_TYPE_TOP_BOTTOM; + if (stereo->flags & AV_STEREO3D_FLAG_INVERT) + format--; + *h_height = 2; + break; + case AV_STEREO3D_CHECKERBOARD: + format = MATROSKA_VIDEO_STEREOMODE_TYPE_CHECKERBOARD_LR; + if (stereo->flags & AV_STEREO3D_FLAG_INVERT) + format--; + break; + case AV_STEREO3D_LINES: + format = MATROSKA_VIDEO_STEREOMODE_TYPE_ROW_INTERLEAVED_LR; + if (stereo->flags & AV_STEREO3D_FLAG_INVERT) + format--; + *h_height = 2; + break; + case AV_STEREO3D_COLUMNS: + format = MATROSKA_VIDEO_STEREOMODE_TYPE_COL_INTERLEAVED_LR; + if (stereo->flags & AV_STEREO3D_FLAG_INVERT) + format--; + *h_width = 2; + break; + case AV_STEREO3D_FRAMESEQUENCE: + format = MATROSKA_VIDEO_STEREOMODE_TYPE_BOTH_EYES_BLOCK_LR; + if (stereo->flags & AV_STEREO3D_FLAG_INVERT) + format++; + break; + } } if (format == MATROSKA_VIDEO_STEREOMODE_TYPE_NB) - return ret; + return 0; // if webm, do not write unsupported modes if ((mode == MODE_WEBM && @@ -1107,14 +1105,13 @@ static int mkv_write_stereo_mode(AVFormatContext *s, AVIOContext *pb, || format >= MATROSKA_VIDEO_STEREOMODE_TYPE_NB) { av_log(s, AV_LOG_ERROR, "The specified stereo mode is not valid.\n"); - format = MATROSKA_VIDEO_STEREOMODE_TYPE_NB; return AVERROR(EINVAL); } // write StereoMode if format is valid put_ebml_uint(pb, MATROSKA_ID_VIDEOSTEREOMODE, format); - return ret; + return 0; } static int mkv_write_track(AVFormatContext *s, MatroskaMuxContext *mkv, From patchwork Thu May 7 19:19:33 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 19544 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 82CBD44A52F for ; Thu, 7 May 2020 22:20:20 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 6A3DE68AAD7; Thu, 7 May 2020 22:20:20 +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 C320B68A764 for ; Thu, 7 May 2020 22:20:07 +0300 (EEST) Received: by mail-wr1-f67.google.com with SMTP id k1so7748464wrx.4 for ; Thu, 07 May 2020 12:20:07 -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=ggJ556ZqgZxR7s49ndS7LM/N9qXcboVwCI1LR8Mvgq0=; b=CwXjqZAszeWhI9AJ/jS6+8wcGWp1yRsZn0ErtlO0Par9t9m5Pmw5MFOF24y5baohhy d5xnXj7/YSnhHvO6VlcoFLIL1m9x5+szebApkWPsJIzoaqfHzk/PRs/hhsyRuf6anodi w94NE0PKnjwNrm3UZuVDDhZwMW+pIdQXwTTk9SiKL1jhldLkQeidz48DweRhek79OWcv uCDv2bbu9NA89oJBlv8xMhDvMDE9r3kcJRNvHywCTiZK7e50LQkHNcgvuPpDk8mXMprb FRu114irl62FY3uQBe3qjA2LqOYF09Tx0MkdRrUUNbbxWWNnc+ltZUH7gdPt2XLNjcMz HGTw== 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=ggJ556ZqgZxR7s49ndS7LM/N9qXcboVwCI1LR8Mvgq0=; b=kGmIaHGLhMe4keXe/BdkyynjlM+Kj+UkdmJozbxjixtMgqNITirGou/BGlKm0nu5oh L897NxAePKyDR8x+6JWu5qQVbd1rPagfWgCFbDH0FiGiqfsMGJ/PYjbf7U+yXsMNAQzL yJaKL+Ga3qpcOUkoTA8t3yuuK0XPmXgThbtGlFmrP7lh0Ryh4MNkEfazIpZ3EcmhLdX+ bHxblHOxlk0IM1tcOXJoozYKs9nP4GN610ydbXrJ6mPXDaxse+VxdGwL08bxd3zQUppj hKkhC8jDHx+2KUFmSN3+XfQrteePEtaOVwwXd1wxsH8Mlp1A97CCbBBh/27V0mAEGjd5 gwUw== X-Gm-Message-State: AGi0PubaLxu94V6rHq3/ZnpQsHIVlwG8d9RlqIrQJ50y88hokxaJuxSv 2k4bRnFL60NEvW70cU0Ridl7g59k X-Google-Smtp-Source: APiQypJxU+j5sTa8ykoF5Kk3YeThjAaG21tM6jB2IimwodvJIReAnkZIu0mtRcaRVLMgdfCdfS0BAw== X-Received: by 2002:a5d:526f:: with SMTP id l15mr16718025wrc.367.1588879206808; Thu, 07 May 2020 12:20:06 -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.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 07 May 2020 12:20:06 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Thu, 7 May 2020 21:19:33 +0200 Message-Id: <20200507191937.16691-4-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 17/21] avformat/matroskaenc: Allow a custom destination for writing Tags 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" Up until now, the Matroska muxer writes only one Tags level 1 element and therefore using a certain place to store the dynamic buffer used for writing it was hardcoded; yet the Matroska specifications allow an unlimited amount of Tags elements and we have reason to write a second one: If chapters are provided after writing the header, they are written when writing the trailer; yet the corresponding tags are ignored. This can be fixed by writing them in a second Tags element. Also use a MatroskaMuxContext * instead of an AVFormatContext * as parameter in mkv_write_tag() and mkv_write_tag_targets() as that is all these functions use. Signed-off-by: Andreas Rheinhardt --- libavformat/matroskaenc.c | 47 ++++++++++++++++++--------------------- 1 file changed, 22 insertions(+), 25 deletions(-) diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index c888f537fb..fad2c18e2b 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -1528,26 +1528,23 @@ static int mkv_write_simpletag(AVIOContext *pb, const AVDictionaryEntry *t) return 0; } -static int mkv_write_tag_targets(AVFormatContext *s, uint32_t elementid, - uint64_t uid, ebml_master *tag) +static int mkv_write_tag_targets(MatroskaMuxContext *mkv, AVIOContext **pb, + ebml_master *tag, uint32_t elementid, uint64_t uid) { - AVIOContext *pb; - MatroskaMuxContext *mkv = s->priv_data; ebml_master targets; int ret; - if (!mkv->tags.bc) { - ret = start_ebml_master_crc32(&mkv->tags.bc, mkv); + if (!*pb) { + ret = start_ebml_master_crc32(pb, mkv); if (ret < 0) return ret; } - pb = mkv->tags.bc; - *tag = start_ebml_master(pb, MATROSKA_ID_TAG, 0); - targets = start_ebml_master(pb, MATROSKA_ID_TAGTARGETS, 4 + 1 + 8); + *tag = start_ebml_master(*pb, MATROSKA_ID_TAG, 0); + targets = start_ebml_master(*pb, MATROSKA_ID_TAGTARGETS, 4 + 1 + 8); if (elementid) - put_ebml_uid(pb, elementid, uid); - end_ebml_master(pb, targets); + put_ebml_uid(*pb, elementid, uid); + end_ebml_master(*pb, targets); return 0; } @@ -1565,28 +1562,28 @@ static int mkv_check_tag_name(const char *name, uint32_t elementid) av_strcasecmp(name, "mimetype"))); } -static int mkv_write_tag(AVFormatContext *s, const AVDictionary *m, - uint32_t elementid, uint64_t uid, ebml_master *tag) +static int mkv_write_tag(MatroskaMuxContext *mkv, const AVDictionary *m, + AVIOContext **pb, ebml_master *tag, + uint32_t elementid, uint64_t uid) { - MatroskaMuxContext *mkv = s->priv_data; const AVDictionaryEntry *t = NULL; ebml_master tag2; int ret; - ret = mkv_write_tag_targets(s, elementid, uid, tag ? tag : &tag2); + ret = mkv_write_tag_targets(mkv, pb, tag ? tag : &tag2, elementid, uid); if (ret < 0) return ret; while ((t = av_dict_get(m, "", t, AV_DICT_IGNORE_SUFFIX))) { if (mkv_check_tag_name(t->key, elementid)) { - ret = mkv_write_simpletag(mkv->tags.bc, t); + ret = mkv_write_simpletag(*pb, t); if (ret < 0) return ret; } } if (!tag) - end_ebml_master(mkv->tags.bc, tag2); + end_ebml_master(*pb, tag2); return 0; } @@ -1611,7 +1608,7 @@ static int mkv_write_tags(AVFormatContext *s) ff_metadata_conv_ctx(s, ff_mkv_metadata_conv, NULL); if (mkv_check_tag(s->metadata, 0)) { - ret = mkv_write_tag(s, s->metadata, 0, 0, NULL); + ret = mkv_write_tag(mkv, s->metadata, &mkv->tags.bc, NULL, 0, 0); if (ret < 0) return ret; } @@ -1627,8 +1624,8 @@ static int mkv_write_tags(AVFormatContext *s) if (!tagp && !mkv_check_tag(st->metadata, MATROSKA_ID_TAGTARGETS_TRACKUID)) continue; - ret = mkv_write_tag(s, st->metadata, MATROSKA_ID_TAGTARGETS_TRACKUID, - track->uid, tagp); + ret = mkv_write_tag(mkv, st->metadata, &mkv->tags.bc, tagp, + MATROSKA_ID_TAGTARGETS_TRACKUID, track->uid); if (ret < 0) return ret; @@ -1656,9 +1653,9 @@ static int mkv_write_tags(AVFormatContext *s) if (!mkv_check_tag(ch->metadata, MATROSKA_ID_TAGTARGETS_CHAPTERUID)) continue; - ret = mkv_write_tag(s, ch->metadata, MATROSKA_ID_TAGTARGETS_CHAPTERUID, - (uint32_t)ch->id + (uint64_t)mkv->chapter_id_offset, - NULL); + ret = mkv_write_tag(mkv, ch->metadata, &mkv->tags.bc, NULL, + MATROSKA_ID_TAGTARGETS_CHAPTERUID, + (uint32_t)ch->id + (uint64_t)mkv->chapter_id_offset); if (ret < 0) return ret; } @@ -1675,8 +1672,8 @@ static int mkv_write_tags(AVFormatContext *s) if (!mkv_check_tag(st->metadata, MATROSKA_ID_TAGTARGETS_ATTACHUID)) continue; - ret = mkv_write_tag(s, st->metadata, MATROSKA_ID_TAGTARGETS_ATTACHUID, - track->uid, NULL); + ret = mkv_write_tag(mkv, st->metadata, &mkv->tags.bc, NULL, + MATROSKA_ID_TAGTARGETS_ATTACHUID, track->uid); if (ret < 0) return ret; } 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; From patchwork Thu May 7 19:19:35 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 19540 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 9728944A52F for ; Thu, 7 May 2020 22:20:14 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 80BA268A9CE; Thu, 7 May 2020 22:20:14 +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 C773B68A450 for ; Thu, 7 May 2020 22:20:10 +0300 (EEST) Received: by mail-wr1-f67.google.com with SMTP id h9so7762028wrt.0 for ; Thu, 07 May 2020 12:20:10 -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=NKAzciM1RmCyhXj9qaI9JTb2eOtEHqMkGUh1C7O3fC0=; b=gxCag/Ki3g4Pd1PceA2N7fXZYPESfqCZ52CaIPQfvxVAjIAkGeRhrtYoBjLnphF3xK 8dDr61o6iKCrXwCh2uhPU1Dx2oqNqd/CvWAT1NG0H2gE8LPHOz6GJ6MzhORujsGuiUm6 31r1oVFOhWzGD/a3CloRn+7XRzh9lZHC7Jgbw7rfkA7KPh34dpwvfNAXrTeue5PpNA5S kqd8d+alpn0/pPSIqje8Tig2WHmEWF9yuKhu8XQuSbw7IQnHKXw2pAw87W1JKZuN0t/X WXwo134kHKauXFP/uHAwZBXLnBdPmcY+xyMLy1DNLZj1pi87K2FgSpmCCayJP9TgKkrr pFiw== 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=NKAzciM1RmCyhXj9qaI9JTb2eOtEHqMkGUh1C7O3fC0=; b=Qb/xAKpk55BbZ0scMx5ftlVoZ/FRvfeCpR2Q2ZXPDJJ1LkpfMoYQjbwH5Zvy5uuAGV l/CdhF6c0JbKNBCbHDYsiov7TEbONDoTM3dlKNPi8onX2L1fZ14ZPL4+kG231p3eOG57 cH1HlX3RO0XIYiJoKfmum1lFDa9E+VExWWCLYC2NEDubxbrzx7P05eWDIF9Tql7jHwmt 2vg/B3IFJ1t+tqgVzjUZYY8C+0vnBiA38EiB5YE0fUiFOgU1zqetz4L6bHkdaUUW1TXS hWupyxc/zkvvfqotKyyd22Ar/0Z3yTD47G+KW/vHLjYbQNJdb+86Dd3cx+9mVFvpGm7b PzAQ== X-Gm-Message-State: AGi0Pub3z+LeDY0tXpnU/gDy/xoLSIXbSHj0VmWVb8BuxetzRaqQGm60 nrLCqtkcKSMqElPhhftXjK2SyrY9 X-Google-Smtp-Source: APiQypIwMtT7gpE1xckKsdVTxy1q2IZKb2edCBOgf3SM/xCqPCbAvO8YCx2nfNHB5KEle+dhc0PMRw== X-Received: by 2002:adf:b786:: with SMTP id s6mr7649280wre.287.1588879209070; Thu, 07 May 2020 12:20:09 -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.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 07 May 2020 12:20:08 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Thu, 7 May 2020 21:19:35 +0200 Message-Id: <20200507191937.16691-6-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 19/21] avformat/matroskaenc: Don't ignore tags of chapters written late 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" The Matroska muxer writes the Chapters early when chapters were already available when writing the header; in this case any tags pertaining to these chapters get written, too. Yet if no chapters had been supplied before writing the header, Chapters can also be written when writing the trailer if any are supplied. Tags belonging to these chapters were up until now completely ignored. This commit changes this: Writing the tags belonging to chapters has been moved to mkv_write_chapters(). If mkv_write_tags() has not been called yet (i.e. when chapters are written when writing the header), the AVIOContext for writing the ordinary Tags element is used, but not output, as this is left to mkv_write_tags() in order to only write one Tags element. Yet if mkv_write_tags() has already been called, mkv_write_chapters() will output a Tags element of its own which only contains the tags for chapters. When chapters are available initially, the corresponding tags will now be the first tags in the Tags element; but the ordering of tags in Tags is irrelevant anyway. This commit also makes chapter_id_offset local to mkv_write_chapters() as it is used only there and not reused at all. Potentially writing a second Tags element means that the maximum number of SeekHead entries had to be incremented. All the changes to FATE result from the ensuing increase in the amount of space reserved for the SeekHead (21 bytes more). Signed-off-by: Andreas Rheinhardt --- Support for multiple Tags elements will land in the demuxer in https://ffmpeg.org/pipermail/ffmpeg-devel/2020-May/261810.html. libavformat/matroskaenc.c | 70 ++++++++++++------- tests/fate/matroska.mak | 2 +- tests/fate/wavpack.mak | 4 +- tests/ref/fate/aac-autobsf-adtstoasc | 4 +- tests/ref/fate/binsub-mksenc | 2 +- tests/ref/fate/matroska-flac-extradata-update | 4 +- tests/ref/fate/rgb24-mkv | 4 +- tests/ref/fate/webm-dash-chapters | 4 +- tests/ref/lavf-fate/av1.mkv | 4 +- tests/ref/lavf/mka | 4 +- tests/ref/lavf/mkv | 4 +- tests/ref/lavf/mkv_attachment | 4 +- tests/ref/seek/lavf-mkv | 44 ++++++------ 13 files changed, 85 insertions(+), 69 deletions(-) diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index 9103d0a7be..7251d78d44 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -55,8 +55,8 @@ #include "libavcodec/mpeg4audio.h" /* Level 1 elements we create a SeekHead entry for: - * Info, Tracks, Chapters, Attachments, Tags and Cues */ -#define MAX_SEEKHEAD_ENTRIES 6 + * Info, Tracks, Chapters, Attachments, Tags (potentially twice) and Cues */ +#define MAX_SEEKHEAD_ENTRIES 7 #define IS_SEEKABLE(pb, mkv) (((pb)->seekable & AVIO_SEEKABLE_NORMAL) && \ !(mkv)->is_live) @@ -142,8 +142,8 @@ typedef struct MatroskaMuxContext { unsigned nb_attachments; int have_video; - uint32_t chapter_id_offset; int wrote_chapters; + int wrote_tags; int reserve_cues_space; int cluster_size_limit; @@ -1546,6 +1546,8 @@ static int mkv_write_tags(AVFormatContext *s) ebml_master tag, *tagp; int i, ret; + mkv->wrote_tags = 1; + ff_metadata_conv_ctx(s, ff_mkv_metadata_conv, NULL); if (mkv_check_tag(s->metadata, 0)) { @@ -1587,21 +1589,6 @@ static int mkv_write_tags(AVFormatContext *s) } } - if (mkv->mode != MODE_WEBM) { - for (i = 0; i < s->nb_chapters; i++) { - AVChapter *ch = s->chapters[i]; - - if (!mkv_check_tag(ch->metadata, MATROSKA_ID_TAGTARGETS_CHAPTERUID)) - continue; - - ret = mkv_write_tag(mkv, ch->metadata, &mkv->tags.bc, NULL, - MATROSKA_ID_TAGTARGETS_CHAPTERUID, - (uint32_t)ch->id + (uint64_t)mkv->chapter_id_offset); - if (ret < 0) - return ret; - } - } - if (mkv->nb_attachments && mkv->mode != MODE_WEBM) { for (i = 0; i < s->nb_streams; i++) { const mkv_track *track = &mkv->tracks[i]; @@ -1630,8 +1617,9 @@ static int mkv_write_tags(AVFormatContext *s) static int mkv_write_chapters(AVFormatContext *s) { MatroskaMuxContext *mkv = s->priv_data; - AVIOContext *dyn_cp = NULL, *pb = s->pb; + AVIOContext *dyn_cp = NULL, *dyn_tags = NULL, **tags, *pb = s->pb; ebml_master editionentry; + uint64_t chapter_id_offset = 0; AVRational scale = {1, 1E9}; int i, ret; @@ -1640,7 +1628,7 @@ static int mkv_write_chapters(AVFormatContext *s) for (i = 0; i < s->nb_chapters; i++) if (!s->chapters[i]->id) { - mkv->chapter_id_offset = 1; + chapter_id_offset = 1; break; } @@ -1649,8 +1637,13 @@ static int mkv_write_chapters(AVFormatContext *s) return ret; editionentry = start_ebml_master(dyn_cp, MATROSKA_ID_EDITIONENTRY, 0); - if (mkv->mode != MODE_WEBM) + if (mkv->mode != MODE_WEBM) { put_ebml_uint(dyn_cp, MATROSKA_ID_EDITIONFLAGDEFAULT, 1); + /* If mkv_write_tags() has already been called, then any tags + * corresponding to chapters will be put into a new Tags element. */ + tags = mkv->wrote_tags ? &dyn_tags : &mkv->tags.bc; + } else + tags = NULL; for (i = 0; i < s->nb_chapters; i++) { ebml_master chapteratom, chapterdisplay; @@ -1662,13 +1655,13 @@ static int mkv_write_chapters(AVFormatContext *s) 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; + ret = AVERROR_INVALIDDATA; + goto fail; } 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); + (uint32_t)c->id + 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))) { @@ -1678,12 +1671,34 @@ static int mkv_write_chapters(AVFormatContext *s) end_ebml_master(dyn_cp, chapterdisplay); } end_ebml_master(dyn_cp, chapteratom); + + if (tags && mkv_check_tag(c->metadata, MATROSKA_ID_TAGTARGETS_CHAPTERUID)) { + ret = mkv_write_tag(mkv, c->metadata, tags, NULL, + MATROSKA_ID_TAGTARGETS_CHAPTERUID, + (uint32_t)c->id + chapter_id_offset); + if (ret < 0) + goto fail; + } } 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); + ret = end_ebml_master_crc32(pb, &dyn_cp, mkv, MATROSKA_ID_CHAPTERS, 0, 0, 1); + if (ret < 0) + goto fail; + if (dyn_tags) + return end_ebml_master_crc32(pb, &dyn_tags, mkv, + MATROSKA_ID_TAGS, 0, 0, 1); + return 0; + +fail: + if (tags) { + /* tags == &mkv->tags.bc can only happen if mkv->tags.bc was + * initially NULL, so we never free older tags. */ + ffio_free_dyn_buf(tags); + } + ffio_free_dyn_buf(&dyn_cp); + return ret; } static const char *get_mimetype(const AVStream *st) @@ -1879,7 +1894,8 @@ static int mkv_write_header(AVFormatContext *s) return ret; } - /* Must come after mkv_write_chapters() because of chapter_id_offset */ + /* Must come after mkv_write_chapters() to write chapter tags + * into the same Tags element as the other tags. */ ret = mkv_write_tags(s); if (ret < 0) return ret; diff --git a/tests/fate/matroska.mak b/tests/fate/matroska.mak index b69f9792a8..17fbf46653 100644 --- a/tests/fate/matroska.mak +++ b/tests/fate/matroska.mak @@ -12,7 +12,7 @@ fate-matroska-prores-header-insertion-bz2: CMD = framecrc -i $(TARGET_SAMPLES)/m FATE_MATROSKA-$(call DEMMUX, MATROSKA, MATROSKA) += fate-matroska-remux fate-matroska-remux: CMD = md5pipe -i $(TARGET_SAMPLES)/vp9-test-vectors/vp90-2-2pass-akiyo.webm -color_trc 4 -c:v copy -fflags +bitexact -strict -2 -f matroska fate-matroska-remux: CMP = oneline -fate-matroska-remux: REF = acaf96f1832264d7f2845b16dd4ab082 +fate-matroska-remux: REF = 26fabd90326e3de4bb6afe1b216ce232 FATE_MATROSKA-$(call ALLYES, MATROSKA_DEMUXER VORBIS_PARSER) += fate-matroska-xiph-lacing fate-matroska-xiph-lacing: CMD = framecrc -i $(TARGET_SAMPLES)/mkv/xiph_lacing.mka -c:a copy diff --git a/tests/fate/wavpack.mak b/tests/fate/wavpack.mak index f98eaf9a0b..96b4d16bff 100644 --- a/tests/fate/wavpack.mak +++ b/tests/fate/wavpack.mak @@ -91,12 +91,12 @@ fate-wavpack-matroskamode: CMD = md5 -i $(TARGET_SAMPLES)/wavpack/special/matros FATE_WAVPACK-$(call DEMMUX, WV, MATROSKA) += fate-wavpack-matroska_mux-mono fate-wavpack-matroska_mux-mono: CMD = md5pipe -i $(TARGET_SAMPLES)/wavpack/num_channels/mono_16bit_int.wv -c copy -fflags +bitexact -f matroska fate-wavpack-matroska_mux-mono: CMP = oneline -fate-wavpack-matroska_mux-mono: REF = 5388d452e84958d204de9974bb4e3947 +fate-wavpack-matroska_mux-mono: REF = 0a10b6cd4d64c25ced75f52d1c6929a7 FATE_WAVPACK-$(call DEMMUX, WV, MATROSKA) += fate-wavpack-matroska_mux-61 fate-wavpack-matroska_mux-61: CMD = md5pipe -i $(TARGET_SAMPLES)/wavpack/num_channels/eva_2.22_6.1_16bit-partial.wv -c copy -fflags +bitexact -f matroska fate-wavpack-matroska_mux-61: CMP = oneline -fate-wavpack-matroska_mux-61: REF = c28c51910fc8f3806b1ada1efc82ccae +fate-wavpack-matroska_mux-61: REF = fee4bb1d6cf2d54f78eddc4483e7c990 FATE_SAMPLES_AVCONV += $(FATE_WAVPACK-yes) fate-wavpack: $(FATE_WAVPACK-yes) diff --git a/tests/ref/fate/aac-autobsf-adtstoasc b/tests/ref/fate/aac-autobsf-adtstoasc index c7eae5d6c1..bfb18aedd2 100644 --- a/tests/ref/fate/aac-autobsf-adtstoasc +++ b/tests/ref/fate/aac-autobsf-adtstoasc @@ -1,5 +1,5 @@ -6ffdfc7f11f06f94c22cda3a29bf576b *tests/data/fate/aac-autobsf-adtstoasc.matroska -6627 tests/data/fate/aac-autobsf-adtstoasc.matroska +5088977b7f13181d707a4077771e4552 *tests/data/fate/aac-autobsf-adtstoasc.matroska +6648 tests/data/fate/aac-autobsf-adtstoasc.matroska #extradata 0: 2, 0x0030001c #tb 0: 1/1000 #media_type 0: audio diff --git a/tests/ref/fate/binsub-mksenc b/tests/ref/fate/binsub-mksenc index 48a7a56260..4740569d9c 100644 --- a/tests/ref/fate/binsub-mksenc +++ b/tests/ref/fate/binsub-mksenc @@ -1 +1 @@ -8f355f39124753f89ead698e66f98098 +5706cf33f9ded660eb404275ec136127 diff --git a/tests/ref/fate/matroska-flac-extradata-update b/tests/ref/fate/matroska-flac-extradata-update index 8b575903e6..fb17bfea0b 100644 --- a/tests/ref/fate/matroska-flac-extradata-update +++ b/tests/ref/fate/matroska-flac-extradata-update @@ -1,5 +1,5 @@ -332bf4d9c92d24478d2a218e81223433 *tests/data/fate/matroska-flac-extradata-update.matroska -2011 tests/data/fate/matroska-flac-extradata-update.matroska +3c721898cf2cf3e2e6c43ad58952bd2d *tests/data/fate/matroska-flac-extradata-update.matroska +2032 tests/data/fate/matroska-flac-extradata-update.matroska #extradata 0: 34, 0x7acb09e7 #extradata 1: 34, 0x7acb09e7 #extradata 2: 34, 0x443402dd diff --git a/tests/ref/fate/rgb24-mkv b/tests/ref/fate/rgb24-mkv index c9438dffe4..34d028cbfd 100644 --- a/tests/ref/fate/rgb24-mkv +++ b/tests/ref/fate/rgb24-mkv @@ -1,5 +1,5 @@ -84474651e0744e7049e27dd19b8c18a8 *tests/data/fate/rgb24-mkv.matroska -58192 tests/data/fate/rgb24-mkv.matroska +fdc02d700dbe99315a9f0d928a9b935e *tests/data/fate/rgb24-mkv.matroska +58213 tests/data/fate/rgb24-mkv.matroska #tb 0: 1/10 #media_type 0: video #codec_id 0: rawvideo diff --git a/tests/ref/fate/webm-dash-chapters b/tests/ref/fate/webm-dash-chapters index 62d70cf73d..20ddfc031d 100644 --- a/tests/ref/fate/webm-dash-chapters +++ b/tests/ref/fate/webm-dash-chapters @@ -1,5 +1,5 @@ -eada3550583906e53114d30cb39126f5 *tests/data/fate/webm-dash-chapters.webm -111199 tests/data/fate/webm-dash-chapters.webm +e7fde2ecc9683a7a5296dab33b028653 *tests/data/fate/webm-dash-chapters.webm +111220 tests/data/fate/webm-dash-chapters.webm #extradata 0: 3469, 0xc6769ddc #tb 0: 1/1000 #media_type 0: audio diff --git a/tests/ref/lavf-fate/av1.mkv b/tests/ref/lavf-fate/av1.mkv index 3288a4481d..bc568a600e 100644 --- a/tests/ref/lavf-fate/av1.mkv +++ b/tests/ref/lavf-fate/av1.mkv @@ -1,3 +1,3 @@ -696074a7600fb5a02a434839d09201f0 *tests/data/lavf-fate/lavf.av1.mkv -55636 tests/data/lavf-fate/lavf.av1.mkv +bd676bfc89422755920099ec6ebdebe6 *tests/data/lavf-fate/lavf.av1.mkv +55657 tests/data/lavf-fate/lavf.av1.mkv tests/data/lavf-fate/lavf.av1.mkv CRC=0x7c27cc15 diff --git a/tests/ref/lavf/mka b/tests/ref/lavf/mka index 303867228c..e66b418b1d 100644 --- a/tests/ref/lavf/mka +++ b/tests/ref/lavf/mka @@ -1,3 +1,3 @@ -a67d0e6113de91ee53ee00b47fa6ff42 *tests/data/lavf/lavf.mka -43559 tests/data/lavf/lavf.mka +ea812a6619f4f0d266bec82fcfa54e78 *tests/data/lavf/lavf.mka +43580 tests/data/lavf/lavf.mka tests/data/lavf/lavf.mka CRC=0x3a1da17e diff --git a/tests/ref/lavf/mkv b/tests/ref/lavf/mkv index 9eaf5a4a11..0dd4521bc8 100644 --- a/tests/ref/lavf/mkv +++ b/tests/ref/lavf/mkv @@ -1,3 +1,3 @@ -e08b2effe716fb6b72f4a2cd2598b6d4 *tests/data/lavf/lavf.mkv -320411 tests/data/lavf/lavf.mkv +c984a76e996f43943d2fe9eb5f2495e4 *tests/data/lavf/lavf.mkv +320432 tests/data/lavf/lavf.mkv tests/data/lavf/lavf.mkv CRC=0xec6c3c68 diff --git a/tests/ref/lavf/mkv_attachment b/tests/ref/lavf/mkv_attachment index d6cd1cdf64..e0e1a22d9c 100644 --- a/tests/ref/lavf/mkv_attachment +++ b/tests/ref/lavf/mkv_attachment @@ -1,3 +1,3 @@ -aa2419820c590d0512ce199b7b59b9c9 *tests/data/lavf/lavf.mkv_attachment -472566 tests/data/lavf/lavf.mkv_attachment +8182124c770de9579e6d0d6759d01655 *tests/data/lavf/lavf.mkv_attachment +472587 tests/data/lavf/lavf.mkv_attachment tests/data/lavf/lavf.mkv_attachment CRC=0xec6c3c68 diff --git a/tests/ref/seek/lavf-mkv b/tests/ref/seek/lavf-mkv index 3299861d9c..8981f1d7b7 100644 --- a/tests/ref/seek/lavf-mkv +++ b/tests/ref/seek/lavf-mkv @@ -1,48 +1,48 @@ -ret: 0 st: 1 flags:1 dts: 0.000000 pts: 0.000000 pos: 659 size: 208 +ret: 0 st: 1 flags:1 dts: 0.000000 pts: 0.000000 pos: 680 size: 208 ret: 0 st:-1 flags:0 ts:-1.000000 -ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 875 size: 27837 +ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 896 size: 27837 ret: 0 st:-1 flags:1 ts: 1.894167 -ret: 0 st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292291 size: 27834 +ret: 0 st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292312 size: 27834 ret: 0 st: 0 flags:0 ts: 0.788000 -ret: 0 st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292291 size: 27834 +ret: 0 st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292312 size: 27834 ret: 0 st: 0 flags:1 ts:-0.317000 -ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 875 size: 27837 +ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 896 size: 27837 ret:-1 st: 1 flags:0 ts: 2.577000 ret: 0 st: 1 flags:1 ts: 1.471000 -ret: 0 st: 1 flags:1 dts: 0.993000 pts: 0.993000 pos: 320132 size: 209 +ret: 0 st: 1 flags:1 dts: 0.993000 pts: 0.993000 pos: 320153 size: 209 ret: 0 st:-1 flags:0 ts: 0.365002 -ret: 0 st: 0 flags:1 dts: 0.491000 pts: 0.491000 pos: 146843 size: 27925 +ret: 0 st: 0 flags:1 dts: 0.491000 pts: 0.491000 pos: 146864 size: 27925 ret: 0 st:-1 flags:1 ts:-0.740831 -ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 875 size: 27837 +ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 896 size: 27837 ret:-1 st: 0 flags:0 ts: 2.153000 ret: 0 st: 0 flags:1 ts: 1.048000 -ret: 0 st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292291 size: 27834 +ret: 0 st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292312 size: 27834 ret: 0 st: 1 flags:0 ts:-0.058000 -ret: 0 st: 1 flags:1 dts: 0.000000 pts: 0.000000 pos: 659 size: 208 +ret: 0 st: 1 flags:1 dts: 0.000000 pts: 0.000000 pos: 680 size: 208 ret: 0 st: 1 flags:1 ts: 2.836000 -ret: 0 st: 1 flags:1 dts: 0.993000 pts: 0.993000 pos: 320132 size: 209 +ret: 0 st: 1 flags:1 dts: 0.993000 pts: 0.993000 pos: 320153 size: 209 ret:-1 st:-1 flags:0 ts: 1.730004 ret: 0 st:-1 flags:1 ts: 0.624171 -ret: 0 st: 0 flags:1 dts: 0.491000 pts: 0.491000 pos: 146843 size: 27925 +ret: 0 st: 0 flags:1 dts: 0.491000 pts: 0.491000 pos: 146864 size: 27925 ret: 0 st: 0 flags:0 ts:-0.482000 -ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 875 size: 27837 +ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 896 size: 27837 ret: 0 st: 0 flags:1 ts: 2.413000 -ret: 0 st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292291 size: 27834 +ret: 0 st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292312 size: 27834 ret:-1 st: 1 flags:0 ts: 1.307000 ret: 0 st: 1 flags:1 ts: 0.201000 -ret: 0 st: 1 flags:1 dts: 0.000000 pts: 0.000000 pos: 659 size: 208 +ret: 0 st: 1 flags:1 dts: 0.000000 pts: 0.000000 pos: 680 size: 208 ret: 0 st:-1 flags:0 ts:-0.904994 -ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 875 size: 27837 +ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 896 size: 27837 ret: 0 st:-1 flags:1 ts: 1.989173 -ret: 0 st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292291 size: 27834 +ret: 0 st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292312 size: 27834 ret: 0 st: 0 flags:0 ts: 0.883000 -ret: 0 st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292291 size: 27834 +ret: 0 st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292312 size: 27834 ret: 0 st: 0 flags:1 ts:-0.222000 -ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 875 size: 27837 +ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 896 size: 27837 ret:-1 st: 1 flags:0 ts: 2.672000 ret: 0 st: 1 flags:1 ts: 1.566000 -ret: 0 st: 1 flags:1 dts: 0.993000 pts: 0.993000 pos: 320132 size: 209 +ret: 0 st: 1 flags:1 dts: 0.993000 pts: 0.993000 pos: 320153 size: 209 ret: 0 st:-1 flags:0 ts: 0.460008 -ret: 0 st: 0 flags:1 dts: 0.491000 pts: 0.491000 pos: 146843 size: 27925 +ret: 0 st: 0 flags:1 dts: 0.491000 pts: 0.491000 pos: 146864 size: 27925 ret: 0 st:-1 flags:1 ts:-0.645825 -ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 875 size: 27837 +ret: 0 st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos: 896 size: 27837 From patchwork Thu May 7 19:19:36 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 19541 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 92CD544A52F for ; Thu, 7 May 2020 22:20:15 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 7C5D468AA21; Thu, 7 May 2020 22:20:15 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f68.google.com (mail-wr1-f68.google.com [209.85.221.68]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id DEB0568A7D8 for ; Thu, 7 May 2020 22:20:10 +0300 (EEST) Received: by mail-wr1-f68.google.com with SMTP id h9so7762041wrt.0 for ; Thu, 07 May 2020 12:20:10 -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=86D5plMhz4gAXzEMO6tW96oIbkv2TQh2+4ctbWDHIVo=; b=Xhmsza5ZkvQ3V/wW5EicDzJk8jHhBc/eg8Hyrk8igrAVD0mAQFIVqqR0LXWQydSRuS U49PWYCxyz6kcXlG/LatIFTsx/EpNT5UzDsB31noE43+gmyn9xsNtwRM3EJNy5f4wDP7 lwKy9fJVRbDFChT9Lc2j3l0BYsx18TJObt5fJnJ2oQBY5nUKSx0/iiPJKAXo+PoD5n1E D7Bh/cghe+yrZ4EpfYLLslPU6wg7R3G/hFhMQ+Q+o90AD9I8dw8atNhJbw2ZAk+LJfl4 72EKAtkjFsfDaWTh+MEqJC954EQi57VJkbhBylf8kjPDs0UHyQ9X5orFtItM7W0M0iS1 Ib0Q== 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=86D5plMhz4gAXzEMO6tW96oIbkv2TQh2+4ctbWDHIVo=; b=Ez24mY9V1sEEHx+mBcy5hJ1AmkqMyvdhVsFlZrInIeVvdVRN3UuzLuv7YKxiC7GK3f Nhe7AAzM5KfPWj+da9qgicZ9MAZyz/sMtwuX4heCANpRfH6h+mK9y837v0kXVDBCez9A OsR53yKjPpN7uzbqzMu27ScMPGT3AQazIo+eBqspchMQK7e+bE7iQHAOiDk4a2MHsdTU RRV5dkivGRE2Sk3gvys85Qt/Gf77keEyOG9TDU6DaUyRsBgfJ2GxXvKqOBlm0lpjp16j xOrjHv/GdQhi069mRheRVN96aMCQNDtt51fddO8ED8CDBDjDFLLu7g7iKcHLtyzIlf3v cHwg== X-Gm-Message-State: AGi0Pubk9laEbnYVg7PLoYZEBrjQpuRGEm631P0PVQ0ANrWc6oWLhV40 Fqku9F3MNfPbLPEZs3qkktmmwbac X-Google-Smtp-Source: APiQypI5ukT5WgLaV+NgBcexchU5s3WJ8TRJcX+0tDHwSkJhy7kcg5rBl1F6wATyf0WUnyT+UrvqYg== X-Received: by 2002:a05:6000:1089:: with SMTP id y9mr17489357wrw.306.1588879210061; Thu, 07 May 2020 12:20:10 -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.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 07 May 2020 12:20:09 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Thu, 7 May 2020 21:19:36 +0200 Message-Id: <20200507191937.16691-7-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 20/21] avformat/matroskadec: Export FileDescription as title tag 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" Each AttachedFile in Matroska can have a FileDescription element that contains a human-friendly name for the attached file; yet this element has been ignored up until now. This commit changes this and exports it as title tag instead (the Matroska muxer mapped the title tag to the AttachedFile element since support for Attachments was added). Signed-off-by: Andreas Rheinhardt --- libavformat/matroskadec.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c index 981fb4bc20..455af9d591 100644 --- a/libavformat/matroskadec.c +++ b/libavformat/matroskadec.c @@ -259,6 +259,7 @@ typedef struct MatroskaTrack { typedef struct MatroskaAttachment { uint64_t uid; char *filename; + char *description; char *mime; EbmlBin bin; @@ -587,7 +588,7 @@ static EbmlSyntax matroska_attachment[] = { { MATROSKA_ID_FILENAME, EBML_UTF8, 0, offsetof(MatroskaAttachment, filename) }, { MATROSKA_ID_FILEMIMETYPE, EBML_STR, 0, offsetof(MatroskaAttachment, mime) }, { MATROSKA_ID_FILEDATA, EBML_BIN, 0, offsetof(MatroskaAttachment, bin) }, - { MATROSKA_ID_FILEDESC, EBML_NONE }, + { MATROSKA_ID_FILEDESC, EBML_UTF8, 0, offsetof(MatroskaAttachment, description) }, CHILD_OF(matroska_attachments) }; @@ -2911,6 +2912,8 @@ static int matroska_read_header(AVFormatContext *s) break; av_dict_set(&st->metadata, "filename", attachments[j].filename, 0); av_dict_set(&st->metadata, "mimetype", attachments[j].mime, 0); + if (attachments[j].description) + av_dict_set(&st->metadata, "title", attachments[j].description, 0); st->codecpar->codec_id = AV_CODEC_ID_NONE; for (i = 0; mkv_image_mime_tags[i].id != AV_CODEC_ID_NONE; i++) { From patchwork Thu May 7 19:19:37 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 19543 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 5DB8044A52F for ; Thu, 7 May 2020 22:20:19 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 495EE68A873; Thu, 7 May 2020 22:20:19 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f65.google.com (mail-wr1-f65.google.com [209.85.221.65]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 673AB68A764 for ; Thu, 7 May 2020 22:20:12 +0300 (EEST) Received: by mail-wr1-f65.google.com with SMTP id x17so7741558wrt.5 for ; Thu, 07 May 2020 12:20:12 -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=ydeg4oFfqTcyViGkn27VMLu5I4wQaNAcp8ziGy/49n4=; b=qHcvRpe98n/Y7eToWvSU/380BcYZuBquD9TWJt6oYyOGjnbo5adoUGxXKEgBlZ/CXq rxK7i6y+vDh9lLGiMHD0TX1YpqIsswQWEbjAIR4B0x8XgC5y8AuU6oxTP/SENMij7pR9 n08cm9nVBVeR/iMUPZSHsQQTXvFjNCSm9CgTXzQ6o4M0vDLdoRdtql07rflBpJwnQOtB dAcYWxsKU+vfb8VaarsX+rJ6QcU1MDMbew4S9ATI0TvtUz/1XkRdJOw7a/RUSin6QEEP RluClTG0jEsQsTfn7a8jIapRCVwE0ooM+ewZU7sx8nvHW+C9RKyk0ec+4Zm0wITpW6se uXoA== 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=ydeg4oFfqTcyViGkn27VMLu5I4wQaNAcp8ziGy/49n4=; b=GWb5J5um3ye1ZwVZOu0xEgGhUlWhRiDeyJLoPaDuCu/OMgnJpY4RFIeZWMmqNw0yBg qwzHVOdjZ3qizFPgahgUGLcEi8Fm+PbQTGLHDyxFlmKdMqjPhDbsMCTAFq1t36u0BvPk Lmo/BvqLXM5wbxO7o/OtYYCZBw8X0JppzGEwrMdk7tFCpjagrmVb9j63BiCZKh4YxMwI op2tbdy1SRzM/MGYtXTYsijqdWLVSqr8j8LbZMQqiti1UqxdkpkjvI7YkNB/RuL8cr4z of3Jk1R9AGn9TtUGC7Fg+/NGUW64DtCO4wuJyT0qmoVELmc44KnZRtdE9A1D8Uf4pwiY 3nJg== X-Gm-Message-State: AGi0PubfV8MP2WS2n7Z64wrwg3LcXaFn+0e74Gi0YkS2cKtOqvyTZJ8e 7Tv6QRanitXKL9l/POUlsDzbDCPG X-Google-Smtp-Source: APiQypJnMgn8W4n120L9dHikYBkLqLxAbvR8DHexRPXYxGfEaI9jR/BUjmaHNK0J6daNl+aipGE/QQ== X-Received: by 2002:adf:f0c9:: with SMTP id x9mr12742982wro.375.1588879211429; Thu, 07 May 2020 12:20:11 -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.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 07 May 2020 12:20:10 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Thu, 7 May 2020 21:19:37 +0200 Message-Id: <20200507191937.16691-8-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 21/21] doc/muxers: Document title tag for attachments 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" The Matroska muxer has always mapped the title tag to the FileDescription element for attachments streams since support for writing attachments was added in commit c7a63a521b5c165405e3577751d649529d09f0c5. This commit merely documents this fact. Signed-off-by: Andreas Rheinhardt --- doc/muxers.texi | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/muxers.texi b/doc/muxers.texi index abdeaf2b22..c598abbe66 100644 --- a/doc/muxers.texi +++ b/doc/muxers.texi @@ -1314,7 +1314,8 @@ The recognized metadata settings in this muxer are: @table @option @item title -Set title name provided to a single track. +Set title name provided to a single track. This gets mapped to +the FileDescription element for a stream written as attachment. @item language Specify the language of the track in the Matroska languages form.