movenc: add fallback audio track tref support

Message ID 1446577403-4401-1-git-send-email-stebbins@jetheaddev.com
State New
Headers show

Commit Message

John Stebbins Nov. 3, 2015, 7:03 p.m.
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 | 22 ++++++++++++++++++----
 1 file changed, 18 insertions(+), 4 deletions(-)

Comments

Luca Barbato Nov. 3, 2015, 10:02 p.m. | #1
On 03/11/15 20:03, John Stebbins wrote:
> 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 | 22 ++++++++++++++++++----
>  1 file changed, 18 insertions(+), 4 deletions(-)
> 
> diff --git a/libavformat/movenc.c b/libavformat/movenc.c
> index 572e781..19e6c1d 100644
> --- a/libavformat/movenc.c
> +++ b/libavformat/movenc.c
> @@ -2285,10 +2285,24 @@ 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;
> +                }
> +            }
>          }
>      }
>  
> 


Sounds good, uncrustify will take care of it though.

Patch

diff --git a/libavformat/movenc.c b/libavformat/movenc.c
index 572e781..19e6c1d 100644
--- a/libavformat/movenc.c
+++ b/libavformat/movenc.c
@@ -2285,10 +2285,24 @@  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;
+                }
+            }
         }
     }