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 }