[FFmpeg-devel] Patch for libavformat/crypto to add seeking on read

Michael Niedermayer michael at niedermayer.cc
Mon Aug 29 20:11:43 EEST 2016


On Mon, Aug 29, 2016 at 11:08:36AM +0100, Simon H wrote:
> crypto allows reading of data which has been aes-128-cbc encrypted given a
> key and an iv.
> But it did not handle filetypes which require seeking...  e.g. it failed on
> an encrypted .mp4 file.
> 
> example:
> take 25.mp4 created with:
> ffmpeg -f lavfi -i sine=frequency=1000:beep_factor=2:r=48000:duration=720.0
> -f lavfi -i testsrc=duration=720.0:rate=25 -vcodec libx264 -cmp 22
> -timecode 10:00:00:00 -r 25 -y out\25.mp4
> 
> encrypt with:
> openssl enc -aes-128-cbc -K 12345678901234567890123456789012 -iv
> 12345678901234567890123456789012 -in 25.mp4 -out 25.enc
> then to transcode in ffmpeg:
> ffmpeg -key 12345678901234567890123456789012 -iv
> 12345678901234567890123456789012 -i crypto:25.enc -vcodec mpeg4 -r 25 -y
> 25dec.mp4
> 
> prior to this modification, the transcode would fail.
> 
> Note also:  crypto previously marked both reads and writes as streamed,
> which caused the whole file
> to be read before the transcode started.  Now, for read only, if the
> underlying layer is not marked as streamed,
> then crypto is not.  This should enable efficient reading of encrypted
> containers which require seeking.
> 
> this is my first patch for ffmpeg; guidance appreciated.
> ---
>  libavformat/crypto.c | 115
> +++++++++++++++++++++++++++++++++++++++++++++++++--
>  1 file changed, 112 insertions(+), 3 deletions(-)
> 
> diff --git a/libavformat/crypto.c b/libavformat/crypto.c
> index 2999f50..23bc0a6 100644
> --- a/libavformat/crypto.c
> +++ b/libavformat/crypto.c
> @@ -26,7 +26,8 @@
>  #include "internal.h"
>  #include "url.h"
> 
> -#define MAX_BUFFER_BLOCKS 150
> +// encourage reads of 4096 bytes - 1 block is always retained.
> +#define MAX_BUFFER_BLOCKS 257
>  #define BLOCKSIZE 16
> 
>  typedef struct CryptoContext {
> @@ -36,6 +37,8 @@ typedef struct CryptoContext {
>              outbuffer[BLOCKSIZE*MAX_BUFFER_BLOCKS];
>      uint8_t *outptr;
>      int indata, indata_used, outdata;
> +    int64_t position;  // position in file - used in seek
> +    int flags;
>      int eof;
>      uint8_t *key;
>      int keylen;
> @@ -109,6 +112,7 @@ static int crypto_open2(URLContext *h, const char *uri,
> int flags, AVDictionary
>      const char *nested_url;
>      int ret = 0;
>      CryptoContext *c = h->priv_data;
> +    c->flags = flags;
> 
>      if (!av_strstart(uri, "crypto+", &nested_url) &&
>          !av_strstart(uri, "crypto:", &nested_url)) {
> @@ -117,6 +121,8 @@ static int crypto_open2(URLContext *h, const char *uri,
> int flags, AVDictionary

patch corrupted by newlines

[...]
-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

If a bugfix only changes things apparently unrelated to the bug with no
further explanation, that is a good sign that the bugfix is wrong.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 181 bytes
Desc: Digital signature
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20160829/7e19f312/attachment.sig>


More information about the ffmpeg-devel mailing list