]> git.tuebingen.mpg.de Git - paraslash.git/blobdiff - mp4.c
mp4: Return proper types for sample rate and count.
[paraslash.git] / mp4.c
diff --git a/mp4.c b/mp4.c
index 0bddac9c2f512c4cf8a6e1ef0f6f3aed044b8a21..1c33a176e2fafd1d174017cea25edcfba536a5fb 100644 (file)
--- 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];