summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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;