1 /*
2 * ASF muxer
3 * Copyright (c) 2000, 2001 Fabrice Bellard
4 *
5 * This file is part of FFmpeg.
6 *
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21
30
31 #define ASF_INDEXED_INTERVAL 10000000
32 #define ASF_INDEX_BLOCK (1<<9)
33 #define ASF_PAYLOADS_PER_PACKET 63
34
35 #define ASF_PACKET_ERROR_CORRECTION_DATA_SIZE 0x2
36 #define ASF_PACKET_ERROR_CORRECTION_FLAGS \
37 (ASF_PACKET_FLAG_ERROR_CORRECTION_PRESENT | \
38 ASF_PACKET_ERROR_CORRECTION_DATA_SIZE)
39
40 #if (ASF_PACKET_ERROR_CORRECTION_FLAGS != 0)
41 # define ASF_PACKET_ERROR_CORRECTION_FLAGS_FIELD_SIZE 1
42 #else
43 # define ASF_PACKET_ERROR_CORRECTION_FLAGS_FIELD_SIZE 0
44 #endif
45
46 #define ASF_PPI_PROPERTY_FLAGS \
47 (ASF_PL_FLAG_REPLICATED_DATA_LENGTH_FIELD_IS_BYTE | \
48 ASF_PL_FLAG_OFFSET_INTO_MEDIA_OBJECT_LENGTH_FIELD_IS_DWORD | \
49 ASF_PL_FLAG_MEDIA_OBJECT_NUMBER_LENGTH_FIELD_IS_BYTE | \
50 ASF_PL_FLAG_STREAM_NUMBER_LENGTH_FIELD_IS_BYTE)
51
52 #define ASF_PPI_LENGTH_TYPE_FLAGS 0
53
54 #define ASF_PAYLOAD_FLAGS ASF_PL_FLAG_PAYLOAD_LENGTH_FIELD_IS_WORD
55
56 #if (ASF_PPI_FLAG_SEQUENCE_FIELD_IS_BYTE == (ASF_PPI_LENGTH_TYPE_FLAGS & ASF_PPI_MASK_SEQUENCE_FIELD_SIZE))
57 # define ASF_PPI_SEQUENCE_FIELD_SIZE 1
58 #endif
59 #if (ASF_PPI_FLAG_SEQUENCE_FIELD_IS_WORD == (ASF_PPI_LENGTH_TYPE_FLAGS & ASF_PPI_MASK_SEQUENCE_FIELD_SIZE))
60 # define ASF_PPI_SEQUENCE_FIELD_SIZE 2
61 #endif
62 #if (ASF_PPI_FLAG_SEQUENCE_FIELD_IS_DWORD == (ASF_PPI_LENGTH_TYPE_FLAGS & ASF_PPI_MASK_SEQUENCE_FIELD_SIZE))
63 # define ASF_PPI_SEQUENCE_FIELD_SIZE 4
64 #endif
65 #ifndef ASF_PPI_SEQUENCE_FIELD_SIZE
66 # define ASF_PPI_SEQUENCE_FIELD_SIZE 0
67 #endif
68
69 #if (ASF_PPI_FLAG_PACKET_LENGTH_FIELD_IS_BYTE == (ASF_PPI_LENGTH_TYPE_FLAGS & ASF_PPI_MASK_PACKET_LENGTH_FIELD_SIZE))
70 # define ASF_PPI_PACKET_LENGTH_FIELD_SIZE 1
71 #endif
72 #if (ASF_PPI_FLAG_PACKET_LENGTH_FIELD_IS_WORD == (ASF_PPI_LENGTH_TYPE_FLAGS & ASF_PPI_MASK_PACKET_LENGTH_FIELD_SIZE))
73 # define ASF_PPI_PACKET_LENGTH_FIELD_SIZE 2
74 #endif
75 #if (ASF_PPI_FLAG_PACKET_LENGTH_FIELD_IS_DWORD == (ASF_PPI_LENGTH_TYPE_FLAGS & ASF_PPI_MASK_PACKET_LENGTH_FIELD_SIZE))
76 # define ASF_PPI_PACKET_LENGTH_FIELD_SIZE 4
77 #endif
78 #ifndef ASF_PPI_PACKET_LENGTH_FIELD_SIZE
79 # define ASF_PPI_PACKET_LENGTH_FIELD_SIZE 0
80 #endif
81
82 #if (ASF_PPI_FLAG_PADDING_LENGTH_FIELD_IS_BYTE == (ASF_PPI_LENGTH_TYPE_FLAGS & ASF_PPI_MASK_PADDING_LENGTH_FIELD_SIZE))
83 # define ASF_PPI_PADDING_LENGTH_FIELD_SIZE 1
84 #endif
85 #if (ASF_PPI_FLAG_PADDING_LENGTH_FIELD_IS_WORD == (ASF_PPI_LENGTH_TYPE_FLAGS & ASF_PPI_MASK_PADDING_LENGTH_FIELD_SIZE))
86 # define ASF_PPI_PADDING_LENGTH_FIELD_SIZE 2
87 #endif
88 #if (ASF_PPI_FLAG_PADDING_LENGTH_FIELD_IS_DWORD == (ASF_PPI_LENGTH_TYPE_FLAGS & ASF_PPI_MASK_PADDING_LENGTH_FIELD_SIZE))
89 # define ASF_PPI_PADDING_LENGTH_FIELD_SIZE 4
90 #endif
91 #ifndef ASF_PPI_PADDING_LENGTH_FIELD_SIZE
92 # define ASF_PPI_PADDING_LENGTH_FIELD_SIZE 0
93 #endif
94
95 #if (ASF_PL_FLAG_REPLICATED_DATA_LENGTH_FIELD_IS_BYTE == (ASF_PPI_PROPERTY_FLAGS & ASF_PL_MASK_REPLICATED_DATA_LENGTH_FIELD_SIZE))
96 # define ASF_PAYLOAD_REPLICATED_DATA_LENGTH_FIELD_SIZE 1
97 #endif
98 #if (ASF_PL_FLAG_REPLICATED_DATA_LENGTH_FIELD_IS_WORD == (ASF_PPI_PROPERTY_FLAGS & ASF_PL_MASK_REPLICATED_DATA_LENGTH_FIELD_SIZE))
99 # define ASF_PAYLOAD_REPLICATED_DATA_LENGTH_FIELD_SIZE 2
100 #endif
101 #if (ASF_PL_FLAG_REPLICATED_DATA_LENGTH_FIELD_IS_DWORD == (ASF_PPI_PROPERTY_FLAGS & ASF_PL_MASK_REPLICATED_DATA_LENGTH_FIELD_SIZE))
102 # define ASF_PAYLOAD_REPLICATED_DATA_LENGTH_FIELD_SIZE 4
103 #endif
104 #ifndef ASF_PAYLOAD_REPLICATED_DATA_LENGTH_FIELD_SIZE
105 # define ASF_PAYLOAD_REPLICATED_DATA_LENGTH_FIELD_SIZE 0
106 #endif
107
108 #if (ASF_PL_FLAG_OFFSET_INTO_MEDIA_OBJECT_LENGTH_FIELD_IS_BYTE == (ASF_PPI_PROPERTY_FLAGS & ASF_PL_MASK_OFFSET_INTO_MEDIA_OBJECT_LENGTH_FIELD_SIZE))
109 # define ASF_PAYLOAD_OFFSET_INTO_MEDIA_OBJECT_FIELD_SIZE 1
110 #endif
111 #if (ASF_PL_FLAG_OFFSET_INTO_MEDIA_OBJECT_LENGTH_FIELD_IS_WORD == (ASF_PPI_PROPERTY_FLAGS & ASF_PL_MASK_OFFSET_INTO_MEDIA_OBJECT_LENGTH_FIELD_SIZE))
112 # define ASF_PAYLOAD_OFFSET_INTO_MEDIA_OBJECT_FIELD_SIZE 2
113 #endif
114 #if (ASF_PL_FLAG_OFFSET_INTO_MEDIA_OBJECT_LENGTH_FIELD_IS_DWORD == (ASF_PPI_PROPERTY_FLAGS & ASF_PL_MASK_OFFSET_INTO_MEDIA_OBJECT_LENGTH_FIELD_SIZE))
115 # define ASF_PAYLOAD_OFFSET_INTO_MEDIA_OBJECT_FIELD_SIZE 4
116 #endif
117 #ifndef ASF_PAYLOAD_OFFSET_INTO_MEDIA_OBJECT_FIELD_SIZE
118 # define ASF_PAYLOAD_OFFSET_INTO_MEDIA_OBJECT_FIELD_SIZE 0
119 #endif
120
121 #if (ASF_PL_FLAG_MEDIA_OBJECT_NUMBER_LENGTH_FIELD_IS_BYTE == (ASF_PPI_PROPERTY_FLAGS & ASF_PL_MASK_MEDIA_OBJECT_NUMBER_LENGTH_FIELD_SIZE))
122 # define ASF_PAYLOAD_MEDIA_OBJECT_NUMBER_FIELD_SIZE 1
123 #endif
124 #if (ASF_PL_FLAG_MEDIA_OBJECT_NUMBER_LENGTH_FIELD_IS_WORD == (ASF_PPI_PROPERTY_FLAGS & ASF_PL_MASK_MEDIA_OBJECT_NUMBER_LENGTH_FIELD_SIZE))
125 # define ASF_PAYLOAD_MEDIA_OBJECT_NUMBER_FIELD_SIZE 2
126 #endif
127 #if (ASF_PL_FLAG_MEDIA_OBJECT_NUMBER_LENGTH_FIELD_IS_DWORD == (ASF_PPI_PROPERTY_FLAGS & ASF_PL_MASK_MEDIA_OBJECT_NUMBER_LENGTH_FIELD_SIZE))
128 # define ASF_PAYLOAD_MEDIA_OBJECT_NUMBER_FIELD_SIZE 4
129 #endif
130 #ifndef ASF_PAYLOAD_MEDIA_OBJECT_NUMBER_FIELD_SIZE
131 # define ASF_PAYLOAD_MEDIA_OBJECT_NUMBER_FIELD_SIZE 0
132 #endif
133
134 #if (ASF_PL_FLAG_PAYLOAD_LENGTH_FIELD_IS_BYTE == (ASF_PAYLOAD_FLAGS & ASF_PL_MASK_PAYLOAD_LENGTH_FIELD_SIZE))
135 # define ASF_PAYLOAD_LENGTH_FIELD_SIZE 1
136 #endif
137 #if (ASF_PL_FLAG_PAYLOAD_LENGTH_FIELD_IS_WORD == (ASF_PAYLOAD_FLAGS & ASF_PL_MASK_PAYLOAD_LENGTH_FIELD_SIZE))
138 # define ASF_PAYLOAD_LENGTH_FIELD_SIZE 2
139 #endif
140 #ifndef ASF_PAYLOAD_LENGTH_FIELD_SIZE
141 # define ASF_PAYLOAD_LENGTH_FIELD_SIZE 0
142 #endif
143
144 #define PACKET_HEADER_MIN_SIZE \
145 (ASF_PACKET_ERROR_CORRECTION_FLAGS_FIELD_SIZE + \
146 ASF_PACKET_ERROR_CORRECTION_DATA_SIZE + \
147 1 + /* Length Type Flags */ \
148 1 + /* Property Flags */ \
149 ASF_PPI_PACKET_LENGTH_FIELD_SIZE + \
150 ASF_PPI_SEQUENCE_FIELD_SIZE + \
151 ASF_PPI_PADDING_LENGTH_FIELD_SIZE + \
152 4 + /* Send Time Field */ \
153 2) /* Duration Field */
154
155 // Replicated Data shall be at least 8 bytes long.
156 #define ASF_PAYLOAD_REPLICATED_DATA_LENGTH 0x08
157
158 #define PAYLOAD_HEADER_SIZE_SINGLE_PAYLOAD \
159 (1 + /* Stream Number */ \
160 ASF_PAYLOAD_MEDIA_OBJECT_NUMBER_FIELD_SIZE + \
161 ASF_PAYLOAD_OFFSET_INTO_MEDIA_OBJECT_FIELD_SIZE + \
162 ASF_PAYLOAD_REPLICATED_DATA_LENGTH_FIELD_SIZE + \
163 ASF_PAYLOAD_REPLICATED_DATA_LENGTH)
164
165 #define PAYLOAD_HEADER_SIZE_MULTIPLE_PAYLOADS \
166 (1 + /* Stream Number */ \
167 ASF_PAYLOAD_MEDIA_OBJECT_NUMBER_FIELD_SIZE + \
168 ASF_PAYLOAD_OFFSET_INTO_MEDIA_OBJECT_FIELD_SIZE + \
169 ASF_PAYLOAD_REPLICATED_DATA_LENGTH_FIELD_SIZE + \
170 ASF_PAYLOAD_REPLICATED_DATA_LENGTH + \
171 ASF_PAYLOAD_LENGTH_FIELD_SIZE)
172
173 #define SINGLE_PAYLOAD_DATA_LENGTH \
174 (PACKET_SIZE - \
175 PACKET_HEADER_MIN_SIZE - \
176 PAYLOAD_HEADER_SIZE_SINGLE_PAYLOAD)
177
178 #define MULTI_PAYLOAD_CONSTANT \
179 (PACKET_SIZE - \
180 PACKET_HEADER_MIN_SIZE - \
181 1 - /* Payload Flags */ \
182 2 * PAYLOAD_HEADER_SIZE_MULTIPLE_PAYLOADS)
183
184 #define DATA_HEADER_SIZE 50
185
190 /* non streamed additonnal info */
191 uint64_t
nb_packets;
///< how many packets are there in the file, invalid if broadcasting
193 /* packet filling */
201 /* only for reading */
202 uint64_t
data_offset;
///< beginning of the first data packet
203
213
219 };
220
221 #define PREROLL_TIME 3100
222
224 {
229 return;
230
236 }
237
239 {
240 int64_t pos;
241
245 return pos;
246 }
247
248 /* update header size */
250 {
251 int64_t pos1;
252
257 }
258
259 /* write an asf chunk (only used in streaming case) */
261 int payload_length,
int flags)
262 {
266
267 length = payload_length + 8;
274 }
275
276 /* convert from unix to windows time */
278 {
279 int64_t t;
280
281 t = ti * INT64_C(10000000);
282 t += INT64_C(116444736000000000);
283 return t;
284 }
285
287 {
288 int i;
292 if (pres_time <= asf->index_ptr[i].send_time)
293 break;
296 }
297
298 return send_time / 10000;
299 }
300
302 {
305 int i;
308
311 avio_wl16(pb, 0);
// ASF spec mandates 0 for this
312 avio_wl16(pb, 0);
// name length 0, no name given
313
323 if (t) {
328 }
329 avio_wl64(pb, offset);
// offset of the packet with send_time
334 avio_wl32(pb, len / 2);
// marker desc length in WCHARS!
335 if (t) {
338 }
339 }
341 return 0;
342 }
343
344 /* write the header (used two times if non streamed) */
346 int64_t data_chunk_size)
347 {
351 int header_size,
n, extra_size, extra_size2, wav_extra_size, file_time;
352 int has_title, has_aspect_ratio = 0;
353 int metadata_count;
355 int64_t header_offset, cur_pos, hpos;
356 int bit_rate;
358
360
366
368 has_title = tags[0] || tags[1] || tags[2] || tags[3] || tags[4];
370
371 bit_rate = 0;
374
376
381 has_aspect_ratio++;
382 }
383
385 put_chunk(s, 0x4824, 0, 0xc00);
/* start of stream (length will be patched later) */
386 }
387
389 avio_wl64(pb, -1);
/* header length, will be patched after */
390 avio_wl32(pb, 3 + has_title + !!metadata_count + s->
nb_streams);
/* number of chunks in header */
393
394 /* file header */
399 file_time = 0;
402 avio_wl64(pb, duration);
/* end time stamp (in 100ns units) */
408 avio_wl32(pb, bit_rate ? bit_rate : -1);
/* Maximum data rate in bps */
410
411 /* unknown headers */
415 if (has_aspect_ratio) {
416 int64_t hpos2;
417 avio_wl32(pb, 26 + has_aspect_ratio * 84);
427 // the stream number is set like this below
435 // the stream number is set like this below
442 }
443 }
445 } else {
447 }
449
450 /* title and other infos */
451 if (has_title) {
455
458
460
464 }
469 }
470 if (metadata_count) {
478 }
480 }
481 /* chapters using ASF markers */
486 }
487 /* stream headers */
489 int64_t es_pos;
490 // ASFStream *stream = &asf->streams[n];
491
495
498 wav_extra_size = 0;
499 extra_size = 18 + wav_extra_size;
500 extra_size2 = 8;
501 break;
502 default:
505 extra_size = 0x33 + wav_extra_size;
506 extra_size2 = 0;
507 break;
508 }
509
514 } else {
517 }
520 avio_wl32(pb, extra_size);
/* wav header len */
521 avio_wl32(pb, extra_size2);
/* additional data len */
522 avio_wl16(pb, n + 1);
/* stream number */
524
526 /* WAVEFORMATEX header */
528
529 if (wavsize < 0)
530 return -1;
531 if (wavsize != extra_size) {
534 avio_wl32(pb, wavsize);
/* wav header len */
536 }
537 /* ERROR Correction */
542 } else {
545 }
548 } else {
553
554 /* BITMAPINFOHEADER header */
556 }
558 }
559
560 /* media comments */
561
567 const char *desc;
568
571
576 else
578
580 desc = "Windows Media Audio V8";
581 else
582 desc = codec_desc ? codec_desc->
name :
NULL;
583
584 if (desc) {
588
591
594 avio_wl16(pb, len / 2);
// "number of characters" = length in bytes / 2
595
598 } else
600
602
603 /* id */
607 } else {
610 }
612 return -1;
613 }
615
616 /* patch the header size fields */
617
619 header_size = cur_pos - header_offset;
622
623 avio_seek(pb, header_offset - 10 - 30, SEEK_SET);
625 avio_seek(pb, header_offset - 2 - 30, SEEK_SET);
627
629 }
630 header_size += 24 + 6;
631 avio_seek(pb, header_offset - 14, SEEK_SET);
634
635 /* movie chunk, followed by packets of packet_size */
643 return 0;
644 }
645
647 {
649
653
657
658 /* the data-chunk-size has to be 50 (DATA_HEADER_SIZE), which is
659 * data_size - asf->data_offset at the moment this function is done.
660 * It is needed to use asf as a streamable format. */
662 //av_free(asf);
663 return -1;
664 }
665
667
673
676
677 return 0;
678 }
679
681 {
683
685
687 }
688
690 unsigned sendtime,
unsigned duration,
691 int nb_payloads, int padsize)
692 {
695 int ppi_size, i;
697
699
702 padsize--;
704
708
711
712 if (padsize > 0) {
713 if (padsize < 256)
715 else
717 }
719
721
726
731
733
734 return ppi_size;
735 }
736
738 {
740 int packet_hdr_size, packet_filled_size;
741
743
746
752
754 av_assert0(packet_hdr_size <= asf->packet_size_left);
756
758
766 }
767
769 int64_t presentation_time, int m_obj_size,
770 int m_obj_offset,
int payload_len,
int flags)
771 {
775
780
781 avio_w8(pb, stream->
seq);
// Media object number
782 avio_wl32(pb, m_obj_offset);
// Offset Into Media Object
783
784 // Replicated Data shall be at least 8 bytes long.
785 // The first 4 bytes of data shall contain the
786 // Size of the Media Object that the payload belongs to.
787 // The next 4 bytes of data shall contain the
788 // Presentation Time for the media object that the payload belongs to.
790
791 avio_wl32(pb, m_obj_size);
// Replicated Data - Media Object Size
792 avio_wl32(pb, (uint32_t) presentation_time);
// Replicated Data - Presentation Time
793
795 avio_wl16(pb, payload_len);
// payload length
796 }
797 }
798
801 int m_obj_size,
int flags)
802 {
804 int m_obj_offset, payload_len, frag_len1;
805
806 m_obj_offset = 0;
807 while (m_obj_offset < m_obj_size) {
808 payload_len = m_obj_size - m_obj_offset;
811
815 } else {
817 }
819 } else {
820 // multi payloads
824
825 if (frag_len1 < payload_len &&
828 continue;
829 }
830 }
831 if (frag_len1 > 0) {
832 if (payload_len > frag_len1)
833 payload_len = frag_len1;
834 else if (payload_len == (frag_len1 - 1))
835 payload_len = frag_len1 - 2; // additional byte need to put padding length
836
838 m_obj_size, m_obj_offset, payload_len, flags);
840
843 else
846
848 } else {
849 payload_len = 0;
850 }
851 m_obj_offset += payload_len;
852 buf += payload_len;
853
860 }
862 }
863
865 uint32_t packet_number, uint16_t packet_count,
866 uint64_t packet_offset)
867 {
869
871 int i;
872
877 }
878
880 int err;
886 return err;
887 }
888 }
894
895 }
896 }
902
903 return 0;
904 }
905
907 {
912 uint32_t packet_number;
914 int start_sec;
918
921
924
927 pts *= 10000;
929
933
936
937 /* check index */
939 uint16_t packet_count = asf->
nb_packets - packet_number;
940 ret =
update_index(s, start_sec, packet_number, packet_count, offset);
941 if (ret < 0)
943 }
945
946 return 0;
947 }
948
950 uint16_t max, uint32_t
count)
951 {
953 int i;
954
956 avio_wl64(pb, 24 + 16 + 8 + 4 + 4 + (4 + 2) * count);
961 for (i = 0; i <
count; i++) {
964 }
965
966 return 0;
967 }
968
970 {
972 int64_t file_size, data_size;
974
975 /* flush the current packet */
978
979 /* write index */
985 }
987
989 put_chunk(s, 0x4524, 0, 0);
/* end of stream */
990 } else {
991 /* rewrite an updated header */
995 }
996
998 return 0;
999 }
1000
1001 #if CONFIG_ASF_MUXER
1005 .mime_type = "video/x-ms-asf",
1006 .extensions = "asf,wmv,wma",
1016 },
1017 };
1018 #endif /* CONFIG_ASF_MUXER */
1019
1020 #if CONFIG_ASF_STREAM_MUXER
1022 .
name =
"asf_stream",
1024 .mime_type = "video/x-ms-asf",
1025 .extensions = "asf,wmv,wma",
1035 },
1036 };
1037 #endif /* CONFIG_ASF_STREAM_MUXER */