Mercurial > libavformat.hg
comparison mxfenc.c @ 3760:fde28855a81e libavformat
Import more ok'ed chunks of the mxf muxer from the soc tree
author | vitor |
---|---|
date | Sun, 24 Aug 2008 05:55:46 +0000 |
parents | 27537074f2a9 |
children | 85d3aca03313 |
comparison
equal
deleted
inserted
replaced
3759:27537074f2a9 | 3760:fde28855a81e |
---|---|
350 mxf_write_refs_count(pb, 2); | 350 mxf_write_refs_count(pb, 2); |
351 mxf_write_uuid(pb, MaterialPackage, 0); | 351 mxf_write_uuid(pb, MaterialPackage, 0); |
352 mxf_write_uuid(pb, SourcePackage, 0); | 352 mxf_write_uuid(pb, SourcePackage, 0); |
353 } | 353 } |
354 | 354 |
355 static void mxf_write_package(AVFormatContext *s, enum MXFMetadataSetType type) | |
356 { | |
357 ByteIOContext *pb = s->pb; | |
358 int i; | |
359 | |
360 if (type == MaterialPackage) { | |
361 mxf_write_metadata_key(pb, 0x013600); | |
362 PRINT_KEY(s, "Material Package key", pb->buf_ptr - 16); | |
363 klv_encode_ber_length(pb, 92 + 16 * s->nb_streams); | |
364 } | |
365 else { | |
366 mxf_write_metadata_key(pb, 0x013700); | |
367 PRINT_KEY(s, "Source Package key", pb->buf_ptr - 16); | |
368 klv_encode_ber_length(pb, 112 + 16 * s->nb_streams); // 20 bytes length for descriptor reference | |
369 } | |
370 | |
371 // write uid | |
372 mxf_write_local_tag(pb, 16, 0x3C0A); | |
373 mxf_write_uuid(pb, type, 0); | |
374 av_log(s,AV_LOG_DEBUG, "package type:%d\n", type); | |
375 PRINT_KEY(s, "package uid", pb->buf_ptr - 16); | |
376 | |
377 // write package umid | |
378 mxf_write_local_tag(pb, 32, 0x4401); | |
379 mxf_write_umid(pb, type, 0); | |
380 PRINT_KEY(s, "package umid second part", pb->buf_ptr - 16); | |
381 // write create date | |
382 mxf_write_local_tag(pb, 8, 0x4405); | |
383 put_be64(pb, 0); | |
384 | |
385 // write modified date | |
386 mxf_write_local_tag(pb, 8, 0x4404); | |
387 put_be64(pb, 0); | |
388 | |
389 // write track refs | |
390 mxf_write_local_tag(pb, s->nb_streams * 16 + 8, 0x4403); | |
391 mxf_write_refs_count(pb, s->nb_streams); | |
392 for (i = 0; i < s->nb_streams; i++) | |
393 mxf_write_uuid(pb, type == MaterialPackage ? Track : Track + TypeBottom, i); | |
394 | |
395 if (type == SourcePackage) { | |
396 // write multiple descriptor reference | |
397 mxf_write_local_tag(pb, 16, 0x4701); | |
398 mxf_write_uuid(pb, MultipleDescriptor, 0); | |
399 } | |
400 } | |
401 | |
402 static void mxf_write_track(AVFormatContext *s, int stream_index, enum MXFMetadataSetType type, int *track_number_sign) | |
403 { | |
404 ByteIOContext *pb = s->pb; | |
405 AVStream *st; | |
406 MXFStreamContext *sc; | |
407 const MXFCodecUL *element; | |
408 int i = 0; | |
409 | |
410 mxf_write_metadata_key(pb, 0x013b00); | |
411 PRINT_KEY(s, "track key", pb->buf_ptr - 16); | |
412 klv_encode_ber_length(pb, 80); | |
413 | |
414 st = s->streams[stream_index]; | |
415 sc = st->priv_data; | |
416 | |
417 // write track uid | |
418 mxf_write_local_tag(pb, 16, 0x3C0A); | |
419 mxf_write_uuid(pb, type == MaterialPackage ? Track : Track + TypeBottom, stream_index); | |
420 PRINT_KEY(s, "track uid", pb->buf_ptr - 16); | |
421 // write track id | |
422 mxf_write_local_tag(pb, 4, 0x4801); | |
423 put_be32(pb, stream_index); | |
424 | |
425 mxf_write_local_tag(pb, 4, 0x4804); | |
426 if (type != MaterialPackage) { | |
427 for (element = mxf_essence_element_key; element->id != CODEC_ID_NONE; element++) { | |
428 if (st->codec->codec_id== element->id) { | |
429 // set essence_element key | |
430 memcpy(sc->track_essence_element_key, element->uid, 16); | |
431 sc->track_essence_element_key[15] += track_number_sign[i]; | |
432 // write track number | |
433 put_buffer(pb, sc->track_essence_element_key + 12, 4); | |
434 | |
435 track_number_sign[i] ++; | |
436 break; | |
437 } | |
438 i++; | |
439 } | |
440 } else { | |
441 put_be32(pb, 0); // track number of material package is 0 | |
442 } | |
443 | |
444 mxf_write_local_tag(pb, 8, 0x4B01); | |
445 put_be32(pb, st->time_base.den); | |
446 put_be32(pb, st->time_base.num); | |
447 | |
448 // write origin | |
449 mxf_write_local_tag(pb, 8, 0x4B02); | |
450 put_be64(pb, 0); | |
451 | |
452 // write sequence refs | |
453 mxf_write_local_tag(pb, 16, 0x4803); | |
454 mxf_write_uuid(pb, type == MaterialPackage ? Sequence: Sequence + TypeBottom, stream_index); | |
455 } | |
456 | |
355 static void mxf_write_common_fields( ByteIOContext *pb, AVStream *st) | 457 static void mxf_write_common_fields( ByteIOContext *pb, AVStream *st) |
356 { | 458 { |
357 const MXFDataDefinitionUL * data_def_ul; | 459 const MXFDataDefinitionUL * data_def_ul; |
358 | 460 |
359 // find data define uls | 461 // find data define uls |
376 klv_encode_ber_length(pb, pkt->size); // write length | 478 klv_encode_ber_length(pb, pkt->size); // write length |
377 put_buffer(pb, pkt->data, pkt->size); // write value | 479 put_buffer(pb, pkt->data, pkt->size); // write value |
378 | 480 |
379 put_flush_packet(pb); | 481 put_flush_packet(pb); |
380 return 0; | 482 return 0; |
483 } | |
484 | |
485 static void mxf_write_sequence(AVFormatContext *s, int stream_index, enum MXFMetadataSetType type) | |
486 { | |
487 ByteIOContext *pb = s->pb; | |
488 AVStream *st; | |
489 | |
490 mxf_write_metadata_key(pb, 0x010f00); | |
491 PRINT_KEY(s, "sequence key", pb->buf_ptr - 16); | |
492 klv_encode_ber_length(pb, 80); | |
493 | |
494 st = s->streams[stream_index]; | |
495 | |
496 mxf_write_local_tag(pb, 16, 0x3C0A); | |
497 mxf_write_uuid(pb, type == MaterialPackage ? Sequence: Sequence + TypeBottom, stream_index); | |
498 | |
499 PRINT_KEY(s, "sequence uid", pb->buf_ptr - 16); | |
500 mxf_write_common_fields(pb, st); | |
501 | |
502 // write structural component | |
503 mxf_write_local_tag(pb, 16 + 8, 0x1001); | |
504 mxf_write_refs_count(pb, 1); | |
505 mxf_write_uuid(pb, type == MaterialPackage ? SourceClip: SourceClip + TypeBottom, stream_index); | |
506 } | |
507 | |
508 static void mxf_write_structural_component(AVFormatContext *s, int stream_index, enum MXFMetadataSetType type) | |
509 { | |
510 ByteIOContext *pb = s->pb; | |
511 AVStream *st; | |
512 int i; | |
513 | |
514 mxf_write_metadata_key(pb, 0x011100); | |
515 PRINT_KEY(s, "sturctural component key", pb->buf_ptr - 16); | |
516 klv_encode_ber_length(pb, 108); | |
517 | |
518 st = s->streams[stream_index]; | |
519 | |
520 // write uid | |
521 mxf_write_local_tag(pb, 16, 0x3C0A); | |
522 mxf_write_uuid(pb, type == MaterialPackage ? SourceClip: SourceClip + TypeBottom, stream_index); | |
523 | |
524 PRINT_KEY(s, "structural component uid", pb->buf_ptr - 16); | |
525 mxf_write_common_fields(pb, st); | |
526 | |
527 // write start_position | |
528 mxf_write_local_tag(pb, 8, 0x1201); | |
529 put_be64(pb, 0); | |
530 | |
531 mxf_write_local_tag(pb, 32, 0x1101); | |
532 if (type == SourcePackage) { | |
533 // write source package uid, end of the reference | |
534 for (i = 0; i < 4; i++) { | |
535 put_be64(pb, 0); | |
536 } | |
537 } else | |
538 mxf_write_umid(pb, SourcePackage, 0); | |
539 | |
540 mxf_write_local_tag(pb, 4, 0x1102); | |
541 if (type == SourcePackage) | |
542 // write source track id | |
543 put_be32(pb, 0); | |
544 else | |
545 put_be32(pb, stream_index); | |
381 } | 546 } |
382 | 547 |
383 static void mxf_write_multi_descriptor(AVFormatContext *s) | 548 static void mxf_write_multi_descriptor(AVFormatContext *s) |
384 { | 549 { |
385 ByteIOContext *pb = s->pb; | 550 ByteIOContext *pb = s->pb; |
539 mxf_build_structural_metadata(s, MaterialPackage); | 704 mxf_build_structural_metadata(s, MaterialPackage); |
540 mxf_build_structural_metadata(s, SourcePackage); | 705 mxf_build_structural_metadata(s, SourcePackage); |
541 return 0; | 706 return 0; |
542 } | 707 } |
543 | 708 |
709 static void mxf_write_partition(AVFormatContext *s, int64_t byte_position, int bodysid, const uint8_t *key) | |
710 { | |
711 MXFContext *mxf = s->priv_data; | |
712 ByteIOContext *pb = s->pb; | |
713 // write klv | |
714 put_buffer(pb, key, 16); | |
715 if (!mxf->essence_container_count) | |
716 mxf->essence_container_count = mxf_write_essence_container_refs(s, 0); | |
717 klv_encode_ber_length(pb, 88 + 16 * mxf->essence_container_count); | |
718 | |
719 // write partition value | |
720 put_be16(pb, 1); // majorVersion | |
721 put_be16(pb, 2); // minorVersion | |
722 put_be32(pb, 1); // kagSize | |
723 | |
724 put_be64(pb, byte_position); // thisPartition | |
725 put_be64(pb, 0); // previousPartition | |
726 | |
727 // set offset | |
728 if (!byte_position) | |
729 mxf->header_footer_partition_offset = url_ftell(pb); | |
730 put_be64(pb, byte_position); // footerPartition,update later | |
731 | |
732 // set offset | |
733 if (!byte_position) | |
734 mxf->header_byte_count_offset = url_ftell(pb); | |
735 put_be64(pb, 0); // headerByteCount, update later | |
736 | |
737 // no indexTable | |
738 put_be64(pb, 0); // indexByteCount | |
739 put_be32(pb, 0); // indexSID | |
740 put_be64(pb, 0); // bodyOffset | |
741 | |
742 put_be32(pb, bodysid); // bodySID | |
743 put_buffer(pb, op1a_ul, 16); // operational pattern | |
744 | |
745 // essence container | |
746 mxf_write_essence_container_refs(s, 1); | |
747 } | |
748 | |
544 static int mux_write_header(AVFormatContext *s) | 749 static int mux_write_header(AVFormatContext *s) |
545 { | 750 { |
546 MXFContext *mxf = s->priv_data; | 751 MXFContext *mxf = s->priv_data; |
547 ByteIOContext *pb = s->pb; | 752 ByteIOContext *pb = s->pb; |
548 int64_t header_metadata_start, offset_now; | 753 int64_t header_metadata_start, offset_now; |