Mercurial > libavformat.hg
comparison matroskaenc.c @ 5745:c31eb582165d libavformat
Simplify starting and ending clusters
author | conrad |
---|---|
date | Thu, 04 Mar 2010 08:53:08 +0000 |
parents | a656843c86aa |
children | 89acf6c8fe9f |
comparison
equal
deleted
inserted
replaced
5744:a656843c86aa | 5745:c31eb582165d |
---|---|
723 if (ret < 0) return ret; | 723 if (ret < 0) return ret; |
724 | 724 |
725 ret = mkv_write_chapters(s); | 725 ret = mkv_write_chapters(s); |
726 if (ret < 0) return ret; | 726 if (ret < 0) return ret; |
727 | 727 |
728 ret = mkv_add_seekhead_entry(mkv->cluster_seekhead, MATROSKA_ID_CLUSTER, url_ftell(pb)); | |
729 if (ret < 0) return ret; | |
730 | |
731 mkv->cluster_pos = url_ftell(pb); | |
732 mkv->cluster = start_ebml_master(pb, MATROSKA_ID_CLUSTER, 0); | |
733 put_ebml_uint(pb, MATROSKA_ID_CLUSTERTIMECODE, 0); | |
734 mkv->cluster_pts = 0; | |
735 | |
736 if (url_is_streamed(s->pb)) | 728 if (url_is_streamed(s->pb)) |
737 mkv_write_seekhead(pb, mkv->main_seekhead); | 729 mkv_write_seekhead(pb, mkv->main_seekhead); |
738 | 730 |
739 mkv->cues = mkv_start_cues(mkv->segment_offset); | 731 mkv->cues = mkv_start_cues(mkv->segment_offset); |
740 if (mkv->cues == NULL) | 732 if (mkv->cues == NULL) |
847 AVCodecContext *codec = s->streams[pkt->stream_index]->codec; | 839 AVCodecContext *codec = s->streams[pkt->stream_index]->codec; |
848 int keyframe = !!(pkt->flags & PKT_FLAG_KEY); | 840 int keyframe = !!(pkt->flags & PKT_FLAG_KEY); |
849 int duration = pkt->duration; | 841 int duration = pkt->duration; |
850 int ret; | 842 int ret; |
851 | 843 |
852 // start a new cluster every 5 MB or 5 sec | 844 if (!mkv->cluster_pos) { |
853 if (url_ftell(pb) > mkv->cluster_pos + 5*1024*1024 || pkt->pts > mkv->cluster_pts + 5000) { | |
854 av_log(s, AV_LOG_DEBUG, "Starting new cluster at offset %" PRIu64 | |
855 " bytes, pts %" PRIu64 "\n", url_ftell(pb), pkt->pts); | |
856 end_ebml_master(pb, mkv->cluster); | |
857 | |
858 ret = mkv_add_seekhead_entry(mkv->cluster_seekhead, MATROSKA_ID_CLUSTER, url_ftell(pb)); | 845 ret = mkv_add_seekhead_entry(mkv->cluster_seekhead, MATROSKA_ID_CLUSTER, url_ftell(pb)); |
859 if (ret < 0) return ret; | 846 if (ret < 0) return ret; |
860 | 847 |
861 mkv->cluster_pos = url_ftell(pb); | 848 mkv->cluster_pos = url_ftell(pb); |
862 mkv->cluster = start_ebml_master(pb, MATROSKA_ID_CLUSTER, 0); | 849 mkv->cluster = start_ebml_master(pb, MATROSKA_ID_CLUSTER, 0); |
878 } | 865 } |
879 | 866 |
880 if (codec->codec_type == CODEC_TYPE_VIDEO && keyframe) { | 867 if (codec->codec_type == CODEC_TYPE_VIDEO && keyframe) { |
881 ret = mkv_add_cuepoint(mkv->cues, pkt, mkv->cluster_pos); | 868 ret = mkv_add_cuepoint(mkv->cues, pkt, mkv->cluster_pos); |
882 if (ret < 0) return ret; | 869 if (ret < 0) return ret; |
870 } | |
871 | |
872 // start a new cluster every 5 MB or 5 sec | |
873 if (url_ftell(pb) > mkv->cluster_pos + 5*1024*1024 || pkt->pts > mkv->cluster_pts + 5000) { | |
874 av_log(s, AV_LOG_DEBUG, "Starting new cluster at offset %" PRIu64 | |
875 " bytes, pts %" PRIu64 "\n", url_ftell(pb), pkt->pts); | |
876 end_ebml_master(pb, mkv->cluster); | |
877 mkv->cluster_pos = 0; | |
883 } | 878 } |
884 | 879 |
885 mkv->duration = FFMAX(mkv->duration, pkt->pts + duration); | 880 mkv->duration = FFMAX(mkv->duration, pkt->pts + duration); |
886 return 0; | 881 return 0; |
887 } | 882 } |