Mercurial > libavformat.hg
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 } |