From patchwork Tue Aug 1 06:33:54 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rodger Combs X-Patchwork-Id: 4561 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.103.1.85 with SMTP id 82csp3300437vsb; Mon, 31 Jul 2017 23:40:21 -0700 (PDT) X-Received: by 10.223.152.47 with SMTP id v44mr14094878wrb.60.1501569621532; Mon, 31 Jul 2017 23:40:21 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1501569621; cv=none; d=google.com; s=arc-20160816; b=qnAq+sHLR7+HWxYjsiYKWXa6dobG1MAyGJJFGzpwdSE/iSewrYsQ4ymjEvqyJzlmPh avXRWKen5ZV29Lbr2Q0efvxof79pjp3VTrJSAhLFKkDIxwlNEGGwKjcPcPqjmHlV+VEU OBml5xy25g1j591cq36WohUtbIBnTPwC1HwGo5Uln6SP/+RIO9FfGPoGCrPWZrztU+HP FAMBGuWvj7fxxXlQfk491B9xaSD14dm0NEwfb/AUp1m89fpCcgtQICFH1nGsAXCDWFlt rF9YZFy/IjiXMemAzQFfwHaH1Ht0+Dw8bU2rVWDYfTzpPT/vL7FckV6HWRb6e3fC7QeJ 82gg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:references:in-reply-to:message-id:date :to:from:dkim-signature:delivered-to:arc-authentication-results; bh=/hy1euBjPIdEIT9qzYShOv2L8+PjDf3oq6Zb+smQKQ8=; b=KPYiEeBB9rUhikn04UZDXKZdZJUeA3esTY7kfxQoxXqaSIJ9rgbiwqlFJPrzV/p0pk UvDVQpziydNi4hhAE1IdOwiTnGn3QzrSZg0qF2m/IAWznzArjbhgkg3iKUDIX9hxUoyq i0nSiOFkM9CTdAgdzV9Ft1eN5yb6JCfQmHZqqif4pPvcnyelGSw93IqDz5mEIMptlnp9 R96WzT5kNRhc33DC6Y4ucIKmi+Kkney8TWsF8dX8+DlCdaTIBDh+c4OAbDPEsdMmsqGq rPfkR64SlTA+aAixQ6vnhiln3THQBLZGh+Qmuat5FvziLZrNpfuGaOmLPm6emGpBTIXU adqQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=RcMBdoF5; 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 sp=NONE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id j189si591173wmd.191.2017.07.31.23.40.21; Mon, 31 Jul 2017 23:40:21 -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 header.s=20161025 header.b=RcMBdoF5; 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 sp=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 E4DB268A318; Tue, 1 Aug 2017 09:40:14 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-it0-f66.google.com (mail-it0-f66.google.com [209.85.214.66]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 0501368A312 for ; Tue, 1 Aug 2017 09:40:08 +0300 (EEST) Received: by mail-it0-f66.google.com with SMTP id r9so856564ita.3 for ; Mon, 31 Jul 2017 23:40:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references; bh=Gnr8WSJIcVONZ+n7bUwDO6jZy2kgiqAZPTVs/1okFZw=; b=RcMBdoF5iPhUGMsr+FCR2QqEm7e2WotO8ZZfPU7mYyeyiV+S1/Csng8+MmYgtYttr4 GWVQEgQmOP4QLNDrDPeirK4un2oKHfV3gpLKr8hFh3/0xJM+mnlklYldWMwPz3jSeCrJ PD6TJ+Fv7wMYdDKf62kAbHY/7PiOpogA/2zbXhGr+vLAIKEOrmZANxBKm0H6r1uDKfk8 pHyCuG/xVXA8jQLY+MmRhTw+YO6eocPqoV2zNSN0+fAfObK7MzF96uUH2Dq4zxNoSnCr HWR4GxMRjDqfuIxzXby5n8FwJOgIdIjjl7+Fo0vx8xzdiZGBC+E2ro4aulXksdnklXaO ooZw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=Gnr8WSJIcVONZ+n7bUwDO6jZy2kgiqAZPTVs/1okFZw=; b=UN9vHgkj/WhO/l6ypaUX8QZB0S0/HZDQJI4nCe4jxvGFr3DSPqhHNFLX6ARsvMTz2B 8XmSXrLCwJ7XO05y8aU3iNGNYagZuYGEe8cAapPG119/m7siEwvkmr46NykArBQEYtaC OLOfvzBLNJbAF0ZfmqF1A4ips/kmm2FDNpWJaqTuYnEI8N8MH1FUHusUHcQ+XBbuk7ZM bV5oo9fx3N1DwmG+BAFMqPYvTwpVXhG1nrwScKJek7m0cvyuNyHPGQ8kd9cheFx9OtLO dWja2q7wQBKrAbOZaRl+QmKElgT916lGjtOLDVjTsl5YofRWBO6c1CG13FT0lQNKh3eQ FN7A== X-Gm-Message-State: AIVw11227hUnEHLioJrGxiPOKJ8VDw1PfhYJ4fw6Z+IMIRHjUmB5wum1 xRLC1AfMXDtET8HUKnw= X-Received: by 10.36.172.31 with SMTP id s31mr605928ite.151.1501569245022; Mon, 31 Jul 2017 23:34:05 -0700 (PDT) Received: from rcombs-NAS.hsd1.il.comcast.net. (c-73-110-121-59.hsd1.il.comcast.net. [73.110.121.59]) by smtp.gmail.com with ESMTPSA id 186sm13887294iow.44.2017.07.31.23.34.03 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 31 Jul 2017 23:34:03 -0700 (PDT) From: Rodger Combs To: ffmpeg-devel@ffmpeg.org Date: Tue, 1 Aug 2017 01:33:54 -0500 Message-Id: <1501569234-29896-7-git-send-email-rodger.combs@gmail.com> X-Mailer: git-send-email 2.6.4 In-Reply-To: <1501569234-29896-1-git-send-email-rodger.combs@gmail.com> References: <1501569234-29896-1-git-send-email-rodger.combs@gmail.com> Subject: [FFmpeg-devel] [PATCH 7/7] lavf/flacenc: generate timestamps internally 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" --- libavformat/flacenc.c | 88 +++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 85 insertions(+), 3 deletions(-) diff --git a/libavformat/flacenc.c b/libavformat/flacenc.c index 1906aee..f569c14 100644 --- a/libavformat/flacenc.c +++ b/libavformat/flacenc.c @@ -30,6 +30,7 @@ #include "internal.h" #include "vorbiscomment.h" #include "libavcodec/bytestream.h" +#include "libavutil/crc.h" typedef struct FlacMuxerContext { @@ -46,6 +47,9 @@ typedef struct FlacMuxerContext { uint8_t *streaminfo; unsigned attached_types; + + uint64_t samples; + unsigned last_bs; } FlacMuxerContext; static int flac_write_block_padding(AVIOContext *pb, unsigned int n_padding_bytes, @@ -263,11 +267,17 @@ static int flac_write_header(struct AVFormatContext *s) return ret; } +static const int32_t blocksize_table[16] = { + 0, 192, 576<<0, 576<<1, 576<<2, 576<<3, 0, 0, +256<<0, 256<<1, 256<<2, 256<<3, 256<<4, 256<<5, 256<<6, 256<<7 +}; + static int flac_write_audio_packet(struct AVFormatContext *s, AVPacket *pkt) { FlacMuxerContext *c = s->priv_data; uint8_t *streaminfo; int streaminfo_size; + char header[16]; /* check for updated streaminfo */ streaminfo = av_packet_get_side_data(pkt, AV_PKT_DATA_NEW_EXTRADATA, @@ -281,8 +291,77 @@ static int flac_write_audio_packet(struct AVFormatContext *s, AVPacket *pkt) memcpy(c->streaminfo, streaminfo, FLAC_STREAMINFO_SIZE); } - if (pkt->size) - avio_write(s->pb, pkt->data, pkt->size); + if (pkt->size) { + uint8_t tmp; + uint64_t pts = c->samples; + int offset = 5; + int headerlen = 4; + int bscode, bs; + int crc; + if (pkt->size < FLAC_MIN_FRAME_SIZE) + return AVERROR_INVALIDDATA; + memcpy(header, pkt->data, 4); + if (pkt->pts == AV_NOPTS_VALUE) + pts = 0; + if ((pkt->data[4] & 0xC0) == 0xC0) + offset += ff_clz((unsigned char)~pkt->data[4]) - 25; + else if (pkt->data[4] & 0x80) + return AVERROR_INVALIDDATA; + if (pkt->size <= offset + 1) + return AVERROR_INVALIDDATA; + + bscode = (unsigned char)header[2] >> 4; + bs = blocksize_table[bscode]; + if (bscode == 0) + return AVERROR_INVALIDDATA; + if (bscode == 6) { + if (pkt->size <= offset + 1) + return AVERROR_INVALIDDATA; + bs = pkt->data[offset] + 1; + } else if (bscode == 7) { + if (pkt->size <= offset + 2) + return AVERROR_INVALIDDATA; + bs = AV_RB16(&pkt->data[offset]) + 1; + } + if ((header[1] & 1) == 0) + pts /= c->last_bs ? c->last_bs : bs; + + c->last_bs = bs; + + c->samples += bs; + + PUT_UTF8(pts, tmp, header[headerlen++] = tmp;) + if (headerlen > 11) + return AVERROR_INVALIDDATA; + if ((bscode & 0xE) == 0x6) + header[headerlen++] = pkt->data[offset++]; + if (pkt->size <= offset + 1) + return AVERROR_INVALIDDATA; + if (bscode == 0x7) + header[headerlen++] = pkt->data[offset++]; + if (pkt->size <= offset + 1) + return AVERROR_INVALIDDATA; + if ((header[2] & 0xC) == 0xC) { + header[headerlen++] = pkt->data[offset++]; + if (pkt->size <= offset + 1) + return AVERROR_INVALIDDATA; + if ((header[2] & 0x3) == 0x3) + return AVERROR_INVALIDDATA; + else if (header[2] & 0x3) { + header[headerlen++] = pkt->data[offset++]; + if (pkt->size <= offset + 1) + return AVERROR_INVALIDDATA; + } + } + header[headerlen] = av_crc(av_crc_get_table(AV_CRC_8_ATM), 0, header, headerlen); + headerlen++; offset++; + crc = av_crc(av_crc_get_table(AV_CRC_16_ANSI), 0, header, headerlen); + if (pkt->size < offset + 3) + return AVERROR_INVALIDDATA; + avio_write(s->pb, header, headerlen); + avio_write(s->pb, pkt->data + offset, pkt->size - offset - 2); + avio_wl16(s->pb, av_crc(av_crc_get_table(AV_CRC_16_ANSI), crc, pkt->data + offset, pkt->size - offset - 2)); + } return 0; } @@ -326,7 +405,10 @@ static int flac_write_trailer(struct AVFormatContext *s) /* rewrite the STREAMINFO header block data */ file_size = avio_tell(pb); avio_seek(pb, 8, SEEK_SET); - avio_write(pb, streaminfo, FLAC_STREAMINFO_SIZE); + avio_write(pb, streaminfo, 13); + avio_w8(pb, (streaminfo[13] & 0xF0) | ((c->samples >> 32) & 0xF)); + avio_wb32(pb, c->samples); + avio_write(pb, streaminfo + 18, FLAC_STREAMINFO_SIZE - 18); avio_seek(pb, file_size, SEEK_SET); avio_flush(pb); } else {