This feature allows making associations between audio tracks
that apple players recognize. E.g. when an ac3 track has a
tref that points to an aac track, devices that don't support
ac3 will automatically fall back to the aac track.
Apple used to *guess* these associations, but new products
(AppleTV 4) no longer guess and this association can only
be made explicitly now using the "fall" tref.
---
libavformat/movenc.c | 18 ++++++++++++++----
1 file changed, 14 insertions(+), 4 deletions(-)
Uncrustify
diff --git a/libavformat/movenc.c b/libavformat/movenc.c
index 572e781..a6a9d09 100644
--- a/libavformat/movenc.c
+++ b/libavformat/movenc.c
@@ -2285,10 +2285,20 @@ static int mov_write_moov_tag(AVIOContext *pb,
MOVMuxContext *mov,
mov->tracks[i].tref_id = mov->tracks[mov->chapter_track].track_id;
}
for (i = 0; i < mov->nb_streams; i++) {
- if (mov->tracks[i].tag == MKTAG('r','t','p',' ')) {
- mov->tracks[i].tref_tag = MKTAG('h','i','n','t');
- mov->tracks[i].tref_id =
- mov->tracks[mov->tracks[i].src_track].track_id;
+ MOVTrack *track = &mov->tracks[i];
+ if (track->tag == MKTAG('r','t','p',' ')) {
+ track->tref_tag = MKTAG('h','i','n','t');
+ track->tref_id = mov->tracks[track->src_track].track_id;
+ } else if (track->enc->codec_type == AVMEDIA_TYPE_AUDIO) {
+ AVDictionaryEntry *fallback;
+ fallback = av_dict_get(track->st->metadata, "fallback", NULL, 0);
+ if (fallback != NULL) {
+ int index = strtol(fallback->value, NULL, 0);
+ if (index >= 0 && index < mov->nb_streams) {
+ track->tref_tag = MKTAG('f','a','l','l');
+ track->tref_id = mov->tracks[index].track_id;
+ }
+ }
}
}