Commit 65ef74f7 authored by Andreas Rheinhardt's avatar Andreas Rheinhardt Committed by James Almer

avformat/matroskaenc: Move track-related fields to mkv_track

Signed-off-by: 's avatarAndreas Rheinhardt <andreas.rheinhardt@gmail.com>
Signed-off-by: 's avatarJames Almer <jamrial@gmail.com>
parent 7797fdfe
...@@ -96,6 +96,9 @@ typedef struct mkv_track { ...@@ -96,6 +96,9 @@ typedef struct mkv_track {
int has_cue; int has_cue;
int sample_rate; int sample_rate;
int64_t sample_rate_offset; int64_t sample_rate_offset;
int64_t last_timestamp;
int64_t duration;
int64_t duration_offset;
int64_t codecpriv_offset; int64_t codecpriv_offset;
int64_t ts_offset; int64_t ts_offset;
} mkv_track; } mkv_track;
...@@ -155,11 +158,6 @@ typedef struct MatroskaMuxContext { ...@@ -155,11 +158,6 @@ typedef struct MatroskaMuxContext {
uint32_t chapter_id_offset; uint32_t chapter_id_offset;
int wrote_chapters; int wrote_chapters;
int64_t last_track_timestamp[MAX_TRACKS];
int64_t *stream_durations;
int64_t *stream_duration_offsets;
int allow_raw_vfw; int allow_raw_vfw;
} MatroskaMuxContext; } MatroskaMuxContext;
...@@ -410,8 +408,6 @@ static void mkv_deinit(AVFormatContext *s) ...@@ -410,8 +408,6 @@ static void mkv_deinit(AVFormatContext *s)
av_freep(&mkv->attachments); av_freep(&mkv->attachments);
} }
av_freep(&mkv->tracks); av_freep(&mkv->tracks);
av_freep(&mkv->stream_durations);
av_freep(&mkv->stream_duration_offsets);
} }
/** /**
...@@ -1670,7 +1666,7 @@ static int mkv_write_tags(AVFormatContext *s) ...@@ -1670,7 +1666,7 @@ static int mkv_write_tags(AVFormatContext *s)
tag = start_ebml_master(pb, MATROSKA_ID_SIMPLETAG, 0); tag = start_ebml_master(pb, MATROSKA_ID_SIMPLETAG, 0);
put_ebml_string(pb, MATROSKA_ID_TAGNAME, "DURATION"); put_ebml_string(pb, MATROSKA_ID_TAGNAME, "DURATION");
mkv->stream_duration_offsets[i] = avio_tell(pb); mkv->tracks[i].duration_offset = avio_tell(pb);
// Reserve space to write duration as a 20-byte string. // Reserve space to write duration as a 20-byte string.
// 2 (ebml id) + 1 (data size) + 20 (data) // 2 (ebml id) + 1 (data size) + 20 (data)
...@@ -1957,13 +1953,6 @@ static int mkv_write_header(AVFormatContext *s) ...@@ -1957,13 +1953,6 @@ static int mkv_write_header(AVFormatContext *s)
end_ebml_master_crc32(s->pb, &mkv->info_bc, mkv); end_ebml_master_crc32(s->pb, &mkv->info_bc, mkv);
pb = s->pb; pb = s->pb;
// initialize stream_duration fields
mkv->stream_durations = av_mallocz(s->nb_streams * sizeof(int64_t));
mkv->stream_duration_offsets = av_mallocz(s->nb_streams * sizeof(int64_t));
if (!mkv->stream_durations || !mkv->stream_duration_offsets) {
return AVERROR(ENOMEM);
}
ret = mkv_write_tracks(s); ret = mkv_write_tracks(s);
if (ret < 0) if (ret < 0)
return ret; return ret;
...@@ -2096,6 +2085,7 @@ static void mkv_write_block(AVFormatContext *s, AVIOContext *pb, ...@@ -2096,6 +2085,7 @@ static void mkv_write_block(AVFormatContext *s, AVIOContext *pb,
{ {
MatroskaMuxContext *mkv = s->priv_data; MatroskaMuxContext *mkv = s->priv_data;
AVCodecParameters *par = s->streams[pkt->stream_index]->codecpar; AVCodecParameters *par = s->streams[pkt->stream_index]->codecpar;
mkv_track *track = &mkv->tracks[pkt->stream_index];
uint8_t *data = NULL, *side_data = NULL; uint8_t *data = NULL, *side_data = NULL;
int offset = 0, size = pkt->size, side_data_size = 0; int offset = 0, size = pkt->size, side_data_size = 0;
int64_t ts = mkv->tracks[pkt->stream_index].write_dts ? pkt->dts : pkt->pts; int64_t ts = mkv->tracks[pkt->stream_index].write_dts ? pkt->dts : pkt->pts;
...@@ -2174,10 +2164,9 @@ static void mkv_write_block(AVFormatContext *s, AVIOContext *pb, ...@@ -2174,10 +2164,9 @@ static void mkv_write_block(AVFormatContext *s, AVIOContext *pb,
av_free(data); av_free(data);
if (blockid == MATROSKA_ID_BLOCK && !keyframe) { if (blockid == MATROSKA_ID_BLOCK && !keyframe) {
put_ebml_sint(pb, MATROSKA_ID_BLOCKREFERENCE, put_ebml_sint(pb, MATROSKA_ID_BLOCKREFERENCE, track->last_timestamp);
mkv->last_track_timestamp[track_number - 1]);
} }
mkv->last_track_timestamp[track_number - 1] = ts - mkv->cluster_pts; track->last_timestamp = ts - mkv->cluster_pts;
if (discard_padding) { if (discard_padding) {
put_ebml_sint(pb, MATROSKA_ID_DISCARDPADDING, discard_padding); put_ebml_sint(pb, MATROSKA_ID_DISCARDPADDING, discard_padding);
...@@ -2367,6 +2356,7 @@ static int mkv_write_packet_internal(AVFormatContext *s, AVPacket *pkt, int add_ ...@@ -2367,6 +2356,7 @@ static int mkv_write_packet_internal(AVFormatContext *s, AVPacket *pkt, int add_
MatroskaMuxContext *mkv = s->priv_data; MatroskaMuxContext *mkv = s->priv_data;
AVIOContext *pb = s->pb; AVIOContext *pb = s->pb;
AVCodecParameters *par = s->streams[pkt->stream_index]->codecpar; AVCodecParameters *par = s->streams[pkt->stream_index]->codecpar;
mkv_track *track = &mkv->tracks[pkt->stream_index];
int keyframe = !!(pkt->flags & AV_PKT_FLAG_KEY); int keyframe = !!(pkt->flags & AV_PKT_FLAG_KEY);
int duration = pkt->duration; int duration = pkt->duration;
int ret; int ret;
...@@ -2437,9 +2427,7 @@ FF_ENABLE_DEPRECATION_WARNINGS ...@@ -2437,9 +2427,7 @@ FF_ENABLE_DEPRECATION_WARNINGS
mkv->duration = FFMAX(mkv->duration, ts + duration); mkv->duration = FFMAX(mkv->duration, ts + duration);
if (mkv->stream_durations) track->duration = FFMAX(track->duration, ts + duration);
mkv->stream_durations[pkt->stream_index] =
FFMAX(mkv->stream_durations[pkt->stream_index], ts + duration);
return 0; return 0;
} }
...@@ -2613,20 +2601,21 @@ static int mkv_write_trailer(AVFormatContext *s) ...@@ -2613,20 +2601,21 @@ static int mkv_write_trailer(AVFormatContext *s)
end_ebml_master_crc32(pb, &mkv->tracks_bc, mkv); end_ebml_master_crc32(pb, &mkv->tracks_bc, mkv);
// update stream durations // update stream durations
if (!mkv->is_live && mkv->stream_durations) { if (!mkv->is_live) {
int i; int i;
int64_t curr = avio_tell(mkv->tags_bc); int64_t curr = avio_tell(mkv->tags_bc);
for (i = 0; i < s->nb_streams; ++i) { for (i = 0; i < s->nb_streams; ++i) {
AVStream *st = s->streams[i]; AVStream *st = s->streams[i];
mkv_track *track = &mkv->tracks[i];
if (mkv->stream_duration_offsets[i] > 0) { if (track->duration_offset > 0) {
double duration_sec = mkv->stream_durations[i] * av_q2d(st->time_base); double duration_sec = track->duration * av_q2d(st->time_base);
char duration_string[20] = ""; char duration_string[20] = "";
av_log(s, AV_LOG_DEBUG, "stream %d end duration = %" PRIu64 "\n", i, av_log(s, AV_LOG_DEBUG, "stream %d end duration = %" PRIu64 "\n", i,
mkv->stream_durations[i]); track->duration);
avio_seek(mkv->tags_bc, mkv->stream_duration_offsets[i], SEEK_SET); avio_seek(mkv->tags_bc, track->duration_offset, SEEK_SET);
snprintf(duration_string, 20, "%02d:%02d:%012.9f", snprintf(duration_string, 20, "%02d:%02d:%012.9f",
(int) duration_sec / 3600, ((int) duration_sec / 60) % 60, (int) duration_sec / 3600, ((int) duration_sec / 60) % 60,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment