diff options
Diffstat (limited to 'libavformat/matroskaenc.c')
-rw-r--r-- | libavformat/matroskaenc.c | 29 |
1 files changed, 16 insertions, 13 deletions
diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index 4766531e2f..5009ebc6fc 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -514,13 +514,16 @@ static int mkv_add_cuepoint(mkv_cues *cues, int stream, int tracknum, int64_t ts static int64_t mkv_write_cues(AVFormatContext *s, mkv_cues *cues, mkv_track *tracks, int num_tracks) { - AVIOContext *pb = s->pb; + MatroskaMuxContext *mkv = s->priv_data; + AVIOContext *dyn_cp, *pb = s->pb; ebml_master cues_element; int64_t currentpos; - int i, j; + int i, j, ret; currentpos = avio_tell(pb); - cues_element = start_ebml_master(pb, MATROSKA_ID_CUES, 0); + ret = start_ebml_master_crc32(pb, &dyn_cp, &cues_element, MATROSKA_ID_CUES, 0); + if (ret < 0) + return ret; for (i = 0; i < cues->num_entries; i++) { ebml_master cuepoint, track_positions; @@ -540,8 +543,8 @@ static int64_t mkv_write_cues(AVFormatContext *s, mkv_cues *cues, mkv_track *tra ctp_nb ++; } - cuepoint = start_ebml_master(pb, MATROSKA_ID_POINTENTRY, MAX_CUEPOINT_SIZE(ctp_nb)); - put_ebml_uint(pb, MATROSKA_ID_CUETIME, pts); + cuepoint = start_ebml_master(dyn_cp, MATROSKA_ID_POINTENTRY, MAX_CUEPOINT_SIZE(ctp_nb)); + put_ebml_uint(dyn_cp, MATROSKA_ID_CUETIME, pts); // put all the entries from different tracks that have the exact same // timestamp into the same CuePoint @@ -553,18 +556,18 @@ static int64_t mkv_write_cues(AVFormatContext *s, mkv_cues *cues, mkv_track *tra if (tracks[tracknum].has_cue && s->streams[tracknum]->codecpar->codec_type != AVMEDIA_TYPE_SUBTITLE) continue; tracks[tracknum].has_cue = 1; - track_positions = start_ebml_master(pb, MATROSKA_ID_CUETRACKPOSITION, MAX_CUETRACKPOS_SIZE); - put_ebml_uint(pb, MATROSKA_ID_CUETRACK , entry[j].tracknum ); - put_ebml_uint(pb, MATROSKA_ID_CUECLUSTERPOSITION , entry[j].cluster_pos); - put_ebml_uint(pb, MATROSKA_ID_CUERELATIVEPOSITION, entry[j].relative_pos); + track_positions = start_ebml_master(dyn_cp, MATROSKA_ID_CUETRACKPOSITION, MAX_CUETRACKPOS_SIZE); + put_ebml_uint(dyn_cp, MATROSKA_ID_CUETRACK , entry[j].tracknum ); + put_ebml_uint(dyn_cp, MATROSKA_ID_CUECLUSTERPOSITION , entry[j].cluster_pos); + put_ebml_uint(dyn_cp, MATROSKA_ID_CUERELATIVEPOSITION, entry[j].relative_pos); if (entry[j].duration != -1) - put_ebml_uint(pb, MATROSKA_ID_CUEDURATION , entry[j].duration); - end_ebml_master(pb, track_positions); + put_ebml_uint(dyn_cp, MATROSKA_ID_CUEDURATION , entry[j].duration); + end_ebml_master(dyn_cp, track_positions); } i += j - 1; - end_ebml_master(pb, cuepoint); + end_ebml_master(dyn_cp, cuepoint); } - end_ebml_master(pb, cues_element); + end_ebml_master_crc32(pb, &dyn_cp, mkv, cues_element); return currentpos; } |