X-Git-Url: http://git.tuebingen.mpg.de/?a=blobdiff_plain;f=mp4.c;h=959dbde8c677676eff5464476b66a35e87f22ff3;hb=87e0ea6a858f3727d0f6c8a0ace440146bb68afe;hp=be974b3c4e5c8186152f3e7a86b17ee1eaee52ed;hpb=c44992109c344de0b0090dbb2a72ffb261185be8;p=paraslash.git diff --git a/mp4.c b/mp4.c index be974b3c..959dbde8 100644 --- a/mp4.c +++ b/mp4.c @@ -13,11 +13,10 @@ #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; @@ -47,10 +46,6 @@ struct mp4_track { int32_t *ctts_sample_count; int32_t *ctts_sample_offset; - /* esde */ - uint8_t *decoderConfig; - int32_t decoderConfigLen; - uint32_t maxBitrate; uint32_t avgBitrate; @@ -122,13 +117,6 @@ static int32_t atom_compare(int8_t a1, int8_t b1, int8_t c1, int8_t d1, return 0; } -enum tracks { - TRACK_UNKNOWN = 0, - TRACK_AUDIO = 1, - TRACK_VIDEO = 2, - TRACK_SYSTEM = 3 -}; - enum atoms { /* atoms with subatoms */ ATOM_MOOV = 1, @@ -591,74 +579,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; @@ -689,8 +609,6 @@ 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; } @@ -717,17 +635,9 @@ static int32_t read_stsd(struct mp4 *f) 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); } @@ -1279,7 +1189,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 +1324,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)