atomsrecovery: also handle extra atoms after 'mdia' in a 'trak'
authorThiago Santos <thiagossantos@gmail.com>
Sun, 12 Mar 2017 05:20:40 +0000 (21:20 -0800)
committerThiago Santos <thiagossantos@gmail.com>
Wed, 15 Mar 2017 03:27:48 +0000 (20:27 -0700)
Take into account the atoms at the end of the 'trak' atom when
recovering it. So that its size (already computed and added in the trak
size) isn't making offsets wrong.

https://bugzilla.gnome.org/show_bug.cgi?id=771478

gst/isomp4/atomsrecovery.c
gst/isomp4/atomsrecovery.h

index e3f4621..fe46ce5 100644 (file)
@@ -673,6 +673,11 @@ moov_recov_parse_trak (MoovRecovFile * moovrf, TrakRecovData * trakrd)
   if (!moov_recov_parse_mdia (moovrf, trakrd))
     return FALSE;
 
+  fseek (moovrf->file, (long int) trakrd->mdia_file_offset + trakrd->mdia_size,
+      SEEK_SET);
+  trakrd->extra_atoms_offset = ftell (moovrf->file);
+  trakrd->extra_atoms_size = size - (trakrd->extra_atoms_offset - offset);
+
   trakrd->file_offset = offset;
   /* position after the trak */
   return fseek (moovrf->file, (long int) offset + size, SEEK_SET) == 0;
@@ -921,6 +926,31 @@ fail:
   return NULL;
 }
 
+static gboolean
+copy_data_from_file_to_file (FILE * from, guint position, guint size, FILE * to,
+    GError ** err)
+{
+  guint8 *data = NULL;
+
+  if (fseek (from, position, SEEK_SET) != 0)
+    goto fail;
+  data = g_malloc (size);
+  if (fread (data, 1, size, from) != size) {
+    goto fail;
+  }
+  if (fwrite (data, 1, size, to) != size) {
+    ATOMS_RECOV_OUTPUT_WRITE_ERROR (err);
+    goto fail;
+  }
+
+  g_free (data);
+  return TRUE;
+
+fail:
+  g_free (data);
+  return FALSE;
+}
+
 gboolean
 moov_recov_write_file (MoovRecovFile * moovrf, MdatRecovFile * mdatrf,
     FILE * outf, GError ** err)
@@ -1088,10 +1118,16 @@ moov_recov_write_file (MoovRecovFile * moovrf, MdatRecovFile * mdatrf,
       ATOMS_RECOV_OUTPUT_WRITE_ERROR (err);
       goto fail;
     }
+
     g_free (trak_data);
     trak_data = NULL;
     g_free (stbl_children);
     stbl_children = NULL;
+
+    /* Copy the extra atoms after 'minf' */
+    if (!copy_data_from_file_to_file (moovrf->file, trak->extra_atoms_offset,
+            trak->extra_atoms_size, outf, err))
+      goto fail;
   }
 
   /* write the mdat */
index 808d428..2d9382d 100644 (file)
@@ -103,6 +103,9 @@ typedef struct
   guint64 post_stsd_offset;
   guint32 stsd_size;
 
+  guint32 extra_atoms_size;
+  guint32 extra_atoms_offset;
+
   /* for storing the samples info */
   AtomSTBL stbl;
 } TrakRecovData;