Mercurial > libavformat.hg
comparison matroskaenc.c @ 2501:b91eb35b1237 libavformat
Pass the returned error code of functions up
author | conrad |
---|---|
date | Wed, 05 Sep 2007 00:25:32 +0000 |
parents | 57954e76863d |
children | 3230f4c53b17 |
comparison
equal
deleted
inserted
replaced
2500:57954e76863d | 2501:b91eb35b1237 |
---|---|
478 static int mkv_write_tracks(AVFormatContext *s) | 478 static int mkv_write_tracks(AVFormatContext *s) |
479 { | 479 { |
480 MatroskaMuxContext *mkv = s->priv_data; | 480 MatroskaMuxContext *mkv = s->priv_data; |
481 ByteIOContext *pb = &s->pb; | 481 ByteIOContext *pb = &s->pb; |
482 ebml_master tracks; | 482 ebml_master tracks; |
483 int i, j; | 483 int i, j, ret; |
484 | 484 |
485 if (mkv_add_seekhead_entry(mkv->main_seekhead, MATROSKA_ID_TRACKS, url_ftell(pb)) < 0) | 485 ret = mkv_add_seekhead_entry(mkv->main_seekhead, MATROSKA_ID_TRACKS, url_ftell(pb)); |
486 return -1; | 486 if (ret < 0) return ret; |
487 | 487 |
488 tracks = start_ebml_master(pb, MATROSKA_ID_TRACKS, 0); | 488 tracks = start_ebml_master(pb, MATROSKA_ID_TRACKS, 0); |
489 for (i = 0; i < s->nb_streams; i++) { | 489 for (i = 0; i < s->nb_streams; i++) { |
490 AVStream *st = s->streams[i]; | 490 AVStream *st = s->streams[i]; |
491 AVCodecContext *codec = st->codec; | 491 AVCodecContext *codec = st->codec; |
521 } | 521 } |
522 } | 522 } |
523 | 523 |
524 if (native_id) { | 524 if (native_id) { |
525 if (codec->codec_id == CODEC_ID_VORBIS || codec->codec_id == CODEC_ID_THEORA) { | 525 if (codec->codec_id == CODEC_ID_VORBIS || codec->codec_id == CODEC_ID_THEORA) { |
526 if (put_xiph_codecpriv(pb, codec) < 0) | 526 ret = put_xiph_codecpriv(pb, codec); |
527 return -1; | 527 if (ret < 0) return ret; |
528 } else if (codec->codec_id == CODEC_ID_FLAC) { | 528 } else if (codec->codec_id == CODEC_ID_FLAC) { |
529 if (put_flac_codecpriv(pb, codec) < 0) | 529 ret = put_flac_codecpriv(pb, codec); |
530 return -1; | 530 if (ret < 0) return ret; |
531 } else if (codec->extradata_size) { | 531 } else if (codec->extradata_size) { |
532 put_ebml_binary(pb, MATROSKA_ID_CODECPRIVATE, codec->extradata, codec->extradata_size); | 532 put_ebml_binary(pb, MATROSKA_ID_CODECPRIVATE, codec->extradata, codec->extradata_size); |
533 } | 533 } |
534 } | 534 } |
535 | 535 |
606 static int mkv_write_header(AVFormatContext *s) | 606 static int mkv_write_header(AVFormatContext *s) |
607 { | 607 { |
608 MatroskaMuxContext *mkv = s->priv_data; | 608 MatroskaMuxContext *mkv = s->priv_data; |
609 ByteIOContext *pb = &s->pb; | 609 ByteIOContext *pb = &s->pb; |
610 ebml_master ebml_header, segment_info; | 610 ebml_master ebml_header, segment_info; |
611 int ret; | |
611 | 612 |
612 mkv->md5_ctx = av_mallocz(av_md5_size); | 613 mkv->md5_ctx = av_mallocz(av_md5_size); |
613 av_md5_init(mkv->md5_ctx); | 614 av_md5_init(mkv->md5_ctx); |
614 | 615 |
615 ebml_header = start_ebml_master(pb, EBML_ID_HEADER, 0); | 616 ebml_header = start_ebml_master(pb, EBML_ID_HEADER, 0); |
633 mkv->main_seekhead = mkv_start_seekhead(pb, mkv->segment_offset, 10); | 634 mkv->main_seekhead = mkv_start_seekhead(pb, mkv->segment_offset, 10); |
634 mkv->cluster_seekhead = mkv_start_seekhead(pb, mkv->segment_offset, 0); | 635 mkv->cluster_seekhead = mkv_start_seekhead(pb, mkv->segment_offset, 0); |
635 if (mkv->main_seekhead == NULL || mkv->cluster_seekhead == NULL) | 636 if (mkv->main_seekhead == NULL || mkv->cluster_seekhead == NULL) |
636 return AVERROR(ENOMEM); | 637 return AVERROR(ENOMEM); |
637 | 638 |
638 if (mkv_add_seekhead_entry(mkv->main_seekhead, MATROSKA_ID_INFO, url_ftell(pb)) < 0) | 639 ret = mkv_add_seekhead_entry(mkv->main_seekhead, MATROSKA_ID_INFO, url_ftell(pb)); |
639 return -1; | 640 if (ret < 0) return ret; |
640 | 641 |
641 segment_info = start_ebml_master(pb, MATROSKA_ID_INFO, 0); | 642 segment_info = start_ebml_master(pb, MATROSKA_ID_INFO, 0); |
642 put_ebml_uint(pb, MATROSKA_ID_TIMECODESCALE, 1000000); | 643 put_ebml_uint(pb, MATROSKA_ID_TIMECODESCALE, 1000000); |
643 if (strlen(s->title)) | 644 if (strlen(s->title)) |
644 put_ebml_string(pb, MATROSKA_ID_TITLE, s->title); | 645 put_ebml_string(pb, MATROSKA_ID_TITLE, s->title); |
655 mkv->duration = 0; | 656 mkv->duration = 0; |
656 mkv->duration_offset = url_ftell(pb); | 657 mkv->duration_offset = url_ftell(pb); |
657 put_ebml_void(pb, 11); // assumes double-precision float to be written | 658 put_ebml_void(pb, 11); // assumes double-precision float to be written |
658 end_ebml_master(pb, segment_info); | 659 end_ebml_master(pb, segment_info); |
659 | 660 |
660 if (mkv_write_tracks(s) < 0) | 661 ret = mkv_write_tracks(s); |
661 return -1; | 662 if (ret < 0) return ret; |
662 | 663 |
663 if (mkv_add_seekhead_entry(mkv->cluster_seekhead, MATROSKA_ID_CLUSTER, url_ftell(pb)) < 0) | 664 ret = mkv_add_seekhead_entry(mkv->cluster_seekhead, MATROSKA_ID_CLUSTER, url_ftell(pb)); |
664 return -1; | 665 if (ret < 0) return ret; |
665 | 666 |
666 mkv->cluster_pos = url_ftell(pb); | 667 mkv->cluster_pos = url_ftell(pb); |
667 mkv->cluster = start_ebml_master(pb, MATROSKA_ID_CLUSTER, 0); | 668 mkv->cluster = start_ebml_master(pb, MATROSKA_ID_CLUSTER, 0); |
668 put_ebml_uint(pb, MATROSKA_ID_CLUSTERTIMECODE, 0); | 669 put_ebml_uint(pb, MATROSKA_ID_CLUSTERTIMECODE, 0); |
669 mkv->cluster_pts = 0; | 670 mkv->cluster_pts = 0; |
711 { | 712 { |
712 MatroskaMuxContext *mkv = s->priv_data; | 713 MatroskaMuxContext *mkv = s->priv_data; |
713 ByteIOContext *pb = &s->pb; | 714 ByteIOContext *pb = &s->pb; |
714 AVCodecContext *codec = s->streams[pkt->stream_index]->codec; | 715 AVCodecContext *codec = s->streams[pkt->stream_index]->codec; |
715 int keyframe = !!(pkt->flags & PKT_FLAG_KEY); | 716 int keyframe = !!(pkt->flags & PKT_FLAG_KEY); |
717 int ret; | |
716 | 718 |
717 // start a new cluster every 5 MB or 5 sec | 719 // start a new cluster every 5 MB or 5 sec |
718 if (url_ftell(pb) > mkv->cluster_pos + 5*1024*1024 || pkt->pts > mkv->cluster_pts + 5000) { | 720 if (url_ftell(pb) > mkv->cluster_pos + 5*1024*1024 || pkt->pts > mkv->cluster_pts + 5000) { |
719 av_log(s, AV_LOG_DEBUG, "Starting new cluster at offset %" PRIu64 " bytes, pts %" PRIu64 "\n", url_ftell(pb), pkt->pts); | 721 av_log(s, AV_LOG_DEBUG, "Starting new cluster at offset %" PRIu64 " bytes, pts %" PRIu64 "\n", url_ftell(pb), pkt->pts); |
720 end_ebml_master(pb, mkv->cluster); | 722 end_ebml_master(pb, mkv->cluster); |
721 | 723 |
722 if (mkv_add_seekhead_entry(mkv->cluster_seekhead, MATROSKA_ID_CLUSTER, url_ftell(pb)) < 0) | 724 ret = mkv_add_seekhead_entry(mkv->cluster_seekhead, MATROSKA_ID_CLUSTER, url_ftell(pb)); |
723 return -1; | 725 if (ret < 0) return ret; |
724 | 726 |
725 mkv->cluster_pos = url_ftell(pb); | 727 mkv->cluster_pos = url_ftell(pb); |
726 mkv->cluster = start_ebml_master(pb, MATROSKA_ID_CLUSTER, 0); | 728 mkv->cluster = start_ebml_master(pb, MATROSKA_ID_CLUSTER, 0); |
727 put_ebml_uint(pb, MATROSKA_ID_CLUSTERTIMECODE, pkt->pts); | 729 put_ebml_uint(pb, MATROSKA_ID_CLUSTERTIMECODE, pkt->pts); |
728 mkv->cluster_pts = pkt->pts; | 730 mkv->cluster_pts = pkt->pts; |
737 put_ebml_uint(pb, MATROSKA_ID_DURATION, pkt->duration); | 739 put_ebml_uint(pb, MATROSKA_ID_DURATION, pkt->duration); |
738 end_ebml_master(pb, blockgroup); | 740 end_ebml_master(pb, blockgroup); |
739 } | 741 } |
740 | 742 |
741 if (codec->codec_type == CODEC_TYPE_VIDEO && keyframe) { | 743 if (codec->codec_type == CODEC_TYPE_VIDEO && keyframe) { |
742 if (mkv_add_cuepoint(mkv->cues, pkt, mkv->cluster_pos) < 0) | 744 ret = mkv_add_cuepoint(mkv->cues, pkt, mkv->cluster_pos); |
743 return -1; | 745 if (ret < 0) return ret; |
744 } | 746 } |
745 | 747 |
746 mkv->duration = pkt->pts + pkt->duration; | 748 mkv->duration = pkt->pts + pkt->duration; |
747 return 0; | 749 return 0; |
748 } | 750 } |