From patchwork Thu Nov 10 19:29:07 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 1373 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.103.90.1 with SMTP id o1csp1028060vsb; Thu, 10 Nov 2016 11:44:13 -0800 (PST) X-Received: by 10.28.88.73 with SMTP id m70mr30297720wmb.19.1478807053136; Thu, 10 Nov 2016 11:44:13 -0800 (PST) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id pp3si6852651wjb.160.2016.11.10.11.44.12; Thu, 10 Nov 2016 11:44:13 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 012A2689DF8; Thu, 10 Nov 2016 21:44:07 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-vk0-f67.google.com (mail-vk0-f67.google.com [209.85.213.67]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id A3908689D27 for ; Thu, 10 Nov 2016 21:44:00 +0200 (EET) Received: by mail-vk0-f67.google.com with SMTP id p9so11623315vkd.1 for ; Thu, 10 Nov 2016 11:44:04 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:subject:date:message-id:in-reply-to:references; bh=xbWKEHaW8i1SpQJaUcsdTsqLhNa2l15WN8g6AmQsESM=; b=Ay66wrh5yj0Nq08fxG7CZs6CDN3fJp0l0yHoNWIwdk5Bxbm2nvETjyKJ0u7xEI74nE gA5iekz5IroWHnnYGyHMuMusKrAuq8FxXOY1n9Q4M7Nt9JtnW61Ao1SSkvNXK1MptLsa ny4OmxSE/liJEr4RFYnHNJ8Cgol0xkrygXAWJzyxhjo27Ab/uB1HxYTWAtX2oUaHVwZK kGUVQX8zK3Xv8cL3W2ktQbOF7jlEXYNntJ47w1EYx6bZcPTeYMeioLoDCKDM0eVXQR4h pIvdk2tv8Pas9kvSMEU22w8tJ8lDTK+tMYPJtFZOY+ZEgHpvgjUeALv75tnSv0Woxzq/ mMXw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=xbWKEHaW8i1SpQJaUcsdTsqLhNa2l15WN8g6AmQsESM=; b=G8Z+pdpRI4Gu1+ngJpYZBy38jVuusidbFMVd08u3EEWKU0LdDgB8C+rKFowk7KddYu YdZZYayn/wNgpjiuhoC6wisVIZWyzLlB32xr4jGWK1uDu3Q7AHprSblgh1cfAGyQJh94 ppb5b0LZ9tFD77fUJooDu2yvDRhD2L/FLjolJmqHtX5H46jE5bGAwdKdy5DbKspPMH9V AHNgjAnNpbyo/eG0r15BBbE0h7x2p+5t4d3t/TR/PTwPd+3N+X0/twVKbzDzjwo49V+K FKDt3GvUdE4wzPFLVWOiKVVqjx1qrU6gLGqc2Ld+rlSAHduR7OB1SU6i9Ori90UL2qaD G3yw== X-Gm-Message-State: ABUngveiRL8fmSEeHkxx/r/e4ny7Qn6u6bWnh9iibcgjIVB0/tE2QLnLE1UaXxyFq3Xd/g== X-Received: by 10.31.156.205 with SMTP id f196mr3935991vke.45.1478806196327; Thu, 10 Nov 2016 11:29:56 -0800 (PST) Received: from localhost.localdomain ([181.22.52.177]) by smtp.gmail.com with ESMTPSA id i62sm1397260uai.14.2016.11.10.11.29.55 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 10 Nov 2016 11:29:55 -0800 (PST) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Thu, 10 Nov 2016 16:29:07 -0300 Message-Id: <20161110192907.3332-1-jamrial@gmail.com> X-Mailer: git-send-email 2.10.1 In-Reply-To: <20161102195857.1664-2-jamrial@gmail.com> References: <20161102195857.1664-2-jamrial@gmail.com> Subject: [FFmpeg-devel] [PATCH 2/2 v2] avformat/matroskaenc: write updated STREAMINFO metadata for FLAC streams if available 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 MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" FLAC streams originating from the FLAC encoder send updated and more complete STREAMINFO metadata as part of the last packet, so write that to CodecPrivate instead of the incomplete one available in extradata during init. Signed-off-by: James Almer --- Now actually working on a per-track basis instead of only for one. libavformat/matroskaenc.c | 50 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index fb5591d..25ceeb2 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -93,6 +93,7 @@ typedef struct mkv_cues { typedef struct mkv_track { int write_dts; int has_cue; + int64_t codecpriv_offset; int64_t ts_offset; } mkv_track; @@ -1272,6 +1273,7 @@ static int mkv_write_track(AVFormatContext *s, MatroskaMuxContext *mkv, } if (mkv->mode != MODE_WEBM || par->codec_id != AV_CODEC_ID_WEBVTT) { + mkv->tracks[i].codecpriv_offset = avio_tell(pb); ret = mkv_write_codecprivate(s, pb, par, native_id, qt_id); if (ret < 0) return ret; @@ -2097,6 +2099,50 @@ static void mkv_start_new_cluster(AVFormatContext *s, AVPacket *pkt) avio_flush(s->pb); } +static int mkv_check_new_extra_data(AVFormatContext *s, AVPacket *pkt) +{ + MatroskaMuxContext *mkv = s->priv_data; + mkv_track *track = &mkv->tracks[pkt->stream_index]; + AVCodecParameters *par = s->streams[pkt->stream_index]->codecpar; + uint8_t *side_data; + int side_data_size = 0, ret; + + side_data = av_packet_get_side_data(pkt, AV_PKT_DATA_NEW_EXTRADATA, + &side_data_size); + + switch (par->codec_id) { + case AV_CODEC_ID_FLAC: + if (side_data_size && s->pb->seekable) { + AVCodecParameters *codecpriv_par; + int64_t curpos; + if (side_data_size != par->extradata_size) { + av_log(s, AV_LOG_ERROR, "Invalid FLAC STREAMINFO metadata for output stream %d\n", + pkt->stream_index); + return AVERROR(EINVAL); + } + codecpriv_par = avcodec_parameters_alloc(); + if (!codecpriv_par) + return AVERROR(ENOMEM); + ret = avcodec_parameters_copy(codecpriv_par, par); + if (ret < 0) + return ret; + memcpy(codecpriv_par->extradata, side_data, side_data_size); + curpos = avio_tell(mkv->tracks_bc); + avio_seek(mkv->tracks_bc, track->codecpriv_offset, SEEK_SET); + mkv_write_codecprivate(s, mkv->tracks_bc, codecpriv_par, 1, 0); + avio_seek(mkv->tracks_bc, curpos, SEEK_SET); + avcodec_parameters_free(&codecpriv_par); + } + break; + default: + if (side_data_size) + av_log(s, AV_LOG_DEBUG, "Ignoring new extradata in a packet for stream %d.\n", pkt->stream_index); + break; + } + + return 0; +} + static int mkv_write_packet_internal(AVFormatContext *s, AVPacket *pkt, int add_cue) { MatroskaMuxContext *mkv = s->priv_data; @@ -2189,6 +2235,10 @@ static int mkv_write_packet(AVFormatContext *s, AVPacket *pkt) int ret; int start_new_cluster; + ret = mkv_check_new_extra_data(s, pkt); + if (ret < 0) + return ret; + if (mkv->tracks[pkt->stream_index].write_dts) cluster_time = pkt->dts - mkv->cluster_pts; else