diff mbox

[FFmpeg-devel] avformat/matroskadec: Parse encryption init info from streams.

Message ID CAO7y9i-Jm7Jqy2N_mKv2X4ZRGbQTs4v+F9Dnqoe9b3_VOLtPBA@mail.gmail.com
State New
Headers show

Commit Message

Jacob Trimble Aug. 28, 2018, 7:56 p.m. UTC
On Mon, Aug 20, 2018 at 11:39 AM Jacob Trimble <modmaker@google.com> wrote:
>
> On Thu, Aug 9, 2018 at 9:14 AM Jacob Trimble <modmaker@google.com> wrote:
> >
> > On Wed, Aug 1, 2018 at 1:46 PM Jacob Trimble <modmaker@google.com> wrote:
> > >
> > > On Mon, Jul 23, 2018 at 2:01 PM Jacob Trimble <modmaker@google.com> wrote:
> > > >
> > > > On Thu, Jul 12, 2018 at 5:05 PM Jacob Trimble <modmaker@google.com> wrote:
> > > > >
> > > > > Signed-off-by: Jacob Trimble <modmaker@google.com>
> > > > > ---
> > > > >  libavformat/matroskadec.c | 43 +++++++++++++++++++++++++++++----------
> > > > >  1 file changed, 32 insertions(+), 11 deletions(-)
> > > > >
> > > > > diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
> > > > > index 1ded431b80..bfef329e59 100644
> > > > > --- a/libavformat/matroskadec.c
> > > > > +++ b/libavformat/matroskadec.c
> > > > > @@ -2080,7 +2080,8 @@ static int matroska_parse_tracks(AVFormatContext *s)
> > > > >          int extradata_offset = 0;
> > > > >          uint32_t fourcc = 0;
> > > > >          AVIOContext b;
> > > > > -        char* key_id_base64 = NULL;
> > > > > +        char* key_id = NULL;
> > > > > +        int key_id_size = 0;
> > > > >          int bit_depth = -1;
> > > > >
> > > > >          /* Apply some sanity checks. */
> > > > > @@ -2133,14 +2134,8 @@ static int matroska_parse_tracks(AVFormatContext *s)
> > > > >                  if (encodings[0].encryption.key_id.size > 0) {
> > > > >                      /* Save the encryption key id to be stored later as a
> > > > >                         metadata tag. */
> > > > > -                    const int b64_size = AV_BASE64_SIZE(encodings[0].encryption.key_id.size);
> > > > > -                    key_id_base64 = av_malloc(b64_size);
> > > > > -                    if (key_id_base64 == NULL)
> > > > > -                        return AVERROR(ENOMEM);
> > > > > -
> > > > > -                    av_base64_encode(key_id_base64, b64_size,
> > > > > -                                     encodings[0].encryption.key_id.data,
> > > > > -                                     encodings[0].encryption.key_id.size);
> > > > > +                    key_id = encodings[0].encryption.key_id.data;
> > > > > +                    key_id_size = encodings[0].encryption.key_id.size;
> > > > >                  } else {
> > > > >                      encodings[0].scope = 0;
> > > > >                      av_log(matroska->ctx, AV_LOG_ERROR,
> > > > > @@ -2198,14 +2193,40 @@ static int matroska_parse_tracks(AVFormatContext *s)
> > > > >
> > > > >          st = track->stream = avformat_new_stream(s, NULL);
> > > > >          if (!st) {
> > > > > -            av_free(key_id_base64);
> > > > >              return AVERROR(ENOMEM);
> > > > >          }
> > > > >
> > > > > -        if (key_id_base64) {
> > > > > +        if (key_id) {
> > > > > +            AVEncryptionInitInfo *init_info;
> > > > > +            uint8_t *side_data;
> > > > > +            size_t side_data_size;
> > > > > +            const int b64_size = AV_BASE64_SIZE(key_id_size);
> > > > > +            char *key_id_base64 = av_malloc(b64_size);
> > > > > +            if (!key_id_base64)
> > > > > +                return AVERROR(ENOMEM);
> > > > > +            av_base64_encode(key_id_base64, b64_size, key_id, key_id_size);
> > > > > +
> > > > >              /* export encryption key id as base64 metadata tag */
> > > > >              av_dict_set(&st->metadata, "enc_key_id", key_id_base64, 0);
> > > > >              av_freep(&key_id_base64);
> > > > > +
> > > > > +
> > > > > +            /* Convert the key ID to a generic encryption init info */
> > > > > +            init_info = av_encryption_init_info_alloc(/* system_id_size */ 0, /* num_key_ids */ 1,
> > > > > +                                                      /* key_id_size */ key_id_size, /* data_size */ 0);
> > > > > +            if (!init_info)
> > > > > +                return AVERROR(ENOMEM);
> > > > > +            memcpy(init_info->key_ids[0], key_id, key_id_size);
> > > > > +            side_data = av_encryption_init_info_add_side_data(init_info, &side_data_size);
> > > > > +            av_encryption_init_info_free(init_info);
> > > > > +            if (!side_data)
> > > > > +                return AVERROR(ENOMEM);
> > > > > +            ret = av_stream_add_side_data(st, AV_PKT_DATA_ENCRYPTION_INIT_INFO,
> > > > > +                                          side_data, side_data_size);
> > > > > +            if (ret < 0) {
> > > > > +                av_free(side_data);
> > > > > +                return ret;
> > > > > +            }
> > > > >          }
> > > > >
> > > > >          if (!strcmp(track->codec_id, "V_MS/VFW/FOURCC") &&
> > > > > --
> > > > > 2.18.0.203.gfac676dfb9-goog
> > > > >
> > > >
> > > > Ping.
> > >
> > > Ping.
> >
> > Ping (only 43 lines changed, in "review" for 28 days...)
>
> Ping.

Ping.  (initially sent 47 days ago, attached again for your convenience)

Comments

Jacob Trimble Sept. 6, 2018, 8:43 p.m. UTC | #1
On Tue, Aug 28, 2018 at 12:56 PM Jacob Trimble <modmaker@google.com> wrote:
>
> On Mon, Aug 20, 2018 at 11:39 AM Jacob Trimble <modmaker@google.com> wrote:
> >
> > On Thu, Aug 9, 2018 at 9:14 AM Jacob Trimble <modmaker@google.com> wrote:
> > >
> > > On Wed, Aug 1, 2018 at 1:46 PM Jacob Trimble <modmaker@google.com> wrote:
> > > >
> > > > On Mon, Jul 23, 2018 at 2:01 PM Jacob Trimble <modmaker@google.com> wrote:
> > > > >
> > > > > On Thu, Jul 12, 2018 at 5:05 PM Jacob Trimble <modmaker@google.com> wrote:
> > > > > >
> > > > > > Signed-off-by: Jacob Trimble <modmaker@google.com>
> > > > > > ---
> > > > > >  libavformat/matroskadec.c | 43 +++++++++++++++++++++++++++++----------
> > > > > >  1 file changed, 32 insertions(+), 11 deletions(-)
> > > > > >
> > > > > > diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
> > > > > > index 1ded431b80..bfef329e59 100644
> > > > > > --- a/libavformat/matroskadec.c
> > > > > > +++ b/libavformat/matroskadec.c
> > > > > > @@ -2080,7 +2080,8 @@ static int matroska_parse_tracks(AVFormatContext *s)
> > > > > >          int extradata_offset = 0;
> > > > > >          uint32_t fourcc = 0;
> > > > > >          AVIOContext b;
> > > > > > -        char* key_id_base64 = NULL;
> > > > > > +        char* key_id = NULL;
> > > > > > +        int key_id_size = 0;
> > > > > >          int bit_depth = -1;
> > > > > >
> > > > > >          /* Apply some sanity checks. */
> > > > > > @@ -2133,14 +2134,8 @@ static int matroska_parse_tracks(AVFormatContext *s)
> > > > > >                  if (encodings[0].encryption.key_id.size > 0) {
> > > > > >                      /* Save the encryption key id to be stored later as a
> > > > > >                         metadata tag. */
> > > > > > -                    const int b64_size = AV_BASE64_SIZE(encodings[0].encryption.key_id.size);
> > > > > > -                    key_id_base64 = av_malloc(b64_size);
> > > > > > -                    if (key_id_base64 == NULL)
> > > > > > -                        return AVERROR(ENOMEM);
> > > > > > -
> > > > > > -                    av_base64_encode(key_id_base64, b64_size,
> > > > > > -                                     encodings[0].encryption.key_id.data,
> > > > > > -                                     encodings[0].encryption.key_id.size);
> > > > > > +                    key_id = encodings[0].encryption.key_id.data;
> > > > > > +                    key_id_size = encodings[0].encryption.key_id.size;
> > > > > >                  } else {
> > > > > >                      encodings[0].scope = 0;
> > > > > >                      av_log(matroska->ctx, AV_LOG_ERROR,
> > > > > > @@ -2198,14 +2193,40 @@ static int matroska_parse_tracks(AVFormatContext *s)
> > > > > >
> > > > > >          st = track->stream = avformat_new_stream(s, NULL);
> > > > > >          if (!st) {
> > > > > > -            av_free(key_id_base64);
> > > > > >              return AVERROR(ENOMEM);
> > > > > >          }
> > > > > >
> > > > > > -        if (key_id_base64) {
> > > > > > +        if (key_id) {
> > > > > > +            AVEncryptionInitInfo *init_info;
> > > > > > +            uint8_t *side_data;
> > > > > > +            size_t side_data_size;
> > > > > > +            const int b64_size = AV_BASE64_SIZE(key_id_size);
> > > > > > +            char *key_id_base64 = av_malloc(b64_size);
> > > > > > +            if (!key_id_base64)
> > > > > > +                return AVERROR(ENOMEM);
> > > > > > +            av_base64_encode(key_id_base64, b64_size, key_id, key_id_size);
> > > > > > +
> > > > > >              /* export encryption key id as base64 metadata tag */
> > > > > >              av_dict_set(&st->metadata, "enc_key_id", key_id_base64, 0);
> > > > > >              av_freep(&key_id_base64);
> > > > > > +
> > > > > > +
> > > > > > +            /* Convert the key ID to a generic encryption init info */
> > > > > > +            init_info = av_encryption_init_info_alloc(/* system_id_size */ 0, /* num_key_ids */ 1,
> > > > > > +                                                      /* key_id_size */ key_id_size, /* data_size */ 0);
> > > > > > +            if (!init_info)
> > > > > > +                return AVERROR(ENOMEM);
> > > > > > +            memcpy(init_info->key_ids[0], key_id, key_id_size);
> > > > > > +            side_data = av_encryption_init_info_add_side_data(init_info, &side_data_size);
> > > > > > +            av_encryption_init_info_free(init_info);
> > > > > > +            if (!side_data)
> > > > > > +                return AVERROR(ENOMEM);
> > > > > > +            ret = av_stream_add_side_data(st, AV_PKT_DATA_ENCRYPTION_INIT_INFO,
> > > > > > +                                          side_data, side_data_size);
> > > > > > +            if (ret < 0) {
> > > > > > +                av_free(side_data);
> > > > > > +                return ret;
> > > > > > +            }
> > > > > >          }
> > > > > >
> > > > > >          if (!strcmp(track->codec_id, "V_MS/VFW/FOURCC") &&
> > > > > > --
> > > > > > 2.18.0.203.gfac676dfb9-goog
> > > > > >
> > > > >
> > > > > Ping.
> > > >
> > > > Ping.
> > >
> > > Ping (only 43 lines changed, in "review" for 28 days...)
> >
> > Ping.
>
> Ping.  (initially sent 47 days ago, attached again for your convenience)

Ping.
Carl Eugen Hoyos Sept. 7, 2018, 2:58 p.m. UTC | #2
2018-09-06 22:43 GMT+02:00, Jacob Trimble <modmaker-at-google.com@ffmpeg.org>:

[...]

Given the number of (non-trivial!) commits you have in FFmpeg, I
suggest you ask Michael for commit rights (and send him your
public key), you can then threaten to apply the patch yourself.

Carl Eugen
diff mbox

Patch

From 7cd8db21516adf56b97610d9fdac660bc4a6baa4 Mon Sep 17 00:00:00 2001
From: Jacob Trimble <modmaker@google.com>
Date: Tue, 10 Jul 2018 16:39:43 -0700
Subject: [PATCH] avformat/matroskadec: Parse encryption init info from
 streams.

Signed-off-by: Jacob Trimble <modmaker@google.com>
---
 libavformat/matroskadec.c | 43 +++++++++++++++++++++++++++++----------
 1 file changed, 32 insertions(+), 11 deletions(-)

diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
index e6793988e1..6f79b5e400 100644
--- a/libavformat/matroskadec.c
+++ b/libavformat/matroskadec.c
@@ -2080,7 +2080,8 @@  static int matroska_parse_tracks(AVFormatContext *s)
         int extradata_offset = 0;
         uint32_t fourcc = 0;
         AVIOContext b;
-        char* key_id_base64 = NULL;
+        char* key_id = NULL;
+        int key_id_size = 0;
         int bit_depth = -1;
 
         /* Apply some sanity checks. */
@@ -2133,14 +2134,8 @@  static int matroska_parse_tracks(AVFormatContext *s)
                 if (encodings[0].encryption.key_id.size > 0) {
                     /* Save the encryption key id to be stored later as a
                        metadata tag. */
-                    const int b64_size = AV_BASE64_SIZE(encodings[0].encryption.key_id.size);
-                    key_id_base64 = av_malloc(b64_size);
-                    if (key_id_base64 == NULL)
-                        return AVERROR(ENOMEM);
-
-                    av_base64_encode(key_id_base64, b64_size,
-                                     encodings[0].encryption.key_id.data,
-                                     encodings[0].encryption.key_id.size);
+                    key_id = encodings[0].encryption.key_id.data;
+                    key_id_size = encodings[0].encryption.key_id.size;
                 } else {
                     encodings[0].scope = 0;
                     av_log(matroska->ctx, AV_LOG_ERROR,
@@ -2198,14 +2193,40 @@  static int matroska_parse_tracks(AVFormatContext *s)
 
         st = track->stream = avformat_new_stream(s, NULL);
         if (!st) {
-            av_free(key_id_base64);
             return AVERROR(ENOMEM);
         }
 
-        if (key_id_base64) {
+        if (key_id) {
+            AVEncryptionInitInfo *init_info;
+            uint8_t *side_data;
+            size_t side_data_size;
+            const int b64_size = AV_BASE64_SIZE(key_id_size);
+            char *key_id_base64 = av_malloc(b64_size);
+            if (!key_id_base64)
+                return AVERROR(ENOMEM);
+            av_base64_encode(key_id_base64, b64_size, key_id, key_id_size);
+
             /* export encryption key id as base64 metadata tag */
             av_dict_set(&st->metadata, "enc_key_id", key_id_base64, 0);
             av_freep(&key_id_base64);
+
+
+            /* Convert the key ID to a generic encryption init info */
+            init_info = av_encryption_init_info_alloc(/* system_id_size */ 0, /* num_key_ids */ 1,
+                                                      /* key_id_size */ key_id_size, /* data_size */ 0);
+            if (!init_info)
+                return AVERROR(ENOMEM);
+            memcpy(init_info->key_ids[0], key_id, key_id_size);
+            side_data = av_encryption_init_info_add_side_data(init_info, &side_data_size);
+            av_encryption_init_info_free(init_info);
+            if (!side_data)
+                return AVERROR(ENOMEM);
+            ret = av_stream_add_side_data(st, AV_PKT_DATA_ENCRYPTION_INIT_INFO,
+                                          side_data, side_data_size);
+            if (ret < 0) {
+                av_free(side_data);
+                return ret;
+            }
         }
 
         if (!strcmp(track->codec_id, "V_MS/VFW/FOURCC") &&
-- 
2.19.0.rc0.228.g281dcd1b4d0-goog