comparison matroskaenc.c @ 5795:67059af53c04 libavformat

mkvenc: Handle negative timestamps correctly
author conrad
date Tue, 09 Mar 2010 04:23:36 +0000
parents 31e8a43123c5
children 3c72ab66eb24
comparison
equal deleted inserted replaced
5794:31e8a43123c5 5795:67059af53c04
70 ebml_master segment; 70 ebml_master segment;
71 int64_t segment_offset; 71 int64_t segment_offset;
72 int64_t segment_uid; 72 int64_t segment_uid;
73 ebml_master cluster; 73 ebml_master cluster;
74 int64_t cluster_pos; ///< file offset of the current cluster 74 int64_t cluster_pos; ///< file offset of the current cluster
75 uint64_t cluster_pts; 75 int64_t cluster_pts;
76 int64_t duration_offset; 76 int64_t duration_offset;
77 uint64_t duration; 77 int64_t duration;
78 mkv_seekhead *main_seekhead; 78 mkv_seekhead *main_seekhead;
79 mkv_seekhead *cluster_seekhead; 79 mkv_seekhead *cluster_seekhead;
80 mkv_cues *cues; 80 mkv_cues *cues;
81 mkv_track *tracks; 81 mkv_track *tracks;
82 82
352 mkv_cuepoint *entries = cues->entries; 352 mkv_cuepoint *entries = cues->entries;
353 353
354 entries = av_realloc(entries, (cues->num_entries + 1) * sizeof(mkv_cuepoint)); 354 entries = av_realloc(entries, (cues->num_entries + 1) * sizeof(mkv_cuepoint));
355 if (entries == NULL) 355 if (entries == NULL)
356 return AVERROR(ENOMEM); 356 return AVERROR(ENOMEM);
357
358 if (ts < 0)
359 return 0;
357 360
358 entries[cues->num_entries ].pts = ts; 361 entries[cues->num_entries ].pts = ts;
359 entries[cues->num_entries ].tracknum = stream + 1; 362 entries[cues->num_entries ].tracknum = stream + 1;
360 entries[cues->num_entries++].cluster_pos = cluster_pos - cues->segment_offset; 363 entries[cues->num_entries++].cluster_pos = cluster_pos - cues->segment_offset;
361 364
881 ret = mkv_add_seekhead_entry(mkv->cluster_seekhead, MATROSKA_ID_CLUSTER, url_ftell(pb)); 884 ret = mkv_add_seekhead_entry(mkv->cluster_seekhead, MATROSKA_ID_CLUSTER, url_ftell(pb));
882 if (ret < 0) return ret; 885 if (ret < 0) return ret;
883 886
884 mkv->cluster_pos = url_ftell(s->pb); 887 mkv->cluster_pos = url_ftell(s->pb);
885 mkv->cluster = start_ebml_master(pb, MATROSKA_ID_CLUSTER, 0); 888 mkv->cluster = start_ebml_master(pb, MATROSKA_ID_CLUSTER, 0);
886 put_ebml_uint(pb, MATROSKA_ID_CLUSTERTIMECODE, ts); 889 put_ebml_uint(pb, MATROSKA_ID_CLUSTERTIMECODE, FFMAX(0, ts));
887 mkv->cluster_pts = ts; 890 mkv->cluster_pts = FFMAX(0, ts);
888 av_md5_update(mkv->md5_ctx, pkt->data, FFMIN(200, pkt->size)); 891 av_md5_update(mkv->md5_ctx, pkt->data, FFMIN(200, pkt->size));
889 } 892 }
890 893
891 if (codec->codec_type != CODEC_TYPE_SUBTITLE) { 894 if (codec->codec_type != CODEC_TYPE_SUBTITLE) {
892 mkv_write_block(s, pb, MATROSKA_ID_SIMPLEBLOCK, pkt, keyframe << 7); 895 mkv_write_block(s, pb, MATROSKA_ID_SIMPLEBLOCK, pkt, keyframe << 7);