Lines Matching refs:pb
158 static int64_t update_size(AVIOContext *pb, int64_t pos)
160 int64_t curpos = avio_tell(pb);
161 avio_seek(pb, pos, SEEK_SET);
162 avio_wb32(pb, curpos - pos); /* rewrite size */
163 avio_seek(pb, curpos, SEEK_SET);
192 static int mov_write_stco_tag(AVIOContext *pb, MOVTrack *track)
196 int64_t pos = avio_tell(pb);
197 avio_wb32(pb, 0); /* size */
199 ffio_wfourcc(pb, "co64");
201 ffio_wfourcc(pb, "stco");
202 avio_wb32(pb, 0); /* version & flags */
203 avio_wb32(pb, track->chunkCount); /* entry count */
208 avio_wb64(pb, track->cluster[i].pos + track->data_offset);
210 avio_wb32(pb, track->cluster[i].pos + track->data_offset);
212 return update_size(pb, pos);
216 static int mov_write_stsz_tag(AVIOContext *pb, MOVTrack *track)
221 int64_t pos = avio_tell(pb);
222 avio_wb32(pb, 0); /* size */
223 ffio_wfourcc(pb, "stsz");
224 avio_wb32(pb, 0); /* version & flags */
236 avio_wb32(pb, sSize); // sample size
237 avio_wb32(pb, entries); // sample count
239 avio_wb32(pb, 0); // sample size
240 avio_wb32(pb, entries); // sample count
243 avio_wb32(pb, track->cluster[i].size /
248 return update_size(pb, pos);
252 static int mov_write_stsc_tag(AVIOContext *pb, MOVTrack *track)
257 int64_t pos = avio_tell(pb);
258 avio_wb32(pb, 0); /* size */
259 ffio_wfourcc(pb, "stsc");
260 avio_wb32(pb, 0); // version & flags
261 entryPos = avio_tell(pb);
262 avio_wb32(pb, track->chunkCount); // entry count
265 avio_wb32(pb, track->cluster[i].chunkNum); // first chunk
266 avio_wb32(pb, track->cluster[i].samples_in_chunk); // samples per chunk
267 avio_wb32(pb, 0x1); // sample description index
272 curpos = avio_tell(pb);
273 avio_seek(pb, entryPos, SEEK_SET);
274 avio_wb32(pb, index); // rewrite size
275 avio_seek(pb, curpos, SEEK_SET);
277 return update_size(pb, pos);
281 static int mov_write_stss_tag(AVIOContext *pb, MOVTrack *track, uint32_t flag)
285 int64_t pos = avio_tell(pb);
286 avio_wb32(pb, 0); // size
287 ffio_wfourcc(pb, flag == MOV_SYNC_SAMPLE ? "stss" : "stps");
288 avio_wb32(pb, 0); // version & flags
289 entryPos = avio_tell(pb);
290 avio_wb32(pb, track->entry); // entry count
293 avio_wb32(pb, i + 1);
297 curpos = avio_tell(pb);
298 avio_seek(pb, entryPos, SEEK_SET);
299 avio_wb32(pb, index); // rewrite size
300 avio_seek(pb, curpos, SEEK_SET);
301 return update_size(pb, pos);
305 static int mov_write_sdtp_tag(AVIOContext *pb, MOVTrack *track)
309 int64_t pos = avio_tell(pb);
310 avio_wb32(pb, 0); // size
311 ffio_wfourcc(pb, "sdtp");
312 avio_wb32(pb, 0); // version & flags
326 avio_w8(pb, (leading << 6) | (dependent << 4) |
329 return update_size(pb, pos);
332 static int mov_write_amr_tag(AVIOContext *pb, MOVTrack *track)
334 avio_wb32(pb, 0x11); /* size */
335 if (track->mode == MODE_MOV) ffio_wfourcc(pb, "samr");
336 else ffio_wfourcc(pb, "damr");
337 ffio_wfourcc(pb, "FFMP");
338 avio_w8(pb, 0); /* decoder version */
340 avio_wb16(pb, 0x81FF); /* Mode set (all modes for AMR_NB) */
341 avio_w8(pb, 0x00); /* Mode change period (no restriction) */
342 avio_w8(pb, 0x01); /* Frames per sample */
379 static int mov_write_ac3_tag(AVFormatContext *s, AVIOContext *pb, MOVTrack *track)
407 avio_wb32(pb, 11);
408 ffio_wfourcc(pb, "dac3");
420 avio_write(pb, buf, sizeof(buf));
584 static int mov_write_eac3_tag(AVFormatContext *s, AVIOContext *pb, MOVTrack *track)
626 avio_wb32(pb, size + 8);
627 ffio_wfourcc(pb, "dec3");
628 avio_write(pb, buf, size);
639 static int mov_write_extradata_tag(AVIOContext *pb, MOVTrack *track)
641 avio_write(pb, track->par->extradata, track->par->extradata_size);
645 static int mov_write_enda_tag(AVIOContext *pb)
647 avio_wb32(pb, 10);
648 ffio_wfourcc(pb, "enda");
649 avio_wb16(pb, 1); /* little endian */
653 static int mov_write_enda_tag_be(AVIOContext *pb)
655 avio_wb32(pb, 10);
656 ffio_wfourcc(pb, "enda");
657 avio_wb16(pb, 0); /* big endian */
661 static void put_descr(AVIOContext *pb, int tag, unsigned int size)
664 avio_w8(pb, tag);
666 avio_w8(pb, (size >> (7 * i)) | 0x80);
667 avio_w8(pb, size & 0x7F);
729 static int mov_write_esds_tag(AVIOContext *pb, MOVTrack *track) // Basic
732 int64_t pos = avio_tell(pb);
735 avio_wb32(pb, 0); // size
736 ffio_wfourcc(pb, "esds");
737 avio_wb32(pb, 0); // Version
740 put_descr(pb, 0x03, 3 + 5+13 + decoder_specific_info_len + 5+1);
741 avio_wb16(pb, track->track_id);
742 avio_w8(pb, 0x00); // flags (= no flags)
745 put_descr(pb, 0x04, 13 + decoder_specific_info_len);
751 avio_w8(pb, 0x6B); // 11172-3
753 avio_w8(pb, ff_codec_get_tag(ff_mp4_obj_type, track->par->codec_id));
758 avio_w8(pb, (0x38 << 2) | 1); // flags (= NeroSubpicStream)
760 avio_w8(pb, 0x15); // flags (= Audiostream)
762 avio_w8(pb, 0x11); // flags (= Visualstream)
764 avio_wb24(pb, bit_rates.buffer_size); // Buffersize DB
765 avio_wb32(pb, bit_rates.max_bit_rate); // maxbitrate
766 avio_wb32(pb, bit_rates.avg_bit_rate);
770 put_descr(pb, 0x05, track->vos_len);
771 avio_write(pb, track->vos_data, track->vos_len);
775 put_descr(pb, 0x06, 1);
776 avio_w8(pb, 0x02);
777 return update_size(pb, pos);
796 static int mov_write_ms_tag(AVFormatContext *s, AVIOContext *pb, MOVTrack *track)
799 int64_t pos = avio_tell(pb);
800 avio_wb32(pb, 0);
801 avio_wl32(pb, track->tag); // store it byteswapped
803 if ((ret = ff_put_wav_header(s, pb, track->par, 0)) < 0)
805 return update_size(pb, pos);
808 static int mov_write_wfex_tag(AVFormatContext *s, AVIOContext *pb, MOVTrack *track)
811 int64_t pos = avio_tell(pb);
812 avio_wb32(pb, 0);
813 ffio_wfourcc(pb, "wfex");
814 if ((ret = ff_put_wav_header(s, pb, track->st->codecpar, FF_PUT_WAV_HEADER_FORCE_WAVEFORMATEX)) < 0)
816 return update_size(pb, pos);
819 static int mov_write_dfla_tag(AVIOContext *pb, MOVTrack *track)
821 int64_t pos = avio_tell(pb);
822 avio_wb32(pb, 0);
823 ffio_wfourcc(pb, "dfLa");
824 avio_w8(pb, 0); /* version */
825 avio_wb24(pb, 0); /* flags */
832 avio_w8(pb, 1 << 7 | FLAC_METADATA_TYPE_STREAMINFO); /* LastMetadataBlockFlag << 7 | BlockType */
833 avio_wb24(pb, track->par->extradata_size); /* Length */
834 avio_write(pb, track->par->extradata, track->par->extradata_size); /* BlockData[Length] */
836 return update_size(pb, pos);
839 static int mov_write_dops_tag(AVFormatContext *s, AVIOContext *pb, MOVTrack *track)
841 int64_t pos = avio_tell(pb);
843 avio_wb32(pb, 0);
844 ffio_wfourcc(pb, "dOps");
845 avio_w8(pb, 0); /* Version */
856 avio_w8(pb, channels); /* OuputChannelCount */
857 avio_wb16(pb, AV_RL16(track->par->extradata + 10)); /* PreSkip */
858 avio_wb32(pb, AV_RL32(track->par->extradata + 12)); /* InputSampleRate */
859 avio_wb16(pb, AV_RL16(track->par->extradata + 16)); /* OutputGain */
860 avio_w8(pb, channel_map); /* ChannelMappingFamily */
867 avio_write(pb, track->par->extradata + 19, 2 + channels); /* ChannelMappingTable */
870 return update_size(pb, pos);
873 static int mov_write_dmlp_tag(AVFormatContext *s, AVIOContext *pb, MOVTrack *track)
875 int64_t pos = avio_tell(pb);
877 avio_wb32(pb, 0);
878 ffio_wfourcc(pb, "dmlp");
895 avio_wb32(pb, AV_RB32(track->vos_data + 8)); /* format_info */
896 avio_wb16(pb, AV_RB16(track->vos_data + 18) << 1); /* peak_data_rate */
897 avio_wb32(pb, 0); /* reserved */
899 return update_size(pb, pos);
902 static int mov_write_chan_tag(AVFormatContext *s, AVIOContext *pb, MOVTrack *track)
905 int64_t pos = avio_tell(pb);
937 avio_wb32(pb, 0); // Size
938 ffio_wfourcc(pb, "chan"); // Type
939 avio_w8(pb, 0); // Version
940 avio_wb24(pb, 0); // Flags
941 avio_wb32(pb, layout_tag); // mChannelLayoutTag
942 avio_wb32(pb, bitmap); // mChannelBitmap
943 avio_wb32(pb, num_desc); // mNumberChannelDescriptions
946 avio_wb32(pb, channel_desc[i]); // mChannelLabel
947 avio_wb32(pb, 0); // mChannelFlags
948 avio_wl32(pb, 0); // mCoordinates[0]
949 avio_wl32(pb, 0); // mCoordinates[1]
950 avio_wl32(pb, 0); // mCoordinates[2]
955 return update_size(pb, pos);
958 static int mov_write_wave_tag(AVFormatContext *s, AVIOContext *pb, MOVTrack *track)
960 int64_t pos = avio_tell(pb);
962 avio_wb32(pb, 0); /* size */
963 ffio_wfourcc(pb, "wave");
966 avio_wb32(pb, 12); /* size */
967 ffio_wfourcc(pb, "frma");
968 avio_wl32(pb, track->tag);
973 avio_wb32(pb, 12); /* size */
974 ffio_wfourcc(pb, "mp4a");
975 avio_wb32(pb, 0);
976 mov_write_esds_tag(pb, track);
978 mov_write_enda_tag(pb);
980 mov_write_enda_tag_be(pb);
982 mov_write_amr_tag(pb, track);
984 mov_write_ac3_tag(s, pb, track);
986 mov_write_eac3_tag(s, pb, track);
989 mov_write_extradata_tag(pb, track);
992 mov_write_ms_tag(s, pb, track);
995 avio_wb32(pb, 8); /* size */
996 avio_wb32(pb, 0); /* null tag */
998 return update_size(pb, pos);
1084 static int mov_write_dvc1_tag(AVIOContext *pb, MOVTrack *track)
1092 avio_wb32(pb, track->vos_len + 8 + sizeof(buf));
1093 ffio_wfourcc(pb, "dvc1");
1094 avio_write(pb, buf, sizeof(buf));
1095 avio_write(pb, track->vos_data, track->vos_len);
1100 static int mov_write_glbl_tag(AVIOContext *pb, MOVTrack *track)
1102 avio_wb32(pb, track->vos_len + 8);
1103 ffio_wfourcc(pb, "glbl");
1104 avio_write(pb, track->vos_data, track->vos_len);
1178 static int mov_write_btrt_tag(AVIOContext *pb, MOVTrack *track)
1180 int64_t pos = avio_tell(pb);
1187 avio_wb32(pb, 0); /* size */
1188 ffio_wfourcc(pb, "btrt");
1190 avio_wb32(pb, bit_rates.buffer_size);
1191 avio_wb32(pb, bit_rates.max_bit_rate);
1192 avio_wb32(pb, bit_rates.avg_bit_rate);
1194 return update_size(pb, pos);
1197 static int mov_write_audio_tag(AVFormatContext *s, AVIOContext *pb, MOVMuxContext *mov, MOVTrack *track)
1199 int64_t pos = avio_tell(pb);
1218 avio_wb32(pb, 0); /* size */
1220 ffio_wfourcc(pb, "enca");
1222 avio_wl32(pb, tag); // store it byteswapped
1224 avio_wb32(pb, 0); /* Reserved */
1225 avio_wb16(pb, 0); /* Reserved */
1226 avio_wb16(pb, 1); /* Data-reference index, XXX == 1 */
1229 avio_wb16(pb, version); /* Version */
1230 avio_wb16(pb, 0); /* Revision level */
1231 avio_wb32(pb, 0); /* Reserved */
1234 avio_wb16(pb, 3);
1235 avio_wb16(pb, 16);
1236 avio_wb16(pb, 0xfffe);
1237 avio_wb16(pb, 0);
1238 avio_wb32(pb, 0x00010000);
1239 avio_wb32(pb, 72);
1240 avio_wb64(pb, av_double2int(track->par->sample_rate));
1241 avio_wb32(pb, track->par->ch_layout.nb_channels);
1242 avio_wb32(pb, 0x7F000000);
1243 avio_wb32(pb, av_get_bits_per_sample(track->par->codec_id));
1244 avio_wb32(pb, mov_get_lpcm_flags(track->par->codec_id));
1245 avio_wb32(pb, track->sample_size);
1246 avio_wb32(pb, get_samples_per_packet(track));
1249 avio_wb16(pb, track->par->ch_layout.nb_channels);
1252 avio_wb16(pb, 8); /* bits per sample */
1254 avio_wb16(pb, track->par->bits_per_coded_sample);
1256 avio_wb16(pb, 16);
1257 avio_wb16(pb, track->audio_vbr ? -2 : 0); /* compression ID */
1262 avio_wb16(pb, track->par->ch_layout.nb_channels);
1264 avio_wb16(pb, 2);
1268 avio_wb16(pb, track->par->bits_per_raw_sample);
1270 avio_wb16(pb, 16);
1272 avio_wb16(pb, 0);
1275 avio_wb16(pb, 0); /* packet size (= 0) */
1277 avio_wb16(pb, 48000);
1279 avio_wb32(pb, track->par->sample_rate);
1281 avio_wb16(pb, track->par->sample_rate <= UINT16_MAX ?
1285 avio_wb16(pb, 0); /* Reserved */
1291 avio_wb32(pb, 1); /* must be 1 for uncompressed formats */
1293 avio_wb32(pb, track->par->frame_size); /* Samples per packet */
1294 avio_wb32(pb, track->sample_size / track->par->ch_layout.nb_channels); /* Bytes per packet */
1295 avio_wb32(pb, track->sample_size); /* Bytes per frame */
1296 avio_wb32(pb, 2); /* Bytes per sample */
1310 ret = mov_write_wave_tag(s, pb, track);
1312 ret = mov_write_esds_tag(pb, track);
1314 ret = mov_write_amr_tag(pb, track);
1316 ret = mov_write_ac3_tag(s, pb, track);
1318 ret = mov_write_eac3_tag(s, pb, track);
1320 ret = mov_write_extradata_tag(pb, track);
1322 ret = mov_write_wfex_tag(s, pb, track);
1324 ret = mov_write_dfla_tag(pb, track);
1326 ret = mov_write_dops_tag(s, pb, track);
1328 ret = mov_write_dmlp_tag(s, pb, track);
1330 ret = mov_write_glbl_tag(pb, track);
1336 && ((ret = mov_write_chan_tag(s, pb, track)) < 0)) {
1341 && ((ret = ff_mov_cenc_write_sinf_tag(track, pb, mov->encryption_kid)) < 0)) {
1346 ((ret = mov_write_btrt_tag(pb, track)) < 0))
1349 ret = update_size(pb, pos);
1353 static int mov_write_d263_tag(AVIOContext *pb)
1355 avio_wb32(pb, 0xf); /* size */
1356 ffio_wfourcc(pb, "d263");
1357 ffio_wfourcc(pb, "FFMP");
1358 avio_w8(pb, 0); /* decoder version */
1360 avio_w8(pb, 0xa); /* level */
1361 avio_w8(pb, 0); /* profile */
1365 static int mov_write_av1c_tag(AVIOContext *pb, MOVTrack *track)
1367 int64_t pos = avio_tell(pb);
1369 avio_wb32(pb, 0);
1370 ffio_wfourcc(pb, "av1C");
1371 ff_isom_write_av1c(pb, track->vos_data, track->vos_len, track->mode != MODE_AVIF);
1372 return update_size(pb, pos);
1375 static int mov_write_avcc_tag(AVIOContext *pb, MOVTrack *track)
1377 int64_t pos = avio_tell(pb);
1379 avio_wb32(pb, 0);
1380 ffio_wfourcc(pb, "avcC");
1381 ff_isom_write_avcc(pb, track->vos_data, track->vos_len);
1382 return update_size(pb, pos);
1385 static int mov_write_vpcc_tag(AVFormatContext *s, AVIOContext *pb, MOVTrack *track)
1387 int64_t pos = avio_tell(pb);
1389 avio_wb32(pb, 0);
1390 ffio_wfourcc(pb, "vpcC");
1391 avio_w8(pb, 1); /* version */
1392 avio_wb24(pb, 0); /* flags */
1393 ff_isom_write_vpcc(s, pb, track->par);
1394 return update_size(pb, pos);
1397 static int mov_write_hvcc_tag(AVIOContext *pb, MOVTrack *track)
1399 int64_t pos = avio_tell(pb);
1401 avio_wb32(pb, 0);
1402 ffio_wfourcc(pb, "hvcC");
1404 ff_isom_write_hvcc(pb, track->vos_data, track->vos_len, 1);
1406 ff_isom_write_hvcc(pb, track->vos_data, track->vos_len, 0);
1407 return update_size(pb, pos);
1411 static int mov_write_avid_tag(AVIOContext *pb, MOVTrack *track)
1431 avio_wb32(pb, 24); /* size */
1432 ffio_wfourcc(pb, "ACLR");
1433 ffio_wfourcc(pb, "ACLR");
1434 ffio_wfourcc(pb, "0001");
1437 avio_wb32(pb, 1); /* Corresponds to 709 in official encoder */
1439 avio_wb32(pb, 2); /* Corresponds to RGB in official encoder */
1441 avio_wb32(pb, 0); /* unknown */
1444 avio_wb32(pb, 32);
1445 ffio_wfourcc(pb, "ADHR");
1446 ffio_wfourcc(pb, "0001");
1447 avio_wb32(pb, cid);
1448 avio_wb32(pb, 0); /* unknown */
1449 avio_wb32(pb, 1); /* unknown */
1450 avio_wb32(pb, 0); /* unknown */
1451 avio_wb32(pb, 0); /* unknown */
1455 avio_wb32(pb, 24); /* size */
1456 ffio_wfourcc(pb, "APRG");
1457 ffio_wfourcc(pb, "APRG");
1458 ffio_wfourcc(pb, "0001");
1459 avio_wb32(pb, 1); /* unknown */
1460 avio_wb32(pb, 0); /* unknown */
1462 avio_wb32(pb, 120); /* size */
1463 ffio_wfourcc(pb, "ARES");
1464 ffio_wfourcc(pb, "ARES");
1465 ffio_wfourcc(pb, "0001");
1466 avio_wb32(pb, cid); /* dnxhd cid, some id ? */
1470 avio_wb32(pb, display_width);
1473 avio_wb32(pb, track->par->height / 2);
1474 avio_wb32(pb, 2); /* unknown */
1475 avio_wb32(pb, 0); /* unknown */
1476 avio_wb32(pb, 4); /* unknown */
1478 avio_wb32(pb, track->par->height);
1479 avio_wb32(pb, 1); /* unknown */
1480 avio_wb32(pb, 0); /* unknown */
1482 avio_wb32(pb, 5); /* unknown */
1484 avio_wb32(pb, 6); /* unknown */
1487 ffio_fill(pb, 0, 10 * 8);
1492 static int mov_write_dpxe_tag(AVIOContext *pb, MOVTrack *track)
1494 avio_wb32(pb, 12);
1495 ffio_wfourcc(pb, "DpxE");
1498 avio_wb32(pb, track->par->extradata[11]);
1500 avio_wb32(pb, 1);
1817 static int mov_write_uuid_tag_ipod(AVIOContext *pb)
1819 avio_wb32(pb, 28);
1820 ffio_wfourcc(pb, "uuid");
1821 avio_wb32(pb, 0x6b6840f2);
1822 avio_wb32(pb, 0x5f244fc5);
1823 avio_wb32(pb, 0xba39a51b);
1824 avio_wb32(pb, 0xcf0323f3);
1825 avio_wb32(pb, 0x0);
1833 static int mov_write_fiel_tag(AVIOContext *pb, MOVTrack *track, int field_order)
1840 avio_wb32(pb, 10);
1841 ffio_wfourcc(pb, "fiel");
1842 avio_wb16(pb, mov_field_order);
1846 static int mov_write_subtitle_tag(AVFormatContext *s, AVIOContext *pb, MOVTrack *track)
1850 int64_t pos = avio_tell(pb);
1851 avio_wb32(pb, 0); /* size */
1852 avio_wl32(pb, track->tag); // store it byteswapped
1853 avio_wb32(pb, 0); /* Reserved */
1854 avio_wb16(pb, 0); /* Reserved */
1855 avio_wb16(pb, 1); /* Data-reference index */
1858 mov_write_esds_tag(pb, track);
1867 avio_put_str(pb, "http://www.w3.org/ns/ttml");
1869 avio_w8(pb, 0);
1871 avio_w8(pb, 0);
1882 avio_write(pb, track->par->extradata, track->par->extradata_size);
1885 ((ret = mov_write_btrt_tag(pb, track)) < 0))
1888 return update_size(pb, pos);
1891 static int mov_write_st3d_tag(AVFormatContext *s, AVIOContext *pb, AVStereo3D *stereo_3d)
1914 avio_wb32(pb, 13); /* size */
1915 ffio_wfourcc(pb, "st3d");
1916 avio_wb32(pb, 0); /* version = 0 & flags = 0 */
1917 avio_w8(pb, stereo_mode);
1921 static int mov_write_sv3d_tag(AVFormatContext *s, AVIOContext *pb, AVSphericalMapping *spherical_mapping)
1933 sv3d_pos = avio_tell(pb);
1934 avio_wb32(pb, 0); /* size */
1935 ffio_wfourcc(pb, "sv3d");
1937 svhd_pos = avio_tell(pb);
1938 avio_wb32(pb, 0); /* size */
1939 ffio_wfourcc(pb, "svhd");
1940 avio_wb32(pb, 0); /* version = 0 & flags = 0 */
1941 avio_put_str(pb, metadata_source);
1942 update_size(pb, svhd_pos);
1944 proj_pos = avio_tell(pb);
1945 avio_wb32(pb, 0); /* size */
1946 ffio_wfourcc(pb, "proj");
1948 avio_wb32(pb, 24); /* size */
1949 ffio_wfourcc(pb, "prhd");
1950 avio_wb32(pb, 0); /* version = 0 & flags = 0 */
1951 avio_wb32(pb, spherical_mapping->yaw);
1952 avio_wb32(pb, spherical_mapping->pitch);
1953 avio_wb32(pb, spherical_mapping->roll);
1958 avio_wb32(pb, 28); /* size */
1959 ffio_wfourcc(pb, "equi");
1960 avio_wb32(pb, 0); /* version = 0 & flags = 0 */
1961 avio_wb32(pb, spherical_mapping->bound_top);
1962 avio_wb32(pb, spherical_mapping->bound_bottom);
1963 avio_wb32(pb, spherical_mapping->bound_left);
1964 avio_wb32(pb, spherical_mapping->bound_right);
1967 avio_wb32(pb, 20); /* size */
1968 ffio_wfourcc(pb, "cbmp");
1969 avio_wb32(pb, 0); /* version = 0 & flags = 0 */
1970 avio_wb32(pb, 0); /* layout */
1971 avio_wb32(pb, spherical_mapping->padding); /* padding */
1974 update_size(pb, proj_pos);
1976 return update_size(pb, sv3d_pos);
1979 static int mov_write_dvcc_dvvc_tag(AVFormatContext *s, AVIOContext *pb, AVDOVIDecoderConfigurationRecord *dovi)
1983 avio_wb32(pb, 32); /* size = 8 + 24 */
1985 ffio_wfourcc(pb, "dvwC");
1987 ffio_wfourcc(pb, "dvvC");
1989 ffio_wfourcc(pb, "dvcC");
1992 avio_write(pb, buf, sizeof(buf));
1997 static int mov_write_clap_tag(AVIOContext *pb, MOVTrack *track)
1999 avio_wb32(pb, 40);
2000 ffio_wfourcc(pb, "clap");
2001 avio_wb32(pb, track->par->width); /* apertureWidth_N */
2002 avio_wb32(pb, 1); /* apertureWidth_D (= 1) */
2003 avio_wb32(pb, track->height); /* apertureHeight_N */
2004 avio_wb32(pb, 1); /* apertureHeight_D (= 1) */
2005 avio_wb32(pb, 0); /* horizOff_N (= 0) */
2006 avio_wb32(pb, 1); /* horizOff_D (= 1) */
2007 avio_wb32(pb, 0); /* vertOff_N (= 0) */
2008 avio_wb32(pb, 1); /* vertOff_D (= 1) */
2012 static int mov_write_pasp_tag(AVIOContext *pb, MOVTrack *track)
2018 avio_wb32(pb, 16);
2019 ffio_wfourcc(pb, "pasp");
2020 avio_wb32(pb, sar.num);
2021 avio_wb32(pb, sar.den);
2025 static int mov_write_gama_tag(AVFormatContext *s, AVIOContext *pb, MOVTrack *track, double gamma)
2038 avio_wb32(pb, 12);
2039 ffio_wfourcc(pb, "gama");
2040 avio_wb32(pb, gama);
2048 static int mov_write_colr_tag(AVIOContext *pb, MOVTrack *track, int prefer_icc)
2050 int64_t pos = avio_tell(pb);
2062 avio_wb32(pb, 12 + icc_profile_size);
2063 ffio_wfourcc(pb, "colr");
2064 ffio_wfourcc(pb, "prof");
2065 avio_write(pb, icc_profile, icc_profile_size);
2077 avio_wb32(pb, 0); /* size */
2078 ffio_wfourcc(pb, "colr");
2080 ffio_wfourcc(pb, "nclx");
2082 ffio_wfourcc(pb, "nclc");
2086 avio_wb16(pb, track->par->color_primaries);
2087 avio_wb16(pb, track->par->color_trc);
2088 avio_wb16(pb, track->par->color_space);
2091 avio_w8(pb, full_range << 7);
2094 return update_size(pb, pos);
2098 static int mov_write_cuvv_tag(AVIOContext *pb, CuvaConfig *cuva)
2100 int64_t pos = avio_tell(pb);
2101 avio_wb32(pb, 0); /* size */
2102 ffio_wfourcc(pb, "cuvv");
2103 avio_wb16(pb, cuva->cuva_version_map);
2104 avio_wb16(pb, cuva->terminal_provide_code);
2105 avio_wb16(pb, cuva->terminal_provide_oriented_code);
2106 avio_wb32(pb, 0); // reserved
2107 avio_wb32(pb, 0); // reserved
2108 avio_wb32(pb, 0); // reserved
2109 avio_wb32(pb, 0); // reserved
2110 return update_size(pb, pos);
2114 static int mov_write_clli_tag(AVIOContext *pb, MOVTrack *track)
2125 avio_wb32(pb, 12); // size
2126 ffio_wfourcc(pb, "clli");
2127 avio_wb16(pb, content_light_metadata->MaxCLL);
2128 avio_wb16(pb, content_light_metadata->MaxFALL);
2137 static int mov_write_mdcv_tag(AVIOContext *pb, MOVTrack *track)
2150 avio_wb32(pb, 32); // size
2151 ffio_wfourcc(pb, "mdcv");
2152 avio_wb16(pb, rescale_mdcv(metadata->display_primaries[1][0], chroma_den));
2153 avio_wb16(pb, rescale_mdcv(metadata->display_primaries[1][1], chroma_den));
2154 avio_wb16(pb, rescale_mdcv(metadata->display_primaries[2][0], chroma_den));
2155 avio_wb16(pb, rescale_mdcv(metadata->display_primaries[2][1], chroma_den));
2156 avio_wb16(pb, rescale_mdcv(metadata->display_primaries[0][0], chroma_den));
2157 avio_wb16(pb, rescale_mdcv(metadata->display_primaries[0][1], chroma_den));
2158 avio_wb16(pb, rescale_mdcv(metadata->white_point[0], chroma_den));
2159 avio_wb16(pb, rescale_mdcv(metadata->white_point[1], chroma_den));
2160 avio_wb32(pb, rescale_mdcv(metadata->max_luminance, luma_den));
2161 avio_wb32(pb, rescale_mdcv(metadata->min_luminance, luma_den));
2195 static int mov_write_ccst_tag(AVIOContext *pb)
2197 int64_t pos = avio_tell(pb);
2206 avio_wb32(pb, 0); /* size */
2207 ffio_wfourcc(pb, "ccst");
2208 avio_wb32(pb, 0); /* Version & flags */
2209 avio_w8(pb, ccstValue);
2210 avio_wb24(pb, 0); /* reserved */
2211 return update_size(pb, pos);
2250 static int mov_write_metadata_setup_tag(AVFormatContext *s, AVIOContext *pb, MOVMuxContext *mov, MOVTrack *track)
2252 int64_t pos = avio_tell(pb);
2253 avio_wb32(pb, 0); /* size */
2254 ffio_wfourcc(pb, "setu");
2258 avio_write(pb, key_val->value, key_len);
2260 return update_size(pb, pos);
2263 static int mov_write_metadata_locale_tag(AVFormatContext *s, AVIOContext *pb, MOVMuxContext *mov, MOVTrack *track)
2265 int64_t pos = avio_tell(pb);
2266 avio_wb32(pb, 0); /* size */
2267 ffio_wfourcc(pb, "loca");
2271 avio_write(pb, key_val->value, key_len);
2273 return update_size(pb, pos);
2276 static int mov_write_metadata_keyd_tag(AVFormatContext *s, AVIOContext *pb, MOVMuxContext *mov, const char *metadata)
2278 int64_t pos = avio_tell(pb);
2279 avio_wb32(pb, 0); /* size */
2280 ffio_wfourcc(pb, "keyd");
2282 ffio_wfourcc(pb, "mdta");
2283 avio_write(pb, metadata, key_len);
2284 return update_size(pb, pos);
2287 static int mov_write_metadata_keys_tag(AVFormatContext *s, AVIOContext *pb, MOVMuxContext *mov, MOVTrack *track)
2291 avio_wb32(pb, 0); /* Reserved */
2292 avio_wb16(pb, 0); /* Reserved */
2293 avio_wb16(pb, 1); /* Data-reference index */
2294 int64_t pos = avio_tell(pb);
2295 avio_wb32(pb, 0); /* size */
2296 ffio_wfourcc(pb, "keys");
2305 int64_t entry_pos = avio_tell(pb);
2306 avio_wb32(pb, 0); /* size */
2307 avio_wb32(pb, count + 1); /* local key id, 0 and 0xFFFFFFFF reserved */
2308 ret = mov_write_metadata_keyd_tag(s, pb, mov, t->value);
2311 update_size(pb, entry_pos);
2316 return update_size(pb, pos);
2319 static int mov_write_mebx_tag(AVFormatContext *s, AVIOContext *pb, MOVMuxContext *mov, MOVTrack *track)
2322 int64_t pos = avio_tell(pb);
2323 avio_wb32(pb, 0); /* size */
2324 ffio_wfourcc(pb, "mebx");
2325 ret = mov_write_metadata_keys_tag(s, pb, mov, track);
2329 return update_size(pb, pos);
2333 static int mov_write_video_tag(AVFormatContext *s, AVIOContext *pb, MOVMuxContext *mov, MOVTrack *track)
2336 int64_t pos = avio_tell(pb);
2347 avio_wb32(pb, 0); /* size */
2349 ffio_wfourcc(pb, "encv");
2351 avio_wl32(pb, track->tag); // store it byteswapped
2353 avio_wb32(pb, 0); /* Reserved */
2354 avio_wb16(pb, 0); /* Reserved */
2355 avio_wb16(pb, 1); /* Data-reference index */
2358 avio_wb16(pb, 2); /* Codec stream version */
2360 avio_wb16(pb, 0); /* Codec stream version */
2362 avio_wb16(pb, 0); /* Codec stream revision (=0) */
2364 ffio_wfourcc(pb, "FFMP"); /* Vendor */
2366 avio_wb32(pb, 0); /* Temporal Quality */
2367 avio_wb32(pb, 0x400); /* Spatial Quality = lossless*/
2369 avio_wb32(pb, 0x200); /* Temporal Quality = normal */
2370 avio_wb32(pb, 0x200); /* Spatial Quality = normal */
2373 ffio_fill(pb, 0, 3 * 4); /* Reserved */
2375 avio_wb16(pb, track->par->width); /* Video width */
2376 avio_wb16(pb, track->height); /* Video height */
2377 avio_wb32(pb, 0x00480000); /* Horizontal resolution 72dpi */
2378 avio_wb32(pb, 0x00480000); /* Vertical resolution 72dpi */
2379 avio_wb32(pb, 0); /* Data size (= 0) */
2380 avio_wb16(pb, 1); /* Frame count (= 1) */
2390 avio_w8(pb, strlen(compressor_name));
2391 avio_write(pb, compressor_name, 31);
2395 avio_wb16(pb, 0x18);
2397 avio_wb16(pb, track->par->bits_per_coded_sample |
2400 avio_wb16(pb, 0x18); /* Reserved */
2404 avio_wb16(pb, 0); /* Color table ID */
2405 avio_wb32(pb, 0); /* Color table seed */
2406 avio_wb16(pb, 0x8000); /* Color table flags */
2410 avio_wb16(pb, pal_size - 1); /* Color table size (zero-relative) */
2416 avio_wb16(pb, 0);
2417 avio_wb16(pb, (r << 8) | r);
2418 avio_wb16(pb, (g << 8) | g);
2419 avio_wb16(pb, (b << 8) | b);
2422 avio_wb16(pb, 0xffff); /* Reserved */
2425 mov_write_esds_tag(pb, track);
2427 mov_write_d263_tag(pb);
2430 mov_write_extradata_tag(pb, track);
2431 avio_wb32(pb, 0);
2433 mov_write_avid_tag(pb, track);
2436 mov_write_hvcc_tag(pb, track);
2438 mov_write_avcc_tag(pb, track);
2440 mov_write_uuid_tag_ipod(pb);
2442 mov_write_vpcc_tag(mov->fc, pb, track);
2444 mov_write_av1c_tag(pb, track);
2446 mov_write_dvc1_tag(pb, track);
2453 mov_write_dpxe_tag(pb, track);
2455 mov_write_glbl_tag(pb, track);
2463 mov_write_fiel_tag(pb, track, field_order);
2468 mov_write_gama_tag(s, pb, track, mov->gamma);
2479 mov_write_colr_tag(pb, track, prefer_icc);
2485 mov_write_clli_tag(pb, track);
2486 mov_write_mdcv_tag(pb, track);
2496 mov_write_st3d_tag(s, pb, stereo_3d);
2498 mov_write_sv3d_tag(mov->fc, pb, spherical_mapping);
2500 mov_write_dvcc_dvvc_tag(s, pb, dovi);
2504 mov_write_pasp_tag(pb, track);
2508 mov_write_clap_tag(pb, track);
2512 ff_mov_cenc_write_sinf_tag(track, pb, mov->encryption_kid);
2517 mov_write_cuvv_tag(pb, &cuva);
2522 ((ret = mov_write_btrt_tag(pb, track)) < 0))
2528 avio_wb32(pb, 0);
2531 mov_write_ccst_tag(pb);
2533 return update_size(pb, pos);
2536 static int mov_write_rtp_tag(AVIOContext *pb, MOVTrack *track)
2538 int64_t pos = avio_tell(pb);
2539 avio_wb32(pb, 0); /* size */
2540 ffio_wfourcc(pb, "rtp ");
2541 avio_wb32(pb, 0); /* Reserved */
2542 avio_wb16(pb, 0); /* Reserved */
2543 avio_wb16(pb, 1); /* Data-reference index */
2545 avio_wb16(pb, 1); /* Hint track version */
2546 avio_wb16(pb, 1); /* Highest compatible version */
2547 avio_wb32(pb, track->max_packet_size); /* Max packet size */
2549 avio_wb32(pb, 12); /* size */
2550 ffio_wfourcc(pb, "tims");
2551 avio_wb32(pb, track->timescale);
2553 return update_size(pb, pos);
2556 static int mov_write_source_reference_tag(AVIOContext *pb, MOVTrack *track, const char *reel_name)
2559 int64_t pos = avio_tell(pb);
2563 avio_wb16(pb, 0);
2567 avio_wb32(pb, 0); /* size */
2568 ffio_wfourcc(pb, "name"); /* Data format */
2569 avio_wb16(pb, str_size); /* string size */
2570 avio_wb16(pb, track->language); /* langcode */
2571 avio_write(pb, reel_name, str_size); /* reel name */
2572 return update_size(pb,pos);
2575 static int mov_write_tmcd_tag(AVIOContext *pb, MOVTrack *track)
2577 int64_t pos = avio_tell(pb);
2596 avio_wb32(pb, 0); /* size */
2597 ffio_wfourcc(pb, "tmcd"); /* Data format */
2598 avio_wb32(pb, 0); /* Reserved */
2599 avio_wb32(pb, 1); /* Data reference index */
2600 avio_wb32(pb, 0); /* Flags */
2601 avio_wb32(pb, track->timecode_flags); /* Flags (timecode) */
2602 avio_wb32(pb, track->timescale); /* Timescale */
2603 avio_wb32(pb, frame_duration); /* Frame duration */
2604 avio_w8(pb, nb_frames); /* Number of frames */
2605 avio_w8(pb, 0); /* Reserved */
2609 mov_write_source_reference_tag(pb, track, t->value);
2611 avio_wb16(pb, 0); /* zero size */
2614 avio_wb32(pb, 0); /* size */
2615 ffio_wfourcc(pb, "tmcd"); /* Data format */
2616 avio_wb32(pb, 0); /* Reserved */
2617 avio_wb32(pb, 1); /* Data reference index */
2619 avio_write(pb, track->par->extradata, track->par->extradata_size);
2621 return update_size(pb, pos);
2624 static int mov_write_gpmd_tag(AVIOContext *pb, const MOVTrack *track)
2626 int64_t pos = avio_tell(pb);
2627 avio_wb32(pb, 0); /* size */
2628 ffio_wfourcc(pb, "gpmd");
2629 avio_wb32(pb, 0); /* Reserved */
2630 avio_wb16(pb, 0); /* Reserved */
2631 avio_wb16(pb, 1); /* Data-reference index */
2632 avio_wb32(pb, 0); /* Reserved */
2633 return update_size(pb, pos);
2636 static int mov_write_stsd_tag(AVFormatContext *s, AVIOContext *pb, MOVMuxContext *mov, MOVTrack *track)
2638 int64_t pos = avio_tell(pb);
2640 avio_wb32(pb, 0); /* size */
2641 ffio_wfourcc(pb, "stsd");
2642 avio_wb32(pb, 0); /* version & flags */
2643 avio_wb32(pb, 1); /* entry count */
2645 ret = mov_write_video_tag(s, pb, mov, track);
2647 ret = mov_write_audio_tag(s, pb, mov, track);
2649 ret = mov_write_subtitle_tag(s, pb, track);
2651 ret = mov_write_rtp_tag(pb, track);
2653 ret = mov_write_tmcd_tag(pb, track);
2655 ret = mov_write_gpmd_tag(pb, track);
2658 ret = mov_write_mebx_tag(s, pb, mov, track);
2664 return update_size(pb, pos);
2667 static int mov_write_ctts_tag(AVFormatContext *s, AVIOContext *pb, MOVTrack *track)
2691 avio_wb32(pb, atom_size); /* size */
2692 ffio_wfourcc(pb, "ctts");
2694 avio_w8(pb, 1); /* version */
2696 avio_w8(pb, 0); /* version */
2697 avio_wb24(pb, 0); /* flags */
2698 avio_wb32(pb, entries); /* entry count */
2700 avio_wb32(pb, ctts_entries[i].count);
2701 avio_wb32(pb, ctts_entries[i].duration);
2708 static int mov_write_stts_tag(AVIOContext *pb, MOVTrack *track)
2741 avio_wb32(pb, atom_size); /* size */
2742 ffio_wfourcc(pb, "stts");
2743 avio_wb32(pb, 0); /* version & flags */
2744 avio_wb32(pb, entries); /* entry count */
2746 avio_wb32(pb, stts_entries[i].count);
2747 avio_wb32(pb, stts_entries[i].duration);
2753 static int mov_write_dref_tag(AVIOContext *pb)
2755 avio_wb32(pb, 28); /* size */
2756 ffio_wfourcc(pb, "dref");
2757 avio_wb32(pb, 0); /* version & flags */
2758 avio_wb32(pb, 1); /* entry count */
2760 avio_wb32(pb, 0xc); /* size */
2762 ffio_wfourcc(pb, "url ");
2763 avio_wb32(pb, 1); /* version & flags */
2768 static int mov_preroll_write_stbl_atoms(AVIOContext *pb, MOVTrack *track)
2836 avio_wb32(pb, 24 + (group * 2)); /* size */
2837 ffio_wfourcc(pb, "sgpd");
2838 avio_wb32(pb, 1 << 24); /* fullbox */
2839 ffio_wfourcc(pb, "roll");
2840 avio_wb32(pb, 2); /* default_length */
2841 avio_wb32(pb, group); /* entry_count */
2844 avio_wb16(pb, -sgpd_entries[i].roll_distance); /* roll_distance */
2849 avio_wb32(pb, 20 + (entries * 8)); /* size */
2850 ffio_wfourcc(pb, "sbgp");
2851 avio_wb32(pb, 0); /* fullbox */
2852 ffio_wfourcc(pb, "roll");
2853 avio_wb32(pb, entries); /* entry_count */
2855 avio_wb32(pb, sgpd_entries[i].count); /* sample_count */
2856 avio_wb32(pb, sgpd_entries[i].group_description_index); /* group_description_index */
2863 static int mov_write_stbl_tag(AVFormatContext *s, AVIOContext *pb, MOVMuxContext *mov, MOVTrack *track)
2865 int64_t pos = avio_tell(pb);
2868 avio_wb32(pb, 0); /* size */
2869 ffio_wfourcc(pb, "stbl");
2870 if ((ret = mov_write_stsd_tag(s, pb, mov, track)) < 0)
2872 mov_write_stts_tag(pb, track);
2883 mov_write_stss_tag(pb, track, MOV_SYNC_SAMPLE);
2885 mov_write_sdtp_tag(pb, track);
2887 mov_write_stss_tag(pb, track, MOV_PARTIAL_SYNC_SAMPLE);
2891 if ((ret = mov_write_ctts_tag(s, pb, track)) < 0)
2894 mov_write_stsc_tag(pb, track);
2895 mov_write_stsz_tag(pb, track);
2896 mov_write_stco_tag(pb, track);
2898 ff_mov_cenc_write_stbl_atoms(&track->cenc, pb);
2901 mov_preroll_write_stbl_atoms(pb, track);
2903 return update_size(pb, pos);
2906 static int mov_write_dinf_tag(AVIOContext *pb)
2908 int64_t pos = avio_tell(pb);
2909 avio_wb32(pb, 0); /* size */
2910 ffio_wfourcc(pb, "dinf");
2911 mov_write_dref_tag(pb);
2912 return update_size(pb, pos);
2915 static int mov_write_nmhd_tag(AVIOContext *pb)
2917 avio_wb32(pb, 12);
2918 ffio_wfourcc(pb, "nmhd");
2919 avio_wb32(pb, 0);
2923 static int mov_write_sthd_tag(AVIOContext *pb)
2925 avio_wb32(pb, 12);
2926 ffio_wfourcc(pb, "sthd");
2927 avio_wb32(pb, 0);
2931 static int mov_write_tcmi_tag(AVIOContext *pb, MOVTrack *track)
2933 int64_t pos = avio_tell(pb);
2935 avio_wb32(pb, 0); /* size */
2936 ffio_wfourcc(pb, "tcmi"); /* timecode media information atom */
2937 avio_wb32(pb, 0); /* version & flags */
2938 avio_wb16(pb, 0); /* text font */
2939 avio_wb16(pb, 0); /* text face */
2940 avio_wb16(pb, 12); /* text size */
2941 avio_wb16(pb, 0); /* (unknown, not in the QT specs...) */
2942 avio_wb16(pb, 0x0000); /* text color (red) */
2943 avio_wb16(pb, 0x0000); /* text color (green) */
2944 avio_wb16(pb, 0x0000); /* text color (blue) */
2945 avio_wb16(pb, 0xffff); /* background color (red) */
2946 avio_wb16(pb, 0xffff); /* background color (green) */
2947 avio_wb16(pb, 0xffff); /* background color (blue) */
2948 avio_w8(pb, strlen(font)); /* font len (part of the pascal string) */
2949 avio_write(pb, font, strlen(font)); /* font name */
2950 return update_size(pb, pos);
2953 static int mov_write_gmhd_tag(AVIOContext *pb, MOVTrack *track)
2955 int64_t pos = avio_tell(pb);
2956 avio_wb32(pb, 0); /* size */
2957 ffio_wfourcc(pb, "gmhd");
2958 avio_wb32(pb, 0x18); /* gmin size */
2959 ffio_wfourcc(pb, "gmin");/* generic media info */
2960 avio_wb32(pb, 0); /* version & flags */
2961 avio_wb16(pb, 0x40); /* graphics mode = */
2962 avio_wb16(pb, 0x8000); /* opColor (r?) */
2963 avio_wb16(pb, 0x8000); /* opColor (g?) */
2964 avio_wb16(pb, 0x8000); /* opColor (b?) */
2965 avio_wb16(pb, 0); /* balance */
2966 avio_wb16(pb, 0); /* reserved */
2975 avio_wb32(pb, 0x2C); /* size */
2976 ffio_wfourcc(pb, "text");
2977 avio_wb16(pb, 0x01);
2978 avio_wb32(pb, 0x00);
2979 avio_wb32(pb, 0x00);
2980 avio_wb32(pb, 0x00);
2981 avio_wb32(pb, 0x01);
2982 avio_wb32(pb, 0x00);
2983 avio_wb32(pb, 0x00);
2984 avio_wb32(pb, 0x00);
2985 avio_wb32(pb, 0x00004000);
2986 avio_wb16(pb, 0x0000);
2990 int64_t tmcd_pos = avio_tell(pb);
2991 avio_wb32(pb, 0); /* size */
2992 ffio_wfourcc(pb, "tmcd");
2993 mov_write_tcmi_tag(pb, track);
2994 update_size(pb, tmcd_pos);
2996 int64_t gpmd_pos = avio_tell(pb);
2997 avio_wb32(pb, 0); /* size */
2998 ffio_wfourcc(pb, "gpmd");
2999 avio_wb32(pb, 0); /* version */
3000 update_size(pb, gpmd_pos);
3002 return update_size(pb, pos);
3005 static int mov_write_smhd_tag(AVIOContext *pb)
3007 avio_wb32(pb, 16); /* size */
3008 ffio_wfourcc(pb, "smhd");
3009 avio_wb32(pb, 0); /* version & flags */
3010 avio_wb16(pb, 0); /* reserved (balance, normally = 0) */
3011 avio_wb16(pb, 0); /* reserved */
3015 static int mov_write_vmhd_tag(AVIOContext *pb)
3017 avio_wb32(pb, 0x14); /* size (always 0x14) */
3018 ffio_wfourcc(pb, "vmhd");
3019 avio_wb32(pb, 0x01); /* version & flags */
3020 avio_wb64(pb, 0); /* reserved (graphics mode = copy) */
3030 static int mov_write_hdlr_tag(AVFormatContext *s, AVIOContext *pb, MOVTrack *track)
3034 int64_t pos = avio_tell(pb);
3102 avio_wb32(pb, 0); /* size */
3103 ffio_wfourcc(pb, "hdlr");
3104 avio_wb32(pb, 0); /* Version & flags */
3105 avio_write(pb, hdlr, 4); /* handler */
3106 ffio_wfourcc(pb, hdlr_type); /* handler type */
3107 avio_wb32(pb, 0); /* reserved */
3108 avio_wb32(pb, 0); /* reserved */
3109 avio_wb32(pb, 0); /* reserved */
3112 avio_w8(pb, descr_len); /* pascal string */
3113 avio_write(pb, descr, descr_len); /* handler description */
3115 avio_w8(pb, 0); /* c string */
3116 return update_size(pb, pos);
3119 static int mov_write_pitm_tag(AVIOContext *pb, int item_id)
3121 int64_t pos = avio_tell(pb);
3122 avio_wb32(pb, 0); /* size */
3123 ffio_wfourcc(pb, "pitm");
3124 avio_wb32(pb, 0); /* Version & flags */
3125 avio_wb16(pb, item_id); /* item_id */
3126 return update_size(pb, pos);
3129 static int mov_write_iloc_tag(AVIOContext *pb, MOVMuxContext *mov, AVFormatContext *s)
3131 int64_t pos = avio_tell(pb);
3132 avio_wb32(pb, 0); /* size */
3133 ffio_wfourcc(pb, "iloc");
3134 avio_wb32(pb, 0); /* Version & flags */
3135 avio_w8(pb, (4 << 4) + 4); /* offset_size(4) and length_size(4) */
3136 avio_w8(pb, 0); /* base_offset_size(4) and reserved(4) */
3137 avio_wb16(pb, s->nb_streams); /* item_count */
3140 avio_wb16(pb, i + 1); /* item_id */
3141 avio_wb16(pb, 0); /* data_reference_index */
3142 avio_wb16(pb, 1); /* extent_count */
3143 mov->avif_extent_pos[i] = avio_tell(pb);
3144 avio_wb32(pb, 0); /* extent_offset (written later) */
3146 avio_wb32(pb, mov->avif_extent_length[i]); /* extent_length */
3149 return update_size(pb, pos);
3152 static int mov_write_iinf_tag(AVIOContext *pb, MOVMuxContext *mov, AVFormatContext *s)
3154 int64_t iinf_pos = avio_tell(pb);
3155 avio_wb32(pb, 0); /* size */
3156 ffio_wfourcc(pb, "iinf");
3157 avio_wb32(pb, 0); /* Version & flags */
3158 avio_wb16(pb, s->nb_streams); /* entry_count */
3161 int64_t infe_pos = avio_tell(pb);
3162 avio_wb32(pb, 0); /* size */
3163 ffio_wfourcc(pb, "infe");
3164 avio_w8(pb, 0x2); /* Version */
3165 avio_wb24(pb, 0); /* flags */
3166 avio_wb16(pb, i + 1); /* item_id */
3167 avio_wb16(pb, 0); /* item_protection_index */
3168 avio_write(pb, "av01", 4); /* item_type */
3169 avio_write(pb, !i ? "Color\0" : "Alpha\0", 6); /* item_name */
3170 update_size(pb, infe_pos);
3173 return update_size(pb, iinf_pos);
3177 static int mov_write_iref_tag(AVIOContext *pb, MOVMuxContext *mov, AVFormatContext *s)
3180 int64_t iref_pos = avio_tell(pb);
3181 avio_wb32(pb, 0); /* size */
3182 ffio_wfourcc(pb, "iref");
3183 avio_wb32(pb, 0); /* Version & flags */
3185 auxl_pos = avio_tell(pb);
3186 avio_wb32(pb, 0); /* size */
3187 ffio_wfourcc(pb, "auxl");
3188 avio_wb16(pb, 2); /* from_item_ID */
3189 avio_wb16(pb, 1); /* reference_count */
3190 avio_wb16(pb, 1); /* to_item_ID */
3191 update_size(pb, auxl_pos);
3193 return update_size(pb, iref_pos);
3196 static int mov_write_ispe_tag(AVIOContext *pb, MOVMuxContext *mov, AVFormatContext *s,
3199 int64_t pos = avio_tell(pb);
3200 avio_wb32(pb, 0); /* size */
3201 ffio_wfourcc(pb, "ispe");
3202 avio_wb32(pb, 0); /* Version & flags */
3203 avio_wb32(pb, s->streams[stream_index]->codecpar->width); /* image_width */
3204 avio_wb32(pb, s->streams[stream_index]->codecpar->height); /* image_height */
3205 return update_size(pb, pos);
3208 static int mov_write_pixi_tag(AVIOContext *pb, MOVMuxContext *mov, AVFormatContext *s,
3211 int64_t pos = avio_tell(pb);
3214 avio_wb32(pb, 0); /* size */
3215 ffio_wfourcc(pb, "pixi");
3216 avio_wb32(pb, 0); /* Version & flags */
3217 avio_w8(pb, pixdesc->nb_components); /* num_channels */
3219 avio_w8(pb, pixdesc->comp[i].depth); /* bits_per_channel */
3221 return update_size(pb, pos);
3224 static int mov_write_auxC_tag(AVIOContext *pb)
3226 int64_t pos = avio_tell(pb);
3227 avio_wb32(pb, 0); /* size */
3228 ffio_wfourcc(pb, "auxC");
3229 avio_wb32(pb, 0); /* Version & flags */
3230 avio_write(pb, "urn:mpeg:mpegB:cicp:systems:auxiliary:alpha\0", 44);
3231 return update_size(pb, pos);
3234 static int mov_write_ipco_tag(AVIOContext *pb, MOVMuxContext *mov, AVFormatContext *s)
3236 int64_t pos = avio_tell(pb);
3237 avio_wb32(pb, 0); /* size */
3238 ffio_wfourcc(pb, "ipco");
3240 mov_write_ispe_tag(pb, mov, s, i);
3241 mov_write_pixi_tag(pb, mov, s, i);
3242 mov_write_av1c_tag(pb, &mov->tracks[i]);
3244 mov_write_colr_tag(pb, &mov->tracks[0], 0);
3246 mov_write_auxC_tag(pb);
3248 return update_size(pb, pos);
3251 static int mov_write_ipma_tag(AVIOContext *pb, MOVMuxContext *mov, AVFormatContext *s)
3253 int64_t pos = avio_tell(pb);
3254 avio_wb32(pb, 0); /* size */
3255 ffio_wfourcc(pb, "ipma");
3256 avio_wb32(pb, 0); /* Version & flags */
3257 avio_wb32(pb, s->nb_streams); /* entry_count */
3260 avio_wb16(pb, i + 1); /* item_ID */
3261 avio_w8(pb, 4); /* association_count */
3264 avio_w8(pb, index++); /* essential and property_index */
3266 avio_w8(pb, index++); /* essential and property_index */
3268 avio_w8(pb, 0x80 | index++); /* essential and property_index */
3270 avio_w8(pb, index++); /* essential and property_index */
3272 return update_size(pb, pos);
3275 static int mov_write_iprp_tag(AVIOContext *pb, MOVMuxContext *mov, AVFormatContext *s)
3277 int64_t pos = avio_tell(pb);
3278 avio_wb32(pb, 0); /* size */
3279 ffio_wfourcc(pb, "iprp");
3280 mov_write_ipco_tag(pb, mov, s);
3281 mov_write_ipma_tag(pb, mov, s);
3282 return update_size(pb, pos);
3285 static int mov_write_hmhd_tag(AVIOContext *pb)
3289 avio_wb32(pb, 28); /* size */
3290 ffio_wfourcc(pb, "hmhd");
3291 avio_wb32(pb, 0); /* version, flags */
3292 avio_wb16(pb, 0); /* maxPDUsize */
3293 avio_wb16(pb, 0); /* avgPDUsize */
3294 avio_wb32(pb, 0); /* maxbitrate */
3295 avio_wb32(pb, 0); /* avgbitrate */
3296 avio_wb32(pb, 0); /* reserved */
3300 static int mov_write_minf_tag(AVFormatContext *s, AVIOContext *pb, MOVMuxContext *mov, MOVTrack *track)
3302 int64_t pos = avio_tell(pb);
3305 avio_wb32(pb, 0); /* size */
3306 ffio_wfourcc(pb, "minf");
3308 mov_write_vmhd_tag(pb);
3310 mov_write_smhd_tag(pb);
3313 mov_write_gmhd_tag(pb, track);
3315 mov_write_sthd_tag(pb);
3317 mov_write_nmhd_tag(pb);
3320 mov_write_hmhd_tag(pb);
3323 mov_write_nmhd_tag(pb);
3325 mov_write_gmhd_tag(pb, track);
3327 mov_write_gmhd_tag(pb, track);
3330 mov_write_hdlr_tag(s, pb, NULL);
3331 mov_write_dinf_tag(pb);
3332 if ((ret = mov_write_stbl_tag(s, pb, mov, track)) < 0)
3334 return update_size(pb, pos);
3388 static int mov_write_mdhd_tag(AVIOContext *pb, MOVMuxContext *mov,
3397 (version == 1) ? avio_wb32(pb, 44) : avio_wb32(pb, 32); /* size */
3398 ffio_wfourcc(pb, "mdhd");
3399 avio_w8(pb, version);
3400 avio_wb24(pb, 0); /* flags */
3402 avio_wb64(pb, track->time);
3403 avio_wb64(pb, track->time);
3405 avio_wb32(pb, track->time); /* creation time */
3406 avio_wb32(pb, track->time); /* modification time */
3408 avio_wb32(pb, track->timescale); /* time scale (sample rate for audio) */
3410 (version == 1) ? avio_wb64(pb, UINT64_C(0xffffffffffffffff)) : avio_wb32(pb, 0xffffffff);
3412 (version == 1) ? avio_wb64(pb, 0) : avio_wb32(pb, 0);
3414 (version == 1) ? avio_wb64(pb, duration) : avio_wb32(pb, duration); /* duration */
3415 avio_wb16(pb, track->language); /* language */
3416 avio_wb16(pb, 0); /* reserved (quality) */
3428 static int mov_write_mdia_tag(AVFormatContext *s, AVIOContext *pb,
3431 int64_t pos = avio_tell(pb);
3434 avio_wb32(pb, 0); /* size */
3435 ffio_wfourcc(pb, "mdia");
3436 mov_write_mdhd_tag(pb, mov, track);
3437 mov_write_hdlr_tag(s, pb, track);
3438 if ((ret = mov_write_minf_tag(s, pb, mov, track)) < 0)
3440 return update_size(pb, pos);
3447 static void write_matrix(AVIOContext *pb, int16_t a, int16_t b, int16_t c,
3450 avio_wb32(pb, a << 16); /* 16.16 format */
3451 avio_wb32(pb, b << 16); /* 16.16 format */
3452 avio_wb32(pb, 0); /* u in 2.30 format */
3453 avio_wb32(pb, c << 16); /* 16.16 format */
3454 avio_wb32(pb, d << 16); /* 16.16 format */
3455 avio_wb32(pb, 0); /* v in 2.30 format */
3456 avio_wb32(pb, tx << 16); /* 16.16 format */
3457 avio_wb32(pb, ty << 16); /* 16.16 format */
3458 avio_wb32(pb, 1 << 30); /* w in 2.30 format */
3461 static int mov_write_tkhd_tag(AVIOContext *pb, MOVMuxContext *mov,
3493 (version == 1) ? avio_wb32(pb, 104) : avio_wb32(pb, 92); /* size */
3494 ffio_wfourcc(pb, "tkhd");
3495 avio_w8(pb, version);
3496 avio_wb24(pb, flags);
3498 avio_wb64(pb, track->time);
3499 avio_wb64(pb, track->time);
3501 avio_wb32(pb, track->time); /* creation time */
3502 avio_wb32(pb, track->time); /* modification time */
3504 avio_wb32(pb, track->track_id); /* track-id */
3505 avio_wb32(pb, 0); /* reserved */
3507 (version == 1) ? avio_wb64(pb, UINT64_C(0xffffffffffffffff)) : avio_wb32(pb, 0xffffffff);
3509 (version == 1) ? avio_wb64(pb, 0) : avio_wb32(pb, 0);
3511 (version == 1) ? avio_wb64(pb, duration) : avio_wb32(pb, duration);
3513 avio_wb32(pb, 0); /* reserved */
3514 avio_wb32(pb, 0); /* reserved */
3515 avio_wb16(pb, 0); /* layer */
3516 avio_wb16(pb, group); /* alternate group) */
3519 avio_wb16(pb, 0x0100);
3521 avio_wb16(pb, 0);
3522 avio_wb16(pb, 0); /* reserved */
3527 avio_wb32(pb, display_matrix[i]);
3529 write_matrix(pb, 1, 0, 0, 1, 0, 0);
3550 avio_wb32(pb, track_width_1616);
3553 avio_wb32(pb, 0);
3555 avio_wb32(pb, track->height * 0x10000U);
3557 avio_wb32(pb, 0);
3558 avio_wb32(pb, 0);
3563 static int mov_write_tapt_tag(AVIOContext *pb, MOVTrack *track)
3568 int64_t pos = avio_tell(pb);
3570 avio_wb32(pb, 0); /* size */
3571 ffio_wfourcc(pb, "tapt");
3573 avio_wb32(pb, 20);
3574 ffio_wfourcc(pb, "clef");
3575 avio_wb32(pb, 0);
3576 avio_wb32(pb, width << 16);
3577 avio_wb32(pb, track->par->height << 16);
3579 avio_wb32(pb, 20);
3580 ffio_wfourcc(pb, "prof");
3581 avio_wb32(pb, 0);
3582 avio_wb32(pb, width << 16);
3583 avio_wb32(pb, track->par->height << 16);
3585 avio_wb32(pb, 20);
3586 ffio_wfourcc(pb, "enof");
3587 avio_wb32(pb, 0);
3588 avio_wb32(pb, track->par->width << 16);
3589 avio_wb32(pb, track->par->height << 16);
3591 return update_size(pb, pos);
3595 static int mov_write_edts_tag(AVIOContext *pb, MOVMuxContext *mov,
3627 avio_wb32(pb, size);
3628 ffio_wfourcc(pb, "edts");
3629 avio_wb32(pb, size - 8);
3630 ffio_wfourcc(pb, "elst");
3631 avio_w8(pb, version);
3632 avio_wb24(pb, 0); /* flags */
3634 avio_wb32(pb, entry_count);
3642 avio_wb64(pb, delay);
3643 avio_wb64(pb, -1);
3645 avio_wb32(pb, delay);
3646 avio_wb32(pb, -1);
3648 avio_wb32(pb, 0x00010000);
3671 avio_wb64(pb, duration);
3672 avio_wb64(pb, start_ct);
3674 avio_wb32(pb, duration);
3675 avio_wb32(pb, start_ct);
3677 avio_wb32(pb, 0x00010000);
3681 static int mov_write_tref_tag(AVIOContext *pb, MOVTrack *track)
3684 int64_t pos = avio_tell(pb);
3686 avio_wb32(pb, 0);
3687 ffio_wfourcc(pb, "tref");
3688 int64_t pos_cdsc = avio_tell(pb);
3689 avio_wb32(pb, 0);
3690 avio_wl32(pb, track->tref_tag);
3692 avio_wb32(pb, track->tref_ids[tref_index]);
3694 update_size(pb, pos_cdsc);
3695 return update_size(pb, pos);
3697 avio_wb32(pb, 20); // size
3698 ffio_wfourcc(pb, "tref");
3699 avio_wb32(pb, 12); // size (subatom)
3700 avio_wl32(pb, track->tref_tag);
3701 avio_wb32(pb, track->tref_id);
3707 static int mov_write_uuid_tag_psp(AVIOContext *pb, MOVTrack *mov)
3709 avio_wb32(pb, 0x34); /* size ... reports as 28 in mp4box! */
3710 ffio_wfourcc(pb, "uuid");
3711 ffio_wfourcc(pb, "USMT");
3712 avio_wb32(pb, 0x21d24fce);
3713 avio_wb32(pb, 0xbb88695c);
3714 avio_wb32(pb, 0xfac9c740);
3715 avio_wb32(pb, 0x1c); // another size here!
3716 ffio_wfourcc(pb, "MTDT");
3717 avio_wb32(pb, 0x00010012);
3718 avio_wb32(pb, 0x0a);
3719 avio_wb32(pb, 0x55c40000);
3720 avio_wb32(pb, 0x1);
3721 avio_wb32(pb, 0x0);
3725 static int mov_write_udta_sdp(AVIOContext *pb, MOVTrack *track)
3736 avio_wb32(pb, len + 24);
3737 ffio_wfourcc(pb, "udta");
3738 avio_wb32(pb, len + 16);
3739 ffio_wfourcc(pb, "hnti");
3740 avio_wb32(pb, len + 8);
3741 ffio_wfourcc(pb, "sdp ");
3742 avio_write(pb, buf, len);
3746 static int mov_write_track_metadata(AVIOContext *pb, AVStream *st,
3749 int64_t pos = avio_tell(pb);
3754 avio_wb32(pb, 0); /* size */
3755 ffio_wfourcc(pb, tag); /* type */
3756 avio_write(pb, t->value, strlen(t->value)); /* UTF8 string value */
3757 return update_size(pb, pos);
3760 static int mov_write_track_kind(AVIOContext *pb, const char *scheme_uri,
3763 int64_t pos = avio_tell(pb);
3766 avio_wb32(pb, 0); /* size placeholder */
3767 ffio_wfourcc(pb, (const unsigned char *)"kind");
3768 avio_w8(pb, 0); /* version = 0 */
3769 avio_wb24(pb, 0); /* flags = 0 */
3772 avio_write(pb, (const unsigned char *)scheme_uri,
3774 avio_w8(pb, 0);
3778 avio_write(pb, (const unsigned char *)value,
3781 avio_w8(pb, 0);
3783 return update_size(pb, pos);
3786 static int mov_write_track_kinds(AVIOContext *pb, AVStream *st)
3798 if ((ret = mov_write_track_kind(pb, map.scheme_uri, value_map.value)) < 0)
3806 static int mov_write_track_udta_tag(AVIOContext *pb, MOVMuxContext *mov,
3829 avio_wb32(pb, size + 8);
3830 ffio_wfourcc(pb, "udta");
3831 avio_write(pb, buf, size);
3838 static int mov_write_trak_tag(AVFormatContext *s, AVIOContext *pb, MOVMuxContext *mov,
3841 int64_t pos = avio_tell(pb);
3851 avio_wb32(pb, 0); /* size */
3852 ffio_wfourcc(pb, "trak");
3853 mov_write_tkhd_tag(pb, mov, track, st);
3859 mov_write_edts_tag(pb, mov, track); // PSP Movies and several other cases require edts box
3866 mov_write_tref_tag(pb, track);
3868 if ((ret = mov_write_mdia_tag(s, pb, mov, track)) < 0)
3871 mov_write_uuid_tag_psp(pb, track); // PSP Movies require this uuid box
3873 mov_write_udta_sdp(pb, track);
3878 mov_write_tapt_tag(pb, track);
3882 mov_write_tapt_tag(pb, track);
3885 mov_write_track_udta_tag(pb, mov, st);
3888 return update_size(pb, pos);
3891 static int mov_write_iods_tag(AVIOContext *pb, MOVMuxContext *mov)
3894 int64_t pos = avio_tell(pb);
3907 avio_wb32(pb, 0x0); /* size */
3908 ffio_wfourcc(pb, "iods");
3909 avio_wb32(pb, 0); /* version & flags */
3910 put_descr(pb, 0x10, 7);
3911 avio_wb16(pb, 0x004f);
3912 avio_w8(pb, 0xff);
3913 avio_w8(pb, 0xff);
3914 avio_w8(pb, audio_profile);
3915 avio_w8(pb, video_profile);
3916 avio_w8(pb, 0xff);
3917 return update_size(pb, pos);
3920 static int mov_write_trex_tag(AVIOContext *pb, MOVTrack *track)
3922 avio_wb32(pb, 0x20); /* size */
3923 ffio_wfourcc(pb, "trex");
3924 avio_wb32(pb, 0); /* version & flags */
3925 avio_wb32(pb, track->track_id); /* track ID */
3926 avio_wb32(pb, 1); /* default sample description index */
3927 avio_wb32(pb, 0); /* default sample duration */
3928 avio_wb32(pb, 0); /* default sample size */
3929 avio_wb32(pb, 0); /* default sample flags */
3933 static int mov_write_mvex_tag(AVIOContext *pb, MOVMuxContext *mov)
3935 int64_t pos = avio_tell(pb);
3937 avio_wb32(pb, 0x0); /* size */
3938 ffio_wfourcc(pb, "mvex");
3940 mov_write_trex_tag(pb, &mov->tracks[i]);
3941 return update_size(pb, pos);
3944 static int mov_write_mvhd_tag(AVIOContext *pb, MOVMuxContext *mov)
3972 avio_wb32(pb, version == 1 ? 120 : 108); /* size */
3974 ffio_wfourcc(pb, "mvhd");
3975 avio_w8(pb, version);
3976 avio_wb24(pb, 0); /* flags */
3978 avio_wb64(pb, mov->time);
3979 avio_wb64(pb, mov->time);
3981 avio_wb32(pb, mov->time); /* creation time */
3982 avio_wb32(pb, mov->time); /* modification time */
3989 avio_wb32(pb, timescale);
3990 (version == 1) ? avio_wb64(pb, max_track_len) : avio_wb32(pb, max_track_len); /* duration of longest track */
3992 avio_wb32(pb, 0x00010000); /* reserved (preferred rate) 1.0 = normal */
3993 avio_wb16(pb, 0x0100); /* reserved (preferred volume) 1.0 = normal */
3994 ffio_fill(pb, 0, 2 + 2 * 4); /* reserved */
3997 write_matrix(pb, 1, 0, 0, 1, 0, 0);
3999 avio_wb32(pb, 0); /* reserved (preview time) */
4000 avio_wb32(pb, 0); /* reserved (preview duration) */
4001 avio_wb32(pb, 0); /* reserved (poster time) */
4002 avio_wb32(pb, 0); /* reserved (selection time) */
4003 avio_wb32(pb, 0); /* reserved (selection duration) */
4004 avio_wb32(pb, 0); /* reserved (current time) */
4005 avio_wb32(pb, max_track_id + 1); /* Next track id */
4009 static int mov_write_itunes_hdlr_tag(AVIOContext *pb, MOVMuxContext *mov,
4012 avio_wb32(pb, 33); /* size */
4013 ffio_wfourcc(pb, "hdlr");
4014 avio_wb32(pb, 0);
4015 avio_wb32(pb, 0);
4016 ffio_wfourcc(pb, "mdir");
4017 ffio_wfourcc(pb, "appl");
4018 avio_wb32(pb, 0);
4019 avio_wb32(pb, 0);
4020 avio_w8(pb, 0);
4025 static int mov_write_string_data_tag(AVIOContext *pb, const char *data, int lang, int long_style)
4030 avio_wb32(pb, size); /* size */
4031 ffio_wfourcc(pb, "data");
4032 avio_wb32(pb, 1);
4033 avio_wb32(pb, 0);
4034 avio_write(pb, data, data_len);
4037 avio_wb16(pb, data_len); /* string length */
4040 avio_wb16(pb, lang);
4041 avio_write(pb, data, data_len);
4047 static int mov_write_moov_level_meta_data_tag(AVIOContext *pb, const char *data)
4054 avio_wb32(pb, size); /* size */
4055 ffio_wfourcc(pb, "data");
4056 avio_wb32(pb, 1); // string
4057 avio_wb32(pb, 0);
4058 avio_write(pb, data + 8, data_len - 8);
4061 avio_wb32(pb, size); /* size */
4062 ffio_wfourcc(pb, "data");
4063 avio_wb32(pb, 23); // float
4064 avio_wb32(pb, 0);
4065 avio_wb32(pb, av_float2int(atof(data + 8)));
4068 avio_wb32(pb, size); /* size */
4069 ffio_wfourcc(pb, "data");
4070 avio_wb32(pb, 67); // int
4071 avio_wb32(pb, 0);
4072 avio_wb32(pb, atoi(data + 8));
4075 avio_wb32(pb, size); /* size */
4076 ffio_wfourcc(pb, "data");
4077 avio_wb32(pb, 77); // unkown
4078 avio_wb32(pb, 0);
4079 avio_wb32(pb, 0);
4083 avio_wb32(pb, size); /* size */
4084 ffio_wfourcc(pb, "data");
4085 avio_wb32(pb, 1); // default string
4086 avio_wb32(pb, 0);
4087 avio_write(pb, data, data_len);
4093 static int mov_write_string_tag(AVIOContext *pb, const char *name,
4098 int64_t pos = avio_tell(pb);
4099 avio_wb32(pb, 0); /* size */
4100 ffio_wfourcc(pb, name);
4101 mov_write_string_data_tag(pb, value, lang, long_style);
4102 size = update_size(pb, pos);
4132 static int mov_write_string_metadata(AVFormatContext *s, AVIOContext *pb,
4140 return mov_write_string_tag(pb, name, t->value, lang, long_style);
4144 static int mov_write_tmpo_tag(AVIOContext *pb, AVFormatContext *s)
4150 avio_wb32(pb, size);
4151 ffio_wfourcc(pb, "tmpo");
4152 avio_wb32(pb, size-8); /* size */
4153 ffio_wfourcc(pb, "data");
4154 avio_wb32(pb, 0x15); //type specifier
4155 avio_wb32(pb, 0);
4156 avio_wb16(pb, tmpo); // data
4162 static int mov_write_loci_tag(AVFormatContext *s, AVIOContext *pb)
4165 int64_t pos = avio_tell(pb);
4197 avio_wb32(pb, 0); /* size */
4198 ffio_wfourcc(pb, "loci"); /* type */
4199 avio_wb32(pb, 0); /* version + flags */
4200 avio_wb16(pb, lang);
4201 avio_write(pb, place, strlen(place) + 1);
4202 avio_w8(pb, 0); /* role of place (0 == shooting location, 1 == real location, 2 == fictional location) */
4205 avio_wb32(pb, longitude_fix);
4206 avio_wb32(pb, latitude_fix);
4208 avio_wb32(pb, latitude_fix);
4209 avio_wb32(pb, longitude_fix);
4211 avio_wb32(pb, altitude_fix);
4212 avio_write(pb, astronomical_body, strlen(astronomical_body) + 1);
4213 avio_w8(pb, 0); /* additional notes, null terminated string */
4215 return update_size(pb, pos);
4219 static int mov_write_geo_tag(AVFormatContext *s, AVIOContext *pb)
4222 int64_t pos = avio_tell(pb);
4289 avio_wb32(pb, 0); /* size */
4290 ffio_wfourcc(pb, "\xA9xyz"); /* type */
4291 avio_wb32(pb, 0x001215c7);
4292 avio_write(pb, latitude_str, 8);
4293 avio_write(pb, longitude_str, 9);
4294 avio_w8(pb, 0x2F);
4295 return update_size(pb, pos);
4298 static int mov_write_gnre_tag(AVIOContext* pb, MOVMuxContext* mov, AVFormatContext* s)
4300 int64_t pos = avio_tell(pb);
4303 avio_wb32(pb, 0); /* size */
4304 ffio_wfourcc(pb, "gnre");
4305 avio_wb32(pb, 0);
4306 avio_wb16(pb, 0);
4307 avio_write(pb, t->value, strlen(t->value) + 1);
4308 avio_wb32(pb, 0);
4309 avio_wb32(pb, 0);
4311 return update_size(pb, pos);
4316 static int mov_write_trkn_tag(AVIOContext *pb, MOVMuxContext *mov,
4328 avio_wb32(pb, 32); /* size */
4329 ffio_wfourcc(pb, disc ? "disk" : "trkn");
4330 avio_wb32(pb, 24); /* size */
4331 ffio_wfourcc(pb, "data");
4332 avio_wb32(pb, 0); // 8 bytes empty
4333 avio_wb32(pb, 0);
4334 avio_wb16(pb, 0); // empty
4335 avio_wb16(pb, track); // track / disc number
4336 avio_wb16(pb, tracks); // total track / disc number
4337 avio_wb16(pb, 0); // empty
4343 static int mov_write_int8_metadata(AVFormatContext *s, AVIOContext *pb,
4358 avio_wb32(pb, size);
4359 ffio_wfourcc(pb, name);
4360 avio_wb32(pb, size - 8);
4361 ffio_wfourcc(pb, "data");
4362 avio_wb32(pb, 0x15);
4363 avio_wb32(pb, 0);
4364 if (len==4) avio_wb32(pb, num);
4365 else avio_w8 (pb, num);
4370 static int mov_write_covr(AVIOContext *pb, AVFormatContext *s)
4383 pos = avio_tell(pb);
4384 avio_wb32(pb, 0);
4385 ffio_wfourcc(pb, "covr");
4387 avio_wb32(pb, 16 + trk->cover_image->size);
4388 ffio_wfourcc(pb, "data");
4389 avio_wb32(pb, trk->tag);
4390 avio_wb32(pb , 0);
4391 avio_write(pb, trk->cover_image->data, trk->cover_image->size);
4394 return pos ? update_size(pb, pos) : 0;
4398 static int mov_write_ilst_tag(AVIOContext *pb, MOVMuxContext *mov,
4401 int64_t pos = avio_tell(pb);
4402 avio_wb32(pb, 0); /* size */
4403 ffio_wfourcc(pb, "ilst");
4404 mov_write_string_metadata(s, pb, "\251nam", "title" , 1);
4405 mov_write_string_metadata(s, pb, "\251ART", "artist" , 1);
4406 mov_write_string_metadata(s, pb, "aART", "album_artist", 1);
4407 mov_write_string_metadata(s, pb, "\251wrt", "composer" , 1);
4408 mov_write_string_metadata(s, pb, "\251alb", "album" , 1);
4409 mov_write_string_metadata(s, pb, "\251day", "date" , 1);
4410 if (!mov_write_string_metadata(s, pb, "\251too", "encoding_tool", 1)) {
4412 mov_write_string_tag(pb, "\251too", LIBAVFORMAT_IDENT, 0, 1);
4414 mov_write_string_metadata(s, pb, "\251cmt", "comment" , 1);
4415 mov_write_string_metadata(s, pb, "\251gen", "genre" , 1);
4416 mov_write_string_metadata(s, pb, "cprt", "copyright", 1);
4417 mov_write_string_metadata(s, pb, "\251grp", "grouping" , 1);
4418 mov_write_string_metadata(s, pb, "\251lyr", "lyrics" , 1);
4419 mov_write_string_metadata(s, pb, "desc", "description",1);
4420 mov_write_string_metadata(s, pb, "ldes", "synopsis" , 1);
4421 mov_write_string_metadata(s, pb, "tvsh", "show" , 1);
4422 mov_write_string_metadata(s, pb, "tven", "episode_id",1);
4423 mov_write_string_metadata(s, pb, "tvnn", "network" , 1);
4424 mov_write_string_metadata(s, pb, "keyw", "keywords" , 1);
4425 mov_write_int8_metadata (s, pb, "tves", "episode_sort",4);
4426 mov_write_int8_metadata (s, pb, "tvsn", "season_number",4);
4427 mov_write_int8_metadata (s, pb, "stik", "media_type",1);
4428 mov_write_int8_metadata (s, pb, "hdvd", "hd_video", 1);
4429 mov_write_int8_metadata (s, pb, "pgap", "gapless_playback",1);
4430 mov_write_int8_metadata (s, pb, "cpil", "compilation", 1);
4431 mov_write_covr(pb, s);
4432 mov_write_trkn_tag(pb, mov, s, 0); // track number
4433 mov_write_trkn_tag(pb, mov, s, 1); // disc number
4434 mov_write_tmpo_tag(pb, s);
4435 return update_size(pb, pos);
4438 static int mov_write_mdta_hdlr_tag(AVIOContext *pb, MOVMuxContext *mov,
4441 avio_wb32(pb, 33); /* size */
4442 ffio_wfourcc(pb, "hdlr");
4443 avio_wb32(pb, 0);
4444 avio_wb32(pb, 0);
4445 ffio_wfourcc(pb, "mdta");
4446 avio_wb32(pb, 0);
4447 avio_wb32(pb, 0);
4448 avio_wb32(pb, 0);
4449 avio_w8(pb, 0);
4453 static int mov_write_mdta_keys_tag(AVIOContext *pb, MOVMuxContext *mov,
4457 int64_t pos = avio_tell(pb);
4461 avio_wb32(pb, 0); /* size */
4462 ffio_wfourcc(pb, "keys");
4463 avio_wb32(pb, 0);
4464 entry_pos = avio_tell(pb);
4465 avio_wb32(pb, 0); /* entry count */
4469 avio_wb32(pb, key_len + 8);
4470 ffio_wfourcc(pb, "mdta");
4471 avio_write(pb, t->key, key_len);
4474 curpos = avio_tell(pb);
4475 avio_seek(pb, entry_pos, SEEK_SET);
4476 avio_wb32(pb, count); // rewrite entry count
4477 avio_seek(pb, curpos, SEEK_SET);
4479 return update_size(pb, pos);
4482 static int mov_write_mdta_ilst_tag(AVIOContext *pb, MOVMuxContext *mov,
4486 int64_t pos = avio_tell(pb);
4489 avio_wb32(pb, 0); /* size */
4490 ffio_wfourcc(pb, "ilst");
4493 int64_t entry_pos = avio_tell(pb);
4494 avio_wb32(pb, 0); /* size */
4495 avio_wb32(pb, count); /* key */
4496 mov_write_string_data_tag(pb, t->value, 0, 1);
4497 update_size(pb, entry_pos);
4500 return update_size(pb, pos);
4504 static int mov_write_meta_tag(AVIOContext *pb, MOVMuxContext *mov,
4508 int64_t pos = avio_tell(pb);
4509 avio_wb32(pb, 0); /* size */
4510 ffio_wfourcc(pb, "meta");
4511 avio_wb32(pb, 0);
4513 mov_write_mdta_hdlr_tag(pb, mov, s);
4514 mov_write_mdta_keys_tag(pb, mov, s);
4515 mov_write_mdta_ilst_tag(pb, mov, s);
4517 mov_write_hdlr_tag(s, pb, &mov->tracks[0]);
4520 mov_write_pitm_tag(pb, 1);
4521 mov_write_iloc_tag(pb, mov, s);
4522 mov_write_iinf_tag(pb, mov, s);
4524 mov_write_iref_tag(pb, mov, s);
4525 mov_write_iprp_tag(pb, mov, s);
4528 mov_write_itunes_hdlr_tag(pb, mov, s);
4529 mov_write_ilst_tag(pb, mov, s);
4531 size = update_size(pb, pos);
4536 static int mov_write_moov_level_meta_mdta_keys_tag(AVIOContext *pb, MOVMuxContext *mov,
4540 int64_t pos = avio_tell(pb);
4544 avio_wb32(pb, 0); /* size */
4545 ffio_wfourcc(pb, "keys");
4546 avio_wb32(pb, 0);
4547 entry_pos = avio_tell(pb);
4548 avio_wb32(pb, 0); /* entry count */
4555 avio_wb32(pb, key_len + 8 - key_tag_len);
4556 ffio_wfourcc(pb, "mdta");
4557 avio_write(pb, t->key + key_tag_len, key_len - key_tag_len);
4561 curpos = avio_tell(pb);
4562 avio_seek(pb, entry_pos, SEEK_SET);
4563 avio_wb32(pb, count); // rewrite entry count
4564 avio_seek(pb, curpos, SEEK_SET);
4566 return update_size(pb, pos);
4569 static int mov_write_moov_level_meta_mdta_ilst_tag(AVIOContext *pb, MOVMuxContext *mov,
4573 int64_t pos = avio_tell(pb);
4576 avio_wb32(pb, 0); /* size */
4577 ffio_wfourcc(pb, "ilst");
4584 int64_t entry_pos = avio_tell(pb);
4585 avio_wb32(pb, 0); /* size */
4586 avio_wb32(pb, count); /* key */
4587 mov_write_moov_level_meta_data_tag(pb, t->value);
4588 update_size(pb, entry_pos);
4592 return update_size(pb, pos);
4595 static int mov_write_moov_level_meta_tag(AVIOContext *pb, MOVMuxContext *mov,
4599 int64_t pos = avio_tell(pb);
4600 avio_wb32(pb, 0); /* size */
4601 ffio_wfourcc(pb, "meta");
4602 avio_wb32(pb, 0);
4603 mov_write_mdta_hdlr_tag(pb, mov, s);
4604 mov_write_moov_level_meta_mdta_keys_tag(pb, mov, s);
4605 mov_write_moov_level_meta_mdta_ilst_tag(pb, mov, s);
4606 size = update_size(pb, pos);
4611 static int mov_write_raw_metadata_tag(AVFormatContext *s, AVIOContext *pb,
4623 avio_wb32(pb, size);
4624 ffio_wfourcc(pb, name);
4625 avio_write(pb, t->value, len);
4631 static int ascii_to_wc(AVIOContext *pb, const uint8_t *b)
4636 avio_wb16(pb, val);
4638 avio_wb16(pb, 0x00);
4649 static int mov_write_3gp_udta_tag(AVIOContext *pb, AVFormatContext *s,
4652 int64_t pos = avio_tell(pb);
4656 avio_wb32(pb, 0); /* size */
4657 ffio_wfourcc(pb, tag); /* type */
4658 avio_wb32(pb, 0); /* version + flags */
4660 avio_wb16(pb, atoi(t->value));
4662 avio_wb16(pb, language_code("eng")); /* language */
4663 avio_write(pb, t->value, strlen(t->value) + 1); /* UTF8 string value */
4666 avio_w8(pb, atoi(t->value));
4668 return update_size(pb, pos);
4671 static int mov_write_chpl_tag(AVIOContext *pb, AVFormatContext *s)
4673 int64_t pos = avio_tell(pb);
4676 avio_wb32(pb, 0); // size
4677 ffio_wfourcc(pb, "chpl");
4678 avio_wb32(pb, 0x01000000); // version + flags
4679 avio_wb32(pb, 0); // unknown
4680 avio_w8(pb, nb_chapters);
4685 avio_wb64(pb, av_rescale_q(c->start, c->time_base, (AVRational){1,10000000}));
4689 avio_w8(pb, len);
4690 avio_write(pb, t->value, len);
4692 avio_w8(pb, 0);
4694 return update_size(pb, pos);
4697 static int mov_write_udta_tag(AVIOContext *pb, MOVMuxContext *mov,
4751 avio_wb32(pb, size + 8);
4752 ffio_wfourcc(pb, "udta");
4753 avio_write(pb, buf, size);
4760 static void mov_write_psp_udta_tag(AVIOContext *pb,
4766 avio_wb16(pb, len * 2 + 10); /* size */
4767 avio_wb32(pb, type); /* type */
4768 avio_wb16(pb, language_code(lang)); /* language */
4769 avio_wb16(pb, 0x01); /* ? */
4770 ascii_to_wc(pb, str);
4773 static int mov_write_uuidusmt_tag(AVIOContext *pb, AVFormatContext *s)
4779 pos = avio_tell(pb);
4780 avio_wb32(pb, 0); /* size placeholder*/
4781 ffio_wfourcc(pb, "uuid");
4782 ffio_wfourcc(pb, "USMT");
4783 avio_wb32(pb, 0x21d24fce); /* 96 bit UUID */
4784 avio_wb32(pb, 0xbb88695c);
4785 avio_wb32(pb, 0xfac9c740);
4787 pos2 = avio_tell(pb);
4788 avio_wb32(pb, 0); /* size placeholder*/
4789 ffio_wfourcc(pb, "MTDT");
4790 avio_wb16(pb, 4);
4793 avio_wb16(pb, 0x0C); /* size */
4794 avio_wb32(pb, 0x0B); /* type */
4795 avio_wb16(pb, language_code("und")); /* language */
4796 avio_wb16(pb, 0x0); /* ? */
4797 avio_wb16(pb, 0x021C); /* data */
4800 mov_write_psp_udta_tag(pb, LIBAVFORMAT_IDENT, "eng", 0x04);
4801 mov_write_psp_udta_tag(pb, title->value, "eng", 0x01);
4802 mov_write_psp_udta_tag(pb, "2006/04/01 11:11:11", "und", 0x03);
4804 update_size(pb, pos2);
4805 return update_size(pb, pos);
4880 static int mov_write_moov_tag(AVIOContext *pb, MOVMuxContext *mov,
4884 int64_t pos = avio_tell(pb);
4885 avio_wb32(pb, 0); /* size placeholder*/
4886 ffio_wfourcc(pb, "moov");
4966 mov_write_mvhd_tag(pb, mov);
4968 mov_write_iods_tag(pb, mov);
4972 int ret = mov_write_trak_tag(s, pb, mov, &(mov->tracks[i]), i < s->nb_streams ? s->streams[i] : NULL);
4978 mov_write_mvex_tag(pb, mov); /* QuickTime requires trak to precede this */
4981 mov_write_uuidusmt_tag(pb, s);
4983 mov_write_udta_tag(pb, mov, s);
4987 mov_write_gnre_tag(pb, mov, s);
4988 mov_write_moov_level_meta_tag(pb, mov, s);
4992 return update_size(pb, pos);
4995 static void param_write_int(AVIOContext *pb, const char *name, int value)
4997 avio_printf(pb, "<param name=\"%s\" value=\"%d\" valuetype=\"data\"/>\n", name, value);
5000 static void param_write_string(AVIOContext *pb, const char *name, const char *value)
5002 avio_printf(pb, "<param name=\"%s\" value=\"%s\" valuetype=\"data\"/>\n", name, value);
5005 static void param_write_hex(AVIOContext *pb, const char *name, const uint8_t *value, int len)
5010 avio_printf(pb, "<param name=\"%s\" value=\"%s\" valuetype=\"data\"/>\n", name, buf);
5013 static int mov_write_isml_manifest(AVIOContext *pb, MOVMuxContext *mov, AVFormatContext *s)
5015 int64_t pos = avio_tell(pb);
5023 avio_wb32(pb, 0);
5024 ffio_wfourcc(pb, "uuid");
5025 avio_write(pb, uuid, AV_UUID_LEN);
5026 avio_wb32(pb, 0);
5028 avio_printf(pb, "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n");
5029 avio_printf(pb, "<smil xmlns=\"http://www.w3.org/2001/SMIL20/Language\">\n");
5030 avio_printf(pb, "<head>\n");
5032 avio_printf(pb, "<meta name=\"creator\" content=\"%s\" />\n",
5034 avio_printf(pb, "</head>\n");
5035 avio_printf(pb, "<body>\n");
5036 avio_printf(pb, "<switch>\n");
5059 avio_printf(pb, "<%s systemBitrate=\"%"PRIu32"\">\n", type,
5061 param_write_int(pb, "systemBitrate", bit_rates.avg_bit_rate);
5062 param_write_int(pb, "trackID", track_id);
5063 param_write_string(pb, "systemLanguage", lang ? lang->value : "und");
5079 param_write_string(pb, "trackName", track_name_buf);
5087 param_write_hex(pb, "CodecPrivateData",
5092 param_write_string(pb, "FourCC", "H264");
5094 param_write_string(pb, "FourCC", "WVC1");
5095 param_write_hex(pb, "CodecPrivateData", track->par->extradata,
5098 param_write_int(pb, "MaxWidth", track->par->width);
5099 param_write_int(pb, "MaxHeight", track->par->height);
5100 param_write_int(pb, "DisplayWidth", track->par->width);
5101 param_write_int(pb, "DisplayHeight", track->par->height);
5107 param_write_string(pb, "FourCC", "AACP");
5110 param_write_string(pb, "FourCC", "AACH");
5113 param_write_string(pb, "FourCC", "AACL");
5116 param_write_string(pb, "FourCC", "WMAP");
5118 param_write_hex(pb, "CodecPrivateData", track->par->extradata,
5120 param_write_int(pb, "AudioTag", ff_codec_get_tag(ff_codec_wav_tags,
5122 param_write_int(pb, "Channels", track->par->ch_layout.nb_channels);
5123 param_write_int(pb, "SamplingRate", track->par->sample_rate);
5124 param_write_int(pb, "BitsPerSample", 16);
5125 param_write_int(pb, "PacketSize", track->par->block_align ?
5128 avio_printf(pb, "</%s>\n", type);
5130 avio_printf(pb, "</switch>\n");
5131 avio_printf(pb, "</body>\n");
5132 avio_printf(pb, "</smil>\n");
5134 return update_size(pb, pos);
5137 static int mov_write_mfhd_tag(AVIOContext *pb, MOVMuxContext *mov)
5139 avio_wb32(pb, 16);
5140 ffio_wfourcc(pb, "mfhd");
5141 avio_wb32(pb, 0);
5142 avio_wb32(pb, mov->fragments);
5152 static int mov_write_tfhd_tag(AVIOContext *pb, MOVMuxContext *mov,
5155 int64_t pos = avio_tell(pb);
5181 avio_wb32(pb, 0); /* size placeholder */
5182 ffio_wfourcc(pb, "tfhd");
5183 avio_w8(pb, 0); /* version */
5184 avio_wb24(pb, flags);
5186 avio_wb32(pb, track->track_id); /* track-id */
5188 avio_wb64(pb, moof_offset);
5190 avio_wb32(pb, 1);
5194 avio_wb32(pb, track->default_duration);
5198 avio_wb32(pb, track->default_size);
5212 avio_wb32(pb, track->default_sample_flags);
5215 return update_size(pb, pos);
5218 static int mov_write_trun_tag(AVIOContext *pb, MOVMuxContext *mov,
5222 int64_t pos = avio_tell(pb);
5240 avio_wb32(pb, 0); /* size placeholder */
5241 ffio_wfourcc(pb, "trun");
5243 avio_w8(pb, 1); /* version */
5245 avio_w8(pb, 0); /* version */
5246 avio_wb24(pb, flags);
5248 avio_wb32(pb, end - first); /* sample count */
5252 avio_wb32(pb, 0); /* Later tracks follow immediately after the previous one */
5254 avio_wb32(pb, moof_size + 8 + track->data_offset +
5257 avio_wb32(pb, get_sample_flags(track, &track->cluster[first]));
5261 avio_wb32(pb, get_cluster_duration(track, i));
5263 avio_wb32(pb, track->cluster[i].size);
5265 avio_wb32(pb, get_sample_flags(track, &track->cluster[i]));
5267 avio_wb32(pb, track->cluster[i].cts);
5271 return update_size(pb, pos);
5274 static int mov_write_tfxd_tag(AVIOContext *pb, MOVTrack *track)
5276 int64_t pos = avio_tell(pb);
5282 avio_wb32(pb, 0); /* size placeholder */
5283 ffio_wfourcc(pb, "uuid");
5284 avio_write(pb, uuid, AV_UUID_LEN);
5285 avio_w8(pb, 1);
5286 avio_wb24(pb, 0);
5287 avio_wb64(pb, track->cluster[0].dts + track->cluster[0].cts);
5288 avio_wb64(pb, track->end_pts -
5291 return update_size(pb, pos);
5294 static int mov_write_tfrf_tag(AVIOContext *pb, MOVMuxContext *mov,
5307 avio_seek(pb, track->frag_info[entry].tfrf_offset, SEEK_SET);
5308 avio_wb32(pb, size);
5309 ffio_wfourcc(pb, "uuid");
5310 avio_write(pb, uuid, AV_UUID_LEN);
5311 avio_w8(pb, 1);
5312 avio_wb24(pb, 0);
5313 avio_w8(pb, n);
5316 avio_wb64(pb, track->frag_info[index].time);
5317 avio_wb64(pb, track->frag_info[index].duration);
5321 avio_wb32(pb, free_size);
5322 ffio_wfourcc(pb, "free");
5323 ffio_fill(pb, 0, free_size - 8);
5329 static int mov_write_tfrf_tags(AVIOContext *pb, MOVMuxContext *mov,
5332 int64_t pos = avio_tell(pb);
5337 mov_write_tfrf_tag(pb, mov, track, track->nb_frag_info - 2 - i);
5339 avio_seek(pb, pos, SEEK_SET);
5343 static int mov_add_tfra_entries(AVIOContext *pb, MOVMuxContext *mov, int tracks,
5362 info->offset = avio_tell(pb);
5377 mov_write_tfrf_tags(pb, mov, track);
5396 static int mov_write_tfdt_tag(AVIOContext *pb, MOVTrack *track)
5398 int64_t pos = avio_tell(pb);
5400 avio_wb32(pb, 0); /* size */
5401 ffio_wfourcc(pb, "tfdt");
5402 avio_w8(pb, 1); /* version */
5403 avio_wb24(pb, 0);
5404 avio_wb64(pb, track->cluster[0].dts - track->start_dts);
5405 return update_size(pb, pos);
5408 static int mov_write_traf_tag(AVIOContext *pb, MOVMuxContext *mov,
5412 int64_t pos = avio_tell(pb);
5414 avio_wb32(pb, 0); /* size placeholder */
5415 ffio_wfourcc(pb, "traf");
5417 mov_write_tfhd_tag(pb, mov, track, moof_offset);
5419 mov_write_tfdt_tag(pb, track);
5422 mov_write_trun_tag(pb, mov, track, moof_size, start, i);
5426 mov_write_trun_tag(pb, mov, track, moof_size, start, track->entry);
5428 mov_write_tfxd_tag(pb, track);
5436 info->tfrf_offset = avio_tell(pb);
5438 avio_wb32(pb, 8 + size);
5439 ffio_wfourcc(pb, "free");
5440 ffio_fill(pb, 0, size);
5444 return update_size(pb, pos);
5447 static int mov_write_moof_tag_internal(AVIOContext *pb, MOVMuxContext *mov,
5450 int64_t pos = avio_tell(pb);
5453 avio_wb32(pb, 0); /* size placeholder */
5454 ffio_wfourcc(pb, "moof");
5457 mov_write_mfhd_tag(pb, mov);
5464 mov_write_traf_tag(pb, mov, track, pos, moof_size);
5467 return update_size(pb, pos);
5470 static int mov_write_sidx_tag(AVIOContext *pb,
5473 int64_t pos = avio_tell(pb), offset_pos, end_pos;
5501 avio_wb32(pb, 0); /* size */
5502 ffio_wfourcc(pb, "sidx");
5503 avio_w8(pb, 1); /* version */
5504 avio_wb24(pb, 0);
5505 avio_wb32(pb, track->track_id); /* reference_ID */
5506 avio_wb32(pb, track->timescale); /* timescale */
5507 avio_wb64(pb, presentation_time); /* earliest_presentation_time */
5508 offset_pos = avio_tell(pb);
5509 avio_wb64(pb, 0); /* first_offset (offset to referenced moof) */
5510 avio_wb16(pb, 0); /* reserved */
5512 avio_wb16(pb, entries); /* reference_count */
5522 avio_wb32(pb, (0 << 31) | (ref_size & 0x7fffffff)); /* reference_type (0 = media) | referenced_size */
5523 avio_wb32(pb, duration); /* subsegment_duration */
5524 avio_wb32(pb, (starts_with_SAP << 31) | (0 << 28) | 0); /* starts_with_SAP | SAP_type | SAP_delta_time */
5527 end_pos = avio_tell(pb);
5529 avio_seek(pb, offset_pos, SEEK_SET);
5530 avio_wb64(pb, offset);
5531 avio_seek(pb, end_pos, SEEK_SET);
5532 return update_size(pb, pos);
5535 static int mov_write_sidx_tags(AVIOContext *pb, MOVMuxContext *mov,
5550 avio_buf = pb;
5570 static int mov_write_prft_tag(AVIOContext *pb, MOVMuxContext *mov, int tracks)
5572 int64_t pos = avio_tell(pb), pts_us, ntp_ts;
5610 avio_wb32(pb, 0); // Size place holder
5611 ffio_wfourcc(pb, "prft"); // Type
5612 avio_w8(pb, 1); // Version
5613 avio_wb24(pb, flags); // Flags
5614 avio_wb32(pb, first_track->track_id); // reference track ID
5615 avio_wb64(pb, ntp_ts); // NTP time stamp
5616 avio_wb64(pb, first_track->cluster[0].pts); //media time
5617 return update_size(pb, pos);
5620 static int mov_write_moof_tag(AVIOContext *pb, MOVMuxContext *mov, int tracks,
5633 mov_write_sidx_tags(pb, mov, tracks, moof_size + 8 + mdat_size);
5636 mov_write_prft_tag(pb, mov, tracks);
5641 if ((ret = mov_add_tfra_entries(pb, mov, tracks, moof_size + 8 + mdat_size)) < 0)
5649 return mov_write_moof_tag_internal(pb, mov, tracks, moof_size);
5652 static int mov_write_tfra_tag(AVIOContext *pb, MOVTrack *track)
5654 int64_t pos = avio_tell(pb);
5657 avio_wb32(pb, 0); /* size placeholder */
5658 ffio_wfourcc(pb, "tfra");
5659 avio_w8(pb, 1); /* version */
5660 avio_wb24(pb, 0);
5662 avio_wb32(pb, track->track_id);
5663 avio_wb32(pb, 0); /* length of traf/trun/sample num */
5664 avio_wb32(pb, track->nb_frag_info);
5666 avio_wb64(pb, track->frag_info[i].time);
5667 avio_wb64(pb, track->frag_info[i].offset + track->data_offset);
5668 avio_w8(pb, 1); /* traf number */
5669 avio_w8(pb, 1); /* trun number */
5670 avio_w8(pb, 1); /* sample number */
5673 return update_size(pb, pos);
5676 static int mov_write_mfra_tag(AVIOContext *pb, MOVMuxContext *mov)
5708 avio_write(pb, buf, ret);
5714 static int mov_write_mdat_tag(AVIOContext *pb, MOVMuxContext *mov)
5716 avio_wb32(pb, 8); // placeholder for extended size field (64 bit)
5717 ffio_wfourcc(pb, mov->mode == MODE_MOV ? "wide" : "free");
5719 mov->mdat_pos = avio_tell(pb);
5720 avio_wb32(pb, 0); /* size placeholder*/
5721 ffio_wfourcc(pb, "mdat");
5725 static void mov_write_ftyp_tag_internal(AVIOContext *pb, AVFormatContext *s,
5732 ffio_wfourcc(pb, mov->major_brand);
5734 ffio_wfourcc(pb, has_h264 ? "3gp6" : "3gp4");
5737 ffio_wfourcc(pb, mov->is_animated_avif ? "avis" : "avif");
5740 ffio_wfourcc(pb, has_h264 ? "3g2b" : "3g2a");
5743 ffio_wfourcc(pb, "MSNV");
5746 ffio_wfourcc(pb, "iso6"); // Required when using signed CTS offsets in trun boxes
5748 ffio_wfourcc(pb, "iso5"); // Required when using default-base-is-moof
5750 ffio_wfourcc(pb, "iso4");
5752 ffio_wfourcc(pb, "isom");
5754 ffio_wfourcc(pb, has_video ? "M4V ":"M4A ");
5756 ffio_wfourcc(pb, "isml");
5758 ffio_wfourcc(pb, "f4v ");
5760 ffio_wfourcc(pb, "qt ");
5763 avio_wb32(pb, minor);
5766 static int mov_write_ftyp_tag(AVIOContext *pb, AVFormatContext *s)
5769 int64_t pos = avio_tell(pb);
5790 avio_wb32(pb, 0); /* size */
5791 ffio_wfourcc(pb, "ftyp");
5794 mov_write_ftyp_tag_internal(pb, s, has_h264, has_video, 1);
5796 mov_write_ftyp_tag_internal(pb, s, has_h264, has_video, 0);
5801 ffio_wfourcc(pb, "piff");
5809 ffio_wfourcc(pb, "avif");
5810 ffio_wfourcc(pb, "msf1");
5811 ffio_wfourcc(pb, "iso8");
5813 ffio_wfourcc(pb, "mif1");
5814 ffio_wfourcc(pb, "miaf");
5821 ffio_wfourcc(pb, "MA1A");
5824 ffio_wfourcc(pb, "MA1B");
5833 ffio_wfourcc(pb, "cmfc");
5835 ffio_wfourcc(pb, "iso6");
5837 ffio_wfourcc(pb, "av01");
5839 ffio_wfourcc(pb, "dby1");
5842 ffio_wfourcc(pb, "iso6");
5844 ffio_wfourcc(pb, "iso5");
5846 ffio_wfourcc(pb, "iso4");
5852 ffio_wfourcc(pb, "isom");
5853 ffio_wfourcc(pb, "iso2");
5855 ffio_wfourcc(pb, "avc1");
5860 ffio_wfourcc(pb, "mp41");
5863 ffio_wfourcc(pb, "dash");
5865 return update_size(pb, pos);
5868 static int mov_write_uuidprof_tag(AVIOContext *pb, AVFormatContext *s)
5885 avio_wb32(pb, 0x94); /* size */
5886 ffio_wfourcc(pb, "uuid");
5887 ffio_wfourcc(pb, "PROF");
5889 avio_wb32(pb, 0x21d24fce); /* 96 bit UUID */
5890 avio_wb32(pb, 0xbb88695c);
5891 avio_wb32(pb, 0xfac9c740);
5893 avio_wb32(pb, 0x0); /* ? */
5894 avio_wb32(pb, 0x3); /* 3 sections ? */
5896 avio_wb32(pb, 0x14); /* size */
5897 ffio_wfourcc(pb, "FPRF");
5898 avio_wb32(pb, 0x0); /* ? */
5899 avio_wb32(pb, 0x0); /* ? */
5900 avio_wb32(pb, 0x0); /* ? */
5902 avio_wb32(pb, 0x2c); /* size */
5903 ffio_wfourcc(pb, "APRF"); /* audio */
5904 avio_wb32(pb, 0x0);
5905 avio_wb32(pb, 0x2); /* TrackID */
5906 ffio_wfourcc(pb, "mp4a");
5907 avio_wb32(pb, 0x20f);
5908 avio_wb32(pb, 0x0);
5909 avio_wb32(pb, audio_kbitrate);
5910 avio_wb32(pb, audio_kbitrate);
5911 avio_wb32(pb, audio_rate);
5912 avio_wb32(pb, audio_par->ch_layout.nb_channels);
5914 avio_wb32(pb, 0x34); /* size */
5915 ffio_wfourcc(pb, "VPRF"); /* video */
5916 avio_wb32(pb, 0x0);
5917 avio_wb32(pb, 0x1); /* TrackID */
5919 ffio_wfourcc(pb, "avc1");
5920 avio_wb16(pb, 0x014D);
5921 avio_wb16(pb, 0x0015);
5923 ffio_wfourcc(pb, "mp4v");
5924 avio_wb16(pb, 0x0000);
5925 avio_wb16(pb, 0x0103);
5927 avio_wb32(pb, 0x0);
5928 avio_wb32(pb, video_kbitrate);
5929 avio_wb32(pb, video_kbitrate);
5930 avio_wb32(pb, frame_rate);
5931 avio_wb32(pb, frame_rate);
5932 avio_wb16(pb, video_par->width);
5933 avio_wb16(pb, video_par->height);
5934 avio_wb32(pb, 0x010001); /* ? */
5939 static int mov_write_identification(AVIOContext *pb, AVFormatContext *s)
5944 mov_write_ftyp_tag(pb,s);
5963 return mov_write_uuidprof_tag(pb, s);
6224 int64_t pos = avio_tell(s->pb);
6239 avio_write_marker(s->pb, AV_NOPTS_VALUE, AVIO_DATA_MARKER_HEADER);
6241 mov_write_identification(s->pb, s);
6242 if ((ret = mov_write_moov_tag(s->pb, mov, s)) < 0)
6247 mov->reserved_header_pos = avio_tell(s->pb);
6248 avio_write_marker(s->pb, AV_NOPTS_VALUE, AVIO_DATA_MARKER_FLUSH_POINT);
6254 avio_wb32(s->pb, buf_size + 8);
6255 ffio_wfourcc(s->pb, "mdat");
6256 avio_write(s->pb, buf, buf_size);
6260 mov->reserved_header_pos = avio_tell(s->pb);
6268 avio_write_marker(s->pb, AV_NOPTS_VALUE, AVIO_DATA_MARKER_FLUSH_POINT);
6310 avio_write_marker(s->pb,
6329 avio_write_marker(s->pb, AV_NOPTS_VALUE, AVIO_DATA_MARKER_FLUSH_POINT);
6331 mov_write_moof_tag(s->pb, mov, moof_tracks, mdat_size);
6334 avio_wb32(s->pb, mdat_size + 8);
6335 ffio_wfourcc(s->pb, "mdat");
6353 avio_write(s->pb, buf, buf_size);
6359 avio_write_marker(s->pb, AV_NOPTS_VALUE, AVIO_DATA_MARKER_FLUSH_POINT);
6417 AVIOContext *pb = s->pb;
6444 pb = trk->mdat_buf;
6450 pb = mov->mdat_buf;
6529 avio_write(pb, reformatted_data, size);
6532 size = ff_mov_cenc_avc_parse_nal_units(&trk->cenc, pb, pkt->data, size);
6538 size = ff_avc_parse_nal_units(pb, pkt->data, pkt->size);
6549 avio_write(pb, reformatted_data, size);
6552 size = ff_mov_cenc_avc_parse_nal_units(&trk->cenc, pb, pkt->data, size);
6558 size = ff_hevc_annexb2mp4(pb, pkt->data, pkt->size, 0, NULL);
6567 avio_write(pb, reformatted_data, size);
6569 size = ff_av1_filter_obus(pb, pkt->data, pkt->size);
6582 avio_write(pb, pkt->data, size);
6591 avio_wb32(pb, size);
6592 ffio_wfourcc(pb, "cdat");
6595 avio_w8(pb, pkt->data[i + 1]);
6596 avio_w8(pb, pkt->data[i + 2]);
6603 ret = ff_mov_cenc_avc_write_nal_units(s, &trk->cenc, nal_size_length, pb, pkt->data, size);
6606 ret = ff_mov_cenc_avc_write_nal_units(s, &trk->cenc, nal_size_length, pb, pkt->data, size);
6608 ret = ff_mov_cenc_write_packet(&trk->cenc, pb, pkt->data, size);
6615 avio_write(pb, pkt->data, size);
6630 trk->cluster[trk->entry].pos = avio_tell(pb) - size;
7450 if (!(s->pb->seekable & AVIO_SEEKABLE_NORMAL) &&
7768 AVIOContext *pb = s->pb;
7842 if ((ret = mov_write_identification(pb, s)) < 0)
7847 mov->reserved_header_pos = avio_tell(pb);
7849 avio_skip(pb, mov->reserved_moov_size);
7861 mov->reserved_header_pos = avio_tell(pb);
7862 mov_write_mdat_tag(pb, mov);
7926 avio_flush(pb);
7929 mov_write_isml_manifest(pb, mov, s);
7933 if ((ret = mov_write_moov_tag(pb, mov, s)) < 0)
7937 mov->reserved_header_pos = avio_tell(pb);
8032 AVIOContext *pb = s->pb;
8083 moov_pos = avio_tell(pb);
8087 avio_seek(pb, mov->mdat_pos, SEEK_SET);
8088 avio_wb32(pb, mov->mdat_size + 8);
8091 avio_seek(pb, mov->mdat_pos - 8, SEEK_SET);
8094 avio_wb32(pb, 1);
8095 ffio_wfourcc(pb, "mdat");
8096 avio_wb64(pb, mov->mdat_size + 16);
8098 avio_seek(pb, mov->reserved_moov_size > 0 ? mov->reserved_header_pos : moov_pos, SEEK_SET);
8105 avio_seek(pb, mov->reserved_header_pos, SEEK_SET);
8106 if ((res = mov_write_moov_tag(pb, mov, s)) < 0)
8110 if ((res = mov_write_moov_tag(pb, mov, s)) < 0)
8112 size = mov->reserved_moov_size - (avio_tell(pb) - mov->reserved_header_pos);
8117 avio_wb32(pb, size);
8118 ffio_wfourcc(pb, "free");
8119 ffio_fill(pb, 0, size - 8);
8120 avio_seek(pb, moov_pos, SEEK_SET);
8122 if ((res = mov_write_moov_tag(pb, mov, s)) < 0)
8136 end = avio_tell(pb);
8137 avio_seek(pb, mov->reserved_header_pos, SEEK_SET);
8138 mov_write_sidx_tags(pb, mov, -1, 0);
8139 avio_seek(pb, end, SEEK_SET);
8142 avio_write_marker(s->pb, AV_NOPTS_VALUE, AVIO_DATA_MARKER_TRAILER);
8143 res = mov_write_mfra_tag(pb, mov);
8169 AVIOContext *pb = s->pb;
8188 mov_write_identification(pb, s);
8189 mov_write_meta_tag(pb, mov, s);
8193 mov->tracks[i].data_offset = avio_tell(pb) + moov_size + 8;
8197 if ((ret = mov_write_moov_tag(pb, mov, s)) < 0)
8202 avio_wb32(pb, buf_size + 8);
8203 ffio_wfourcc(pb, "mdat");
8206 extent_offsets[0] = avio_tell(pb);
8210 avio_write(pb, buf, buf_size);
8213 pos_backup = avio_tell(pb);
8219 avio_seek(pb, mov->avif_extent_pos[i], SEEK_SET);
8220 avio_wb32(pb, extent_offsets[i]); /* rewrite offset */
8222 avio_seek(pb, pos_backup, SEEK_SET);