@@ -3221,8 +3221,8 @@ static int mov_write_stbl_tag(AVFormatContext *s, AVIOContext *pb, MOVMuxContext
3221
3221
mov_write_stsc_tag (pb , track );
3222
3222
mov_write_stsz_tag (pb , track );
3223
3223
mov_write_stco_tag (pb , track );
3224
- if (track -> cenc .aes_ctr ) {
3225
- ff_mov_cenc_write_stbl_atoms (& track -> cenc , pb );
3224
+ if (track -> cenc .aes_ctr && !( mov -> flags & FF_MOV_FLAG_FRAGMENT ) ) {
3225
+ ff_mov_cenc_write_stbl_atoms (& track -> cenc , pb , 0 );
3226
3226
}
3227
3227
if (track -> par -> codec_id == AV_CODEC_ID_OPUS || track -> par -> codec_id == AV_CODEC_ID_AAC ) {
3228
3228
mov_preroll_write_stbl_atoms (pb , track );
@@ -4899,6 +4899,43 @@ static int mov_write_uuidusmt_tag(AVIOContext *pb, AVFormatContext *s)
4899
4899
return 0 ;
4900
4900
}
4901
4901
4902
+ static int mov_write_pssh_tag (AVIOContext * pb , AVStream * st )
4903
+ {
4904
+ AVEncryptionInitInfo * info ;
4905
+ const AVPacketSideData * sd = av_packet_side_data_get (st -> codecpar -> coded_side_data ,
4906
+ st -> codecpar -> nb_coded_side_data ,
4907
+ AV_PKT_DATA_ENCRYPTION_INIT_INFO );
4908
+ if (!sd )
4909
+ return 0 ;
4910
+
4911
+ info = av_encryption_init_info_get_side_data (sd -> data , sd -> size );
4912
+ for (AVEncryptionInitInfo * copy = info ; copy ; copy = copy -> next ) {
4913
+ int64_t pos ;
4914
+
4915
+ if (!copy -> data_size && !copy -> num_key_ids )
4916
+ continue ;
4917
+
4918
+ pos = avio_tell (pb );
4919
+ avio_wb32 (pb , 0 ); /* size placeholder */
4920
+ ffio_wfourcc (pb , "pssh" );
4921
+ avio_w8 (pb , 1 ); /* version */
4922
+ avio_wb24 (pb , 0 );
4923
+ for (int i = 0 ; i < copy -> system_id_size ; i ++ )
4924
+ avio_w8 (pb , copy -> system_id [i ]);
4925
+ avio_wb32 (pb , copy -> num_key_ids );
4926
+ for (int i = 0 ; i < copy -> num_key_ids ; i ++ )
4927
+ for (int j = 0 ; j < copy -> key_id_size ; j ++ )
4928
+ avio_w8 (pb , copy -> key_ids [i ][j ]);
4929
+ avio_wb32 (pb , copy -> data_size );
4930
+ avio_write (pb , copy -> data , copy -> data_size );
4931
+ update_size (pb , pos );
4932
+ }
4933
+
4934
+ av_encryption_init_info_free (info );
4935
+
4936
+ return 0 ;
4937
+ }
4938
+
4902
4939
static void build_chunks (MOVTrack * trk )
4903
4940
{
4904
4941
int i ;
@@ -5046,6 +5083,8 @@ static int mov_write_moov_tag(AVIOContext *pb, MOVMuxContext *mov,
5046
5083
mov_write_uuidusmt_tag (pb , s );
5047
5084
else if (mov -> mode != MODE_AVIF )
5048
5085
mov_write_udta_tag (pb , mov , s );
5086
+ for (i = 0 ; i < mov -> nb_streams ; i ++ )
5087
+ mov_write_pssh_tag (pb , mov -> tracks [i ].st );
5049
5088
5050
5089
return update_size (pb , pos );
5051
5090
}
@@ -5499,6 +5538,9 @@ static int mov_write_traf_tag(AVIOContext *pb, MOVMuxContext *mov,
5499
5538
}
5500
5539
}
5501
5540
5541
+ if (track -> cenc .aes_ctr && (mov -> flags & FF_MOV_FLAG_FRAGMENT ))
5542
+ ff_mov_cenc_write_stbl_atoms (& track -> cenc , pb , moof_offset );
5543
+
5502
5544
return update_size (pb , pos );
5503
5545
}
5504
5546
@@ -5519,6 +5561,8 @@ static int mov_write_moof_tag_internal(AVIOContext *pb, MOVMuxContext *mov,
5519
5561
continue ;
5520
5562
if (!track -> entry )
5521
5563
continue ;
5564
+ if (track -> cenc .aes_ctr && (mov -> flags & FF_MOV_FLAG_FRAGMENT ))
5565
+ mov_write_pssh_tag (pb , track -> st );
5522
5566
mov_write_traf_tag (pb , mov , track , pos , moof_size );
5523
5567
}
5524
5568
0 commit comments