diff options
author | James Almer <jamrial@gmail.com> | 2016-10-03 19:15:24 -0300 |
---|---|---|
committer | James Almer <jamrial@gmail.com> | 2016-10-06 17:01:20 -0300 |
commit | 79248795d4af6ef4782c528e872dfcc9bbd46d68 (patch) | |
tree | 9ad639849c067590750dc4c39999d591c8b7e524 /libavformat/matroskaenc.c | |
parent | 3b189fae732897697b40f335359e2f16c616c50c (diff) |
avformat/matroskaenc: write a CRC32 element on Cues
Implements part of ticket #4347
Tested-by: Dave Rice <dave@dericed.com>
Tested-by: Jerome Martinez <jerome@mediaarea.net>
Reviewed-by: Michael Niedermayer <michael@niedermayer.cc>
Signed-off-by: James Almer <jamrial@gmail.com>
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; } |