movenc: Make tkhd "enabled" flag QuickTime compatible

QuickTime will play multiple audio tracks concurrently if this flag is
set for multiple audio tracks.  And if no subtitle track has this flag
set, QuickTime will show no subtitles in the subtitle menu.

Signed-off-by: Anton Khirnov <anton@khirnov.net>
pull/37/head
John Stebbins 12 years ago committed by Anton Khirnov
parent 1f70a5ad28
commit 30ce289074
  1. 56
      libavformat/movenc.c
  2. 1
      libavformat/movenc.h
  3. 2
      tests/ref/acodec/alac
  4. 2
      tests/ref/acodec/pcm-s16be
  5. 2
      tests/ref/acodec/pcm-s24be
  6. 2
      tests/ref/acodec/pcm-s32be
  7. 2
      tests/ref/acodec/pcm-s8
  8. 2
      tests/ref/lavf/mov
  9. 2
      tests/ref/vsynth/vsynth1-dnxhd-1080i
  10. 2
      tests/ref/vsynth/vsynth1-mpeg4
  11. 2
      tests/ref/vsynth/vsynth1-prores
  12. 2
      tests/ref/vsynth/vsynth1-qtrle
  13. 2
      tests/ref/vsynth/vsynth1-svq1
  14. 2
      tests/ref/vsynth/vsynth2-dnxhd-1080i
  15. 2
      tests/ref/vsynth/vsynth2-mpeg4
  16. 2
      tests/ref/vsynth/vsynth2-prores
  17. 2
      tests/ref/vsynth/vsynth2-qtrle
  18. 2
      tests/ref/vsynth/vsynth2-svq1

