comparison matroskaenc.c @ 2509:5abcad2566b3 libavformat

Move writing codec private element to its own function
author conrad
date Wed, 05 Sep 2007 00:25:49 +0000
parents 9b96804b67c1
children 4ba8d5f648a4
comparison
equal deleted inserted replaced
2508:9b96804b67c1 2509:5abcad2566b3
468 } 468 }
469 *output_sample_rate = aac_sample_rates[sri]; 469 *output_sample_rate = aac_sample_rates[sri];
470 } 470 }
471 } 471 }
472 472
473 static int mkv_write_codecprivate(ByteIOContext *pb, AVCodecContext *codec, int native_id)
474 {
475 int ret;
476
477 if (native_id) {
478 if (codec->codec_id == CODEC_ID_VORBIS || codec->codec_id == CODEC_ID_THEORA) {
479 ret = put_xiph_codecpriv(pb, codec);
480 if (ret < 0) return ret;
481 } else if (codec->codec_id == CODEC_ID_FLAC) {
482 ret = put_flac_codecpriv(pb, codec);
483 if (ret < 0) return ret;
484 } else if (codec->extradata_size) {
485 put_ebml_binary(pb, MATROSKA_ID_CODECPRIVATE, codec->extradata, codec->extradata_size);
486 }
487 } else if (codec->codec_type == CODEC_TYPE_VIDEO) {
488 ebml_master bmp_header;
489
490 if (!codec->codec_tag)
491 codec->codec_tag = codec_get_tag(codec_bmp_tags, codec->codec_id);
492
493 bmp_header = start_ebml_master(pb, MATROSKA_ID_CODECPRIVATE, 0);
494 put_bmp_header(pb, codec, codec_bmp_tags, 0);
495 end_ebml_master(pb, bmp_header);
496
497 } else if (codec->codec_type == CODEC_TYPE_AUDIO) {
498 ebml_master wav_header;
499
500 codec->codec_tag = codec_get_tag(codec_wav_tags, codec->codec_id);
501 if (!codec->codec_tag) {
502 av_log(codec, AV_LOG_ERROR, "no wav codec id found");
503 return -1;
504 }
505
506 wav_header = start_ebml_master(pb, MATROSKA_ID_CODECPRIVATE, 0);
507 put_wav_header(pb, codec);
508 end_ebml_master(pb, wav_header);
509 }
510 return 0;
511 }
512
473 static int mkv_write_tracks(AVFormatContext *s) 513 static int mkv_write_tracks(AVFormatContext *s)
474 { 514 {
475 MatroskaMuxContext *mkv = s->priv_data; 515 MatroskaMuxContext *mkv = s->priv_data;
476 ByteIOContext *pb = &s->pb; 516 ByteIOContext *pb = &s->pb;
477 ebml_master tracks; 517 ebml_master tracks;
514 native_id = 1; 554 native_id = 1;
515 break; 555 break;
516 } 556 }
517 } 557 }
518 558
519 if (native_id) {
520 if (codec->codec_id == CODEC_ID_VORBIS || codec->codec_id == CODEC_ID_THEORA) {
521 ret = put_xiph_codecpriv(pb, codec);
522 if (ret < 0) return ret;
523 } else if (codec->codec_id == CODEC_ID_FLAC) {
524 ret = put_flac_codecpriv(pb, codec);
525 if (ret < 0) return ret;
526 } else if (codec->extradata_size) {
527 put_ebml_binary(pb, MATROSKA_ID_CODECPRIVATE, codec->extradata, codec->extradata_size);
528 }
529 }
530
531 switch (codec->codec_type) { 559 switch (codec->codec_type) {
532 case CODEC_TYPE_VIDEO: 560 case CODEC_TYPE_VIDEO:
533 put_ebml_uint(pb, MATROSKA_ID_TRACKTYPE, MATROSKA_TRACK_TYPE_VIDEO); 561 put_ebml_uint(pb, MATROSKA_ID_TRACKTYPE, MATROSKA_TRACK_TYPE_VIDEO);
534 562
535 if (!native_id) { 563 if (!native_id) {
536 ebml_master bmp_header;
537 // if there is no mkv-specific codec id, use VFW mode 564 // if there is no mkv-specific codec id, use VFW mode
538 if (!codec->codec_tag)
539 codec->codec_tag = codec_get_tag(codec_bmp_tags, codec->codec_id);
540
541 put_ebml_string(pb, MATROSKA_ID_CODECID, MATROSKA_CODEC_ID_VIDEO_VFW_FOURCC); 565 put_ebml_string(pb, MATROSKA_ID_CODECID, MATROSKA_CODEC_ID_VIDEO_VFW_FOURCC);
542 bmp_header = start_ebml_master(pb, MATROSKA_ID_CODECPRIVATE, 0);
543 put_bmp_header(pb, codec, codec_bmp_tags, 0);
544 end_ebml_master(pb, bmp_header);
545 } 566 }
546 subinfo = start_ebml_master(pb, MATROSKA_ID_TRACKVIDEO, 0); 567 subinfo = start_ebml_master(pb, MATROSKA_ID_TRACKVIDEO, 0);
547 // XXX: interlace flag? 568 // XXX: interlace flag?
548 put_ebml_uint (pb, MATROSKA_ID_VIDEOPIXELWIDTH , codec->width); 569 put_ebml_uint (pb, MATROSKA_ID_VIDEOPIXELWIDTH , codec->width);
549 put_ebml_uint (pb, MATROSKA_ID_VIDEOPIXELHEIGHT, codec->height); 570 put_ebml_uint (pb, MATROSKA_ID_VIDEOPIXELHEIGHT, codec->height);
558 579
559 case CODEC_TYPE_AUDIO: 580 case CODEC_TYPE_AUDIO:
560 put_ebml_uint(pb, MATROSKA_ID_TRACKTYPE, MATROSKA_TRACK_TYPE_AUDIO); 581 put_ebml_uint(pb, MATROSKA_ID_TRACKTYPE, MATROSKA_TRACK_TYPE_AUDIO);
561 582
562 if (!native_id) { 583 if (!native_id) {
563 ebml_master wav_header;
564 // no mkv-specific ID, use ACM mode 584 // no mkv-specific ID, use ACM mode
565 codec->codec_tag = codec_get_tag(codec_wav_tags, codec->codec_id);
566 if (!codec->codec_tag) {
567 av_log(s, AV_LOG_ERROR, "no codec id found for stream %d", i);
568 return -1;
569 }
570
571 put_ebml_string(pb, MATROSKA_ID_CODECID, MATROSKA_CODEC_ID_AUDIO_ACM); 585 put_ebml_string(pb, MATROSKA_ID_CODECID, MATROSKA_CODEC_ID_AUDIO_ACM);
572 wav_header = start_ebml_master(pb, MATROSKA_ID_CODECPRIVATE, 0);
573 put_wav_header(pb, codec);
574 end_ebml_master(pb, wav_header);
575 } 586 }
576 subinfo = start_ebml_master(pb, MATROSKA_ID_TRACKAUDIO, 0); 587 subinfo = start_ebml_master(pb, MATROSKA_ID_TRACKAUDIO, 0);
577 put_ebml_uint (pb, MATROSKA_ID_AUDIOCHANNELS , codec->channels); 588 put_ebml_uint (pb, MATROSKA_ID_AUDIOCHANNELS , codec->channels);
578 put_ebml_float (pb, MATROSKA_ID_AUDIOSAMPLINGFREQ, sample_rate); 589 put_ebml_float (pb, MATROSKA_ID_AUDIOSAMPLINGFREQ, sample_rate);
579 if (output_sample_rate) 590 if (output_sample_rate)
588 break; 599 break;
589 default: 600 default:
590 av_log(s, AV_LOG_ERROR, "Only audio, video, and subtitles are supported for Matroska."); 601 av_log(s, AV_LOG_ERROR, "Only audio, video, and subtitles are supported for Matroska.");
591 break; 602 break;
592 } 603 }
604 ret = mkv_write_codecprivate(pb, codec, native_id);
605 if (ret < 0) return ret;
606
593 end_ebml_master(pb, track); 607 end_ebml_master(pb, track);
594 608
595 // ms precision is the de-facto standard timescale for mkv files 609 // ms precision is the de-facto standard timescale for mkv files
596 av_set_pts_info(st, 64, 1, 1000); 610 av_set_pts_info(st, 64, 1, 1000);
597 } 611 }