From patchwork Wed Aug 2 06:30:45 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rodger Combs X-Patchwork-Id: 4591 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.103.46.211 with SMTP id u202csp881782vsu; Wed, 2 Aug 2017 00:18:28 -0700 (PDT) X-Received: by 10.28.72.214 with SMTP id v205mr927185wma.178.1501658307970; Wed, 02 Aug 2017 00:18:27 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1501658307; cv=none; d=google.com; s=arc-20160816; b=yuwoY9YjSDiG+r6s6WCK32oUfJChSQLH85xlHJkEASEeXgQGH5JIEOTLKX8xmSzdu/ I025e+bwyNDvHnfwlJWQ6cip434yjA3NEZgiaqV5LanIKEgOUMAgddgampNBJtVqjRj/ GXb8tNDHLFoOBKtzLMBuQv3HeEoV6A/oQXA86zaNSGSf0j+Hne1FaJmsuSrFA1I3AblC LRHbdqc3n3lk5g/UClB48e2khFvGBkMFjy78rh//qJVwBVGj5NFTZszAL3mPV5V/Ksz/ /jHTggbWAVKG/4UHJLJBVYE2siqnT3EjKGcBkBIoT0vN0E4L0q1Y7GYwun89+cSSEPdo ZhUQ== 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=5ApE5B8RITZjC/xG5yl4W9lTgxL8+I49vP+TwGIVOiw=; b=RQw9YL14I1BMGbRlKYxZrZ/VQhGE67EmtjDWfp54OHcGjhqr2UTn+Z/aSf5RI5xMvB dqrahwj9PeXRiTRyy6B088jBH2egKPlI63OXKtGN8NumLjEGWNgh2dwS5b5JqJkDkVne /b058mPXOWu15QaDDovugtx4C0scSOGeG1WqyfEOd7JbIAsA5ApXsRCPSBH9bVVbetJj lbK2WccJoSyr5JfnxQoio1Gulrw3tZ5IPAYEar74UbIDukIboxNXj2gKARCX5yRWDKl0 oAcCP0K+2RMETO2l3aMZhaeY6MM9UYYw7WKxaqQf7UHqMhJVKSJRDuJkCwt48oV0Nzxq Krkw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=IFXujrHh; 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 t185si2688054wmg.54.2017.08.02.00.18.27; Wed, 02 Aug 2017 00:18:27 -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=IFXujrHh; 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 E113B68A4AE; Wed, 2 Aug 2017 10:17:30 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-it0-f67.google.com (mail-it0-f67.google.com [209.85.214.67]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 6BB5468A49E for ; Wed, 2 Aug 2017 10:17:24 +0300 (EEST) Received: by mail-it0-f67.google.com with SMTP id t78so3277605ita.1 for ; Wed, 02 Aug 2017 00:17:27 -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=GX7r1fS3Bx1C2LRf2nBsvD2jj0U0Q0RLfjDCjMKgjNQ=; b=IFXujrHhEMFYeY+adhmBuDY3HgW8QU7Ar/fuzrNBpu4dUGg2iX6eLnx5O0gu5sgjFW +Z3BN4A4FrZTbSQ/KB9zjT5Mf6A/Ar7PlxzMK1IR051sYr9lybaoQnUkfhUbKHclkS4m Z8cj8S7dQRLSFBa+zAKOfzYa14YrYCdyfWQYZU4Iv1CdzWCVqN7Gs4OZwLhSruUYQIMj BlrVDFqcqB1iOKiVFUX8EHyXSmMkfdlsS2DgKnn6gSRyDr0CYhlhlXW6a8zyeIWp36Zw 9FvyiqsQbMhPqtXJuIxVxce6ok2IW8ZRNLoXe9DwPpBTHCv1USuUYMJtVTHYBHwmYv2k HRLg== 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=GX7r1fS3Bx1C2LRf2nBsvD2jj0U0Q0RLfjDCjMKgjNQ=; b=Bx+fhuHd3GEckFwYUaChMT3+5BOH1wUJk7gnw3DGJ151NKSyJUssbyA+USRo18Gv1O aZTgWw3c0tmWalvGShK/ILQPKx54foQgQcayT2HpdiWv54U/veIGhFdicEY71e3v5AF3 foE4+hEF9JQgkXs2nweIqnbrdL48kiFJJ6pY/L9/eWi/5EumU4EONQLcodEkuQ4DeFxa RiZ6oqxN3E58eFu8O8iosUQzMHEyDJ6kVBJP36lDx5zsOGz+0sEwG863x/Fi1Pp+WoOu e0oO68RlD78Dlu7qx2eywrjEOUC1o5Taw72f/KQVeFwpYXIYbU0L9JkJI5A+dsVXRLNT uVrA== X-Gm-Message-State: AIVw110pmw7ymZlDIq1oL8XirB7MVSZ07JXbjojqTPOxVzAEIVIlqhBR ds2Wmez/yM3PaeqIP7Q= X-Received: by 10.36.125.81 with SMTP id b78mr4648708itc.26.1501658245991; Wed, 02 Aug 2017 00:17:25 -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 196sm4382274iou.50.2017.08.02.00.17.25 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 02 Aug 2017 00:17:25 -0700 (PDT) From: Rodger Combs To: ffmpeg-devel@ffmpeg.org Date: Wed, 2 Aug 2017 01:30:45 -0500 Message-Id: <1501655445-18976-7-git-send-email-rodger.combs@gmail.com> X-Mailer: git-send-email 2.6.4 In-Reply-To: <1501655445-18976-1-git-send-email-rodger.combs@gmail.com> References: <1501655445-18976-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 | 87 ++++++++++++++++++++++++++++++++++++++-- tests/ref/acodec/flac | 4 +- tests/ref/acodec/flac-exact-rice | 4 +- tests/ref/seek/acodec-flac | 36 ++++++++--------- 4 files changed, 106 insertions(+), 25 deletions(-) diff --git a/libavformat/flacenc.c b/libavformat/flacenc.c index 1906aee..39e5e2c 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,8 @@ typedef struct FlacMuxerContext { uint8_t *streaminfo; unsigned attached_types; + + uint64_t samples; } FlacMuxerContext; static int flac_write_block_padding(AVIOContext *pb, unsigned int n_padding_bytes, @@ -263,11 +266,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 +290,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; + + // Forcing use of sample counts instead of block counts to avoid bs + // mismatch issues + header[1] |= 1; + + 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; + } + + 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 +404,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 { diff --git a/tests/ref/acodec/flac b/tests/ref/acodec/flac index c2e7f20..ccd6568 100644 --- a/tests/ref/acodec/flac +++ b/tests/ref/acodec/flac @@ -1,4 +1,4 @@ -151eef9097f944726968bec48649f00a *tests/data/fate/acodec-flac.flac -361582 tests/data/fate/acodec-flac.flac +6c8b80b229c3212e6f62e0eb1e75e4b8 *tests/data/fate/acodec-flac.flac +362110 tests/data/fate/acodec-flac.flac 95e54b261530a1bcf6de6fe3b21dc5f6 *tests/data/fate/acodec-flac.out.wav stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400 diff --git a/tests/ref/acodec/flac-exact-rice b/tests/ref/acodec/flac-exact-rice index 6f6d274..03b6971 100644 --- a/tests/ref/acodec/flac-exact-rice +++ b/tests/ref/acodec/flac-exact-rice @@ -1,4 +1,4 @@ -aab144de213ae684ca008a3e0afe5e28 *tests/data/fate/acodec-flac-exact-rice.flac -360454 tests/data/fate/acodec-flac-exact-rice.flac +3b019c7c003ea02c82b4608a16181faf *tests/data/fate/acodec-flac-exact-rice.flac +360982 tests/data/fate/acodec-flac-exact-rice.flac 95e54b261530a1bcf6de6fe3b21dc5f6 *tests/data/fate/acodec-flac-exact-rice.out.wav stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400 diff --git a/tests/ref/seek/acodec-flac b/tests/ref/seek/acodec-flac index f6add9a..0b2c60f 100644 --- a/tests/ref/seek/acodec-flac +++ b/tests/ref/seek/acodec-flac @@ -2,52 +2,52 @@ ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 8256 size: 614 ret: 0 st:-1 flags:0 ts:-1.000000 ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 8256 size: 614 ret: 0 st:-1 flags:1 ts: 1.894167 -ret: 0 st: 0 flags:1 dts: 1.880816 pts: 1.880816 pos: 86742 size: 2191 +ret: 0 st: 0 flags:1 dts: 1.880816 pts: 1.880816 pos: 86898 size: 2194 ret: 0 st: 0 flags:0 ts: 0.788345 -ret: 0 st: 0 flags:1 dts: 0.809796 pts: 0.809796 pos: 27366 size: 615 +ret: 0 st: 0 flags:1 dts: 0.809796 pts: 0.809796 pos: 27425 size: 617 ret: 0 st: 0 flags:1 ts:-0.317506 ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 8256 size: 614 ret: 0 st:-1 flags:0 ts: 2.576668 -ret: 0 st: 0 flags:1 dts: 2.586122 pts: 2.586122 pos: 145606 size: 2384 +ret: 0 st: 0 flags:1 dts: 2.586122 pts: 2.586122 pos: 145843 size: 2387 ret: 0 st:-1 flags:1 ts: 1.470835 -ret: 0 st: 0 flags:1 dts: 1.462857 pts: 1.462857 pos: 53388 size: 1851 +ret: 0 st: 0 flags:1 dts: 1.462857 pts: 1.462857 pos: 53497 size: 1853 ret: 0 st: 0 flags:0 ts: 0.365011 -ret: 0 st: 0 flags:1 dts: 0.365714 pts: 0.365714 pos: 16890 size: 614 +ret: 0 st: 0 flags:1 dts: 0.365714 pts: 0.365714 pos: 16915 size: 616 ret: 0 st: 0 flags:1 ts:-0.740839 ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 8256 size: 614 ret: 0 st:-1 flags:0 ts: 2.153336 -ret: 0 st: 0 flags:1 dts: 2.168163 pts: 2.168163 pos: 110531 size: 2143 +ret: 0 st: 0 flags:1 dts: 2.168163 pts: 2.168163 pos: 110720 size: 2146 ret: 0 st:-1 flags:1 ts: 1.047503 -ret: 0 st: 0 flags:1 dts: 1.044898 pts: 1.044898 pos: 32880 size: 579 +ret: 0 st: 0 flags:1 dts: 1.044898 pts: 1.044898 pos: 32957 size: 581 ret: 0 st: 0 flags:0 ts:-0.058322 ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 8256 size: 614 ret: 0 st: 0 flags:1 ts: 2.835828 -ret: 0 st: 0 flags:1 dts: 2.821224 pts: 2.821224 pos: 167112 size: 2391 +ret: 0 st: 0 flags:1 dts: 2.821224 pts: 2.821224 pos: 167376 size: 2394 ret: 0 st:-1 flags:0 ts: 1.730004 -ret: 0 st: 0 flags:1 dts: 1.750204 pts: 1.750204 pos: 75788 size: 2191 +ret: 0 st: 0 flags:1 dts: 1.750204 pts: 1.750204 pos: 75929 size: 2194 ret: 0 st:-1 flags:1 ts: 0.624171 -ret: 0 st: 0 flags:1 dts: 0.600816 pts: 0.600816 pos: 22446 size: 616 +ret: 0 st: 0 flags:1 dts: 0.600816 pts: 0.600816 pos: 22489 size: 618 ret: 0 st: 0 flags:0 ts:-0.481655 ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 8256 size: 614 ret: 0 st: 0 flags:1 ts: 2.412494 -ret: 0 st: 0 flags:1 dts: 2.403265 pts: 2.403265 pos: 129793 size: 2138 +ret: 0 st: 0 flags:1 dts: 2.403265 pts: 2.403265 pos: 130009 size: 2141 ret: 0 st:-1 flags:0 ts: 1.306672 -ret: 0 st: 0 flags:1 dts: 1.332245 pts: 1.332245 pos: 44812 size: 1609 +ret: 0 st: 0 flags:1 dts: 1.332245 pts: 1.332245 pos: 44911 size: 1611 ret: 0 st:-1 flags:1 ts: 0.200839 -ret: 0 st: 0 flags:1 dts: 0.182857 pts: 0.182857 pos: 12572 size: 628 +ret: 0 st: 0 flags:1 dts: 0.182857 pts: 0.182857 pos: 12583 size: 630 ret: 0 st: 0 flags:0 ts:-0.904989 ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 8256 size: 614 ret: 0 st: 0 flags:1 ts: 1.989184 -ret: 0 st: 0 flags:1 dts: 1.985306 pts: 1.985306 pos: 95508 size: 2169 +ret: 0 st: 0 flags:1 dts: 1.985306 pts: 1.985306 pos: 95676 size: 2172 ret: 0 st:-1 flags:0 ts: 0.883340 -ret: 0 st: 0 flags:1 dts: 0.888163 pts: 0.888163 pos: 29211 size: 620 +ret: 0 st: 0 flags:1 dts: 0.888163 pts: 0.888163 pos: 29276 size: 622 ret: 0 st:-1 flags:1 ts:-0.222493 ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 8256 size: 614 ret: 0 st: 0 flags:0 ts: 2.671678 -ret: 0 st: 0 flags:1 dts: 2.690612 pts: 2.690612 pos: 155154 size: 2394 +ret: 0 st: 0 flags:1 dts: 2.690612 pts: 2.690612 pos: 155403 size: 2397 ret: 0 st: 0 flags:1 ts: 1.565850 -ret: 0 st: 0 flags:1 dts: 1.541224 pts: 1.541224 pos: 59082 size: 1974 +ret: 0 st: 0 flags:1 dts: 1.541224 pts: 1.541224 pos: 59199 size: 1977 ret: 0 st:-1 flags:0 ts: 0.460008 -ret: 0 st: 0 flags:1 dts: 0.470204 pts: 0.470204 pos: 19353 size: 608 +ret: 0 st: 0 flags:1 dts: 0.470204 pts: 0.470204 pos: 19386 size: 610 ret: 0 st:-1 flags:1 ts:-0.645825 ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 8256 size: 614