#include "atomsrecovery.h"
+#define MAX_CHUNK_SIZE (1024 * 1024) /* 1MB */
+
#define ATOMS_RECOV_OUTPUT_WRITE_ERROR(err) \
g_set_error (err, ATOMS_RECOV_QUARK, ATOMS_RECOV_ERR_FILE, \
"Failed to write to output file: %s", g_strerror (errno))
gboolean
moov_recov_write_file (MoovRecovFile * moovrf, MdatRecovFile * mdatrf,
- FILE * outf, GError ** err)
+ FILE * outf, GError ** err, GError ** warn)
{
guint8 auxdata[16];
guint8 *data = NULL;
guint8 *stbl_children = NULL;
guint32 longest_duration = 0;
guint16 version;
+ guint remaining;
/* check the version */
if (fseek (moovrf->file, 0, SEEK_SET) != 0) {
(mdatrf->rawfile ? 0 : mdatrf->mdat_header_size), SEEK_SET) != 0)
goto fail;
- data = g_malloc (4096);
- while (!feof (mdatrf->file)) {
- gint read, write;
+ remaining = mdatrf->mdat_size - mdatrf->mdat_header_size;
+ data = g_malloc (MAX_CHUNK_SIZE);
+ while (!feof (mdatrf->file) && remaining > 0) {
+ gint read, write, readsize;
+
+ readsize = MIN (MAX_CHUNK_SIZE, remaining);
- read = fread (data, 1, 4096, mdatrf->file);
+ read = fread (data, 1, readsize, mdatrf->file);
write = fwrite (data, 1, read, outf);
+ remaining -= read;
if (write != read) {
g_set_error (err, ATOMS_RECOV_QUARK, ATOMS_RECOV_ERR_FILE,
}
g_free (data);
+ if (remaining) {
+ g_set_error (warn, ATOMS_RECOV_QUARK, ATOMS_RECOV_ERR_FILE,
+ "Samples in recovery file were not present on headers."
+ " Bytes lost: %u", remaining);
+ } else if (!feof (mdatrf->file)) {
+ g_set_error (warn, ATOMS_RECOV_QUARK, ATOMS_RECOV_ERR_FILE,
+ "Samples in headers were not found in data file.");
+ GST_FIXME ("Rewrite mdat size if we reach this to make the file"
+ " fully correct");
+ }
+
return TRUE;
fail:
MoovRecovFile *moov_recov = NULL;
GstQTMoovRecover *qtmr = GST_QT_MOOV_RECOVER_CAST (data);
GError *err = NULL;
+ GError *warn = NULL;
GST_LOG_OBJECT (qtmr, "Starting task");
}
GST_DEBUG_OBJECT (qtmr, "Writing fixed file to output");
- if (!moov_recov_write_file (moov_recov, mdat_recov, output, &err)) {
+ if (!moov_recov_write_file (moov_recov, mdat_recov, output, &err, &warn)) {
goto end;
}
+ if (warn) {
+ GST_ELEMENT_WARNING (qtmr, RESOURCE, FAILED, ("%s", warn->message), (NULL));
+ g_error_free (warn);
+ }
+
/* here means success */
GST_DEBUG_OBJECT (qtmr, "Finished successfully, posting EOS");
gst_element_post_message (GST_ELEMENT_CAST (qtmr),