[FFmpeg-devel] [PATCH] libavformat/movenc: Support encryption of H265 stream in AnnexB format

Gyan Doshi ffmpeg at gyani.pro
Tue Jun 29 15:52:20 EEST 2021


Pushed as b74beba9a9a317caa7ac973cb76cc6ab0ade7667


On 2021-06-29 13:11, Gyan Doshi wrote:
>
>
> On 2021-06-29 12:25, Вадим Бездушный wrote:
>> Ping.
>> This patch will allow to encrypt streams, which were produced by
>> hevc_mp4toannexb or movenc muxer.
>> Currently, encryption doesn't work for HEVC AnnexB. The resulting mp4 is
>> not written correctly and can't be played.
>> The patch is quite small and it contains tests, which will allow
>> checking encryption before and after.
>> Feel free to ask any questions.
>
> Eran LGTMed it on the 4th of June and FATE passes on Patchwork, so 
> I'll push this in a few hours if no one objects.
>
> Regards,
> Gyan
>
>>
>> чт, 17 июн. 2021 г. в 11:32, Вадим Бездушный <vadim.bezdush at gmail.com>:
>>
>>> Ping.
>>> This patch will allow to encrypt streams, which were produced by
>>> hevc_mp4toannexb or movenc muxer.
>>> Currently, encryption doesn't work for HEVC AnnexB. The resulting 
>>> mp4 is
>>> not written correctly and can't be played.
>>> The patch is quite small and it contains tests, which will allow
>>> checking encryption before and after.
>>> Feel free to ask any questions.
>>>
>>> пт, 4 июн. 2021 г. в 11:08, Eran Kornblau <eran.kornblau at kaltura.com>:
>>>
>>>>> -----Original Message-----
>>>>> From: ffmpeg-devel <ffmpeg-devel-bounces at ffmpeg.org> On Behalf Of
>>>> ????? ?????????
>>>>> Sent: Friday, June 4, 2021 9:27 AM
>>>>> To: ffmpeg-devel at ffmpeg.org
>>>>> Subject: Re: [FFmpeg-devel] [PATCH] libavformat/movenc: Support
>>>> encryption of H265 stream in AnnexB format
>>>>>
>>>>> Ping.
>>>>>
>>>>> This change is quite simple and should be quick to review. Feel 
>>>>> free to
>>>> ask any questions
>>>>
>>>> Looks good to me
>>>>
>>>> Eran
>>>>
>>>>> пн, 22 мар. 2021 г. в 11:29, Вадим Бездушный 
>>>>> <vadim.bezdush at gmail.com>:
>>>>>
>>>>>> Ping.
>>>>>>
>>>>>> чт, 11 мар. 2021 г. в 10:14, Вадим Бездушный 
>>>>>> <vadim.bezdush at gmail.com
>>>>> :
>>>>>>> Ping.
>>>>>>>
>>>>>>> вт, 9 мар. 2021 г. в 00:05, Вадим Бездушный 
>>>>>>> <vadim.bezdush at gmail.com
>>>>> :
>>>>>>>> Ping.
>>>>>>>>
>>>>>>>> This change is quite simple and should be quick to review. Feel
>>>> free
>>>>>>>> to ask any questions
>>>>>>>>
>>>>>>>> On Mon, 1 Mar 2021, 14:54 Vadym Bezdushnyi,
>>>>>>>> <vadim.bezdush at gmail.com>
>>>>>>>> wrote:
>>>>>>>>
>>>>>>>>> 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 <vadim.bezdush at gmail.com>
>>>>>>>>> ---
>>>>>>>>>   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;
>>>>>>>>>           }
>>>>>>>>> -- 
>>>>>>>>> 2.30.0
>>>>>>>>>
>>>>>>>>>
>>>>> _______________________________________________
>>>>> ffmpeg-devel mailing list
>>>>> ffmpeg-devel at ffmpeg.org
>>>>>
>>>> https://eur02.safelinks.protection.outlook.com/?url=https%3A%2F%2Fffmpeg.org%2Fmailman%2Flistinfo%2Fffmpeg-devel&data=04%7C01%7C%7C724744e3bfed40c5995508d92725c852%7C0c503748de3f4e2597e26819d53a42b6%7C1%7C1%7C637583865496478909%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000&sdata=l2rO0HEmDBCJ8RdN3keR0oGE1IZub2TZeN4o%2FdJKcfM%3D&reserved=0 
>>>>
>>>>> To unsubscribe, visit link above, or email
>>>> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".
>>>> _______________________________________________
>>>> ffmpeg-devel mailing list
>>>> ffmpeg-devel at ffmpeg.org
>>>> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>>>>
>>>> To unsubscribe, visit link above, or email
>>>> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".
>>>>
>> _______________________________________________
>> ffmpeg-devel mailing list
>> ffmpeg-devel at ffmpeg.org
>> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>>
>> To unsubscribe, visit link above, or email
>> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".



More information about the ffmpeg-devel mailing list