summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThiago Santos <thiagossantos@gmail.com>2017-03-11 21:20:40 -0800
committerThiago Santos <thiagossantos@gmail.com>2017-03-14 20:48:34 -0700
commit8b5dc745ad1429d724589fd0bbdac89485b6f279 (patch)
tree5872c3365dd17cc317add31d449cc021768b3245
parent4be926abeead00b196e93d34fd08815e1b0b7ca9 (diff)
downloadgstreamer-plugins-good-8b5dc745ad1429d724589fd0bbdac89485b6f279.tar.gz
atomsrecovery: also handle extra atoms after 'mdia' in a 'trak'
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
-rw-r--r--gst/isomp4/atomsrecovery.c36
-rw-r--r--gst/isomp4/atomsrecovery.h3
2 files changed, 39 insertions, 0 deletions
diff --git a/gst/isomp4/atomsrecovery.c b/gst/isomp4/atomsrecovery.c
index e3f4621a9..fe46ce54e 100644
--- a/gst/isomp4/atomsrecovery.c
+++ b/gst/isomp4/atomsrecovery.c
@@ -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 */
diff --git a/gst/isomp4/atomsrecovery.h b/gst/isomp4/atomsrecovery.h
index 808d428b3..2d9382d16 100644
--- a/gst/isomp4/atomsrecovery.h
+++ b/gst/isomp4/atomsrecovery.h
@@ -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;