From patchwork Wed Nov 2 19:58:57 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 1263 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.103.90.1 with SMTP id o1csp449904vsb; Wed, 2 Nov 2016 13:11:44 -0700 (PDT) X-Received: by 10.194.117.232 with SMTP id kh8mr4333551wjb.159.1478117504689; Wed, 02 Nov 2016 13:11:44 -0700 (PDT) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id pj9si4576070wjb.279.2016.11.02.13.11.44; Wed, 02 Nov 2016 13:11:44 -0700 (PDT) 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 75B17689B0E; Wed, 2 Nov 2016 22:11:39 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-ua0-f195.google.com (mail-ua0-f195.google.com [209.85.217.195]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id EE936689AA6 for ; Wed, 2 Nov 2016 22:11:31 +0200 (EET) Received: by mail-ua0-f195.google.com with SMTP id 20so1052998uak.0 for ; Wed, 02 Nov 2016 13:11:35 -0700 (PDT) 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=rcBpUYTbcVwTOSeA+VcO3TQig6Mv1hB45yDPaGp6vSk=; b=fVmAC7LZZ1iBHnEtCjBUCTqNdF4PsTwuakvuv2teNUz070zbNVoHz+AHUFYfFPppiu w/zP8FZFDMwT/ux9/tEfrY6LY8Zr7QrQR69P/uR4dFLUVDfDAkGmiYVE+cww4D30Yx7C EiaS/8CB80Lk024sq642LEScCRqUa/NbLy7ulbsL5oUPhOqU1vNoZ8fNz2IxUj2TOBag rMZBxIzBDeqoP3nQ1wvQRVODMT/DOinDF8fngkUvsnTLPZzfSOXn1izgJtAp34DFlrbq 9o8JswtQLtHaRJUAnBy24BRTNKVVi1/44TwxcjBnYbb3DnRy32af0BUj7qHsvmbMAytM /sPQ== 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=rcBpUYTbcVwTOSeA+VcO3TQig6Mv1hB45yDPaGp6vSk=; b=KWCcJuVIRyOQ/JOCN+uLWMmgL2ky3GSzxCdv43+TF6w2MBeX3ULz3J63eyH5a7+knT zlJtBdzCqbVOJGg4YeDmyVMQXgmg4/rM9O13uU4gtjVCN2bpNqZHnRy8wDb490wNfles Sh2O0SJ1kstEZmVpJwrW2385D118Pty1k/H0yD8vcnEfXzLw85cq7+u2Zy7mGIGcOTIf HVoBNl0RzR8kTgF3ar+iQDBqIvZLzKTJLWfpkLYyd/nfwKqUvxk2QqDRJe6ZjnUl4Z5+ 7em80O2GclNjPUVevl/eJOvmzPJ4LJckRS2NVKb/+h1hxYwaKIfB4M8ZzaXeglWYVlFw WOlQ== X-Gm-Message-State: ABUngvfCZPROANs4NgzdNzhZUuLKCObEwdvFw5mb3sumf1H+f3vVRt3VhiIPuD9RPhGOxg== X-Received: by 10.159.49.89 with SMTP id n25mr4308564uab.79.1478116768812; Wed, 02 Nov 2016 12:59:28 -0700 (PDT) Received: from localhost.localdomain ([181.22.28.129]) by smtp.gmail.com with ESMTPSA id 23sm839705uav.9.2016.11.02.12.59.27 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 02 Nov 2016 12:59:28 -0700 (PDT) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Wed, 2 Nov 2016 16:58:57 -0300 Message-Id: <20161102195857.1664-2-jamrial@gmail.com> X-Mailer: git-send-email 2.10.1 In-Reply-To: <20161102195857.1664-1-jamrial@gmail.com> References: <20161102195857.1664-1-jamrial@gmail.com> Subject: [FFmpeg-devel] [PATCH 2/2] 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 --- libavformat/matroskaenc.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index f41aabe..8a6a57d 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -130,6 +130,7 @@ typedef struct MatroskaMuxContext { int64_t cluster_pts; int64_t duration_offset; int64_t duration; + int64_t codecpriv_offset; mkv_seekhead *main_seekhead; mkv_cues *cues; mkv_track *tracks; @@ -1253,6 +1254,7 @@ static int mkv_write_track(AVFormatContext *s, MatroskaMuxContext *mkv, } if (mkv->mode != MODE_WEBM || par->codec_id != AV_CODEC_ID_WEBVTT) { + mkv->codecpriv_offset = avio_tell(pb); ret = mkv_write_codecprivate(s, pb, par, native_id, qt_id); if (ret < 0) return ret; @@ -2078,6 +2080,49 @@ 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; + 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, mkv->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; @@ -2170,6 +2215,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