From patchwork Mon Mar 1 12:53:48 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?b?0JLQsNC00LjQvCDQkdC10LfQtNGD0YjQvdGL0Lk=?= X-Patchwork-Id: 26040 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 5985944B7F5 for ; Mon, 1 Mar 2021 15:25:24 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 261FF68AA54; Mon, 1 Mar 2021 15:25:24 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lj1-f180.google.com (mail-lj1-f180.google.com [209.85.208.180]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 9A9AE68A8F0 for ; Mon, 1 Mar 2021 15:25:17 +0200 (EET) Received: by mail-lj1-f180.google.com with SMTP id p15so10443936ljc.13 for ; Mon, 01 Mar 2021 05:25:17 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=Pkl5HdXrU+opOhjYISnYbyfZudXIokpX3RllveCelyc=; b=AQySYnjTUyFVhSHmxTHFTXW4L5nCoQSRKAhwyzQXfpQwrqNh8vXEHPTzzwYBTos2ih 6pYgi/QjbsHKv9rq1LOZx9Eyxc1pB9A/x77ABh7r6pwVbP7j+THDyOUo5SYTauNcJqhG CcjXA9cnzo/f8/BeW2Q/By/6Hj4n2kn22Be10PpWQrcmfRI5ZloSlKIqnkRSOiXO1/gs 1c9ANu1Qbz6aRbcFLVWn8yGbOw3yB2ihx4RBjYT4M5l8X8N+4N/h18gvUT6oNCQCA3lY NMbc18GgDAZEenPL7QAnHBUUio/St2ivAOaVAhIlGHRHNGSz85WhETtG+CZnR7+rgXsz 5R+Q== 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:mime-version :content-transfer-encoding; bh=Pkl5HdXrU+opOhjYISnYbyfZudXIokpX3RllveCelyc=; b=CKA0V1Brsb1IZXdnJBNihmbD1VYgwQ+rN9nLFV38a3tlScNVUi9YODiO25LiV/3RVy sSUu2jH2lgE4d9fEWnnz3VaVu96tE22sOs123pj1BcQ3QmEkGeGHPUe7D0wc+U9dQ6Wp 23+O40xtOtpduM8VnqUt9ncZULEOlP+HOHupmpeXkiD2PFXrBB8VnYefJiP2tmKAIqz8 t+tLKHOqIifpvVQpFLJXRNimhD0tRjYMjmZACA20RvBnfkewc76Xp9JhRO732bWL7O8S YO+clVfsVyPeO4PtcLUNsw4p/n5aJxKgSrp/07Iv+IuVtBta8kXzULr9UFRv3IUtcluO 7h+w== X-Gm-Message-State: AOAM5304KDmfrGIy/SGIC1W5i9jvc1Kq+omtOOlnt/Hekr5xqa/4UKPa 4hLBm6aHPNqR8oHKFwlXlTF0Z1F7WfhRzYwD X-Google-Smtp-Source: ABdhPJwAnHqcNpXLr59xvaxx1s5rbBr7bFDua73frWB1D92LRFCYKXaQfMolkFCtCdGLpEOwcQfO/A== X-Received: by 2002:a17:906:12db:: with SMTP id l27mr15613628ejb.500.1614603254660; Mon, 01 Mar 2021 04:54:14 -0800 (PST) Received: from localhost.localdomain ([149.255.131.34]) by smtp.gmail.com with ESMTPSA id jj15sm8981530ejc.99.2021.03.01.04.54.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 01 Mar 2021 04:54:14 -0800 (PST) From: Vadym Bezdushnyi To: ffmpeg-devel@ffmpeg.org Date: Mon, 1 Mar 2021 14:53:48 +0200 Message-Id: <20210301125348.318-1-vadim.bezdush@gmail.com> X-Mailer: git-send-email 2.30.0 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] libavformat/movenc: Support encryption of H265 stream in AnnexB format 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: Vadym Bezdushnyi Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Add an ability to accept H265 AnnexB stream at encryption similar to how its done for H264 AnnexB stream. Steps to test: 1. Create h265 test files - mp4 and h265 AnnexB streams: ffmpeg -f lavfi -i testsrc=duration=10:size=640x480:rate=30 -c:v hevc input_h265.mp4 ffmpeg -f lavfi -i testsrc=duration=10:size=640x480:rate=30 -c:v hevc -bsf:v hevc_mp4toannexb input_h265.h265 2. Encrypt and decrypt files. Put appropriate input file name here: input_h265.mp4 or input_h265.h265 ffmpeg -i input_h265.h265 -vcodec copy -acodec copy -encryption_scheme cenc-aes-ctr \ -encryption_key 00000000000000000000000000000000 -encryption_kid 00000000000000000000000000000000 \ encrypted_h265.mp4 ffplay -i encrypted_h265.mp4 -decryption_key 00000000000000000000000000000000 Signed-off-by: Vadym Bezdushnyi --- libavformat/movenc.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/libavformat/movenc.c b/libavformat/movenc.c index 545b0885ae..0433968cd2 100644 --- a/libavformat/movenc.c +++ b/libavformat/movenc.c @@ -5685,7 +5685,15 @@ int ff_mov_write_packet(AVFormatContext *s, AVPacket *pkt) return ret; avio_write(pb, reformatted_data, size); } else { - size = ff_hevc_annexb2mp4(pb, pkt->data, pkt->size, 0, NULL); + if (trk->cenc.aes_ctr) { + size = ff_mov_cenc_avc_parse_nal_units(&trk->cenc, pb, pkt->data, size); + if (size < 0) { + ret = size; + goto err; + } + } else { + size = ff_hevc_annexb2mp4(pb, pkt->data, pkt->size, 0, NULL); + } } } else if (par->codec_id == AV_CODEC_ID_AV1) { if (trk->hint_track >= 0 && trk->hint_track < mov->nb_streams) { @@ -5727,6 +5735,9 @@ int ff_mov_write_packet(AVFormatContext *s, AVPacket *pkt) if (par->codec_id == AV_CODEC_ID_H264 && par->extradata_size > 4) { int nal_size_length = (par->extradata[4] & 0x3) + 1; ret = ff_mov_cenc_avc_write_nal_units(s, &trk->cenc, nal_size_length, pb, pkt->data, size); + } else if(par->codec_id == AV_CODEC_ID_HEVC && par->extradata_size > 21) { + int nal_size_length = (par->extradata[21] & 0x3) + 1; + ret = ff_mov_cenc_avc_write_nal_units(s, &trk->cenc, nal_size_length, pb, pkt->data, size); } else { ret = ff_mov_cenc_write_packet(&trk->cenc, pb, pkt->data, size); } @@ -6711,7 +6722,8 @@ static int mov_init(AVFormatContext *s) if (mov->encryption_scheme == MOV_ENC_CENC_AES_CTR) { ret = ff_mov_cenc_init(&track->cenc, mov->encryption_key, - track->par->codec_id == AV_CODEC_ID_H264, s->flags & AVFMT_FLAG_BITEXACT); + (track->par->codec_id == AV_CODEC_ID_H264 || track->par->codec_id == AV_CODEC_ID_HEVC), + s->flags & AVFMT_FLAG_BITEXACT); if (ret) return ret; }