static int32_t aac_afh_get_track(struct mp4 *mp4)
{
- int32_t i, rc, num_tracks = mp4_total_tracks(mp4);
+ int32_t i, num_tracks = mp4_total_tracks(mp4);
assert(num_tracks >= 0);
- for (i = 0; i < num_tracks; i++) {
- unsigned char *buf = NULL;
- unsigned buf_size = 0;
-
- mp4_get_decoder_config(mp4, i, &buf, &buf_size);
- if (buf) {
- mp4AudioSpecificConfig masc;
- rc = NeAACDecAudioSpecificConfig(buf, buf_size, &masc);
- free(buf);
- if (rc < 0)
- continue;
+ for (i = 0; i < num_tracks; i++)
+ if (mp4_is_audio_track(mp4, i))
return i;
- }
- }
- return -1; /* no audio track */
+ return -E_MP4_TRACK; /* no audio track */
}
static int aac_afh_open(const void *map, size_t mapsize, void **afh_context)
c->mp4 = mp4_open_read(&c->cb);
if (!c->mp4)
goto free_ctx;
- c->track = aac_afh_get_track(c->mp4);
- ret = -E_MP4_TRACK;
- if (c->track < 0)
+ ret = aac_afh_get_track(c->mp4);
+ if (ret < 0)
goto close_mp4;
+ c->track = ret;
*afh_context = c;
return 0;
close_mp4:
return 0;
}
-void mp4_get_decoder_config(const struct mp4 *f, int track,
- unsigned char **ppBuf, unsigned int *pBufSize)
-{
- if (track >= f->total_tracks) {
- *ppBuf = NULL;
- *pBufSize = 0;
- return;
- }
-
- if (f->track[track]->decoderConfig == NULL
- || f->track[track]->decoderConfigLen == 0) {
- *ppBuf = NULL;
- *pBufSize = 0;
- } else {
- *ppBuf = para_malloc(f->track[track]->decoderConfigLen);
- memcpy(*ppBuf, f->track[track]->decoderConfig,
- f->track[track]->decoderConfigLen);
- *pBufSize = f->track[track]->decoderConfigLen;
- }
-}
-
struct mp4 *mp4_open_read(struct mp4_callback *f)
{
struct mp4 *ff = para_calloc(sizeof(struct mp4));
return t->duration * 1000 / t->timeScale;
}
+/**
+ * Check whether the given track number corresponds to an audio track.
+ *
+ * \param f See \ref mp4_get_duration().
+ * \param track See \ref mp4_get_duration().
+ *
+ * Besides audio tracks, an mp4 file may contain video and system tracks. For
+ * those the function returns false.
+ */
+bool mp4_is_audio_track(const struct mp4 *f, int32_t track)
+{
+ return f->track[track]->type == TRACK_AUDIO;
+}
+
void mp4_set_sample_position(struct mp4 *f, int32_t track, int32_t sample)
{
int32_t offset = sample_to_offset(f, track, sample);
void mp4_set_sample_position(struct mp4 *f, int32_t track, int32_t sample);
int32_t mp4_total_tracks(const struct mp4 *f);
-void mp4_get_decoder_config(const struct mp4 *f, int track,
- unsigned char** ppBuf, unsigned int* pBufSize);
+bool mp4_is_audio_track(const struct mp4 *f, int32_t track);
struct mp4 *mp4_open_read(struct mp4_callback *f);
void mp4_close(struct mp4 *f);
int32_t mp4_get_sample_size(const struct mp4 *f, int track, int sample);