typedef struct MXFContext {
int64_t footer_partition_offset;
int essence_container_count;
- uint8_t essence_containers_indices[FF_ARRAY_ELEMS(mxf_essence_container_uls)];
AVRational time_base;
int header_written;
MXFIndexEntry *index_entries;
mxf_write_refs_count(pb, c->essence_container_count);
av_log(s,AV_LOG_DEBUG, "essence container count:%d\n", c->essence_container_count);
for (i = 0; i < c->essence_container_count; i++) {
- put_buffer(pb, mxf_essence_container_uls[c->essence_containers_indices[i]].container_ul, 16);
- PRINT_KEY(s, "essence container ul:\n", mxf_essence_container_uls[c->essence_containers_indices[i]].container_ul);
+ MXFStreamContext *sc = s->streams[i]->priv_data;
+ put_buffer(pb, mxf_essence_container_uls[sc->index].container_ul, 16);
}
}
mxf_write_local_tag(pb, 16, 0x3004);
if (mxf->essence_container_count > 1)
ul = multiple_desc_ul;
- else
- ul = mxf_essence_container_uls[mxf->essence_containers_indices[0]].container_ul;
+ else {
+ MXFStreamContext *sc = s->streams[0]->priv_data;
+ ul = mxf_essence_container_uls[sc->index].container_ul;
+ }
put_buffer(pb, ul, 16);
// write sub descriptor refs
sc->codec_ul = &mxf_essence_container_uls[sc->index].codec_ul;
if (!present[sc->index]) {
- mxf->essence_containers_indices[mxf->essence_container_count++] = sc->index;
present[sc->index] = 1;
+ mxf->essence_container_count++;
} else
present[sc->index]++;
put_be16(pb, frame); // continuity count
if (mxf->essence_container_count > 1)
put_buffer(pb, multiple_desc_ul, 16);
- else
- put_buffer(pb, mxf_essence_container_uls[mxf->essence_containers_indices[0]].container_ul, 16);
+ else {
+ MXFStreamContext *sc = s->streams[0]->priv_data;
+ put_buffer(pb, mxf_essence_container_uls[sc->index].container_ul, 16);
+ }
put_byte(pb, 0);
put_be64(pb, 0);
put_be64(pb, 0); // creation date/time stamp
mxf->edit_units_count++;
} else if (st->index == 1) {
- mxf->index_entries[mxf->edit_units_count-1].slice_offset =
- url_ftell(pb) - mxf->index_entries[mxf->edit_units_count-1].offset;
+ uint64_t pos = url_ftell(pb);
+ mxf->index_entries[mxf->edit_units_count-1].slice_offset = pos +
+ klv_fill_size(pos) - mxf->index_entries[mxf->edit_units_count-1].offset;
}
mxf_write_klv_fill(s);
AVOutputFormat mxf_muxer = {
"mxf",
NULL_IF_CONFIG_SMALL("Material eXchange Format"),
- NULL,
+ "application/mxf",
"mxf",
sizeof(MXFContext),
CODEC_ID_PCM_S16LE,