From patchwork Mon Oct 1 18:01:46 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: alx.sukhanov@gmail.com X-Patchwork-Id: 10537 Delivered-To: ffmpegpatchwork@gmail.com Received: by 2002:ab0:73d2:0:0:0:0:0 with SMTP id m18csp1974567uaq; Mon, 1 Oct 2018 11:02:07 -0700 (PDT) X-Google-Smtp-Source: ACcGV60cJLyVdfKrhT1dxj0MXdrfoqqm30qouDYePF5HGZGvLyvkjrOh9m2RYuc4W76LSbAdKBE/ X-Received: by 2002:a1c:9d43:: with SMTP id g64-v6mr9216796wme.26.1538416927869; Mon, 01 Oct 2018 11:02:07 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1538416927; cv=none; d=google.com; s=arc-20160816; b=VNQJ/yM3aUlP52CGkzZrxH3jhouxJlyoyM6fp3ODbHXeOjZKDKBLnHWFVt//X1vZ96 RKaIUg84GNeQOKm8Ii074xtI/JrFFNPXcxPI24H5AOzBU7g7/Id0pNxjnltZAMprXO53 L5n6y8ORXeWp2Girigb7940v14All2ppUFGU/nLYHNDf0GYcRzGxdLON5OurjO5vCg78 Jiz1VCgF3Pg/vq0xbFJVKXrMPVsZJfwgFpaJ32E5dibp7JtTknL/ZzkyEynkVHqGWnG2 d6AJiZqmp53rGFAHH99QJLoo8Bg2ksFqKN2pVOnUFCp7x/lI/ayOMbOAYIvbuqhN78sO AAvQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to :message-id:date:to:from:dkim-signature:delivered-to; bh=PK9nwNLCyb1XAxdnJKeJl9n/Ax6ew+pCMQhs7JypmSM=; b=K1a7aOpnLz7OsO0Ks5aWkUN9TuqQhl5qjoBvv9+PtonVOBEkV0lKvgIHodtJJG8j4z +Nrba5q8HDNcG/mFHOC79w181d7inkGM2LRCzrXC1BSZGIYpRN7AQs/p0L2oBmXLj0CG 3NlWuVcU6Zz1EmZaNGnjPNyL5ewixC4QRzRKJW0cTGSd4gWvej8voFhR6hl+Iljw+dIZ 68whLX72wRBEUMm4gRITMH1IlPFNMqhmvB7vxbcZH24FYjoQGgLFOyV/Zc3WVRIwVflj S/c7SobYsAYA8Pp5hEWjxK6TvCDR7q7hP28ZoeablPTvRckQBRJk72kC9JoQhcoRLbqJ GIuQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=iSGP5J5z; 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=QUARANTINE 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 l18-v6si8653994wrr.138.2018.10.01.11.02.07; Mon, 01 Oct 2018 11:02:07 -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=iSGP5J5z; 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=QUARANTINE 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 9A07568A0B9; Mon, 1 Oct 2018 21:01:47 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pg1-f193.google.com (mail-pg1-f193.google.com [209.85.215.193]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 2B5C66883B6 for ; Mon, 1 Oct 2018 21:01:41 +0300 (EEST) Received: by mail-pg1-f193.google.com with SMTP id i4-v6so9393529pgq.9 for ; Mon, 01 Oct 2018 11:02:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=Pm/0InUs8eF5AVRLk91ulGqw0bcdcjlAMPEz9oOpLys=; b=iSGP5J5zMcpV3ILEjYP3V3I9/Y28mXCKlXNP31c0gFYl3bqOgHwIYBWuGbvFFRa9A0 0DsOQyNvuKX9cYTCvV6ulFtzESDd2OQQuPWUFUePo0PMbTVLvCda/wBmePJTu+7/15/p FMpSIXkFKjK05K1RHf/JKmVXHeqx5ab8Uxtsdv8IuhDBhDJmhQ2HnwxROFDuI064zrVW L+T9vy72wLe5bMbCaE7IgtSfgm3irHOHl4Jcopoqi3eXzhQiLQ4GYL7m5GBpgB9F2cRs TCBZBJg+YD/S9xFJ2qF2B2fj7ZqhlxROUdkuSVIgVTZ7oMv2BjHkN9AE68/vA46q4hFW mJDQ== 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:mime-version:content-transfer-encoding; bh=Pm/0InUs8eF5AVRLk91ulGqw0bcdcjlAMPEz9oOpLys=; b=UDdeVaQk6Kf224Vb0vo6dns7JWBKlaeAifEFrQ5mcRGhlIWPPVQqhYqMyMFdHliVaf XDuuakLx2/kUvdMCfRvI/Ler07TW0Ljgb43RY4ZsrRBPyIsL+VPSSTg5IH/1VCEhHtGt Cx7dySXJm9Tpvbu3yPOXGwumU+k58F2HFGNuFcrlPuAi36YY106MPm2cTo8hwo24RwxC 1V5rupuUht1CCfHy/bWEP0ng3rQWdiIbh3cFiby0+y07ugtvNrw4KkAE/Ue/wpMifLMK LxoXMdEvU1GRYAztalu2M7QkAByivQVAn0V/uaNt/BY13j1qiWLnDd/rbpEfyqaEMyO8 EZqA== X-Gm-Message-State: ABuFfoi7+SL+dt4mL8/VDcW/hQeY7ovsZZ2IB+FRvWvpzCG/DLItjRs0 C7TEhGhAwafmseWXpYyW+hlnciXt X-Received: by 2002:a62:2056:: with SMTP id g83-v6mr12648374pfg.165.1538416917863; Mon, 01 Oct 2018 11:01:57 -0700 (PDT) Received: from asukhanov3.mtv.corp.google.com ([2620:0:1000:2100:c9c9:3b4c:c6b7:7c22]) by smtp.gmail.com with ESMTPSA id h130-v6sm18313510pgc.88.2018.10.01.11.01.56 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 01 Oct 2018 11:01:56 -0700 (PDT) From: alx.sukhanov@gmail.com To: ffmpeg-devel@ffmpeg.org Date: Mon, 1 Oct 2018 11:01:46 -0700 Message-Id: <20181001180146.49151-1-alx.sukhanov@gmail.com> X-Mailer: git-send-email 2.19.0.605.g01d371f741-goog In-Reply-To: References: MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] avformat: add H264 and HEVC support in IVF muxer 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: Alex Sukhanov Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" From: Alex Sukhanov --- libavformat/ivfenc.c | 50 +++++++++++++++++++++++++++++++++----------- 1 file changed, 38 insertions(+), 12 deletions(-) diff --git a/libavformat/ivfenc.c b/libavformat/ivfenc.c index 66441a2a43..6410828533 100644 --- a/libavformat/ivfenc.c +++ b/libavformat/ivfenc.c @@ -36,19 +36,29 @@ static int ivf_write_header(AVFormatContext *s) return AVERROR(EINVAL); } par = s->streams[0]->codecpar; - if (par->codec_type != AVMEDIA_TYPE_VIDEO || - !(par->codec_id == AV_CODEC_ID_AV1 || - par->codec_id == AV_CODEC_ID_VP8 || - par->codec_id == AV_CODEC_ID_VP9)) { - av_log(s, AV_LOG_ERROR, "Currently only VP8, VP9 and AV1 are supported!\n"); - return AVERROR(EINVAL); - } avio_write(pb, "DKIF", 4); avio_wl16(pb, 0); // version avio_wl16(pb, 32); // header length - avio_wl32(pb, - par->codec_id == AV_CODEC_ID_VP9 ? AV_RL32("VP90") : - par->codec_id == AV_CODEC_ID_VP8 ? AV_RL32("VP80") : AV_RL32("AV01")); + switch (par->codec_id) { + case AV_CODEC_ID_AV1: + avio_wl32(pb, AV_RL32("AV01")); + break; + case AV_CODEC_ID_H264: + avio_wl32(pb, AV_RL32("H264")); + break; + case AV_CODEC_ID_HEVC: + avio_wl32(pb, AV_RL32("HEVC")); + break; + case AV_CODEC_ID_VP8: + avio_wl32(pb, AV_RL32("VP80")); + break; + case AV_CODEC_ID_VP9: + avio_wl32(pb, AV_RL32("VP90")); + break; + default: + av_log(s, AV_LOG_ERROR, "Currently only AV1, H264, HEVC, VP8 and VP9 and AV1 are supported!\n"); + return AVERROR(EINVAL); + } avio_wl16(pb, par->width); avio_wl16(pb, par->height); avio_wl32(pb, s->streams[0]->time_base.den); @@ -95,16 +105,32 @@ static int ivf_check_bitstream(struct AVFormatContext *s, const AVPacket *pkt) int ret = 1; AVStream *st = s->streams[pkt->stream_index]; - if (st->codecpar->codec_id == AV_CODEC_ID_VP9) + if (st->codecpar->codec_id == AV_CODEC_ID_H264) { + if (pkt->size >= 5 && AV_RB32(pkt->data) != 0x0000001 && + (AV_RB24(pkt->data) != 0x000001 || + (st->codecpar->extradata_size > 0 && + st->codecpar->extradata[0] == 1))) + ret = ff_stream_add_bitstream_filter(st, "h264_mp4toannexb", NULL); + } else if (st->codecpar->codec_id == AV_CODEC_ID_HEVC) { + if (pkt->size >= 5 && AV_RB32(pkt->data) != 0x0000001 && + (AV_RB24(pkt->data) != 0x000001 || + (st->codecpar->extradata_size > 0 && + st->codecpar->extradata[0] == 1))) + ret = ff_stream_add_bitstream_filter(st, "hevc_mp4toannexb", NULL); + } else if (st->codecpar->codec_id == AV_CODEC_ID_VP9) { ret = ff_stream_add_bitstream_filter(st, "vp9_superframe", NULL); + } return ret; } static const AVCodecTag codec_ivf_tags[] = { + { AV_CODEC_ID_AV1, MKTAG('A', 'V', '0', '1') }, + { AV_CODEC_ID_H264, MKTAG('H', '2', '6', '4') }, + { AV_CODEC_ID_HEVC, MKTAG('H', 'E', 'V', 'C') }, { AV_CODEC_ID_VP8, MKTAG('V', 'P', '8', '0') }, { AV_CODEC_ID_VP9, MKTAG('V', 'P', '9', '0') }, - { AV_CODEC_ID_AV1, MKTAG('A', 'V', '0', '1') }, + { AV_CODEC_ID_NONE, 0 } };