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 }