Message ID | 20210301125348.318-1-vadim.bezdush@gmail.com |
---|---|
State | Accepted |
Commit | b74beba9a9a317caa7ac973cb76cc6ab0ade7667 |
Headers | show |
Series | [FFmpeg-devel] libavformat/movenc: Support encryption of H265 stream in AnnexB format | expand |
Context | Check | Description |
---|---|---|
andriy/x86_make | success | Make finished |
andriy/x86_make_fate | success | Make fate finished |
andriy/PPC64_make | success | Make finished |
andriy/PPC64_make_fate | success | Make fate finished |
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@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@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 > >
Ping. вт, 9 мар. 2021 г. в 00:05, Вадим Бездушный <vadim.bezdush@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@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@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 >> >>
Ping. чт, 11 мар. 2021 г. в 10:14, Вадим Бездушный <vadim.bezdush@gmail.com>: > Ping. > > вт, 9 мар. 2021 г. в 00:05, Вадим Бездушный <vadim.bezdush@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@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@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 >>> >>>
Ping. This change is quite simple and should be quick to review. Feel free to ask any questions пн, 22 мар. 2021 г. в 11:29, Вадим Бездушный <vadim.bezdush@gmail.com>: > Ping. > > чт, 11 мар. 2021 г. в 10:14, Вадим Бездушный <vadim.bezdush@gmail.com>: > >> Ping. >> >> вт, 9 мар. 2021 г. в 00:05, Вадим Бездушный <vadim.bezdush@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@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@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 >>>> >>>>
> > -----Original Message----- > From: ffmpeg-devel <ffmpeg-devel-bounces@ffmpeg.org> On Behalf Of ????? ????????? > Sent: Friday, June 4, 2021 9:27 AM > To: ffmpeg-devel@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@gmail.com>: > > > Ping. > > > > чт, 11 мар. 2021 г. в 10:14, Вадим Бездушный <vadim.bezdush@gmail.com>: > > > >> Ping. > >> > >> вт, 9 мар. 2021 г. в 00:05, Вадим Бездушный <vadim.bezdush@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@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@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@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@ffmpeg.org with subject "unsubscribe". >
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@kaltura.com>: > > > > -----Original Message----- > > From: ffmpeg-devel <ffmpeg-devel-bounces@ffmpeg.org> On Behalf Of ????? > ????????? > > Sent: Friday, June 4, 2021 9:27 AM > > To: ffmpeg-devel@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@gmail.com>: > > > > > Ping. > > > > > > чт, 11 мар. 2021 г. в 10:14, Вадим Бездушный <vadim.bezdush@gmail.com > >: > > > > > >> Ping. > > >> > > >> вт, 9 мар. 2021 г. в 00:05, Вадим Бездушный <vadim.bezdush@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@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@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@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@ffmpeg.org with subject "unsubscribe". > > > _______________________________________________ > ffmpeg-devel mailing list > ffmpeg-devel@ffmpeg.org > https://ffmpeg.org/mailman/listinfo/ffmpeg-devel > > To unsubscribe, visit link above, or email > ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe". >
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. чт, 17 июн. 2021 г. в 11:32, Вадим Бездушный <vadim.bezdush@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@kaltura.com>: > >> > >> > -----Original Message----- >> > From: ffmpeg-devel <ffmpeg-devel-bounces@ffmpeg.org> On Behalf Of >> ????? ????????? >> > Sent: Friday, June 4, 2021 9:27 AM >> > To: ffmpeg-devel@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@gmail.com>: >> > >> > > Ping. >> > > >> > > чт, 11 мар. 2021 г. в 10:14, Вадим Бездушный <vadim.bezdush@gmail.com >> >: >> > > >> > >> Ping. >> > >> >> > >> вт, 9 мар. 2021 г. в 00:05, Вадим Бездушный <vadim.bezdush@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@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@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@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@ffmpeg.org with subject "unsubscribe". >> > >> _______________________________________________ >> ffmpeg-devel mailing list >> ffmpeg-devel@ffmpeg.org >> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel >> >> To unsubscribe, visit link above, or email >> ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe". >> >
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@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@kaltura.com>: >> >>>> -----Original Message----- >>>> From: ffmpeg-devel <ffmpeg-devel-bounces@ffmpeg.org> On Behalf Of >>> ????? ????????? >>>> Sent: Friday, June 4, 2021 9:27 AM >>>> To: ffmpeg-devel@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@gmail.com>: >>>> >>>>> Ping. >>>>> >>>>> чт, 11 мар. 2021 г. в 10:14, Вадим Бездушный <vadim.bezdush@gmail.com >>>> : >>>>>> Ping. >>>>>> >>>>>> вт, 9 мар. 2021 г. в 00:05, Вадим Бездушный <vadim.bezdush@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@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@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@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@ffmpeg.org with subject "unsubscribe". >>> _______________________________________________ >>> ffmpeg-devel mailing list >>> ffmpeg-devel@ffmpeg.org >>> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel >>> >>> To unsubscribe, visit link above, or email >>> ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe". >>> > _______________________________________________ > ffmpeg-devel mailing list > ffmpeg-devel@ffmpeg.org > https://ffmpeg.org/mailman/listinfo/ffmpeg-devel > > To unsubscribe, visit link above, or email > ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
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@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@kaltura.com>: >>> >>>>> -----Original Message----- >>>>> From: ffmpeg-devel <ffmpeg-devel-bounces@ffmpeg.org> On Behalf Of >>>> ????? ????????? >>>>> Sent: Friday, June 4, 2021 9:27 AM >>>>> To: ffmpeg-devel@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@gmail.com>: >>>>> >>>>>> Ping. >>>>>> >>>>>> чт, 11 мар. 2021 г. в 10:14, Вадим Бездушный >>>>>> <vadim.bezdush@gmail.com >>>>> : >>>>>>> Ping. >>>>>>> >>>>>>> вт, 9 мар. 2021 г. в 00:05, Вадим Бездушный >>>>>>> <vadim.bezdush@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@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@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@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@ffmpeg.org with subject "unsubscribe". >>>> _______________________________________________ >>>> ffmpeg-devel mailing list >>>> ffmpeg-devel@ffmpeg.org >>>> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel >>>> >>>> To unsubscribe, visit link above, or email >>>> ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe". >>>> >> _______________________________________________ >> ffmpeg-devel mailing list >> ffmpeg-devel@ffmpeg.org >> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel >> >> To unsubscribe, visit link above, or email >> ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe". > > _______________________________________________ > ffmpeg-devel mailing list > ffmpeg-devel@ffmpeg.org > https://ffmpeg.org/mailman/listinfo/ffmpeg-devel > > To unsubscribe, visit link above, or email > ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
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; }
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@gmail.com> --- libavformat/movenc.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-)