X-Git-Url: http://git.tuebingen.mpg.de/?a=blobdiff_plain;f=mp4.c;h=1c33a176e2fafd1d174017cea25edcfba536a5fb;hb=c2e987abfcf711c85e00fc11b9ef00d38ad89f3a;hp=0bddac9c2f512c4cf8a6e1ef0f6f3aed044b8a21;hpb=6b27f3436334bc89cad31b6fff5399b0d17c3f38;p=paraslash.git diff --git a/mp4.c b/mp4.c index 0bddac9c..1c33a176 100644 --- a/mp4.c +++ b/mp4.c @@ -592,6 +592,9 @@ static int open_file(const struct mp4_callback *cb, bool meta_only, struct mp4 * ret = -E_MP4_TRACK; if (f->track.channel_count == 0) goto fail; + ret = -E_MP4_BAD_SAMPLERATE; + if (f->track.sample_rate == 0) + goto fail; *result = f; return 1; fail: @@ -602,7 +605,21 @@ fail: int mp4_open_read(const struct mp4_callback *cb, struct mp4 **result) { - return open_file(cb, false, result); + struct mp4 *f; + int ret; + + *result = NULL; + ret = open_file(cb, false, &f); + if (ret < 0) + return ret; + ret = -E_MP4_BAD_SAMPLE_COUNT; + if (f->track.stsz_sample_count == 0) + goto fail; + *result = f; + return 1; +fail: + mp4_close(f); + return ret; } void mp4_close(struct mp4 *f) @@ -655,7 +672,7 @@ uint64_t mp4_get_duration(const struct mp4 *f) return t->duration * 1000 / t->time_scale; } -int mp4_set_sample_position(struct mp4 *f, int32_t sample) +int mp4_set_sample_position(struct mp4 *f, uint32_t sample) { const struct mp4_track *t = &f->track; int32_t offset, chunk, chunk_sample; @@ -680,29 +697,33 @@ int mp4_set_sample_position(struct mp4 *f, int32_t sample) return 1; } -int32_t mp4_get_sample_size(const struct mp4 *f, int sample) +int mp4_get_sample_size(const struct mp4 *f, uint32_t sample, uint32_t *result) { const struct mp4_track *t = &f->track; + if (sample >= t->stsz_sample_count) + return -ERRNO_TO_PARA_ERROR(EINVAL); if (t->stsz_sample_size != 0) - return t->stsz_sample_size; - return t->stsz_table[sample]; + *result = t->stsz_sample_size; + else + *result = t->stsz_table[sample]; + return 1; } -uint32_t mp4_get_sample_rate(const struct mp4 *f) +uint16_t mp4_get_sample_rate(const struct mp4 *f) { return f->track.sample_rate; } -uint32_t mp4_get_channel_count(const struct mp4 *f) +uint16_t mp4_get_channel_count(const struct mp4 *f) { return f->track.channel_count; } -int32_t mp4_num_samples(const struct mp4 *f) +uint32_t mp4_num_samples(const struct mp4 *f) { const struct mp4_track *t = &f->track; - int32_t total = 0; + uint32_t total = 0; for (uint32_t n = 0; n < t->stts_entry_count; n++) total += t->stts_sample_count[n];