Mercurial > libavformat.hg
annotate matroskaenc.c @ 6323:4a52e54b7c12 libavformat
Remove duplicate initialiser for cavsvideo_muxer.extensions
The extensions field was initialised first to "cavs", then to "avs".
The name "cavs" is kept since this is used for the format elsewhere
and "avs" is already used for avisynth files.
author | mru |
---|---|
date | Tue, 27 Jul 2010 08:21:23 +0000 |
parents | 8a971c824cdc |
children |
rev | line source |
---|---|
2425
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
1 /* |
2495 | 2 * Matroska muxer |
2425
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
3 * Copyright (c) 2007 David Conrad |
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
4 * |
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
5 * This file is part of FFmpeg. |
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
6 * |
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
7 * FFmpeg is free software; you can redistribute it and/or |
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
8 * modify it under the terms of the GNU Lesser General Public |
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
9 * License as published by the Free Software Foundation; either |
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
10 * version 2.1 of the License, or (at your option) any later version. |
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
11 * |
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
12 * FFmpeg is distributed in the hope that it will be useful, |
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
15 * Lesser General Public License for more details. |
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
16 * |
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
17 * You should have received a copy of the GNU Lesser General Public |
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
18 * License along with FFmpeg; if not, write to the Free Software |
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
20 */ |
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
21 |
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
22 #include "avformat.h" |
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
23 #include "riff.h" |
3601 | 24 #include "isom.h" |
2425
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
25 #include "matroska.h" |
2923
0fde8da65761
Use the isom avcc formatting for h264 extradata in matroska.
aurel
parents:
2771
diff
changeset
|
26 #include "avc.h" |
4581
c52d40f0a955
Share the function to write a raw FLAC header and use it in the Matroska
jbr
parents:
4578
diff
changeset
|
27 #include "flacenc.h" |
4201
7d2f3f1b68d8
Fix build: Add intreadwrite.h and bswap.h #includes where necessary.
diego
parents:
4002
diff
changeset
|
28 #include "libavutil/intreadwrite.h" |
6088
1299f202ffe9
matroskaenc: Use av_get_random_seed -> lfg for segment UID
conrad
parents:
6087
diff
changeset
|
29 #include "libavutil/random_seed.h" |
1299f202ffe9
matroskaenc: Use av_get_random_seed -> lfg for segment UID
conrad
parents:
6087
diff
changeset
|
30 #include "libavutil/lfg.h" |
3286 | 31 #include "libavcodec/xiph.h" |
3201 | 32 #include "libavcodec/mpeg4audio.h" |
2425
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
33 |
2489
3ef5728030da
Calculate the size of key EBML master elements beforehand so only just enough size is reserved for the size
conrad
parents:
2488
diff
changeset
|
34 typedef struct ebml_master { |
3973
549a09cf23fe
Remove offset_t typedef and use int64_t directly instead.
diego
parents:
3892
diff
changeset
|
35 int64_t pos; ///< absolute offset in the file where the master's elements start |
2489
3ef5728030da
Calculate the size of key EBML master elements beforehand so only just enough size is reserved for the size
conrad
parents:
2488
diff
changeset
|
36 int sizebytes; ///< how many bytes were reserved for the size |
3ef5728030da
Calculate the size of key EBML master elements beforehand so only just enough size is reserved for the size
conrad
parents:
2488
diff
changeset
|
37 } ebml_master; |
3ef5728030da
Calculate the size of key EBML master elements beforehand so only just enough size is reserved for the size
conrad
parents:
2488
diff
changeset
|
38 |
2447 | 39 typedef struct mkv_seekhead_entry { |
40 unsigned int elementid; | |
41 uint64_t segmentpos; | |
42 } mkv_seekhead_entry; | |
43 | |
44 typedef struct mkv_seekhead { | |
3973
549a09cf23fe
Remove offset_t typedef and use int64_t directly instead.
diego
parents:
3892
diff
changeset
|
45 int64_t filepos; |
549a09cf23fe
Remove offset_t typedef and use int64_t directly instead.
diego
parents:
3892
diff
changeset
|
46 int64_t segment_offset; ///< the file offset to the beginning of the segment |
2450 | 47 int reserved_size; ///< -1 if appending to file |
2447 | 48 int max_entries; |
49 mkv_seekhead_entry *entries; | |
50 int num_entries; | |
51 } mkv_seekhead; | |
52 | |
2451 | 53 typedef struct { |
54 uint64_t pts; | |
55 int tracknum; | |
3973
549a09cf23fe
Remove offset_t typedef and use int64_t directly instead.
diego
parents:
3892
diff
changeset
|
56 int64_t cluster_pos; ///< file offset of the cluster containing the block |
2451 | 57 } mkv_cuepoint; |
58 | |
59 typedef struct { | |
3973
549a09cf23fe
Remove offset_t typedef and use int64_t directly instead.
diego
parents:
3892
diff
changeset
|
60 int64_t segment_offset; |
2451 | 61 mkv_cuepoint *entries; |
62 int num_entries; | |
63 } mkv_cues; | |
64 | |
5793 | 65 typedef struct { |
66 int write_dts; | |
67 } mkv_track; | |
68 | |
6086 | 69 #define MODE_MATROSKAv2 0x01 |
70 #define MODE_WEBM 0x02 | |
71 | |
2425
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
72 typedef struct MatroskaMuxContext { |
6086 | 73 int mode; |
5747
551765b1772b
Ensure that we write clusters and blocks with known size when streaming
conrad
parents:
5746
diff
changeset
|
74 ByteIOContext *dyn_bc; |
2489
3ef5728030da
Calculate the size of key EBML master elements beforehand so only just enough size is reserved for the size
conrad
parents:
2488
diff
changeset
|
75 ebml_master segment; |
3973
549a09cf23fe
Remove offset_t typedef and use int64_t directly instead.
diego
parents:
3892
diff
changeset
|
76 int64_t segment_offset; |
2489
3ef5728030da
Calculate the size of key EBML master elements beforehand so only just enough size is reserved for the size
conrad
parents:
2488
diff
changeset
|
77 ebml_master cluster; |
3973
549a09cf23fe
Remove offset_t typedef and use int64_t directly instead.
diego
parents:
3892
diff
changeset
|
78 int64_t cluster_pos; ///< file offset of the current cluster |
5795 | 79 int64_t cluster_pts; |
3973
549a09cf23fe
Remove offset_t typedef and use int64_t directly instead.
diego
parents:
3892
diff
changeset
|
80 int64_t duration_offset; |
5795 | 81 int64_t duration; |
2447 | 82 mkv_seekhead *main_seekhead; |
2451 | 83 mkv_cues *cues; |
5793 | 84 mkv_track *tracks; |
2479
139406606437
Use a MD5 hash of some frames to write the segment uid
conrad
parents:
2478
diff
changeset
|
85 |
6085 | 86 unsigned int audio_buffer_size; |
87 AVPacket cur_audio_pkt; | |
2425
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
88 } MatroskaMuxContext; |
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
89 |
2489
3ef5728030da
Calculate the size of key EBML master elements beforehand so only just enough size is reserved for the size
conrad
parents:
2488
diff
changeset
|
90 |
2506 | 91 /** 2 bytes * 3 for EBML IDs, 3 1-byte EBML lengths, 8 bytes for 64 bit |
92 * offset, 4 bytes for target EBML ID */ | |
2489
3ef5728030da
Calculate the size of key EBML master elements beforehand so only just enough size is reserved for the size
conrad
parents:
2488
diff
changeset
|
93 #define MAX_SEEKENTRY_SIZE 21 |
3ef5728030da
Calculate the size of key EBML master elements beforehand so only just enough size is reserved for the size
conrad
parents:
2488
diff
changeset
|
94 |
2506 | 95 /** per-cuepoint-track - 3 1-byte EBML IDs, 3 1-byte EBML sizes, 2 |
96 * 8-byte uint max */ | |
2489
3ef5728030da
Calculate the size of key EBML master elements beforehand so only just enough size is reserved for the size
conrad
parents:
2488
diff
changeset
|
97 #define MAX_CUETRACKPOS_SIZE 22 |
3ef5728030da
Calculate the size of key EBML master elements beforehand so only just enough size is reserved for the size
conrad
parents:
2488
diff
changeset
|
98 |
2506 | 99 /** per-cuepoint - 2 1-byte EBML IDs, 2 1-byte EBML sizes, 8-byte uint max */ |
2489
3ef5728030da
Calculate the size of key EBML master elements beforehand so only just enough size is reserved for the size
conrad
parents:
2488
diff
changeset
|
100 #define MAX_CUEPOINT_SIZE(num_tracks) 12 + MAX_CUETRACKPOS_SIZE*num_tracks |
3ef5728030da
Calculate the size of key EBML master elements beforehand so only just enough size is reserved for the size
conrad
parents:
2488
diff
changeset
|
101 |
3ef5728030da
Calculate the size of key EBML master elements beforehand so only just enough size is reserved for the size
conrad
parents:
2488
diff
changeset
|
102 |
2481 | 103 static int ebml_id_size(unsigned int id) |
104 { | |
105 return (av_log2(id+1)-1)/7+1; | |
106 } | |
107 | |
2425
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
108 static void put_ebml_id(ByteIOContext *pb, unsigned int id) |
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
109 { |
2482 | 110 int i = ebml_id_size(id); |
111 while (i--) | |
112 put_byte(pb, id >> (i*8)); | |
2425
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
113 } |
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
114 |
2480 | 115 /** |
2530 | 116 * Write an EBML size meaning "unknown size". |
2480 | 117 * |
2530 | 118 * @param bytes The number of bytes the size should occupy (maximum: 8). |
2480 | 119 */ |
120 static void put_ebml_size_unknown(ByteIOContext *pb, int bytes) | |
121 { | |
2497 | 122 assert(bytes <= 8); |
2496 | 123 put_byte(pb, 0x1ff >> bytes); |
124 while (--bytes) | |
125 put_byte(pb, 0xff); | |
2480 | 126 } |
127 | |
2484
60428e4e5242
Move calculating the bytes needed to represent a size in EBML to its own function
conrad
parents:
2483
diff
changeset
|
128 /** |
2517
ac3e650ec92c
Rename ebml size functions to indicate that they can be used for more kinds of numbers
conrad
parents:
2516
diff
changeset
|
129 * Calculate how many bytes are needed to represent a given number in EBML. |
2484
60428e4e5242
Move calculating the bytes needed to represent a size in EBML to its own function
conrad
parents:
2483
diff
changeset
|
130 */ |
2517
ac3e650ec92c
Rename ebml size functions to indicate that they can be used for more kinds of numbers
conrad
parents:
2516
diff
changeset
|
131 static int ebml_num_size(uint64_t num) |
2484
60428e4e5242
Move calculating the bytes needed to represent a size in EBML to its own function
conrad
parents:
2483
diff
changeset
|
132 { |
60428e4e5242
Move calculating the bytes needed to represent a size in EBML to its own function
conrad
parents:
2483
diff
changeset
|
133 int bytes = 1; |
2517
ac3e650ec92c
Rename ebml size functions to indicate that they can be used for more kinds of numbers
conrad
parents:
2516
diff
changeset
|
134 while ((num+1) >> bytes*7) bytes++; |
2484
60428e4e5242
Move calculating the bytes needed to represent a size in EBML to its own function
conrad
parents:
2483
diff
changeset
|
135 return bytes; |
60428e4e5242
Move calculating the bytes needed to represent a size in EBML to its own function
conrad
parents:
2483
diff
changeset
|
136 } |
60428e4e5242
Move calculating the bytes needed to represent a size in EBML to its own function
conrad
parents:
2483
diff
changeset
|
137 |
2487
9a9c45b95c6f
Modify put_ebml_size() so that the bytes parameter is exact rather than minimum
conrad
parents:
2486
diff
changeset
|
138 /** |
2517
ac3e650ec92c
Rename ebml size functions to indicate that they can be used for more kinds of numbers
conrad
parents:
2516
diff
changeset
|
139 * Write a number in EBML variable length format. |
2487
9a9c45b95c6f
Modify put_ebml_size() so that the bytes parameter is exact rather than minimum
conrad
parents:
2486
diff
changeset
|
140 * |
2517
ac3e650ec92c
Rename ebml size functions to indicate that they can be used for more kinds of numbers
conrad
parents:
2516
diff
changeset
|
141 * @param bytes The number of bytes that need to be used to write the number. |
2487
9a9c45b95c6f
Modify put_ebml_size() so that the bytes parameter is exact rather than minimum
conrad
parents:
2486
diff
changeset
|
142 * If zero, any number of bytes can be used. |
9a9c45b95c6f
Modify put_ebml_size() so that the bytes parameter is exact rather than minimum
conrad
parents:
2486
diff
changeset
|
143 */ |
2517
ac3e650ec92c
Rename ebml size functions to indicate that they can be used for more kinds of numbers
conrad
parents:
2516
diff
changeset
|
144 static void put_ebml_num(ByteIOContext *pb, uint64_t num, int bytes) |
2425
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
145 { |
2517
ac3e650ec92c
Rename ebml size functions to indicate that they can be used for more kinds of numbers
conrad
parents:
2516
diff
changeset
|
146 int i, needed_bytes = ebml_num_size(num); |
2425
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
147 |
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
148 // sizes larger than this are currently undefined in EBML |
2517
ac3e650ec92c
Rename ebml size functions to indicate that they can be used for more kinds of numbers
conrad
parents:
2516
diff
changeset
|
149 assert(num < (1ULL<<56)-1); |
2440
69e2592531b6
Write unknown size if the size given is too large for EBML (greater than 2^56-1)
conrad
parents:
2439
diff
changeset
|
150 |
2487
9a9c45b95c6f
Modify put_ebml_size() so that the bytes parameter is exact rather than minimum
conrad
parents:
2486
diff
changeset
|
151 if (bytes == 0) |
9a9c45b95c6f
Modify put_ebml_size() so that the bytes parameter is exact rather than minimum
conrad
parents:
2486
diff
changeset
|
152 // don't care how many bytes are used, so use the min |
9a9c45b95c6f
Modify put_ebml_size() so that the bytes parameter is exact rather than minimum
conrad
parents:
2486
diff
changeset
|
153 bytes = needed_bytes; |
2498 | 154 // the bytes needed to write the given size would exceed the bytes |
155 // that we need to use, so write unknown size. This shouldn't happen. | |
2497 | 156 assert(bytes >= needed_bytes); |
2487
9a9c45b95c6f
Modify put_ebml_size() so that the bytes parameter is exact rather than minimum
conrad
parents:
2486
diff
changeset
|
157 |
2517
ac3e650ec92c
Rename ebml size functions to indicate that they can be used for more kinds of numbers
conrad
parents:
2516
diff
changeset
|
158 num |= 1ULL << bytes*7; |
2485 | 159 for (i = bytes - 1; i >= 0; i--) |
2517
ac3e650ec92c
Rename ebml size functions to indicate that they can be used for more kinds of numbers
conrad
parents:
2516
diff
changeset
|
160 put_byte(pb, num >> i*8); |
2425
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
161 } |
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
162 |
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
163 static void put_ebml_uint(ByteIOContext *pb, unsigned int elementid, uint64_t val) |
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
164 { |
2483 | 165 int i, bytes = 1; |
3097 | 166 uint64_t tmp = val; |
167 while (tmp>>=8) bytes++; | |
2425
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
168 |
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
169 put_ebml_id(pb, elementid); |
2517
ac3e650ec92c
Rename ebml size functions to indicate that they can be used for more kinds of numbers
conrad
parents:
2516
diff
changeset
|
170 put_ebml_num(pb, bytes, 0); |
2483 | 171 for (i = bytes - 1; i >= 0; i--) |
172 put_byte(pb, val >> i*8); | |
2425
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
173 } |
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
174 |
2430 | 175 static void put_ebml_float(ByteIOContext *pb, unsigned int elementid, double val) |
176 { | |
177 put_ebml_id(pb, elementid); | |
2517
ac3e650ec92c
Rename ebml size functions to indicate that they can be used for more kinds of numbers
conrad
parents:
2516
diff
changeset
|
178 put_ebml_num(pb, 8, 0); |
2430 | 179 put_be64(pb, av_dbl2int(val)); |
180 } | |
181 | |
2425
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
182 static void put_ebml_binary(ByteIOContext *pb, unsigned int elementid, |
6087
8d2040032231
matroskaenc: Make put_ebml_binary take a void pointer
conrad
parents:
6086
diff
changeset
|
183 const void *buf, int size) |
2425
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
184 { |
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
185 put_ebml_id(pb, elementid); |
2517
ac3e650ec92c
Rename ebml size functions to indicate that they can be used for more kinds of numbers
conrad
parents:
2516
diff
changeset
|
186 put_ebml_num(pb, size, 0); |
2425
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
187 put_buffer(pb, buf, size); |
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
188 } |
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
189 |
2429 | 190 static void put_ebml_string(ByteIOContext *pb, unsigned int elementid, const char *str) |
2425
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
191 { |
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
192 put_ebml_binary(pb, elementid, str, strlen(str)); |
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
193 } |
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
194 |
2477 | 195 /** |
6199 | 196 * Write a void element of a given size. Useful for reserving space in |
2494 | 197 * the file to be written to later. |
2477 | 198 * |
2491 | 199 * @param size The number of bytes to reserve, which must be at least 2. |
2477 | 200 */ |
2442 | 201 static void put_ebml_void(ByteIOContext *pb, uint64_t size) |
202 { | |
3973
549a09cf23fe
Remove offset_t typedef and use int64_t directly instead.
diego
parents:
3892
diff
changeset
|
203 int64_t currentpos = url_ftell(pb); |
2442 | 204 |
2497 | 205 assert(size >= 2); |
2442 | 206 |
207 put_ebml_id(pb, EBML_ID_VOID); | |
2494 | 208 // we need to subtract the length needed to store the size from the |
209 // size we need to reserve so 2 cases, we use 8 bytes to store the | |
210 // size if possible, 1 byte otherwise | |
2442 | 211 if (size < 10) |
2517
ac3e650ec92c
Rename ebml size functions to indicate that they can be used for more kinds of numbers
conrad
parents:
2516
diff
changeset
|
212 put_ebml_num(pb, size-1, 0); |
2442 | 213 else |
2517
ac3e650ec92c
Rename ebml size functions to indicate that they can be used for more kinds of numbers
conrad
parents:
2516
diff
changeset
|
214 put_ebml_num(pb, size-9, 8); |
2928
bdc992cb8e46
Write 0 instead of seeking forward (and leaving bytes uninitalized),
michael
parents:
2927
diff
changeset
|
215 while(url_ftell(pb) < currentpos + size) |
bdc992cb8e46
Write 0 instead of seeking forward (and leaving bytes uninitalized),
michael
parents:
2927
diff
changeset
|
216 put_byte(pb, 0); |
2442 | 217 } |
218 | |
2489
3ef5728030da
Calculate the size of key EBML master elements beforehand so only just enough size is reserved for the size
conrad
parents:
2488
diff
changeset
|
219 static ebml_master start_ebml_master(ByteIOContext *pb, unsigned int elementid, uint64_t expectedsize) |
2425
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
220 { |
2517
ac3e650ec92c
Rename ebml size functions to indicate that they can be used for more kinds of numbers
conrad
parents:
2516
diff
changeset
|
221 int bytes = expectedsize ? ebml_num_size(expectedsize) : 8; |
2425
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
222 put_ebml_id(pb, elementid); |
2489
3ef5728030da
Calculate the size of key EBML master elements beforehand so only just enough size is reserved for the size
conrad
parents:
2488
diff
changeset
|
223 put_ebml_size_unknown(pb, bytes); |
3ef5728030da
Calculate the size of key EBML master elements beforehand so only just enough size is reserved for the size
conrad
parents:
2488
diff
changeset
|
224 return (ebml_master){ url_ftell(pb), bytes }; |
2425
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
225 } |
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
226 |
2489
3ef5728030da
Calculate the size of key EBML master elements beforehand so only just enough size is reserved for the size
conrad
parents:
2488
diff
changeset
|
227 static void end_ebml_master(ByteIOContext *pb, ebml_master master) |
2425
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
228 { |
3973
549a09cf23fe
Remove offset_t typedef and use int64_t directly instead.
diego
parents:
3892
diff
changeset
|
229 int64_t pos = url_ftell(pb); |
2425
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
230 |
5743
0c1e9df4e3cd
Attempt seeking to write EBML master sizes even if streamed
conrad
parents:
5742
diff
changeset
|
231 if (url_fseek(pb, master.pos - master.sizebytes, SEEK_SET) < 0) |
2514 | 232 return; |
2517
ac3e650ec92c
Rename ebml size functions to indicate that they can be used for more kinds of numbers
conrad
parents:
2516
diff
changeset
|
233 put_ebml_num(pb, pos - master.pos, master.sizebytes); |
2425
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
234 url_fseek(pb, pos, SEEK_SET); |
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
235 } |
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
236 |
2469 | 237 static void put_xiph_size(ByteIOContext *pb, int size) |
238 { | |
239 int i; | |
240 for (i = 0; i < size / 255; i++) | |
241 put_byte(pb, 255); | |
242 put_byte(pb, size % 255); | |
243 } | |
244 | |
2477 | 245 /** |
2494 | 246 * Initialize a mkv_seekhead element to be ready to index level 1 Matroska |
247 * elements. If a maximum number of elements is specified, enough space | |
248 * will be reserved at the current file location to write a seek head of | |
249 * that size. | |
2477 | 250 * |
2494 | 251 * @param segment_offset The absolute offset to the position in the file |
2519 | 252 * where the segment begins. |
253 * @param numelements The maximum number of elements that will be indexed | |
2494 | 254 * by this seek head, 0 if unlimited. |
2477 | 255 */ |
3973
549a09cf23fe
Remove offset_t typedef and use int64_t directly instead.
diego
parents:
3892
diff
changeset
|
256 static mkv_seekhead * mkv_start_seekhead(ByteIOContext *pb, int64_t segment_offset, int numelements) |
2447 | 257 { |
258 mkv_seekhead *new_seekhead = av_mallocz(sizeof(mkv_seekhead)); | |
259 if (new_seekhead == NULL) | |
260 return NULL; | |
261 | |
262 new_seekhead->segment_offset = segment_offset; | |
263 | |
264 if (numelements > 0) { | |
265 new_seekhead->filepos = url_ftell(pb); | |
2494 | 266 // 21 bytes max for a seek entry, 10 bytes max for the SeekHead ID |
267 // and size, and 3 bytes to guarantee that an EBML void element | |
268 // will fit afterwards | |
2489
3ef5728030da
Calculate the size of key EBML master elements beforehand so only just enough size is reserved for the size
conrad
parents:
2488
diff
changeset
|
269 new_seekhead->reserved_size = numelements * MAX_SEEKENTRY_SIZE + 13; |
2447 | 270 new_seekhead->max_entries = numelements; |
271 put_ebml_void(pb, new_seekhead->reserved_size); | |
272 } | |
273 return new_seekhead; | |
274 } | |
275 | |
276 static int mkv_add_seekhead_entry(mkv_seekhead *seekhead, unsigned int elementid, uint64_t filepos) | |
277 { | |
278 mkv_seekhead_entry *entries = seekhead->entries; | |
279 | |
280 // don't store more elements than we reserved space for | |
281 if (seekhead->max_entries > 0 && seekhead->max_entries <= seekhead->num_entries) | |
282 return -1; | |
283 | |
284 entries = av_realloc(entries, (seekhead->num_entries + 1) * sizeof(mkv_seekhead_entry)); | |
285 if (entries == NULL) | |
2499 | 286 return AVERROR(ENOMEM); |
2447 | 287 |
2507
048f4f45a84c
Use num_entries directly rather than mixing it with a local copy
conrad
parents:
2506
diff
changeset
|
288 entries[seekhead->num_entries ].elementid = elementid; |
048f4f45a84c
Use num_entries directly rather than mixing it with a local copy
conrad
parents:
2506
diff
changeset
|
289 entries[seekhead->num_entries++].segmentpos = filepos - seekhead->segment_offset; |
2447 | 290 |
291 seekhead->entries = entries; | |
292 return 0; | |
293 } | |
294 | |
2477 | 295 /** |
2494 | 296 * Write the seek head to the file and free it. If a maximum number of |
297 * elements was specified to mkv_start_seekhead(), the seek head will | |
298 * be written at the location reserved for it. Otherwise, it is written | |
299 * at the current location in the file. | |
2477 | 300 * |
5744
a656843c86aa
Write the first seekhead if writing to a stream, we won't be able to seek
conrad
parents:
5743
diff
changeset
|
301 * @return The file offset where the seekhead was written, |
a656843c86aa
Write the first seekhead if writing to a stream, we won't be able to seek
conrad
parents:
5743
diff
changeset
|
302 * -1 if an error occurred. |
2477 | 303 */ |
3973
549a09cf23fe
Remove offset_t typedef and use int64_t directly instead.
diego
parents:
3892
diff
changeset
|
304 static int64_t mkv_write_seekhead(ByteIOContext *pb, mkv_seekhead *seekhead) |
2447 | 305 { |
2489
3ef5728030da
Calculate the size of key EBML master elements beforehand so only just enough size is reserved for the size
conrad
parents:
2488
diff
changeset
|
306 ebml_master metaseek, seekentry; |
3973
549a09cf23fe
Remove offset_t typedef and use int64_t directly instead.
diego
parents:
3892
diff
changeset
|
307 int64_t currentpos; |
2447 | 308 int i; |
309 | |
310 currentpos = url_ftell(pb); | |
311 | |
312 if (seekhead->reserved_size > 0) | |
5744
a656843c86aa
Write the first seekhead if writing to a stream, we won't be able to seek
conrad
parents:
5743
diff
changeset
|
313 if (url_fseek(pb, seekhead->filepos, SEEK_SET) < 0) |
a656843c86aa
Write the first seekhead if writing to a stream, we won't be able to seek
conrad
parents:
5743
diff
changeset
|
314 return -1; |
2447 | 315 |
2489
3ef5728030da
Calculate the size of key EBML master elements beforehand so only just enough size is reserved for the size
conrad
parents:
2488
diff
changeset
|
316 metaseek = start_ebml_master(pb, MATROSKA_ID_SEEKHEAD, seekhead->reserved_size); |
2447 | 317 for (i = 0; i < seekhead->num_entries; i++) { |
318 mkv_seekhead_entry *entry = &seekhead->entries[i]; | |
319 | |
2489
3ef5728030da
Calculate the size of key EBML master elements beforehand so only just enough size is reserved for the size
conrad
parents:
2488
diff
changeset
|
320 seekentry = start_ebml_master(pb, MATROSKA_ID_SEEKENTRY, MAX_SEEKENTRY_SIZE); |
2447 | 321 |
322 put_ebml_id(pb, MATROSKA_ID_SEEKID); | |
2517
ac3e650ec92c
Rename ebml size functions to indicate that they can be used for more kinds of numbers
conrad
parents:
2516
diff
changeset
|
323 put_ebml_num(pb, ebml_id_size(entry->elementid), 0); |
2447 | 324 put_ebml_id(pb, entry->elementid); |
325 | |
326 put_ebml_uint(pb, MATROSKA_ID_SEEKPOSITION, entry->segmentpos); | |
327 end_ebml_master(pb, seekentry); | |
328 } | |
329 end_ebml_master(pb, metaseek); | |
330 | |
331 if (seekhead->reserved_size > 0) { | |
332 uint64_t remaining = seekhead->filepos + seekhead->reserved_size - url_ftell(pb); | |
333 put_ebml_void(pb, remaining); | |
334 url_fseek(pb, currentpos, SEEK_SET); | |
335 | |
336 currentpos = seekhead->filepos; | |
337 } | |
338 av_free(seekhead->entries); | |
339 av_free(seekhead); | |
340 | |
341 return currentpos; | |
342 } | |
343 | |
3973
549a09cf23fe
Remove offset_t typedef and use int64_t directly instead.
diego
parents:
3892
diff
changeset
|
344 static mkv_cues * mkv_start_cues(int64_t segment_offset) |
2451 | 345 { |
346 mkv_cues *cues = av_mallocz(sizeof(mkv_cues)); | |
347 if (cues == NULL) | |
348 return NULL; | |
349 | |
350 cues->segment_offset = segment_offset; | |
351 return cues; | |
352 } | |
353 | |
5793 | 354 static int mkv_add_cuepoint(mkv_cues *cues, int stream, int64_t ts, int64_t cluster_pos) |
2451 | 355 { |
356 mkv_cuepoint *entries = cues->entries; | |
357 | |
358 entries = av_realloc(entries, (cues->num_entries + 1) * sizeof(mkv_cuepoint)); | |
359 if (entries == NULL) | |
2499 | 360 return AVERROR(ENOMEM); |
2451 | 361 |
5795 | 362 if (ts < 0) |
363 return 0; | |
364 | |
5793 | 365 entries[cues->num_entries ].pts = ts; |
366 entries[cues->num_entries ].tracknum = stream + 1; | |
2507
048f4f45a84c
Use num_entries directly rather than mixing it with a local copy
conrad
parents:
2506
diff
changeset
|
367 entries[cues->num_entries++].cluster_pos = cluster_pos - cues->segment_offset; |
2451 | 368 |
369 cues->entries = entries; | |
370 return 0; | |
371 } | |
372 | |
3973
549a09cf23fe
Remove offset_t typedef and use int64_t directly instead.
diego
parents:
3892
diff
changeset
|
373 static int64_t mkv_write_cues(ByteIOContext *pb, mkv_cues *cues, int num_tracks) |
2451 | 374 { |
2489
3ef5728030da
Calculate the size of key EBML master elements beforehand so only just enough size is reserved for the size
conrad
parents:
2488
diff
changeset
|
375 ebml_master cues_element; |
3973
549a09cf23fe
Remove offset_t typedef and use int64_t directly instead.
diego
parents:
3892
diff
changeset
|
376 int64_t currentpos; |
2451 | 377 int i, j; |
378 | |
379 currentpos = url_ftell(pb); | |
2489
3ef5728030da
Calculate the size of key EBML master elements beforehand so only just enough size is reserved for the size
conrad
parents:
2488
diff
changeset
|
380 cues_element = start_ebml_master(pb, MATROSKA_ID_CUES, 0); |
2451 | 381 |
382 for (i = 0; i < cues->num_entries; i++) { | |
2489
3ef5728030da
Calculate the size of key EBML master elements beforehand so only just enough size is reserved for the size
conrad
parents:
2488
diff
changeset
|
383 ebml_master cuepoint, track_positions; |
2451 | 384 mkv_cuepoint *entry = &cues->entries[i]; |
385 uint64_t pts = entry->pts; | |
386 | |
2489
3ef5728030da
Calculate the size of key EBML master elements beforehand so only just enough size is reserved for the size
conrad
parents:
2488
diff
changeset
|
387 cuepoint = start_ebml_master(pb, MATROSKA_ID_POINTENTRY, MAX_CUEPOINT_SIZE(num_tracks)); |
2451 | 388 put_ebml_uint(pb, MATROSKA_ID_CUETIME, pts); |
389 | |
390 // put all the entries from different tracks that have the exact same | |
391 // timestamp into the same CuePoint | |
392 for (j = 0; j < cues->num_entries - i && entry[j].pts == pts; j++) { | |
2489
3ef5728030da
Calculate the size of key EBML master elements beforehand so only just enough size is reserved for the size
conrad
parents:
2488
diff
changeset
|
393 track_positions = start_ebml_master(pb, MATROSKA_ID_CUETRACKPOSITION, MAX_CUETRACKPOS_SIZE); |
2451 | 394 put_ebml_uint(pb, MATROSKA_ID_CUETRACK , entry[j].tracknum ); |
395 put_ebml_uint(pb, MATROSKA_ID_CUECLUSTERPOSITION, entry[j].cluster_pos); | |
396 end_ebml_master(pb, track_positions); | |
397 } | |
398 i += j - 1; | |
399 end_ebml_master(pb, cuepoint); | |
400 } | |
401 end_ebml_master(pb, cues_element); | |
402 | |
403 av_free(cues->entries); | |
404 av_free(cues); | |
405 return currentpos; | |
406 } | |
407 | |
2518 | 408 static int put_xiph_codecpriv(AVFormatContext *s, ByteIOContext *pb, AVCodecContext *codec) |
2444
d954330691c5
Move Xiph's CodecPrivate writing code to its own function
conrad
parents:
2443
diff
changeset
|
409 { |
d954330691c5
Move Xiph's CodecPrivate writing code to its own function
conrad
parents:
2443
diff
changeset
|
410 uint8_t *header_start[3]; |
d954330691c5
Move Xiph's CodecPrivate writing code to its own function
conrad
parents:
2443
diff
changeset
|
411 int header_len[3]; |
d954330691c5
Move Xiph's CodecPrivate writing code to its own function
conrad
parents:
2443
diff
changeset
|
412 int first_header_size; |
2469 | 413 int j; |
2444
d954330691c5
Move Xiph's CodecPrivate writing code to its own function
conrad
parents:
2443
diff
changeset
|
414 |
d954330691c5
Move Xiph's CodecPrivate writing code to its own function
conrad
parents:
2443
diff
changeset
|
415 if (codec->codec_id == CODEC_ID_VORBIS) |
d954330691c5
Move Xiph's CodecPrivate writing code to its own function
conrad
parents:
2443
diff
changeset
|
416 first_header_size = 30; |
d954330691c5
Move Xiph's CodecPrivate writing code to its own function
conrad
parents:
2443
diff
changeset
|
417 else |
d954330691c5
Move Xiph's CodecPrivate writing code to its own function
conrad
parents:
2443
diff
changeset
|
418 first_header_size = 42; |
d954330691c5
Move Xiph's CodecPrivate writing code to its own function
conrad
parents:
2443
diff
changeset
|
419 |
d954330691c5
Move Xiph's CodecPrivate writing code to its own function
conrad
parents:
2443
diff
changeset
|
420 if (ff_split_xiph_headers(codec->extradata, codec->extradata_size, |
d954330691c5
Move Xiph's CodecPrivate writing code to its own function
conrad
parents:
2443
diff
changeset
|
421 first_header_size, header_start, header_len) < 0) { |
2518 | 422 av_log(s, AV_LOG_ERROR, "Extradata corrupt.\n"); |
2444
d954330691c5
Move Xiph's CodecPrivate writing code to its own function
conrad
parents:
2443
diff
changeset
|
423 return -1; |
d954330691c5
Move Xiph's CodecPrivate writing code to its own function
conrad
parents:
2443
diff
changeset
|
424 } |
d954330691c5
Move Xiph's CodecPrivate writing code to its own function
conrad
parents:
2443
diff
changeset
|
425 |
d954330691c5
Move Xiph's CodecPrivate writing code to its own function
conrad
parents:
2443
diff
changeset
|
426 put_byte(pb, 2); // number packets - 1 |
d954330691c5
Move Xiph's CodecPrivate writing code to its own function
conrad
parents:
2443
diff
changeset
|
427 for (j = 0; j < 2; j++) { |
2469 | 428 put_xiph_size(pb, header_len[j]); |
2444
d954330691c5
Move Xiph's CodecPrivate writing code to its own function
conrad
parents:
2443
diff
changeset
|
429 } |
d954330691c5
Move Xiph's CodecPrivate writing code to its own function
conrad
parents:
2443
diff
changeset
|
430 for (j = 0; j < 3; j++) |
d954330691c5
Move Xiph's CodecPrivate writing code to its own function
conrad
parents:
2443
diff
changeset
|
431 put_buffer(pb, header_start[j], header_len[j]); |
2446
b2f9523ee424
Make sure to return a value in functions that return a value
conrad
parents:
2445
diff
changeset
|
432 |
b2f9523ee424
Make sure to return a value in functions that return a value
conrad
parents:
2445
diff
changeset
|
433 return 0; |
2444
d954330691c5
Move Xiph's CodecPrivate writing code to its own function
conrad
parents:
2443
diff
changeset
|
434 } |
2425
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
435 |
2518 | 436 static void get_aac_sample_rates(AVFormatContext *s, AVCodecContext *codec, int *sample_rate, int *output_sample_rate) |
2458
7286ab3bf026
Determine the output sample rate for SBR AAC and write it
conrad
parents:
2457
diff
changeset
|
437 { |
7286ab3bf026
Determine the output sample rate for SBR AAC and write it
conrad
parents:
2457
diff
changeset
|
438 int sri; |
7286ab3bf026
Determine the output sample rate for SBR AAC and write it
conrad
parents:
2457
diff
changeset
|
439 |
7286ab3bf026
Determine the output sample rate for SBR AAC and write it
conrad
parents:
2457
diff
changeset
|
440 if (codec->extradata_size < 2) { |
2519 | 441 av_log(s, AV_LOG_WARNING, "No AAC extradata, unable to determine samplerate.\n"); |
2458
7286ab3bf026
Determine the output sample rate for SBR AAC and write it
conrad
parents:
2457
diff
changeset
|
442 return; |
7286ab3bf026
Determine the output sample rate for SBR AAC and write it
conrad
parents:
2457
diff
changeset
|
443 } |
7286ab3bf026
Determine the output sample rate for SBR AAC and write it
conrad
parents:
2457
diff
changeset
|
444 |
7286ab3bf026
Determine the output sample rate for SBR AAC and write it
conrad
parents:
2457
diff
changeset
|
445 sri = ((codec->extradata[0] << 1) & 0xE) | (codec->extradata[1] >> 7); |
7286ab3bf026
Determine the output sample rate for SBR AAC and write it
conrad
parents:
2457
diff
changeset
|
446 if (sri > 12) { |
2518 | 447 av_log(s, AV_LOG_WARNING, "AAC samplerate index out of bounds\n"); |
2458
7286ab3bf026
Determine the output sample rate for SBR AAC and write it
conrad
parents:
2457
diff
changeset
|
448 return; |
7286ab3bf026
Determine the output sample rate for SBR AAC and write it
conrad
parents:
2457
diff
changeset
|
449 } |
3201 | 450 *sample_rate = ff_mpeg4audio_sample_rates[sri]; |
2458
7286ab3bf026
Determine the output sample rate for SBR AAC and write it
conrad
parents:
2457
diff
changeset
|
451 |
7286ab3bf026
Determine the output sample rate for SBR AAC and write it
conrad
parents:
2457
diff
changeset
|
452 // if sbr, get output sample rate as well |
7286ab3bf026
Determine the output sample rate for SBR AAC and write it
conrad
parents:
2457
diff
changeset
|
453 if (codec->extradata_size == 5) { |
7286ab3bf026
Determine the output sample rate for SBR AAC and write it
conrad
parents:
2457
diff
changeset
|
454 sri = (codec->extradata[4] >> 3) & 0xF; |
7286ab3bf026
Determine the output sample rate for SBR AAC and write it
conrad
parents:
2457
diff
changeset
|
455 if (sri > 12) { |
2518 | 456 av_log(s, AV_LOG_WARNING, "AAC output samplerate index out of bounds\n"); |
2458
7286ab3bf026
Determine the output sample rate for SBR AAC and write it
conrad
parents:
2457
diff
changeset
|
457 return; |
7286ab3bf026
Determine the output sample rate for SBR AAC and write it
conrad
parents:
2457
diff
changeset
|
458 } |
3201 | 459 *output_sample_rate = ff_mpeg4audio_sample_rates[sri]; |
2458
7286ab3bf026
Determine the output sample rate for SBR AAC and write it
conrad
parents:
2457
diff
changeset
|
460 } |
7286ab3bf026
Determine the output sample rate for SBR AAC and write it
conrad
parents:
2457
diff
changeset
|
461 } |
7286ab3bf026
Determine the output sample rate for SBR AAC and write it
conrad
parents:
2457
diff
changeset
|
462 |
3601 | 463 static int mkv_write_codecprivate(AVFormatContext *s, ByteIOContext *pb, AVCodecContext *codec, int native_id, int qt_id) |
2509
5abcad2566b3
Move writing codec private element to its own function
conrad
parents:
2508
diff
changeset
|
464 { |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2530
diff
changeset
|
465 ByteIOContext *dyn_cp; |
2510
4ba8d5f648a4
Write codecprivate to a dynamic buffer so that seeking isn't required
conrad
parents:
2509
diff
changeset
|
466 uint8_t *codecpriv; |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2530
diff
changeset
|
467 int ret, codecpriv_size; |
2510
4ba8d5f648a4
Write codecprivate to a dynamic buffer so that seeking isn't required
conrad
parents:
2509
diff
changeset
|
468 |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2530
diff
changeset
|
469 ret = url_open_dyn_buf(&dyn_cp); |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2530
diff
changeset
|
470 if(ret < 0) |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2530
diff
changeset
|
471 return ret; |
2509
5abcad2566b3
Move writing codec private element to its own function
conrad
parents:
2508
diff
changeset
|
472 |
5abcad2566b3
Move writing codec private element to its own function
conrad
parents:
2508
diff
changeset
|
473 if (native_id) { |
2513 | 474 if (codec->codec_id == CODEC_ID_VORBIS || codec->codec_id == CODEC_ID_THEORA) |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2530
diff
changeset
|
475 ret = put_xiph_codecpriv(s, dyn_cp, codec); |
2513 | 476 else if (codec->codec_id == CODEC_ID_FLAC) |
5857 | 477 ret = ff_flac_write_header(dyn_cp, codec, 1); |
2923
0fde8da65761
Use the isom avcc formatting for h264 extradata in matroska.
aurel
parents:
2771
diff
changeset
|
478 else if (codec->codec_id == CODEC_ID_H264) |
2927
b75a49790f31
add a ff_ prefix to newly exported functions from avc.c
aurel
parents:
2926
diff
changeset
|
479 ret = ff_isom_write_avcc(dyn_cp, codec->extradata, codec->extradata_size); |
2513 | 480 else if (codec->extradata_size) |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2530
diff
changeset
|
481 put_buffer(dyn_cp, codec->extradata, codec->extradata_size); |
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5886
diff
changeset
|
482 } else if (codec->codec_type == AVMEDIA_TYPE_VIDEO) { |
3601 | 483 if (qt_id) { |
484 if (!codec->codec_tag) | |
5058
33a244b7ca65
Add ff_ prefixes to exported symbols in libavformat/riff.h.
diego
parents:
4581
diff
changeset
|
485 codec->codec_tag = ff_codec_get_tag(codec_movvideo_tags, codec->codec_id); |
3601 | 486 if (codec->extradata_size) |
487 put_buffer(dyn_cp, codec->extradata, codec->extradata_size); | |
488 } else { | |
5746 | 489 if (!codec->codec_tag) |
490 codec->codec_tag = ff_codec_get_tag(ff_codec_bmp_tags, codec->codec_id); | |
491 if (!codec->codec_tag) { | |
5848 | 492 av_log(s, AV_LOG_ERROR, "No bmp codec ID found.\n"); |
5746 | 493 ret = -1; |
494 } | |
2509
5abcad2566b3
Move writing codec private element to its own function
conrad
parents:
2508
diff
changeset
|
495 |
5746 | 496 ff_put_bmp_header(dyn_cp, codec, ff_codec_bmp_tags, 0); |
3601 | 497 } |
2509
5abcad2566b3
Move writing codec private element to its own function
conrad
parents:
2508
diff
changeset
|
498 |
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5886
diff
changeset
|
499 } else if (codec->codec_type == AVMEDIA_TYPE_AUDIO) { |
5886
b8f2b5431f1e
Matroska muxer : Don't create audio tracks for unsupported audio codecs.
jai_menon
parents:
5875
diff
changeset
|
500 unsigned int tag; |
b8f2b5431f1e
Matroska muxer : Don't create audio tracks for unsupported audio codecs.
jai_menon
parents:
5875
diff
changeset
|
501 tag = ff_codec_get_tag(ff_codec_wav_tags, codec->codec_id); |
b8f2b5431f1e
Matroska muxer : Don't create audio tracks for unsupported audio codecs.
jai_menon
parents:
5875
diff
changeset
|
502 if (!tag) { |
5848 | 503 av_log(s, AV_LOG_ERROR, "No wav codec ID found.\n"); |
2510
4ba8d5f648a4
Write codecprivate to a dynamic buffer so that seeking isn't required
conrad
parents:
2509
diff
changeset
|
504 ret = -1; |
2509
5abcad2566b3
Move writing codec private element to its own function
conrad
parents:
2508
diff
changeset
|
505 } |
5886
b8f2b5431f1e
Matroska muxer : Don't create audio tracks for unsupported audio codecs.
jai_menon
parents:
5875
diff
changeset
|
506 if (!codec->codec_tag) |
b8f2b5431f1e
Matroska muxer : Don't create audio tracks for unsupported audio codecs.
jai_menon
parents:
5875
diff
changeset
|
507 codec->codec_tag = tag; |
2509
5abcad2566b3
Move writing codec private element to its own function
conrad
parents:
2508
diff
changeset
|
508 |
5058
33a244b7ca65
Add ff_ prefixes to exported symbols in libavformat/riff.h.
diego
parents:
4581
diff
changeset
|
509 ff_put_wav_header(dyn_cp, codec); |
2509
5abcad2566b3
Move writing codec private element to its own function
conrad
parents:
2508
diff
changeset
|
510 } |
2510
4ba8d5f648a4
Write codecprivate to a dynamic buffer so that seeking isn't required
conrad
parents:
2509
diff
changeset
|
511 |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2530
diff
changeset
|
512 codecpriv_size = url_close_dyn_buf(dyn_cp, &codecpriv); |
2510
4ba8d5f648a4
Write codecprivate to a dynamic buffer so that seeking isn't required
conrad
parents:
2509
diff
changeset
|
513 if (codecpriv_size) |
4ba8d5f648a4
Write codecprivate to a dynamic buffer so that seeking isn't required
conrad
parents:
2509
diff
changeset
|
514 put_ebml_binary(pb, MATROSKA_ID_CODECPRIVATE, codecpriv, codecpriv_size); |
4ba8d5f648a4
Write codecprivate to a dynamic buffer so that seeking isn't required
conrad
parents:
2509
diff
changeset
|
515 av_free(codecpriv); |
4ba8d5f648a4
Write codecprivate to a dynamic buffer so that seeking isn't required
conrad
parents:
2509
diff
changeset
|
516 return ret; |
2509
5abcad2566b3
Move writing codec private element to its own function
conrad
parents:
2508
diff
changeset
|
517 } |
5abcad2566b3
Move writing codec private element to its own function
conrad
parents:
2508
diff
changeset
|
518 |
2445
86466f60fc5d
Move writing the tracks element to its own function
conrad
parents:
2444
diff
changeset
|
519 static int mkv_write_tracks(AVFormatContext *s) |
2425
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
520 { |
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
521 MatroskaMuxContext *mkv = s->priv_data; |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2530
diff
changeset
|
522 ByteIOContext *pb = s->pb; |
2489
3ef5728030da
Calculate the size of key EBML master elements beforehand so only just enough size is reserved for the size
conrad
parents:
2488
diff
changeset
|
523 ebml_master tracks; |
2501 | 524 int i, j, ret; |
2425
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
525 |
2501 | 526 ret = mkv_add_seekhead_entry(mkv->main_seekhead, MATROSKA_ID_TRACKS, url_ftell(pb)); |
527 if (ret < 0) return ret; | |
2447 | 528 |
2489
3ef5728030da
Calculate the size of key EBML master elements beforehand so only just enough size is reserved for the size
conrad
parents:
2488
diff
changeset
|
529 tracks = start_ebml_master(pb, MATROSKA_ID_TRACKS, 0); |
2425
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
530 for (i = 0; i < s->nb_streams; i++) { |
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
531 AVStream *st = s->streams[i]; |
2432
68743e7fa627
First stab at writing the tracks element, still needs some additional cases for certain codecs
conrad
parents:
2431
diff
changeset
|
532 AVCodecContext *codec = st->codec; |
2489
3ef5728030da
Calculate the size of key EBML master elements beforehand so only just enough size is reserved for the size
conrad
parents:
2488
diff
changeset
|
533 ebml_master subinfo, track; |
2432
68743e7fa627
First stab at writing the tracks element, still needs some additional cases for certain codecs
conrad
parents:
2431
diff
changeset
|
534 int native_id = 0; |
3601 | 535 int qt_id = 0; |
2454 | 536 int bit_depth = av_get_bits_per_sample(codec->codec_id); |
2458
7286ab3bf026
Determine the output sample rate for SBR AAC and write it
conrad
parents:
2457
diff
changeset
|
537 int sample_rate = codec->sample_rate; |
7286ab3bf026
Determine the output sample rate for SBR AAC and write it
conrad
parents:
2457
diff
changeset
|
538 int output_sample_rate = 0; |
4498 | 539 AVMetadataTag *tag; |
2458
7286ab3bf026
Determine the output sample rate for SBR AAC and write it
conrad
parents:
2457
diff
changeset
|
540 |
2493
61bc7a789851
Use sample format for bit depth if av_get_bits_per_sample() doesn't give one
conrad
parents:
2492
diff
changeset
|
541 if (!bit_depth) |
61bc7a789851
Use sample format for bit depth if av_get_bits_per_sample() doesn't give one
conrad
parents:
2492
diff
changeset
|
542 bit_depth = av_get_bits_per_sample_format(codec->sample_fmt); |
61bc7a789851
Use sample format for bit depth if av_get_bits_per_sample() doesn't give one
conrad
parents:
2492
diff
changeset
|
543 |
2458
7286ab3bf026
Determine the output sample rate for SBR AAC and write it
conrad
parents:
2457
diff
changeset
|
544 if (codec->codec_id == CODEC_ID_AAC) |
2518 | 545 get_aac_sample_rates(s, codec, &sample_rate, &output_sample_rate); |
2432
68743e7fa627
First stab at writing the tracks element, still needs some additional cases for certain codecs
conrad
parents:
2431
diff
changeset
|
546 |
2489
3ef5728030da
Calculate the size of key EBML master elements beforehand so only just enough size is reserved for the size
conrad
parents:
2488
diff
changeset
|
547 track = start_ebml_master(pb, MATROSKA_ID_TRACKENTRY, 0); |
2439 | 548 put_ebml_uint (pb, MATROSKA_ID_TRACKNUMBER , i + 1); |
549 put_ebml_uint (pb, MATROSKA_ID_TRACKUID , i + 1); | |
2432
68743e7fa627
First stab at writing the tracks element, still needs some additional cases for certain codecs
conrad
parents:
2431
diff
changeset
|
550 put_ebml_uint (pb, MATROSKA_ID_TRACKFLAGLACING , 0); // no lacing (yet) |
68743e7fa627
First stab at writing the tracks element, still needs some additional cases for certain codecs
conrad
parents:
2431
diff
changeset
|
551 |
5742
f50c86f67772
matroskaenc: use "title" tag instead of "description" in track title.
conrad
parents:
5573
diff
changeset
|
552 if ((tag = av_metadata_get(st->metadata, "title", NULL, 0))) |
4498 | 553 put_ebml_string(pb, MATROSKA_ID_TRACKNAME, tag->value); |
554 tag = av_metadata_get(st->metadata, "language", NULL, 0); | |
555 put_ebml_string(pb, MATROSKA_ID_TRACKLANGUAGE, tag ? tag->value:"und"); | |
2432
68743e7fa627
First stab at writing the tracks element, still needs some additional cases for certain codecs
conrad
parents:
2431
diff
changeset
|
556 |
4240
dff232a64d7c
Treat disposition==0 as undefined and don't write the default flag
conrad
parents:
4239
diff
changeset
|
557 if (st->disposition) |
4241 | 558 put_ebml_uint(pb, MATROSKA_ID_TRACKFLAGDEFAULT, !!(st->disposition & AV_DISPOSITION_DEFAULT)); |
3120
ea5623a8efde
Add 'disposition' bitfield to AVStream and use it for both muxing and demuxing
eugeni
parents:
3097
diff
changeset
|
559 |
2519 | 560 // look for a codec ID string specific to mkv to use, |
2494 | 561 // if none are found, use AVI codes |
2432
68743e7fa627
First stab at writing the tracks element, still needs some additional cases for certain codecs
conrad
parents:
2431
diff
changeset
|
562 for (j = 0; ff_mkv_codec_tags[j].id != CODEC_ID_NONE; j++) { |
68743e7fa627
First stab at writing the tracks element, still needs some additional cases for certain codecs
conrad
parents:
2431
diff
changeset
|
563 if (ff_mkv_codec_tags[j].id == codec->codec_id) { |
68743e7fa627
First stab at writing the tracks element, still needs some additional cases for certain codecs
conrad
parents:
2431
diff
changeset
|
564 put_ebml_string(pb, MATROSKA_ID_CODECID, ff_mkv_codec_tags[j].str); |
68743e7fa627
First stab at writing the tracks element, still needs some additional cases for certain codecs
conrad
parents:
2431
diff
changeset
|
565 native_id = 1; |
68743e7fa627
First stab at writing the tracks element, still needs some additional cases for certain codecs
conrad
parents:
2431
diff
changeset
|
566 break; |
68743e7fa627
First stab at writing the tracks element, still needs some additional cases for certain codecs
conrad
parents:
2431
diff
changeset
|
567 } |
68743e7fa627
First stab at writing the tracks element, still needs some additional cases for certain codecs
conrad
parents:
2431
diff
changeset
|
568 } |
68743e7fa627
First stab at writing the tracks element, still needs some additional cases for certain codecs
conrad
parents:
2431
diff
changeset
|
569 |
6086 | 570 if (mkv->mode == MODE_WEBM && !(codec->codec_id == CODEC_ID_VP8 || |
571 codec->codec_id == CODEC_ID_VORBIS)) { | |
572 av_log(s, AV_LOG_ERROR, | |
573 "Only VP8 video and Vorbis audio are supported for WebM.\n"); | |
574 return AVERROR(EINVAL); | |
575 } | |
576 | |
2432
68743e7fa627
First stab at writing the tracks element, still needs some additional cases for certain codecs
conrad
parents:
2431
diff
changeset
|
577 switch (codec->codec_type) { |
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5886
diff
changeset
|
578 case AVMEDIA_TYPE_VIDEO: |
2432
68743e7fa627
First stab at writing the tracks element, still needs some additional cases for certain codecs
conrad
parents:
2431
diff
changeset
|
579 put_ebml_uint(pb, MATROSKA_ID_TRACKTYPE, MATROSKA_TRACK_TYPE_VIDEO); |
6048
e507a21a9566
matroskaenc: Write codec time base as default duration for video tracks.
conrad
parents:
6031
diff
changeset
|
580 put_ebml_uint(pb, MATROSKA_ID_TRACKDEFAULTDURATION, av_q2d(codec->time_base)*1E9); |
2425
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
581 |
3601 | 582 if (!native_id && |
5058
33a244b7ca65
Add ff_ prefixes to exported symbols in libavformat/riff.h.
diego
parents:
4581
diff
changeset
|
583 ff_codec_get_tag(codec_movvideo_tags, codec->codec_id) && |
33a244b7ca65
Add ff_ prefixes to exported symbols in libavformat/riff.h.
diego
parents:
4581
diff
changeset
|
584 (!ff_codec_get_tag(ff_codec_bmp_tags, codec->codec_id) |
3601 | 585 || codec->codec_id == CODEC_ID_SVQ1 |
586 || codec->codec_id == CODEC_ID_SVQ3 | |
587 || codec->codec_id == CODEC_ID_CINEPAK)) | |
588 qt_id = 1; | |
589 | |
590 if (qt_id) | |
591 put_ebml_string(pb, MATROSKA_ID_CODECID, "V_QUICKTIME"); | |
5793 | 592 else if (!native_id) { |
2519 | 593 // if there is no mkv-specific codec ID, use VFW mode |
3687
494a55f131f3
matroska: expand useless define for MS compat codec id strings
aurel
parents:
3601
diff
changeset
|
594 put_ebml_string(pb, MATROSKA_ID_CODECID, "V_MS/VFW/FOURCC"); |
5793 | 595 mkv->tracks[i].write_dts = 1; |
596 } | |
2513 | 597 |
2489
3ef5728030da
Calculate the size of key EBML master elements beforehand so only just enough size is reserved for the size
conrad
parents:
2488
diff
changeset
|
598 subinfo = start_ebml_master(pb, MATROSKA_ID_TRACKVIDEO, 0); |
2432
68743e7fa627
First stab at writing the tracks element, still needs some additional cases for certain codecs
conrad
parents:
2431
diff
changeset
|
599 // XXX: interlace flag? |
68743e7fa627
First stab at writing the tracks element, still needs some additional cases for certain codecs
conrad
parents:
2431
diff
changeset
|
600 put_ebml_uint (pb, MATROSKA_ID_VIDEOPIXELWIDTH , codec->width); |
68743e7fa627
First stab at writing the tracks element, still needs some additional cases for certain codecs
conrad
parents:
2431
diff
changeset
|
601 put_ebml_uint (pb, MATROSKA_ID_VIDEOPIXELHEIGHT, codec->height); |
3759
27537074f2a9
convert every muxer/demuxer to write/read sample_aspect_ratio from/to
aurel
parents:
3692
diff
changeset
|
602 if (st->sample_aspect_ratio.num) { |
27537074f2a9
convert every muxer/demuxer to write/read sample_aspect_ratio from/to
aurel
parents:
3692
diff
changeset
|
603 int d_width = codec->width*av_q2d(st->sample_aspect_ratio); |
27537074f2a9
convert every muxer/demuxer to write/read sample_aspect_ratio from/to
aurel
parents:
3692
diff
changeset
|
604 put_ebml_uint(pb, MATROSKA_ID_VIDEODISPLAYWIDTH , d_width); |
27537074f2a9
convert every muxer/demuxer to write/read sample_aspect_ratio from/to
aurel
parents:
3692
diff
changeset
|
605 put_ebml_uint(pb, MATROSKA_ID_VIDEODISPLAYHEIGHT, codec->height); |
6259
7b2f50760dfb
matroskaenc: write DisplayUnit element to better match the spec
aurel
parents:
6199
diff
changeset
|
606 put_ebml_uint(pb, MATROSKA_ID_VIDEODISPLAYUNIT, 3); |
2473 | 607 } |
2432
68743e7fa627
First stab at writing the tracks element, still needs some additional cases for certain codecs
conrad
parents:
2431
diff
changeset
|
608 end_ebml_master(pb, subinfo); |
68743e7fa627
First stab at writing the tracks element, still needs some additional cases for certain codecs
conrad
parents:
2431
diff
changeset
|
609 break; |
68743e7fa627
First stab at writing the tracks element, still needs some additional cases for certain codecs
conrad
parents:
2431
diff
changeset
|
610 |
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5886
diff
changeset
|
611 case AVMEDIA_TYPE_AUDIO: |
2432
68743e7fa627
First stab at writing the tracks element, still needs some additional cases for certain codecs
conrad
parents:
2431
diff
changeset
|
612 put_ebml_uint(pb, MATROSKA_ID_TRACKTYPE, MATROSKA_TRACK_TYPE_AUDIO); |
68743e7fa627
First stab at writing the tracks element, still needs some additional cases for certain codecs
conrad
parents:
2431
diff
changeset
|
613 |
2513 | 614 if (!native_id) |
2452
1b6ea48f7f24
Write wav header if there is no native audio codec ID
conrad
parents:
2451
diff
changeset
|
615 // no mkv-specific ID, use ACM mode |
3687
494a55f131f3
matroska: expand useless define for MS compat codec id strings
aurel
parents:
3601
diff
changeset
|
616 put_ebml_string(pb, MATROSKA_ID_CODECID, "A_MS/ACM"); |
2513 | 617 |
2489
3ef5728030da
Calculate the size of key EBML master elements beforehand so only just enough size is reserved for the size
conrad
parents:
2488
diff
changeset
|
618 subinfo = start_ebml_master(pb, MATROSKA_ID_TRACKAUDIO, 0); |
2432
68743e7fa627
First stab at writing the tracks element, still needs some additional cases for certain codecs
conrad
parents:
2431
diff
changeset
|
619 put_ebml_uint (pb, MATROSKA_ID_AUDIOCHANNELS , codec->channels); |
2458
7286ab3bf026
Determine the output sample rate for SBR AAC and write it
conrad
parents:
2457
diff
changeset
|
620 put_ebml_float (pb, MATROSKA_ID_AUDIOSAMPLINGFREQ, sample_rate); |
7286ab3bf026
Determine the output sample rate for SBR AAC and write it
conrad
parents:
2457
diff
changeset
|
621 if (output_sample_rate) |
7286ab3bf026
Determine the output sample rate for SBR AAC and write it
conrad
parents:
2457
diff
changeset
|
622 put_ebml_float(pb, MATROSKA_ID_AUDIOOUTSAMPLINGFREQ, output_sample_rate); |
2453 | 623 if (bit_depth) |
624 put_ebml_uint(pb, MATROSKA_ID_AUDIOBITDEPTH, bit_depth); | |
2432
68743e7fa627
First stab at writing the tracks element, still needs some additional cases for certain codecs
conrad
parents:
2431
diff
changeset
|
625 end_ebml_master(pb, subinfo); |
68743e7fa627
First stab at writing the tracks element, still needs some additional cases for certain codecs
conrad
parents:
2431
diff
changeset
|
626 break; |
68743e7fa627
First stab at writing the tracks element, still needs some additional cases for certain codecs
conrad
parents:
2431
diff
changeset
|
627 |
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5886
diff
changeset
|
628 case AVMEDIA_TYPE_SUBTITLE: |
2498 | 629 put_ebml_uint(pb, MATROSKA_ID_TRACKTYPE, MATROSKA_TRACK_TYPE_SUBTITLE); |
630 break; | |
2432
68743e7fa627
First stab at writing the tracks element, still needs some additional cases for certain codecs
conrad
parents:
2431
diff
changeset
|
631 default: |
2503 | 632 av_log(s, AV_LOG_ERROR, "Only audio, video, and subtitles are supported for Matroska."); |
2432
68743e7fa627
First stab at writing the tracks element, still needs some additional cases for certain codecs
conrad
parents:
2431
diff
changeset
|
633 break; |
68743e7fa627
First stab at writing the tracks element, still needs some additional cases for certain codecs
conrad
parents:
2431
diff
changeset
|
634 } |
3601 | 635 ret = mkv_write_codecprivate(s, pb, codec, native_id, qt_id); |
2509
5abcad2566b3
Move writing codec private element to its own function
conrad
parents:
2508
diff
changeset
|
636 if (ret < 0) return ret; |
5abcad2566b3
Move writing codec private element to its own function
conrad
parents:
2508
diff
changeset
|
637 |
2425
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
638 end_ebml_master(pb, track); |
2432
68743e7fa627
First stab at writing the tracks element, still needs some additional cases for certain codecs
conrad
parents:
2431
diff
changeset
|
639 |
68743e7fa627
First stab at writing the tracks element, still needs some additional cases for certain codecs
conrad
parents:
2431
diff
changeset
|
640 // ms precision is the de-facto standard timescale for mkv files |
68743e7fa627
First stab at writing the tracks element, still needs some additional cases for certain codecs
conrad
parents:
2431
diff
changeset
|
641 av_set_pts_info(st, 64, 1, 1000); |
2425
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
642 } |
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
643 end_ebml_master(pb, tracks); |
2446
b2f9523ee424
Make sure to return a value in functions that return a value
conrad
parents:
2445
diff
changeset
|
644 return 0; |
2445
86466f60fc5d
Move writing the tracks element to its own function
conrad
parents:
2444
diff
changeset
|
645 } |
86466f60fc5d
Move writing the tracks element to its own function
conrad
parents:
2444
diff
changeset
|
646 |
5299 | 647 static int mkv_write_chapters(AVFormatContext *s) |
648 { | |
649 MatroskaMuxContext *mkv = s->priv_data; | |
650 ByteIOContext *pb = s->pb; | |
651 ebml_master chapters, editionentry; | |
652 AVRational scale = {1, 1E9}; | |
653 int i, ret; | |
654 | |
655 if (!s->nb_chapters) | |
656 return 0; | |
657 | |
658 ret = mkv_add_seekhead_entry(mkv->main_seekhead, MATROSKA_ID_CHAPTERS, url_ftell(pb)); | |
659 if (ret < 0) return ret; | |
660 | |
661 chapters = start_ebml_master(pb, MATROSKA_ID_CHAPTERS , 0); | |
662 editionentry = start_ebml_master(pb, MATROSKA_ID_EDITIONENTRY, 0); | |
663 put_ebml_uint(pb, MATROSKA_ID_EDITIONFLAGDEFAULT, 1); | |
664 put_ebml_uint(pb, MATROSKA_ID_EDITIONFLAGHIDDEN , 0); | |
665 for (i = 0; i < s->nb_chapters; i++) { | |
666 ebml_master chapteratom, chapterdisplay; | |
667 AVChapter *c = s->chapters[i]; | |
668 AVMetadataTag *t = NULL; | |
669 | |
670 chapteratom = start_ebml_master(pb, MATROSKA_ID_CHAPTERATOM, 0); | |
671 put_ebml_uint(pb, MATROSKA_ID_CHAPTERUID, c->id); | |
672 put_ebml_uint(pb, MATROSKA_ID_CHAPTERTIMESTART, | |
673 av_rescale_q(c->start, c->time_base, scale)); | |
674 put_ebml_uint(pb, MATROSKA_ID_CHAPTERTIMEEND, | |
675 av_rescale_q(c->end, c->time_base, scale)); | |
676 put_ebml_uint(pb, MATROSKA_ID_CHAPTERFLAGHIDDEN , 0); | |
677 put_ebml_uint(pb, MATROSKA_ID_CHAPTERFLAGENABLED, 1); | |
678 if ((t = av_metadata_get(c->metadata, "title", NULL, 0))) { | |
679 chapterdisplay = start_ebml_master(pb, MATROSKA_ID_CHAPTERDISPLAY, 0); | |
680 put_ebml_string(pb, MATROSKA_ID_CHAPSTRING, t->value); | |
681 put_ebml_string(pb, MATROSKA_ID_CHAPLANG , "und"); | |
682 end_ebml_master(pb, chapterdisplay); | |
683 } | |
684 end_ebml_master(pb, chapteratom); | |
685 } | |
686 end_ebml_master(pb, editionentry); | |
687 end_ebml_master(pb, chapters); | |
688 return 0; | |
689 } | |
690 | |
2445
86466f60fc5d
Move writing the tracks element to its own function
conrad
parents:
2444
diff
changeset
|
691 static int mkv_write_header(AVFormatContext *s) |
86466f60fc5d
Move writing the tracks element to its own function
conrad
parents:
2444
diff
changeset
|
692 { |
86466f60fc5d
Move writing the tracks element to its own function
conrad
parents:
2444
diff
changeset
|
693 MatroskaMuxContext *mkv = s->priv_data; |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2530
diff
changeset
|
694 ByteIOContext *pb = s->pb; |
2489
3ef5728030da
Calculate the size of key EBML master elements beforehand so only just enough size is reserved for the size
conrad
parents:
2488
diff
changeset
|
695 ebml_master ebml_header, segment_info; |
4498 | 696 AVMetadataTag *tag; |
6088
1299f202ffe9
matroskaenc: Use av_get_random_seed -> lfg for segment UID
conrad
parents:
6087
diff
changeset
|
697 int ret, i; |
2445
86466f60fc5d
Move writing the tracks element to its own function
conrad
parents:
2444
diff
changeset
|
698 |
6086 | 699 if (!strcmp(s->oformat->name, "webm")) mkv->mode = MODE_WEBM; |
700 else mkv->mode = MODE_MATROSKAv2; | |
701 | |
5793 | 702 mkv->tracks = av_mallocz(s->nb_streams * sizeof(*mkv->tracks)); |
6089 | 703 if (!mkv->tracks) |
704 return AVERROR(ENOMEM); | |
2479
139406606437
Use a MD5 hash of some frames to write the segment uid
conrad
parents:
2478
diff
changeset
|
705 |
2489
3ef5728030da
Calculate the size of key EBML master elements beforehand so only just enough size is reserved for the size
conrad
parents:
2488
diff
changeset
|
706 ebml_header = start_ebml_master(pb, EBML_ID_HEADER, 0); |
2445
86466f60fc5d
Move writing the tracks element to its own function
conrad
parents:
2444
diff
changeset
|
707 put_ebml_uint (pb, EBML_ID_EBMLVERSION , 1); |
86466f60fc5d
Move writing the tracks element to its own function
conrad
parents:
2444
diff
changeset
|
708 put_ebml_uint (pb, EBML_ID_EBMLREADVERSION , 1); |
86466f60fc5d
Move writing the tracks element to its own function
conrad
parents:
2444
diff
changeset
|
709 put_ebml_uint (pb, EBML_ID_EBMLMAXIDLENGTH , 4); |
86466f60fc5d
Move writing the tracks element to its own function
conrad
parents:
2444
diff
changeset
|
710 put_ebml_uint (pb, EBML_ID_EBMLMAXSIZELENGTH , 8); |
6086 | 711 put_ebml_string (pb, EBML_ID_DOCTYPE , s->oformat->name); |
2445
86466f60fc5d
Move writing the tracks element to its own function
conrad
parents:
2444
diff
changeset
|
712 put_ebml_uint (pb, EBML_ID_DOCTYPEVERSION , 2); |
86466f60fc5d
Move writing the tracks element to its own function
conrad
parents:
2444
diff
changeset
|
713 put_ebml_uint (pb, EBML_ID_DOCTYPEREADVERSION , 2); |
86466f60fc5d
Move writing the tracks element to its own function
conrad
parents:
2444
diff
changeset
|
714 end_ebml_master(pb, ebml_header); |
86466f60fc5d
Move writing the tracks element to its own function
conrad
parents:
2444
diff
changeset
|
715 |
2489
3ef5728030da
Calculate the size of key EBML master elements beforehand so only just enough size is reserved for the size
conrad
parents:
2488
diff
changeset
|
716 mkv->segment = start_ebml_master(pb, MATROSKA_ID_SEGMENT, 0); |
2447 | 717 mkv->segment_offset = url_ftell(pb); |
718 | |
2494 | 719 // we write 2 seek heads - one at the end of the file to point to each |
720 // cluster, and one at the beginning to point to all other level one | |
721 // elements (including the seek head at the end of the file), which | |
722 // isn't more than 10 elements if we only write one of each other | |
723 // currently defined level 1 element | |
2447 | 724 mkv->main_seekhead = mkv_start_seekhead(pb, mkv->segment_offset, 10); |
6090
b260ede399be
matroskaenc: Don't write a second seekhead for the clusters; mkvalidate agrees
conrad
parents:
6089
diff
changeset
|
725 if (!mkv->main_seekhead) |
2500 | 726 return AVERROR(ENOMEM); |
2447 | 727 |
2501 | 728 ret = mkv_add_seekhead_entry(mkv->main_seekhead, MATROSKA_ID_INFO, url_ftell(pb)); |
729 if (ret < 0) return ret; | |
2445
86466f60fc5d
Move writing the tracks element to its own function
conrad
parents:
2444
diff
changeset
|
730 |
2489
3ef5728030da
Calculate the size of key EBML master elements beforehand so only just enough size is reserved for the size
conrad
parents:
2488
diff
changeset
|
731 segment_info = start_ebml_master(pb, MATROSKA_ID_INFO, 0); |
2445
86466f60fc5d
Move writing the tracks element to its own function
conrad
parents:
2444
diff
changeset
|
732 put_ebml_uint(pb, MATROSKA_ID_TIMECODESCALE, 1000000); |
4498 | 733 if ((tag = av_metadata_get(s->metadata, "title", NULL, 0))) |
734 put_ebml_string(pb, MATROSKA_ID_TITLE, tag->value); | |
2445
86466f60fc5d
Move writing the tracks element to its own function
conrad
parents:
2444
diff
changeset
|
735 if (!(s->streams[0]->codec->flags & CODEC_FLAG_BITEXACT)) { |
6088
1299f202ffe9
matroskaenc: Use av_get_random_seed -> lfg for segment UID
conrad
parents:
6087
diff
changeset
|
736 uint32_t segment_uid[4]; |
6105
c0336d3528e9
matroska: move LFG state from muxer context to local variable
mru
parents:
6090
diff
changeset
|
737 AVLFG lfg; |
c0336d3528e9
matroska: move LFG state from muxer context to local variable
mru
parents:
6090
diff
changeset
|
738 |
c0336d3528e9
matroska: move LFG state from muxer context to local variable
mru
parents:
6090
diff
changeset
|
739 av_lfg_init(&lfg, av_get_random_seed()); |
c0336d3528e9
matroska: move LFG state from muxer context to local variable
mru
parents:
6090
diff
changeset
|
740 |
6088
1299f202ffe9
matroskaenc: Use av_get_random_seed -> lfg for segment UID
conrad
parents:
6087
diff
changeset
|
741 for (i = 0; i < 4; i++) |
6105
c0336d3528e9
matroska: move LFG state from muxer context to local variable
mru
parents:
6090
diff
changeset
|
742 segment_uid[i] = av_lfg_get(&lfg); |
6088
1299f202ffe9
matroskaenc: Use av_get_random_seed -> lfg for segment UID
conrad
parents:
6087
diff
changeset
|
743 |
2466 | 744 put_ebml_string(pb, MATROSKA_ID_MUXINGAPP , LIBAVFORMAT_IDENT); |
2445
86466f60fc5d
Move writing the tracks element to its own function
conrad
parents:
2444
diff
changeset
|
745 put_ebml_string(pb, MATROSKA_ID_WRITINGAPP, LIBAVFORMAT_IDENT); |
6088
1299f202ffe9
matroskaenc: Use av_get_random_seed -> lfg for segment UID
conrad
parents:
6087
diff
changeset
|
746 put_ebml_binary(pb, MATROSKA_ID_SEGMENTUID, segment_uid, 16); |
2445
86466f60fc5d
Move writing the tracks element to its own function
conrad
parents:
2444
diff
changeset
|
747 } |
2468 | 748 |
2445
86466f60fc5d
Move writing the tracks element to its own function
conrad
parents:
2444
diff
changeset
|
749 // reserve space for the duration |
86466f60fc5d
Move writing the tracks element to its own function
conrad
parents:
2444
diff
changeset
|
750 mkv->duration = 0; |
86466f60fc5d
Move writing the tracks element to its own function
conrad
parents:
2444
diff
changeset
|
751 mkv->duration_offset = url_ftell(pb); |
86466f60fc5d
Move writing the tracks element to its own function
conrad
parents:
2444
diff
changeset
|
752 put_ebml_void(pb, 11); // assumes double-precision float to be written |
86466f60fc5d
Move writing the tracks element to its own function
conrad
parents:
2444
diff
changeset
|
753 end_ebml_master(pb, segment_info); |
86466f60fc5d
Move writing the tracks element to its own function
conrad
parents:
2444
diff
changeset
|
754 |
2501 | 755 ret = mkv_write_tracks(s); |
756 if (ret < 0) return ret; | |
2425
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
757 |
6086 | 758 if (mkv->mode != MODE_WEBM) { |
759 ret = mkv_write_chapters(s); | |
760 if (ret < 0) return ret; | |
761 } | |
5299 | 762 |
5744
a656843c86aa
Write the first seekhead if writing to a stream, we won't be able to seek
conrad
parents:
5743
diff
changeset
|
763 if (url_is_streamed(s->pb)) |
a656843c86aa
Write the first seekhead if writing to a stream, we won't be able to seek
conrad
parents:
5743
diff
changeset
|
764 mkv_write_seekhead(pb, mkv->main_seekhead); |
a656843c86aa
Write the first seekhead if writing to a stream, we won't be able to seek
conrad
parents:
5743
diff
changeset
|
765 |
2451 | 766 mkv->cues = mkv_start_cues(mkv->segment_offset); |
767 if (mkv->cues == NULL) | |
2499 | 768 return AVERROR(ENOMEM); |
2451 | 769 |
6085 | 770 av_init_packet(&mkv->cur_audio_pkt); |
771 mkv->cur_audio_pkt.size = 0; | |
772 mkv->audio_buffer_size = 0; | |
773 | |
4239
5d0ac4d87ba1
Flush the buffer after writing the header and when done with writing the files
conrad
parents:
4223
diff
changeset
|
774 put_flush_packet(pb); |
2425
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
775 return 0; |
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
776 } |
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
777 |
3986
2a7d8acde051
matroskaenc: pass the packet size directly as parameter of mkv_blockgroup_size()
aurel
parents:
3985
diff
changeset
|
778 static int mkv_blockgroup_size(int pkt_size) |
2489
3ef5728030da
Calculate the size of key EBML master elements beforehand so only just enough size is reserved for the size
conrad
parents:
2488
diff
changeset
|
779 { |
3986
2a7d8acde051
matroskaenc: pass the packet size directly as parameter of mkv_blockgroup_size()
aurel
parents:
3985
diff
changeset
|
780 int size = pkt_size + 4; |
2517
ac3e650ec92c
Rename ebml size functions to indicate that they can be used for more kinds of numbers
conrad
parents:
2516
diff
changeset
|
781 size += ebml_num_size(size); |
2489
3ef5728030da
Calculate the size of key EBML master elements beforehand so only just enough size is reserved for the size
conrad
parents:
2488
diff
changeset
|
782 size += 2; // EBML ID for block and block duration |
3ef5728030da
Calculate the size of key EBML master elements beforehand so only just enough size is reserved for the size
conrad
parents:
2488
diff
changeset
|
783 size += 8; // max size of block duration |
2517
ac3e650ec92c
Rename ebml size functions to indicate that they can be used for more kinds of numbers
conrad
parents:
2516
diff
changeset
|
784 size += ebml_num_size(size); |
2489
3ef5728030da
Calculate the size of key EBML master elements beforehand so only just enough size is reserved for the size
conrad
parents:
2488
diff
changeset
|
785 size += 1; // blockgroup EBML ID |
3ef5728030da
Calculate the size of key EBML master elements beforehand so only just enough size is reserved for the size
conrad
parents:
2488
diff
changeset
|
786 return size; |
3ef5728030da
Calculate the size of key EBML master elements beforehand so only just enough size is reserved for the size
conrad
parents:
2488
diff
changeset
|
787 } |
3ef5728030da
Calculate the size of key EBML master elements beforehand so only just enough size is reserved for the size
conrad
parents:
2488
diff
changeset
|
788 |
3988 | 789 static int ass_get_duration(const uint8_t *p) |
790 { | |
791 int sh, sm, ss, sc, eh, em, es, ec; | |
792 uint64_t start, end; | |
793 | |
794 if (sscanf(p, "%*[^,],%d:%d:%d%*c%d,%d:%d:%d%*c%d", | |
795 &sh, &sm, &ss, &sc, &eh, &em, &es, &ec) != 8) | |
796 return 0; | |
797 start = 3600000*sh + 60000*sm + 1000*ss + 10*sc; | |
798 end = 3600000*eh + 60000*em + 1000*es + 10*ec; | |
799 return end - start; | |
800 } | |
801 | |
5747
551765b1772b
Ensure that we write clusters and blocks with known size when streaming
conrad
parents:
5746
diff
changeset
|
802 static int mkv_write_ass_blocks(AVFormatContext *s, ByteIOContext *pb, AVPacket *pkt) |
3988 | 803 { |
804 MatroskaMuxContext *mkv = s->priv_data; | |
805 int i, layer = 0, max_duration = 0, size, line_size, data_size = pkt->size; | |
806 uint8_t *start, *end, *data = pkt->data; | |
807 ebml_master blockgroup; | |
808 char buffer[2048]; | |
809 | |
810 while (data_size) { | |
811 int duration = ass_get_duration(data); | |
812 max_duration = FFMAX(duration, max_duration); | |
813 end = memchr(data, '\n', data_size); | |
814 size = line_size = end ? end-data+1 : data_size; | |
815 size -= end ? (end[-1]=='\r')+1 : 0; | |
816 start = data; | |
817 for (i=0; i<3; i++, start++) | |
818 if (!(start = memchr(start, ',', size-(start-data)))) | |
819 return max_duration; | |
820 size -= start - data; | |
821 sscanf(data, "Dialogue: %d,", &layer); | |
822 i = snprintf(buffer, sizeof(buffer), "%"PRId64",%d,", | |
823 s->streams[pkt->stream_index]->nb_frames++, layer); | |
824 size = FFMIN(i+size, sizeof(buffer)); | |
825 memcpy(buffer+i, start, size-i); | |
826 | |
827 av_log(s, AV_LOG_DEBUG, "Writing block at offset %" PRIu64 ", size %d, " | |
828 "pts %" PRId64 ", duration %d\n", | |
829 url_ftell(pb), size, pkt->pts, duration); | |
830 blockgroup = start_ebml_master(pb, MATROSKA_ID_BLOCKGROUP, mkv_blockgroup_size(size)); | |
831 put_ebml_id(pb, MATROSKA_ID_BLOCK); | |
832 put_ebml_num(pb, size+4, 0); | |
833 put_byte(pb, 0x80 | (pkt->stream_index + 1)); // this assumes stream_index is less than 126 | |
834 put_be16(pb, pkt->pts - mkv->cluster_pts); | |
835 put_byte(pb, 0); | |
836 put_buffer(pb, buffer, size); | |
837 put_ebml_uint(pb, MATROSKA_ID_BLOCKDURATION, duration); | |
838 end_ebml_master(pb, blockgroup); | |
839 | |
840 data += line_size; | |
841 data_size -= line_size; | |
842 } | |
843 | |
844 return max_duration; | |
845 } | |
846 | |
5747
551765b1772b
Ensure that we write clusters and blocks with known size when streaming
conrad
parents:
5746
diff
changeset
|
847 static void mkv_write_block(AVFormatContext *s, ByteIOContext *pb, |
551765b1772b
Ensure that we write clusters and blocks with known size when streaming
conrad
parents:
5746
diff
changeset
|
848 unsigned int blockid, AVPacket *pkt, int flags) |
2460 | 849 { |
850 MatroskaMuxContext *mkv = s->priv_data; | |
4222
0267c4299992
Do not reallocate AVPacket's data when muxing a packet
lucabe
parents:
4201
diff
changeset
|
851 AVCodecContext *codec = s->streams[pkt->stream_index]->codec; |
4256
3f5d00cb1f61
matroskaenc: correctly handle h264 streams with 3 bytes nal startcodes
aurel
parents:
4241
diff
changeset
|
852 uint8_t *data = NULL; |
3f5d00cb1f61
matroskaenc: correctly handle h264 streams with 3 bytes nal startcodes
aurel
parents:
4241
diff
changeset
|
853 int size = pkt->size; |
5793 | 854 int64_t ts = mkv->tracks[pkt->stream_index].write_dts ? pkt->dts : pkt->pts; |
2460 | 855 |
2504 | 856 av_log(s, AV_LOG_DEBUG, "Writing block at offset %" PRIu64 ", size %d, " |
857 "pts %" PRId64 ", dts %" PRId64 ", duration %d, flags %d\n", | |
2474 | 858 url_ftell(pb), pkt->size, pkt->pts, pkt->dts, pkt->duration, flags); |
4256
3f5d00cb1f61
matroskaenc: correctly handle h264 streams with 3 bytes nal startcodes
aurel
parents:
4241
diff
changeset
|
859 if (codec->codec_id == CODEC_ID_H264 && codec->extradata_size > 0 && |
3f5d00cb1f61
matroskaenc: correctly handle h264 streams with 3 bytes nal startcodes
aurel
parents:
4241
diff
changeset
|
860 (AV_RB24(codec->extradata) == 1 || AV_RB32(codec->extradata) == 1)) |
3f5d00cb1f61
matroskaenc: correctly handle h264 streams with 3 bytes nal startcodes
aurel
parents:
4241
diff
changeset
|
861 ff_avc_parse_nal_units_buf(pkt->data, &data, &size); |
3f5d00cb1f61
matroskaenc: correctly handle h264 streams with 3 bytes nal startcodes
aurel
parents:
4241
diff
changeset
|
862 else |
3f5d00cb1f61
matroskaenc: correctly handle h264 streams with 3 bytes nal startcodes
aurel
parents:
4241
diff
changeset
|
863 data = pkt->data; |
2460 | 864 put_ebml_id(pb, blockid); |
4256
3f5d00cb1f61
matroskaenc: correctly handle h264 streams with 3 bytes nal startcodes
aurel
parents:
4241
diff
changeset
|
865 put_ebml_num(pb, size+4, 0); |
2460 | 866 put_byte(pb, 0x80 | (pkt->stream_index + 1)); // this assumes stream_index is less than 126 |
5793 | 867 put_be16(pb, ts - mkv->cluster_pts); |
2460 | 868 put_byte(pb, flags); |
4256
3f5d00cb1f61
matroskaenc: correctly handle h264 streams with 3 bytes nal startcodes
aurel
parents:
4241
diff
changeset
|
869 put_buffer(pb, data, size); |
3f5d00cb1f61
matroskaenc: correctly handle h264 streams with 3 bytes nal startcodes
aurel
parents:
4241
diff
changeset
|
870 if (data != pkt->data) |
3f5d00cb1f61
matroskaenc: correctly handle h264 streams with 3 bytes nal startcodes
aurel
parents:
4241
diff
changeset
|
871 av_free(data); |
2460 | 872 } |
873 | |
6315 | 874 static int srt_get_duration(uint8_t **buf) |
875 { | |
876 int i, duration = 0; | |
877 | |
878 for (i=0; i<2 && !duration; i++) { | |
879 int s_hour, s_min, s_sec, s_hsec, e_hour, e_min, e_sec, e_hsec; | |
880 if (sscanf(*buf, "%d:%2d:%2d%*1[,.]%3d --> %d:%2d:%2d%*1[,.]%3d", | |
881 &s_hour, &s_min, &s_sec, &s_hsec, | |
882 &e_hour, &e_min, &e_sec, &e_hsec) == 8) { | |
883 s_min += 60*s_hour; e_min += 60*e_hour; | |
884 s_sec += 60*s_min; e_sec += 60*e_min; | |
885 s_hsec += 1000*s_sec; e_hsec += 1000*e_sec; | |
886 duration = e_hsec - s_hsec; | |
887 } | |
888 *buf += strcspn(*buf, "\n") + 1; | |
889 } | |
890 return duration; | |
891 } | |
892 | |
893 static int mkv_write_srt_blocks(AVFormatContext *s, ByteIOContext *pb, AVPacket *pkt) | |
894 { | |
895 ebml_master blockgroup; | |
896 AVPacket pkt2 = *pkt; | |
897 int64_t duration = srt_get_duration(&pkt2.data); | |
898 pkt2.size -= pkt2.data - pkt->data; | |
899 | |
900 blockgroup = start_ebml_master(pb, MATROSKA_ID_BLOCKGROUP, | |
901 mkv_blockgroup_size(pkt2.size)); | |
902 mkv_write_block(s, pb, MATROSKA_ID_BLOCK, &pkt2, 0); | |
903 put_ebml_uint(pb, MATROSKA_ID_BLOCKDURATION, duration); | |
904 end_ebml_master(pb, blockgroup); | |
905 | |
906 return duration; | |
907 } | |
908 | |
5747
551765b1772b
Ensure that we write clusters and blocks with known size when streaming
conrad
parents:
5746
diff
changeset
|
909 static void mkv_flush_dynbuf(AVFormatContext *s) |
551765b1772b
Ensure that we write clusters and blocks with known size when streaming
conrad
parents:
5746
diff
changeset
|
910 { |
551765b1772b
Ensure that we write clusters and blocks with known size when streaming
conrad
parents:
5746
diff
changeset
|
911 MatroskaMuxContext *mkv = s->priv_data; |
551765b1772b
Ensure that we write clusters and blocks with known size when streaming
conrad
parents:
5746
diff
changeset
|
912 int bufsize; |
551765b1772b
Ensure that we write clusters and blocks with known size when streaming
conrad
parents:
5746
diff
changeset
|
913 uint8_t *dyn_buf; |
551765b1772b
Ensure that we write clusters and blocks with known size when streaming
conrad
parents:
5746
diff
changeset
|
914 |
551765b1772b
Ensure that we write clusters and blocks with known size when streaming
conrad
parents:
5746
diff
changeset
|
915 if (!mkv->dyn_bc) |
551765b1772b
Ensure that we write clusters and blocks with known size when streaming
conrad
parents:
5746
diff
changeset
|
916 return; |
551765b1772b
Ensure that we write clusters and blocks with known size when streaming
conrad
parents:
5746
diff
changeset
|
917 |
551765b1772b
Ensure that we write clusters and blocks with known size when streaming
conrad
parents:
5746
diff
changeset
|
918 bufsize = url_close_dyn_buf(mkv->dyn_bc, &dyn_buf); |
551765b1772b
Ensure that we write clusters and blocks with known size when streaming
conrad
parents:
5746
diff
changeset
|
919 put_buffer(s->pb, dyn_buf, bufsize); |
551765b1772b
Ensure that we write clusters and blocks with known size when streaming
conrad
parents:
5746
diff
changeset
|
920 av_free(dyn_buf); |
551765b1772b
Ensure that we write clusters and blocks with known size when streaming
conrad
parents:
5746
diff
changeset
|
921 mkv->dyn_bc = NULL; |
551765b1772b
Ensure that we write clusters and blocks with known size when streaming
conrad
parents:
5746
diff
changeset
|
922 } |
551765b1772b
Ensure that we write clusters and blocks with known size when streaming
conrad
parents:
5746
diff
changeset
|
923 |
6085 | 924 static int mkv_write_packet_internal(AVFormatContext *s, AVPacket *pkt) |
2425
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
925 { |
2437 | 926 MatroskaMuxContext *mkv = s->priv_data; |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2530
diff
changeset
|
927 ByteIOContext *pb = s->pb; |
2463 | 928 AVCodecContext *codec = s->streams[pkt->stream_index]->codec; |
5913
11bb10c37225
Replace all occurences of PKT_FLAG_KEY with AV_PKT_FLAG_KEY.
cehoyos
parents:
5910
diff
changeset
|
929 int keyframe = !!(pkt->flags & AV_PKT_FLAG_KEY); |
3892
8f1928b41f45
matroska: subtitle display duration must be stored in pkt->convergence_duration
aurel
parents:
3766
diff
changeset
|
930 int duration = pkt->duration; |
2501 | 931 int ret; |
5793 | 932 int64_t ts = mkv->tracks[pkt->stream_index].write_dts ? pkt->dts : pkt->pts; |
2433
0c047310f205
Write one cluster and SimpleBlocks for the frames. Should now create playable mkv files for some video codecs (H.264 and VP3 checked)
conrad
parents:
2432
diff
changeset
|
933 |
5794
31e8a43123c5
mkvenc: Don't try to write packets with unknown timestamps
conrad
parents:
5793
diff
changeset
|
934 if (ts == AV_NOPTS_VALUE) { |
31e8a43123c5
mkvenc: Don't try to write packets with unknown timestamps
conrad
parents:
5793
diff
changeset
|
935 av_log(s, AV_LOG_ERROR, "Can't write packet with unknown timestamp\n"); |
31e8a43123c5
mkvenc: Don't try to write packets with unknown timestamps
conrad
parents:
5793
diff
changeset
|
936 return AVERROR(EINVAL); |
31e8a43123c5
mkvenc: Don't try to write packets with unknown timestamps
conrad
parents:
5793
diff
changeset
|
937 } |
31e8a43123c5
mkvenc: Don't try to write packets with unknown timestamps
conrad
parents:
5793
diff
changeset
|
938 |
5747
551765b1772b
Ensure that we write clusters and blocks with known size when streaming
conrad
parents:
5746
diff
changeset
|
939 if (url_is_streamed(s->pb)) { |
551765b1772b
Ensure that we write clusters and blocks with known size when streaming
conrad
parents:
5746
diff
changeset
|
940 if (!mkv->dyn_bc) |
551765b1772b
Ensure that we write clusters and blocks with known size when streaming
conrad
parents:
5746
diff
changeset
|
941 url_open_dyn_buf(&mkv->dyn_bc); |
551765b1772b
Ensure that we write clusters and blocks with known size when streaming
conrad
parents:
5746
diff
changeset
|
942 pb = mkv->dyn_bc; |
551765b1772b
Ensure that we write clusters and blocks with known size when streaming
conrad
parents:
5746
diff
changeset
|
943 } |
551765b1772b
Ensure that we write clusters and blocks with known size when streaming
conrad
parents:
5746
diff
changeset
|
944 |
5745 | 945 if (!mkv->cluster_pos) { |
5747
551765b1772b
Ensure that we write clusters and blocks with known size when streaming
conrad
parents:
5746
diff
changeset
|
946 mkv->cluster_pos = url_ftell(s->pb); |
2489
3ef5728030da
Calculate the size of key EBML master elements beforehand so only just enough size is reserved for the size
conrad
parents:
2488
diff
changeset
|
947 mkv->cluster = start_ebml_master(pb, MATROSKA_ID_CLUSTER, 0); |
5795 | 948 put_ebml_uint(pb, MATROSKA_ID_CLUSTERTIMECODE, FFMAX(0, ts)); |
949 mkv->cluster_pts = FFMAX(0, ts); | |
2437 | 950 } |
951 | |
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5886
diff
changeset
|
952 if (codec->codec_type != AVMEDIA_TYPE_SUBTITLE) { |
5747
551765b1772b
Ensure that we write clusters and blocks with known size when streaming
conrad
parents:
5746
diff
changeset
|
953 mkv_write_block(s, pb, MATROSKA_ID_SIMPLEBLOCK, pkt, keyframe << 7); |
3988 | 954 } else if (codec->codec_id == CODEC_ID_SSA) { |
5747
551765b1772b
Ensure that we write clusters and blocks with known size when streaming
conrad
parents:
5746
diff
changeset
|
955 duration = mkv_write_ass_blocks(s, pb, pkt); |
6315 | 956 } else if (codec->codec_id == CODEC_ID_SRT) { |
957 duration = mkv_write_srt_blocks(s, pb, pkt); | |
2461 | 958 } else { |
3986
2a7d8acde051
matroskaenc: pass the packet size directly as parameter of mkv_blockgroup_size()
aurel
parents:
3985
diff
changeset
|
959 ebml_master blockgroup = start_ebml_master(pb, MATROSKA_ID_BLOCKGROUP, mkv_blockgroup_size(pkt->size)); |
3892
8f1928b41f45
matroska: subtitle display duration must be stored in pkt->convergence_duration
aurel
parents:
3766
diff
changeset
|
960 duration = pkt->convergence_duration; |
5747
551765b1772b
Ensure that we write clusters and blocks with known size when streaming
conrad
parents:
5746
diff
changeset
|
961 mkv_write_block(s, pb, MATROSKA_ID_BLOCK, pkt, 0); |
3987 | 962 put_ebml_uint(pb, MATROSKA_ID_BLOCKDURATION, duration); |
2461 | 963 end_ebml_master(pb, blockgroup); |
964 } | |
2443 | 965 |
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5886
diff
changeset
|
966 if (codec->codec_type == AVMEDIA_TYPE_VIDEO && keyframe) { |
5793 | 967 ret = mkv_add_cuepoint(mkv->cues, pkt->stream_index, ts, mkv->cluster_pos); |
2501 | 968 if (ret < 0) return ret; |
2451 | 969 } |
970 | |
6085 | 971 mkv->duration = FFMAX(mkv->duration, ts + duration); |
972 return 0; | |
973 } | |
974 | |
975 static int mkv_copy_packet(MatroskaMuxContext *mkv, const AVPacket *pkt) | |
976 { | |
977 uint8_t *data = mkv->cur_audio_pkt.data; | |
978 mkv->cur_audio_pkt = *pkt; | |
979 mkv->cur_audio_pkt.data = av_fast_realloc(data, &mkv->audio_buffer_size, pkt->size); | |
980 if (!mkv->cur_audio_pkt.data) | |
981 return AVERROR(ENOMEM); | |
982 | |
983 memcpy(mkv->cur_audio_pkt.data, pkt->data, pkt->size); | |
984 mkv->cur_audio_pkt.size = pkt->size; | |
985 return 0; | |
986 } | |
987 | |
988 static int mkv_write_packet(AVFormatContext *s, AVPacket *pkt) | |
989 { | |
990 MatroskaMuxContext *mkv = s->priv_data; | |
991 ByteIOContext *pb = url_is_streamed(s->pb) ? mkv->dyn_bc : s->pb; | |
992 AVCodecContext *codec = s->streams[pkt->stream_index]->codec; | |
993 int ret, keyframe = !!(pkt->flags & AV_PKT_FLAG_KEY); | |
994 int64_t ts = mkv->tracks[pkt->stream_index].write_dts ? pkt->dts : pkt->pts; | |
995 int cluster_size = url_ftell(pb) - (url_is_streamed(s->pb) ? 0 : mkv->cluster_pos); | |
996 | |
997 // start a new cluster every 5 MB or 5 sec, or 32k / 1 sec for streaming or | |
998 // after 4k and on a keyframe | |
999 if (mkv->cluster_pos && | |
1000 ((url_is_streamed(s->pb) && (cluster_size > 32*1024 || ts > mkv->cluster_pts + 1000)) | |
1001 || cluster_size > 5*1024*1024 || ts > mkv->cluster_pts + 5000 | |
1002 || (codec->codec_type == AVMEDIA_TYPE_VIDEO && keyframe && cluster_size > 4*1024))) { | |
5745 | 1003 av_log(s, AV_LOG_DEBUG, "Starting new cluster at offset %" PRIu64 |
5793 | 1004 " bytes, pts %" PRIu64 "\n", url_ftell(pb), ts); |
5745 | 1005 end_ebml_master(pb, mkv->cluster); |
1006 mkv->cluster_pos = 0; | |
5747
551765b1772b
Ensure that we write clusters and blocks with known size when streaming
conrad
parents:
5746
diff
changeset
|
1007 if (mkv->dyn_bc) |
551765b1772b
Ensure that we write clusters and blocks with known size when streaming
conrad
parents:
5746
diff
changeset
|
1008 mkv_flush_dynbuf(s); |
5745 | 1009 } |
1010 | |
6085 | 1011 // check if we have an audio packet cached |
1012 if (mkv->cur_audio_pkt.size > 0) { | |
1013 ret = mkv_write_packet_internal(s, &mkv->cur_audio_pkt); | |
1014 mkv->cur_audio_pkt.size = 0; | |
1015 if (ret < 0) { | |
1016 av_log(s, AV_LOG_ERROR, "Could not write cached audio packet ret:%d\n", ret); | |
1017 return ret; | |
1018 } | |
1019 } | |
1020 | |
1021 // buffer an audio packet to ensure the packet containing the video | |
1022 // keyframe's timecode is contained in the same cluster for WebM | |
1023 if (codec->codec_type == AVMEDIA_TYPE_AUDIO) | |
1024 ret = mkv_copy_packet(mkv, pkt); | |
1025 else | |
1026 ret = mkv_write_packet_internal(s, pkt); | |
1027 return ret; | |
2425
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
1028 } |
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
1029 |
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
1030 static int mkv_write_trailer(AVFormatContext *s) |
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
1031 { |
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
1032 MatroskaMuxContext *mkv = s->priv_data; |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2530
diff
changeset
|
1033 ByteIOContext *pb = s->pb; |
6090
b260ede399be
matroskaenc: Don't write a second seekhead for the clusters; mkvalidate agrees
conrad
parents:
6089
diff
changeset
|
1034 int64_t currentpos, cuespos; |
2502 | 1035 int ret; |
2443 | 1036 |
6085 | 1037 // check if we have an audio packet cached |
1038 if (mkv->cur_audio_pkt.size > 0) { | |
1039 ret = mkv_write_packet_internal(s, &mkv->cur_audio_pkt); | |
1040 mkv->cur_audio_pkt.size = 0; | |
1041 if (ret < 0) { | |
1042 av_log(s, AV_LOG_ERROR, "Could not write cached audio packet ret:%d\n", ret); | |
1043 return ret; | |
1044 } | |
1045 } | |
1046 | |
5747
551765b1772b
Ensure that we write clusters and blocks with known size when streaming
conrad
parents:
5746
diff
changeset
|
1047 if (mkv->dyn_bc) { |
551765b1772b
Ensure that we write clusters and blocks with known size when streaming
conrad
parents:
5746
diff
changeset
|
1048 end_ebml_master(mkv->dyn_bc, mkv->cluster); |
551765b1772b
Ensure that we write clusters and blocks with known size when streaming
conrad
parents:
5746
diff
changeset
|
1049 mkv_flush_dynbuf(s); |
551765b1772b
Ensure that we write clusters and blocks with known size when streaming
conrad
parents:
5746
diff
changeset
|
1050 } else if (mkv->cluster_pos) { |
551765b1772b
Ensure that we write clusters and blocks with known size when streaming
conrad
parents:
5746
diff
changeset
|
1051 end_ebml_master(pb, mkv->cluster); |
551765b1772b
Ensure that we write clusters and blocks with known size when streaming
conrad
parents:
5746
diff
changeset
|
1052 } |
2443 | 1053 |
2514 | 1054 if (!url_is_streamed(pb)) { |
2515 | 1055 cuespos = mkv_write_cues(pb, mkv->cues, s->nb_streams); |
2451 | 1056 |
2515 | 1057 ret = mkv_add_seekhead_entry(mkv->main_seekhead, MATROSKA_ID_CUES , cuespos); |
1058 if (ret < 0) return ret; | |
1059 mkv_write_seekhead(pb, mkv->main_seekhead); | |
2447 | 1060 |
2515 | 1061 // update the duration |
1062 av_log(s, AV_LOG_DEBUG, "end duration = %" PRIu64 "\n", mkv->duration); | |
1063 currentpos = url_ftell(pb); | |
1064 url_fseek(pb, mkv->duration_offset, SEEK_SET); | |
1065 put_ebml_float(pb, MATROSKA_ID_DURATION, mkv->duration); | |
2479
139406606437
Use a MD5 hash of some frames to write the segment uid
conrad
parents:
2478
diff
changeset
|
1066 |
2515 | 1067 url_fseek(pb, currentpos, SEEK_SET); |
2514 | 1068 } |
2443 | 1069 |
2425
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
1070 end_ebml_master(pb, mkv->segment); |
5793 | 1071 av_free(mkv->tracks); |
6085 | 1072 av_destruct_packet(&mkv->cur_audio_pkt); |
4239
5d0ac4d87ba1
Flush the buffer after writing the header and when done with writing the files
conrad
parents:
4223
diff
changeset
|
1073 put_flush_packet(pb); |
2425
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
1074 return 0; |
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
1075 } |
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
1076 |
6086 | 1077 #if CONFIG_MATROSKA_MUXER |
2425
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
1078 AVOutputFormat matroska_muxer = { |
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
1079 "matroska", |
3424
7a0230981402
Make long_names in lavf/lavdev optional depending on CONFIG_SMALL.
diego
parents:
3286
diff
changeset
|
1080 NULL_IF_CONFIG_SMALL("Matroska file format"), |
2425
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
1081 "video/x-matroska", |
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
1082 "mkv", |
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
1083 sizeof(MatroskaMuxContext), |
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
1084 CODEC_ID_MP2, |
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
1085 CODEC_ID_MPEG4, |
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
1086 mkv_write_header, |
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
1087 mkv_write_packet, |
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
1088 mkv_write_trailer, |
4567
963e3b76c7a6
Add AVFMT_VARIABLE_FPS to specify which muxers do not need duplicated frames.
michael
parents:
4498
diff
changeset
|
1089 .flags = AVFMT_GLOBALHEADER | AVFMT_VARIABLE_FPS, |
5058
33a244b7ca65
Add ff_ prefixes to exported symbols in libavformat/riff.h.
diego
parents:
4581
diff
changeset
|
1090 .codec_tag = (const AVCodecTag* const []){ff_codec_bmp_tags, ff_codec_wav_tags, 0}, |
2486 | 1091 .subtitle_codec = CODEC_ID_TEXT, |
2425
8c51e92edd7d
Beginning of mkv muxer, only EBML head is written correctly
conrad
parents:
diff
changeset
|
1092 }; |
6086 | 1093 #endif |
2475 | 1094 |
6086 | 1095 #if CONFIG_WEBM_MUXER |
1096 AVOutputFormat webm_muxer = { | |
1097 "webm", | |
1098 NULL_IF_CONFIG_SMALL("WebM file format"), | |
1099 "video/webm", | |
1100 "webm", | |
1101 sizeof(MatroskaMuxContext), | |
1102 CODEC_ID_VORBIS, | |
1103 CODEC_ID_VP8, | |
1104 mkv_write_header, | |
1105 mkv_write_packet, | |
1106 mkv_write_trailer, | |
1107 .flags = AVFMT_GLOBALHEADER | AVFMT_VARIABLE_FPS, | |
1108 }; | |
1109 #endif | |
1110 | |
1111 #if CONFIG_MATROSKA_AUDIO_MUXER | |
2475 | 1112 AVOutputFormat matroska_audio_muxer = { |
1113 "matroska", | |
3424
7a0230981402
Make long_names in lavf/lavdev optional depending on CONFIG_SMALL.
diego
parents:
3286
diff
changeset
|
1114 NULL_IF_CONFIG_SMALL("Matroska file format"), |
2475 | 1115 "audio/x-matroska", |
1116 "mka", | |
1117 sizeof(MatroskaMuxContext), | |
1118 CODEC_ID_MP2, | |
1119 CODEC_ID_NONE, | |
1120 mkv_write_header, | |
1121 mkv_write_packet, | |
1122 mkv_write_trailer, | |
4002 | 1123 .flags = AVFMT_GLOBALHEADER, |
5058
33a244b7ca65
Add ff_ prefixes to exported symbols in libavformat/riff.h.
diego
parents:
4581
diff
changeset
|
1124 .codec_tag = (const AVCodecTag* const []){ff_codec_wav_tags, 0}, |
2475 | 1125 }; |
6086 | 1126 #endif |