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:
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)
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;
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];
ret = write_data(f, new_moov_data, new_moov_size);
if (ret < 0)
goto free_moov;
- f->cb->truncate(f->cb->user_data);
- ret = 1;
+ ret = f->cb->truncate(f->cb->user_data);
+ if (ret < 0)
+ ret = -ERRNO_TO_PARA_ERROR(errno);
free_moov:
free(new_moov_data);
return ret;