+
+ ret = mkv_assemble_cues(s->streams, cues, &mkv->cues,
+ mkv->tracks, s->nb_streams);
+ if (ret < 0) {
+ ffio_free_dyn_buf(&cues);
+ return ret;
+ }
+
+ if (mkv->reserve_cues_space) {
+ size = avio_tell(cues);
+ length_size = ebml_num_size(size);
+ size += 4 + length_size;
+ if (mkv->reserve_cues_space < size) {
+ av_log(s, AV_LOG_WARNING,
+ "Insufficient space reserved for Cues: "
+ "%d < %"PRIu64". No Cues will be output.\n",
+ mkv->reserve_cues_space, size);
+ mkv->reserve_cues_space = -1;
+ ffio_free_dyn_buf(&cues);
+ goto after_cues;
+ } else {
+ cuespos = mkv->cues_pos;
+ if ((ret64 = avio_seek(pb, mkv->cues_pos, SEEK_SET)) < 0) {
+ ffio_free_dyn_buf(&cues);
+ return ret64;
+ }
+ if (mkv->reserve_cues_space == size + 1) {
+ /* There is no way to reserve a single byte because
+ * the minimal size of an EBML Void element is 2
+ * (1 byte ID, 1 byte length field). This problem
+ * is solved by writing the Cues' length field on
+ * one byte more than necessary. */
+ length_size++;
+ size++;
+ }
+ }
+ }
+ mkv_add_seekhead_entry(mkv, MATROSKA_ID_CUES, cuespos);
+ end_ebml_master_crc32(pb, &cues, mkv, MATROSKA_ID_CUES,
+ length_size, 0);
+ if (mkv->reserve_cues_space) {
+ if (size < mkv->reserve_cues_space)
+ put_ebml_void(pb, mkv->reserve_cues_space - size);
+ } else
+ endpos = avio_tell(pb);