]> git.tuebingen.mpg.de Git - paraslash.git/blobdiff - mp4.c
mp4: Hide ->read_error.
[paraslash.git] / mp4.c
diff --git a/mp4.c b/mp4.c
index be974b3c4e5c8186152f3e7a86b17ee1eaee52ed..991ba08db18ab9d4aa38f06afef8603cc2be4fef 100644 (file)
--- a/mp4.c
+++ b/mp4.c
 #include "mp4.h"
 
 struct mp4_track {
-       int32_t type;
+       bool is_audio;
        int32_t channelCount;
-       int32_t sampleSize;
        uint16_t sampleRate;
-       int32_t audioType;
-
-       /* stsd */
-       int32_t stsd_entry_count;
 
        /* stsz */
        int32_t stsz_sample_size;
@@ -42,18 +37,6 @@ struct mp4_track {
        int32_t stco_entry_count;
        int32_t *stco_chunk_offset;
 
-       /* ctts */
-       int32_t ctts_entry_count;
-       int32_t *ctts_sample_count;
-       int32_t *ctts_sample_offset;
-
-       /* esde */
-       uint8_t *decoderConfig;
-       int32_t decoderConfigLen;
-
-       uint32_t maxBitrate;
-       uint32_t avgBitrate;
-
        uint32_t timeScale;
        uint64_t duration;
 };
@@ -69,11 +52,9 @@ struct mp4 {
        uint64_t moov_size;
        uint8_t last_atom;
        uint64_t file_size;
-       uint32_t error;
 
-       /* mvhd */
-       int32_t time_scale;
-       int32_t duration;
+       uint32_t read_error;
+       uint32_t error;
 
        /* incremental track index while reading the file */
        int32_t total_tracks;
@@ -97,7 +78,7 @@ static int32_t read_data(struct mp4 *f, void *data, uint32_t size)
        result = f->stream->read(f->stream->user_data, data, size);
 
        if (result < size)
-               f->stream->read_error++;
+               f->read_error++;
 
        f->current_position += size;
 
@@ -112,23 +93,12 @@ static uint64_t read_int64(struct mp4 *f)
        return read_u64_be(data);
 }
 
-/* comnapre 2 atom names, returns 1 for equal, 0 for unequal */
-static int32_t atom_compare(int8_t a1, int8_t b1, int8_t c1, int8_t d1,
+static bool atom_compare(int8_t a1, int8_t b1, int8_t c1, int8_t d1,
                int8_t a2, int8_t b2, int8_t c2, int8_t d2)
 {
-       if (a1 == a2 && b1 == b2 && c1 == c2 && d1 == d2)
-               return 1;
-       else
-               return 0;
+       return a1 == a2 && b1 == b2 && c1 == c2 && d1 == d2;
 }
 
-enum tracks {
-       TRACK_UNKNOWN = 0,
-       TRACK_AUDIO  = 1,
-       TRACK_VIDEO = 2,
-       TRACK_SYSTEM = 3
-};
-
 enum atoms {
        /* atoms with subatoms */
        ATOM_MOOV = 1,
@@ -476,7 +446,7 @@ static int32_t read_stsz(struct mp4 *f)
        if (t->stsz_sample_size != 0)
                return 0;
        t->stsz_table = para_malloc(t->stsz_sample_count * sizeof(int32_t));
-       for (i = 0; i < t->stsz_sample_count && !f->stream->read_error; i++)
+       for (i = 0; i < t->stsz_sample_count && !f->read_error; i++)
                t->stsz_table[i] = read_int32(f);
        return 0;
 }
@@ -501,41 +471,13 @@ static int32_t read_stts(struct mp4 *f)
        t->stts_sample_delta = para_malloc(t->stts_entry_count
                * sizeof (int32_t));
        /* CVE-2017-9254 */
-       for (i = 0; i < t->stts_entry_count && !f->stream->read_error; i++) {
+       for (i = 0; i < t->stts_entry_count && !f->read_error; i++) {
                t->stts_sample_count[i] = read_int32(f);
                t->stts_sample_delta[i] = read_int32(f);
        }
        return 1;
 }
 
-static int32_t read_ctts(struct mp4 *f)
-{
-       int32_t i;
-       struct mp4_track *t;
-
-       if (f->total_tracks == 0)
-               return f->error++;
-       t = f->track[f->total_tracks - 1];
-       if (t->ctts_entry_count)
-               return 0;
-
-       read_char(f);   /* version */
-       read_int24(f);  /* flags */
-       t->ctts_entry_count = read_int32(f);
-
-       t->ctts_sample_count = para_malloc(t->ctts_entry_count
-               * sizeof (int32_t));
-       t->ctts_sample_offset = para_malloc(t->ctts_entry_count
-               * sizeof (int32_t));
-
-       /* CVE-2017-9257 */
-       for (i = 0; i < t->ctts_entry_count && !f->stream->read_error; i++) {
-               t->ctts_sample_count[i] = read_int32(f);
-               t->ctts_sample_offset[i] = read_int32(f);
-       }
-       return 1;
-}
-
 static int32_t read_stsc(struct mp4 *f)
 {
        int32_t i;
@@ -555,7 +497,7 @@ static int32_t read_stsc(struct mp4 *f)
                sizeof (int32_t));
 
        /* CVE-2017-9255 */
-       for (i = 0; i < t->stsc_entry_count && !f->stream->read_error; i++) {
+       for (i = 0; i < t->stsc_entry_count && !f->read_error; i++) {
                t->stsc_first_chunk[i] = read_int32(f);
                t->stsc_samples_per_chunk[i] = read_int32(f);
                t->stsc_sample_desc_index[i] = read_int32(f);
@@ -578,7 +520,7 @@ static int32_t read_stco(struct mp4 *f)
        t->stco_chunk_offset = para_malloc(t->stco_entry_count
                * sizeof(int32_t));
        /* CVE-2017-9256 */
-       for (i = 0; i < t->stco_entry_count && !f->stream->read_error; i++)
+       for (i = 0; i < t->stco_entry_count && !f->read_error; i++)
                t->stco_chunk_offset[i] = read_int32(f);
        return 0;
 }
@@ -591,74 +533,6 @@ static uint16_t read_int16(struct mp4 *f)
        return read_u16_be(data);
 }
 
-static uint32_t read_mp4_descr_length(struct mp4 *f)
-{
-       uint8_t b;
-       uint8_t numBytes = 0;
-       uint32_t length = 0;
-
-       do {
-               b = read_char(f);
-               numBytes++;
-               length = (length << 7) | (b & 0x7F);
-       } while ((b & 0x80) && numBytes < 4);
-
-       return length;
-}
-static int32_t read_esds(struct mp4 *f)
-{
-       uint8_t tag;
-       uint32_t temp;
-       struct mp4_track *t;
-
-       if (f->total_tracks == 0)
-               return f->error++;
-       t = f->track[f->total_tracks - 1];
-       read_char(f);   /* version */
-       read_int24(f);  /* flags */
-       /* get and verify ES_DescrTag */
-       tag = read_char(f);
-       if (tag == 0x03) {
-               /* read length */
-               if (read_mp4_descr_length(f) < 5 + 15) {
-                       return 1;
-               }
-               /* skip 3 bytes */
-               read_int24(f);
-       } else {
-               /* skip 2 bytes */
-               read_int16(f);
-       }
-
-       /* get and verify DecoderConfigDescrTab */
-       if (read_char(f) != 0x04) {
-               return 1;
-       }
-
-       /* read length */
-       temp = read_mp4_descr_length(f);
-       if (temp < 13)
-               return 1;
-
-       t->audioType = read_char(f);
-       read_int32(f);  //0x15000414 ????
-       t->maxBitrate = read_int32(f);
-       t->avgBitrate = read_int32(f);
-
-       /* get and verify DecSpecificInfoTag */
-       if (read_char(f) != 0x05) {
-               return 1;
-       }
-
-       /* read length */
-       t->decoderConfigLen = read_mp4_descr_length(f);
-       free(t->decoderConfig);
-       t->decoderConfig = para_malloc(t->decoderConfigLen);
-       read_data(f, t->decoderConfig, t->decoderConfigLen);
-       /* will skip the remainder of the atom */
-       return 0;
-}
-
 static int32_t read_mp4a(struct mp4 *f)
 {
        int32_t i;
@@ -679,7 +553,7 @@ static int32_t read_mp4a(struct mp4 *f)
        read_int32(f);  /* reserved */
 
        t->channelCount = read_int16(f);
-       t->sampleSize = read_int16(f);
+       read_int16(f);
 
        read_int16(f);
        read_int16(f);
@@ -689,14 +563,12 @@ static int32_t read_mp4a(struct mp4 *f)
        read_int16(f);
 
        atom_read_header(f, &atom_type, &header_size);
-       if (atom_type == ATOM_ESDS)
-               read_esds(f);
        return 0;
 }
 
 static int32_t read_stsd(struct mp4 *f)
 {
-       int32_t i;
+       int32_t i, entry_count;
        uint8_t header_size = 0;
        struct mp4_track *t;
 
@@ -708,58 +580,24 @@ static int32_t read_stsd(struct mp4 *f)
        read_char(f);   /* version */
        read_int24(f);  /* flags */
 
-       t->stsd_entry_count = read_int32(f);
+       entry_count = read_int32(f);
 
        /* CVE-2017-9253 */
-       for (i = 0; i < t->stsd_entry_count && !f->stream->read_error; i++) {
+       for (i = 0; i < entry_count && !f->read_error; i++) {
                uint64_t skip = get_position(f);
                uint64_t size;
                uint8_t atom_type = 0;
                size = atom_read_header(f, &atom_type, &header_size);
                skip += size;
-
-               if (atom_type == ATOM_MP4A) {
-                       t->type = TRACK_AUDIO;
+               t->is_audio = atom_type == ATOM_MP4A;
+               if (t->is_audio)
                        read_mp4a(f);
-               } else if (atom_type == ATOM_MP4V) {
-                       t->type = TRACK_VIDEO;
-               } else if (atom_type == ATOM_MP4S) {
-                       t->type = TRACK_SYSTEM;
-               } else {
-                       t->type = TRACK_UNKNOWN;
-               }
                set_position(f, skip);
        }
 
        return 0;
 }
 
-static int32_t read_mvhd(struct mp4 *f)
-{
-       int32_t i;
-
-       read_char(f);   /* version */
-       read_int24(f);  /* flags */
-       read_int32(f); /* creation_time */
-       read_int32(f); /* modification_time */
-       f->time_scale = read_int32(f);
-       f->duration = read_int32(f);
-       read_int32(f); /* preferred_rate */
-       read_int16(f); /* preferred_volume */
-       for (i = 0; i < 10; i++)
-               read_char(f); /* reserved */
-       for (i = 0; i < 9; i++)
-               read_int32(f); /* matrix */
-       read_int32(f); /* preview_time */
-       read_int32(f); /* preview_duration */
-       read_int32(f); /* poster_time */
-       read_int32(f); /* selection_time */
-       read_int32(f); /* selection_duration */
-       read_int32(f); /* current_time */
-       read_int32(f); /* next_track_id */
-       return 0;
-}
-
 static int32_t tag_add_field(struct mp4_metadata *tags, const char *item,
                const char *value, int32_t len)
 {
@@ -981,7 +819,7 @@ static int32_t parse_tag(struct mp4 *f, uint8_t parent, int32_t size)
 
        for (
                sumsize = 0;
-               sumsize < size && !f->stream->read_error; /* CVE-2017-9222 */
+               sumsize < size && !f->read_error; /* CVE-2017-9222 */
                set_position(f, destpos), sumsize += subsize
        ) {
                subsize = atom_read_header(f, &atom_type, &header_size);
@@ -1140,9 +978,6 @@ static int32_t atom_read(struct mp4 *f, int32_t size, uint8_t atom_type)
        } else if (atom_type == ATOM_STTS) {
                /* time to sample box */
                read_stts(f);
-       } else if (atom_type == ATOM_CTTS) {
-               /* composition offset box */
-               read_ctts(f);
        } else if (atom_type == ATOM_STSC) {
                /* sample to chunk box */
                read_stsc(f);
@@ -1152,9 +987,6 @@ static int32_t atom_read(struct mp4 *f, int32_t size, uint8_t atom_type)
        } else if (atom_type == ATOM_STSD) {
                /* sample description box */
                read_stsd(f);
-       } else if (atom_type == ATOM_MVHD) {
-               /* movie header box */
-               read_mvhd(f);
        } else if (atom_type == ATOM_MDHD) {
                /* track header */
                read_mdhd(f);
@@ -1209,7 +1041,7 @@ static int32_t parse_atoms(struct mp4 *f, int meta_only)
        uint8_t header_size = 0;
 
        f->file_size = 0;
-       f->stream->read_error = 0;
+       f->read_error = 0;
 
        while ((size =
                atom_read_header(f, &atom_type, &header_size)) != 0) {
@@ -1279,9 +1111,6 @@ void mp4_close(struct mp4 *ff)
                        free(ff->track[i]->stsc_samples_per_chunk);
                        free(ff->track[i]->stsc_sample_desc_index);
                        free(ff->track[i]->stco_chunk_offset);
-                       free(ff->track[i]->decoderConfig);
-                       free(ff->track[i]->ctts_sample_count);
-                       free(ff->track[i]->ctts_sample_offset);
                        free(ff->track[i]);
                }
        }
@@ -1415,7 +1244,7 @@ uint64_t mp4_get_duration(const struct mp4 *f, int32_t track)
  */
 bool mp4_is_audio_track(const struct mp4 *f, int32_t track)
 {
-       return f->track[track]->type == TRACK_AUDIO;
+       return f->track[track]->is_audio;
 }
 
 void mp4_set_sample_position(struct mp4 *f, int32_t track, int32_t sample)
@@ -2074,11 +1903,6 @@ static int32_t write_int32(struct mp4 *f, uint32_t data)
        return write_data(f, temp, sizeof(temp));
 }
 
-static int32_t truncate_stream(struct mp4 *f)
-{
-       return f->stream->truncate(f->stream->user_data);
-}
-
 int32_t mp4_meta_update(struct mp4_callback *f, const struct mp4_metadata *data)
 {
        void *new_moov_data;
@@ -2113,9 +1937,7 @@ int32_t mp4_meta_update(struct mp4_callback *f, const struct mp4_metadata *data)
                write_data(ff, "moov", 4);
                write_data(ff, new_moov_data, new_moov_size);
        }
-
-       truncate_stream(ff);
-
+       f->truncate(f->user_data);
        mp4_close(ff);
        return 1;
 }