Commit f7221d8e authored by Jacob Trimble's avatar Jacob Trimble Committed by Michael Niedermayer

avformat/mov: Increase support for common encryption.

- Parse schm atom to get different encryption schemes.
- Allow senc atom to appear in track fragments.
- Allow 16-byte IVs.
- Allow constant IVs (specified in tenc).
- Allow only tenc to specify encryption (i.e. no senc/saiz/saio).
- Use sample descriptor to detect clear fragments.

This doesn't support:
- Different sample descriptor holding different encryption info.
  - Only first sample descriptor can be encrypted.
- Encrypted sample groups (i.e. seig).
- Non-'cenc' encryption scheme when using -decryption_key.
Signed-off-by: 's avatarJacob Trimble <modmaker@google.com>
Signed-off-by: 's avatarMichael Niedermayer <michael@niedermayer.cc>
parent 37175122
......@@ -27,6 +27,7 @@
#include <stddef.h>
#include <stdint.h>
#include "libavutil/encryption_info.h"
#include "libavutil/mastering_display_metadata.h"
#include "libavutil/spherical.h"
#include "libavutil/stereo3d.h"
......@@ -108,12 +109,20 @@ typedef struct MOVSbgp {
unsigned int index;
} MOVSbgp;
typedef struct MOVEncryptionIndex {
// Individual encrypted samples. If there are no elements, then the default
// settings will be used.
unsigned int nb_encrypted_samples;
AVEncryptionInfo **encrypted_samples;
} MOVEncryptionIndex;
typedef struct MOVFragmentStreamInfo {
int id;
int64_t sidx_pts;
int64_t first_tfra_pts;
int64_t tfdt_dts;
int index_entry;
MOVEncryptionIndex *encryption_index;
} MOVFragmentStreamInfo;
typedef struct MOVFragmentIndexItem {
......@@ -215,6 +224,7 @@ typedef struct MOVStreamContext {
int has_sidx; // If there is an sidx entry for this stream.
struct {
// TODO: Remove once old methods are removed from mov.c
int use_subsamples;
uint8_t* auxiliary_info;
uint8_t* auxiliary_info_end;
......@@ -223,7 +233,11 @@ typedef struct MOVStreamContext {
uint8_t* auxiliary_info_sizes;
size_t auxiliary_info_sizes_count;
int64_t auxiliary_info_index;
struct AVAESCTR* aes_ctr;
unsigned int per_sample_iv_size; // Either 0, 8, or 16.
AVEncryptionInfo *default_encrypted_sample;
MOVEncryptionIndex *encryption_index;
} cenc;
} MOVStreamContext;
......
This diff is collapsed.
......@@ -41,7 +41,7 @@ typedef struct AVSubsampleEncryptionInfo {
* The size of this struct is not part of the public ABI.
*/
typedef struct AVEncryptionInfo {
/** The fourcc encryption scheme. */
/** The fourcc encryption scheme, in big-endian byte order. */
uint32_t scheme;
/**
......
......@@ -6,6 +6,8 @@ FATE_MOV = fate-mov-3elist \
fate-mov-1elist-ends-last-bframe \
fate-mov-2elist-elist1-ends-bframe \
fate-mov-3elist-encrypted \
fate-mov-frag-encrypted \
fate-mov-tenc-only-encrypted \
fate-mov-invalid-elst-entry-count \
fate-mov-gpmf-remux \
fate-mov-440hz-10ms \
......@@ -39,6 +41,12 @@ fate-mov-3elist-1ctts: CMD = framemd5 -i $(TARGET_SAMPLES)/mov/mov-3elist-1ctts.
# Edit list with encryption
fate-mov-3elist-encrypted: CMD = framemd5 -decryption_key 12345678901234567890123456789012 -i $(TARGET_SAMPLES)/mov/mov-3elist-encrypted.mov
# Fragmented encryption with senc boxes in movie fragments.
fate-mov-frag-encrypted: CMD = framemd5 -decryption_key 12345678901234567890123456789012 -i $(TARGET_SAMPLES)/mov/mov-frag-encrypted.mp4
# Full-sample encryption and constant IV using only tenc atom (no senc/saio/saiz).
fate-mov-tenc-only-encrypted: CMD = framemd5 -decryption_key 12345678901234567890123456789012 -i $(TARGET_SAMPLES)/mov/mov-tenc-only-encrypted.mp4
# Makes sure that the CTTS is also modified when we fix avindex in mov.c while parsing edit lists.
fate-mov-elist-starts-ctts-2ndsample: CMD = framemd5 -i $(TARGET_SAMPLES)/mov/mov-elist-starts-ctts-2ndsample.mov
......
#format: frame checksums
#version: 2
#hash: MD5
#tb 0: 1/24
#media_type 0: video
#codec_id 0: rawvideo
#dimensions 0: 120x52
#sar 0: 544/545
#stream#, dts, pts, duration, size, hash
0, 0, 0, 1, 9360, 920bdc277a6a31c1daed9aca44b10caf
0, 1, 1, 1, 9360, f1c0b61fef593de57cb97be7fa846569
0, 2, 2, 1, 9360, 6ef32d9d4398355aebf6d3fb11d51d3f
0, 3, 3, 1, 9360, d38fd3ef1e5a92fc109b8dd9eb6dadeb
0, 4, 4, 1, 9360, 54cc0c8a25d2f14f32663837d5e646f1
0, 5, 5, 1, 9360, b4b6829726dc3decb8b80ba0c35bcf30
0, 6, 6, 1, 9360, fca3f941e60a2f0a4ce30d5e0efbec3c
0, 7, 7, 1, 9360, cda6e26b6c1039ff3d229b262c9210c3
0, 8, 8, 1, 9360, f0d69255e3a27a8b4ae8a4b7b210929d
0, 9, 9, 1, 9360, 12cb23dd4e32af9c3b35f943714e3fdd
0, 10, 10, 1, 9360, 082aaf3216124ddcecb422fe5c832e82
0, 11, 11, 1, 9360, ff37bb8cd6bd0412a3b3cb45db54afc9
0, 12, 12, 1, 9360, dfb9085441575732844b6c2f05d5f542
0, 13, 13, 1, 9360, 0017100feaaa9fc7eacd2447d50d7542
0, 14, 14, 1, 9360, 4e2f1b8c4e04c59934c2f58541e62613
0, 15, 15, 1, 9360, 27a44dfea7cd2d30e488194c34ab473c
0, 16, 16, 1, 9360, fc7b56bd95e990a33cf575d1ef820902
0, 17, 17, 1, 9360, fa2d1609e69714dffc410e65f3c8b755
0, 18, 18, 1, 9360, 705d7429f447cb13febe202d567795f2
0, 19, 19, 1, 9360, 234802ce86e868faaf2cd40a286846ea
0, 20, 20, 1, 9360, 2f0354b40d211d0a4ade4568bea4f85e
0, 21, 21, 1, 9360, e96af3b6c0cc931463ca77d6be0f1148
0, 22, 22, 1, 9360, 04a904d798361959971361401879c7e4
0, 23, 23, 1, 9360, 2f119642340df6d25362b5590ded46b7
0, 24, 24, 1, 9360, 5993fca2e60050706f857ac76e48f386
0, 25, 25, 1, 9360, 2ff3b5775fed3d527bfbbeea786787fe
0, 26, 26, 1, 9360, 42024dbe23d3fb5b0d8987ae1ce390a8
0, 27, 27, 1, 9360, d804204f0bd9db5f6a758e2c934d9e38
0, 28, 28, 1, 9360, e322712e6e34c58ec1a2ab5e2c1e3bfe
0, 29, 29, 1, 9360, 3975bd1a5f6a6b6260276777f9de611e
0, 30, 30, 1, 9360, 4388f0412efc6310706a7cdedc859ea9
0, 31, 31, 1, 9360, b4b9a11b0b86635267345a569640e8d4
0, 32, 32, 1, 9360, 31879c7b8d6b67a4209ffde786bb8cb4
0, 33, 33, 1, 9360, 4b6dc02d7c889fe4abd4e013b25f585a
0, 34, 34, 1, 9360, dc73aae82bd39a1220d1106c8d3e8252
0, 35, 35, 1, 9360, 54c7dfbd49f312806f6c1a89f7c2c36f
0, 36, 36, 1, 9360, 150abc64f8994d444a521ea90570443c
0, 37, 37, 1, 9360, d277cdc7dcadbe0016f2e950459e7ebf
0, 38, 38, 1, 9360, 2196bf338ead90ea54687b85c73c8229
0, 39, 39, 1, 9360, 53ce5da5365abc0bd3217dd98e7c465d
0, 40, 40, 1, 9360, 34ee9832aea55c0c4e6f4381c413c10e
0, 41, 41, 1, 9360, 1769c7b5849e4681119067a06ac29a4f
0, 42, 42, 1, 9360, 71f53df739ef283a5184c91ef4b158e8
0, 43, 43, 1, 9360, d2d394739e9a59c06f0354c16843cb63
0, 44, 44, 1, 9360, d8e458e92ae29344505a24a3059fc584
0, 45, 45, 1, 9360, 0f1b11a09911851b798df2ef76253a7f
0, 46, 46, 1, 9360, 5c4a9f22baecf4e749c0d5c65a4f1007
0, 47, 47, 1, 9360, 3e2b7e7262fdca08d9d1ef6070125c4b
#format: frame checksums
#version: 2
#hash: MD5
#tb 0: 1/24
#media_type 0: video
#codec_id 0: rawvideo
#dimensions 0: 1024x436
#sar 0: 1/1
#stream#, dts, pts, duration, size, hash
0, 0, 0, 1, 669696, f48f296a85eda5ba069dc851a3228bef
0, 1, 1, 1, 669696, a50c5f69bfa3387d49b5bdf738e6529c
0, 2, 2, 1, 669696, 05061299003760f6a4795b408f72aa31
0, 3, 3, 1, 669696, 2572119f0b0cdd83f8a7e06252cecd3b
0, 4, 4, 1, 669696, 29fe6a6bdb4a69018e318886a297f07e
0, 5, 5, 1, 669696, e8233c7fbaecfbff965c7dfdd3982b1b
0, 6, 6, 1, 669696, d9259df9880ff5d4a4b38282e67f407b
0, 7, 7, 1, 669696, 3e8d795195038993503ea9ab6984c915
0, 8, 8, 1, 669696, bc4e2d253b715a34f85aae1b080e3460
0, 9, 9, 1, 669696, 09aba8b3a96f53f9268e7420a10bfab6
0, 10, 10, 1, 669696, 179447977dd580da8b35fb5310a809ca
0, 11, 11, 1, 669696, 7a0eea9d54577990345f5705ab9882be
0, 12, 12, 1, 669696, 5bb96eb76f461825740e5938456df759
0, 13, 13, 1, 669696, bd4ac4a760ead774b9422a27dc071964
0, 14, 14, 1, 669696, 1cc05f760a9b751fc89e77f2bcc97259
0, 15, 15, 1, 669696, 825d0dee6f0174ba7102892c7de30b4d
0, 16, 16, 1, 669696, d26a2ef5267f6bb03c4e1d8514eee0df
0, 17, 17, 1, 669696, c916ffdeadca76596a8f7fd47914b5ef
0, 18, 18, 1, 669696, 6e085acfa7fee0658ea0ae6188274c17
0, 19, 19, 1, 669696, 1e95fa5b3561283f05bf0bd44cb91721
0, 20, 20, 1, 669696, 37e3d135aba9dfb8b87e441753115374
0, 21, 21, 1, 669696, 9c398310e8564491de624393c16265ce
0, 22, 22, 1, 669696, c87209e4d2617bc2ab40a75f455f09da
0, 23, 23, 1, 669696, 2679c2f8d1d1af21982e245945c1ee60
0, 24, 24, 1, 669696, 6151ab4781f31c5beb66b356ad547122
0, 25, 25, 1, 669696, f7ef6293bfb3a6a329061cb6a5ed5a38
0, 26, 26, 1, 669696, 2f6e666d14dfc407ca0c0f347b13eb08
0, 27, 27, 1, 669696, 3454fa1730d79b1aa8dbbc865dc150f4
0, 28, 28, 1, 669696, e93dc683e2453419a0419ab9af0f8f95
0, 29, 29, 1, 669696, 031eb3154f7f83cf86d42bee66be9cf7
0, 30, 30, 1, 669696, 1205c36723e88811206c68892d3aaed6
0, 31, 31, 1, 669696, 7dd7a8a19dcd73b31ddc6a6d0c597a42
0, 32, 32, 1, 669696, 7c91115368ea2531262a1197468bc3f4
0, 33, 33, 1, 669696, 3cf6d9ba385e0fff76da33299ed5380c
0, 34, 34, 1, 669696, 859fc8c3ef049e3c1175a85fb0a90a3d
0, 35, 35, 1, 669696, 1d09ce6c7027103d99a4d5799f6e72ab
0, 36, 36, 1, 669696, 3dcb8357408ac88abd734128d8f5dd6f
0, 37, 37, 1, 669696, 4dafce137a0a5178f6efaec878e64d36
0, 38, 38, 1, 669696, 44c478f29a1399ed03275a7357f57d48
0, 39, 39, 1, 669696, 6e9edaac7414c0e14591ac3d4d0b1ac4
0, 40, 40, 1, 669696, 522e4aaeea0825da27f631a9e690d654
0, 41, 41, 1, 669696, 85f2502a718440834c40051d30f8a65e
0, 42, 42, 1, 669696, ae8816f7bd4645ef1a17ee6d09b4c8d2
0, 43, 43, 1, 669696, 914b006fa92f1eb3e590245749f6810d
0, 44, 44, 1, 669696, 9406901542e94c429dff46108782ed69
0, 45, 45, 1, 669696, 324c13641c39eef5c476023e358c0391
0, 46, 46, 1, 669696, 4058e886e17c22e4eb9da1dd0d6ad891
0, 47, 47, 1, 669696, 9edf9cd15eea985b42fd1f5035b1d693
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment