Lines Matching refs:mkv
61 #define IS_SEEKABLE(pb, mkv) (((pb)->seekable & AVIO_SEEKABLE_NORMAL) && \ argument
62 !(mkv)->is_live)
357 static void mkv_add_seekhead_entry(MatroskaMuxContext *mkv, uint32_t elementid, in mkv_add_seekhead_entry() argument
360 mkv_seekhead *seekhead = &mkv->seekhead; in mkv_add_seekhead_entry()
365 seekhead->entries[seekhead->num_entries++].segmentpos = filepos - mkv->segment_offset; in mkv_add_seekhead_entry()
368 static int start_ebml_master_crc32(AVIOContext **dyn_cp, MatroskaMuxContext *mkv) in start_ebml_master_crc32() argument
375 if (mkv->write_crc) in start_ebml_master_crc32()
382 MatroskaMuxContext *mkv, uint32_t id, in end_ebml_master_crc32() argument
394 mkv_add_seekhead_entry(mkv, id, avio_tell(pb)); in end_ebml_master_crc32()
398 if (mkv->write_crc) { in end_ebml_master_crc32()
420 MatroskaMuxContext *mkv, uint32_t id) in end_ebml_master_crc32_tentatively() argument
422 if (IS_SEEKABLE(pb, mkv)) { in end_ebml_master_crc32_tentatively()
430 mkv_add_seekhead_entry(mkv, id, elem->pos); in end_ebml_master_crc32_tentatively()
438 return end_ebml_master_crc32(pb, &elem->bc, mkv, id, 0, 0, 1); in end_ebml_master_crc32_tentatively()
452 MatroskaMuxContext *mkv = s->priv_data; in mkv_deinit() local
454 av_packet_free(&mkv->cur_audio_pkt); in mkv_deinit()
456 ffio_free_dyn_buf(&mkv->cluster_bc); in mkv_deinit()
457 ffio_free_dyn_buf(&mkv->info.bc); in mkv_deinit()
458 ffio_free_dyn_buf(&mkv->track.bc); in mkv_deinit()
459 ffio_free_dyn_buf(&mkv->tags.bc); in mkv_deinit()
461 av_freep(&mkv->cues.entries); in mkv_deinit()
462 av_freep(&mkv->tracks); in mkv_deinit()
470 static void mkv_start_seekhead(MatroskaMuxContext *mkv, AVIOContext *pb) in mkv_start_seekhead() argument
472 mkv->seekhead.filepos = avio_tell(pb); in mkv_start_seekhead()
476 mkv->seekhead.reserved_size = MAX_SEEKHEAD_ENTRIES * MAX_SEEKENTRY_SIZE + 14; in mkv_start_seekhead()
477 put_ebml_void(pb, mkv->seekhead.reserved_size); in mkv_start_seekhead()
490 static int mkv_write_seekhead(AVIOContext *pb, MatroskaMuxContext *mkv, in mkv_write_seekhead() argument
494 mkv_seekhead *seekhead = &mkv->seekhead; in mkv_write_seekhead()
501 ret = start_ebml_master_crc32(&dyn_cp, mkv); in mkv_write_seekhead()
517 ret = end_ebml_master_crc32(pb, &dyn_cp, mkv, in mkv_write_seekhead()
531 static int mkv_add_cuepoint(MatroskaMuxContext *mkv, int stream, int64_t ts, in mkv_add_cuepoint() argument
534 mkv_cues *cues = &mkv->cues; in mkv_add_cuepoint()
547 cues->entries[cues->num_entries].cluster_pos = cluster_pos - mkv->segment_offset; in mkv_add_cuepoint()
678 static int get_aac_sample_rates(AVFormatContext *s, MatroskaMuxContext *mkv, in get_aac_sample_rates() argument
691 if (ret < 0 && (extradata_size || !IS_SEEKABLE(s->pb, mkv))) { in get_aac_sample_rates()
768 MatroskaMuxContext *mkv = s->priv_data; in mkv_write_codecprivate() local
807 ff_put_bmp_header(dyn_cp, par, 0, 0, mkv->flipped_raw_rgb); in mkv_write_codecprivate()
1115 static int mkv_write_track(AVFormatContext *s, MatroskaMuxContext *mkv, in mkv_write_track() argument
1135 ret = get_aac_sample_rates(s, mkv, par->extradata, par->extradata_size, in mkv_write_track()
1160 if (mkv->mode == MODE_WEBM) { in mkv_write_track()
1217 if (mkv->allow_raw_vfw) { in mkv_write_track()
1229 mkv->have_video = 1; in mkv_write_track()
1261 mkv_write_field_order(pb, mkv->mode, par->field_order); in mkv_write_track()
1265 ret = mkv_write_stereo_mode(s, pb, st, mkv->mode, in mkv_write_track()
1286 if (mkv->mode == MODE_WEBM || display_width_div != 1 || display_height_div != 1) { in mkv_write_track()
1303 } else if (mkv->mode != MODE_WEBM) in mkv_write_track()
1367 if (mkv->mode != MODE_WEBM && st->disposition & AV_DISPOSITION_DESCRIPTIONS) in mkv_write_track()
1370 if (mkv->mode != MODE_WEBM || par->codec_id != AV_CODEC_ID_WEBVTT) in mkv_write_track()
1380 if (mkv->mode != MODE_WEBM || par->codec_id != AV_CODEC_ID_WEBVTT) { in mkv_write_track()
1394 MatroskaMuxContext *mkv = s->priv_data; in mkv_write_tracks() local
1398 if (mkv->nb_attachments == s->nb_streams) in mkv_write_tracks()
1401 ret = start_ebml_master_crc32(&mkv->track.bc, mkv); in mkv_write_tracks()
1405 if (mkv->default_mode != DEFAULT_MODE_PASSTHROUGH) { in mkv_write_tracks()
1431 if (mkv->default_mode != DEFAULT_MODE_INFER_NO_SUBS) in mkv_write_tracks()
1436 int is_default = mkv->default_mode == DEFAULT_MODE_PASSTHROUGH ? in mkv_write_tracks()
1440 ret = mkv_write_track(s, mkv, st, &mkv->tracks[i], in mkv_write_tracks()
1441 mkv->track.bc, is_default); in mkv_write_tracks()
1446 return end_ebml_master_crc32_tentatively(pb, &mkv->track, mkv, in mkv_write_tracks()
1484 static int mkv_write_tag_targets(MatroskaMuxContext *mkv, AVIOContext **pb, in mkv_write_tag_targets() argument
1491 ret = start_ebml_master_crc32(pb, mkv); in mkv_write_tag_targets()
1518 static int mkv_write_tag(MatroskaMuxContext *mkv, const AVDictionary *m, in mkv_write_tag() argument
1526 ret = mkv_write_tag_targets(mkv, pb, tag ? tag : &tag2, elementid, uid); in mkv_write_tag()
1557 MatroskaMuxContext *mkv = s->priv_data; in mkv_write_tags() local
1558 ebml_master tag, *tagp = IS_SEEKABLE(s->pb, mkv) ? &tag : NULL; in mkv_write_tags()
1561 mkv->wrote_tags = 1; in mkv_write_tags()
1566 ret = mkv_write_tag(mkv, s->metadata, &mkv->tags.bc, NULL, 0, 0); in mkv_write_tags()
1573 mkv_track *track = &mkv->tracks[i]; in mkv_write_tags()
1581 ret = mkv_write_tag(mkv, st->metadata, &mkv->tags.bc, tagp, in mkv_write_tags()
1587 AVIOContext *pb = mkv->tags.bc; in mkv_write_tags()
1603 if (mkv->nb_attachments && mkv->mode != MODE_WEBM) { in mkv_write_tags()
1605 const mkv_track *track = &mkv->tracks[i]; in mkv_write_tags()
1614 ret = mkv_write_tag(mkv, st->metadata, &mkv->tags.bc, NULL, in mkv_write_tags()
1621 if (mkv->tags.bc) { in mkv_write_tags()
1622 return end_ebml_master_crc32_tentatively(s->pb, &mkv->tags, mkv, in mkv_write_tags()
1642 MatroskaMuxContext *mkv = s->priv_data; in mkv_write_chapters() local
1648 if (!s->nb_chapters || mkv->wrote_chapters) in mkv_write_chapters()
1651 ret = start_ebml_master_crc32(&dyn_cp, mkv); in mkv_write_chapters()
1656 if (mkv->mode != MODE_WEBM) { in mkv_write_chapters()
1660 tags = mkv->wrote_tags ? &dyn_tags : &mkv->tags.bc; in mkv_write_chapters()
1698 ret = mkv_write_tag(mkv, c->metadata, tags, NULL, in mkv_write_chapters()
1705 mkv->wrote_chapters = 1; in mkv_write_chapters()
1707 ret = end_ebml_master_crc32(pb, &dyn_cp, mkv, MATROSKA_ID_CHAPTERS, 0, 0, 1); in mkv_write_chapters()
1711 return end_ebml_master_crc32(pb, &dyn_tags, mkv, in mkv_write_chapters()
1744 MatroskaMuxContext *mkv = s->priv_data; in mkv_write_attachments() local
1748 if (!mkv->nb_attachments) in mkv_write_attachments()
1751 ret = start_ebml_master_crc32(&dyn_cp, mkv); in mkv_write_attachments()
1757 mkv_track *track = &mkv->tracks[i]; in mkv_write_attachments()
1783 return end_ebml_master_crc32(pb, &dyn_cp, mkv, in mkv_write_attachments()
1813 MatroskaMuxContext *mkv = s->priv_data; in mkv_write_header() local
1820 if (mkv->mode != MODE_WEBM || in mkv_write_header()
1844 mkv->segment_offset = avio_tell(pb); in mkv_write_header()
1848 mkv_start_seekhead(mkv, pb); in mkv_write_header()
1850 ret = start_ebml_master_crc32(&mkv->info.bc, mkv); in mkv_write_header()
1853 pb = mkv->info.bc; in mkv_write_header()
1865 if (mkv->mode != MODE_WEBM) in mkv_write_header()
1866 put_ebml_binary(pb, MATROSKA_ID_SEGMENTUID, mkv->segment_uid, 16); in mkv_write_header()
1882 mkv->duration = 0; in mkv_write_header()
1883 mkv->duration_offset = avio_tell(pb); in mkv_write_header()
1884 if (!mkv->is_live) { in mkv_write_header()
1899 ret = end_ebml_master_crc32_tentatively(s->pb, &mkv->info, in mkv_write_header()
1900 mkv, MATROSKA_ID_INFO); in mkv_write_header()
1913 if (mkv->mode != MODE_WEBM) { in mkv_write_header()
1925 if (!IS_SEEKABLE(pb, mkv)) { in mkv_write_header()
1926 ret = mkv_write_seekhead(pb, mkv, 0, avio_tell(pb)); in mkv_write_header()
1937 if (mkv->reserve_cues_space) { in mkv_write_header()
1938 if (IS_SEEKABLE(pb, mkv)) { in mkv_write_header()
1939 mkv->cues_pos = avio_tell(pb); in mkv_write_header()
1940 if (mkv->reserve_cues_space == 1) in mkv_write_header()
1941 mkv->reserve_cues_space++; in mkv_write_header()
1942 put_ebml_void(pb, mkv->reserve_cues_space); in mkv_write_header()
1944 mkv->reserve_cues_space = -1; in mkv_write_header()
1947 mkv->cluster_pos = -1; in mkv_write_header()
1951 if (IS_SEEKABLE(pb, mkv)) { in mkv_write_header()
1952 if (mkv->cluster_time_limit < 0) in mkv_write_header()
1953 mkv->cluster_time_limit = 5000; in mkv_write_header()
1954 if (mkv->cluster_size_limit < 0) in mkv_write_header()
1955 mkv->cluster_size_limit = 5 * 1024 * 1024; in mkv_write_header()
1957 if (mkv->cluster_time_limit < 0) in mkv_write_header()
1958 mkv->cluster_time_limit = 1000; in mkv_write_header()
1959 if (mkv->cluster_size_limit < 0) in mkv_write_header()
1960 mkv->cluster_size_limit = 32 * 1024; in mkv_write_header()
2031 MatroskaMuxContext *mkv = s->priv_data; in mkv_write_block() local
2033 mkv_track *track = &mkv->tracks[pkt->stream_index]; in mkv_write_block()
2052 mkv->cluster_pos, track_number, keyframe != 0); in mkv_write_block()
2111 avio_wb16(pb, ts - mkv->cluster_pts); in mkv_write_block()
2143 MatroskaMuxContext *mkv = s->priv_data; in mkv_write_vtt_blocks() local
2144 mkv_track *track = &mkv->tracks[pkt->stream_index]; in mkv_write_vtt_blocks()
2169 mkv->cluster_pos, track->track_num, 1); in mkv_write_vtt_blocks()
2177 avio_wb16(pb, ts - mkv->cluster_pts); in mkv_write_vtt_blocks()
2189 MatroskaMuxContext *mkv = s->priv_data; in mkv_end_cluster() local
2192 if (!mkv->have_video) { in mkv_end_cluster()
2194 mkv->tracks[i].has_cue = 0; in mkv_end_cluster()
2196 mkv->cluster_pos = -1; in mkv_end_cluster()
2197 ret = end_ebml_master_crc32(s->pb, &mkv->cluster_bc, mkv, in mkv_end_cluster()
2208 MatroskaMuxContext *mkv = s->priv_data; in mkv_check_new_extra_data() local
2209 mkv_track *track = &mkv->tracks[pkt->stream_index]; in mkv_check_new_extra_data()
2220 if (side_data_size && mkv->track.bc) { in mkv_check_new_extra_data()
2222 ret = get_aac_sample_rates(s, mkv, side_data, side_data_size, in mkv_check_new_extra_data()
2232 avio_seek(mkv->track.bc, track->codecpriv_offset, SEEK_SET); in mkv_check_new_extra_data()
2233 mkv_write_codecprivate(s, mkv->track.bc, par, 1, 0); in mkv_check_new_extra_data()
2234 filler = MAX_PCE_SIZE + 2 + 4 - (avio_tell(mkv->track.bc) - track->codecpriv_offset); in mkv_check_new_extra_data()
2236 put_ebml_void(mkv->track.bc, filler); in mkv_check_new_extra_data()
2237 avio_seek(mkv->track.bc, track->sample_rate_offset, SEEK_SET); in mkv_check_new_extra_data()
2238 put_ebml_float(mkv->track.bc, MATROSKA_ID_AUDIOSAMPLINGFREQ, track->sample_rate); in mkv_check_new_extra_data()
2239 put_ebml_float(mkv->track.bc, MATROSKA_ID_AUDIOOUTSAMPLINGFREQ, output_sample_rate); in mkv_check_new_extra_data()
2247 if (side_data_size && mkv->track.bc) { in mkv_check_new_extra_data()
2255 avio_seek(mkv->track.bc, track->codecpriv_offset, SEEK_SET); in mkv_check_new_extra_data()
2256 mkv_write_codecprivate(s, mkv->track.bc, par, 1, 0); in mkv_check_new_extra_data()
2263 if (side_data_size && mkv->track.bc && !par->extradata_size) { in mkv_check_new_extra_data()
2277 avio_seek(mkv->track.bc, track->codecpriv_offset, SEEK_SET); in mkv_check_new_extra_data()
2279 put_ebml_binary(mkv->track.bc, MATROSKA_ID_CODECPRIVATE, codecpriv, 4); in mkv_check_new_extra_data()
2299 MatroskaMuxContext *mkv = s->priv_data; in mkv_write_packet_internal() local
2302 mkv_track *track = &mkv->tracks[pkt->stream_index]; in mkv_write_packet_internal()
2315 if (mkv->cluster_pos != -1) { in mkv_write_packet_internal()
2316 int64_t cluster_time = ts - mkv->cluster_pts; in mkv_write_packet_internal()
2325 if (mkv->cluster_pos == -1) { in mkv_write_packet_internal()
2326 ret = start_ebml_master_crc32(&mkv->cluster_bc, mkv); in mkv_write_packet_internal()
2329 mkv->cluster_pos = avio_tell(s->pb); in mkv_write_packet_internal()
2330 put_ebml_uint(mkv->cluster_bc, MATROSKA_ID_CLUSTERTIMECODE, FFMAX(0, ts)); in mkv_write_packet_internal()
2331 mkv->cluster_pts = FFMAX(0, ts); in mkv_write_packet_internal()
2335 mkv->cluster_pts, mkv->cluster_pos); in mkv_write_packet_internal()
2337 pb = mkv->cluster_bc; in mkv_write_packet_internal()
2345 if (keyframe && IS_SEEKABLE(s->pb, mkv) && in mkv_write_packet_internal()
2346 (par->codec_type == AVMEDIA_TYPE_VIDEO || !mkv->have_video && !track->has_cue)) { in mkv_write_packet_internal()
2347 ret = mkv_add_cuepoint(mkv, pkt->stream_index, ts, in mkv_write_packet_internal()
2348 mkv->cluster_pos, relative_packet_pos, -1); in mkv_write_packet_internal()
2375 if (IS_SEEKABLE(s->pb, mkv)) { in mkv_write_packet_internal()
2376 ret = mkv_add_cuepoint(mkv, pkt->stream_index, ts, in mkv_write_packet_internal()
2377 mkv->cluster_pos, relative_packet_pos, duration); in mkv_write_packet_internal()
2383 mkv->duration = FFMAX(mkv->duration, ts + duration); in mkv_write_packet_internal()
2391 MatroskaMuxContext *mkv = s->priv_data; in mkv_write_packet() local
2403 if (mkv->cluster_pos != -1) { in mkv_write_packet()
2404 if (mkv->tracks[pkt->stream_index].write_dts) in mkv_write_packet()
2405 cluster_time = pkt->dts - mkv->cluster_pts; in mkv_write_packet()
2407 cluster_time = pkt->pts - mkv->cluster_pts; in mkv_write_packet()
2408 cluster_time += mkv->tracks[pkt->stream_index].ts_offset; in mkv_write_packet()
2410 cluster_size = avio_tell(mkv->cluster_bc); in mkv_write_packet()
2412 if (mkv->is_dash && codec_type == AVMEDIA_TYPE_VIDEO) { in mkv_write_packet()
2417 } else if (mkv->is_dash && codec_type == AVMEDIA_TYPE_AUDIO && in mkv_write_packet()
2418 cluster_time > mkv->cluster_time_limit) { in mkv_write_packet()
2421 } else if (!mkv->is_dash && in mkv_write_packet()
2422 (cluster_size > mkv->cluster_size_limit || in mkv_write_packet()
2423 cluster_time > mkv->cluster_time_limit || in mkv_write_packet()
2437 if (!mkv->cluster_pos) in mkv_write_packet()
2440 …keyframe && (mkv->have_video ? codec_type == AVMEDIA_TYPE_VIDEO : 1) ? AVIO_DATA_MARKER_SYNC_POINT… in mkv_write_packet()
2443 if (mkv->cur_audio_pkt->size > 0) { in mkv_write_packet()
2444 ret = mkv_write_packet_internal(s, mkv->cur_audio_pkt); in mkv_write_packet()
2445 av_packet_unref(mkv->cur_audio_pkt); in mkv_write_packet()
2457 ret = av_packet_ref(mkv->cur_audio_pkt, pkt); in mkv_write_packet()
2465 MatroskaMuxContext *mkv = s->priv_data; in mkv_write_flush_packet() local
2468 if (mkv->cluster_pos != -1) { in mkv_write_flush_packet()
2483 MatroskaMuxContext *mkv = s->priv_data; in mkv_write_trailer() local
2489 if (mkv->cur_audio_pkt->size > 0) { in mkv_write_trailer()
2490 ret = mkv_write_packet_internal(s, mkv->cur_audio_pkt); in mkv_write_trailer()
2498 if (mkv->cluster_pos != -1) { in mkv_write_trailer()
2499 ret = end_ebml_master_crc32(pb, &mkv->cluster_bc, mkv, in mkv_write_trailer()
2509 if (!IS_SEEKABLE(pb, mkv)) in mkv_write_trailer()
2514 if (mkv->cues.num_entries && mkv->reserve_cues_space >= 0) { in mkv_write_trailer()
2519 ret = start_ebml_master_crc32(&cues, mkv); in mkv_write_trailer()
2523 ret = mkv_assemble_cues(s->streams, cues, &mkv->cues, in mkv_write_trailer()
2524 mkv->tracks, s->nb_streams); in mkv_write_trailer()
2530 if (mkv->reserve_cues_space) { in mkv_write_trailer()
2534 if (mkv->reserve_cues_space < size) { in mkv_write_trailer()
2538 mkv->reserve_cues_space, size); in mkv_write_trailer()
2542 if ((ret64 = avio_seek(pb, mkv->cues_pos, SEEK_SET)) < 0) { in mkv_write_trailer()
2546 if (mkv->reserve_cues_space == size + 1) { in mkv_write_trailer()
2557 ret = end_ebml_master_crc32(pb, &cues, mkv, MATROSKA_ID_CUES, in mkv_write_trailer()
2561 if (mkv->reserve_cues_space) { in mkv_write_trailer()
2562 if (size < mkv->reserve_cues_space) in mkv_write_trailer()
2563 put_ebml_void(pb, mkv->reserve_cues_space - size); in mkv_write_trailer()
2571 if (endpos - mkv->segment_offset < (1ULL << 56) - 1) { in mkv_write_trailer()
2572 if ((ret64 = avio_seek(pb, mkv->segment_offset - 8, SEEK_SET)) < 0) in mkv_write_trailer()
2574 put_ebml_length(pb, endpos - mkv->segment_offset, 8); in mkv_write_trailer()
2577 ret = mkv_write_seekhead(pb, mkv, 1, mkv->info.pos); in mkv_write_trailer()
2581 if (mkv->info.bc) { in mkv_write_trailer()
2583 av_log(s, AV_LOG_DEBUG, "end duration = %" PRIu64 "\n", mkv->duration); in mkv_write_trailer()
2584 avio_seek(mkv->info.bc, mkv->duration_offset, SEEK_SET); in mkv_write_trailer()
2585 put_ebml_float(mkv->info.bc, MATROSKA_ID_DURATION, mkv->duration); in mkv_write_trailer()
2586 ret = end_ebml_master_crc32(pb, &mkv->info.bc, mkv, in mkv_write_trailer()
2592 if (mkv->track.bc) { in mkv_write_trailer()
2594 avio_seek(pb, mkv->track.pos, SEEK_SET); in mkv_write_trailer()
2595 ret = end_ebml_master_crc32(pb, &mkv->track.bc, mkv, in mkv_write_trailer()
2602 if (mkv->tags.bc) { in mkv_write_trailer()
2606 const mkv_track *track = &mkv->tracks[i]; in mkv_write_trailer()
2615 avio_seek(mkv->tags.bc, track->duration_offset, SEEK_SET); in mkv_write_trailer()
2621 put_ebml_binary(mkv->tags.bc, MATROSKA_ID_TAGSTRING, duration_string, 20); in mkv_write_trailer()
2625 avio_seek(pb, mkv->tags.pos, SEEK_SET); in mkv_write_trailer()
2626 ret = end_ebml_master_crc32(pb, &mkv->tags.bc, mkv, in mkv_write_trailer()
2684 MatroskaMuxContext *mkv = s->priv_data; in mkv_init() local
2709 mkv->mode = MODE_WEBM; in mkv_init()
2710 mkv->write_crc = 0; in mkv_init()
2712 mkv->mode = MODE_MATROSKAv2; in mkv_init()
2714 mkv->cur_audio_pkt = av_packet_alloc(); in mkv_init()
2715 if (!mkv->cur_audio_pkt) in mkv_init()
2717 mkv->tracks = av_mallocz_array(s->nb_streams, sizeof(*mkv->tracks)); in mkv_init()
2718 if (!mkv->tracks) in mkv_init()
2726 mkv->segment_uid[i] = av_lfg_get(&c); in mkv_init()
2731 mkv_track *track = &mkv->tracks[i]; in mkv_init()
2736 track->uid = mkv_get_uid(mkv->tracks, i, &c); in mkv_init()
2743 if (mkv->mode == MODE_WEBM) { in mkv_init()
2751 mkv->nb_attachments++; in mkv_init()
2756 track->track_num = mkv->is_dash ? mkv->dash_track_number : nb_tracks; in mkv_init()
2760 if (mkv->is_dash && nb_tracks != 1) in mkv_init()