Lines Matching defs:mxf
59 #include "mxf.h"
436 MXFContext *mxf = s->priv_data;
438 avio_wb24(s->pb, mxf->instance_number);
439 avio_write(s->pb, mxf->umid, 15);
514 static void mxf_mark_tag_unused(MXFContext *mxf, int tag)
517 mxf->unused_tags[pair - mxf_local_tag_batch] = 1;
522 MXFContext *mxf = s->priv_data;
537 if (!mxf->store_user_comments) {
538 mxf_mark_tag_unused(mxf, 0x4406);
539 mxf_mark_tag_unused(mxf, 0x5001);
540 mxf_mark_tag_unused(mxf, 0x5003);
544 mxf_mark_tag_unused(mxf, 0x8100);
545 mxf_mark_tag_unused(mxf, 0x8200);
546 mxf_mark_tag_unused(mxf, 0x8201);
547 mxf_mark_tag_unused(mxf, 0x8202);
551 mxf_mark_tag_unused(mxf, 0x8301);
552 mxf_mark_tag_unused(mxf, 0x8302);
553 mxf_mark_tag_unused(mxf, 0x8303);
554 mxf_mark_tag_unused(mxf, 0x8304);
558 if (mxf->unused_tags[i]) {
570 if (mxf->unused_tags[i] == 0) {
579 MXFContext *mxf = s->priv_data;
584 av_assert0(mxf->unused_tags[pair - mxf_local_tag_batch] == 0);
634 MXFContext *mxf = s->priv_data;
639 klv_encode_ber_length(pb, 138 + 16LL * DESCRIPTOR_COUNT(mxf->essence_container_count));
648 avio_wb64(pb, mxf->timestamp);
675 mxf_write_local_tag(s, 8 + 16LL * DESCRIPTOR_COUNT(mxf->essence_container_count), 0x3B0A);
761 MXFContext *mxf = s->priv_data;
806 avio_wb64(pb, mxf->timestamp);
841 MXFContext *mxf = s->priv_data;
851 mxf_write_uuid(pb, Track, mxf->track_instance_count);
868 if (st == mxf->timecode_track && s->oformat == &ff_mxf_opatom_muxer) {
869 avio_wb32(pb, mxf->tc.rate.num);
870 avio_wb32(pb, mxf->tc.rate.den);
872 avio_wb32(pb, mxf->time_base.den);
873 avio_wb32(pb, mxf->time_base.num);
882 mxf_write_uuid(pb, Sequence, mxf->track_instance_count);
889 MXFContext *mxf = s->priv_data;
894 if (st == mxf->timecode_track)
904 if (st != mxf->timecode_track && s->oformat == &ff_mxf_opatom_muxer && st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
905 avio_wb64(pb, mxf->body_offset / mxf->edit_unit_byte_count);
907 avio_wb64(pb, mxf->duration);
913 MXFContext *mxf = s->priv_data;
922 mxf_write_uuid(pb, Sequence, mxf->track_instance_count);
930 if (st == mxf->timecode_track)
935 mxf_write_uuid(pb, component, mxf->track_instance_count);
940 MXFContext *mxf = s->priv_data;
948 mxf_write_uuid(pb, TimecodeComponent, mxf->track_instance_count);
954 avio_wb64(pb, mxf->tc.start);
958 avio_wb16(pb, mxf->timecode_base);
962 avio_w8(pb, !!(mxf->tc.flags & AV_TIMECODE_FLAG_DROPFRAME));
967 MXFContext *mxf = s->priv_data;
976 mxf_write_uuid(pb, SourceClip, mxf->track_instance_count);
1015 MXFContext *mxf = s->priv_data;
1030 avio_wb32(pb, mxf->time_base.den);
1031 avio_wb32(pb, mxf->time_base.num);
1035 if (mxf->essence_container_count > 1)
1052 MXFContext *mxf = s->priv_data;
1069 avio_wb32(pb, mxf->time_base.den);
1070 avio_wb32(pb, mxf->time_base.num);
1077 avio_wb32(pb, mxf->time_base.den);
1078 avio_wb32(pb, mxf->time_base.num);
1433 MXFContext *mxf = s->priv_data;
1434 int show_warnings = !mxf->footer_partition_offset;
1439 avio_wb64(pb, mxf->body_offset / mxf->edit_unit_byte_count);
1457 if (mxf->channel_count == -1) {
1464 if (show_warnings && (mxf->channel_count < st->codecpar->ch_layout.nb_channels))
1466 if (show_warnings && (mxf->channel_count != 4) && (mxf->channel_count != 8))
1468 avio_wb32(pb, mxf->channel_count);
1516 MXFContext *mxf = s->priv_data;
1529 mxf_write_uuid(pb, TaggedValue, mxf->tagged_value_count);
1539 mxf->tagged_value_count++;
1545 MXFContext *mxf = s->priv_data;
1550 if (mxf->tagged_value_count >= UINT16_MAX) {
1563 MXFContext *mxf = s->priv_data;
1570 if (mxf->store_user_comments)
1574 klv_encode_ber_length(pb, 92 + name_size + (16*track_count) + (16*user_comment_count) + 12LL*mxf->store_user_comments);
1578 klv_encode_ber_length(pb, 112 + name_size + (16*track_count) + 12LL*mxf->store_user_comments); // 20 bytes length for descriptor reference
1598 avio_wb64(pb, mxf->timestamp);
1602 avio_wb64(pb, mxf->timestamp);
1609 mxf_write_uuid(pb, Track, mxf->track_instance_count + i);
1612 if (mxf->store_user_comments) {
1616 mxf_write_uuid(pb, TaggedValue, mxf->tagged_value_count - user_comment_count + i);
1636 * there instance uuids. mxf->track_instance_count stores this value.
1637 * mxf->track_instance_count is incremented after a group of all 3 of
1642 mxf_write_track(s, mxf->timecode_track, package);
1643 mxf_write_sequence(s, mxf->timecode_track, package);
1644 mxf_write_timecode_component(s, mxf->timecode_track, package);
1645 mxf->track_instance_count++;
1652 mxf->track_instance_count++;
1685 MXFContext *mxf = s->priv_data;
1725 mxf->track_instance_count = 0;
1743 MXFContext *mxf = s->priv_data;
1746 int key_index = mxf->last_key_index;
1751 av_log(s, AV_LOG_DEBUG, "edit units count %d\n", mxf->edit_units_count);
1753 if (!mxf->edit_units_count && !mxf->edit_unit_byte_count)
1763 mxf_write_uuid(pb, IndexTableSegment, mxf->last_indexed_edit_unit);
1767 avio_wb32(pb, mxf->time_base.den);
1768 avio_wb32(pb, mxf->time_base.num);
1772 avio_wb64(pb, mxf->last_indexed_edit_unit);
1776 if (mxf->edit_unit_byte_count)
1779 avio_wb64(pb, mxf->edit_units_count);
1783 avio_wb32(pb, mxf->edit_unit_byte_count);
1795 avio_w8(pb, !mxf->edit_unit_byte_count); // only one slice for CBR
1812 if (mxf->edit_unit_byte_count) {
1828 if (!mxf->edit_unit_byte_count) {
1830 mxf_write_local_tag(s, 8 + mxf->edit_units_count*15, 0x3F0A);
1831 avio_wb32(pb, mxf->edit_units_count); // num of entries
1834 for (i = 0; i < mxf->edit_units_count; i++) {
1837 if (!(mxf->index_entries[i].flags & 0x33)) { // I-frame
1838 sc->max_gop = FFMAX(sc->max_gop, i - mxf->last_key_index);
1839 mxf->last_key_index = key_index;
1845 if (pic_num_in_gop != mxf->index_entries[i].temporal_ref) {
1846 for (j = key_index; j < mxf->edit_units_count; j++) {
1847 if (pic_num_in_gop == mxf->index_entries[j].temporal_ref)
1850 if (j == mxf->edit_units_count)
1857 if ((mxf->index_entries[i].flags & 0x30) == 0x30) { // back and forward prediction
1859 avio_w8(pb, mxf->last_key_index - i);
1862 if ((mxf->index_entries[i].flags & 0x20) == 0x20) // only forward
1863 mxf->last_key_index = key_index;
1867 if (!(mxf->index_entries[i].flags & 0x33) && // I-frame
1868 mxf->index_entries[i].flags & 0x40 && !temporal_offset)
1869 mxf->index_entries[i].flags |= 0x80; // random access
1870 avio_w8(pb, mxf->index_entries[i].flags);
1872 avio_wb64(pb, mxf->index_entries[i].offset);
1874 avio_wb32(pb, mxf->index_entries[i].slice_offset);
1879 mxf->last_key_index = key_index - mxf->edit_units_count;
1880 mxf->last_indexed_edit_unit += mxf->edit_units_count;
1881 mxf->edit_units_count = 0;
1903 MXFContext *mxf = s->priv_data;
1910 if (!mxf->edit_unit_byte_count && mxf->edit_units_count)
1912 12+mxf->edit_units_count*15;
1913 else if (mxf->edit_unit_byte_count && indexsid)
1922 if ((err = av_reallocp_array(&mxf->body_partition_offset, mxf->body_partitions_count + 1,
1923 sizeof(*mxf->body_partition_offset))) < 0) {
1924 mxf->body_partitions_count = 0;
1927 mxf->body_partition_offset[mxf->body_partitions_count++] = partition_offset;
1936 klv_encode_ber4_length(pb, 88 + 16LL * DESCRIPTOR_COUNT(mxf->essence_container_count));
1945 if (key && !memcmp(key, body_partition_key, 16) && mxf->body_partitions_count > 1)
1946 avio_wb64(pb, mxf->body_partition_offset[mxf->body_partitions_count-2]); // PreviousPartition
1947 else if (key && !memcmp(key, footer_partition_key, 16) && mxf->body_partitions_count)
1948 avio_wb64(pb, mxf->body_partition_offset[mxf->body_partitions_count-1]); // PreviousPartition
1952 avio_wb64(pb, mxf->footer_partition_offset); // footerPartition
1963 if (bodysid && mxf->edit_units_count && mxf->body_partitions_count && s->oformat != &ff_mxf_opatom_muxer)
1964 avio_wb64(pb, mxf->body_offset);
2018 MXFContext *mxf = s->priv_data;
2022 if (mxf->header_written)
2069 MXFContext *mxf = s->priv_data;
2073 if (mxf->header_written)
2140 MXFContext *mxf = s->priv_data;
2145 if (mxf->header_written)
2234 MXFContext *mxf = s->priv_data;
2255 if (mxf->header_written)
2307 if (mxf->header_written)
2321 mxf->cbr_index = 1;
2465 MXFContext *mxf = s->priv_data;
2469 AV_WB64(mxf->umid , umid);
2470 AV_WB64(mxf->umid+8, umid>>8);
2472 mxf->instance_number = seed & 0xFFFFFF;
2477 MXFContext *mxf = s->priv_data;
2489 mxf->timecode_base = (tbc.den + tbc.num/2) / tbc.num;
2494 return av_timecode_init_from_string(&mxf->tc, av_inv_q(tbc), tcr->value, s);
2496 return av_timecode_init(&mxf->tc, av_inv_q(tbc), 0, 0, s);
2530 MXFContext *mxf = s->priv_data;
2536 av_log(s, AV_LOG_ERROR, "there must be exactly one stream for mxf opatom\n");
2541 mxf->store_user_comments = 0;
2583 mxf->content_package_rate = ff_mxf_get_content_package_rate(tbc);
2584 mxf->time_base = tbc;
2585 avpriv_set_pts_info(st, 64, mxf->time_base.num, mxf->time_base.den);
2598 mxf->cbr_index = 1;
2601 int ntsc = mxf->time_base.den != 25;
2608 if ((sc->video_bit_rate == 50000000) && (mxf->time_base.den == 25)) {
2627 mxf->time_base.num / (8*mxf->time_base.den);
2629 if (mxf->signal_standard >= 0)
2630 sc->signal_standard = mxf->signal_standard;
2649 sc->frame_size = 4 + 8 * av_rescale_rnd(st->codecpar->sample_rate, mxf->time_base.num, mxf->time_base.den, AV_ROUND_UP) * 4;
2651 AVRational tbc = av_inv_q(mxf->audio_edit_rate);
2663 mxf->time_base = st->time_base;
2667 mxf->edit_unit_byte_count = (av_get_bits_per_sample(st->codecpar->codec_id) * st->codecpar->ch_layout.nb_channels) >> 3;
2670 mxf->slice_count = 1;
2672 av_rescale_rnd(st->codecpar->sample_rate, mxf->time_base.num, mxf->time_base.den, AV_ROUND_UP) *
2675 snprintf(bsf_arg, sizeof(bsf_arg), "r=%d/%d", mxf->tc.rate.num, mxf->tc.rate.den);
2712 // and produce mxf files with the most relevant flavour for opatom
2718 mxf->essence_container_count++;
2723 mxf->essence_container_count = 1;
2740 mxf->timestamp = mxf_parse_timestamp(timestamp);
2741 mxf->duration = -1;
2743 mxf->timecode_track = av_mallocz(sizeof(*mxf->timecode_track));
2744 if (!mxf->timecode_track)
2746 mxf->timecode_track->priv_data = &mxf->timecode_track_priv;
2747 mxf->timecode_track->index = -1;
2757 MXFContext *mxf = s->priv_data;
2763 frame = mxf->last_indexed_edit_unit + mxf->edit_units_count;
2776 avio_w8(pb, mxf->content_package_rate); // content package rate
2780 if (mxf->essence_container_count > 1)
2791 time_code = av_timecode_get_smpte_from_framenum(&mxf->tc, frame);
2806 MXFContext *mxf = s->priv_data;
2815 avio_w8(pb, (frame_size == 1920 ? 0 : (mxf->edit_units_count-1) % 5 + 1));
2838 MXFContext *mxf = s->priv_data;
2846 if (!mxf->header_written)
2853 klv_encode_ber9_length(pb, mxf->body_offset);
2859 MXFContext *mxf = s->priv_data;
2864 if (!mxf->header_written) {
2871 mxf->header_written = 1;
2874 if (!mxf->edit_unit_byte_count) {
2875 mxf->index_entries[mxf->edit_units_count].offset = mxf->body_offset;
2876 mxf->index_entries[mxf->edit_units_count].flags = ie->flags;
2877 mxf->index_entries[mxf->edit_units_count].temporal_ref = ie->temporal_ref;
2879 mxf->edit_units_count++;
2881 mxf->body_offset += pkt->size;
2888 MXFContext *mxf = s->priv_data;
2893 mxf->edit_unit_byte_count = sc->frame_size;
2897 mxf->edit_unit_byte_count = KAG_SIZE; // system element
2901 sc->slice_offset = mxf->edit_unit_byte_count;
2902 mxf->edit_unit_byte_count += 16 + 4 + sc->frame_size;
2903 mxf->edit_unit_byte_count += klv_fill_size(mxf->edit_unit_byte_count);
2909 MXFContext *mxf = s->priv_data;
2916 if (!mxf->header_written && pkt->stream_index != 0 &&
2923 if (!mxf->cbr_index && !mxf->edit_unit_byte_count && !(mxf->edit_units_count % EDIT_UNITS_PER_BODY)) {
2924 if ((err = av_reallocp_array(&mxf->index_entries, mxf->edit_units_count
2925 + EDIT_UNITS_PER_BODY, sizeof(*mxf->index_entries))) < 0) {
2926 mxf->edit_units_count = 0;
2959 if (mxf->cbr_index) {
2965 if (!mxf->header_written)
2972 if (!mxf->header_written) {
2973 if (mxf->edit_unit_byte_count) {
2982 mxf->header_written = 1;
2986 if (!mxf->edit_unit_byte_count &&
2987 (!mxf->edit_units_count || mxf->edit_units_count > EDIT_UNITS_PER_BODY) &&
2999 if (!mxf->edit_unit_byte_count) {
3000 mxf->index_entries[mxf->edit_units_count].offset = mxf->body_offset;
3001 mxf->index_entries[mxf->edit_units_count].flags = ie.flags;
3002 mxf->index_entries[mxf->edit_units_count].temporal_ref = ie.temporal_ref;
3003 mxf->body_offset += KAG_SIZE; // size of system element
3005 mxf->edit_units_count++;
3006 } else if (!mxf->edit_unit_byte_count && st->index == 1) {
3007 if (!mxf->edit_units_count) {
3011 mxf->index_entries[mxf->edit_units_count-1].slice_offset =
3012 mxf->body_offset - mxf->index_entries[mxf->edit_units_count-1].offset;
3023 mxf->body_offset += 16+4+pkt->size + klv_fill_size(16+4+pkt->size);
3031 MXFContext *mxf = s->priv_data;
3037 klv_encode_ber_length(pb, 28 + 12LL*mxf->body_partitions_count);
3039 if (mxf->edit_unit_byte_count && s->oformat != &ff_mxf_opatom_muxer)
3045 for (i = 0; i < mxf->body_partitions_count; i++) {
3047 avio_wb64(pb, mxf->body_partition_offset[i]);
3051 avio_wb64(pb, mxf->footer_partition_offset);
3058 MXFContext *mxf = s->priv_data;
3062 if (!mxf->header_written ||
3063 (s->oformat == &ff_mxf_opatom_muxer && !mxf->body_partition_offset)) {
3068 mxf->duration = mxf->last_indexed_edit_unit + mxf->edit_units_count;
3071 mxf->footer_partition_offset = avio_tell(pb);
3072 if (mxf->edit_unit_byte_count && s->oformat != &ff_mxf_opatom_muxer) { // no need to repeat index
3088 avio_seek(pb, mxf->body_partition_offset[0], SEEK_SET);
3094 if (mxf->edit_unit_byte_count && s->oformat != &ff_mxf_opatom_muxer) {
3104 for (i = 0; i < mxf->body_partitions_count; i++) {
3105 avio_seek(pb, mxf->body_partition_offset[i]+44, SEEK_SET);
3106 avio_wb64(pb, mxf->footer_partition_offset);
3115 MXFContext *mxf = s->priv_data;
3117 av_freep(&mxf->index_entries);
3118 av_freep(&mxf->body_partition_offset);
3119 av_freep(&mxf->timecode_track);
3263 .name = "mxf",
3265 .mime_type = "application/mxf",
3266 .extensions = "mxf",
3282 .mime_type = "application/mxf",
3298 .mime_type = "application/mxf",
3299 .extensions = "mxf",