diff mbox

[FFmpeg-devel,2/2] lavf/mov: support gopro hero moments udta tag

Message ID 1476093601-20057-3-git-send-email-jcaille@gmail.com
State Superseded
Headers show

Commit Message

Jean Caillé Oct. 10, 2016, 10 a.m. UTC
From: Jean Caillé <jean@stupeflix.com>

---
 libavformat/mov.c | 19 +++++++++++++++++++
 1 file changed, 19 insertions(+)

Comments

Michael Niedermayer Oct. 14, 2016, 10:58 p.m. UTC | #1
On Mon, Oct 10, 2016 at 12:00:01PM +0200, Jean Caillé wrote:
> From: Jean Caillé <jean@stupeflix.com>
> 
> ---
>  libavformat/mov.c | 19 +++++++++++++++++++
>  1 file changed, 19 insertions(+)
> 
> diff --git a/libavformat/mov.c b/libavformat/mov.c
> index add1812..3e73320 100644
> --- a/libavformat/mov.c
> +++ b/libavformat/mov.c
> @@ -268,6 +268,23 @@ static int mov_metadata_loci(MOVContext *c, AVIOContext *pb, unsigned len)
>      return av_dict_set(&c->fc->metadata, key, buf, 0);
>  }
>  
> +static int mov_metadata_hmmt(MOVContext *c, AVIOContext *pb, unsigned len)
> +{
> +    int i, n_hmmt;
> +
> +    if (len < 2)
> +        return 0;
> +    if (c->ignore_chapters)
> +        return 0;
> +
> +    n_hmmt = avio_rb32(pb);
> +    for (i = 0; i < n_hmmt; i++) {
> +        int moment_time = avio_rb32(pb);

please add a eof check here
this loop could otherwise run for a long time eating both time and
memory even with a small file

[...]
diff mbox

Patch

diff --git a/libavformat/mov.c b/libavformat/mov.c
index add1812..3e73320 100644
--- a/libavformat/mov.c
+++ b/libavformat/mov.c
@@ -268,6 +268,23 @@  static int mov_metadata_loci(MOVContext *c, AVIOContext *pb, unsigned len)
     return av_dict_set(&c->fc->metadata, key, buf, 0);
 }
 
+static int mov_metadata_hmmt(MOVContext *c, AVIOContext *pb, unsigned len)
+{
+    int i, n_hmmt;
+
+    if (len < 2)
+        return 0;
+    if (c->ignore_chapters)
+        return 0;
+
+    n_hmmt = avio_rb32(pb);
+    for (i = 0; i < n_hmmt; i++) {
+        int moment_time = avio_rb32(pb);
+        avpriv_new_chapter(c->fc, i, av_make_q(1, 1000), moment_time, AV_NOPTS_VALUE, NULL);
+    }
+    return 0;
+}
+
 static int mov_read_udta_string(MOVContext *c, AVIOContext *pb, MOVAtom atom)
 {
     char tmp_key[5];
@@ -303,6 +320,8 @@  static int mov_read_udta_string(MOVContext *c, AVIOContext *pb, MOVAtom atom)
         parse = mov_metadata_gnre; break;
     case MKTAG( 'h','d','v','d'): key = "hd_video";
         parse = mov_metadata_int8_no_padding; break;
+    case MKTAG( 'H','M','M','T'):
+        return mov_metadata_hmmt(c, pb, atom.size);
     case MKTAG( 'k','e','y','w'): key = "keywords";  break;
     case MKTAG( 'l','d','e','s'): key = "synopsis";  break;
     case MKTAG( 'l','o','c','i'):