Mercurial > libavformat.hg
annotate movenc.c @ 6085:72c7c3d5c4e9 libavformat
matroskaenc: Mux clusters better
Start them on keyframes when reasonable, and delay writing audio packets
to help ensure that there's audio samples available for the first frame in
clusters.
Patch by James Zern <jzern at google>
author | conrad |
---|---|
date | Fri, 04 Jun 2010 22:40:50 +0000 |
parents | 0b0e8fff6673 |
children | 9c8c96356051 |
rev | line source |
---|---|
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1 /* |
1415
3b00fb8ef8e4
replace coder/decoder file description in libavformat by muxer/demuxer
aurel
parents:
1358
diff
changeset
|
2 * MOV, 3GP, MP4 muxer |
4251
77e0c7511d41
cosmetics: Remove pointless period after copyright statement non-sentences.
diego
parents:
4225
diff
changeset
|
3 * Copyright (c) 2003 Thomas Raivio |
77e0c7511d41
cosmetics: Remove pointless period after copyright statement non-sentences.
diego
parents:
4225
diff
changeset
|
4 * Copyright (c) 2004 Gildas Bazin <gbazin at videolan dot org> |
4722
639c428c8b23
typo in the mail, the 4am commit is always the worst
bcoudurier
parents:
4721
diff
changeset
|
5 * Copyright (c) 2009 Baptiste Coudurier <baptiste dot coudurier at gmail dot com> |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
6 * |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1292
diff
changeset
|
7 * This file is part of FFmpeg. |
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1292
diff
changeset
|
8 * |
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1292
diff
changeset
|
9 * FFmpeg is free software; you can redistribute it and/or |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
10 * modify it under the terms of the GNU Lesser General Public |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
11 * License as published by the Free Software Foundation; either |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1292
diff
changeset
|
12 * version 2.1 of the License, or (at your option) any later version. |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
13 * |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1292
diff
changeset
|
14 * FFmpeg is distributed in the hope that it will be useful, |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
17 * Lesser General Public License for more details. |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
18 * |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
19 * You should have received a copy of the GNU Lesser General Public |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1292
diff
changeset
|
20 * License along with FFmpeg; if not, write to the Free Software |
896
edbe5c3717f9
Update licensing information: The FSF changed postal address.
diego
parents:
890
diff
changeset
|
21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
22 */ |
4721 | 23 |
6011
97fdefab56cd
Move the mov muxer structures to a separate header
mstorsjo
parents:
5993
diff
changeset
|
24 #include "movenc.h" |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
25 #include "avformat.h" |
1172
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
1169
diff
changeset
|
26 #include "riff.h" |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
27 #include "avio.h" |
1216
fec0a3d5408f
move common code from mov.c and movenc.c to isom.c
bcoudurier
parents:
1172
diff
changeset
|
28 #include "isom.h" |
2922
dcd599833abc
Move isom_write_avcc() and related functions into a separate file.
aurel
parents:
2921
diff
changeset
|
29 #include "avc.h" |
4872 | 30 #include "libavcodec/get_bits.h" |
4864
7aa7c5853bb6
Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
4832
diff
changeset
|
31 #include "libavcodec/put_bits.h" |
6013
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
32 #include "internal.h" |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
33 #include "libavutil/avstring.h" |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
34 |
238
3519903c6c2a
mov/mp4 muxer cleanup (mostly cosmetics/simplifications & global header fix)
michaelni
parents:
202
diff
changeset
|
35 #undef NDEBUG |
3519903c6c2a
mov/mp4 muxer cleanup (mostly cosmetics/simplifications & global header fix)
michaelni
parents:
202
diff
changeset
|
36 #include <assert.h> |
3519903c6c2a
mov/mp4 muxer cleanup (mostly cosmetics/simplifications & global header fix)
michaelni
parents:
202
diff
changeset
|
37 |
2165 | 38 //FIXME support 64 bit variant with wide placeholders |
3973
549a09cf23fe
Remove offset_t typedef and use int64_t directly instead.
diego
parents:
3909
diff
changeset
|
39 static int64_t updateSize(ByteIOContext *pb, int64_t pos) |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
40 { |
3973
549a09cf23fe
Remove offset_t typedef and use int64_t directly instead.
diego
parents:
3909
diff
changeset
|
41 int64_t curpos = url_ftell(pb); |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
42 url_fseek(pb, pos, SEEK_SET); |
238
3519903c6c2a
mov/mp4 muxer cleanup (mostly cosmetics/simplifications & global header fix)
michaelni
parents:
202
diff
changeset
|
43 put_be32(pb, curpos - pos); /* rewrite size */ |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
44 url_fseek(pb, curpos, SEEK_SET); |
238
3519903c6c2a
mov/mp4 muxer cleanup (mostly cosmetics/simplifications & global header fix)
michaelni
parents:
202
diff
changeset
|
45 |
3519903c6c2a
mov/mp4 muxer cleanup (mostly cosmetics/simplifications & global header fix)
michaelni
parents:
202
diff
changeset
|
46 return curpos - pos; |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
47 } |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
48 |
298
0b2eed7b1210
movenc patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
286
diff
changeset
|
49 /* Chunk offset atom */ |
3446 | 50 static int mov_write_stco_tag(ByteIOContext *pb, MOVTrack *track) |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
51 { |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
52 int i; |
910 | 53 int mode64 = 0; // use 32 bit size variant if possible |
3973
549a09cf23fe
Remove offset_t typedef and use int64_t directly instead.
diego
parents:
3909
diff
changeset
|
54 int64_t pos = url_ftell(pb); |
259
e091218eccd2
mov/mp4/3gp muxer improvements patch by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
241
diff
changeset
|
55 put_be32(pb, 0); /* size */ |
909
69e06b6f91a3
>4gb fixes by (Dirk Musfeldt | d.musfeldt meilenstein de)
michael
parents:
896
diff
changeset
|
56 if (pos > UINT32_MAX) { |
69e06b6f91a3
>4gb fixes by (Dirk Musfeldt | d.musfeldt meilenstein de)
michael
parents:
896
diff
changeset
|
57 mode64 = 1; |
69e06b6f91a3
>4gb fixes by (Dirk Musfeldt | d.musfeldt meilenstein de)
michael
parents:
896
diff
changeset
|
58 put_tag(pb, "co64"); |
69e06b6f91a3
>4gb fixes by (Dirk Musfeldt | d.musfeldt meilenstein de)
michael
parents:
896
diff
changeset
|
59 } else |
69e06b6f91a3
>4gb fixes by (Dirk Musfeldt | d.musfeldt meilenstein de)
michael
parents:
896
diff
changeset
|
60 put_tag(pb, "stco"); |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
61 put_be32(pb, 0); /* version & flags */ |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
62 put_be32(pb, track->entry); /* entry count */ |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
63 for (i=0; i<track->entry; i++) { |
909
69e06b6f91a3
>4gb fixes by (Dirk Musfeldt | d.musfeldt meilenstein de)
michael
parents:
896
diff
changeset
|
64 if(mode64 == 1) |
1129 | 65 put_be64(pb, track->cluster[i].pos); |
909
69e06b6f91a3
>4gb fixes by (Dirk Musfeldt | d.musfeldt meilenstein de)
michael
parents:
896
diff
changeset
|
66 else |
1129 | 67 put_be32(pb, track->cluster[i].pos); |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
68 } |
3455 | 69 return updateSize(pb, pos); |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
70 } |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
71 |
298
0b2eed7b1210
movenc patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
286
diff
changeset
|
72 /* Sample size atom */ |
3446 | 73 static int mov_write_stsz_tag(ByteIOContext *pb, MOVTrack *track) |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
74 { |
259
e091218eccd2
mov/mp4/3gp muxer improvements patch by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
241
diff
changeset
|
75 int equalChunks = 1; |
298
0b2eed7b1210
movenc patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
286
diff
changeset
|
76 int i, j, entries = 0, tst = -1, oldtst = -1; |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
77 |
3973
549a09cf23fe
Remove offset_t typedef and use int64_t directly instead.
diego
parents:
3909
diff
changeset
|
78 int64_t pos = url_ftell(pb); |
259
e091218eccd2
mov/mp4/3gp muxer improvements patch by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
241
diff
changeset
|
79 put_be32(pb, 0); /* size */ |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
80 put_tag(pb, "stsz"); |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
81 put_be32(pb, 0); /* version & flags */ |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
82 |
259
e091218eccd2
mov/mp4/3gp muxer improvements patch by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
241
diff
changeset
|
83 for (i=0; i<track->entry; i++) { |
1129 | 84 tst = track->cluster[i].size/track->cluster[i].entries; |
298
0b2eed7b1210
movenc patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
286
diff
changeset
|
85 if(oldtst != -1 && tst != oldtst) { |
0b2eed7b1210
movenc patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
286
diff
changeset
|
86 equalChunks = 0; |
259
e091218eccd2
mov/mp4/3gp muxer improvements patch by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
241
diff
changeset
|
87 } |
e091218eccd2
mov/mp4/3gp muxer improvements patch by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
241
diff
changeset
|
88 oldtst = tst; |
1129 | 89 entries += track->cluster[i].entries; |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
90 } |
298
0b2eed7b1210
movenc patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
286
diff
changeset
|
91 if (equalChunks) { |
1129 | 92 int sSize = track->cluster[0].size/track->cluster[0].entries; |
885 | 93 put_be32(pb, sSize); // sample size |
298
0b2eed7b1210
movenc patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
286
diff
changeset
|
94 put_be32(pb, entries); // sample count |
259
e091218eccd2
mov/mp4/3gp muxer improvements patch by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
241
diff
changeset
|
95 } |
e091218eccd2
mov/mp4/3gp muxer improvements patch by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
241
diff
changeset
|
96 else { |
885 | 97 put_be32(pb, 0); // sample size |
98 put_be32(pb, entries); // sample count | |
259
e091218eccd2
mov/mp4/3gp muxer improvements patch by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
241
diff
changeset
|
99 for (i=0; i<track->entry; i++) { |
3024
19de43025f0f
cosmetics, remove whitespaces before and after parenthesis
bcoudurier
parents:
3010
diff
changeset
|
100 for (j=0; j<track->cluster[i].entries; j++) { |
1129 | 101 put_be32(pb, track->cluster[i].size / |
102 track->cluster[i].entries); | |
298
0b2eed7b1210
movenc patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
286
diff
changeset
|
103 } |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
104 } |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
105 } |
3455 | 106 return updateSize(pb, pos); |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
107 } |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
108 |
298
0b2eed7b1210
movenc patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
286
diff
changeset
|
109 /* Sample to chunk atom */ |
3446 | 110 static int mov_write_stsc_tag(ByteIOContext *pb, MOVTrack *track) |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
111 { |
909
69e06b6f91a3
>4gb fixes by (Dirk Musfeldt | d.musfeldt meilenstein de)
michael
parents:
896
diff
changeset
|
112 int index = 0, oldval = -1, i; |
3973
549a09cf23fe
Remove offset_t typedef and use int64_t directly instead.
diego
parents:
3909
diff
changeset
|
113 int64_t entryPos, curpos; |
259
e091218eccd2
mov/mp4/3gp muxer improvements patch by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
241
diff
changeset
|
114 |
3973
549a09cf23fe
Remove offset_t typedef and use int64_t directly instead.
diego
parents:
3909
diff
changeset
|
115 int64_t pos = url_ftell(pb); |
259
e091218eccd2
mov/mp4/3gp muxer improvements patch by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
241
diff
changeset
|
116 put_be32(pb, 0); /* size */ |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
117 put_tag(pb, "stsc"); |
885 | 118 put_be32(pb, 0); // version & flags |
259
e091218eccd2
mov/mp4/3gp muxer improvements patch by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
241
diff
changeset
|
119 entryPos = url_ftell(pb); |
885 | 120 put_be32(pb, track->entry); // entry count |
259
e091218eccd2
mov/mp4/3gp muxer improvements patch by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
241
diff
changeset
|
121 for (i=0; i<track->entry; i++) { |
1129 | 122 if(oldval != track->cluster[i].samplesInChunk) |
259
e091218eccd2
mov/mp4/3gp muxer improvements patch by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
241
diff
changeset
|
123 { |
885 | 124 put_be32(pb, i+1); // first chunk |
1129 | 125 put_be32(pb, track->cluster[i].samplesInChunk); // samples per chunk |
885 | 126 put_be32(pb, 0x1); // sample description index |
1129 | 127 oldval = track->cluster[i].samplesInChunk; |
259
e091218eccd2
mov/mp4/3gp muxer improvements patch by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
241
diff
changeset
|
128 index++; |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
129 } |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
130 } |
259
e091218eccd2
mov/mp4/3gp muxer improvements patch by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
241
diff
changeset
|
131 curpos = url_ftell(pb); |
e091218eccd2
mov/mp4/3gp muxer improvements patch by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
241
diff
changeset
|
132 url_fseek(pb, entryPos, SEEK_SET); |
885 | 133 put_be32(pb, index); // rewrite size |
259
e091218eccd2
mov/mp4/3gp muxer improvements patch by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
241
diff
changeset
|
134 url_fseek(pb, curpos, SEEK_SET); |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
135 |
3455 | 136 return updateSize(pb, pos); |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
137 } |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
138 |
298
0b2eed7b1210
movenc patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
286
diff
changeset
|
139 /* Sync sample atom */ |
4941 | 140 static int mov_write_stss_tag(ByteIOContext *pb, MOVTrack *track, uint32_t flag) |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
141 { |
3973
549a09cf23fe
Remove offset_t typedef and use int64_t directly instead.
diego
parents:
3909
diff
changeset
|
142 int64_t curpos, entryPos; |
909
69e06b6f91a3
>4gb fixes by (Dirk Musfeldt | d.musfeldt meilenstein de)
michael
parents:
896
diff
changeset
|
143 int i, index = 0; |
3973
549a09cf23fe
Remove offset_t typedef and use int64_t directly instead.
diego
parents:
3909
diff
changeset
|
144 int64_t pos = url_ftell(pb); |
885 | 145 put_be32(pb, 0); // size |
4941 | 146 put_tag(pb, flag == MOV_SYNC_SAMPLE ? "stss" : "stps"); |
885 | 147 put_be32(pb, 0); // version & flags |
259
e091218eccd2
mov/mp4/3gp muxer improvements patch by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
241
diff
changeset
|
148 entryPos = url_ftell(pb); |
885 | 149 put_be32(pb, track->entry); // entry count |
259
e091218eccd2
mov/mp4/3gp muxer improvements patch by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
241
diff
changeset
|
150 for (i=0; i<track->entry; i++) { |
4941 | 151 if (track->cluster[i].flags & flag) { |
259
e091218eccd2
mov/mp4/3gp muxer improvements patch by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
241
diff
changeset
|
152 put_be32(pb, i+1); |
e091218eccd2
mov/mp4/3gp muxer improvements patch by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
241
diff
changeset
|
153 index++; |
e091218eccd2
mov/mp4/3gp muxer improvements patch by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
241
diff
changeset
|
154 } |
e091218eccd2
mov/mp4/3gp muxer improvements patch by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
241
diff
changeset
|
155 } |
e091218eccd2
mov/mp4/3gp muxer improvements patch by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
241
diff
changeset
|
156 curpos = url_ftell(pb); |
e091218eccd2
mov/mp4/3gp muxer improvements patch by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
241
diff
changeset
|
157 url_fseek(pb, entryPos, SEEK_SET); |
885 | 158 put_be32(pb, index); // rewrite size |
259
e091218eccd2
mov/mp4/3gp muxer improvements patch by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
241
diff
changeset
|
159 url_fseek(pb, curpos, SEEK_SET); |
3455 | 160 return updateSize(pb, pos); |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
161 } |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
162 |
1152
c7cf3d1f9bd7
simplify and write correct values conforming to specs
bcoudurier
parents:
1151
diff
changeset
|
163 static int mov_write_amr_tag(ByteIOContext *pb, MOVTrack *track) |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
164 { |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
165 put_be32(pb, 0x11); /* size */ |
1152
c7cf3d1f9bd7
simplify and write correct values conforming to specs
bcoudurier
parents:
1151
diff
changeset
|
166 if (track->mode == MODE_MOV) put_tag(pb, "samr"); |
c7cf3d1f9bd7
simplify and write correct values conforming to specs
bcoudurier
parents:
1151
diff
changeset
|
167 else put_tag(pb, "damr"); |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
168 put_tag(pb, "FFMP"); |
1152
c7cf3d1f9bd7
simplify and write correct values conforming to specs
bcoudurier
parents:
1151
diff
changeset
|
169 put_byte(pb, 0); /* decoder version */ |
1083 | 170 |
1153 | 171 put_be16(pb, 0x81FF); /* Mode set (all modes for AMR_NB) */ |
1152
c7cf3d1f9bd7
simplify and write correct values conforming to specs
bcoudurier
parents:
1151
diff
changeset
|
172 put_byte(pb, 0x00); /* Mode change period (no restriction) */ |
c7cf3d1f9bd7
simplify and write correct values conforming to specs
bcoudurier
parents:
1151
diff
changeset
|
173 put_byte(pb, 0x01); /* Frames per sample */ |
1083 | 174 return 0x11; |
175 } | |
176 | |
3881 | 177 static int mov_write_ac3_tag(ByteIOContext *pb, MOVTrack *track) |
178 { | |
179 GetBitContext gbc; | |
180 PutBitContext pbc; | |
181 uint8_t buf[3]; | |
182 int fscod, bsid, bsmod, acmod, lfeon, frmsizecod; | |
183 | |
184 if (track->vosLen < 7) | |
185 return -1; | |
186 | |
187 put_be32(pb, 11); | |
188 put_tag(pb, "dac3"); | |
189 | |
3888
0244f7383b70
skip 2 bytes more when parsing ac3 frame, syncword 16bits + crc 16bits,
bcoudurier
parents:
3887
diff
changeset
|
190 init_get_bits(&gbc, track->vosData+4, track->vosLen-4); |
3881 | 191 fscod = get_bits(&gbc, 2); |
192 frmsizecod = get_bits(&gbc, 6); | |
193 bsid = get_bits(&gbc, 5); | |
194 bsmod = get_bits(&gbc, 3); | |
195 acmod = get_bits(&gbc, 3); | |
196 if (acmod == 2) { | |
197 skip_bits(&gbc, 2); // dsurmod | |
198 } else { | |
199 if ((acmod & 1) && acmod != 1) | |
200 skip_bits(&gbc, 2); // cmixlev | |
201 if (acmod & 4) | |
202 skip_bits(&gbc, 2); // surmixlev | |
203 } | |
204 lfeon = get_bits1(&gbc); | |
205 | |
206 init_put_bits(&pbc, buf, sizeof(buf)); | |
207 put_bits(&pbc, 2, fscod); | |
208 put_bits(&pbc, 5, bsid); | |
209 put_bits(&pbc, 3, bsmod); | |
210 put_bits(&pbc, 3, acmod); | |
211 put_bits(&pbc, 1, lfeon); | |
212 put_bits(&pbc, 5, frmsizecod>>1); // bit_rate_code | |
213 put_bits(&pbc, 5, 0); // reserved | |
214 | |
215 flush_put_bits(&pbc); | |
216 put_buffer(pb, buf, sizeof(buf)); | |
217 | |
218 return 11; | |
219 } | |
220 | |
3243 | 221 /** |
222 * This function writes extradata "as is". | |
223 * Extradata must be formated like a valid atom (with size and tag) | |
224 */ | |
225 static int mov_write_extradata_tag(ByteIOContext *pb, MOVTrack *track) | |
226 { | |
227 put_buffer(pb, track->enc->extradata, track->enc->extradata_size); | |
228 return track->enc->extradata_size; | |
229 } | |
230 | |
1082 | 231 static int mov_write_enda_tag(ByteIOContext *pb) |
232 { | |
233 put_be32(pb, 10); | |
234 put_tag(pb, "enda"); | |
235 put_be16(pb, 1); /* little endian */ | |
236 return 10; | |
237 } | |
238 | |
1080 | 239 static unsigned int descrLength(unsigned int len) |
240 { | |
1081 | 241 int i; |
242 for(i=1; len>>(7*i); i++); | |
243 return len + 1 + i; | |
1080 | 244 } |
245 | |
1081 | 246 static void putDescr(ByteIOContext *pb, int tag, unsigned int size) |
1080 | 247 { |
1081 | 248 int i= descrLength(size) - size - 2; |
249 put_byte(pb, tag); | |
250 for(; i>0; i--) | |
251 put_byte(pb, (size>>(7*i)) | 0x80); | |
252 put_byte(pb, size & 0x7F); | |
1080 | 253 } |
254 | |
3446 | 255 static int mov_write_esds_tag(ByteIOContext *pb, MOVTrack *track) // Basic |
1080 | 256 { |
3973
549a09cf23fe
Remove offset_t typedef and use int64_t directly instead.
diego
parents:
3909
diff
changeset
|
257 int64_t pos = url_ftell(pb); |
1082 | 258 int decoderSpecificInfoLen = track->vosLen ? descrLength(track->vosLen):0; |
1080 | 259 |
3246
a6a78c1cbf33
cosmetics: remove useless whitespaces and put braces correctly
bcoudurier
parents:
3243
diff
changeset
|
260 put_be32(pb, 0); // size |
1080 | 261 put_tag(pb, "esds"); |
3246
a6a78c1cbf33
cosmetics: remove useless whitespaces and put braces correctly
bcoudurier
parents:
3243
diff
changeset
|
262 put_be32(pb, 0); // Version |
1080 | 263 |
264 // ES descriptor | |
265 putDescr(pb, 0x03, 3 + descrLength(13 + decoderSpecificInfoLen) + | |
266 descrLength(1)); | |
267 put_be16(pb, track->trackID); | |
3246
a6a78c1cbf33
cosmetics: remove useless whitespaces and put braces correctly
bcoudurier
parents:
3243
diff
changeset
|
268 put_byte(pb, 0x00); // flags (= no flags) |
1080 | 269 |
270 // DecoderConfig descriptor | |
271 putDescr(pb, 0x04, 13 + decoderSpecificInfoLen); | |
272 | |
273 // Object type indication | |
3869 | 274 if ((track->enc->codec_id == CODEC_ID_MP2 || |
275 track->enc->codec_id == CODEC_ID_MP3) && | |
3887
c8ab0676bba6
change the logic to mux 13818-3 and 11172-3 in mp4, less code
bcoudurier
parents:
3886
diff
changeset
|
276 track->enc->sample_rate > 24000) |
c8ab0676bba6
change the logic to mux 13818-3 and 11172-3 in mp4, less code
bcoudurier
parents:
3886
diff
changeset
|
277 put_byte(pb, 0x6B); // 11172-3 |
3869 | 278 else |
5058
33a244b7ca65
Add ff_ prefixes to exported symbols in libavformat/riff.h.
diego
parents:
4996
diff
changeset
|
279 put_byte(pb, ff_codec_get_tag(ff_mp4_obj_type, track->enc->codec_id)); |
1080 | 280 |
281 // the following fields is made of 6 bits to identify the streamtype (4 for video, 5 for audio) | |
282 // plus 1 bit to indicate upstream and 1 bit set to 1 (reserved) | |
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5792
diff
changeset
|
283 if(track->enc->codec_type == AVMEDIA_TYPE_AUDIO) |
3246
a6a78c1cbf33
cosmetics: remove useless whitespaces and put braces correctly
bcoudurier
parents:
3243
diff
changeset
|
284 put_byte(pb, 0x15); // flags (= Audiostream) |
1080 | 285 else |
3246
a6a78c1cbf33
cosmetics: remove useless whitespaces and put braces correctly
bcoudurier
parents:
3243
diff
changeset
|
286 put_byte(pb, 0x11); // flags (= Visualstream) |
1080 | 287 |
3246
a6a78c1cbf33
cosmetics: remove useless whitespaces and put braces correctly
bcoudurier
parents:
3243
diff
changeset
|
288 put_byte(pb, track->enc->rc_buffer_size>>(3+16)); // Buffersize DB (24 bits) |
a6a78c1cbf33
cosmetics: remove useless whitespaces and put braces correctly
bcoudurier
parents:
3243
diff
changeset
|
289 put_be16(pb, (track->enc->rc_buffer_size>>3)&0xFFFF); // Buffersize DB |
1080 | 290 |
3246
a6a78c1cbf33
cosmetics: remove useless whitespaces and put braces correctly
bcoudurier
parents:
3243
diff
changeset
|
291 put_be32(pb, FFMAX(track->enc->bit_rate, track->enc->rc_max_rate)); // maxbitrate (FIXME should be max rate in any 1 sec window) |
1080 | 292 if(track->enc->rc_max_rate != track->enc->rc_min_rate || track->enc->rc_min_rate==0) |
3246
a6a78c1cbf33
cosmetics: remove useless whitespaces and put braces correctly
bcoudurier
parents:
3243
diff
changeset
|
293 put_be32(pb, 0); // vbr |
1080 | 294 else |
3246
a6a78c1cbf33
cosmetics: remove useless whitespaces and put braces correctly
bcoudurier
parents:
3243
diff
changeset
|
295 put_be32(pb, track->enc->rc_max_rate); // avg bitrate |
1080 | 296 |
3246
a6a78c1cbf33
cosmetics: remove useless whitespaces and put braces correctly
bcoudurier
parents:
3243
diff
changeset
|
297 if (track->vosLen) { |
1080 | 298 // DecoderSpecific info descriptor |
299 putDescr(pb, 0x05, track->vosLen); | |
300 put_buffer(pb, track->vosData, track->vosLen); | |
301 } | |
302 | |
303 // SL descriptor | |
304 putDescr(pb, 0x06, 1); | |
305 put_byte(pb, 0x02); | |
3455 | 306 return updateSize(pb, pos); |
1080 | 307 } |
308 | |
5390 | 309 static int mov_pcm_le_gt16(enum CodecID codec_id) |
310 { | |
311 return codec_id == CODEC_ID_PCM_S24LE || | |
312 codec_id == CODEC_ID_PCM_S32LE || | |
313 codec_id == CODEC_ID_PCM_F32LE || | |
314 codec_id == CODEC_ID_PCM_F64LE; | |
315 } | |
316 | |
3446 | 317 static int mov_write_wave_tag(ByteIOContext *pb, MOVTrack *track) |
365
4ae9fac22a5d
AAC support in mov, correct aspect ratio support and user data support patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
342
diff
changeset
|
318 { |
3973
549a09cf23fe
Remove offset_t typedef and use int64_t directly instead.
diego
parents:
3909
diff
changeset
|
319 int64_t pos = url_ftell(pb); |
365
4ae9fac22a5d
AAC support in mov, correct aspect ratio support and user data support patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
342
diff
changeset
|
320 |
4ae9fac22a5d
AAC support in mov, correct aspect ratio support and user data support patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
342
diff
changeset
|
321 put_be32(pb, 0); /* size */ |
4ae9fac22a5d
AAC support in mov, correct aspect ratio support and user data support patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
342
diff
changeset
|
322 put_tag(pb, "wave"); |
4ae9fac22a5d
AAC support in mov, correct aspect ratio support and user data support patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
342
diff
changeset
|
323 |
4ae9fac22a5d
AAC support in mov, correct aspect ratio support and user data support patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
342
diff
changeset
|
324 put_be32(pb, 12); /* size */ |
4ae9fac22a5d
AAC support in mov, correct aspect ratio support and user data support patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
342
diff
changeset
|
325 put_tag(pb, "frma"); |
1082 | 326 put_le32(pb, track->tag); |
365
4ae9fac22a5d
AAC support in mov, correct aspect ratio support and user data support patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
342
diff
changeset
|
327 |
1082 | 328 if (track->enc->codec_id == CODEC_ID_AAC) { |
1125 | 329 /* useless atom needed by mplayer, ipod, not needed by quicktime */ |
330 put_be32(pb, 12); /* size */ | |
331 put_tag(pb, "mp4a"); | |
332 put_be32(pb, 0); | |
1082 | 333 mov_write_esds_tag(pb, track); |
5390 | 334 } else if (mov_pcm_le_gt16(track->enc->codec_id)) { |
1082 | 335 mov_write_enda_tag(pb); |
1083 | 336 } else if (track->enc->codec_id == CODEC_ID_AMR_NB) { |
1152
c7cf3d1f9bd7
simplify and write correct values conforming to specs
bcoudurier
parents:
1151
diff
changeset
|
337 mov_write_amr_tag(pb, track); |
3881 | 338 } else if (track->enc->codec_id == CODEC_ID_AC3) { |
339 mov_write_ac3_tag(pb, track); | |
3243 | 340 } else if (track->enc->codec_id == CODEC_ID_ALAC) { |
341 mov_write_extradata_tag(pb, track); | |
1082 | 342 } |
365
4ae9fac22a5d
AAC support in mov, correct aspect ratio support and user data support patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
342
diff
changeset
|
343 |
4ae9fac22a5d
AAC support in mov, correct aspect ratio support and user data support patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
342
diff
changeset
|
344 put_be32(pb, 8); /* size */ |
4ae9fac22a5d
AAC support in mov, correct aspect ratio support and user data support patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
342
diff
changeset
|
345 put_be32(pb, 0); /* null tag */ |
4ae9fac22a5d
AAC support in mov, correct aspect ratio support and user data support patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
342
diff
changeset
|
346 |
3455 | 347 return updateSize(pb, pos); |
365
4ae9fac22a5d
AAC support in mov, correct aspect ratio support and user data support patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
342
diff
changeset
|
348 } |
4ae9fac22a5d
AAC support in mov, correct aspect ratio support and user data support patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
342
diff
changeset
|
349 |
3446 | 350 static int mov_write_glbl_tag(ByteIOContext *pb, MOVTrack *track) |
2838
6bea49ef18b1
use generic 'glbl' atom if extradata is present but no specific method is known
bcoudurier
parents:
2802
diff
changeset
|
351 { |
6bea49ef18b1
use generic 'glbl' atom if extradata is present but no specific method is known
bcoudurier
parents:
2802
diff
changeset
|
352 put_be32(pb, track->vosLen+8); |
6bea49ef18b1
use generic 'glbl' atom if extradata is present but no specific method is known
bcoudurier
parents:
2802
diff
changeset
|
353 put_tag(pb, "glbl"); |
6bea49ef18b1
use generic 'glbl' atom if extradata is present but no specific method is known
bcoudurier
parents:
2802
diff
changeset
|
354 put_buffer(pb, track->vosData, track->vosLen); |
6bea49ef18b1
use generic 'glbl' atom if extradata is present but no specific method is known
bcoudurier
parents:
2802
diff
changeset
|
355 return 8+track->vosLen; |
6bea49ef18b1
use generic 'glbl' atom if extradata is present but no specific method is known
bcoudurier
parents:
2802
diff
changeset
|
356 } |
6bea49ef18b1
use generic 'glbl' atom if extradata is present but no specific method is known
bcoudurier
parents:
2802
diff
changeset
|
357 |
5388
5d5c1dc09223
support sample rates > INT16_MAX in mov using stsd v2
bcoudurier
parents:
5382
diff
changeset
|
358 /** |
5d5c1dc09223
support sample rates > INT16_MAX in mov using stsd v2
bcoudurier
parents:
5382
diff
changeset
|
359 * Compute flags for 'lpcm' tag. |
5d5c1dc09223
support sample rates > INT16_MAX in mov using stsd v2
bcoudurier
parents:
5382
diff
changeset
|
360 * See CoreAudioTypes and AudioStreamBasicDescription at Apple. |
5d5c1dc09223
support sample rates > INT16_MAX in mov using stsd v2
bcoudurier
parents:
5382
diff
changeset
|
361 */ |
5d5c1dc09223
support sample rates > INT16_MAX in mov using stsd v2
bcoudurier
parents:
5382
diff
changeset
|
362 static int mov_get_lpcm_flags(enum CodecID codec_id) |
5d5c1dc09223
support sample rates > INT16_MAX in mov using stsd v2
bcoudurier
parents:
5382
diff
changeset
|
363 { |
5d5c1dc09223
support sample rates > INT16_MAX in mov using stsd v2
bcoudurier
parents:
5382
diff
changeset
|
364 switch (codec_id) { |
5d5c1dc09223
support sample rates > INT16_MAX in mov using stsd v2
bcoudurier
parents:
5382
diff
changeset
|
365 case CODEC_ID_PCM_F32BE: |
5d5c1dc09223
support sample rates > INT16_MAX in mov using stsd v2
bcoudurier
parents:
5382
diff
changeset
|
366 case CODEC_ID_PCM_F64BE: |
5d5c1dc09223
support sample rates > INT16_MAX in mov using stsd v2
bcoudurier
parents:
5382
diff
changeset
|
367 return 11; |
5d5c1dc09223
support sample rates > INT16_MAX in mov using stsd v2
bcoudurier
parents:
5382
diff
changeset
|
368 case CODEC_ID_PCM_F32LE: |
5d5c1dc09223
support sample rates > INT16_MAX in mov using stsd v2
bcoudurier
parents:
5382
diff
changeset
|
369 case CODEC_ID_PCM_F64LE: |
5d5c1dc09223
support sample rates > INT16_MAX in mov using stsd v2
bcoudurier
parents:
5382
diff
changeset
|
370 return 9; |
5d5c1dc09223
support sample rates > INT16_MAX in mov using stsd v2
bcoudurier
parents:
5382
diff
changeset
|
371 case CODEC_ID_PCM_U8: |
5d5c1dc09223
support sample rates > INT16_MAX in mov using stsd v2
bcoudurier
parents:
5382
diff
changeset
|
372 return 10; |
5d5c1dc09223
support sample rates > INT16_MAX in mov using stsd v2
bcoudurier
parents:
5382
diff
changeset
|
373 case CODEC_ID_PCM_S16BE: |
5d5c1dc09223
support sample rates > INT16_MAX in mov using stsd v2
bcoudurier
parents:
5382
diff
changeset
|
374 case CODEC_ID_PCM_S24BE: |
5d5c1dc09223
support sample rates > INT16_MAX in mov using stsd v2
bcoudurier
parents:
5382
diff
changeset
|
375 case CODEC_ID_PCM_S32BE: |
5d5c1dc09223
support sample rates > INT16_MAX in mov using stsd v2
bcoudurier
parents:
5382
diff
changeset
|
376 return 14; |
5d5c1dc09223
support sample rates > INT16_MAX in mov using stsd v2
bcoudurier
parents:
5382
diff
changeset
|
377 case CODEC_ID_PCM_S8: |
5d5c1dc09223
support sample rates > INT16_MAX in mov using stsd v2
bcoudurier
parents:
5382
diff
changeset
|
378 case CODEC_ID_PCM_S16LE: |
5d5c1dc09223
support sample rates > INT16_MAX in mov using stsd v2
bcoudurier
parents:
5382
diff
changeset
|
379 case CODEC_ID_PCM_S24LE: |
5d5c1dc09223
support sample rates > INT16_MAX in mov using stsd v2
bcoudurier
parents:
5382
diff
changeset
|
380 case CODEC_ID_PCM_S32LE: |
5d5c1dc09223
support sample rates > INT16_MAX in mov using stsd v2
bcoudurier
parents:
5382
diff
changeset
|
381 return 12; |
5d5c1dc09223
support sample rates > INT16_MAX in mov using stsd v2
bcoudurier
parents:
5382
diff
changeset
|
382 default: |
5d5c1dc09223
support sample rates > INT16_MAX in mov using stsd v2
bcoudurier
parents:
5382
diff
changeset
|
383 return 0; |
5d5c1dc09223
support sample rates > INT16_MAX in mov using stsd v2
bcoudurier
parents:
5382
diff
changeset
|
384 } |
5d5c1dc09223
support sample rates > INT16_MAX in mov using stsd v2
bcoudurier
parents:
5382
diff
changeset
|
385 } |
5d5c1dc09223
support sample rates > INT16_MAX in mov using stsd v2
bcoudurier
parents:
5382
diff
changeset
|
386 |
3446 | 387 static int mov_write_audio_tag(ByteIOContext *pb, MOVTrack *track) |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
388 { |
3973
549a09cf23fe
Remove offset_t typedef and use int64_t directly instead.
diego
parents:
3909
diff
changeset
|
389 int64_t pos = url_ftell(pb); |
5388
5d5c1dc09223
support sample rates > INT16_MAX in mov using stsd v2
bcoudurier
parents:
5382
diff
changeset
|
390 int version = 0; |
5d5c1dc09223
support sample rates > INT16_MAX in mov using stsd v2
bcoudurier
parents:
5382
diff
changeset
|
391 uint32_t tag = track->tag; |
5d5c1dc09223
support sample rates > INT16_MAX in mov using stsd v2
bcoudurier
parents:
5382
diff
changeset
|
392 |
5d5c1dc09223
support sample rates > INT16_MAX in mov using stsd v2
bcoudurier
parents:
5382
diff
changeset
|
393 if (track->mode == MODE_MOV) { |
5d5c1dc09223
support sample rates > INT16_MAX in mov using stsd v2
bcoudurier
parents:
5382
diff
changeset
|
394 if (track->timescale > UINT16_MAX) { |
5d5c1dc09223
support sample rates > INT16_MAX in mov using stsd v2
bcoudurier
parents:
5382
diff
changeset
|
395 if (mov_get_lpcm_flags(track->enc->codec_id)) |
5d5c1dc09223
support sample rates > INT16_MAX in mov using stsd v2
bcoudurier
parents:
5382
diff
changeset
|
396 tag = AV_RL32("lpcm"); |
5d5c1dc09223
support sample rates > INT16_MAX in mov using stsd v2
bcoudurier
parents:
5382
diff
changeset
|
397 version = 2; |
5390 | 398 } else if (track->audio_vbr || mov_pcm_le_gt16(track->enc->codec_id)) { |
5388
5d5c1dc09223
support sample rates > INT16_MAX in mov using stsd v2
bcoudurier
parents:
5382
diff
changeset
|
399 version = 1; |
5d5c1dc09223
support sample rates > INT16_MAX in mov using stsd v2
bcoudurier
parents:
5382
diff
changeset
|
400 } |
5d5c1dc09223
support sample rates > INT16_MAX in mov using stsd v2
bcoudurier
parents:
5382
diff
changeset
|
401 } |
885 | 402 |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
403 put_be32(pb, 0); /* size */ |
5388
5d5c1dc09223
support sample rates > INT16_MAX in mov using stsd v2
bcoudurier
parents:
5382
diff
changeset
|
404 put_le32(pb, tag); // store it byteswapped |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
405 put_be32(pb, 0); /* Reserved */ |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
406 put_be16(pb, 0); /* Reserved */ |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
407 put_be16(pb, 1); /* Data-reference index, XXX == 1 */ |
365
4ae9fac22a5d
AAC support in mov, correct aspect ratio support and user data support patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
342
diff
changeset
|
408 |
298
0b2eed7b1210
movenc patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
286
diff
changeset
|
409 /* SoundDescription */ |
1082 | 410 put_be16(pb, version); /* Version */ |
298
0b2eed7b1210
movenc patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
286
diff
changeset
|
411 put_be16(pb, 0); /* Revision level */ |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
412 put_be32(pb, 0); /* Reserved */ |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
413 |
5388
5d5c1dc09223
support sample rates > INT16_MAX in mov using stsd v2
bcoudurier
parents:
5382
diff
changeset
|
414 if (version == 2) { |
5d5c1dc09223
support sample rates > INT16_MAX in mov using stsd v2
bcoudurier
parents:
5382
diff
changeset
|
415 put_be16(pb, 3); |
5d5c1dc09223
support sample rates > INT16_MAX in mov using stsd v2
bcoudurier
parents:
5382
diff
changeset
|
416 put_be16(pb, 16); |
5d5c1dc09223
support sample rates > INT16_MAX in mov using stsd v2
bcoudurier
parents:
5382
diff
changeset
|
417 put_be16(pb, 0xfffe); |
5d5c1dc09223
support sample rates > INT16_MAX in mov using stsd v2
bcoudurier
parents:
5382
diff
changeset
|
418 put_be16(pb, 0); |
5d5c1dc09223
support sample rates > INT16_MAX in mov using stsd v2
bcoudurier
parents:
5382
diff
changeset
|
419 put_be32(pb, 0x00010000); |
5d5c1dc09223
support sample rates > INT16_MAX in mov using stsd v2
bcoudurier
parents:
5382
diff
changeset
|
420 put_be32(pb, 72); |
5d5c1dc09223
support sample rates > INT16_MAX in mov using stsd v2
bcoudurier
parents:
5382
diff
changeset
|
421 put_be64(pb, av_dbl2int(track->timescale)); |
5d5c1dc09223
support sample rates > INT16_MAX in mov using stsd v2
bcoudurier
parents:
5382
diff
changeset
|
422 put_be32(pb, track->enc->channels); |
5d5c1dc09223
support sample rates > INT16_MAX in mov using stsd v2
bcoudurier
parents:
5382
diff
changeset
|
423 put_be32(pb, 0x7F000000); |
5d5c1dc09223
support sample rates > INT16_MAX in mov using stsd v2
bcoudurier
parents:
5382
diff
changeset
|
424 put_be32(pb, av_get_bits_per_sample(track->enc->codec_id)); |
5d5c1dc09223
support sample rates > INT16_MAX in mov using stsd v2
bcoudurier
parents:
5382
diff
changeset
|
425 put_be32(pb, mov_get_lpcm_flags(track->enc->codec_id)); |
5d5c1dc09223
support sample rates > INT16_MAX in mov using stsd v2
bcoudurier
parents:
5382
diff
changeset
|
426 put_be32(pb, track->sampleSize); |
5d5c1dc09223
support sample rates > INT16_MAX in mov using stsd v2
bcoudurier
parents:
5382
diff
changeset
|
427 put_be32(pb, track->enc->frame_size); |
5d5c1dc09223
support sample rates > INT16_MAX in mov using stsd v2
bcoudurier
parents:
5382
diff
changeset
|
428 } else { |
5389 | 429 if (track->mode == MODE_MOV) { |
430 put_be16(pb, track->enc->channels); | |
431 if (track->enc->codec_id == CODEC_ID_PCM_U8 || | |
432 track->enc->codec_id == CODEC_ID_PCM_S8) | |
433 put_be16(pb, 8); /* bits per sample */ | |
434 else | |
435 put_be16(pb, 16); | |
436 put_be16(pb, track->audio_vbr ? -2 : 0); /* compression ID */ | |
437 } else { /* reserved for mp4/3gp */ | |
438 put_be16(pb, 2); | |
1850 | 439 put_be16(pb, 16); |
5389 | 440 put_be16(pb, 0); |
441 } | |
505
e996e7da971c
AAC in mov/mp4 patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
494
diff
changeset
|
442 |
5389 | 443 put_be16(pb, 0); /* packet size (= 0) */ |
444 put_be16(pb, track->timescale); /* Time scale */ | |
445 put_be16(pb, 0); /* Reserved */ | |
5388
5d5c1dc09223
support sample rates > INT16_MAX in mov using stsd v2
bcoudurier
parents:
5382
diff
changeset
|
446 } |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
447 |
1147 | 448 if(version == 1) { /* SoundDescription V1 extended info */ |
449 put_be32(pb, track->enc->frame_size); /* Samples per packet */ | |
1150
c8edab114cc3
vbr requires version=1 and samplesize=0 per QT spec
michael
parents:
1147
diff
changeset
|
450 put_be32(pb, track->sampleSize / track->enc->channels); /* Bytes per packet */ |
1147 | 451 put_be32(pb, track->sampleSize); /* Bytes per frame */ |
1125 | 452 put_be32(pb, 2); /* Bytes per sample */ |
365
4ae9fac22a5d
AAC support in mov, correct aspect ratio support and user data support patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
342
diff
changeset
|
453 } |
4ae9fac22a5d
AAC support in mov, correct aspect ratio support and user data support patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
342
diff
changeset
|
454 |
1084 | 455 if(track->mode == MODE_MOV && |
456 (track->enc->codec_id == CODEC_ID_AAC || | |
3889
94ba4a17d03f
actually write dac3 atom, patch by Kurtnoise, kurtnoise at free dot fr
bcoudurier
parents:
3888
diff
changeset
|
457 track->enc->codec_id == CODEC_ID_AC3 || |
1084 | 458 track->enc->codec_id == CODEC_ID_AMR_NB || |
5390 | 459 track->enc->codec_id == CODEC_ID_ALAC || |
460 mov_pcm_le_gt16(track->enc->codec_id))) | |
1083 | 461 mov_write_wave_tag(pb, track); |
2977
b5ad3169a579
write esds atom when mpeg-4 systems tags are used
bcoudurier
parents:
2975
diff
changeset
|
462 else if(track->tag == MKTAG('m','p','4','a')) |
1083 | 463 mov_write_esds_tag(pb, track); |
464 else if(track->enc->codec_id == CODEC_ID_AMR_NB) | |
1152
c7cf3d1f9bd7
simplify and write correct values conforming to specs
bcoudurier
parents:
1151
diff
changeset
|
465 mov_write_amr_tag(pb, track); |
3889
94ba4a17d03f
actually write dac3 atom, patch by Kurtnoise, kurtnoise at free dot fr
bcoudurier
parents:
3888
diff
changeset
|
466 else if(track->enc->codec_id == CODEC_ID_AC3) |
94ba4a17d03f
actually write dac3 atom, patch by Kurtnoise, kurtnoise at free dot fr
bcoudurier
parents:
3888
diff
changeset
|
467 mov_write_ac3_tag(pb, track); |
3890 | 468 else if(track->enc->codec_id == CODEC_ID_ALAC) |
3453
3046c8e6ba4f
support alac in ipod m4a format, tested on quicktime
bcoudurier
parents:
3452
diff
changeset
|
469 mov_write_extradata_tag(pb, track); |
2838
6bea49ef18b1
use generic 'glbl' atom if extradata is present but no specific method is known
bcoudurier
parents:
2802
diff
changeset
|
470 else if(track->vosLen > 0) |
6bea49ef18b1
use generic 'glbl' atom if extradata is present but no specific method is known
bcoudurier
parents:
2802
diff
changeset
|
471 mov_write_glbl_tag(pb, track); |
1083 | 472 |
3455 | 473 return updateSize(pb, pos); |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
474 } |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
475 |
238
3519903c6c2a
mov/mp4 muxer cleanup (mostly cosmetics/simplifications & global header fix)
michaelni
parents:
202
diff
changeset
|
476 static int mov_write_d263_tag(ByteIOContext *pb) |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
477 { |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
478 put_be32(pb, 0xf); /* size */ |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
479 put_tag(pb, "d263"); |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
480 put_tag(pb, "FFMP"); |
1240 | 481 put_byte(pb, 0); /* decoder version */ |
482 /* FIXME use AVCodecContext level/profile, when encoder will set values */ | |
483 put_byte(pb, 0xa); /* level */ | |
484 put_byte(pb, 0); /* profile */ | |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
485 return 0xf; |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
486 } |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
487 |
259
e091218eccd2
mov/mp4/3gp muxer improvements patch by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
241
diff
changeset
|
488 /* TODO: No idea about these values */ |
e091218eccd2
mov/mp4/3gp muxer improvements patch by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
241
diff
changeset
|
489 static int mov_write_svq3_tag(ByteIOContext *pb) |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
490 { |
259
e091218eccd2
mov/mp4/3gp muxer improvements patch by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
241
diff
changeset
|
491 put_be32(pb, 0x15); |
e091218eccd2
mov/mp4/3gp muxer improvements patch by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
241
diff
changeset
|
492 put_tag(pb, "SMI "); |
e091218eccd2
mov/mp4/3gp muxer improvements patch by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
241
diff
changeset
|
493 put_tag(pb, "SEQH"); |
e091218eccd2
mov/mp4/3gp muxer improvements patch by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
241
diff
changeset
|
494 put_be32(pb, 0x5); |
e091218eccd2
mov/mp4/3gp muxer improvements patch by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
241
diff
changeset
|
495 put_be32(pb, 0xe2c0211d); |
e091218eccd2
mov/mp4/3gp muxer improvements patch by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
241
diff
changeset
|
496 put_be32(pb, 0xc0000000); |
885 | 497 put_byte(pb, 0); |
259
e091218eccd2
mov/mp4/3gp muxer improvements patch by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
241
diff
changeset
|
498 return 0x15; |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
499 } |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
500 |
2921 | 501 static int mov_write_avcc_tag(ByteIOContext *pb, MOVTrack *track) |
502 { | |
3973
549a09cf23fe
Remove offset_t typedef and use int64_t directly instead.
diego
parents:
3909
diff
changeset
|
503 int64_t pos = url_ftell(pb); |
2921 | 504 |
505 put_be32(pb, 0); | |
506 put_tag(pb, "avcC"); | |
2927
b75a49790f31
add a ff_ prefix to newly exported functions from avc.c
aurel
parents:
2922
diff
changeset
|
507 ff_isom_write_avcc(pb, track->vosData, track->vosLen); |
1006
15bfc3c063dc
do nal reformating when muxing H264, create avcc atom
bcoudurier
parents:
1000
diff
changeset
|
508 return updateSize(pb, pos); |
15bfc3c063dc
do nal reformating when muxing H264, create avcc atom
bcoudurier
parents:
1000
diff
changeset
|
509 } |
15bfc3c063dc
do nal reformating when muxing H264, create avcc atom
bcoudurier
parents:
1000
diff
changeset
|
510 |
2588 | 511 /* also used by all avid codecs (dv, imx, meridien) and their variants */ |
512 static int mov_write_avid_tag(ByteIOContext *pb, MOVTrack *track) | |
513 { | |
514 int i; | |
515 put_be32(pb, 24); /* size */ | |
516 put_tag(pb, "ACLR"); | |
517 put_tag(pb, "ACLR"); | |
518 put_tag(pb, "0001"); | |
519 put_be32(pb, 1); /* yuv 1 / rgb 2 ? */ | |
520 put_be32(pb, 0); /* unknown */ | |
521 | |
522 put_be32(pb, 24); /* size */ | |
523 put_tag(pb, "APRG"); | |
524 put_tag(pb, "APRG"); | |
525 put_tag(pb, "0001"); | |
526 put_be32(pb, 1); /* unknown */ | |
527 put_be32(pb, 0); /* unknown */ | |
528 | |
529 put_be32(pb, 120); /* size */ | |
530 put_tag(pb, "ARES"); | |
531 put_tag(pb, "ARES"); | |
532 put_tag(pb, "0001"); | |
533 put_be32(pb, AV_RB32(track->vosData + 0x28)); /* dnxhd cid, some id ? */ | |
534 put_be32(pb, track->enc->width); | |
535 /* values below are based on samples created with quicktime and avid codecs */ | |
536 if (track->vosData[5] & 2) { // interlaced | |
537 put_be32(pb, track->enc->height/2); | |
538 put_be32(pb, 2); /* unknown */ | |
539 put_be32(pb, 0); /* unknown */ | |
540 put_be32(pb, 4); /* unknown */ | |
541 } else { | |
542 put_be32(pb, track->enc->height); | |
543 put_be32(pb, 1); /* unknown */ | |
544 put_be32(pb, 0); /* unknown */ | |
2802 | 545 if (track->enc->height == 1080) |
546 put_be32(pb, 5); /* unknown */ | |
547 else | |
548 put_be32(pb, 6); /* unknown */ | |
2588 | 549 } |
550 /* padding */ | |
551 for (i = 0; i < 10; i++) | |
552 put_be64(pb, 0); | |
553 | |
554 /* extra padding for stsd needed */ | |
555 put_be32(pb, 0); | |
556 return 0; | |
557 } | |
558 | |
4824
ef55a8830c20
split mov_find_codec_tag in separate per format functions
bcoudurier
parents:
4819
diff
changeset
|
559 static int mp4_get_codec_tag(AVFormatContext *s, MOVTrack *track) |
1000 | 560 { |
1080 | 561 int tag = track->enc->codec_tag; |
4825 | 562 |
5058
33a244b7ca65
Add ff_ prefixes to exported symbols in libavformat/riff.h.
diego
parents:
4996
diff
changeset
|
563 if (!ff_codec_get_tag(ff_mp4_obj_type, track->enc->codec_id)) |
4825 | 564 return 0; |
565 | |
566 if (track->enc->codec_id == CODEC_ID_H264) tag = MKTAG('a','v','c','1'); | |
567 else if (track->enc->codec_id == CODEC_ID_AC3) tag = MKTAG('a','c','-','3'); | |
568 else if (track->enc->codec_id == CODEC_ID_DIRAC) tag = MKTAG('d','r','a','c'); | |
569 else if (track->enc->codec_id == CODEC_ID_MOV_TEXT) tag = MKTAG('t','x','3','g'); | |
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5792
diff
changeset
|
570 else if (track->enc->codec_type == AVMEDIA_TYPE_VIDEO) tag = MKTAG('m','p','4','v'); |
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5792
diff
changeset
|
571 else if (track->enc->codec_type == AVMEDIA_TYPE_AUDIO) tag = MKTAG('m','p','4','a'); |
4824
ef55a8830c20
split mov_find_codec_tag in separate per format functions
bcoudurier
parents:
4819
diff
changeset
|
572 |
ef55a8830c20
split mov_find_codec_tag in separate per format functions
bcoudurier
parents:
4819
diff
changeset
|
573 return tag; |
ef55a8830c20
split mov_find_codec_tag in separate per format functions
bcoudurier
parents:
4819
diff
changeset
|
574 } |
ef55a8830c20
split mov_find_codec_tag in separate per format functions
bcoudurier
parents:
4819
diff
changeset
|
575 |
4832 | 576 static const AVCodecTag codec_ipod_tags[] = { |
577 { CODEC_ID_H264, MKTAG('a','v','c','1') }, | |
578 { CODEC_ID_MPEG4, MKTAG('m','p','4','v') }, | |
579 { CODEC_ID_AAC, MKTAG('m','p','4','a') }, | |
580 { CODEC_ID_ALAC, MKTAG('a','l','a','c') }, | |
581 { CODEC_ID_AC3, MKTAG('a','c','-','3') }, | |
582 { CODEC_ID_MOV_TEXT, MKTAG('t','x','3','g') }, | |
583 { CODEC_ID_MOV_TEXT, MKTAG('t','e','x','t') }, | |
584 { CODEC_ID_NONE, 0 }, | |
585 }; | |
586 | |
4824
ef55a8830c20
split mov_find_codec_tag in separate per format functions
bcoudurier
parents:
4819
diff
changeset
|
587 static int ipod_get_codec_tag(AVFormatContext *s, MOVTrack *track) |
ef55a8830c20
split mov_find_codec_tag in separate per format functions
bcoudurier
parents:
4819
diff
changeset
|
588 { |
ef55a8830c20
split mov_find_codec_tag in separate per format functions
bcoudurier
parents:
4819
diff
changeset
|
589 int tag = track->enc->codec_tag; |
ef55a8830c20
split mov_find_codec_tag in separate per format functions
bcoudurier
parents:
4819
diff
changeset
|
590 |
4828 | 591 // keep original tag for subs, ipod supports both formats |
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5792
diff
changeset
|
592 if (!(track->enc->codec_type == AVMEDIA_TYPE_SUBTITLE && |
4825 | 593 (tag == MKTAG('t','x','3','g') || |
4829 | 594 tag == MKTAG('t','e','x','t')))) |
5058
33a244b7ca65
Add ff_ prefixes to exported symbols in libavformat/riff.h.
diego
parents:
4996
diff
changeset
|
595 tag = ff_codec_get_tag(codec_ipod_tags, track->enc->codec_id); |
4830
8fcb2c0d6362
cosmetics, add empty line and remove useless braces
bcoudurier
parents:
4829
diff
changeset
|
596 |
5556
c35e1d2373c7
Use av_match_ext() rather than the deprecated match_ext(), fix
stefano
parents:
5492
diff
changeset
|
597 if (!av_match_ext(s->filename, "m4a") && !av_match_ext(s->filename, "m4v")) |
4825 | 598 av_log(s, AV_LOG_WARNING, "Warning, extension is not .m4a nor .m4v " |
599 "Quicktime/Ipod might not play the file\n"); | |
4824
ef55a8830c20
split mov_find_codec_tag in separate per format functions
bcoudurier
parents:
4819
diff
changeset
|
600 |
ef55a8830c20
split mov_find_codec_tag in separate per format functions
bcoudurier
parents:
4819
diff
changeset
|
601 return tag; |
ef55a8830c20
split mov_find_codec_tag in separate per format functions
bcoudurier
parents:
4819
diff
changeset
|
602 } |
ef55a8830c20
split mov_find_codec_tag in separate per format functions
bcoudurier
parents:
4819
diff
changeset
|
603 |
ef55a8830c20
split mov_find_codec_tag in separate per format functions
bcoudurier
parents:
4819
diff
changeset
|
604 static int mov_get_dv_codec_tag(AVFormatContext *s, MOVTrack *track) |
ef55a8830c20
split mov_find_codec_tag in separate per format functions
bcoudurier
parents:
4819
diff
changeset
|
605 { |
ef55a8830c20
split mov_find_codec_tag in separate per format functions
bcoudurier
parents:
4819
diff
changeset
|
606 int tag; |
ef55a8830c20
split mov_find_codec_tag in separate per format functions
bcoudurier
parents:
4819
diff
changeset
|
607 |
4825 | 608 if (track->enc->height == 480) /* NTSC */ |
609 if (track->enc->pix_fmt == PIX_FMT_YUV422P) tag = MKTAG('d','v','5','n'); | |
610 else tag = MKTAG('d','v','c',' '); | |
611 else if (track->enc->pix_fmt == PIX_FMT_YUV422P) tag = MKTAG('d','v','5','p'); | |
612 else if (track->enc->pix_fmt == PIX_FMT_YUV420P) tag = MKTAG('d','v','c','p'); | |
613 else tag = MKTAG('d','v','p','p'); | |
4824
ef55a8830c20
split mov_find_codec_tag in separate per format functions
bcoudurier
parents:
4819
diff
changeset
|
614 |
ef55a8830c20
split mov_find_codec_tag in separate per format functions
bcoudurier
parents:
4819
diff
changeset
|
615 return tag; |
ef55a8830c20
split mov_find_codec_tag in separate per format functions
bcoudurier
parents:
4819
diff
changeset
|
616 } |
ef55a8830c20
split mov_find_codec_tag in separate per format functions
bcoudurier
parents:
4819
diff
changeset
|
617 |
4832 | 618 static const struct { |
619 enum PixelFormat pix_fmt; | |
620 uint32_t tag; | |
621 unsigned bps; | |
622 } mov_pix_fmt_tags[] = { | |
623 { PIX_FMT_YUYV422, MKTAG('y','u','v','s'), 0 }, | |
624 { PIX_FMT_UYVY422, MKTAG('2','v','u','y'), 0 }, | |
625 { PIX_FMT_BGR555, MKTAG('r','a','w',' '), 16 }, | |
4920
7d8344d28ab9
rgb555le, rgb565le, rgb565be, bgr24 in .mov muxing
bcoudurier
parents:
4919
diff
changeset
|
626 { PIX_FMT_RGB555LE,MKTAG('L','5','5','5'), 16 }, |
7d8344d28ab9
rgb555le, rgb565le, rgb565be, bgr24 in .mov muxing
bcoudurier
parents:
4919
diff
changeset
|
627 { PIX_FMT_RGB565LE,MKTAG('L','5','6','5'), 16 }, |
7d8344d28ab9
rgb555le, rgb565le, rgb565be, bgr24 in .mov muxing
bcoudurier
parents:
4919
diff
changeset
|
628 { PIX_FMT_RGB565BE,MKTAG('B','5','6','5'), 16 }, |
4832 | 629 { PIX_FMT_RGB24, MKTAG('r','a','w',' '), 24 }, |
4920
7d8344d28ab9
rgb555le, rgb565le, rgb565be, bgr24 in .mov muxing
bcoudurier
parents:
4919
diff
changeset
|
630 { PIX_FMT_BGR24, MKTAG('2','4','B','G'), 24 }, |
4918 | 631 { PIX_FMT_ARGB, MKTAG('r','a','w',' '), 32 }, |
4919 | 632 { PIX_FMT_BGRA, MKTAG('B','G','R','A'), 32 }, |
4917 | 633 { PIX_FMT_RGBA, MKTAG('R','G','B','A'), 32 }, |
4832 | 634 }; |
635 | |
4824
ef55a8830c20
split mov_find_codec_tag in separate per format functions
bcoudurier
parents:
4819
diff
changeset
|
636 static int mov_get_rawvideo_codec_tag(AVFormatContext *s, MOVTrack *track) |
ef55a8830c20
split mov_find_codec_tag in separate per format functions
bcoudurier
parents:
4819
diff
changeset
|
637 { |
ef55a8830c20
split mov_find_codec_tag in separate per format functions
bcoudurier
parents:
4819
diff
changeset
|
638 int tag = track->enc->codec_tag; |
4825 | 639 int i; |
640 | |
641 for (i = 0; i < FF_ARRAY_ELEMS(mov_pix_fmt_tags); i++) { | |
642 if (track->enc->pix_fmt == mov_pix_fmt_tags[i].pix_fmt) { | |
643 tag = mov_pix_fmt_tags[i].tag; | |
644 track->enc->bits_per_coded_sample = mov_pix_fmt_tags[i].bps; | |
645 break; | |
646 } | |
647 } | |
4824
ef55a8830c20
split mov_find_codec_tag in separate per format functions
bcoudurier
parents:
4819
diff
changeset
|
648 |
ef55a8830c20
split mov_find_codec_tag in separate per format functions
bcoudurier
parents:
4819
diff
changeset
|
649 return tag; |
ef55a8830c20
split mov_find_codec_tag in separate per format functions
bcoudurier
parents:
4819
diff
changeset
|
650 } |
ef55a8830c20
split mov_find_codec_tag in separate per format functions
bcoudurier
parents:
4819
diff
changeset
|
651 |
ef55a8830c20
split mov_find_codec_tag in separate per format functions
bcoudurier
parents:
4819
diff
changeset
|
652 static int mov_get_codec_tag(AVFormatContext *s, MOVTrack *track) |
ef55a8830c20
split mov_find_codec_tag in separate per format functions
bcoudurier
parents:
4819
diff
changeset
|
653 { |
ef55a8830c20
split mov_find_codec_tag in separate per format functions
bcoudurier
parents:
4819
diff
changeset
|
654 int tag = track->enc->codec_tag; |
ef55a8830c20
split mov_find_codec_tag in separate per format functions
bcoudurier
parents:
4819
diff
changeset
|
655 |
ef55a8830c20
split mov_find_codec_tag in separate per format functions
bcoudurier
parents:
4819
diff
changeset
|
656 if (!tag || (track->enc->strict_std_compliance >= FF_COMPLIANCE_NORMAL && |
ef55a8830c20
split mov_find_codec_tag in separate per format functions
bcoudurier
parents:
4819
diff
changeset
|
657 (tag == MKTAG('d','v','c','p') || |
ef55a8830c20
split mov_find_codec_tag in separate per format functions
bcoudurier
parents:
4819
diff
changeset
|
658 track->enc->codec_id == CODEC_ID_RAWVIDEO || |
ef55a8830c20
split mov_find_codec_tag in separate per format functions
bcoudurier
parents:
4819
diff
changeset
|
659 av_get_bits_per_sample(track->enc->codec_id)))) { // pcm audio |
4830
8fcb2c0d6362
cosmetics, add empty line and remove useless braces
bcoudurier
parents:
4829
diff
changeset
|
660 if (track->enc->codec_id == CODEC_ID_DVVIDEO) |
4824
ef55a8830c20
split mov_find_codec_tag in separate per format functions
bcoudurier
parents:
4819
diff
changeset
|
661 tag = mov_get_dv_codec_tag(s, track); |
4830
8fcb2c0d6362
cosmetics, add empty line and remove useless braces
bcoudurier
parents:
4829
diff
changeset
|
662 else if (track->enc->codec_id == CODEC_ID_RAWVIDEO) |
4824
ef55a8830c20
split mov_find_codec_tag in separate per format functions
bcoudurier
parents:
4819
diff
changeset
|
663 tag = mov_get_rawvideo_codec_tag(s, track); |
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5792
diff
changeset
|
664 else if (track->enc->codec_type == AVMEDIA_TYPE_VIDEO) { |
5058
33a244b7ca65
Add ff_ prefixes to exported symbols in libavformat/riff.h.
diego
parents:
4996
diff
changeset
|
665 tag = ff_codec_get_tag(codec_movvideo_tags, track->enc->codec_id); |
4831 | 666 if (!tag) { // if no mac fcc found, try with Microsoft tags |
5058
33a244b7ca65
Add ff_ prefixes to exported symbols in libavformat/riff.h.
diego
parents:
4996
diff
changeset
|
667 tag = ff_codec_get_tag(ff_codec_bmp_tags, track->enc->codec_id); |
4831 | 668 if (tag) |
669 av_log(s, AV_LOG_INFO, "Warning, using MS style video codec tag, " | |
670 "the file may be unplayable!\n"); | |
671 } | |
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5792
diff
changeset
|
672 } else if (track->enc->codec_type == AVMEDIA_TYPE_AUDIO) { |
5058
33a244b7ca65
Add ff_ prefixes to exported symbols in libavformat/riff.h.
diego
parents:
4996
diff
changeset
|
673 tag = ff_codec_get_tag(codec_movaudio_tags, track->enc->codec_id); |
4831 | 674 if (!tag) { // if no mac fcc found, try with Microsoft tags |
5058
33a244b7ca65
Add ff_ prefixes to exported symbols in libavformat/riff.h.
diego
parents:
4996
diff
changeset
|
675 int ms_tag = ff_codec_get_tag(ff_codec_wav_tags, track->enc->codec_id); |
4831 | 676 if (ms_tag) { |
677 tag = MKTAG('m', 's', ((ms_tag >> 8) & 0xff), (ms_tag & 0xff)); | |
678 av_log(s, AV_LOG_INFO, "Warning, using MS style audio codec tag, " | |
679 "the file may be unplayable!\n"); | |
2979 | 680 } |
4831 | 681 } |
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5792
diff
changeset
|
682 } else if (track->enc->codec_type == AVMEDIA_TYPE_SUBTITLE) |
5058
33a244b7ca65
Add ff_ prefixes to exported symbols in libavformat/riff.h.
diego
parents:
4996
diff
changeset
|
683 tag = ff_codec_get_tag(ff_codec_movsubtitle_tags, track->enc->codec_id); |
2978
8dcdecbbf7e6
correctly and only set standard stsd fourcc for mp4/3gp
bcoudurier
parents:
2977
diff
changeset
|
684 } |
4825 | 685 |
1000 | 686 return tag; |
687 } | |
688 | |
4832 | 689 static const AVCodecTag codec_3gp_tags[] = { |
690 { CODEC_ID_H263, MKTAG('s','2','6','3') }, | |
691 { CODEC_ID_H264, MKTAG('a','v','c','1') }, | |
692 { CODEC_ID_MPEG4, MKTAG('m','p','4','v') }, | |
693 { CODEC_ID_AAC, MKTAG('m','p','4','a') }, | |
694 { CODEC_ID_AMR_NB, MKTAG('s','a','m','r') }, | |
695 { CODEC_ID_AMR_WB, MKTAG('s','a','w','b') }, | |
696 { CODEC_ID_MOV_TEXT, MKTAG('t','x','3','g') }, | |
697 { CODEC_ID_NONE, 0 }, | |
698 }; | |
699 | |
4824
ef55a8830c20
split mov_find_codec_tag in separate per format functions
bcoudurier
parents:
4819
diff
changeset
|
700 static int mov_find_codec_tag(AVFormatContext *s, MOVTrack *track) |
ef55a8830c20
split mov_find_codec_tag in separate per format functions
bcoudurier
parents:
4819
diff
changeset
|
701 { |
ef55a8830c20
split mov_find_codec_tag in separate per format functions
bcoudurier
parents:
4819
diff
changeset
|
702 int tag = track->enc->codec_tag; |
ef55a8830c20
split mov_find_codec_tag in separate per format functions
bcoudurier
parents:
4819
diff
changeset
|
703 |
ef55a8830c20
split mov_find_codec_tag in separate per format functions
bcoudurier
parents:
4819
diff
changeset
|
704 if (track->mode == MODE_MP4 || track->mode == MODE_PSP) |
ef55a8830c20
split mov_find_codec_tag in separate per format functions
bcoudurier
parents:
4819
diff
changeset
|
705 tag = mp4_get_codec_tag(s, track); |
ef55a8830c20
split mov_find_codec_tag in separate per format functions
bcoudurier
parents:
4819
diff
changeset
|
706 else if (track->mode == MODE_IPOD) |
ef55a8830c20
split mov_find_codec_tag in separate per format functions
bcoudurier
parents:
4819
diff
changeset
|
707 tag = ipod_get_codec_tag(s, track); |
ef55a8830c20
split mov_find_codec_tag in separate per format functions
bcoudurier
parents:
4819
diff
changeset
|
708 else if (track->mode & MODE_3GP) |
5058
33a244b7ca65
Add ff_ prefixes to exported symbols in libavformat/riff.h.
diego
parents:
4996
diff
changeset
|
709 tag = ff_codec_get_tag(codec_3gp_tags, track->enc->codec_id); |
4824
ef55a8830c20
split mov_find_codec_tag in separate per format functions
bcoudurier
parents:
4819
diff
changeset
|
710 else |
ef55a8830c20
split mov_find_codec_tag in separate per format functions
bcoudurier
parents:
4819
diff
changeset
|
711 tag = mov_get_codec_tag(s, track); |
ef55a8830c20
split mov_find_codec_tag in separate per format functions
bcoudurier
parents:
4819
diff
changeset
|
712 |
ef55a8830c20
split mov_find_codec_tag in separate per format functions
bcoudurier
parents:
4819
diff
changeset
|
713 return tag; |
ef55a8830c20
split mov_find_codec_tag in separate per format functions
bcoudurier
parents:
4819
diff
changeset
|
714 } |
ef55a8830c20
split mov_find_codec_tag in separate per format functions
bcoudurier
parents:
4819
diff
changeset
|
715 |
3143 | 716 /** Write uuid atom. |
717 * Needed to make file play in iPods running newest firmware | |
718 * goes after avcC atom in moov.trak.mdia.minf.stbl.stsd.avc1 | |
719 */ | |
720 static int mov_write_uuid_tag_ipod(ByteIOContext *pb) | |
721 { | |
722 put_be32(pb, 28); | |
723 put_tag(pb, "uuid"); | |
724 put_be32(pb, 0x6b6840f2); | |
725 put_be32(pb, 0x5f244fc5); | |
726 put_be32(pb, 0xba39a51b); | |
727 put_be32(pb, 0xcf0323f3); | |
728 put_be32(pb, 0x0); | |
729 return 28; | |
730 } | |
731 | |
4193
2d3be324c648
Add support for muxing mov/mp4/3gp timed text streams
conrad
parents:
4079
diff
changeset
|
732 static int mov_write_subtitle_tag(ByteIOContext *pb, MOVTrack *track) |
2d3be324c648
Add support for muxing mov/mp4/3gp timed text streams
conrad
parents:
4079
diff
changeset
|
733 { |
2d3be324c648
Add support for muxing mov/mp4/3gp timed text streams
conrad
parents:
4079
diff
changeset
|
734 int64_t pos = url_ftell(pb); |
2d3be324c648
Add support for muxing mov/mp4/3gp timed text streams
conrad
parents:
4079
diff
changeset
|
735 put_be32(pb, 0); /* size */ |
2d3be324c648
Add support for muxing mov/mp4/3gp timed text streams
conrad
parents:
4079
diff
changeset
|
736 put_le32(pb, track->tag); // store it byteswapped |
2d3be324c648
Add support for muxing mov/mp4/3gp timed text streams
conrad
parents:
4079
diff
changeset
|
737 put_be32(pb, 0); /* Reserved */ |
2d3be324c648
Add support for muxing mov/mp4/3gp timed text streams
conrad
parents:
4079
diff
changeset
|
738 put_be16(pb, 0); /* Reserved */ |
2d3be324c648
Add support for muxing mov/mp4/3gp timed text streams
conrad
parents:
4079
diff
changeset
|
739 put_be16(pb, 1); /* Data-reference index */ |
2d3be324c648
Add support for muxing mov/mp4/3gp timed text streams
conrad
parents:
4079
diff
changeset
|
740 |
2d3be324c648
Add support for muxing mov/mp4/3gp timed text streams
conrad
parents:
4079
diff
changeset
|
741 if (track->enc->extradata_size) |
2d3be324c648
Add support for muxing mov/mp4/3gp timed text streams
conrad
parents:
4079
diff
changeset
|
742 put_buffer(pb, track->enc->extradata, track->enc->extradata_size); |
2d3be324c648
Add support for muxing mov/mp4/3gp timed text streams
conrad
parents:
4079
diff
changeset
|
743 |
2d3be324c648
Add support for muxing mov/mp4/3gp timed text streams
conrad
parents:
4079
diff
changeset
|
744 return updateSize(pb, pos); |
2d3be324c648
Add support for muxing mov/mp4/3gp timed text streams
conrad
parents:
4079
diff
changeset
|
745 } |
2d3be324c648
Add support for muxing mov/mp4/3gp timed text streams
conrad
parents:
4079
diff
changeset
|
746 |
3446 | 747 static int mov_write_video_tag(ByteIOContext *pb, MOVTrack *track) |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
748 { |
3973
549a09cf23fe
Remove offset_t typedef and use int64_t directly instead.
diego
parents:
3909
diff
changeset
|
749 int64_t pos = url_ftell(pb); |
657
5b9575f5b6e8
mov header field and compressor name patch by Roine Gustafsson <roine AT users DOT sourceforge DOT net>
mmu_man
parents:
619
diff
changeset
|
750 char compressor_name[32]; |
422 | 751 |
259
e091218eccd2
mov/mp4/3gp muxer improvements patch by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
241
diff
changeset
|
752 put_be32(pb, 0); /* size */ |
1080 | 753 put_le32(pb, track->tag); // store it byteswapped |
259
e091218eccd2
mov/mp4/3gp muxer improvements patch by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
241
diff
changeset
|
754 put_be32(pb, 0); /* Reserved */ |
e091218eccd2
mov/mp4/3gp muxer improvements patch by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
241
diff
changeset
|
755 put_be16(pb, 0); /* Reserved */ |
e091218eccd2
mov/mp4/3gp muxer improvements patch by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
241
diff
changeset
|
756 put_be16(pb, 1); /* Data-reference index */ |
e091218eccd2
mov/mp4/3gp muxer improvements patch by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
241
diff
changeset
|
757 |
657
5b9575f5b6e8
mov header field and compressor name patch by Roine Gustafsson <roine AT users DOT sourceforge DOT net>
mmu_man
parents:
619
diff
changeset
|
758 put_be16(pb, 0); /* Codec stream version */ |
5b9575f5b6e8
mov header field and compressor name patch by Roine Gustafsson <roine AT users DOT sourceforge DOT net>
mmu_man
parents:
619
diff
changeset
|
759 put_be16(pb, 0); /* Codec stream revision (=0) */ |
1238 | 760 if (track->mode == MODE_MOV) { |
1239 | 761 put_tag(pb, "FFMP"); /* Vendor */ |
762 if(track->enc->codec_id == CODEC_ID_RAWVIDEO) { | |
763 put_be32(pb, 0); /* Temporal Quality */ | |
764 put_be32(pb, 0x400); /* Spatial Quality = lossless*/ | |
765 } else { | |
766 put_be32(pb, 0x200); /* Temporal Quality = normal */ | |
767 put_be32(pb, 0x200); /* Spatial Quality = normal */ | |
768 } | |
1238 | 769 } else { |
770 put_be32(pb, 0); /* Reserved */ | |
771 put_be32(pb, 0); /* Reserved */ | |
772 put_be32(pb, 0); /* Reserved */ | |
773 } | |
259
e091218eccd2
mov/mp4/3gp muxer improvements patch by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
241
diff
changeset
|
774 put_be16(pb, track->enc->width); /* Video width */ |
4463
0cd7acf426f3
write active picture height for d-10/imx in mov
bcoudurier
parents:
4251
diff
changeset
|
775 put_be16(pb, track->height); /* Video height */ |
657
5b9575f5b6e8
mov header field and compressor name patch by Roine Gustafsson <roine AT users DOT sourceforge DOT net>
mmu_man
parents:
619
diff
changeset
|
776 put_be32(pb, 0x00480000); /* Horizontal resolution 72dpi */ |
5b9575f5b6e8
mov header field and compressor name patch by Roine Gustafsson <roine AT users DOT sourceforge DOT net>
mmu_man
parents:
619
diff
changeset
|
777 put_be32(pb, 0x00480000); /* Vertical resolution 72dpi */ |
399
6ab5454567b6
* making .mov files generated by ffmpeg compatible with Apple software.
romansh
parents:
397
diff
changeset
|
778 put_be32(pb, 0); /* Data size (= 0) */ |
6ab5454567b6
* making .mov files generated by ffmpeg compatible with Apple software.
romansh
parents:
397
diff
changeset
|
779 put_be16(pb, 1); /* Frame count (= 1) */ |
885 | 780 |
657
5b9575f5b6e8
mov header field and compressor name patch by Roine Gustafsson <roine AT users DOT sourceforge DOT net>
mmu_man
parents:
619
diff
changeset
|
781 memset(compressor_name,0,32); |
1238 | 782 /* FIXME not sure, ISO 14496-1 draft where it shall be set to 0 */ |
783 if (track->mode == MODE_MOV && track->enc->codec && track->enc->codec->name) | |
657
5b9575f5b6e8
mov header field and compressor name patch by Roine Gustafsson <roine AT users DOT sourceforge DOT net>
mmu_man
parents:
619
diff
changeset
|
784 strncpy(compressor_name,track->enc->codec->name,31); |
664
76d0af843707
don't crash on null codec; by matthieu castet <castet DOT matthieu AT free DOT fr>
mmu_man
parents:
663
diff
changeset
|
785 put_byte(pb, strlen(compressor_name)); |
657
5b9575f5b6e8
mov header field and compressor name patch by Roine Gustafsson <roine AT users DOT sourceforge DOT net>
mmu_man
parents:
619
diff
changeset
|
786 put_buffer(pb, compressor_name, 31); |
885 | 787 |
3908
1d3d17de20ba
Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents:
3907
diff
changeset
|
788 if (track->mode == MODE_MOV && track->enc->bits_per_coded_sample) |
1d3d17de20ba
Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents:
3907
diff
changeset
|
789 put_be16(pb, track->enc->bits_per_coded_sample); |
2992 | 790 else |
791 put_be16(pb, 0x18); /* Reserved */ | |
259
e091218eccd2
mov/mp4/3gp muxer improvements patch by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
241
diff
changeset
|
792 put_be16(pb, 0xffff); /* Reserved */ |
2977
b5ad3169a579
write esds atom when mpeg-4 systems tags are used
bcoudurier
parents:
2975
diff
changeset
|
793 if(track->tag == MKTAG('m','p','4','v')) |
259
e091218eccd2
mov/mp4/3gp muxer improvements patch by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
241
diff
changeset
|
794 mov_write_esds_tag(pb, track); |
e091218eccd2
mov/mp4/3gp muxer improvements patch by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
241
diff
changeset
|
795 else if(track->enc->codec_id == CODEC_ID_H263) |
e091218eccd2
mov/mp4/3gp muxer improvements patch by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
241
diff
changeset
|
796 mov_write_d263_tag(pb); |
e091218eccd2
mov/mp4/3gp muxer improvements patch by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
241
diff
changeset
|
797 else if(track->enc->codec_id == CODEC_ID_SVQ3) |
885 | 798 mov_write_svq3_tag(pb); |
3158 | 799 else if(track->enc->codec_id == CODEC_ID_DNXHD) |
800 mov_write_avid_tag(pb, track); | |
3143 | 801 else if(track->enc->codec_id == CODEC_ID_H264) { |
1006
15bfc3c063dc
do nal reformating when muxing H264, create avcc atom
bcoudurier
parents:
1000
diff
changeset
|
802 mov_write_avcc_tag(pb, track); |
3143 | 803 if(track->mode == MODE_IPOD) |
804 mov_write_uuid_tag_ipod(pb); | |
3203 | 805 } else if(track->vosLen > 0) |
2838
6bea49ef18b1
use generic 'glbl' atom if extradata is present but no specific method is known
bcoudurier
parents:
2802
diff
changeset
|
806 mov_write_glbl_tag(pb, track); |
259
e091218eccd2
mov/mp4/3gp muxer improvements patch by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
241
diff
changeset
|
807 |
3455 | 808 return updateSize(pb, pos); |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
809 } |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
810 |
6013
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
811 static int mov_write_rtp_tag(ByteIOContext *pb, MOVTrack *track) |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
812 { |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
813 int64_t pos = url_ftell(pb); |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
814 put_be32(pb, 0); /* size */ |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
815 put_tag(pb, "rtp "); |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
816 put_be32(pb, 0); /* Reserved */ |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
817 put_be16(pb, 0); /* Reserved */ |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
818 put_be16(pb, 1); /* Data-reference index */ |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
819 |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
820 put_be16(pb, 1); /* Hint track version */ |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
821 put_be16(pb, 1); /* Highest compatible version */ |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
822 put_be32(pb, track->max_packet_size); /* Max packet size */ |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
823 |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
824 put_be32(pb, 12); /* size */ |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
825 put_tag(pb, "tims"); |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
826 put_be32(pb, track->timescale); |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
827 |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
828 return updateSize(pb, pos); |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
829 } |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
830 |
3446 | 831 static int mov_write_stsd_tag(ByteIOContext *pb, MOVTrack *track) |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
832 { |
3973
549a09cf23fe
Remove offset_t typedef and use int64_t directly instead.
diego
parents:
3909
diff
changeset
|
833 int64_t pos = url_ftell(pb); |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
834 put_be32(pb, 0); /* size */ |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
835 put_tag(pb, "stsd"); |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
836 put_be32(pb, 0); /* version & flags */ |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
837 put_be32(pb, 1); /* entry count */ |
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5792
diff
changeset
|
838 if (track->enc->codec_type == AVMEDIA_TYPE_VIDEO) |
259
e091218eccd2
mov/mp4/3gp muxer improvements patch by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
241
diff
changeset
|
839 mov_write_video_tag(pb, track); |
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5792
diff
changeset
|
840 else if (track->enc->codec_type == AVMEDIA_TYPE_AUDIO) |
259
e091218eccd2
mov/mp4/3gp muxer improvements patch by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
241
diff
changeset
|
841 mov_write_audio_tag(pb, track); |
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5792
diff
changeset
|
842 else if (track->enc->codec_type == AVMEDIA_TYPE_SUBTITLE) |
4193
2d3be324c648
Add support for muxing mov/mp4/3gp timed text streams
conrad
parents:
4079
diff
changeset
|
843 mov_write_subtitle_tag(pb, track); |
6013
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
844 else if (track->enc->codec_tag == MKTAG('r','t','p',' ')) |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
845 mov_write_rtp_tag(pb, track); |
238
3519903c6c2a
mov/mp4 muxer cleanup (mostly cosmetics/simplifications & global header fix)
michaelni
parents:
202
diff
changeset
|
846 return updateSize(pb, pos); |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
847 } |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
848 |
3446 | 849 static int mov_write_ctts_tag(ByteIOContext *pb, MOVTrack *track) |
971
43f85eba04c4
CTTS support patch by (Baptiste COUDURIER <baptiste.coudurier smartjog com>)
michael
parents:
943
diff
changeset
|
850 { |
4079 | 851 MOVStts *ctts_entries; |
971
43f85eba04c4
CTTS support patch by (Baptiste COUDURIER <baptiste.coudurier smartjog com>)
michael
parents:
943
diff
changeset
|
852 uint32_t entries = 0; |
43f85eba04c4
CTTS support patch by (Baptiste COUDURIER <baptiste.coudurier smartjog com>)
michael
parents:
943
diff
changeset
|
853 uint32_t atom_size; |
43f85eba04c4
CTTS support patch by (Baptiste COUDURIER <baptiste.coudurier smartjog com>)
michael
parents:
943
diff
changeset
|
854 int i; |
43f85eba04c4
CTTS support patch by (Baptiste COUDURIER <baptiste.coudurier smartjog com>)
michael
parents:
943
diff
changeset
|
855 |
43f85eba04c4
CTTS support patch by (Baptiste COUDURIER <baptiste.coudurier smartjog com>)
michael
parents:
943
diff
changeset
|
856 ctts_entries = av_malloc((track->entry + 1) * sizeof(*ctts_entries)); /* worst case */ |
43f85eba04c4
CTTS support patch by (Baptiste COUDURIER <baptiste.coudurier smartjog com>)
michael
parents:
943
diff
changeset
|
857 ctts_entries[0].count = 1; |
1129 | 858 ctts_entries[0].duration = track->cluster[0].cts; |
971
43f85eba04c4
CTTS support patch by (Baptiste COUDURIER <baptiste.coudurier smartjog com>)
michael
parents:
943
diff
changeset
|
859 for (i=1; i<track->entry; i++) { |
1129 | 860 if (track->cluster[i].cts == ctts_entries[entries].duration) { |
971
43f85eba04c4
CTTS support patch by (Baptiste COUDURIER <baptiste.coudurier smartjog com>)
michael
parents:
943
diff
changeset
|
861 ctts_entries[entries].count++; /* compress */ |
43f85eba04c4
CTTS support patch by (Baptiste COUDURIER <baptiste.coudurier smartjog com>)
michael
parents:
943
diff
changeset
|
862 } else { |
43f85eba04c4
CTTS support patch by (Baptiste COUDURIER <baptiste.coudurier smartjog com>)
michael
parents:
943
diff
changeset
|
863 entries++; |
1129 | 864 ctts_entries[entries].duration = track->cluster[i].cts; |
971
43f85eba04c4
CTTS support patch by (Baptiste COUDURIER <baptiste.coudurier smartjog com>)
michael
parents:
943
diff
changeset
|
865 ctts_entries[entries].count = 1; |
43f85eba04c4
CTTS support patch by (Baptiste COUDURIER <baptiste.coudurier smartjog com>)
michael
parents:
943
diff
changeset
|
866 } |
43f85eba04c4
CTTS support patch by (Baptiste COUDURIER <baptiste.coudurier smartjog com>)
michael
parents:
943
diff
changeset
|
867 } |
43f85eba04c4
CTTS support patch by (Baptiste COUDURIER <baptiste.coudurier smartjog com>)
michael
parents:
943
diff
changeset
|
868 entries++; /* last one */ |
43f85eba04c4
CTTS support patch by (Baptiste COUDURIER <baptiste.coudurier smartjog com>)
michael
parents:
943
diff
changeset
|
869 atom_size = 16 + (entries * 8); |
43f85eba04c4
CTTS support patch by (Baptiste COUDURIER <baptiste.coudurier smartjog com>)
michael
parents:
943
diff
changeset
|
870 put_be32(pb, atom_size); /* size */ |
43f85eba04c4
CTTS support patch by (Baptiste COUDURIER <baptiste.coudurier smartjog com>)
michael
parents:
943
diff
changeset
|
871 put_tag(pb, "ctts"); |
43f85eba04c4
CTTS support patch by (Baptiste COUDURIER <baptiste.coudurier smartjog com>)
michael
parents:
943
diff
changeset
|
872 put_be32(pb, 0); /* version & flags */ |
43f85eba04c4
CTTS support patch by (Baptiste COUDURIER <baptiste.coudurier smartjog com>)
michael
parents:
943
diff
changeset
|
873 put_be32(pb, entries); /* entry count */ |
43f85eba04c4
CTTS support patch by (Baptiste COUDURIER <baptiste.coudurier smartjog com>)
michael
parents:
943
diff
changeset
|
874 for (i=0; i<entries; i++) { |
43f85eba04c4
CTTS support patch by (Baptiste COUDURIER <baptiste.coudurier smartjog com>)
michael
parents:
943
diff
changeset
|
875 put_be32(pb, ctts_entries[i].count); |
43f85eba04c4
CTTS support patch by (Baptiste COUDURIER <baptiste.coudurier smartjog com>)
michael
parents:
943
diff
changeset
|
876 put_be32(pb, ctts_entries[i].duration); |
43f85eba04c4
CTTS support patch by (Baptiste COUDURIER <baptiste.coudurier smartjog com>)
michael
parents:
943
diff
changeset
|
877 } |
43f85eba04c4
CTTS support patch by (Baptiste COUDURIER <baptiste.coudurier smartjog com>)
michael
parents:
943
diff
changeset
|
878 av_free(ctts_entries); |
43f85eba04c4
CTTS support patch by (Baptiste COUDURIER <baptiste.coudurier smartjog com>)
michael
parents:
943
diff
changeset
|
879 return atom_size; |
43f85eba04c4
CTTS support patch by (Baptiste COUDURIER <baptiste.coudurier smartjog com>)
michael
parents:
943
diff
changeset
|
880 } |
43f85eba04c4
CTTS support patch by (Baptiste COUDURIER <baptiste.coudurier smartjog com>)
michael
parents:
943
diff
changeset
|
881 |
298
0b2eed7b1210
movenc patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
286
diff
changeset
|
882 /* Time to sample atom */ |
3446 | 883 static int mov_write_stts_tag(ByteIOContext *pb, MOVTrack *track) |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
884 { |
4079 | 885 MOVStts *stts_entries; |
1437 | 886 uint32_t entries = -1; |
887 uint32_t atom_size; | |
888 int i; | |
889 | |
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5792
diff
changeset
|
890 if (track->enc->codec_type == AVMEDIA_TYPE_AUDIO && !track->audio_vbr) { |
1437 | 891 stts_entries = av_malloc(sizeof(*stts_entries)); /* one entry */ |
892 stts_entries[0].count = track->sampleCount; | |
893 stts_entries[0].duration = 1; | |
894 entries = 1; | |
895 } else { | |
896 stts_entries = av_malloc(track->entry * sizeof(*stts_entries)); /* worst case */ | |
897 for (i=0; i<track->entry; i++) { | |
898 int64_t duration = i + 1 == track->entry ? | |
899 track->trackDuration - track->cluster[i].dts + track->cluster[0].dts : /* readjusting */ | |
900 track->cluster[i+1].dts - track->cluster[i].dts; | |
901 if (i && duration == stts_entries[entries].duration) { | |
902 stts_entries[entries].count++; /* compress */ | |
903 } else { | |
904 entries++; | |
905 stts_entries[entries].duration = duration; | |
906 stts_entries[entries].count = 1; | |
907 } | |
908 } | |
909 entries++; /* last one */ | |
910 } | |
911 atom_size = 16 + (entries * 8); | |
912 put_be32(pb, atom_size); /* size */ | |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
913 put_tag(pb, "stts"); |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
914 put_be32(pb, 0); /* version & flags */ |
1437 | 915 put_be32(pb, entries); /* entry count */ |
916 for (i=0; i<entries; i++) { | |
917 put_be32(pb, stts_entries[i].count); | |
918 put_be32(pb, stts_entries[i].duration); | |
919 } | |
920 av_free(stts_entries); | |
921 return atom_size; | |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
922 } |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
923 |
238
3519903c6c2a
mov/mp4 muxer cleanup (mostly cosmetics/simplifications & global header fix)
michaelni
parents:
202
diff
changeset
|
924 static int mov_write_dref_tag(ByteIOContext *pb) |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
925 { |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
926 put_be32(pb, 28); /* size */ |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
927 put_tag(pb, "dref"); |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
928 put_be32(pb, 0); /* version & flags */ |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
929 put_be32(pb, 1); /* entry count */ |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
930 |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
931 put_be32(pb, 0xc); /* size */ |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
932 put_tag(pb, "url "); |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
933 put_be32(pb, 1); /* version & flags */ |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
934 |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
935 return 28; |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
936 } |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
937 |
3446 | 938 static int mov_write_stbl_tag(ByteIOContext *pb, MOVTrack *track) |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
939 { |
3973
549a09cf23fe
Remove offset_t typedef and use int64_t directly instead.
diego
parents:
3909
diff
changeset
|
940 int64_t pos = url_ftell(pb); |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
941 put_be32(pb, 0); /* size */ |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
942 put_tag(pb, "stbl"); |
238
3519903c6c2a
mov/mp4 muxer cleanup (mostly cosmetics/simplifications & global header fix)
michaelni
parents:
202
diff
changeset
|
943 mov_write_stsd_tag(pb, track); |
3519903c6c2a
mov/mp4 muxer cleanup (mostly cosmetics/simplifications & global header fix)
michaelni
parents:
202
diff
changeset
|
944 mov_write_stts_tag(pb, track); |
6013
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
945 if ((track->enc->codec_type == AVMEDIA_TYPE_VIDEO || |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
946 track->enc->codec_tag == MKTAG('r','t','p',' ')) && |
3192 | 947 track->hasKeyframes && track->hasKeyframes < track->entry) |
4941 | 948 mov_write_stss_tag(pb, track, MOV_SYNC_SAMPLE); |
949 if (track->mode == MODE_MOV && track->flags & MOV_TRACK_STPS) | |
950 mov_write_stss_tag(pb, track, MOV_PARTIAL_SYNC_SAMPLE); | |
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5792
diff
changeset
|
951 if (track->enc->codec_type == AVMEDIA_TYPE_VIDEO && |
4941 | 952 track->flags & MOV_TRACK_CTTS) |
971
43f85eba04c4
CTTS support patch by (Baptiste COUDURIER <baptiste.coudurier smartjog com>)
michael
parents:
943
diff
changeset
|
953 mov_write_ctts_tag(pb, track); |
238
3519903c6c2a
mov/mp4 muxer cleanup (mostly cosmetics/simplifications & global header fix)
michaelni
parents:
202
diff
changeset
|
954 mov_write_stsc_tag(pb, track); |
3519903c6c2a
mov/mp4 muxer cleanup (mostly cosmetics/simplifications & global header fix)
michaelni
parents:
202
diff
changeset
|
955 mov_write_stsz_tag(pb, track); |
3519903c6c2a
mov/mp4 muxer cleanup (mostly cosmetics/simplifications & global header fix)
michaelni
parents:
202
diff
changeset
|
956 mov_write_stco_tag(pb, track); |
3519903c6c2a
mov/mp4 muxer cleanup (mostly cosmetics/simplifications & global header fix)
michaelni
parents:
202
diff
changeset
|
957 return updateSize(pb, pos); |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
958 } |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
959 |
238
3519903c6c2a
mov/mp4 muxer cleanup (mostly cosmetics/simplifications & global header fix)
michaelni
parents:
202
diff
changeset
|
960 static int mov_write_dinf_tag(ByteIOContext *pb) |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
961 { |
3973
549a09cf23fe
Remove offset_t typedef and use int64_t directly instead.
diego
parents:
3909
diff
changeset
|
962 int64_t pos = url_ftell(pb); |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
963 put_be32(pb, 0); /* size */ |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
964 put_tag(pb, "dinf"); |
238
3519903c6c2a
mov/mp4 muxer cleanup (mostly cosmetics/simplifications & global header fix)
michaelni
parents:
202
diff
changeset
|
965 mov_write_dref_tag(pb); |
3519903c6c2a
mov/mp4 muxer cleanup (mostly cosmetics/simplifications & global header fix)
michaelni
parents:
202
diff
changeset
|
966 return updateSize(pb, pos); |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
967 } |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
968 |
4193
2d3be324c648
Add support for muxing mov/mp4/3gp timed text streams
conrad
parents:
4079
diff
changeset
|
969 static int mov_write_nmhd_tag(ByteIOContext *pb) |
2d3be324c648
Add support for muxing mov/mp4/3gp timed text streams
conrad
parents:
4079
diff
changeset
|
970 { |
2d3be324c648
Add support for muxing mov/mp4/3gp timed text streams
conrad
parents:
4079
diff
changeset
|
971 put_be32(pb, 12); |
2d3be324c648
Add support for muxing mov/mp4/3gp timed text streams
conrad
parents:
4079
diff
changeset
|
972 put_tag(pb, "nmhd"); |
2d3be324c648
Add support for muxing mov/mp4/3gp timed text streams
conrad
parents:
4079
diff
changeset
|
973 put_be32(pb, 0); |
2d3be324c648
Add support for muxing mov/mp4/3gp timed text streams
conrad
parents:
4079
diff
changeset
|
974 return 12; |
2d3be324c648
Add support for muxing mov/mp4/3gp timed text streams
conrad
parents:
4079
diff
changeset
|
975 } |
2d3be324c648
Add support for muxing mov/mp4/3gp timed text streams
conrad
parents:
4079
diff
changeset
|
976 |
2d3be324c648
Add support for muxing mov/mp4/3gp timed text streams
conrad
parents:
4079
diff
changeset
|
977 static int mov_write_gmhd_tag(ByteIOContext *pb) |
2d3be324c648
Add support for muxing mov/mp4/3gp timed text streams
conrad
parents:
4079
diff
changeset
|
978 { |
2d3be324c648
Add support for muxing mov/mp4/3gp timed text streams
conrad
parents:
4079
diff
changeset
|
979 put_be32(pb, 0x20); /* size */ |
2d3be324c648
Add support for muxing mov/mp4/3gp timed text streams
conrad
parents:
4079
diff
changeset
|
980 put_tag(pb, "gmhd"); |
2d3be324c648
Add support for muxing mov/mp4/3gp timed text streams
conrad
parents:
4079
diff
changeset
|
981 put_be32(pb, 0x18); /* gmin size */ |
2d3be324c648
Add support for muxing mov/mp4/3gp timed text streams
conrad
parents:
4079
diff
changeset
|
982 put_tag(pb, "gmin"); /* generic media info */ |
2d3be324c648
Add support for muxing mov/mp4/3gp timed text streams
conrad
parents:
4079
diff
changeset
|
983 put_be32(pb, 0); /* version & flags */ |
2d3be324c648
Add support for muxing mov/mp4/3gp timed text streams
conrad
parents:
4079
diff
changeset
|
984 put_be16(pb, 0x40); /* graphics mode = */ |
2d3be324c648
Add support for muxing mov/mp4/3gp timed text streams
conrad
parents:
4079
diff
changeset
|
985 put_be16(pb, 0x8000); /* opColor (r?) */ |
2d3be324c648
Add support for muxing mov/mp4/3gp timed text streams
conrad
parents:
4079
diff
changeset
|
986 put_be16(pb, 0x8000); /* opColor (g?) */ |
2d3be324c648
Add support for muxing mov/mp4/3gp timed text streams
conrad
parents:
4079
diff
changeset
|
987 put_be16(pb, 0x8000); /* opColor (b?) */ |
2d3be324c648
Add support for muxing mov/mp4/3gp timed text streams
conrad
parents:
4079
diff
changeset
|
988 put_be16(pb, 0); /* balance */ |
2d3be324c648
Add support for muxing mov/mp4/3gp timed text streams
conrad
parents:
4079
diff
changeset
|
989 put_be16(pb, 0); /* reserved */ |
2d3be324c648
Add support for muxing mov/mp4/3gp timed text streams
conrad
parents:
4079
diff
changeset
|
990 return 0x20; |
2d3be324c648
Add support for muxing mov/mp4/3gp timed text streams
conrad
parents:
4079
diff
changeset
|
991 } |
2d3be324c648
Add support for muxing mov/mp4/3gp timed text streams
conrad
parents:
4079
diff
changeset
|
992 |
238
3519903c6c2a
mov/mp4 muxer cleanup (mostly cosmetics/simplifications & global header fix)
michaelni
parents:
202
diff
changeset
|
993 static int mov_write_smhd_tag(ByteIOContext *pb) |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
994 { |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
995 put_be32(pb, 16); /* size */ |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
996 put_tag(pb, "smhd"); |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
997 put_be32(pb, 0); /* version & flags */ |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
998 put_be16(pb, 0); /* reserved (balance, normally = 0) */ |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
999 put_be16(pb, 0); /* reserved */ |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1000 return 16; |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1001 } |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1002 |
238
3519903c6c2a
mov/mp4 muxer cleanup (mostly cosmetics/simplifications & global header fix)
michaelni
parents:
202
diff
changeset
|
1003 static int mov_write_vmhd_tag(ByteIOContext *pb) |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1004 { |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1005 put_be32(pb, 0x14); /* size (always 0x14) */ |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1006 put_tag(pb, "vmhd"); |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1007 put_be32(pb, 0x01); /* version & flags */ |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1008 put_be64(pb, 0); /* reserved (graphics mode = copy) */ |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1009 return 0x14; |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1010 } |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1011 |
3446 | 1012 static int mov_write_hdlr_tag(ByteIOContext *pb, MOVTrack *track) |
399
6ab5454567b6
* making .mov files generated by ffmpeg compatible with Apple software.
romansh
parents:
397
diff
changeset
|
1013 { |
4195 | 1014 const char *hdlr, *descr = NULL, *hdlr_type = NULL; |
3973
549a09cf23fe
Remove offset_t typedef and use int64_t directly instead.
diego
parents:
3909
diff
changeset
|
1015 int64_t pos = url_ftell(pb); |
885 | 1016 |
399
6ab5454567b6
* making .mov files generated by ffmpeg compatible with Apple software.
romansh
parents:
397
diff
changeset
|
1017 if (!track) { /* no media --> data handler */ |
887 | 1018 hdlr = "dhlr"; |
1019 hdlr_type = "url "; | |
1020 descr = "DataHandler"; | |
399
6ab5454567b6
* making .mov files generated by ffmpeg compatible with Apple software.
romansh
parents:
397
diff
changeset
|
1021 } else { |
887 | 1022 hdlr = (track->mode == MODE_MOV) ? "mhlr" : "\0\0\0\0"; |
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5792
diff
changeset
|
1023 if (track->enc->codec_type == AVMEDIA_TYPE_VIDEO) { |
887 | 1024 hdlr_type = "vide"; |
1025 descr = "VideoHandler"; | |
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5792
diff
changeset
|
1026 } else if (track->enc->codec_type == AVMEDIA_TYPE_AUDIO) { |
887 | 1027 hdlr_type = "soun"; |
1028 descr = "SoundHandler"; | |
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5792
diff
changeset
|
1029 } else if (track->enc->codec_type == AVMEDIA_TYPE_SUBTITLE) { |
4699
59ee17ee14fa
write correct atoms based on tag and not format, fixes subs stream copy
bcoudurier
parents:
4698
diff
changeset
|
1030 if (track->tag == MKTAG('t','x','3','g')) hdlr_type = "sbtl"; |
4700 | 1031 else hdlr_type = "text"; |
4193
2d3be324c648
Add support for muxing mov/mp4/3gp timed text streams
conrad
parents:
4079
diff
changeset
|
1032 descr = "SubtitleHandler"; |
6013
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
1033 } else if (track->enc->codec_tag == MKTAG('r','t','p',' ')) { |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
1034 hdlr_type = "hint"; |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
1035 descr = "HintHandler"; |
887 | 1036 } |
399
6ab5454567b6
* making .mov files generated by ffmpeg compatible with Apple software.
romansh
parents:
397
diff
changeset
|
1037 } |
885 | 1038 |
399
6ab5454567b6
* making .mov files generated by ffmpeg compatible with Apple software.
romansh
parents:
397
diff
changeset
|
1039 put_be32(pb, 0); /* size */ |
6ab5454567b6
* making .mov files generated by ffmpeg compatible with Apple software.
romansh
parents:
397
diff
changeset
|
1040 put_tag(pb, "hdlr"); |
6ab5454567b6
* making .mov files generated by ffmpeg compatible with Apple software.
romansh
parents:
397
diff
changeset
|
1041 put_be32(pb, 0); /* Version & flags */ |
400
62e4ea840c52
* fixing 10l in movenc.c + updating regression patterns.
romansh
parents:
399
diff
changeset
|
1042 put_buffer(pb, hdlr, 4); /* handler */ |
399
6ab5454567b6
* making .mov files generated by ffmpeg compatible with Apple software.
romansh
parents:
397
diff
changeset
|
1043 put_tag(pb, hdlr_type); /* handler type */ |
6ab5454567b6
* making .mov files generated by ffmpeg compatible with Apple software.
romansh
parents:
397
diff
changeset
|
1044 put_be32(pb ,0); /* reserved */ |
6ab5454567b6
* making .mov files generated by ffmpeg compatible with Apple software.
romansh
parents:
397
diff
changeset
|
1045 put_be32(pb ,0); /* reserved */ |
6ab5454567b6
* making .mov files generated by ffmpeg compatible with Apple software.
romansh
parents:
397
diff
changeset
|
1046 put_be32(pb ,0); /* reserved */ |
4953
1b3487b81ac7
fix hdlr descr in mp4 which use c string, patch by Larbi Joubala, larbi dot joubala at resonate-mp4 dot com
bcoudurier
parents:
4941
diff
changeset
|
1047 if (!track || track->mode == MODE_MOV) |
1b3487b81ac7
fix hdlr descr in mp4 which use c string, patch by Larbi Joubala, larbi dot joubala at resonate-mp4 dot com
bcoudurier
parents:
4941
diff
changeset
|
1048 put_byte(pb, strlen(descr)); /* pascal string */ |
399
6ab5454567b6
* making .mov files generated by ffmpeg compatible with Apple software.
romansh
parents:
397
diff
changeset
|
1049 put_buffer(pb, descr, strlen(descr)); /* handler description */ |
4953
1b3487b81ac7
fix hdlr descr in mp4 which use c string, patch by Larbi Joubala, larbi dot joubala at resonate-mp4 dot com
bcoudurier
parents:
4941
diff
changeset
|
1050 if (track && track->mode != MODE_MOV) |
1b3487b81ac7
fix hdlr descr in mp4 which use c string, patch by Larbi Joubala, larbi dot joubala at resonate-mp4 dot com
bcoudurier
parents:
4941
diff
changeset
|
1051 put_byte(pb, 0); /* c string */ |
399
6ab5454567b6
* making .mov files generated by ffmpeg compatible with Apple software.
romansh
parents:
397
diff
changeset
|
1052 return updateSize(pb, pos); |
6ab5454567b6
* making .mov files generated by ffmpeg compatible with Apple software.
romansh
parents:
397
diff
changeset
|
1053 } |
6ab5454567b6
* making .mov files generated by ffmpeg compatible with Apple software.
romansh
parents:
397
diff
changeset
|
1054 |
6013
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
1055 static int mov_write_hmhd_tag(ByteIOContext *pb) |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
1056 { |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
1057 /* This atom must be present, but leaving the values at zero |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
1058 * seems harmless. */ |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
1059 put_be32(pb, 28); /* size */ |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
1060 put_tag(pb, "hmhd"); |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
1061 put_be32(pb, 0); /* version, flags */ |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
1062 put_be16(pb, 0); /* maxPDUsize */ |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
1063 put_be16(pb, 0); /* avgPDUsize */ |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
1064 put_be32(pb, 0); /* maxbitrate */ |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
1065 put_be32(pb, 0); /* avgbitrate */ |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
1066 put_be32(pb, 0); /* reserved */ |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
1067 return 28; |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
1068 } |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
1069 |
3446 | 1070 static int mov_write_minf_tag(ByteIOContext *pb, MOVTrack *track) |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1071 { |
3973
549a09cf23fe
Remove offset_t typedef and use int64_t directly instead.
diego
parents:
3909
diff
changeset
|
1072 int64_t pos = url_ftell(pb); |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1073 put_be32(pb, 0); /* size */ |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1074 put_tag(pb, "minf"); |
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5792
diff
changeset
|
1075 if(track->enc->codec_type == AVMEDIA_TYPE_VIDEO) |
238
3519903c6c2a
mov/mp4 muxer cleanup (mostly cosmetics/simplifications & global header fix)
michaelni
parents:
202
diff
changeset
|
1076 mov_write_vmhd_tag(pb); |
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5792
diff
changeset
|
1077 else if (track->enc->codec_type == AVMEDIA_TYPE_AUDIO) |
238
3519903c6c2a
mov/mp4 muxer cleanup (mostly cosmetics/simplifications & global header fix)
michaelni
parents:
202
diff
changeset
|
1078 mov_write_smhd_tag(pb); |
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5792
diff
changeset
|
1079 else if (track->enc->codec_type == AVMEDIA_TYPE_SUBTITLE) { |
4699
59ee17ee14fa
write correct atoms based on tag and not format, fixes subs stream copy
bcoudurier
parents:
4698
diff
changeset
|
1080 if (track->tag == MKTAG('t','e','x','t')) mov_write_gmhd_tag(pb); |
4700 | 1081 else mov_write_nmhd_tag(pb); |
6013
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
1082 } else if (track->tag == MKTAG('r','t','p',' ')) { |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
1083 mov_write_hmhd_tag(pb); |
4193
2d3be324c648
Add support for muxing mov/mp4/3gp timed text streams
conrad
parents:
4079
diff
changeset
|
1084 } |
399
6ab5454567b6
* making .mov files generated by ffmpeg compatible with Apple software.
romansh
parents:
397
diff
changeset
|
1085 if (track->mode == MODE_MOV) /* FIXME: Why do it for MODE_MOV only ? */ |
6ab5454567b6
* making .mov files generated by ffmpeg compatible with Apple software.
romansh
parents:
397
diff
changeset
|
1086 mov_write_hdlr_tag(pb, NULL); |
238
3519903c6c2a
mov/mp4 muxer cleanup (mostly cosmetics/simplifications & global header fix)
michaelni
parents:
202
diff
changeset
|
1087 mov_write_dinf_tag(pb); |
3519903c6c2a
mov/mp4 muxer cleanup (mostly cosmetics/simplifications & global header fix)
michaelni
parents:
202
diff
changeset
|
1088 mov_write_stbl_tag(pb, track); |
3519903c6c2a
mov/mp4 muxer cleanup (mostly cosmetics/simplifications & global header fix)
michaelni
parents:
202
diff
changeset
|
1089 return updateSize(pb, pos); |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1090 } |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1091 |
3446 | 1092 static int mov_write_mdhd_tag(ByteIOContext *pb, MOVTrack *track) |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1093 { |
1037 | 1094 int version = track->trackDuration < INT32_MAX ? 0 : 1; |
1095 | |
1096 (version == 1) ? put_be32(pb, 44) : put_be32(pb, 32); /* size */ | |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1097 put_tag(pb, "mdhd"); |
1037 | 1098 put_byte(pb, version); |
1099 put_be24(pb, 0); /* flags */ | |
1100 if (version == 1) { | |
1101 put_be64(pb, track->time); | |
1102 put_be64(pb, track->time); | |
1103 } else { | |
1104 put_be32(pb, track->time); /* creation time */ | |
1105 put_be32(pb, track->time); /* modification time */ | |
1106 } | |
885 | 1107 put_be32(pb, track->timescale); /* time scale (sample rate for audio) */ |
1037 | 1108 (version == 1) ? put_be64(pb, track->trackDuration) : put_be32(pb, track->trackDuration); /* duration */ |
890
1e49bfea0ffb
finally found what those >138 codes were... crappy compressed 5bit ascii. this gets them correctly, and adds setting track lang in movenc too.
mmu_man
parents:
887
diff
changeset
|
1109 put_be16(pb, track->language); /* language */ |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1110 put_be16(pb, 0); /* reserved (quality) */ |
2102 | 1111 |
1112 if(version!=0 && track->mode == MODE_MOV){ | |
1113 av_log(NULL, AV_LOG_ERROR, | |
1114 "FATAL error, file duration too long for timebase, this file will not be\n" | |
2106 | 1115 "playable with quicktime. Choose a different timebase or a different\n" |
2102 | 1116 "container format\n"); |
1117 } | |
1118 | |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1119 return 32; |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1120 } |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1121 |
3446 | 1122 static int mov_write_mdia_tag(ByteIOContext *pb, MOVTrack *track) |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1123 { |
3973
549a09cf23fe
Remove offset_t typedef and use int64_t directly instead.
diego
parents:
3909
diff
changeset
|
1124 int64_t pos = url_ftell(pb); |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1125 put_be32(pb, 0); /* size */ |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1126 put_tag(pb, "mdia"); |
238
3519903c6c2a
mov/mp4 muxer cleanup (mostly cosmetics/simplifications & global header fix)
michaelni
parents:
202
diff
changeset
|
1127 mov_write_mdhd_tag(pb, track); |
3519903c6c2a
mov/mp4 muxer cleanup (mostly cosmetics/simplifications & global header fix)
michaelni
parents:
202
diff
changeset
|
1128 mov_write_hdlr_tag(pb, track); |
3519903c6c2a
mov/mp4 muxer cleanup (mostly cosmetics/simplifications & global header fix)
michaelni
parents:
202
diff
changeset
|
1129 mov_write_minf_tag(pb, track); |
3519903c6c2a
mov/mp4 muxer cleanup (mostly cosmetics/simplifications & global header fix)
michaelni
parents:
202
diff
changeset
|
1130 return updateSize(pb, pos); |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1131 } |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1132 |
3759
27537074f2a9
convert every muxer/demuxer to write/read sample_aspect_ratio from/to
aurel
parents:
3526
diff
changeset
|
1133 static int mov_write_tkhd_tag(ByteIOContext *pb, MOVTrack *track, AVStream *st) |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1134 { |
5393 | 1135 int64_t duration = av_rescale_rnd(track->trackDuration, MOV_TIMESCALE, |
1136 track->timescale, AV_ROUND_UP); | |
1037 | 1137 int version = duration < INT32_MAX ? 0 : 1; |
1138 | |
1139 (version == 1) ? put_be32(pb, 104) : put_be32(pb, 92); /* size */ | |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1140 put_tag(pb, "tkhd"); |
1037 | 1141 put_byte(pb, version); |
1142 put_be24(pb, 0xf); /* flags (track enabled) */ | |
1143 if (version == 1) { | |
1144 put_be64(pb, track->time); | |
1145 put_be64(pb, track->time); | |
1146 } else { | |
1147 put_be32(pb, track->time); /* creation time */ | |
1148 put_be32(pb, track->time); /* modification time */ | |
1149 } | |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1150 put_be32(pb, track->trackID); /* track-id */ |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1151 put_be32(pb, 0); /* reserved */ |
1037 | 1152 (version == 1) ? put_be64(pb, duration) : put_be32(pb, duration); |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1153 |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1154 put_be32(pb, 0); /* reserved */ |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1155 put_be32(pb, 0); /* reserved */ |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1156 put_be32(pb, 0x0); /* reserved (Layer & Alternate group) */ |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1157 /* Volume, only for audio */ |
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5792
diff
changeset
|
1158 if(track->enc->codec_type == AVMEDIA_TYPE_AUDIO) |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1159 put_be16(pb, 0x0100); |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1160 else |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1161 put_be16(pb, 0); |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1162 put_be16(pb, 0); /* reserved */ |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1163 |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1164 /* Matrix structure */ |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1165 put_be32(pb, 0x00010000); /* reserved */ |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1166 put_be32(pb, 0x0); /* reserved */ |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1167 put_be32(pb, 0x0); /* reserved */ |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1168 put_be32(pb, 0x0); /* reserved */ |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1169 put_be32(pb, 0x00010000); /* reserved */ |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1170 put_be32(pb, 0x0); /* reserved */ |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1171 put_be32(pb, 0x0); /* reserved */ |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1172 put_be32(pb, 0x0); /* reserved */ |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1173 put_be32(pb, 0x40000000); /* reserved */ |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1174 |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1175 /* Track width and height, for visual only */ |
5993 | 1176 if(st && (track->enc->codec_type == AVMEDIA_TYPE_VIDEO || |
1177 track->enc->codec_type == AVMEDIA_TYPE_SUBTITLE)) { | |
3759
27537074f2a9
convert every muxer/demuxer to write/read sample_aspect_ratio from/to
aurel
parents:
3526
diff
changeset
|
1178 double sample_aspect_ratio = av_q2d(st->sample_aspect_ratio); |
4463
0cd7acf426f3
write active picture height for d-10/imx in mov
bcoudurier
parents:
4251
diff
changeset
|
1179 if(!sample_aspect_ratio || track->height != track->enc->height) |
0cd7acf426f3
write active picture height for d-10/imx in mov
bcoudurier
parents:
4251
diff
changeset
|
1180 sample_aspect_ratio = 1; |
365
4ae9fac22a5d
AAC support in mov, correct aspect ratio support and user data support patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
342
diff
changeset
|
1181 put_be32(pb, sample_aspect_ratio * track->enc->width*0x10000); |
4463
0cd7acf426f3
write active picture height for d-10/imx in mov
bcoudurier
parents:
4251
diff
changeset
|
1182 put_be32(pb, track->height*0x10000); |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1183 } |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1184 else { |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1185 put_be32(pb, 0); |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1186 put_be32(pb, 0); |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1187 } |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1188 return 0x5c; |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1189 } |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1190 |
659
6d7c0e6d929e
Sony PSP variation of MP4 patch by <tjcannell AT blueyonder DOT co DOT uk>
mmu_man
parents:
657
diff
changeset
|
1191 // This box seems important for the psp playback ... without it the movie seems to hang |
6d7c0e6d929e
Sony PSP variation of MP4 patch by <tjcannell AT blueyonder DOT co DOT uk>
mmu_man
parents:
657
diff
changeset
|
1192 static int mov_write_edts_tag(ByteIOContext *pb, MOVTrack *track) |
6d7c0e6d929e
Sony PSP variation of MP4 patch by <tjcannell AT blueyonder DOT co DOT uk>
mmu_man
parents:
657
diff
changeset
|
1193 { |
6d7c0e6d929e
Sony PSP variation of MP4 patch by <tjcannell AT blueyonder DOT co DOT uk>
mmu_man
parents:
657
diff
changeset
|
1194 put_be32(pb, 0x24); /* size */ |
6d7c0e6d929e
Sony PSP variation of MP4 patch by <tjcannell AT blueyonder DOT co DOT uk>
mmu_man
parents:
657
diff
changeset
|
1195 put_tag(pb, "edts"); |
6d7c0e6d929e
Sony PSP variation of MP4 patch by <tjcannell AT blueyonder DOT co DOT uk>
mmu_man
parents:
657
diff
changeset
|
1196 put_be32(pb, 0x1c); /* size */ |
6d7c0e6d929e
Sony PSP variation of MP4 patch by <tjcannell AT blueyonder DOT co DOT uk>
mmu_man
parents:
657
diff
changeset
|
1197 put_tag(pb, "elst"); |
6d7c0e6d929e
Sony PSP variation of MP4 patch by <tjcannell AT blueyonder DOT co DOT uk>
mmu_man
parents:
657
diff
changeset
|
1198 put_be32(pb, 0x0); |
6d7c0e6d929e
Sony PSP variation of MP4 patch by <tjcannell AT blueyonder DOT co DOT uk>
mmu_man
parents:
657
diff
changeset
|
1199 put_be32(pb, 0x1); |
6d7c0e6d929e
Sony PSP variation of MP4 patch by <tjcannell AT blueyonder DOT co DOT uk>
mmu_man
parents:
657
diff
changeset
|
1200 |
5393 | 1201 /* duration ... doesn't seem to effect psp */ |
1202 put_be32(pb, av_rescale_rnd(track->trackDuration, MOV_TIMESCALE, | |
1203 track->timescale, AV_ROUND_UP)); | |
659
6d7c0e6d929e
Sony PSP variation of MP4 patch by <tjcannell AT blueyonder DOT co DOT uk>
mmu_man
parents:
657
diff
changeset
|
1204 |
1250 | 1205 put_be32(pb, track->cluster[0].cts); /* first pts is cts since dts is 0 */ |
659
6d7c0e6d929e
Sony PSP variation of MP4 patch by <tjcannell AT blueyonder DOT co DOT uk>
mmu_man
parents:
657
diff
changeset
|
1206 put_be32(pb, 0x00010000); |
6d7c0e6d929e
Sony PSP variation of MP4 patch by <tjcannell AT blueyonder DOT co DOT uk>
mmu_man
parents:
657
diff
changeset
|
1207 return 0x24; |
6d7c0e6d929e
Sony PSP variation of MP4 patch by <tjcannell AT blueyonder DOT co DOT uk>
mmu_man
parents:
657
diff
changeset
|
1208 } |
6d7c0e6d929e
Sony PSP variation of MP4 patch by <tjcannell AT blueyonder DOT co DOT uk>
mmu_man
parents:
657
diff
changeset
|
1209 |
5993 | 1210 static int mov_write_tref_tag(ByteIOContext *pb, MOVTrack *track) |
1211 { | |
1212 put_be32(pb, 20); // size | |
1213 put_tag(pb, "tref"); | |
1214 put_be32(pb, 12); // size (subatom) | |
1215 put_le32(pb, track->tref_tag); | |
1216 put_be32(pb, track->tref_id); | |
1217 return 20; | |
1218 } | |
1219 | |
659
6d7c0e6d929e
Sony PSP variation of MP4 patch by <tjcannell AT blueyonder DOT co DOT uk>
mmu_man
parents:
657
diff
changeset
|
1220 // goes at the end of each track! ... Critical for PSP playback ("Incompatible data" without it) |
6d7c0e6d929e
Sony PSP variation of MP4 patch by <tjcannell AT blueyonder DOT co DOT uk>
mmu_man
parents:
657
diff
changeset
|
1221 static int mov_write_uuid_tag_psp(ByteIOContext *pb, MOVTrack *mov) |
6d7c0e6d929e
Sony PSP variation of MP4 patch by <tjcannell AT blueyonder DOT co DOT uk>
mmu_man
parents:
657
diff
changeset
|
1222 { |
6d7c0e6d929e
Sony PSP variation of MP4 patch by <tjcannell AT blueyonder DOT co DOT uk>
mmu_man
parents:
657
diff
changeset
|
1223 put_be32(pb, 0x34); /* size ... reports as 28 in mp4box! */ |
6d7c0e6d929e
Sony PSP variation of MP4 patch by <tjcannell AT blueyonder DOT co DOT uk>
mmu_man
parents:
657
diff
changeset
|
1224 put_tag(pb, "uuid"); |
6d7c0e6d929e
Sony PSP variation of MP4 patch by <tjcannell AT blueyonder DOT co DOT uk>
mmu_man
parents:
657
diff
changeset
|
1225 put_tag(pb, "USMT"); |
6d7c0e6d929e
Sony PSP variation of MP4 patch by <tjcannell AT blueyonder DOT co DOT uk>
mmu_man
parents:
657
diff
changeset
|
1226 put_be32(pb, 0x21d24fce); |
6d7c0e6d929e
Sony PSP variation of MP4 patch by <tjcannell AT blueyonder DOT co DOT uk>
mmu_man
parents:
657
diff
changeset
|
1227 put_be32(pb, 0xbb88695c); |
6d7c0e6d929e
Sony PSP variation of MP4 patch by <tjcannell AT blueyonder DOT co DOT uk>
mmu_man
parents:
657
diff
changeset
|
1228 put_be32(pb, 0xfac9c740); |
6d7c0e6d929e
Sony PSP variation of MP4 patch by <tjcannell AT blueyonder DOT co DOT uk>
mmu_man
parents:
657
diff
changeset
|
1229 put_be32(pb, 0x1c); // another size here! |
6d7c0e6d929e
Sony PSP variation of MP4 patch by <tjcannell AT blueyonder DOT co DOT uk>
mmu_man
parents:
657
diff
changeset
|
1230 put_tag(pb, "MTDT"); |
6d7c0e6d929e
Sony PSP variation of MP4 patch by <tjcannell AT blueyonder DOT co DOT uk>
mmu_man
parents:
657
diff
changeset
|
1231 put_be32(pb, 0x00010012); |
6d7c0e6d929e
Sony PSP variation of MP4 patch by <tjcannell AT blueyonder DOT co DOT uk>
mmu_man
parents:
657
diff
changeset
|
1232 put_be32(pb, 0x0a); |
6d7c0e6d929e
Sony PSP variation of MP4 patch by <tjcannell AT blueyonder DOT co DOT uk>
mmu_man
parents:
657
diff
changeset
|
1233 put_be32(pb, 0x55c40000); |
6d7c0e6d929e
Sony PSP variation of MP4 patch by <tjcannell AT blueyonder DOT co DOT uk>
mmu_man
parents:
657
diff
changeset
|
1234 put_be32(pb, 0x1); |
6d7c0e6d929e
Sony PSP variation of MP4 patch by <tjcannell AT blueyonder DOT co DOT uk>
mmu_man
parents:
657
diff
changeset
|
1235 put_be32(pb, 0x0); |
6d7c0e6d929e
Sony PSP variation of MP4 patch by <tjcannell AT blueyonder DOT co DOT uk>
mmu_man
parents:
657
diff
changeset
|
1236 return 0x34; |
6d7c0e6d929e
Sony PSP variation of MP4 patch by <tjcannell AT blueyonder DOT co DOT uk>
mmu_man
parents:
657
diff
changeset
|
1237 } |
6d7c0e6d929e
Sony PSP variation of MP4 patch by <tjcannell AT blueyonder DOT co DOT uk>
mmu_man
parents:
657
diff
changeset
|
1238 |
6013
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
1239 static int mov_write_udta_sdp(ByteIOContext *pb, AVCodecContext *ctx, int index) |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
1240 { |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
1241 char buf[1000] = ""; |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
1242 int len; |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
1243 |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
1244 ff_sdp_write_media(buf, sizeof(buf), ctx, NULL, 0, 0); |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
1245 av_strlcatf(buf, sizeof(buf), "a=control:streamid=%d\r\n", index); |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
1246 len = strlen(buf); |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
1247 |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
1248 put_be32(pb, len + 24); |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
1249 put_tag (pb, "udta"); |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
1250 put_be32(pb, len + 16); |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
1251 put_tag (pb, "hnti"); |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
1252 put_be32(pb, len + 8); |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
1253 put_tag (pb, "sdp "); |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
1254 put_buffer(pb, buf, len); |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
1255 return len + 24; |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
1256 } |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
1257 |
3759
27537074f2a9
convert every muxer/demuxer to write/read sample_aspect_ratio from/to
aurel
parents:
3526
diff
changeset
|
1258 static int mov_write_trak_tag(ByteIOContext *pb, MOVTrack *track, AVStream *st) |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1259 { |
3973
549a09cf23fe
Remove offset_t typedef and use int64_t directly instead.
diego
parents:
3909
diff
changeset
|
1260 int64_t pos = url_ftell(pb); |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1261 put_be32(pb, 0); /* size */ |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1262 put_tag(pb, "trak"); |
3759
27537074f2a9
convert every muxer/demuxer to write/read sample_aspect_ratio from/to
aurel
parents:
3526
diff
changeset
|
1263 mov_write_tkhd_tag(pb, track, st); |
4941 | 1264 if (track->mode == MODE_PSP || track->flags & MOV_TRACK_CTTS) |
659
6d7c0e6d929e
Sony PSP variation of MP4 patch by <tjcannell AT blueyonder DOT co DOT uk>
mmu_man
parents:
657
diff
changeset
|
1265 mov_write_edts_tag(pb, track); // PSP Movies require edts box |
5993 | 1266 if (track->tref_tag) |
1267 mov_write_tref_tag(pb, track); | |
238
3519903c6c2a
mov/mp4 muxer cleanup (mostly cosmetics/simplifications & global header fix)
michaelni
parents:
202
diff
changeset
|
1268 mov_write_mdia_tag(pb, track); |
885 | 1269 if (track->mode == MODE_PSP) |
659
6d7c0e6d929e
Sony PSP variation of MP4 patch by <tjcannell AT blueyonder DOT co DOT uk>
mmu_man
parents:
657
diff
changeset
|
1270 mov_write_uuid_tag_psp(pb,track); // PSP Movies require this uuid box |
6013
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
1271 if (track->tag == MKTAG('r','t','p',' ')) |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
1272 mov_write_udta_sdp(pb, track->rtp_ctx->streams[0]->codec, track->trackID); |
238
3519903c6c2a
mov/mp4 muxer cleanup (mostly cosmetics/simplifications & global header fix)
michaelni
parents:
202
diff
changeset
|
1273 return updateSize(pb, pos); |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1274 } |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1275 |
683
095009fc2f35
kill warnings patch by (M«©ns Rullg«©rd <mru inprovide com>)
michael
parents:
677
diff
changeset
|
1276 #if 0 |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1277 /* TODO: Not sorted out, but not necessary either */ |
4609
065557d6fffb
Rename movenc.c MOVContext to MOVMuxContext, since MOVContext is already used
rbultje
parents:
4587
diff
changeset
|
1278 static int mov_write_iods_tag(ByteIOContext *pb, MOVMuxContext *mov) |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1279 { |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1280 put_be32(pb, 0x15); /* size */ |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1281 put_tag(pb, "iods"); |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1282 put_be32(pb, 0); /* version & flags */ |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1283 put_be16(pb, 0x1007); |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1284 put_byte(pb, 0); |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1285 put_be16(pb, 0x4fff); |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1286 put_be16(pb, 0xfffe); |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1287 put_be16(pb, 0x01ff); |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1288 return 0x15; |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1289 } |
683
095009fc2f35
kill warnings patch by (M«©ns Rullg«©rd <mru inprovide com>)
michael
parents:
677
diff
changeset
|
1290 #endif |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1291 |
4609
065557d6fffb
Rename movenc.c MOVContext to MOVMuxContext, since MOVContext is already used
rbultje
parents:
4587
diff
changeset
|
1292 static int mov_write_mvhd_tag(ByteIOContext *pb, MOVMuxContext *mov) |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1293 { |
909
69e06b6f91a3
>4gb fixes by (Dirk Musfeldt | d.musfeldt meilenstein de)
michael
parents:
896
diff
changeset
|
1294 int maxTrackID = 1, i; |
69e06b6f91a3
>4gb fixes by (Dirk Musfeldt | d.musfeldt meilenstein de)
michael
parents:
896
diff
changeset
|
1295 int64_t maxTrackLenTemp, maxTrackLen = 0; |
1037 | 1296 int version; |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1297 |
1131 | 1298 for (i=0; i<mov->nb_streams; i++) { |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1299 if(mov->tracks[i].entry > 0) { |
5393 | 1300 maxTrackLenTemp = av_rescale_rnd(mov->tracks[i].trackDuration, |
1301 MOV_TIMESCALE, | |
1302 mov->tracks[i].timescale, | |
1303 AV_ROUND_UP); | |
259
e091218eccd2
mov/mp4/3gp muxer improvements patch by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
241
diff
changeset
|
1304 if(maxTrackLen < maxTrackLenTemp) |
e091218eccd2
mov/mp4/3gp muxer improvements patch by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
241
diff
changeset
|
1305 maxTrackLen = maxTrackLenTemp; |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1306 if(maxTrackID < mov->tracks[i].trackID) |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1307 maxTrackID = mov->tracks[i].trackID; |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1308 } |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1309 } |
1037 | 1310 |
1311 version = maxTrackLen < UINT32_MAX ? 0 : 1; | |
1312 (version == 1) ? put_be32(pb, 120) : put_be32(pb, 108); /* size */ | |
1313 put_tag(pb, "mvhd"); | |
1314 put_byte(pb, version); | |
1315 put_be24(pb, 0); /* flags */ | |
1316 if (version == 1) { | |
1317 put_be64(pb, mov->time); | |
1318 put_be64(pb, mov->time); | |
1319 } else { | |
1320 put_be32(pb, mov->time); /* creation time */ | |
1321 put_be32(pb, mov->time); /* modification time */ | |
1322 } | |
5393 | 1323 put_be32(pb, MOV_TIMESCALE); |
1037 | 1324 (version == 1) ? put_be64(pb, maxTrackLen) : put_be32(pb, maxTrackLen); /* duration of longest track */ |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1325 |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1326 put_be32(pb, 0x00010000); /* reserved (preferred rate) 1.0 = normal */ |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1327 put_be16(pb, 0x0100); /* reserved (preferred volume) 1.0 = normal */ |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1328 put_be16(pb, 0); /* reserved */ |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1329 put_be32(pb, 0); /* reserved */ |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1330 put_be32(pb, 0); /* reserved */ |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1331 |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1332 /* Matrix structure */ |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1333 put_be32(pb, 0x00010000); /* reserved */ |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1334 put_be32(pb, 0x0); /* reserved */ |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1335 put_be32(pb, 0x0); /* reserved */ |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1336 put_be32(pb, 0x0); /* reserved */ |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1337 put_be32(pb, 0x00010000); /* reserved */ |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1338 put_be32(pb, 0x0); /* reserved */ |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1339 put_be32(pb, 0x0); /* reserved */ |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1340 put_be32(pb, 0x0); /* reserved */ |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1341 put_be32(pb, 0x40000000); /* reserved */ |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1342 |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1343 put_be32(pb, 0); /* reserved (preview time) */ |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1344 put_be32(pb, 0); /* reserved (preview duration) */ |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1345 put_be32(pb, 0); /* reserved (poster time) */ |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1346 put_be32(pb, 0); /* reserved (selection time) */ |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1347 put_be32(pb, 0); /* reserved (selection duration) */ |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1348 put_be32(pb, 0); /* reserved (current time) */ |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1349 put_be32(pb, maxTrackID+1); /* Next track id */ |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1350 return 0x6c; |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1351 } |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1352 |
4609
065557d6fffb
Rename movenc.c MOVContext to MOVMuxContext, since MOVContext is already used
rbultje
parents:
4587
diff
changeset
|
1353 static int mov_write_itunes_hdlr_tag(ByteIOContext *pb, MOVMuxContext *mov, |
513
2b4edca40885
iTunes metadata encoding support patch by (Patrice Bensoussan <patrice.bensoussan at free dot fr>)
michael
parents:
505
diff
changeset
|
1354 AVFormatContext *s) |
2b4edca40885
iTunes metadata encoding support patch by (Patrice Bensoussan <patrice.bensoussan at free dot fr>)
michael
parents:
505
diff
changeset
|
1355 { |
5947
8b59caee931c
Predicting the size of the hdlr, string data and trkn tags in the MOV muxer
thardin
parents:
5913
diff
changeset
|
1356 put_be32(pb, 33); /* size */ |
513
2b4edca40885
iTunes metadata encoding support patch by (Patrice Bensoussan <patrice.bensoussan at free dot fr>)
michael
parents:
505
diff
changeset
|
1357 put_tag(pb, "hdlr"); |
2b4edca40885
iTunes metadata encoding support patch by (Patrice Bensoussan <patrice.bensoussan at free dot fr>)
michael
parents:
505
diff
changeset
|
1358 put_be32(pb, 0); |
2b4edca40885
iTunes metadata encoding support patch by (Patrice Bensoussan <patrice.bensoussan at free dot fr>)
michael
parents:
505
diff
changeset
|
1359 put_be32(pb, 0); |
2b4edca40885
iTunes metadata encoding support patch by (Patrice Bensoussan <patrice.bensoussan at free dot fr>)
michael
parents:
505
diff
changeset
|
1360 put_tag(pb, "mdir"); |
2b4edca40885
iTunes metadata encoding support patch by (Patrice Bensoussan <patrice.bensoussan at free dot fr>)
michael
parents:
505
diff
changeset
|
1361 put_tag(pb, "appl"); |
2b4edca40885
iTunes metadata encoding support patch by (Patrice Bensoussan <patrice.bensoussan at free dot fr>)
michael
parents:
505
diff
changeset
|
1362 put_be32(pb, 0); |
2b4edca40885
iTunes metadata encoding support patch by (Patrice Bensoussan <patrice.bensoussan at free dot fr>)
michael
parents:
505
diff
changeset
|
1363 put_be32(pb, 0); |
5375
222bbba5fd35
Do not write an extra byte in the iTunes 'hdlr' tag. The files on iTMS have an
jbr
parents:
5058
diff
changeset
|
1364 put_byte(pb, 0); |
5947
8b59caee931c
Predicting the size of the hdlr, string data and trkn tags in the MOV muxer
thardin
parents:
5913
diff
changeset
|
1365 return 33; |
513
2b4edca40885
iTunes metadata encoding support patch by (Patrice Bensoussan <patrice.bensoussan at free dot fr>)
michael
parents:
505
diff
changeset
|
1366 } |
2b4edca40885
iTunes metadata encoding support patch by (Patrice Bensoussan <patrice.bensoussan at free dot fr>)
michael
parents:
505
diff
changeset
|
1367 |
2b4edca40885
iTunes metadata encoding support patch by (Patrice Bensoussan <patrice.bensoussan at free dot fr>)
michael
parents:
505
diff
changeset
|
1368 /* helper function to write a data tag with the specified string as data */ |
4587
b41ab5937218
movenc: add muxing of language along with metadata tags when available
aurel
parents:
4586
diff
changeset
|
1369 static int mov_write_string_data_tag(ByteIOContext *pb, const char *data, int lang, int long_style) |
513
2b4edca40885
iTunes metadata encoding support patch by (Patrice Bensoussan <patrice.bensoussan at free dot fr>)
michael
parents:
505
diff
changeset
|
1370 { |
1094 | 1371 if(long_style){ |
5947
8b59caee931c
Predicting the size of the hdlr, string data and trkn tags in the MOV muxer
thardin
parents:
5913
diff
changeset
|
1372 int size = 16 + strlen(data); |
8b59caee931c
Predicting the size of the hdlr, string data and trkn tags in the MOV muxer
thardin
parents:
5913
diff
changeset
|
1373 put_be32(pb, size); /* size */ |
1094 | 1374 put_tag(pb, "data"); |
1375 put_be32(pb, 1); | |
1376 put_be32(pb, 0); | |
1377 put_buffer(pb, data, strlen(data)); | |
5947
8b59caee931c
Predicting the size of the hdlr, string data and trkn tags in the MOV muxer
thardin
parents:
5913
diff
changeset
|
1378 return size; |
1094 | 1379 }else{ |
5792
2fb291f12e5f
Fix encoder metadata string langcode in mov muxer
bcoudurier
parents:
5791
diff
changeset
|
1380 if (!lang) |
2fb291f12e5f
Fix encoder metadata string langcode in mov muxer
bcoudurier
parents:
5791
diff
changeset
|
1381 lang = ff_mov_iso639_to_lang("und", 1); |
1094 | 1382 put_be16(pb, strlen(data)); /* string length */ |
4587
b41ab5937218
movenc: add muxing of language along with metadata tags when available
aurel
parents:
4586
diff
changeset
|
1383 put_be16(pb, lang); |
1094 | 1384 put_buffer(pb, data, strlen(data)); |
1385 return strlen(data) + 4; | |
513
2b4edca40885
iTunes metadata encoding support patch by (Patrice Bensoussan <patrice.bensoussan at free dot fr>)
michael
parents:
505
diff
changeset
|
1386 } |
2b4edca40885
iTunes metadata encoding support patch by (Patrice Bensoussan <patrice.bensoussan at free dot fr>)
michael
parents:
505
diff
changeset
|
1387 } |
2b4edca40885
iTunes metadata encoding support patch by (Patrice Bensoussan <patrice.bensoussan at free dot fr>)
michael
parents:
505
diff
changeset
|
1388 |
4587
b41ab5937218
movenc: add muxing of language along with metadata tags when available
aurel
parents:
4586
diff
changeset
|
1389 static int mov_write_string_tag(ByteIOContext *pb, const char *name, const char *value, int lang, int long_style){ |
513
2b4edca40885
iTunes metadata encoding support patch by (Patrice Bensoussan <patrice.bensoussan at free dot fr>)
michael
parents:
505
diff
changeset
|
1390 int size = 0; |
3024
19de43025f0f
cosmetics, remove whitespaces before and after parenthesis
bcoudurier
parents:
3010
diff
changeset
|
1391 if (value && value[0]) { |
3973
549a09cf23fe
Remove offset_t typedef and use int64_t directly instead.
diego
parents:
3909
diff
changeset
|
1392 int64_t pos = url_ftell(pb); |
513
2b4edca40885
iTunes metadata encoding support patch by (Patrice Bensoussan <patrice.bensoussan at free dot fr>)
michael
parents:
505
diff
changeset
|
1393 put_be32(pb, 0); /* size */ |
1094 | 1394 put_tag(pb, name); |
4587
b41ab5937218
movenc: add muxing of language along with metadata tags when available
aurel
parents:
4586
diff
changeset
|
1395 mov_write_string_data_tag(pb, value, lang, long_style); |
1094 | 1396 size= updateSize(pb, pos); |
513
2b4edca40885
iTunes metadata encoding support patch by (Patrice Bensoussan <patrice.bensoussan at free dot fr>)
michael
parents:
505
diff
changeset
|
1397 } |
2b4edca40885
iTunes metadata encoding support patch by (Patrice Bensoussan <patrice.bensoussan at free dot fr>)
michael
parents:
505
diff
changeset
|
1398 return size; |
2b4edca40885
iTunes metadata encoding support patch by (Patrice Bensoussan <patrice.bensoussan at free dot fr>)
michael
parents:
505
diff
changeset
|
1399 } |
2b4edca40885
iTunes metadata encoding support patch by (Patrice Bensoussan <patrice.bensoussan at free dot fr>)
michael
parents:
505
diff
changeset
|
1400 |
4584 | 1401 static int mov_write_string_metadata(AVFormatContext *s, ByteIOContext *pb, |
1402 const char *name, const char *tag, | |
1403 int long_style) | |
513
2b4edca40885
iTunes metadata encoding support patch by (Patrice Bensoussan <patrice.bensoussan at free dot fr>)
michael
parents:
505
diff
changeset
|
1404 { |
4587
b41ab5937218
movenc: add muxing of language along with metadata tags when available
aurel
parents:
4586
diff
changeset
|
1405 int l, lang = 0, len, len2; |
b41ab5937218
movenc: add muxing of language along with metadata tags when available
aurel
parents:
4586
diff
changeset
|
1406 AVMetadataTag *t, *t2 = NULL; |
b41ab5937218
movenc: add muxing of language along with metadata tags when available
aurel
parents:
4586
diff
changeset
|
1407 char tag2[16]; |
4584 | 1408 |
1409 if (!(t = av_metadata_get(s->metadata, tag, NULL, 0))) | |
1094 | 1410 return 0; |
4584 | 1411 |
4587
b41ab5937218
movenc: add muxing of language along with metadata tags when available
aurel
parents:
4586
diff
changeset
|
1412 len = strlen(t->key); |
b41ab5937218
movenc: add muxing of language along with metadata tags when available
aurel
parents:
4586
diff
changeset
|
1413 snprintf(tag2, sizeof(tag2), "%s-", tag); |
b41ab5937218
movenc: add muxing of language along with metadata tags when available
aurel
parents:
4586
diff
changeset
|
1414 while ((t2 = av_metadata_get(s->metadata, tag2, t2, AV_METADATA_IGNORE_SUFFIX))) { |
b41ab5937218
movenc: add muxing of language along with metadata tags when available
aurel
parents:
4586
diff
changeset
|
1415 len2 = strlen(t2->key); |
b41ab5937218
movenc: add muxing of language along with metadata tags when available
aurel
parents:
4586
diff
changeset
|
1416 if (len2 == len+4 && !strcmp(t->value, t2->value) |
5791
9cde0ca98839
Correctly mark mov metadata as utf-8, using iso language code
bcoudurier
parents:
5618
diff
changeset
|
1417 && (l=ff_mov_iso639_to_lang(&t2->key[len2-3], 1)) >= 0) { |
4587
b41ab5937218
movenc: add muxing of language along with metadata tags when available
aurel
parents:
4586
diff
changeset
|
1418 lang = l; |
b41ab5937218
movenc: add muxing of language along with metadata tags when available
aurel
parents:
4586
diff
changeset
|
1419 break; |
b41ab5937218
movenc: add muxing of language along with metadata tags when available
aurel
parents:
4586
diff
changeset
|
1420 } |
b41ab5937218
movenc: add muxing of language along with metadata tags when available
aurel
parents:
4586
diff
changeset
|
1421 } |
b41ab5937218
movenc: add muxing of language along with metadata tags when available
aurel
parents:
4586
diff
changeset
|
1422 return mov_write_string_tag(pb, name, t->value, lang, long_style); |
513
2b4edca40885
iTunes metadata encoding support patch by (Patrice Bensoussan <patrice.bensoussan at free dot fr>)
michael
parents:
505
diff
changeset
|
1423 } |
2b4edca40885
iTunes metadata encoding support patch by (Patrice Bensoussan <patrice.bensoussan at free dot fr>)
michael
parents:
505
diff
changeset
|
1424 |
2b4edca40885
iTunes metadata encoding support patch by (Patrice Bensoussan <patrice.bensoussan at free dot fr>)
michael
parents:
505
diff
changeset
|
1425 /* iTunes track number */ |
4609
065557d6fffb
Rename movenc.c MOVContext to MOVMuxContext, since MOVContext is already used
rbultje
parents:
4587
diff
changeset
|
1426 static int mov_write_trkn_tag(ByteIOContext *pb, MOVMuxContext *mov, |
513
2b4edca40885
iTunes metadata encoding support patch by (Patrice Bensoussan <patrice.bensoussan at free dot fr>)
michael
parents:
505
diff
changeset
|
1427 AVFormatContext *s) |
2b4edca40885
iTunes metadata encoding support patch by (Patrice Bensoussan <patrice.bensoussan at free dot fr>)
michael
parents:
505
diff
changeset
|
1428 { |
4584 | 1429 AVMetadataTag *t = av_metadata_get(s->metadata, "track", NULL, 0); |
1430 int size = 0, track = t ? atoi(t->value) : 0; | |
1431 if (track) { | |
5947
8b59caee931c
Predicting the size of the hdlr, string data and trkn tags in the MOV muxer
thardin
parents:
5913
diff
changeset
|
1432 put_be32(pb, 32); /* size */ |
513
2b4edca40885
iTunes metadata encoding support patch by (Patrice Bensoussan <patrice.bensoussan at free dot fr>)
michael
parents:
505
diff
changeset
|
1433 put_tag(pb, "trkn"); |
5947
8b59caee931c
Predicting the size of the hdlr, string data and trkn tags in the MOV muxer
thardin
parents:
5913
diff
changeset
|
1434 put_be32(pb, 24); /* size */ |
513
2b4edca40885
iTunes metadata encoding support patch by (Patrice Bensoussan <patrice.bensoussan at free dot fr>)
michael
parents:
505
diff
changeset
|
1435 put_tag(pb, "data"); |
2b4edca40885
iTunes metadata encoding support patch by (Patrice Bensoussan <patrice.bensoussan at free dot fr>)
michael
parents:
505
diff
changeset
|
1436 put_be32(pb, 0); // 8 bytes empty |
2b4edca40885
iTunes metadata encoding support patch by (Patrice Bensoussan <patrice.bensoussan at free dot fr>)
michael
parents:
505
diff
changeset
|
1437 put_be32(pb, 0); |
2b4edca40885
iTunes metadata encoding support patch by (Patrice Bensoussan <patrice.bensoussan at free dot fr>)
michael
parents:
505
diff
changeset
|
1438 put_be16(pb, 0); // empty |
4584 | 1439 put_be16(pb, track); // track number |
513
2b4edca40885
iTunes metadata encoding support patch by (Patrice Bensoussan <patrice.bensoussan at free dot fr>)
michael
parents:
505
diff
changeset
|
1440 put_be16(pb, 0); // total track number |
2b4edca40885
iTunes metadata encoding support patch by (Patrice Bensoussan <patrice.bensoussan at free dot fr>)
michael
parents:
505
diff
changeset
|
1441 put_be16(pb, 0); // empty |
5947
8b59caee931c
Predicting the size of the hdlr, string data and trkn tags in the MOV muxer
thardin
parents:
5913
diff
changeset
|
1442 size = 32; |
513
2b4edca40885
iTunes metadata encoding support patch by (Patrice Bensoussan <patrice.bensoussan at free dot fr>)
michael
parents:
505
diff
changeset
|
1443 } |
2b4edca40885
iTunes metadata encoding support patch by (Patrice Bensoussan <patrice.bensoussan at free dot fr>)
michael
parents:
505
diff
changeset
|
1444 return size; |
2b4edca40885
iTunes metadata encoding support patch by (Patrice Bensoussan <patrice.bensoussan at free dot fr>)
michael
parents:
505
diff
changeset
|
1445 } |
2b4edca40885
iTunes metadata encoding support patch by (Patrice Bensoussan <patrice.bensoussan at free dot fr>)
michael
parents:
505
diff
changeset
|
1446 |
2b4edca40885
iTunes metadata encoding support patch by (Patrice Bensoussan <patrice.bensoussan at free dot fr>)
michael
parents:
505
diff
changeset
|
1447 /* iTunes meta data list */ |
4609
065557d6fffb
Rename movenc.c MOVContext to MOVMuxContext, since MOVContext is already used
rbultje
parents:
4587
diff
changeset
|
1448 static int mov_write_ilst_tag(ByteIOContext *pb, MOVMuxContext *mov, |
513
2b4edca40885
iTunes metadata encoding support patch by (Patrice Bensoussan <patrice.bensoussan at free dot fr>)
michael
parents:
505
diff
changeset
|
1449 AVFormatContext *s) |
2b4edca40885
iTunes metadata encoding support patch by (Patrice Bensoussan <patrice.bensoussan at free dot fr>)
michael
parents:
505
diff
changeset
|
1450 { |
3973
549a09cf23fe
Remove offset_t typedef and use int64_t directly instead.
diego
parents:
3909
diff
changeset
|
1451 int64_t pos = url_ftell(pb); |
513
2b4edca40885
iTunes metadata encoding support patch by (Patrice Bensoussan <patrice.bensoussan at free dot fr>)
michael
parents:
505
diff
changeset
|
1452 put_be32(pb, 0); /* size */ |
2b4edca40885
iTunes metadata encoding support patch by (Patrice Bensoussan <patrice.bensoussan at free dot fr>)
michael
parents:
505
diff
changeset
|
1453 put_tag(pb, "ilst"); |
4584 | 1454 mov_write_string_metadata(s, pb, "\251nam", "title" , 1); |
6040
2bab410094e0
change author metadata to artist in mov de/muxer
bcoudurier
parents:
6013
diff
changeset
|
1455 mov_write_string_metadata(s, pb, "\251ART", "artist" , 1); |
5492
2aecc666c976
Add support for these widely-used iTunes metadata fields: Album Artist,
melanson
parents:
5394
diff
changeset
|
1456 mov_write_string_metadata(s, pb, "aART", "album_artist", 1); |
5381
b54fa3ff2f61
MOV: Fix writing \251wrt metadata (r20453 only fixed the demuxer)
conrad
parents:
5375
diff
changeset
|
1457 mov_write_string_metadata(s, pb, "\251wrt", "composer" , 1); |
4584 | 1458 mov_write_string_metadata(s, pb, "\251alb", "album" , 1); |
5618
27fd77f20a89
Add a list of generic tags and change demuxers to follow it.
pross
parents:
5556
diff
changeset
|
1459 mov_write_string_metadata(s, pb, "\251day", "date" , 1); |
4587
b41ab5937218
movenc: add muxing of language along with metadata tags when available
aurel
parents:
4586
diff
changeset
|
1460 mov_write_string_tag(pb, "\251too", LIBAVFORMAT_IDENT, 0, 1); |
4584 | 1461 mov_write_string_metadata(s, pb, "\251cmt", "comment" , 1); |
1462 mov_write_string_metadata(s, pb, "\251gen", "genre" , 1); | |
1463 mov_write_string_metadata(s, pb, "\251cpy", "copyright", 1); | |
5492
2aecc666c976
Add support for these widely-used iTunes metadata fields: Album Artist,
melanson
parents:
5394
diff
changeset
|
1464 mov_write_string_metadata(s, pb, "\251grp", "grouping" , 1); |
2aecc666c976
Add support for these widely-used iTunes metadata fields: Album Artist,
melanson
parents:
5394
diff
changeset
|
1465 mov_write_string_metadata(s, pb, "\251lyr", "lyrics" , 1); |
5382 | 1466 mov_write_string_metadata(s, pb, "desc", "description",1); |
1467 mov_write_string_metadata(s, pb, "ldes", "synopsis" , 1); | |
1468 mov_write_string_metadata(s, pb, "tvsh", "show" , 1); | |
1469 mov_write_string_metadata(s, pb, "tven", "episode_id",1); | |
1470 mov_write_string_metadata(s, pb, "tvnn", "network" , 1); | |
513
2b4edca40885
iTunes metadata encoding support patch by (Patrice Bensoussan <patrice.bensoussan at free dot fr>)
michael
parents:
505
diff
changeset
|
1471 mov_write_trkn_tag(pb, mov, s); |
2b4edca40885
iTunes metadata encoding support patch by (Patrice Bensoussan <patrice.bensoussan at free dot fr>)
michael
parents:
505
diff
changeset
|
1472 return updateSize(pb, pos); |
2b4edca40885
iTunes metadata encoding support patch by (Patrice Bensoussan <patrice.bensoussan at free dot fr>)
michael
parents:
505
diff
changeset
|
1473 } |
2b4edca40885
iTunes metadata encoding support patch by (Patrice Bensoussan <patrice.bensoussan at free dot fr>)
michael
parents:
505
diff
changeset
|
1474 |
2b4edca40885
iTunes metadata encoding support patch by (Patrice Bensoussan <patrice.bensoussan at free dot fr>)
michael
parents:
505
diff
changeset
|
1475 /* iTunes meta data tag */ |
4609
065557d6fffb
Rename movenc.c MOVContext to MOVMuxContext, since MOVContext is already used
rbultje
parents:
4587
diff
changeset
|
1476 static int mov_write_meta_tag(ByteIOContext *pb, MOVMuxContext *mov, |
513
2b4edca40885
iTunes metadata encoding support patch by (Patrice Bensoussan <patrice.bensoussan at free dot fr>)
michael
parents:
505
diff
changeset
|
1477 AVFormatContext *s) |
2b4edca40885
iTunes metadata encoding support patch by (Patrice Bensoussan <patrice.bensoussan at free dot fr>)
michael
parents:
505
diff
changeset
|
1478 { |
2b4edca40885
iTunes metadata encoding support patch by (Patrice Bensoussan <patrice.bensoussan at free dot fr>)
michael
parents:
505
diff
changeset
|
1479 int size = 0; |
4585 | 1480 int64_t pos = url_ftell(pb); |
1481 put_be32(pb, 0); /* size */ | |
1482 put_tag(pb, "meta"); | |
1483 put_be32(pb, 0); | |
1484 mov_write_itunes_hdlr_tag(pb, mov, s); | |
1485 mov_write_ilst_tag(pb, mov, s); | |
1486 size = updateSize(pb, pos); | |
513
2b4edca40885
iTunes metadata encoding support patch by (Patrice Bensoussan <patrice.bensoussan at free dot fr>)
michael
parents:
505
diff
changeset
|
1487 return size; |
2b4edca40885
iTunes metadata encoding support patch by (Patrice Bensoussan <patrice.bensoussan at free dot fr>)
michael
parents:
505
diff
changeset
|
1488 } |
885 | 1489 |
3459
a79f6237c3d2
move utf8 code before udta func, will be used by 3gp tags
bcoudurier
parents:
3458
diff
changeset
|
1490 static int utf8len(const uint8_t *b) |
a79f6237c3d2
move utf8 code before udta func, will be used by 3gp tags
bcoudurier
parents:
3458
diff
changeset
|
1491 { |
a79f6237c3d2
move utf8 code before udta func, will be used by 3gp tags
bcoudurier
parents:
3458
diff
changeset
|
1492 int len=0; |
a79f6237c3d2
move utf8 code before udta func, will be used by 3gp tags
bcoudurier
parents:
3458
diff
changeset
|
1493 int val; |
a79f6237c3d2
move utf8 code before udta func, will be used by 3gp tags
bcoudurier
parents:
3458
diff
changeset
|
1494 while(*b){ |
a79f6237c3d2
move utf8 code before udta func, will be used by 3gp tags
bcoudurier
parents:
3458
diff
changeset
|
1495 GET_UTF8(val, *b++, return -1;) |
a79f6237c3d2
move utf8 code before udta func, will be used by 3gp tags
bcoudurier
parents:
3458
diff
changeset
|
1496 len++; |
a79f6237c3d2
move utf8 code before udta func, will be used by 3gp tags
bcoudurier
parents:
3458
diff
changeset
|
1497 } |
a79f6237c3d2
move utf8 code before udta func, will be used by 3gp tags
bcoudurier
parents:
3458
diff
changeset
|
1498 return len; |
a79f6237c3d2
move utf8 code before udta func, will be used by 3gp tags
bcoudurier
parents:
3458
diff
changeset
|
1499 } |
a79f6237c3d2
move utf8 code before udta func, will be used by 3gp tags
bcoudurier
parents:
3458
diff
changeset
|
1500 |
a79f6237c3d2
move utf8 code before udta func, will be used by 3gp tags
bcoudurier
parents:
3458
diff
changeset
|
1501 static int ascii_to_wc(ByteIOContext *pb, const uint8_t *b) |
a79f6237c3d2
move utf8 code before udta func, will be used by 3gp tags
bcoudurier
parents:
3458
diff
changeset
|
1502 { |
a79f6237c3d2
move utf8 code before udta func, will be used by 3gp tags
bcoudurier
parents:
3458
diff
changeset
|
1503 int val; |
a79f6237c3d2
move utf8 code before udta func, will be used by 3gp tags
bcoudurier
parents:
3458
diff
changeset
|
1504 while(*b){ |
a79f6237c3d2
move utf8 code before udta func, will be used by 3gp tags
bcoudurier
parents:
3458
diff
changeset
|
1505 GET_UTF8(val, *b++, return -1;) |
a79f6237c3d2
move utf8 code before udta func, will be used by 3gp tags
bcoudurier
parents:
3458
diff
changeset
|
1506 put_be16(pb, val); |
a79f6237c3d2
move utf8 code before udta func, will be used by 3gp tags
bcoudurier
parents:
3458
diff
changeset
|
1507 } |
a79f6237c3d2
move utf8 code before udta func, will be used by 3gp tags
bcoudurier
parents:
3458
diff
changeset
|
1508 put_be16(pb, 0x00); |
a79f6237c3d2
move utf8 code before udta func, will be used by 3gp tags
bcoudurier
parents:
3458
diff
changeset
|
1509 return 0; |
a79f6237c3d2
move utf8 code before udta func, will be used by 3gp tags
bcoudurier
parents:
3458
diff
changeset
|
1510 } |
a79f6237c3d2
move utf8 code before udta func, will be used by 3gp tags
bcoudurier
parents:
3458
diff
changeset
|
1511 |
a79f6237c3d2
move utf8 code before udta func, will be used by 3gp tags
bcoudurier
parents:
3458
diff
changeset
|
1512 static uint16_t language_code(const char *str) |
a79f6237c3d2
move utf8 code before udta func, will be used by 3gp tags
bcoudurier
parents:
3458
diff
changeset
|
1513 { |
a79f6237c3d2
move utf8 code before udta func, will be used by 3gp tags
bcoudurier
parents:
3458
diff
changeset
|
1514 return (((str[0]-0x60) & 0x1F) << 10) + (((str[1]-0x60) & 0x1F) << 5) + ((str[2]-0x60) & 0x1F); |
a79f6237c3d2
move utf8 code before udta func, will be used by 3gp tags
bcoudurier
parents:
3458
diff
changeset
|
1515 } |
a79f6237c3d2
move utf8 code before udta func, will be used by 3gp tags
bcoudurier
parents:
3458
diff
changeset
|
1516 |
3460 | 1517 static int mov_write_3gp_udta_tag(ByteIOContext *pb, AVFormatContext *s, |
1518 const char *tag, const char *str) | |
1519 { | |
3973
549a09cf23fe
Remove offset_t typedef and use int64_t directly instead.
diego
parents:
3909
diff
changeset
|
1520 int64_t pos = url_ftell(pb); |
4584 | 1521 AVMetadataTag *t = av_metadata_get(s->metadata, str, NULL, 0); |
1522 if (!t || !utf8len(t->value)) | |
3460 | 1523 return 0; |
1524 put_be32(pb, 0); /* size */ | |
1525 put_tag (pb, tag); /* type */ | |
1526 put_be32(pb, 0); /* version + flags */ | |
1527 if (!strcmp(tag, "yrrc")) | |
4584 | 1528 put_be16(pb, atoi(t->value)); |
3460 | 1529 else { |
1530 put_be16(pb, language_code("eng")); /* language */ | |
4996
9d88db925e05
fix 3gp metadata, write strings in UTF8, patch by Larbi Joubala, larbi dot joubala at resonate-mp4 dot com
bcoudurier
parents:
4953
diff
changeset
|
1531 put_buffer(pb, t->value, strlen(t->value)+1); /* UTF8 string value */ |
4584 | 1532 if (!strcmp(tag, "albm") && |
6041 | 1533 (t = av_metadata_get(s->metadata, "track", NULL, 0))) |
4584 | 1534 put_byte(pb, atoi(t->value)); |
3460 | 1535 } |
1536 return updateSize(pb, pos); | |
1537 } | |
1538 | |
5974 | 1539 static int mov_write_chpl_tag(ByteIOContext *pb, AVFormatContext *s) |
1540 { | |
1541 int64_t pos = url_ftell(pb); | |
1542 int i, nb_chapters = FFMIN(s->nb_chapters, 255); | |
1543 | |
1544 put_be32(pb, 0); // size | |
1545 put_tag (pb, "chpl"); | |
1546 put_be32(pb, 0x01000000); // version + flags | |
1547 put_be32(pb, 0); // unknown | |
1548 put_byte(pb, nb_chapters); | |
1549 | |
1550 for (i = 0; i < nb_chapters; i++) { | |
1551 AVChapter *c = s->chapters[i]; | |
1552 AVMetadataTag *t; | |
1553 put_be64(pb, av_rescale_q(c->start, c->time_base, (AVRational){1,10000000})); | |
1554 | |
1555 if ((t = av_metadata_get(c->metadata, "title", NULL, 0))) { | |
1556 int len = FFMIN(strlen(t->value), 255); | |
1557 put_byte(pb, len); | |
1558 put_buffer(pb, t->value, len); | |
1559 } else | |
1560 put_byte(pb, 0); | |
1561 } | |
1562 return updateSize(pb, pos); | |
1563 } | |
1564 | |
4609
065557d6fffb
Rename movenc.c MOVContext to MOVMuxContext, since MOVContext is already used
rbultje
parents:
4587
diff
changeset
|
1565 static int mov_write_udta_tag(ByteIOContext *pb, MOVMuxContext *mov, |
365
4ae9fac22a5d
AAC support in mov, correct aspect ratio support and user data support patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
342
diff
changeset
|
1566 AVFormatContext *s) |
4ae9fac22a5d
AAC support in mov, correct aspect ratio support and user data support patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
342
diff
changeset
|
1567 { |
4584 | 1568 ByteIOContext *pb_buf; |
1569 int i, ret, size; | |
1570 uint8_t *buf; | |
2668 | 1571 |
3450
0e53bfbd3a1c
rework udta handling, if any track set bitexact, don't write any metadata
bcoudurier
parents:
3449
diff
changeset
|
1572 for (i = 0; i < s->nb_streams; i++) |
0e53bfbd3a1c
rework udta handling, if any track set bitexact, don't write any metadata
bcoudurier
parents:
3449
diff
changeset
|
1573 if (mov->tracks[i].enc->flags & CODEC_FLAG_BITEXACT) { |
4584 | 1574 return 0; |
3450
0e53bfbd3a1c
rework udta handling, if any track set bitexact, don't write any metadata
bcoudurier
parents:
3449
diff
changeset
|
1575 } |
0e53bfbd3a1c
rework udta handling, if any track set bitexact, don't write any metadata
bcoudurier
parents:
3449
diff
changeset
|
1576 |
4584 | 1577 ret = url_open_dyn_buf(&pb_buf); |
1578 if(ret < 0) | |
1579 return ret; | |
365
4ae9fac22a5d
AAC support in mov, correct aspect ratio support and user data support patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
342
diff
changeset
|
1580 |
3466 | 1581 if (mov->mode & MODE_3GP) { |
6042 | 1582 mov_write_3gp_udta_tag(pb_buf, s, "perf", "artist"); |
4584 | 1583 mov_write_3gp_udta_tag(pb_buf, s, "titl", "title"); |
1584 mov_write_3gp_udta_tag(pb_buf, s, "auth", "author"); | |
1585 mov_write_3gp_udta_tag(pb_buf, s, "gnre", "genre"); | |
1586 mov_write_3gp_udta_tag(pb_buf, s, "dscp", "comment"); | |
1587 mov_write_3gp_udta_tag(pb_buf, s, "albm", "album"); | |
1588 mov_write_3gp_udta_tag(pb_buf, s, "cprt", "copyright"); | |
5618
27fd77f20a89
Add a list of generic tags and change demuxers to follow it.
pross
parents:
5556
diff
changeset
|
1589 mov_write_3gp_udta_tag(pb_buf, s, "yrrc", "date"); |
3464 | 1590 } else if (mov->mode == MODE_MOV) { // the title field breaks gtkpod with mp4 and my suspicion is that stuff is not valid in mp4 |
4584 | 1591 mov_write_string_metadata(s, pb_buf, "\251nam", "title" , 0); |
1592 mov_write_string_metadata(s, pb_buf, "\251aut", "author" , 0); | |
1593 mov_write_string_metadata(s, pb_buf, "\251alb", "album" , 0); | |
5618
27fd77f20a89
Add a list of generic tags and change demuxers to follow it.
pross
parents:
5556
diff
changeset
|
1594 mov_write_string_metadata(s, pb_buf, "\251day", "date" , 0); |
4587
b41ab5937218
movenc: add muxing of language along with metadata tags when available
aurel
parents:
4586
diff
changeset
|
1595 mov_write_string_tag(pb_buf, "\251enc", LIBAVFORMAT_IDENT, 0, 0); |
4584 | 1596 mov_write_string_metadata(s, pb_buf, "\251des", "comment" , 0); |
1597 mov_write_string_metadata(s, pb_buf, "\251gen", "genre" , 0); | |
1598 mov_write_string_metadata(s, pb_buf, "\251cpy", "copyright" , 0); | |
3460 | 1599 } else { |
3463
91a688e89d31
don't write double sets of metadata in mov, only write usual ones
bcoudurier
parents:
3461
diff
changeset
|
1600 /* iTunes meta data */ |
4584 | 1601 mov_write_meta_tag(pb_buf, mov, s); |
3460 | 1602 } |
4584 | 1603 |
5974 | 1604 if (s->nb_chapters) |
1605 mov_write_chpl_tag(pb_buf, s); | |
1606 | |
4584 | 1607 if ((size = url_close_dyn_buf(pb_buf, &buf)) > 0) { |
1608 put_be32(pb, size+8); | |
1609 put_tag(pb, "udta"); | |
1610 put_buffer(pb, buf, size); | |
1611 av_free(buf); | |
2668 | 1612 } |
1613 | |
1614 return 0; | |
365
4ae9fac22a5d
AAC support in mov, correct aspect ratio support and user data support patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
342
diff
changeset
|
1615 } |
4ae9fac22a5d
AAC support in mov, correct aspect ratio support and user data support patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
342
diff
changeset
|
1616 |
3457 | 1617 static void mov_write_psp_udta_tag(ByteIOContext *pb, |
3456 | 1618 const char *str, const char *lang, int type) |
1619 { | |
1620 int len = utf8len(str)+1; | |
1621 if(len<=0) | |
3457 | 1622 return; |
3456 | 1623 put_be16(pb, len*2+10); /* size */ |
1624 put_be32(pb, type); /* type */ | |
1625 put_be16(pb, language_code(lang)); /* language */ | |
1626 put_be16(pb, 0x01); /* ? */ | |
1627 ascii_to_wc(pb, str); | |
1628 } | |
1629 | |
3446 | 1630 static int mov_write_uuidusmt_tag(ByteIOContext *pb, AVFormatContext *s) |
911
343ddd5b793c
Fix for title field in PSP compatible mp4 files. Patch by
banan
parents:
910
diff
changeset
|
1631 { |
4584 | 1632 AVMetadataTag *title = av_metadata_get(s->metadata, "title", NULL, 0); |
3973
549a09cf23fe
Remove offset_t typedef and use int64_t directly instead.
diego
parents:
3909
diff
changeset
|
1633 int64_t pos, pos2; |
911
343ddd5b793c
Fix for title field in PSP compatible mp4 files. Patch by
banan
parents:
910
diff
changeset
|
1634 |
4584 | 1635 if (title) { |
911
343ddd5b793c
Fix for title field in PSP compatible mp4 files. Patch by
banan
parents:
910
diff
changeset
|
1636 pos = url_ftell(pb); |
343ddd5b793c
Fix for title field in PSP compatible mp4 files. Patch by
banan
parents:
910
diff
changeset
|
1637 put_be32(pb, 0); /* size placeholder*/ |
343ddd5b793c
Fix for title field in PSP compatible mp4 files. Patch by
banan
parents:
910
diff
changeset
|
1638 put_tag(pb, "uuid"); |
343ddd5b793c
Fix for title field in PSP compatible mp4 files. Patch by
banan
parents:
910
diff
changeset
|
1639 put_tag(pb, "USMT"); |
3024
19de43025f0f
cosmetics, remove whitespaces before and after parenthesis
bcoudurier
parents:
3010
diff
changeset
|
1640 put_be32(pb, 0x21d24fce); /* 96 bit UUID */ |
19de43025f0f
cosmetics, remove whitespaces before and after parenthesis
bcoudurier
parents:
3010
diff
changeset
|
1641 put_be32(pb, 0xbb88695c); |
19de43025f0f
cosmetics, remove whitespaces before and after parenthesis
bcoudurier
parents:
3010
diff
changeset
|
1642 put_be32(pb, 0xfac9c740); |
911
343ddd5b793c
Fix for title field in PSP compatible mp4 files. Patch by
banan
parents:
910
diff
changeset
|
1643 |
3457 | 1644 pos2 = url_ftell(pb); |
911
343ddd5b793c
Fix for title field in PSP compatible mp4 files. Patch by
banan
parents:
910
diff
changeset
|
1645 put_be32(pb, 0); /* size placeholder*/ |
343ddd5b793c
Fix for title field in PSP compatible mp4 files. Patch by
banan
parents:
910
diff
changeset
|
1646 put_tag(pb, "MTDT"); |
1097
acabd3a4b903
fixing title on PSP (0x60 != 'a') someone needs a 10x10km ascii table ...
michael
parents:
1096
diff
changeset
|
1647 put_be16(pb, 4); |
911
343ddd5b793c
Fix for title field in PSP compatible mp4 files. Patch by
banan
parents:
910
diff
changeset
|
1648 |
1097
acabd3a4b903
fixing title on PSP (0x60 != 'a') someone needs a 10x10km ascii table ...
michael
parents:
1096
diff
changeset
|
1649 // ? |
acabd3a4b903
fixing title on PSP (0x60 != 'a') someone needs a 10x10km ascii table ...
michael
parents:
1096
diff
changeset
|
1650 put_be16(pb, 0x0C); /* size */ |
acabd3a4b903
fixing title on PSP (0x60 != 'a') someone needs a 10x10km ascii table ...
michael
parents:
1096
diff
changeset
|
1651 put_be32(pb, 0x0B); /* type */ |
acabd3a4b903
fixing title on PSP (0x60 != 'a') someone needs a 10x10km ascii table ...
michael
parents:
1096
diff
changeset
|
1652 put_be16(pb, language_code("und")); /* language */ |
acabd3a4b903
fixing title on PSP (0x60 != 'a') someone needs a 10x10km ascii table ...
michael
parents:
1096
diff
changeset
|
1653 put_be16(pb, 0x0); /* ? */ |
acabd3a4b903
fixing title on PSP (0x60 != 'a') someone needs a 10x10km ascii table ...
michael
parents:
1096
diff
changeset
|
1654 put_be16(pb, 0x021C); /* data */ |
acabd3a4b903
fixing title on PSP (0x60 != 'a') someone needs a 10x10km ascii table ...
michael
parents:
1096
diff
changeset
|
1655 |
3457 | 1656 mov_write_psp_udta_tag(pb, LIBAVCODEC_IDENT, "eng", 0x04); |
4584 | 1657 mov_write_psp_udta_tag(pb, title->value, "eng", 0x01); |
3457 | 1658 // snprintf(dt,32,"%04d/%02d/%02d %02d:%02d:%02d",t_st->tm_year+1900,t_st->tm_mon+1,t_st->tm_mday,t_st->tm_hour,t_st->tm_min,t_st->tm_sec); |
1659 mov_write_psp_udta_tag(pb, "2006/04/01 11:11:11", "und", 0x03); | |
1660 | |
1661 updateSize(pb, pos2); | |
1662 return updateSize(pb, pos); | |
911
343ddd5b793c
Fix for title field in PSP compatible mp4 files. Patch by
banan
parents:
910
diff
changeset
|
1663 } |
343ddd5b793c
Fix for title field in PSP compatible mp4 files. Patch by
banan
parents:
910
diff
changeset
|
1664 |
3457 | 1665 return 0; |
911
343ddd5b793c
Fix for title field in PSP compatible mp4 files. Patch by
banan
parents:
910
diff
changeset
|
1666 } |
343ddd5b793c
Fix for title field in PSP compatible mp4 files. Patch by
banan
parents:
910
diff
changeset
|
1667 |
4609
065557d6fffb
Rename movenc.c MOVContext to MOVMuxContext, since MOVContext is already used
rbultje
parents:
4587
diff
changeset
|
1668 static int mov_write_moov_tag(ByteIOContext *pb, MOVMuxContext *mov, |
365
4ae9fac22a5d
AAC support in mov, correct aspect ratio support and user data support patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
342
diff
changeset
|
1669 AVFormatContext *s) |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1670 { |
909
69e06b6f91a3
>4gb fixes by (Dirk Musfeldt | d.musfeldt meilenstein de)
michael
parents:
896
diff
changeset
|
1671 int i; |
3973
549a09cf23fe
Remove offset_t typedef and use int64_t directly instead.
diego
parents:
3909
diff
changeset
|
1672 int64_t pos = url_ftell(pb); |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1673 put_be32(pb, 0); /* size placeholder*/ |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1674 put_tag(pb, "moov"); |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1675 |
1131 | 1676 for (i=0; i<mov->nb_streams; i++) { |
298
0b2eed7b1210
movenc patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
286
diff
changeset
|
1677 if(mov->tracks[i].entry <= 0) continue; |
0b2eed7b1210
movenc patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
286
diff
changeset
|
1678 |
0b2eed7b1210
movenc patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
286
diff
changeset
|
1679 mov->tracks[i].time = mov->time; |
0b2eed7b1210
movenc patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
286
diff
changeset
|
1680 mov->tracks[i].trackID = i+1; |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1681 } |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1682 |
5993 | 1683 if (mov->chapter_track) |
1684 for (i=0; i<s->nb_streams; i++) { | |
1685 mov->tracks[i].tref_tag = MKTAG('c','h','a','p'); | |
1686 mov->tracks[i].tref_id = mov->tracks[mov->chapter_track].trackID; | |
1687 } | |
6013
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
1688 for (i = 0; i < mov->nb_streams; i++) { |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
1689 if (mov->tracks[i].tag == MKTAG('r','t','p',' ')) { |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
1690 mov->tracks[i].tref_tag = MKTAG('h','i','n','t'); |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
1691 mov->tracks[i].tref_id = |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
1692 mov->tracks[mov->tracks[i].src_track].trackID; |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
1693 } |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
1694 } |
5993 | 1695 |
238
3519903c6c2a
mov/mp4 muxer cleanup (mostly cosmetics/simplifications & global header fix)
michaelni
parents:
202
diff
changeset
|
1696 mov_write_mvhd_tag(pb, mov); |
3519903c6c2a
mov/mp4 muxer cleanup (mostly cosmetics/simplifications & global header fix)
michaelni
parents:
202
diff
changeset
|
1697 //mov_write_iods_tag(pb, mov); |
1131 | 1698 for (i=0; i<mov->nb_streams; i++) { |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1699 if(mov->tracks[i].entry > 0) { |
5993 | 1700 mov_write_trak_tag(pb, &(mov->tracks[i]), i < s->nb_streams ? s->streams[i] : NULL); |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1701 } |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1702 } |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1703 |
911
343ddd5b793c
Fix for title field in PSP compatible mp4 files. Patch by
banan
parents:
910
diff
changeset
|
1704 if (mov->mode == MODE_PSP) |
343ddd5b793c
Fix for title field in PSP compatible mp4 files. Patch by
banan
parents:
910
diff
changeset
|
1705 mov_write_uuidusmt_tag(pb, s); |
3460 | 1706 else |
1441
ad3b03b7b142
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
1438
diff
changeset
|
1707 mov_write_udta_tag(pb, mov, s); |
365
4ae9fac22a5d
AAC support in mov, correct aspect ratio support and user data support patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
342
diff
changeset
|
1708 |
238
3519903c6c2a
mov/mp4 muxer cleanup (mostly cosmetics/simplifications & global header fix)
michaelni
parents:
202
diff
changeset
|
1709 return updateSize(pb, pos); |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1710 } |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1711 |
4609
065557d6fffb
Rename movenc.c MOVContext to MOVMuxContext, since MOVContext is already used
rbultje
parents:
4587
diff
changeset
|
1712 static int mov_write_mdat_tag(ByteIOContext *pb, MOVMuxContext *mov) |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1713 { |
909
69e06b6f91a3
>4gb fixes by (Dirk Musfeldt | d.musfeldt meilenstein de)
michael
parents:
896
diff
changeset
|
1714 put_be32(pb, 8); // placeholder for extended size field (64 bit) |
1273
07137c477f09
wide atom is only defined in mov, use free for mp4/3gp
bcoudurier
parents:
1250
diff
changeset
|
1715 put_tag(pb, mov->mode == MODE_MOV ? "wide" : "free"); |
909
69e06b6f91a3
>4gb fixes by (Dirk Musfeldt | d.musfeldt meilenstein de)
michael
parents:
896
diff
changeset
|
1716 |
885 | 1717 mov->mdat_pos = url_ftell(pb); |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1718 put_be32(pb, 0); /* size placeholder*/ |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1719 put_tag(pb, "mdat"); |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1720 return 0; |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1721 } |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1722 |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1723 /* TODO: This needs to be more general */ |
3471 | 1724 static int mov_write_ftyp_tag(ByteIOContext *pb, AVFormatContext *s) |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1725 { |
4609
065557d6fffb
Rename movenc.c MOVContext to MOVMuxContext, since MOVContext is already used
rbultje
parents:
4587
diff
changeset
|
1726 MOVMuxContext *mov = s->priv_data; |
3973
549a09cf23fe
Remove offset_t typedef and use int64_t directly instead.
diego
parents:
3909
diff
changeset
|
1727 int64_t pos = url_ftell(pb); |
3472 | 1728 int has_h264 = 0, has_video = 0; |
3476 | 1729 int minor = 0x200; |
3458 | 1730 int i; |
365
4ae9fac22a5d
AAC support in mov, correct aspect ratio support and user data support patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
342
diff
changeset
|
1731 |
3470
d8bbf9265f03
put avc1 brand in compat list when h264 is present
bcoudurier
parents:
3469
diff
changeset
|
1732 for (i = 0; i < s->nb_streams; i++) { |
d8bbf9265f03
put avc1 brand in compat list when h264 is present
bcoudurier
parents:
3469
diff
changeset
|
1733 AVStream *st = s->streams[i]; |
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5792
diff
changeset
|
1734 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) |
3472 | 1735 has_video = 1; |
3470
d8bbf9265f03
put avc1 brand in compat list when h264 is present
bcoudurier
parents:
3469
diff
changeset
|
1736 if (st->codec->codec_id == CODEC_ID_H264) |
d8bbf9265f03
put avc1 brand in compat list when h264 is present
bcoudurier
parents:
3469
diff
changeset
|
1737 has_h264 = 1; |
d8bbf9265f03
put avc1 brand in compat list when h264 is present
bcoudurier
parents:
3469
diff
changeset
|
1738 } |
d8bbf9265f03
put avc1 brand in compat list when h264 is present
bcoudurier
parents:
3469
diff
changeset
|
1739 |
3467 | 1740 put_be32(pb, 0); /* size */ |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1741 put_tag(pb, "ftyp"); |
298
0b2eed7b1210
movenc patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
286
diff
changeset
|
1742 |
3476 | 1743 if (mov->mode == MODE_3GP) { |
1744 put_tag(pb, has_h264 ? "3gp6" : "3gp4"); | |
1745 minor = has_h264 ? 0x100 : 0x200; | |
1746 } else if (mov->mode & MODE_3G2) { | |
1747 put_tag(pb, has_h264 ? "3g2b" : "3g2a"); | |
1748 minor = has_h264 ? 0x20000 : 0x10000; | |
1749 }else if (mov->mode == MODE_PSP) | |
659
6d7c0e6d929e
Sony PSP variation of MP4 patch by <tjcannell AT blueyonder DOT co DOT uk>
mmu_man
parents:
657
diff
changeset
|
1750 put_tag(pb, "MSNV"); |
3458 | 1751 else if (mov->mode == MODE_MP4) |
990
f7394f02e95a
ftyp patch by (Baptiste COUDURIER <baptiste.coudurier smartjog com)
michael
parents:
987
diff
changeset
|
1752 put_tag(pb, "isom"); |
3472 | 1753 else if (mov->mode == MODE_IPOD) |
1754 put_tag(pb, has_video ? "M4V ":"M4A "); | |
1755 else | |
990
f7394f02e95a
ftyp patch by (Baptiste COUDURIER <baptiste.coudurier smartjog com)
michael
parents:
987
diff
changeset
|
1756 put_tag(pb, "qt "); |
298
0b2eed7b1210
movenc patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
286
diff
changeset
|
1757 |
3476 | 1758 put_be32(pb, minor); |
298
0b2eed7b1210
movenc patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
286
diff
changeset
|
1759 |
3475 | 1760 if(mov->mode == MODE_MOV) |
1761 put_tag(pb, "qt "); | |
1762 else{ | |
3468 | 1763 put_tag(pb, "isom"); |
3469 | 1764 put_tag(pb, "iso2"); |
3470
d8bbf9265f03
put avc1 brand in compat list when h264 is present
bcoudurier
parents:
3469
diff
changeset
|
1765 if(has_h264) |
d8bbf9265f03
put avc1 brand in compat list when h264 is present
bcoudurier
parents:
3469
diff
changeset
|
1766 put_tag(pb, "avc1"); |
3475 | 1767 } |
3468 | 1768 |
3024
19de43025f0f
cosmetics, remove whitespaces before and after parenthesis
bcoudurier
parents:
3010
diff
changeset
|
1769 if (mov->mode == MODE_3GP) |
3473 | 1770 put_tag(pb, has_h264 ? "3gp6":"3gp4"); |
3466 | 1771 else if (mov->mode & MODE_3G2) |
3473 | 1772 put_tag(pb, has_h264 ? "3g2b":"3g2a"); |
3024
19de43025f0f
cosmetics, remove whitespaces before and after parenthesis
bcoudurier
parents:
3010
diff
changeset
|
1773 else if (mov->mode == MODE_PSP) |
659
6d7c0e6d929e
Sony PSP variation of MP4 patch by <tjcannell AT blueyonder DOT co DOT uk>
mmu_man
parents:
657
diff
changeset
|
1774 put_tag(pb, "MSNV"); |
3458 | 1775 else if (mov->mode == MODE_MP4) |
990
f7394f02e95a
ftyp patch by (Baptiste COUDURIER <baptiste.coudurier smartjog com)
michael
parents:
987
diff
changeset
|
1776 put_tag(pb, "mp41"); |
3467 | 1777 return updateSize(pb, pos); |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1778 } |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1779 |
665
47d5b20c9aba
fix segfault by matthieu castet <castet DOT matthieu AT free DOT fr>
mmu_man
parents:
664
diff
changeset
|
1780 static void mov_write_uuidprof_tag(ByteIOContext *pb, AVFormatContext *s) |
659
6d7c0e6d929e
Sony PSP variation of MP4 patch by <tjcannell AT blueyonder DOT co DOT uk>
mmu_man
parents:
657
diff
changeset
|
1781 { |
911
343ddd5b793c
Fix for title field in PSP compatible mp4 files. Patch by
banan
parents:
910
diff
changeset
|
1782 AVCodecContext *VideoCodec = s->streams[0]->codec; |
343ddd5b793c
Fix for title field in PSP compatible mp4 files. Patch by
banan
parents:
910
diff
changeset
|
1783 AVCodecContext *AudioCodec = s->streams[1]->codec; |
343ddd5b793c
Fix for title field in PSP compatible mp4 files. Patch by
banan
parents:
910
diff
changeset
|
1784 int AudioRate = AudioCodec->sample_rate; |
343ddd5b793c
Fix for title field in PSP compatible mp4 files. Patch by
banan
parents:
910
diff
changeset
|
1785 int FrameRate = ((VideoCodec->time_base.den) * (0x10000))/ (VideoCodec->time_base.num); |
1049
23d44137105f
the PSP rejects video with too high bitrates so lets claim they arent too high ...
michael
parents:
1037
diff
changeset
|
1786 int audio_kbitrate= AudioCodec->bit_rate / 1000; |
23d44137105f
the PSP rejects video with too high bitrates so lets claim they arent too high ...
michael
parents:
1037
diff
changeset
|
1787 int video_kbitrate= FFMIN(VideoCodec->bit_rate / 1000, 800 - audio_kbitrate); |
659
6d7c0e6d929e
Sony PSP variation of MP4 patch by <tjcannell AT blueyonder DOT co DOT uk>
mmu_man
parents:
657
diff
changeset
|
1788 |
3024
19de43025f0f
cosmetics, remove whitespaces before and after parenthesis
bcoudurier
parents:
3010
diff
changeset
|
1789 put_be32(pb, 0x94); /* size */ |
659
6d7c0e6d929e
Sony PSP variation of MP4 patch by <tjcannell AT blueyonder DOT co DOT uk>
mmu_man
parents:
657
diff
changeset
|
1790 put_tag(pb, "uuid"); |
6d7c0e6d929e
Sony PSP variation of MP4 patch by <tjcannell AT blueyonder DOT co DOT uk>
mmu_man
parents:
657
diff
changeset
|
1791 put_tag(pb, "PROF"); |
6d7c0e6d929e
Sony PSP variation of MP4 patch by <tjcannell AT blueyonder DOT co DOT uk>
mmu_man
parents:
657
diff
changeset
|
1792 |
3024
19de43025f0f
cosmetics, remove whitespaces before and after parenthesis
bcoudurier
parents:
3010
diff
changeset
|
1793 put_be32(pb, 0x21d24fce); /* 96 bit UUID */ |
19de43025f0f
cosmetics, remove whitespaces before and after parenthesis
bcoudurier
parents:
3010
diff
changeset
|
1794 put_be32(pb, 0xbb88695c); |
19de43025f0f
cosmetics, remove whitespaces before and after parenthesis
bcoudurier
parents:
3010
diff
changeset
|
1795 put_be32(pb, 0xfac9c740); |
659
6d7c0e6d929e
Sony PSP variation of MP4 patch by <tjcannell AT blueyonder DOT co DOT uk>
mmu_man
parents:
657
diff
changeset
|
1796 |
3024
19de43025f0f
cosmetics, remove whitespaces before and after parenthesis
bcoudurier
parents:
3010
diff
changeset
|
1797 put_be32(pb, 0x0); /* ? */ |
19de43025f0f
cosmetics, remove whitespaces before and after parenthesis
bcoudurier
parents:
3010
diff
changeset
|
1798 put_be32(pb, 0x3); /* 3 sections ? */ |
659
6d7c0e6d929e
Sony PSP variation of MP4 patch by <tjcannell AT blueyonder DOT co DOT uk>
mmu_man
parents:
657
diff
changeset
|
1799 |
3024
19de43025f0f
cosmetics, remove whitespaces before and after parenthesis
bcoudurier
parents:
3010
diff
changeset
|
1800 put_be32(pb, 0x14); /* size */ |
659
6d7c0e6d929e
Sony PSP variation of MP4 patch by <tjcannell AT blueyonder DOT co DOT uk>
mmu_man
parents:
657
diff
changeset
|
1801 put_tag(pb, "FPRF"); |
3024
19de43025f0f
cosmetics, remove whitespaces before and after parenthesis
bcoudurier
parents:
3010
diff
changeset
|
1802 put_be32(pb, 0x0); /* ? */ |
19de43025f0f
cosmetics, remove whitespaces before and after parenthesis
bcoudurier
parents:
3010
diff
changeset
|
1803 put_be32(pb, 0x0); /* ? */ |
19de43025f0f
cosmetics, remove whitespaces before and after parenthesis
bcoudurier
parents:
3010
diff
changeset
|
1804 put_be32(pb, 0x0); /* ? */ |
659
6d7c0e6d929e
Sony PSP variation of MP4 patch by <tjcannell AT blueyonder DOT co DOT uk>
mmu_man
parents:
657
diff
changeset
|
1805 |
3024
19de43025f0f
cosmetics, remove whitespaces before and after parenthesis
bcoudurier
parents:
3010
diff
changeset
|
1806 put_be32(pb, 0x2c); /* size */ |
659
6d7c0e6d929e
Sony PSP variation of MP4 patch by <tjcannell AT blueyonder DOT co DOT uk>
mmu_man
parents:
657
diff
changeset
|
1807 put_tag(pb, "APRF"); /* audio */ |
3024
19de43025f0f
cosmetics, remove whitespaces before and after parenthesis
bcoudurier
parents:
3010
diff
changeset
|
1808 put_be32(pb, 0x0); |
19de43025f0f
cosmetics, remove whitespaces before and after parenthesis
bcoudurier
parents:
3010
diff
changeset
|
1809 put_be32(pb, 0x2); /* TrackID */ |
659
6d7c0e6d929e
Sony PSP variation of MP4 patch by <tjcannell AT blueyonder DOT co DOT uk>
mmu_man
parents:
657
diff
changeset
|
1810 put_tag(pb, "mp4a"); |
3024
19de43025f0f
cosmetics, remove whitespaces before and after parenthesis
bcoudurier
parents:
3010
diff
changeset
|
1811 put_be32(pb, 0x20f); |
19de43025f0f
cosmetics, remove whitespaces before and after parenthesis
bcoudurier
parents:
3010
diff
changeset
|
1812 put_be32(pb, 0x0); |
1049
23d44137105f
the PSP rejects video with too high bitrates so lets claim they arent too high ...
michael
parents:
1037
diff
changeset
|
1813 put_be32(pb, audio_kbitrate); |
23d44137105f
the PSP rejects video with too high bitrates so lets claim they arent too high ...
michael
parents:
1037
diff
changeset
|
1814 put_be32(pb, audio_kbitrate); |
3024
19de43025f0f
cosmetics, remove whitespaces before and after parenthesis
bcoudurier
parents:
3010
diff
changeset
|
1815 put_be32(pb, AudioRate); |
19de43025f0f
cosmetics, remove whitespaces before and after parenthesis
bcoudurier
parents:
3010
diff
changeset
|
1816 put_be32(pb, AudioCodec->channels); |
659
6d7c0e6d929e
Sony PSP variation of MP4 patch by <tjcannell AT blueyonder DOT co DOT uk>
mmu_man
parents:
657
diff
changeset
|
1817 |
3024
19de43025f0f
cosmetics, remove whitespaces before and after parenthesis
bcoudurier
parents:
3010
diff
changeset
|
1818 put_be32(pb, 0x34); /* size */ |
659
6d7c0e6d929e
Sony PSP variation of MP4 patch by <tjcannell AT blueyonder DOT co DOT uk>
mmu_man
parents:
657
diff
changeset
|
1819 put_tag(pb, "VPRF"); /* video */ |
3024
19de43025f0f
cosmetics, remove whitespaces before and after parenthesis
bcoudurier
parents:
3010
diff
changeset
|
1820 put_be32(pb, 0x0); |
19de43025f0f
cosmetics, remove whitespaces before and after parenthesis
bcoudurier
parents:
3010
diff
changeset
|
1821 put_be32(pb, 0x1); /* TrackID */ |
1050
ece3b7eecba2
little h.264 related hunk from diff between cvs and mobile hackerz
michael
parents:
1049
diff
changeset
|
1822 if (VideoCodec->codec_id == CODEC_ID_H264) { |
ece3b7eecba2
little h.264 related hunk from diff between cvs and mobile hackerz
michael
parents:
1049
diff
changeset
|
1823 put_tag(pb, "avc1"); |
3024
19de43025f0f
cosmetics, remove whitespaces before and after parenthesis
bcoudurier
parents:
3010
diff
changeset
|
1824 put_be16(pb, 0x014D); |
19de43025f0f
cosmetics, remove whitespaces before and after parenthesis
bcoudurier
parents:
3010
diff
changeset
|
1825 put_be16(pb, 0x0015); |
1050
ece3b7eecba2
little h.264 related hunk from diff between cvs and mobile hackerz
michael
parents:
1049
diff
changeset
|
1826 } else { |
ece3b7eecba2
little h.264 related hunk from diff between cvs and mobile hackerz
michael
parents:
1049
diff
changeset
|
1827 put_tag(pb, "mp4v"); |
3024
19de43025f0f
cosmetics, remove whitespaces before and after parenthesis
bcoudurier
parents:
3010
diff
changeset
|
1828 put_be16(pb, 0x0000); |
19de43025f0f
cosmetics, remove whitespaces before and after parenthesis
bcoudurier
parents:
3010
diff
changeset
|
1829 put_be16(pb, 0x0103); |
1050
ece3b7eecba2
little h.264 related hunk from diff between cvs and mobile hackerz
michael
parents:
1049
diff
changeset
|
1830 } |
3024
19de43025f0f
cosmetics, remove whitespaces before and after parenthesis
bcoudurier
parents:
3010
diff
changeset
|
1831 put_be32(pb, 0x0); |
1049
23d44137105f
the PSP rejects video with too high bitrates so lets claim they arent too high ...
michael
parents:
1037
diff
changeset
|
1832 put_be32(pb, video_kbitrate); |
23d44137105f
the PSP rejects video with too high bitrates so lets claim they arent too high ...
michael
parents:
1037
diff
changeset
|
1833 put_be32(pb, video_kbitrate); |
911
343ddd5b793c
Fix for title field in PSP compatible mp4 files. Patch by
banan
parents:
910
diff
changeset
|
1834 put_be32(pb, FrameRate); |
343ddd5b793c
Fix for title field in PSP compatible mp4 files. Patch by
banan
parents:
910
diff
changeset
|
1835 put_be32(pb, FrameRate); |
343ddd5b793c
Fix for title field in PSP compatible mp4 files. Patch by
banan
parents:
910
diff
changeset
|
1836 put_be16(pb, VideoCodec->width); |
343ddd5b793c
Fix for title field in PSP compatible mp4 files. Patch by
banan
parents:
910
diff
changeset
|
1837 put_be16(pb, VideoCodec->height); |
343ddd5b793c
Fix for title field in PSP compatible mp4 files. Patch by
banan
parents:
910
diff
changeset
|
1838 put_be32(pb, 0x010001); /* ? */ |
659
6d7c0e6d929e
Sony PSP variation of MP4 patch by <tjcannell AT blueyonder DOT co DOT uk>
mmu_man
parents:
657
diff
changeset
|
1839 } |
6d7c0e6d929e
Sony PSP variation of MP4 patch by <tjcannell AT blueyonder DOT co DOT uk>
mmu_man
parents:
657
diff
changeset
|
1840 |
4941 | 1841 static int mov_parse_mpeg2_frame(AVPacket *pkt, uint32_t *flags) |
1842 { | |
1843 uint32_t c = -1; | |
1844 int i, closed_gop = 0; | |
1845 | |
1846 for (i = 0; i < pkt->size - 4; i++) { | |
1847 c = (c<<8) + pkt->data[i]; | |
1848 if (c == 0x1b8) { // gop | |
1849 closed_gop = pkt->data[i+4]>>6 & 0x01; | |
1850 } else if (c == 0x100) { // pic | |
1851 int temp_ref = (pkt->data[i+1]<<2) | (pkt->data[i+2]>>6); | |
1852 if (!temp_ref || closed_gop) // I picture is not reordered | |
1853 *flags = MOV_SYNC_SAMPLE; | |
1854 else | |
1855 *flags = MOV_PARTIAL_SYNC_SAMPLE; | |
1856 break; | |
1857 } | |
1858 } | |
1859 return 0; | |
1860 } | |
1861 | |
6012 | 1862 int ff_mov_write_packet(AVFormatContext *s, AVPacket *pkt) |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1863 { |
4609
065557d6fffb
Rename movenc.c MOVContext to MOVMuxContext, since MOVContext is already used
rbultje
parents:
4587
diff
changeset
|
1864 MOVMuxContext *mov = s->priv_data; |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2669
diff
changeset
|
1865 ByteIOContext *pb = s->pb; |
1080 | 1866 MOVTrack *trk = &mov->tracks[pkt->stream_index]; |
1867 AVCodecContext *enc = trk->enc; | |
298
0b2eed7b1210
movenc patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
286
diff
changeset
|
1868 unsigned int samplesInChunk = 0; |
468 | 1869 int size= pkt->size; |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1870 |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2669
diff
changeset
|
1871 if (url_is_streamed(s->pb)) return 0; /* Can't handle that */ |
298
0b2eed7b1210
movenc patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
286
diff
changeset
|
1872 if (!size) return 0; /* Discard 0 sized packets */ |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1873 |
1154 | 1874 if (enc->codec_id == CODEC_ID_AMR_NB) { |
1147 | 1875 /* We must find out how many AMR blocks there are in one packet */ |
1876 static uint16_t packed_size[16] = | |
1877 {13, 14, 16, 18, 20, 21, 27, 32, 6, 0, 0, 0, 0, 0, 0, 0}; | |
1878 int len = 0; | |
1057 | 1879 |
1147 | 1880 while (len < size && samplesInChunk < 100) { |
1881 len += packed_size[(pkt->data[len] >> 3) & 0x0F]; | |
1882 samplesInChunk++; | |
1057 | 1883 } |
1151 | 1884 if(samplesInChunk > 1){ |
2546 | 1885 av_log(s, AV_LOG_ERROR, "fatal error, input is not a single packet, implement a AVParser for it\n"); |
1151 | 1886 return -1; |
1887 } | |
1147 | 1888 } else if (trk->sampleSize) |
1889 samplesInChunk = size/trk->sampleSize; | |
1890 else | |
298
0b2eed7b1210
movenc patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
286
diff
changeset
|
1891 samplesInChunk = 1; |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1892 |
1057 | 1893 /* copy extradata if it exists */ |
1894 if (trk->vosLen == 0 && enc->extradata_size > 0) { | |
298
0b2eed7b1210
movenc patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
286
diff
changeset
|
1895 trk->vosLen = enc->extradata_size; |
0b2eed7b1210
movenc patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
286
diff
changeset
|
1896 trk->vosData = av_malloc(trk->vosLen); |
0b2eed7b1210
movenc patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
286
diff
changeset
|
1897 memcpy(trk->vosData, enc->extradata, trk->vosLen); |
0b2eed7b1210
movenc patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
286
diff
changeset
|
1898 } |
0b2eed7b1210
movenc patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
286
diff
changeset
|
1899 |
4225
0231b1d5cd15
move actual writing before so new size can be taken into account
bcoudurier
parents:
4223
diff
changeset
|
1900 if (enc->codec_id == CODEC_ID_H264 && trk->vosLen > 0 && *(uint8_t *)trk->vosData != 1) { |
0231b1d5cd15
move actual writing before so new size can be taken into account
bcoudurier
parents:
4223
diff
changeset
|
1901 /* from x264 or from bytestream h264 */ |
0231b1d5cd15
move actual writing before so new size can be taken into account
bcoudurier
parents:
4223
diff
changeset
|
1902 /* nal reformating needed */ |
0231b1d5cd15
move actual writing before so new size can be taken into account
bcoudurier
parents:
4223
diff
changeset
|
1903 size = ff_avc_parse_nal_units(pb, pkt->data, pkt->size); |
0231b1d5cd15
move actual writing before so new size can be taken into account
bcoudurier
parents:
4223
diff
changeset
|
1904 } else { |
0231b1d5cd15
move actual writing before so new size can be taken into account
bcoudurier
parents:
4223
diff
changeset
|
1905 put_buffer(pb, pkt->data, size); |
0231b1d5cd15
move actual writing before so new size can be taken into account
bcoudurier
parents:
4223
diff
changeset
|
1906 } |
0231b1d5cd15
move actual writing before so new size can be taken into account
bcoudurier
parents:
4223
diff
changeset
|
1907 |
4222
0267c4299992
Do not reallocate AVPacket's data when muxing a packet
lucabe
parents:
4206
diff
changeset
|
1908 if ((enc->codec_id == CODEC_ID_DNXHD || |
4928 | 1909 enc->codec_id == CODEC_ID_AC3) && !trk->vosLen) { |
3857
50bb82abb278
copy whole frame in vosData for dnxhd, this code will be used for other codecs too
bcoudurier
parents:
3766
diff
changeset
|
1910 /* copy frame to create needed atoms */ |
50bb82abb278
copy whole frame in vosData for dnxhd, this code will be used for other codecs too
bcoudurier
parents:
3766
diff
changeset
|
1911 trk->vosLen = size; |
50bb82abb278
copy whole frame in vosData for dnxhd, this code will be used for other codecs too
bcoudurier
parents:
3766
diff
changeset
|
1912 trk->vosData = av_malloc(size); |
3858 | 1913 if (!trk->vosData) |
1914 return AVERROR(ENOMEM); | |
3857
50bb82abb278
copy whole frame in vosData for dnxhd, this code will be used for other codecs too
bcoudurier
parents:
3766
diff
changeset
|
1915 memcpy(trk->vosData, pkt->data, size); |
1006
15bfc3c063dc
do nal reformating when muxing H264, create avcc atom
bcoudurier
parents:
1000
diff
changeset
|
1916 } |
15bfc3c063dc
do nal reformating when muxing H264, create avcc atom
bcoudurier
parents:
1000
diff
changeset
|
1917 |
1129 | 1918 if (!(trk->entry % MOV_INDEX_CLUSTER_SIZE)) { |
1919 trk->cluster = av_realloc(trk->cluster, (trk->entry + MOV_INDEX_CLUSTER_SIZE) * sizeof(*trk->cluster)); | |
298
0b2eed7b1210
movenc patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
286
diff
changeset
|
1920 if (!trk->cluster) |
0b2eed7b1210
movenc patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
286
diff
changeset
|
1921 return -1; |
0b2eed7b1210
movenc patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
286
diff
changeset
|
1922 } |
0b2eed7b1210
movenc patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
286
diff
changeset
|
1923 |
4225
0231b1d5cd15
move actual writing before so new size can be taken into account
bcoudurier
parents:
4223
diff
changeset
|
1924 trk->cluster[trk->entry].pos = url_ftell(pb) - size; |
1129 | 1925 trk->cluster[trk->entry].samplesInChunk = samplesInChunk; |
1926 trk->cluster[trk->entry].size = size; | |
1927 trk->cluster[trk->entry].entries = samplesInChunk; | |
1437 | 1928 trk->cluster[trk->entry].dts = pkt->dts; |
1929 trk->trackDuration = pkt->dts - trk->cluster[0].dts + pkt->duration; | |
1930 | |
3397
76918939de90
warn if pts is not set, prevent writing negative/weird cts, happens when using genpts and streamcopy
bcoudurier
parents:
3396
diff
changeset
|
1931 if (pkt->pts == AV_NOPTS_VALUE) { |
76918939de90
warn if pts is not set, prevent writing negative/weird cts, happens when using genpts and streamcopy
bcoudurier
parents:
3396
diff
changeset
|
1932 av_log(s, AV_LOG_WARNING, "pts has no value\n"); |
76918939de90
warn if pts is not set, prevent writing negative/weird cts, happens when using genpts and streamcopy
bcoudurier
parents:
3396
diff
changeset
|
1933 pkt->pts = pkt->dts; |
76918939de90
warn if pts is not set, prevent writing negative/weird cts, happens when using genpts and streamcopy
bcoudurier
parents:
3396
diff
changeset
|
1934 } |
3396 | 1935 if (pkt->dts != pkt->pts) |
4941 | 1936 trk->flags |= MOV_TRACK_CTTS; |
3396 | 1937 trk->cluster[trk->entry].cts = pkt->pts - pkt->dts; |
4941 | 1938 trk->cluster[trk->entry].flags = 0; |
5913
11bb10c37225
Replace all occurences of PKT_FLAG_KEY with AV_PKT_FLAG_KEY.
cehoyos
parents:
5910
diff
changeset
|
1939 if (pkt->flags & AV_PKT_FLAG_KEY) { |
4941 | 1940 if (mov->mode == MODE_MOV && enc->codec_id == CODEC_ID_MPEG2VIDEO) { |
1941 mov_parse_mpeg2_frame(pkt, &trk->cluster[trk->entry].flags); | |
1942 if (trk->cluster[trk->entry].flags & MOV_PARTIAL_SYNC_SAMPLE) | |
1943 trk->flags |= MOV_TRACK_STPS; | |
1944 } else { | |
1945 trk->cluster[trk->entry].flags = MOV_SYNC_SAMPLE; | |
1946 } | |
1947 if (trk->cluster[trk->entry].flags & MOV_SYNC_SAMPLE) | |
1948 trk->hasKeyframes++; | |
4937 | 1949 } |
298
0b2eed7b1210
movenc patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
286
diff
changeset
|
1950 trk->entry++; |
0b2eed7b1210
movenc patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
286
diff
changeset
|
1951 trk->sampleCount += samplesInChunk; |
1080 | 1952 mov->mdat_size += size; |
298
0b2eed7b1210
movenc patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
286
diff
changeset
|
1953 |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1954 put_flush_packet(pb); |
6013
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
1955 |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
1956 if (trk->hint_track >= 0 && trk->hint_track < mov->nb_streams) |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
1957 ff_mov_add_hinted_packet(s, pkt, trk->hint_track, trk->entry); |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1958 return 0; |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1959 } |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
1960 |
5993 | 1961 // QuickTime chapters involve an additional text track with the chapter names |
1962 // as samples, and a tref pointing from the other tracks to the chapter one. | |
1963 static void mov_create_chapter_track(AVFormatContext *s, int tracknum) | |
1964 { | |
1965 MOVMuxContext *mov = s->priv_data; | |
1966 MOVTrack *track = &mov->tracks[tracknum]; | |
1967 AVPacket pkt = { .stream_index = tracknum, .flags = AV_PKT_FLAG_KEY }; | |
1968 int i, len; | |
1969 | |
1970 track->mode = mov->mode; | |
1971 track->tag = MKTAG('t','e','x','t'); | |
1972 track->timescale = MOV_TIMESCALE; | |
1973 track->enc = avcodec_alloc_context(); | |
1974 track->enc->codec_type = AVMEDIA_TYPE_SUBTITLE; | |
1975 | |
1976 for (i = 0; i < s->nb_chapters; i++) { | |
1977 AVChapter *c = s->chapters[i]; | |
1978 AVMetadataTag *t; | |
1979 | |
1980 int64_t end = av_rescale_q(c->end, c->time_base, (AVRational){1,MOV_TIMESCALE}); | |
1981 pkt.pts = pkt.dts = av_rescale_q(c->start, c->time_base, (AVRational){1,MOV_TIMESCALE}); | |
1982 pkt.duration = end - pkt.dts; | |
1983 | |
1984 if ((t = av_metadata_get(c->metadata, "title", NULL, 0))) { | |
1985 len = strlen(t->value); | |
1986 pkt.size = len+2; | |
1987 pkt.data = av_malloc(pkt.size); | |
1988 AV_WB16(pkt.data, len); | |
1989 memcpy(pkt.data+2, t->value, len); | |
6012 | 1990 ff_mov_write_packet(s, &pkt); |
5993 | 1991 av_freep(&pkt.data); |
1992 } | |
1993 } | |
1994 } | |
1995 | |
5992
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
1996 static int mov_write_header(AVFormatContext *s) |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
1997 { |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
1998 ByteIOContext *pb = s->pb; |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
1999 MOVMuxContext *mov = s->priv_data; |
6013
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
2000 int i, hint_track = 0; |
5992
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2001 |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2002 if (url_is_streamed(s->pb)) { |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2003 av_log(s, AV_LOG_ERROR, "muxer does not support non seekable output\n"); |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2004 return -1; |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2005 } |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2006 |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2007 /* Default mode == MP4 */ |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2008 mov->mode = MODE_MP4; |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2009 |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2010 if (s->oformat != NULL) { |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2011 if (!strcmp("3gp", s->oformat->name)) mov->mode = MODE_3GP; |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2012 else if (!strcmp("3g2", s->oformat->name)) mov->mode = MODE_3GP|MODE_3G2; |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2013 else if (!strcmp("mov", s->oformat->name)) mov->mode = MODE_MOV; |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2014 else if (!strcmp("psp", s->oformat->name)) mov->mode = MODE_PSP; |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2015 else if (!strcmp("ipod",s->oformat->name)) mov->mode = MODE_IPOD; |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2016 |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2017 mov_write_ftyp_tag(pb,s); |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2018 if (mov->mode == MODE_PSP) { |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2019 if (s->nb_streams != 2) { |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2020 av_log(s, AV_LOG_ERROR, "PSP mode need one video and one audio stream\n"); |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2021 return -1; |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2022 } |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2023 mov_write_uuidprof_tag(pb,s); |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2024 } |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2025 } |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2026 |
5993 | 2027 mov->nb_streams = s->nb_streams; |
2028 if (mov->mode & (MODE_MOV|MODE_IPOD) && s->nb_chapters) | |
2029 mov->chapter_track = mov->nb_streams++; | |
2030 | |
6013
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
2031 if (s->flags & AVFMT_FLAG_RTP_HINT) { |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
2032 /* Add hint tracks for each audio and video stream */ |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
2033 hint_track = mov->nb_streams; |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
2034 for (i = 0; i < s->nb_streams; i++) { |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
2035 AVStream *st = s->streams[i]; |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
2036 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO || |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
2037 st->codec->codec_type == AVMEDIA_TYPE_AUDIO) { |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
2038 mov->nb_streams++; |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
2039 } |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
2040 } |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
2041 } |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
2042 |
5993 | 2043 mov->tracks = av_mallocz(mov->nb_streams*sizeof(*mov->tracks)); |
5992
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2044 if (!mov->tracks) |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2045 return AVERROR(ENOMEM); |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2046 |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2047 for(i=0; i<s->nb_streams; i++){ |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2048 AVStream *st= s->streams[i]; |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2049 MOVTrack *track= &mov->tracks[i]; |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2050 AVMetadataTag *lang = av_metadata_get(st->metadata, "language", NULL,0); |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2051 |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2052 track->enc = st->codec; |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2053 track->language = ff_mov_iso639_to_lang(lang?lang->value:"und", mov->mode!=MODE_MOV); |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2054 if (track->language < 0) |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2055 track->language = 0; |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2056 track->mode = mov->mode; |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2057 track->tag = mov_find_codec_tag(s, track); |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2058 if (!track->tag) { |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2059 av_log(s, AV_LOG_ERROR, "track %d: could not find tag, " |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2060 "codec not currently supported in container\n", i); |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2061 goto error; |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2062 } |
6013
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
2063 /* If hinting of this track is enabled by a later hint track, |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
2064 * this is updated. */ |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
2065 track->hint_track = -1; |
5992
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2066 if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO){ |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2067 if (track->tag == MKTAG('m','x','3','p') || track->tag == MKTAG('m','x','3','n') || |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2068 track->tag == MKTAG('m','x','4','p') || track->tag == MKTAG('m','x','4','n') || |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2069 track->tag == MKTAG('m','x','5','p') || track->tag == MKTAG('m','x','5','n')) { |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2070 if (st->codec->width != 720 || (st->codec->height != 608 && st->codec->height != 512)) { |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2071 av_log(s, AV_LOG_ERROR, "D-10/IMX must use 720x608 or 720x512 video resolution\n"); |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2072 goto error; |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2073 } |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2074 track->height = track->tag>>24 == 'n' ? 486 : 576; |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2075 } |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2076 track->timescale = st->codec->time_base.den; |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2077 if (track->mode == MODE_MOV && track->timescale > 100000) |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2078 av_log(s, AV_LOG_WARNING, |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2079 "WARNING codec timebase is very high. If duration is too long,\n" |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2080 "file may not be playable by quicktime. Specify a shorter timebase\n" |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2081 "or choose different container.\n"); |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2082 }else if(st->codec->codec_type == AVMEDIA_TYPE_AUDIO){ |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2083 track->timescale = st->codec->sample_rate; |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2084 if(!st->codec->frame_size && !av_get_bits_per_sample(st->codec->codec_id)) { |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2085 av_log(s, AV_LOG_ERROR, "track %d: codec frame size is not set\n", i); |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2086 goto error; |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2087 }else if(st->codec->frame_size > 1){ /* assume compressed audio */ |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2088 track->audio_vbr = 1; |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2089 }else{ |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2090 st->codec->frame_size = 1; |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2091 track->sampleSize = (av_get_bits_per_sample(st->codec->codec_id) >> 3) * st->codec->channels; |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2092 } |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2093 if (track->mode != MODE_MOV) { |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2094 if (track->timescale > UINT16_MAX) { |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2095 av_log(s, AV_LOG_ERROR, "track %d: output format does not support " |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2096 "sample rate %dhz\n", i, track->timescale); |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2097 goto error; |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2098 } |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2099 if (track->enc->codec_id == CODEC_ID_MP3 && track->timescale < 16000) { |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2100 av_log(s, AV_LOG_ERROR, "track %d: muxing mp3 at %dhz is not supported\n", |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2101 i, track->enc->sample_rate); |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2102 goto error; |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2103 } |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2104 } |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2105 }else if(st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE){ |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2106 track->timescale = st->codec->time_base.den; |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2107 } |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2108 if (!track->height) |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2109 track->height = st->codec->height; |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2110 |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2111 av_set_pts_info(st, 64, 1, track->timescale); |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2112 } |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2113 |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2114 mov_write_mdat_tag(pb, mov); |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2115 mov->time = s->timestamp + 0x7C25B080; //1970 based -> 1904 based |
5993 | 2116 |
2117 if (mov->chapter_track) | |
2118 mov_create_chapter_track(s, mov->chapter_track); | |
5992
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2119 |
6013
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
2120 if (s->flags & AVFMT_FLAG_RTP_HINT) { |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
2121 /* Initialize the hint tracks for each audio and video stream */ |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
2122 for (i = 0; i < s->nb_streams; i++) { |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
2123 AVStream *st = s->streams[i]; |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
2124 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO || |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
2125 st->codec->codec_type == AVMEDIA_TYPE_AUDIO) { |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
2126 ff_mov_init_hinting(s, hint_track, i); |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
2127 hint_track++; |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
2128 } |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
2129 } |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
2130 } |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
2131 |
5992
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2132 put_flush_packet(pb); |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2133 |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2134 return 0; |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2135 error: |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2136 av_freep(&mov->tracks); |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2137 return -1; |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2138 } |
391e3ca10474
movenc: Swap positions of mov_write_header and mov_write_packet
conrad
parents:
5974
diff
changeset
|
2139 |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
2140 static int mov_write_trailer(AVFormatContext *s) |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
2141 { |
4609
065557d6fffb
Rename movenc.c MOVContext to MOVMuxContext, since MOVContext is already used
rbultje
parents:
4587
diff
changeset
|
2142 MOVMuxContext *mov = s->priv_data; |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2669
diff
changeset
|
2143 ByteIOContext *pb = s->pb; |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
2144 int res = 0; |
1129 | 2145 int i; |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
2146 |
3973
549a09cf23fe
Remove offset_t typedef and use int64_t directly instead.
diego
parents:
3909
diff
changeset
|
2147 int64_t moov_pos = url_ftell(pb); |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
2148 |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
2149 /* Write size of mdat tag */ |
1080 | 2150 if (mov->mdat_size+8 <= UINT32_MAX) { |
909
69e06b6f91a3
>4gb fixes by (Dirk Musfeldt | d.musfeldt meilenstein de)
michael
parents:
896
diff
changeset
|
2151 url_fseek(pb, mov->mdat_pos, SEEK_SET); |
1080 | 2152 put_be32(pb, mov->mdat_size+8); |
909
69e06b6f91a3
>4gb fixes by (Dirk Musfeldt | d.musfeldt meilenstein de)
michael
parents:
896
diff
changeset
|
2153 } else { |
69e06b6f91a3
>4gb fixes by (Dirk Musfeldt | d.musfeldt meilenstein de)
michael
parents:
896
diff
changeset
|
2154 /* overwrite 'wide' placeholder atom */ |
69e06b6f91a3
>4gb fixes by (Dirk Musfeldt | d.musfeldt meilenstein de)
michael
parents:
896
diff
changeset
|
2155 url_fseek(pb, mov->mdat_pos - 8, SEEK_SET); |
69e06b6f91a3
>4gb fixes by (Dirk Musfeldt | d.musfeldt meilenstein de)
michael
parents:
896
diff
changeset
|
2156 put_be32(pb, 1); /* special value: real atom size will be 64 bit value after tag field */ |
69e06b6f91a3
>4gb fixes by (Dirk Musfeldt | d.musfeldt meilenstein de)
michael
parents:
896
diff
changeset
|
2157 put_tag(pb, "mdat"); |
1080 | 2158 put_be64(pb, mov->mdat_size+16); |
909
69e06b6f91a3
>4gb fixes by (Dirk Musfeldt | d.musfeldt meilenstein de)
michael
parents:
896
diff
changeset
|
2159 } |
365
4ae9fac22a5d
AAC support in mov, correct aspect ratio support and user data support patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
342
diff
changeset
|
2160 url_fseek(pb, moov_pos, SEEK_SET); |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
2161 |
365
4ae9fac22a5d
AAC support in mov, correct aspect ratio support and user data support patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
342
diff
changeset
|
2162 mov_write_moov_tag(pb, mov, s); |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
2163 |
5993 | 2164 if (mov->chapter_track) |
2165 av_freep(&mov->tracks[mov->chapter_track].enc); | |
2166 | |
1131 | 2167 for (i=0; i<mov->nb_streams; i++) { |
6013
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
2168 if (mov->tracks[i].tag == MKTAG('r','t','p',' ')) |
332ad5f30c0e
Add initial support for RTP hinting in the mov muxer
mstorsjo
parents:
6012
diff
changeset
|
2169 ff_mov_close_hinting(&mov->tracks[i]); |
1129 | 2170 av_freep(&mov->tracks[i].cluster); |
2171 | |
3024
19de43025f0f
cosmetics, remove whitespaces before and after parenthesis
bcoudurier
parents:
3010
diff
changeset
|
2172 if(mov->tracks[i].vosLen) av_free(mov->tracks[i].vosData); |
342
0c1b489c96bf
memleak patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
299
diff
changeset
|
2173 |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
2174 } |
365
4ae9fac22a5d
AAC support in mov, correct aspect ratio support and user data support patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
342
diff
changeset
|
2175 |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
2176 put_flush_packet(pb); |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
2177 |
4783 | 2178 av_freep(&mov->tracks); |
2179 | |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
2180 return res; |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
2181 } |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
2182 |
4206 | 2183 #if CONFIG_MOV_MUXER |
1169 | 2184 AVOutputFormat mov_muxer = { |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
2185 "mov", |
3424
7a0230981402
Make long_names in lavf/lavdev optional depending on CONFIG_SMALL.
diego
parents:
3397
diff
changeset
|
2186 NULL_IF_CONFIG_SMALL("MOV format"), |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
2187 NULL, |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
2188 "mov", |
4609
065557d6fffb
Rename movenc.c MOVContext to MOVMuxContext, since MOVContext is already used
rbultje
parents:
4587
diff
changeset
|
2189 sizeof(MOVMuxContext), |
365
4ae9fac22a5d
AAC support in mov, correct aspect ratio support and user data support patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
342
diff
changeset
|
2190 CODEC_ID_AAC, |
239 | 2191 CODEC_ID_MPEG4, |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
2192 mov_write_header, |
6012 | 2193 ff_mov_write_packet, |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
2194 mov_write_trailer, |
4567
963e3b76c7a6
Add AVFMT_VARIABLE_FPS to specify which muxers do not need duplicated frames.
michael
parents:
4463
diff
changeset
|
2195 .flags = AVFMT_GLOBALHEADER | AVFMT_VARIABLE_FPS, |
3766
f062deeedb8d
Change codec_tag type from const struct AVCodecTag ** to const struct AVCodecTag * const *
reimar
parents:
3759
diff
changeset
|
2196 .codec_tag = (const AVCodecTag* const []){codec_movvideo_tags, codec_movaudio_tags, 0}, |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
2197 }; |
1169 | 2198 #endif |
4206 | 2199 #if CONFIG_TGP_MUXER |
1169 | 2200 AVOutputFormat tgp_muxer = { |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
2201 "3gp", |
3424
7a0230981402
Make long_names in lavf/lavdev optional depending on CONFIG_SMALL.
diego
parents:
3397
diff
changeset
|
2202 NULL_IF_CONFIG_SMALL("3GP format"), |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
2203 NULL, |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
2204 "3gp", |
4609
065557d6fffb
Rename movenc.c MOVContext to MOVMuxContext, since MOVContext is already used
rbultje
parents:
4587
diff
changeset
|
2205 sizeof(MOVMuxContext), |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
2206 CODEC_ID_AMR_NB, |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
2207 CODEC_ID_H263, |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
2208 mov_write_header, |
6012 | 2209 ff_mov_write_packet, |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
2210 mov_write_trailer, |
715
e214703e4b76
30_clean_up_global_header_flag.patch by (Calcium | calcium nurs or jp)
michael
parents:
711
diff
changeset
|
2211 .flags = AVFMT_GLOBALHEADER, |
3766
f062deeedb8d
Change codec_tag type from const struct AVCodecTag ** to const struct AVCodecTag * const *
reimar
parents:
3759
diff
changeset
|
2212 .codec_tag = (const AVCodecTag* const []){codec_3gp_tags, 0}, |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
2213 }; |
1169 | 2214 #endif |
4206 | 2215 #if CONFIG_MP4_MUXER |
1169 | 2216 AVOutputFormat mp4_muxer = { |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
2217 "mp4", |
3424
7a0230981402
Make long_names in lavf/lavdev optional depending on CONFIG_SMALL.
diego
parents:
3397
diff
changeset
|
2218 NULL_IF_CONFIG_SMALL("MP4 format"), |
286
eccf0c3e3289
Using the extension m4a for audio only MPEG-4 files is increasingly
michael
parents:
259
diff
changeset
|
2219 "application/mp4", |
3452
712d6fab85ee
m4v/m4a are usual itunes/ipod/iphone extensions
bcoudurier
parents:
3451
diff
changeset
|
2220 "mp4", |
4609
065557d6fffb
Rename movenc.c MOVContext to MOVMuxContext, since MOVContext is already used
rbultje
parents:
4587
diff
changeset
|
2221 sizeof(MOVMuxContext), |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
2222 CODEC_ID_AAC, |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
2223 CODEC_ID_MPEG4, |
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
2224 mov_write_header, |
6012 | 2225 ff_mov_write_packet, |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
2226 mov_write_trailer, |
4567
963e3b76c7a6
Add AVFMT_VARIABLE_FPS to specify which muxers do not need duplicated frames.
michael
parents:
4463
diff
changeset
|
2227 .flags = AVFMT_GLOBALHEADER | AVFMT_VARIABLE_FPS, |
3766
f062deeedb8d
Change codec_tag type from const struct AVCodecTag ** to const struct AVCodecTag * const *
reimar
parents:
3759
diff
changeset
|
2228 .codec_tag = (const AVCodecTag* const []){ff_mp4_obj_type, 0}, |
201
85def00971c3
mov, 3gp, mp4 muxer by (Thomas Raivio <tjraivio at cc dot hut dot fi>)
michaelni
parents:
diff
changeset
|
2229 }; |
1169 | 2230 #endif |
4206 | 2231 #if CONFIG_PSP_MUXER |
1169 | 2232 AVOutputFormat psp_muxer = { |
659
6d7c0e6d929e
Sony PSP variation of MP4 patch by <tjcannell AT blueyonder DOT co DOT uk>
mmu_man
parents:
657
diff
changeset
|
2233 "psp", |
3424
7a0230981402
Make long_names in lavf/lavdev optional depending on CONFIG_SMALL.
diego
parents:
3397
diff
changeset
|
2234 NULL_IF_CONFIG_SMALL("PSP MP4 format"), |
659
6d7c0e6d929e
Sony PSP variation of MP4 patch by <tjcannell AT blueyonder DOT co DOT uk>
mmu_man
parents:
657
diff
changeset
|
2235 NULL, |
6d7c0e6d929e
Sony PSP variation of MP4 patch by <tjcannell AT blueyonder DOT co DOT uk>
mmu_man
parents:
657
diff
changeset
|
2236 "mp4,psp", |
4609
065557d6fffb
Rename movenc.c MOVContext to MOVMuxContext, since MOVContext is already used
rbultje
parents:
4587
diff
changeset
|
2237 sizeof(MOVMuxContext), |
659
6d7c0e6d929e
Sony PSP variation of MP4 patch by <tjcannell AT blueyonder DOT co DOT uk>
mmu_man
parents:
657
diff
changeset
|
2238 CODEC_ID_AAC, |
6d7c0e6d929e
Sony PSP variation of MP4 patch by <tjcannell AT blueyonder DOT co DOT uk>
mmu_man
parents:
657
diff
changeset
|
2239 CODEC_ID_MPEG4, |
6d7c0e6d929e
Sony PSP variation of MP4 patch by <tjcannell AT blueyonder DOT co DOT uk>
mmu_man
parents:
657
diff
changeset
|
2240 mov_write_header, |
6012 | 2241 ff_mov_write_packet, |
659
6d7c0e6d929e
Sony PSP variation of MP4 patch by <tjcannell AT blueyonder DOT co DOT uk>
mmu_man
parents:
657
diff
changeset
|
2242 mov_write_trailer, |
911
343ddd5b793c
Fix for title field in PSP compatible mp4 files. Patch by
banan
parents:
910
diff
changeset
|
2243 .flags = AVFMT_GLOBALHEADER, |
3766
f062deeedb8d
Change codec_tag type from const struct AVCodecTag ** to const struct AVCodecTag * const *
reimar
parents:
3759
diff
changeset
|
2244 .codec_tag = (const AVCodecTag* const []){ff_mp4_obj_type, 0}, |
659
6d7c0e6d929e
Sony PSP variation of MP4 patch by <tjcannell AT blueyonder DOT co DOT uk>
mmu_man
parents:
657
diff
changeset
|
2245 }; |
1169 | 2246 #endif |
4206 | 2247 #if CONFIG_TG2_MUXER |
1169 | 2248 AVOutputFormat tg2_muxer = { |
677
6d6a11ba402a
quick patch for adding 3g2 support to ffmpeg (muxer and demuxer). No movie fragment support yet patch by (tjraivio cc.hut fi)
michael
parents:
676
diff
changeset
|
2249 "3g2", |
3424
7a0230981402
Make long_names in lavf/lavdev optional depending on CONFIG_SMALL.
diego
parents:
3397
diff
changeset
|
2250 NULL_IF_CONFIG_SMALL("3GP2 format"), |
677
6d6a11ba402a
quick patch for adding 3g2 support to ffmpeg (muxer and demuxer). No movie fragment support yet patch by (tjraivio cc.hut fi)
michael
parents:
676
diff
changeset
|
2251 NULL, |
6d6a11ba402a
quick patch for adding 3g2 support to ffmpeg (muxer and demuxer). No movie fragment support yet patch by (tjraivio cc.hut fi)
michael
parents:
676
diff
changeset
|
2252 "3g2", |
4609
065557d6fffb
Rename movenc.c MOVContext to MOVMuxContext, since MOVContext is already used
rbultje
parents:
4587
diff
changeset
|
2253 sizeof(MOVMuxContext), |
677
6d6a11ba402a
quick patch for adding 3g2 support to ffmpeg (muxer and demuxer). No movie fragment support yet patch by (tjraivio cc.hut fi)
michael
parents:
676
diff
changeset
|
2254 CODEC_ID_AMR_NB, |
6d6a11ba402a
quick patch for adding 3g2 support to ffmpeg (muxer and demuxer). No movie fragment support yet patch by (tjraivio cc.hut fi)
michael
parents:
676
diff
changeset
|
2255 CODEC_ID_H263, |
6d6a11ba402a
quick patch for adding 3g2 support to ffmpeg (muxer and demuxer). No movie fragment support yet patch by (tjraivio cc.hut fi)
michael
parents:
676
diff
changeset
|
2256 mov_write_header, |
6012 | 2257 ff_mov_write_packet, |
677
6d6a11ba402a
quick patch for adding 3g2 support to ffmpeg (muxer and demuxer). No movie fragment support yet patch by (tjraivio cc.hut fi)
michael
parents:
676
diff
changeset
|
2258 mov_write_trailer, |
715
e214703e4b76
30_clean_up_global_header_flag.patch by (Calcium | calcium nurs or jp)
michael
parents:
711
diff
changeset
|
2259 .flags = AVFMT_GLOBALHEADER, |
3766
f062deeedb8d
Change codec_tag type from const struct AVCodecTag ** to const struct AVCodecTag * const *
reimar
parents:
3759
diff
changeset
|
2260 .codec_tag = (const AVCodecTag* const []){codec_3gp_tags, 0}, |
677
6d6a11ba402a
quick patch for adding 3g2 support to ffmpeg (muxer and demuxer). No movie fragment support yet patch by (tjraivio cc.hut fi)
michael
parents:
676
diff
changeset
|
2261 }; |
1169 | 2262 #endif |
4206 | 2263 #if CONFIG_IPOD_MUXER |
3143 | 2264 AVOutputFormat ipod_muxer = { |
2265 "ipod", | |
3424
7a0230981402
Make long_names in lavf/lavdev optional depending on CONFIG_SMALL.
diego
parents:
3397
diff
changeset
|
2266 NULL_IF_CONFIG_SMALL("iPod H.264 MP4 format"), |
3143 | 2267 "application/mp4", |
3452
712d6fab85ee
m4v/m4a are usual itunes/ipod/iphone extensions
bcoudurier
parents:
3451
diff
changeset
|
2268 "m4v,m4a", |
4609
065557d6fffb
Rename movenc.c MOVContext to MOVMuxContext, since MOVContext is already used
rbultje
parents:
4587
diff
changeset
|
2269 sizeof(MOVMuxContext), |
3143 | 2270 CODEC_ID_AAC, |
2271 CODEC_ID_H264, | |
2272 mov_write_header, | |
6012 | 2273 ff_mov_write_packet, |
3143 | 2274 mov_write_trailer, |
2275 .flags = AVFMT_GLOBALHEADER, | |
4698 | 2276 .codec_tag = (const AVCodecTag* const []){codec_ipod_tags, 0}, |
3143 | 2277 }; |
2278 #endif |