@ -1391,7 +1391,9 @@ static int mov_write_tkhd_tag(AVIOContext *pb, MOVTrack *track, AVStream *st)
(version == 1) ? avio_wb32(pb, 104) : avio_wb32(pb, 92); /* size */
ffio_wfourcc(pb, "tkhd");
avio_w8(pb, version);
avio_wb24(pb, 0xf); /* flags (track enabled) */
avio_wb24(pb, (track->flags & MOV_TRACK_ENABLED) ?
MOV_TKHD_FLAG_ENABLED | MOV_TKHD_FLAG_IN_MOVIE :
MOV_TKHD_FLAG_IN_MOVIE);
if (version == 1) {
avio_wb64(pb, track->time);
avio_wb64(pb, track->time);
@ -3028,6 +3030,56 @@ static int mov_create_chapter_track(AVFormatContext *s, int tracknum)
return 0;
}
/*
* st->disposition controls the "enabled" flag in the tkhd tag.
* QuickTime will not play a track if it is not enabled. So make sure
* that one track of each type (audio, video, subtitle) is enabled.
*
* Subtitles are special. For audio and video, setting "enabled" also
* makes the track "default" (i.e. it is rendered when played). For
* subtitles, an "enabled" subtitle is not rendered by default, but
* if no subtitle is enabled, the subtitle menu in QuickTime will be
* empty!
*/
static void enable_tracks(AVFormatContext *s)
{
MOVMuxContext *mov = s->priv_data;
int i;
uint8_t enabled[AVMEDIA_TYPE_NB];
int first[AVMEDIA_TYPE_NB];
for (i = 0; i < AVMEDIA_TYPE_NB; i++) {
enabled[i] = 0;
first[i] = -1;
}
for (i = 0; i < s->nb_streams; i++) {
AVStream *st = s->streams[i];
if (st->codec->codec_type <= AVMEDIA_TYPE_UNKNOWN ||
st->codec->codec_type >= AVMEDIA_TYPE_NB)
continue;
if (first[st->codec->codec_type] < 0)
first[st->codec->codec_type] = i;
if (st->disposition & AV_DISPOSITION_DEFAULT) {
mov->tracks[i].flags |= MOV_TRACK_ENABLED;
enabled[st->codec->codec_type] = 1;
}
}
for (i = 0; i < AVMEDIA_TYPE_NB; i++) {
switch (i) {
case AVMEDIA_TYPE_VIDEO:
case AVMEDIA_TYPE_AUDIO:
case AVMEDIA_TYPE_SUBTITLE:
if (!enabled[i] && first[i] >= 0)
mov->tracks[first[i]].flags |= MOV_TRACK_ENABLED;
break;
}
}
}
static int mov_write_header(AVFormatContext *s)
{
AVIOContext *pb = s->pb;
@ -3182,6 +3234,8 @@ static int mov_write_header(AVFormatContext *s)
}
}
enable_tracks(s);
if (mov->mode == MODE_ISM) {
/* If no fragmentation options have been set, set a default. */
if (!(mov->flags & (FF_MOV_FLAG_FRAG_KEYFRAME |

@ -85,6 +85,7 @@ typedef struct MOVTrack {
int has_keyframes;
#define MOV_TRACK_CTTS 0x0001
#define MOV_TRACK_STPS 0x0002
#define MOV_TRACK_ENABLED 0x0004
uint32_t flags;
int language;
int track_id;

@ -1,4 +1,4 @@
8ad790d3a0bbda81cd23c15ab8ba760d *tests/data/fate/acodec-alac.mov
98cfcf6cf139844ca27d16f1fc64f62c *tests/data/fate/acodec-alac.mov
389258 tests/data/fate/acodec-alac.mov
64151e4bcc2b717aa5a8454d424d6a1f *tests/data/fate/acodec-alac.out.wav
stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400

@ -1,4 +1,4 @@
009a446579dd4cba793723b5e2b93c39 *tests/data/fate/acodec-pcm-s16be.mov
b650d16f5ac191c41d5fa3657cf4c1ac *tests/data/fate/acodec-pcm-s16be.mov
1060097 tests/data/fate/acodec-pcm-s16be.mov
64151e4bcc2b717aa5a8454d424d6a1f *tests/data/fate/acodec-pcm-s16be.out.wav
stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400

@ -1,4 +1,4 @@
de27dae0dff0359d8f39449b17d5607f *tests/data/fate/acodec-pcm-s24be.mov
0bd99d1273fb1fb78055cf97f3efe299 *tests/data/fate/acodec-pcm-s24be.mov
1589297 tests/data/fate/acodec-pcm-s24be.mov
64151e4bcc2b717aa5a8454d424d6a1f *tests/data/fate/acodec-pcm-s24be.out.wav
stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400

@ -1,4 +1,4 @@
2db1e7fe92d4006103691a4b59064dc6 *tests/data/fate/acodec-pcm-s32be.mov
7ebffb0bd01c02b9953ee5b1e2f47910 *tests/data/fate/acodec-pcm-s32be.mov
2118497 tests/data/fate/acodec-pcm-s32be.mov
64151e4bcc2b717aa5a8454d424d6a1f *tests/data/fate/acodec-pcm-s32be.out.wav
stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400

@ -1,4 +1,4 @@
9ee95a7fff38831a1cad3b49c33e6ed9 *tests/data/fate/acodec-pcm-s8.mov
3b52f563e8e99aa26253eff154980a93 *tests/data/fate/acodec-pcm-s8.mov
530897 tests/data/fate/acodec-pcm-s8.mov
651d4eb8d98dfcdda96ae6c43d8f156b *tests/data/fate/acodec-pcm-s8.out.wav
stddev: 147.89 PSNR: 52.93 MAXDIFF: 255 bytes: 1058400/ 1058400

@ -1,3 +1,3 @@
8404cccff020ab07fbfe9c713bc98c33 *./tests/data/lavf/lavf.mov
e46f42ed71a589ac356e9cfad4e1e56a *./tests/data/lavf/lavf.mov
356797 ./tests/data/lavf/lavf.mov
./tests/data/lavf/lavf.mov CRC=0xe3f4950d

@ -1,4 +1,4 @@
2412f206f5efcbbcc3f2bba0c86b73d4 *tests/data/fate/vsynth1-dnxhd-1080i.mov
9e55c9ec332cc6ee002da67de34ca6d1 *tests/data/fate/vsynth1-dnxhd-1080i.mov
3031875 tests/data/fate/vsynth1-dnxhd-1080i.mov
34076f61254997c8157eafed1c916472 *tests/data/fate/vsynth1-dnxhd-1080i.out.rawvideo
stddev: 6.29 PSNR: 32.15 MAXDIFF: 64 bytes: 7603200/ 760320

@ -1,4 +1,4 @@
59a9e2eed314abface66aaf1b45eb8f2 *tests/data/fate/vsynth1-mpeg4.mp4
dc927acd770e19a97456ecbd4d786938 *tests/data/fate/vsynth1-mpeg4.mp4
540180 tests/data/fate/vsynth1-mpeg4.mp4
8828a375448dc5c2215163ba70656f89 *tests/data/fate/vsynth1-mpeg4.out.rawvideo
stddev: 7.97 PSNR: 30.10 MAXDIFF: 105 bytes: 7603200/ 7603200

@ -1,4 +1,4 @@
2566517b15c62887bd94daaab1b1a85b *tests/data/fate/vsynth1-prores.mov
7dfcca40f50ff1d72541bc095c904784 *tests/data/fate/vsynth1-prores.mov
3859037 tests/data/fate/vsynth1-prores.mov
0a4153637d0cc0a88a8bcbf04cfaf8c6 *tests/data/fate/vsynth1-prores.out.rawvideo
stddev: 3.17 PSNR: 38.09 MAXDIFF: 39 bytes: 7603200/ 7603200

@ -1,4 +1,4 @@
7d75328a17e04796a39fe9be3a322946 *tests/data/fate/vsynth1-qtrle.mov
24650c5b226d054c57be7c06c9220058 *tests/data/fate/vsynth1-qtrle.mov
15263232 tests/data/fate/vsynth1-qtrle.mov
243325fb2cae1a9245efd49aff936327 *tests/data/fate/vsynth1-qtrle.out.rawvideo
stddev: 3.42 PSNR: 37.43 MAXDIFF: 48 bytes: 7603200/ 7603200

@ -1,4 +1,4 @@
5c9d8734693f3cab57f61e76b5b6da7d *tests/data/fate/vsynth1-svq1.mov
3c90c6c0c4db7993660cee642de05bb4 *tests/data/fate/vsynth1-svq1.mov
1334367 tests/data/fate/vsynth1-svq1.mov
9cc35c54b2c77d36bd7e308b393c1f81 *tests/data/fate/vsynth1-svq1.out.rawvideo
stddev: 9.58 PSNR: 28.50 MAXDIFF: 210 bytes: 7603200/ 7603200

@ -1,4 +1,4 @@
65ca6385b565b6ea9a2e28150eef1d46 *tests/data/fate/vsynth2-dnxhd-1080i.mov
c456f2a7ac9435ea5bfea86bc69c1c41 *tests/data/fate/vsynth2-dnxhd-1080i.mov
3031875 tests/data/fate/vsynth2-dnxhd-1080i.mov
42262a2325441b38b3b3c8a42d888e7d *tests/data/fate/vsynth2-dnxhd-1080i.out.rawvideo
stddev: 1.31 PSNR: 45.77 MAXDIFF: 23 bytes: 7603200/ 760320

@ -1,4 +1,4 @@
8c9afbf564008a8ce6719cc3546deae1 *tests/data/fate/vsynth2-mpeg4.mp4
0282105e98166fac06f7ba9e857cfbfe *tests/data/fate/vsynth2-mpeg4.mp4
119833 tests/data/fate/vsynth2-mpeg4.mp4
90a3577850239083a9042bef33c50e85 *tests/data/fate/vsynth2-mpeg4.out.rawvideo
stddev: 5.34 PSNR: 33.57 MAXDIFF: 83 bytes: 7603200/ 7603200

@ -1,4 +1,4 @@
28755ce05e812adbb8b7c180318ffba8 *tests/data/fate/vsynth2-prores.mov
7d167fee27e8c34968bbecec282f927a *tests/data/fate/vsynth2-prores.mov
3884722 tests/data/fate/vsynth2-prores.mov
ca2f6c1162635dedfa468c90f1fdc0ef *tests/data/fate/vsynth2-prores.out.rawvideo
stddev: 0.92 PSNR: 48.77 MAXDIFF: 10 bytes: 7603200/ 7603200

@ -1,4 +1,4 @@
4805f35ca6e03b9279cc18f3f7356366 *tests/data/fate/vsynth2-qtrle.mov
fe3db3dd385b8e5dc43cccc17b50f7f0 *tests/data/fate/vsynth2-qtrle.mov
14798419 tests/data/fate/vsynth2-qtrle.mov
b2418e0e3a9a8619b31219cbcf24dc82 *tests/data/fate/vsynth2-qtrle.out.rawvideo
stddev: 1.26 PSNR: 46.06 MAXDIFF: 13 bytes: 7603200/ 7603200

@ -1,4 +1,4 @@
138ad38281570f1a3b68d63ed896435d *tests/data/fate/vsynth2-svq1.mov
c15de1e0b0439981dc94b927b1933889 *tests/data/fate/vsynth2-svq1.mov
766851 tests/data/fate/vsynth2-svq1.mov
aa03471dac3f49455a33a2b19fda1098 *tests/data/fate/vsynth2-svq1.out.rawvideo
stddev: 3.23 PSNR: 37.93 MAXDIFF: 61 bytes: 7603200/ 7603200

Loading…
Cancel
Save