typedef struct {
int write_dts;
+ int64_t ts_offset;
} mkv_track;
#define MODE_MATROSKAv2 0x01
if (!(st->disposition & AV_DISPOSITION_DEFAULT))
put_ebml_uint(pb, MATROSKA_ID_TRACKFLAGDEFAULT, !!(st->disposition & AV_DISPOSITION_DEFAULT));
+ if (codec->codec_type == AVMEDIA_TYPE_AUDIO && codec->delay) {
+ mkv->tracks[i].ts_offset = av_rescale_q(codec->delay,
+ (AVRational){ 1, codec->sample_rate },
+ st->time_base);
+
+ put_ebml_uint(pb, MATROSKA_ID_CODECDELAY,
+ av_rescale_q(codec->delay, (AVRational){ 1, codec->sample_rate },
+ (AVRational){ 1, 1000000000 }));
+ }
+
// look for a codec ID string specific to mkv to use,
// if none are found, use AVI codes
for (j = 0; ff_mkv_codec_tags[j].id != AV_CODEC_ID_NONE; j++) {
av_log(s, AV_LOG_ERROR, "Can't write packet with unknown timestamp\n");
return AVERROR(EINVAL);
}
+ ts += mkv->tracks[pkt->stream_index].ts_offset;
if (!s->pb->seekable) {
if (!mkv->dyn_bc)
cluster_time = pkt->dts - mkv->cluster_pts;
else
cluster_time = pkt->pts - mkv->cluster_pts;
+ cluster_time += mkv->tracks[pkt->stream_index].ts_offset;
// start a new cluster every 5 MB or 5 sec, or 32k / 1 sec for streaming or
// after 4k and on a keyframe