3
3
* Copyright (c) 2008 GUCAS, Zhentan Feng <spyfeng at gmail dot com>
4
4
* Copyright (c) 2008 Baptiste Coudurier <baptiste dot coudurier at gmail dot com>
6
* This file is part of FFmpeg.
6
* This file is part of Libav.
8
* FFmpeg is free software; you can redistribute it and/or
8
* Libav is free software; you can redistribute it and/or
9
9
* modify it under the terms of the GNU Lesser General Public
10
10
* License as published by the Free Software Foundation; either
11
11
* version 2.1 of the License, or (at your option) any later version.
13
* FFmpeg is distributed in the hope that it will be useful,
13
* Libav is distributed in the hope that it will be useful,
14
14
* but WITHOUT ANY WARRANTY; without even the implied warranty of
15
15
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16
16
* Lesser General Public License for more details.
18
18
* You should have received a copy of the GNU Lesser General Public
19
* License along with FFmpeg; if not, write to the Free Software
19
* License along with Libav; if not, write to the Free Software
20
20
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
304
305
{ 0x3D0A, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x04,0x02,0x03,0x02,0x01,0x00,0x00,0x00}}, /* Block Align */
307
static void mxf_write_uuid(ByteIOContext *pb, enum MXFMetadataSetType type, int value)
308
static void mxf_write_uuid(AVIOContext *pb, enum MXFMetadataSetType type, int value)
309
put_buffer(pb, uuid_base, 12);
310
avio_write(pb, uuid_base, 12);
312
avio_wb16(pb, value);
314
315
static void mxf_write_umid(AVFormatContext *s, int type)
316
317
MXFContext *mxf = s->priv_data;
317
put_buffer(s->pb, umid_ul, 13);
318
put_be24(s->pb, mxf->instance_number);
319
put_buffer(s->pb, mxf->umid, 15);
320
put_byte(s->pb, type);
318
avio_write(s->pb, umid_ul, 13);
319
avio_wb24(s->pb, mxf->instance_number);
320
avio_write(s->pb, mxf->umid, 15);
321
avio_w8(s->pb, type);
323
static void mxf_write_refs_count(ByteIOContext *pb, int ref_count)
324
static void mxf_write_refs_count(AVIOContext *pb, int ref_count)
325
put_be32(pb, ref_count);
326
avio_wb32(pb, ref_count);
329
330
static int klv_ber_length(uint64_t len)
376
377
static void mxf_write_primer_pack(AVFormatContext *s)
378
ByteIOContext *pb = s->pb;
379
AVIOContext *pb = s->pb;
379
380
int local_tag_number, i = 0;
381
382
local_tag_number = FF_ARRAY_ELEMS(mxf_local_tag_batch);
383
put_buffer(pb, primer_pack_key, 16);
384
avio_write(pb, primer_pack_key, 16);
384
385
klv_encode_ber_length(pb, local_tag_number * 18 + 8);
386
put_be32(pb, local_tag_number); // local_tag num
387
put_be32(pb, 18); // item size, always 18 according to the specs
387
avio_wb32(pb, local_tag_number); // local_tag num
388
avio_wb32(pb, 18); // item size, always 18 according to the specs
389
390
for (i = 0; i < local_tag_number; i++) {
390
put_be16(pb, mxf_local_tag_batch[i].local_tag);
391
put_buffer(pb, mxf_local_tag_batch[i].uid, 16);
391
avio_wb16(pb, mxf_local_tag_batch[i].local_tag);
392
avio_write(pb, mxf_local_tag_batch[i].uid, 16);
395
static void mxf_write_local_tag(ByteIOContext *pb, int size, int tag)
396
static void mxf_write_local_tag(AVIOContext *pb, int size, int tag)
401
static void mxf_write_metadata_key(ByteIOContext *pb, unsigned int value)
402
static void mxf_write_metadata_key(AVIOContext *pb, unsigned int value)
403
put_buffer(pb, header_metadata_key, 13);
404
avio_write(pb, header_metadata_key, 13);
405
avio_wb24(pb, value);
407
408
static void mxf_free(AVFormatContext *s)
576
577
// write track id
577
578
mxf_write_local_tag(pb, 4, 0x4801);
578
put_be32(pb, st->index+2);
579
avio_wb32(pb, st->index+2);
580
581
// write track number
581
582
mxf_write_local_tag(pb, 4, 0x4804);
582
583
if (type == MaterialPackage)
583
put_be32(pb, 0); // track number of material package is 0
584
avio_wb32(pb, 0); // track number of material package is 0
585
put_buffer(pb, sc->track_essence_element_key + 12, 4);
586
avio_write(pb, sc->track_essence_element_key + 12, 4);
587
588
mxf_write_local_tag(pb, 8, 0x4B01);
588
put_be32(pb, mxf->time_base.den);
589
put_be32(pb, mxf->time_base.num);
589
avio_wb32(pb, mxf->time_base.den);
590
avio_wb32(pb, mxf->time_base.num);
592
593
mxf_write_local_tag(pb, 8, 0x4B02);
595
596
// write sequence refs
596
597
mxf_write_local_tag(pb, 16, 0x4803);
602
603
static void mxf_write_common_fields(AVFormatContext *s, AVStream *st)
604
605
MXFContext *mxf = s->priv_data;
605
ByteIOContext *pb = s->pb;
606
AVIOContext *pb = s->pb;
607
608
// find data define uls
608
609
mxf_write_local_tag(pb, 16, 0x0201);
609
610
if (st == mxf->timecode_track)
610
put_buffer(pb, smpte_12m_timecode_track_data_ul, 16);
611
avio_write(pb, smpte_12m_timecode_track_data_ul, 16);
612
613
const MXFCodecUL *data_def_ul = mxf_get_data_definition_ul(st->codec->codec_type);
613
put_buffer(pb, data_def_ul->uid, 16);
614
avio_write(pb, data_def_ul->uid, 16);
616
617
// write duration
617
618
mxf_write_local_tag(pb, 8, 0x0202);
618
put_be64(pb, mxf->duration);
619
avio_wb64(pb, mxf->duration);
621
622
static void mxf_write_sequence(AVFormatContext *s, AVStream *st, enum MXFMetadataSetType type)
623
624
MXFContext *mxf = s->priv_data;
624
ByteIOContext *pb = s->pb;
625
AVIOContext *pb = s->pb;
625
626
enum MXFMetadataSetType component;
627
628
mxf_write_metadata_key(pb, 0x010f00);
752
753
MXFContext *mxf = s->priv_data;
753
754
MXFStreamContext *sc = st->priv_data;
754
ByteIOContext *pb = s->pb;
755
AVIOContext *pb = s->pb;
756
put_buffer(pb, key, 16);
757
avio_write(pb, key, 16);
757
758
klv_encode_ber4_length(pb, size+20+8+12+20);
759
760
mxf_write_local_tag(pb, 16, 0x3C0A);
760
761
mxf_write_uuid(pb, SubDescriptor, st->index);
762
763
mxf_write_local_tag(pb, 4, 0x3006);
763
put_be32(pb, st->index+2);
764
avio_wb32(pb, st->index+2);
765
766
mxf_write_local_tag(pb, 8, 0x3001);
766
put_be32(pb, mxf->time_base.den);
767
put_be32(pb, mxf->time_base.num);
767
avio_wb32(pb, mxf->time_base.den);
768
avio_wb32(pb, mxf->time_base.num);
769
770
mxf_write_local_tag(pb, 16, 0x3004);
770
put_buffer(pb, mxf_essence_container_uls[sc->index].container_ul, 16);
771
avio_write(pb, mxf_essence_container_uls[sc->index].container_ul, 16);
773
774
static const UID mxf_mpegvideo_descriptor_key = { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x51,0x00 };
856
857
static void mxf_write_mpegvideo_desc(AVFormatContext *s, AVStream *st)
858
ByteIOContext *pb = s->pb;
859
AVIOContext *pb = s->pb;
859
860
int profile_and_level = (st->codec->profile<<4) | st->codec->level;
861
862
mxf_write_cdci_common(s, st, mxf_mpegvideo_descriptor_key, 8+5);
864
865
mxf_write_local_tag(pb, 4, 0x8000);
865
put_be32(pb, st->codec->bit_rate);
866
avio_wb32(pb, st->codec->bit_rate);
867
868
// profile and level
868
869
mxf_write_local_tag(pb, 1, 0x8007);
869
870
if (!st->codec->profile)
870
871
profile_and_level |= 0x80; // escape bit
871
put_byte(pb, profile_and_level);
872
avio_w8(pb, profile_and_level);
874
875
static void mxf_write_generic_sound_common(AVFormatContext *s, AVStream *st, const UID key, unsigned size)
876
ByteIOContext *pb = s->pb;
877
AVIOContext *pb = s->pb;
878
879
mxf_write_generic_desc(s, st, key, size+5+12+8+8);
881
882
mxf_write_local_tag(pb, 1, 0x3D02);
884
885
// write audio sampling rate
885
886
mxf_write_local_tag(pb, 8, 0x3D03);
886
put_be32(pb, st->codec->sample_rate);
887
avio_wb32(pb, st->codec->sample_rate);
889
890
mxf_write_local_tag(pb, 4, 0x3D07);
890
put_be32(pb, st->codec->channels);
891
avio_wb32(pb, st->codec->channels);
892
893
mxf_write_local_tag(pb, 4, 0x3D01);
893
put_be32(pb, av_get_bits_per_sample(st->codec->codec_id));
894
avio_wb32(pb, av_get_bits_per_sample(st->codec->codec_id));
896
897
static void mxf_write_wav_common(AVFormatContext *s, AVStream *st, const UID key, unsigned size)
898
ByteIOContext *pb = s->pb;
899
AVIOContext *pb = s->pb;
900
901
mxf_write_generic_sound_common(s, st, key, size+6+8);
902
903
mxf_write_local_tag(pb, 2, 0x3D0A);
903
put_be16(pb, st->codec->block_align);
904
avio_wb16(pb, st->codec->block_align);
905
906
// avg bytes per sec
906
907
mxf_write_local_tag(pb, 4, 0x3D09);
907
put_be32(pb, st->codec->block_align*st->codec->sample_rate);
908
avio_wb32(pb, st->codec->block_align*st->codec->sample_rate);
910
911
static void mxf_write_wav_desc(AVFormatContext *s, AVStream *st)
1064
1064
// index edit rate
1065
1065
mxf_write_local_tag(pb, 8, 0x3F0B);
1066
put_be32(pb, mxf->time_base.den);
1067
put_be32(pb, mxf->time_base.num);
1066
avio_wb32(pb, mxf->time_base.den);
1067
avio_wb32(pb, mxf->time_base.num);
1069
1069
// index start position
1070
1070
mxf_write_local_tag(pb, 8, 0x3F0C);
1071
put_be64(pb, mxf->last_indexed_edit_unit);
1071
avio_wb64(pb, mxf->last_indexed_edit_unit);
1073
1073
// index duration
1074
1074
mxf_write_local_tag(pb, 8, 0x3F0D);
1075
1075
if (mxf->edit_unit_byte_count)
1076
put_be64(pb, 0); // index table covers whole container
1076
avio_wb64(pb, 0); // index table covers whole container
1078
put_be64(pb, mxf->edit_units_count);
1078
avio_wb64(pb, mxf->edit_units_count);
1080
1080
// edit unit byte count
1081
1081
mxf_write_local_tag(pb, 4, 0x3F05);
1082
put_be32(pb, mxf->edit_unit_byte_count);
1082
avio_wb32(pb, mxf->edit_unit_byte_count);
1085
1085
mxf_write_local_tag(pb, 4, 0x3F06);
1089
1089
mxf_write_local_tag(pb, 4, 0x3F07);
1092
1092
if (!mxf->edit_unit_byte_count) {
1093
1093
// real slice count - 1
1094
1094
mxf_write_local_tag(pb, 1, 0x3F08);
1095
put_byte(pb, mxf->slice_count);
1095
avio_w8(pb, mxf->slice_count);
1097
1097
// delta entry array
1098
1098
mxf_write_local_tag(pb, 8 + (s->nb_streams+1)*6, 0x3F09);
1099
put_be32(pb, s->nb_streams+1); // num of entries
1100
put_be32(pb, 6); // size of one entry
1099
avio_wb32(pb, s->nb_streams+1); // num of entries
1100
avio_wb32(pb, 6); // size of one entry
1101
1101
// write system item delta entry
1103
put_byte(pb, 0); // slice entry
1104
put_be32(pb, 0); // element delta
1103
avio_w8(pb, 0); // slice entry
1104
avio_wb32(pb, 0); // element delta
1105
1105
for (i = 0; i < s->nb_streams; i++) {
1106
1106
AVStream *st = s->streams[i];
1107
1107
MXFStreamContext *sc = st->priv_data;
1108
put_byte(pb, sc->temporal_reordering);
1108
avio_w8(pb, sc->temporal_reordering);
1109
1109
if (sc->temporal_reordering)
1110
1110
temporal_reordering = 1;
1111
1111
if (i == 0) { // video track
1112
put_byte(pb, 0); // slice number
1113
put_be32(pb, KAG_SIZE); // system item size including klv fill
1112
avio_w8(pb, 0); // slice number
1113
avio_wb32(pb, KAG_SIZE); // system item size including klv fill
1114
1114
} else { // audio track
1115
1115
unsigned audio_frame_size = sc->aic.samples[0]*sc->aic.sample_size;
1116
1116
audio_frame_size += klv_fill_size(audio_frame_size);
1118
put_be32(pb, (i-1)*audio_frame_size); // element delta
1118
avio_wb32(pb, (i-1)*audio_frame_size); // element delta
1122
1122
mxf_write_local_tag(pb, 8 + mxf->edit_units_count*(11+mxf->slice_count*4), 0x3F0A);
1123
put_be32(pb, mxf->edit_units_count); // num of entries
1124
put_be32(pb, 11+mxf->slice_count*4); // size of one entry
1123
avio_wb32(pb, mxf->edit_units_count); // num of entries
1124
avio_wb32(pb, 11+mxf->slice_count*4); // size of one entry
1125
1126
for (i = 0; i < mxf->edit_units_count; i++) {
1126
1127
int temporal_offset = 0;
1127
if (temporal_reordering) {
1128
for (j = i+1; j < mxf->edit_units_count; j++) {
1130
if (mxf->index_entries[j].flags & 0x10) { // backward prediction
1131
// next is not b, so is reordered
1132
if (!(mxf->index_entries[i+1].flags & 0x10)) {
1133
if ((mxf->index_entries[i].flags & 0x11) == 0) // I frame
1134
temporal_offset = 0;
1136
temporal_offset = -temporal_offset;
1142
put_byte(pb, temporal_offset);
1144
1129
if (!(mxf->index_entries[i].flags & 0x33)) { // I frame
1145
if (mxf->index_entries[i].flags & 0x40 && // seq header
1146
(!temporal_reordering || !temporal_offset))
1147
mxf->index_entries[i].flags |= 0x80; // random access
1148
1130
mxf->last_key_index = key_index;
1134
if (temporal_reordering) {
1135
int pic_num_in_gop = i - key_index;
1136
if (pic_num_in_gop != mxf->index_entries[i].temporal_ref) {
1137
for (j = key_index; j < mxf->edit_units_count; j++) {
1138
if (pic_num_in_gop == mxf->index_entries[j].temporal_ref)
1141
if (j == mxf->edit_units_count)
1142
av_log(s, AV_LOG_WARNING, "missing frames\n");
1143
temporal_offset = j - key_index - pic_num_in_gop;
1146
avio_w8(pb, temporal_offset);
1151
1148
if ((mxf->index_entries[i].flags & 0x30) == 0x30) { // back and forward prediction
1152
put_byte(pb, mxf->last_key_index - i);
1149
avio_w8(pb, mxf->last_key_index - i);
1154
put_byte(pb, key_index - i); // key frame offset
1151
avio_w8(pb, key_index - i); // key frame offset
1155
1152
if ((mxf->index_entries[i].flags & 0x20) == 0x20) // only forward
1156
1153
mxf->last_key_index = key_index;
1158
put_byte(pb, mxf->index_entries[i].flags);
1156
if (!(mxf->index_entries[i].flags & 0x33) && // I frame
1157
mxf->index_entries[i].flags & 0x40 && !temporal_offset)
1158
mxf->index_entries[i].flags |= 0x80; // random access
1159
avio_w8(pb, mxf->index_entries[i].flags);
1159
1160
// stream offset
1160
put_be64(pb, mxf->index_entries[i].offset);
1161
avio_wb64(pb, mxf->index_entries[i].offset);
1161
1162
if (s->nb_streams > 1)
1162
put_be32(pb, mxf->index_entries[i].slice_offset);
1163
avio_wb32(pb, mxf->index_entries[i].slice_offset);
1165
1166
mxf->last_key_index = key_index - mxf->edit_units_count;
1215
put_buffer(pb, key, 16);
1216
avio_write(pb, key, 16);
1216
1217
klv_encode_ber_length(pb, 88 + 16 * mxf->essence_container_count);
1218
1219
// write partition value
1219
put_be16(pb, 1); // majorVersion
1220
put_be16(pb, 2); // minorVersion
1221
put_be32(pb, KAG_SIZE); // KAGSize
1220
avio_wb16(pb, 1); // majorVersion
1221
avio_wb16(pb, 2); // minorVersion
1222
avio_wb32(pb, KAG_SIZE); // KAGSize
1223
put_be64(pb, partition_offset); // ThisPartition
1224
avio_wb64(pb, partition_offset); // ThisPartition
1225
1226
if (!memcmp(key, body_partition_key, 16) && mxf->body_partitions_count > 1)
1226
put_be64(pb, mxf->body_partition_offset[mxf->body_partitions_count-2]); // PreviousPartition
1227
avio_wb64(pb, mxf->body_partition_offset[mxf->body_partitions_count-2]); // PreviousPartition
1227
1228
else if (!memcmp(key, footer_partition_key, 16) && mxf->body_partitions_count)
1228
put_be64(pb, mxf->body_partition_offset[mxf->body_partitions_count-1]); // PreviousPartition
1229
avio_wb64(pb, mxf->body_partition_offset[mxf->body_partitions_count-1]); // PreviousPartition
1232
put_be64(pb, mxf->footer_partition_offset); // footerPartition
1233
avio_wb64(pb, mxf->footer_partition_offset); // footerPartition
1235
header_byte_count_offset = url_ftell(pb);
1236
put_be64(pb, 0); // headerByteCount, update later
1236
header_byte_count_offset = avio_tell(pb);
1237
avio_wb64(pb, 0); // headerByteCount, update later
1239
put_be64(pb, index_byte_count); // indexByteCount
1240
put_be32(pb, index_byte_count ? indexsid : 0); // indexSID
1240
avio_wb64(pb, index_byte_count); // indexByteCount
1241
avio_wb32(pb, index_byte_count ? indexsid : 0); // indexSID
1243
1244
if (bodysid && mxf->edit_units_count && mxf->body_partitions_count) {
1244
put_be64(pb, mxf->body_offset);
1245
avio_wb64(pb, mxf->body_offset);
1248
put_be32(pb, bodysid); // bodySID
1249
avio_wb32(pb, bodysid); // bodySID
1250
1251
// operational pattern
1251
put_buffer(pb, op1a_ul, 16);
1252
avio_write(pb, op1a_ul, 16);
1253
1254
// essence container
1254
1255
mxf_write_essence_container_refs(s);
1554
1557
static void mxf_write_system_item(AVFormatContext *s)
1556
1559
MXFContext *mxf = s->priv_data;
1557
ByteIOContext *pb = s->pb;
1560
AVIOContext *pb = s->pb;
1558
1561
unsigned frame;
1559
1562
uint32_t time_code;
1561
1564
frame = mxf->timecode_start + mxf->last_indexed_edit_unit + mxf->edit_units_count;
1563
1566
// write system metadata pack
1564
put_buffer(pb, system_metadata_pack_key, 16);
1567
avio_write(pb, system_metadata_pack_key, 16);
1565
1568
klv_encode_ber4_length(pb, 57);
1566
put_byte(pb, 0x5c); // UL, user date/time stamp, picture and sound item present
1567
put_byte(pb, 0x04); // content package rate
1568
put_byte(pb, 0x00); // content package type
1569
put_be16(pb, 0x00); // channel handle
1570
put_be16(pb, frame); // continuity count
1569
avio_w8(pb, 0x5c); // UL, user date/time stamp, picture and sound item present
1570
avio_w8(pb, 0x04); // content package rate
1571
avio_w8(pb, 0x00); // content package type
1572
avio_wb16(pb, 0x00); // channel handle
1573
avio_wb16(pb, frame); // continuity count
1571
1574
if (mxf->essence_container_count > 1)
1572
put_buffer(pb, multiple_desc_ul, 16);
1575
avio_write(pb, multiple_desc_ul, 16);
1574
1577
MXFStreamContext *sc = s->streams[0]->priv_data;
1575
put_buffer(pb, mxf_essence_container_uls[sc->index].container_ul, 16);
1578
avio_write(pb, mxf_essence_container_uls[sc->index].container_ul, 16);
1579
put_be64(pb, 0); // creation date/time stamp
1582
avio_wb64(pb, 0); // creation date/time stamp
1581
put_byte(pb, 0x81); // SMPTE 12M time code
1584
avio_w8(pb, 0x81); // SMPTE 12M time code
1582
1585
time_code = ff_framenum_to_12m_time_code(frame, mxf->timecode_drop_frame, mxf->timecode_base);
1583
put_be32(pb, time_code);
1584
put_be32(pb, 0); // binary group data
1586
avio_wb32(pb, time_code);
1587
avio_wb32(pb, 0); // binary group data
1587
1590
// write system metadata package set
1588
put_buffer(pb, system_metadata_package_set_key, 16);
1591
avio_write(pb, system_metadata_package_set_key, 16);
1589
1592
klv_encode_ber4_length(pb, 35);
1590
put_byte(pb, 0x83); // UMID
1593
avio_w8(pb, 0x83); // UMID
1594
avio_wb16(pb, 0x20);
1592
1595
mxf_write_umid(s, 1);
1595
1598
static void mxf_write_d10_video_packet(AVFormatContext *s, AVStream *st, AVPacket *pkt)
1597
1600
MXFContext *mxf = s->priv_data;
1598
ByteIOContext *pb = s->pb;
1601
AVIOContext *pb = s->pb;
1599
1602
int packet_size = (uint64_t)st->codec->bit_rate*mxf->time_base.num /
1600
1603
(8*mxf->time_base.den); // frame size
1604
1607
packet_size += klv_fill_size(packet_size);
1606
1609
klv_encode_ber4_length(pb, pkt->size);
1607
put_buffer(pb, pkt->data, pkt->size);
1610
avio_write(pb, pkt->data, pkt->size);
1609
1612
// ensure CBR muxing by padding to correct video frame size
1610
1613
pad = packet_size - pkt->size - 16 - 4;
1611
1614
if (pad > 20) {
1612
put_buffer(s->pb, klv_fill_key, 16);
1615
avio_write(s->pb, klv_fill_key, 16);
1614
1617
klv_encode_ber4_length(s->pb, pad);
1615
1618
for (; pad; pad--)
1617
assert(!(url_ftell(s->pb) & (KAG_SIZE-1)));
1620
assert(!(avio_tell(s->pb) & (KAG_SIZE-1)));
1619
1622
av_log(s, AV_LOG_WARNING, "cannot fill d-10 video packet\n");
1620
1623
for (; pad > 0; pad--)
1625
1628
static void mxf_write_d10_audio_packet(AVFormatContext *s, AVStream *st, AVPacket *pkt)
1627
1630
MXFContext *mxf = s->priv_data;
1628
ByteIOContext *pb = s->pb;
1631
AVIOContext *pb = s->pb;
1629
1632
int frame_size = pkt->size / st->codec->block_align;
1630
1633
uint8_t *samples = pkt->data;
1631
1634
uint8_t *end = pkt->data + pkt->size;
1735
1739
static void mxf_write_random_index_pack(AVFormatContext *s)
1737
1741
MXFContext *mxf = s->priv_data;
1738
ByteIOContext *pb = s->pb;
1739
uint64_t pos = url_ftell(pb);
1742
AVIOContext *pb = s->pb;
1743
uint64_t pos = avio_tell(pb);
1742
put_buffer(pb, random_index_pack_key, 16);
1746
avio_write(pb, random_index_pack_key, 16);
1743
1747
klv_encode_ber_length(pb, 28 + 12*mxf->body_partitions_count);
1745
1749
if (mxf->edit_unit_byte_count)
1746
put_be32(pb, 1); // BodySID of header partition
1750
avio_wb32(pb, 1); // BodySID of header partition
1749
put_be64(pb, 0); // offset of header partition
1753
avio_wb64(pb, 0); // offset of header partition
1751
1755
for (i = 0; i < mxf->body_partitions_count; i++) {
1752
put_be32(pb, 1); // BodySID
1753
put_be64(pb, mxf->body_partition_offset[i]);
1756
avio_wb32(pb, 1); // BodySID
1757
avio_wb64(pb, mxf->body_partition_offset[i]);
1756
put_be32(pb, 0); // BodySID of footer partition
1757
put_be64(pb, mxf->footer_partition_offset);
1760
avio_wb32(pb, 0); // BodySID of footer partition
1761
avio_wb64(pb, mxf->footer_partition_offset);
1759
put_be32(pb, url_ftell(pb) - pos + 4);
1763
avio_wb32(pb, avio_tell(pb) - pos + 4);
1762
1766
static int mxf_write_footer(AVFormatContext *s)
1764
1768
MXFContext *mxf = s->priv_data;
1765
ByteIOContext *pb = s->pb;
1769
AVIOContext *pb = s->pb;
1767
1771
mxf->duration = mxf->last_indexed_edit_unit + mxf->edit_units_count;
1769
1773
mxf_write_klv_fill(s);
1770
mxf->footer_partition_offset = url_ftell(pb);
1774
mxf->footer_partition_offset = avio_tell(pb);
1771
1775
if (mxf->edit_unit_byte_count) { // no need to repeat index
1772
1776
mxf_write_partition(s, 0, 0, footer_partition_key, 0);