X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavformat%2Fmatroskaenc.c;h=e26e31a776052f89f44667432d9dba1224563474;hb=533c30fcedd56a8a1146ef09e9e2a8a471ffd321;hp=1ed69b47ccf00c8cc852b9c509330e52bf41f8ca;hpb=84d4e599a500ec829fe12d4c3ab6eca5282c3033;p=ffmpeg diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index 1ed69b47ccf..e26e31a7760 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -72,9 +72,9 @@ typedef struct MatroskaMuxContext { int64_t segment_uid; ebml_master cluster; int64_t cluster_pos; ///< file offset of the current cluster - uint64_t cluster_pts; + int64_t cluster_pts; int64_t duration_offset; - uint64_t duration; + int64_t duration; mkv_seekhead *main_seekhead; mkv_seekhead *cluster_seekhead; mkv_cues *cues; @@ -355,6 +355,9 @@ static int mkv_add_cuepoint(mkv_cues *cues, int stream, int64_t ts, int64_t clus if (entries == NULL) return AVERROR(ENOMEM); + if (ts < 0) + return 0; + entries[cues->num_entries ].pts = ts; entries[cues->num_entries ].tracknum = stream + 1; entries[cues->num_entries++].cluster_pos = cluster_pos - cues->segment_offset; @@ -866,6 +869,11 @@ static int mkv_write_packet(AVFormatContext *s, AVPacket *pkt) int ret; int64_t ts = mkv->tracks[pkt->stream_index].write_dts ? pkt->dts : pkt->pts; + if (ts == AV_NOPTS_VALUE) { + av_log(s, AV_LOG_ERROR, "Can't write packet with unknown timestamp\n"); + return AVERROR(EINVAL); + } + if (url_is_streamed(s->pb)) { if (!mkv->dyn_bc) url_open_dyn_buf(&mkv->dyn_bc); @@ -878,8 +886,8 @@ static int mkv_write_packet(AVFormatContext *s, AVPacket *pkt) mkv->cluster_pos = url_ftell(s->pb); mkv->cluster = start_ebml_master(pb, MATROSKA_ID_CLUSTER, 0); - put_ebml_uint(pb, MATROSKA_ID_CLUSTERTIMECODE, ts); - mkv->cluster_pts = ts; + put_ebml_uint(pb, MATROSKA_ID_CLUSTERTIMECODE, FFMAX(0, ts)); + mkv->cluster_pts = FFMAX(0, ts); av_md5_update(mkv->md5_ctx, pkt->data, FFMIN(200, pkt->size)); }