From patchwork Wed Nov 29 16:08:42 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: wm4 X-Patchwork-Id: 6453 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.2.161.94 with SMTP id m30csp4683674jah; Wed, 29 Nov 2017 08:14:57 -0800 (PST) X-Google-Smtp-Source: AGs4zMaeb1ofP6x7yydA/uzLYNj5RBkuDjKQP/qZsmAr8lNtdFWIIv9ByFEOMnk5ZgCf0RWi8Cdg X-Received: by 10.28.138.20 with SMTP id m20mr3154780wmd.134.1511972097155; Wed, 29 Nov 2017 08:14:57 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1511972097; cv=none; d=google.com; s=arc-20160816; b=MUv686QntNMODwxdRkWcR73Pfjjp3TwVI9I7Np3uAdpQiWbkEWBSAxrtGQAAhUjBZj 4fmE5qc5dipMDZH9gAleexWb5YJKwy5O+DOul5K6/3xoQnIruYBIh4SFYg8TxQoIqQTr LxDegILN+41aIEmRciKJfDKNdrLGelYrTEyeDRZ8wTFTNVMsypbwp/ufG0+53BqY/M41 sOaPDC0P98QfmQPzWaTrYKuBbrYX4AUjTwd5sGaBCRXtNmcLbSg4lTOYF+nu5GpVp8C3 WTU4uwOYiH5bW5m0RddY/rorLBkCr/uJQ9IjImN6uJ5k0rB+wgUc/q0LnAmIRgQsOEc/ P5+A== 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:cc: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=YKDEgOQ2pButKcUnBr80Hwn5gsz6xnHdj9xCUHD5to0=; b=l9Oep6cJN69ZReIfQMqyZzUSpljfqHpAoCsgI4NfYCqElalgR7szv6WflTQqkG+1hq vzXdOORkq9LOteYYtD/QfvcXnpcECZ6OARdiD/hSLk6tZzRwWVZdkV1hTdlWgldbeS8W BBhgODsRugDAUWM+sZ5cheVJtQPXyGoGwLo7TxyOstWO+pURUBT86gYx/5PURhKDEahn zFm/j4StPQZd7wTuHfyC/ZbRxAlrjN9EvitUP+FyoBsxi+qzg8tacS8aumVz0PWNZsOA AR9wLbAMITs13REtGRW9RMwGioOkNaOVG/WyTpBPttw2kzr97RaCq4ErBZrVHwvVXUzQ vV1g== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@googlemail.com header.s=20161025 header.b=PaUOfGhy; 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=QUARANTINE sp=QUARANTINE dis=NONE) header.from=googlemail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id 5si1612696wrg.124.2017.11.29.08.14.56; Wed, 29 Nov 2017 08:14:57 -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=@googlemail.com header.s=20161025 header.b=PaUOfGhy; 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=QUARANTINE sp=QUARANTINE dis=NONE) header.from=googlemail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id BCB6C68A4C8; Wed, 29 Nov 2017 18:14:52 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lf0-f66.google.com (mail-lf0-f66.google.com [209.85.215.66]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 7402568A3CD for ; Wed, 29 Nov 2017 18:14:46 +0200 (EET) Received: by mail-lf0-f66.google.com with SMTP id x204so4481241lfa.11 for ; Wed, 29 Nov 2017 08:14:49 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlemail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=TVX8N6s8D5+KHTXQdWpw59C8NGBSU/zilUGNYtlvHgk=; b=PaUOfGhyARrrsNyuLwaVRBgmvpwskZ29NiUAZAJqima1zsuECiNnp144K+J92iTCB6 fI/N1oRzmrXToHez3oYVnlXPTsS41jkxnzW5Kj7XhNhKGVgDUH+hqAKcLsTdGMEGCaDf tVaBTVYJtlgem13XpY4H0vvG1rn2sQiPOOPHAXe7rmWasrHoeI7dYcQkd9AvPRgPe8yU H43T7JptVwrfwcn/t3WaTVEoB+RdxclErUFd3b3i+2amxnrUMLU3tE1Qdcq+wxd6VSYQ 6lzhBRhl3ePSlB1fJSC9/ftt4047JuXsrNdJox/LdTzeETPyrnjbNOIGLkqaGVHDwF2l Xc0g== 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; bh=TVX8N6s8D5+KHTXQdWpw59C8NGBSU/zilUGNYtlvHgk=; b=T+EztDTZ7dzn+Fwpe5VSZA77AIWCnMaxpQXvkfxIwh1hFHO9/OtCwdL8bqwjRICcSu prLtdLhti18Ju6Fas2LqVEX1XLWNGk9w71zjxdZ53LXAeY2HuSIunOtEsv7caqlyqIbE 95khKeFoJfCYje8mZbNavuLDbaxGOV6NvktpeFfkYiHAEFm2IvVluX+kCI8o+XpQBnoR +RBEsaTmbX4lxe5tBhvZ+C2DMCe++oB7TVaSOTMKlUr9U6IUNjhV20V2ECKB+o9VpNmq aFsMGjRuHEYHs146xboxc7ppIcuW5lIOBdg4Ddci3f1t1yokOK6jxirhPGDpreqHux9g Cf1Q== X-Gm-Message-State: AJaThX7TiNdsWTQEATVQktJoBfPOt4XzLlsytKr4Mn5p9pVEmOwVFqV/ eQYu18eSUChC1InF6hlb9aJGGg== X-Received: by 10.25.17.208 with SMTP id 77mr1351192lfr.132.1511971713141; Wed, 29 Nov 2017 08:08:33 -0800 (PST) Received: from debian.speedport.ip (p2003006CCD4EDC9660A8CE5075EAFF87.dip0.t-ipconnect.de. [2003:6c:cd4e:dc96:60a8:ce50:75ea:ff87]) by smtp.googlemail.com with ESMTPSA id c1sm429985ljb.78.2017.11.29.08.08.31 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 29 Nov 2017 08:08:32 -0800 (PST) From: wm4 To: ffmpeg-devel@ffmpeg.org Date: Wed, 29 Nov 2017 17:08:42 +0100 Message-Id: <20171129160842.7227-1-nfxjfg@googlemail.com> X-Mailer: git-send-email 2.15.0 In-Reply-To: <40b4d822-25e3-aa49-716b-c09a816de8a5@gmail.com> References: <40b4d822-25e3-aa49-716b-c09a816de8a5@gmail.com> Subject: [FFmpeg-devel] [PATCH] vp9_parser: don't split superframes into separate packets 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: wm4 MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" We did this for the sake of the decoder. With the vp9 change, it's not necessary anymore. --- libavcodec/vp9_parser.c | 127 ++++------------------------------------------ libavformat/hlsplaylist.h | 4 +- 2 files changed, 12 insertions(+), 119 deletions(-) diff --git a/libavcodec/vp9_parser.c b/libavcodec/vp9_parser.c index 9900e7ab1f..9531f34a32 100644 --- a/libavcodec/vp9_parser.c +++ b/libavcodec/vp9_parser.c @@ -25,21 +25,19 @@ #include "libavcodec/get_bits.h" #include "parser.h" -typedef struct VP9ParseContext { - int n_frames; // 1-8 - int size[8]; - int marker_size; - int64_t pts; -} VP9ParseContext; - -static int parse_frame(AVCodecParserContext *ctx, const uint8_t *buf, int size) +static int parse(AVCodecParserContext *ctx, + AVCodecContext *avctx, + const uint8_t **out_data, int *out_size, + const uint8_t *data, int size) { - VP9ParseContext *s = ctx->priv_data; GetBitContext gb; - int res, profile, keyframe, invisible; + int res, profile, keyframe; - if ((res = init_get_bits8(&gb, buf, size)) < 0) - return res; + *out_data = data; + *out_size = size; + + if ((res = init_get_bits8(&gb, data, size)) < 0) + return size; // parsers can't return errors get_bits(&gb, 2); // frame marker profile = get_bits1(&gb); profile |= get_bits1(&gb) << 1; @@ -47,10 +45,8 @@ static int parse_frame(AVCodecParserContext *ctx, const uint8_t *buf, int size) if (get_bits1(&gb)) { keyframe = 0; - invisible = 0; } else { keyframe = !get_bits1(&gb); - invisible = !get_bits1(&gb); } if (!keyframe) { @@ -61,113 +57,10 @@ static int parse_frame(AVCodecParserContext *ctx, const uint8_t *buf, int size) ctx->key_frame = 1; } - if (!invisible) { - if (ctx->pts == AV_NOPTS_VALUE) - ctx->pts = s->pts; - s->pts = AV_NOPTS_VALUE; - } else if (ctx->pts != AV_NOPTS_VALUE) { - s->pts = ctx->pts; - ctx->pts = AV_NOPTS_VALUE; - } - - return 0; -} - -static int parse(AVCodecParserContext *ctx, - AVCodecContext *avctx, - const uint8_t **out_data, int *out_size, - const uint8_t *data, int size) -{ - VP9ParseContext *s = ctx->priv_data; - int full_size = size; - int marker; - - if (size <= 0) { - *out_size = 0; - *out_data = data; - - return 0; - } - - if (s->n_frames > 0) { - int i; - int size_sum = 0; - - for (i = 0; i < s->n_frames ;i++) - size_sum += s->size[i]; - size_sum += s->marker_size; - - if (size_sum != size) { - av_log(avctx, AV_LOG_ERROR, "Inconsistent input frame sizes %d %d\n", - size_sum, size); - s->n_frames = 0; - } - } - - if (s->n_frames > 0) { - *out_data = data; - *out_size = s->size[--s->n_frames]; - parse_frame(ctx, *out_data, *out_size); - - return s->n_frames > 0 ? *out_size : size /* i.e. include idx tail */; - } - - marker = data[size - 1]; - if ((marker & 0xe0) == 0xc0) { - int nbytes = 1 + ((marker >> 3) & 0x3); - int n_frames = 1 + (marker & 0x7), idx_sz = 2 + n_frames * nbytes; - - if (size >= idx_sz && data[size - idx_sz] == marker) { - const uint8_t *idx = data + size + 1 - idx_sz; - int first = 1; - - switch (nbytes) { -#define case_n(a, rd) \ - case a: \ - while (n_frames--) { \ - unsigned sz = rd; \ - idx += a; \ - if (sz == 0 || sz > size) { \ - s->n_frames = 0; \ - *out_size = size; \ - *out_data = data; \ - av_log(avctx, AV_LOG_ERROR, \ - "Invalid superframe packet size: %u frame size: %d\n", \ - sz, size); \ - return full_size; \ - } \ - if (first) { \ - first = 0; \ - *out_data = data; \ - *out_size = sz; \ - s->n_frames = n_frames; \ - } else { \ - s->size[n_frames] = sz; \ - } \ - data += sz; \ - size -= sz; \ - } \ - s->marker_size = size; \ - parse_frame(ctx, *out_data, *out_size); \ - return s->n_frames > 0 ? *out_size : full_size - - case_n(1, *idx); - case_n(2, AV_RL16(idx)); - case_n(3, AV_RL24(idx)); - case_n(4, AV_RL32(idx)); - } - } - } - - *out_data = data; - *out_size = size; - parse_frame(ctx, data, size); - return size; } AVCodecParser ff_vp9_parser = { .codec_ids = { AV_CODEC_ID_VP9 }, - .priv_data_size = sizeof(VP9ParseContext), .parser_parse = parse, }; diff --git a/libavformat/hlsplaylist.h b/libavformat/hlsplaylist.h index fd36c7e6c2..3445b5f297 100644 --- a/libavformat/hlsplaylist.h +++ b/libavformat/hlsplaylist.h @@ -20,8 +20,8 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef AVFORMAT_HLSPLAYLIST_H_ -#define AVFORMAT_HLSPLAYLIST_H_ +#ifndef AVFORMAT_HLSPLAYLIST_H +#define AVFORMAT_HLSPLAYLIST_H #include "libavutil/common.h"