Lines Matching defs:matroska

28  * @see specs available on the Matroska project page: http://www.matroska.org/
62 #include "matroska.h"
817 static const char *const matroska_doctypes[] = { "matroska", "webm" };
822 static int matroska_reset_status(MatroskaDemuxContext *matroska,
827 err = avio_seek(matroska->ctx->pb, position, SEEK_SET);
831 position = avio_tell(matroska->ctx->pb);
833 matroska->current_id = id;
834 matroska->num_levels = 1;
835 matroska->unknown_count = 0;
836 matroska->resync_pos = position;
838 matroska->resync_pos -= (av_log2(id) + 7) / 8;
843 static int matroska_resync(MatroskaDemuxContext *matroska, int64_t last_pos)
845 AVIOContext *pb = matroska->ctx->pb;
851 av_log(matroska->ctx, AV_LOG_WARNING,
867 matroska_reset_status(matroska, id, -1);
872 matroska->levels[0].length = EBML_UNKNOWN_LENGTH;
878 matroska->done = 1;
890 static int ebml_read_num(MatroskaDemuxContext *matroska, AVIOContext *pb,
908 av_log(matroska->ctx, AV_LOG_ERROR,
912 av_log(matroska->ctx, AV_LOG_ERROR,
937 av_log(matroska->ctx, AV_LOG_ERROR,
943 av_log(matroska->ctx, AV_LOG_ERROR, "File ended prematurely "
955 static int ebml_read_length(MatroskaDemuxContext *matroska, AVIOContext *pb,
958 int res = ebml_read_num(matroska, pb, 8, number, 1);
1091 static int ebml_read_master(MatroskaDemuxContext *matroska,
1096 if (matroska->num_levels >= EBML_MAX_DEPTH) {
1097 av_log(matroska->ctx, AV_LOG_ERROR,
1102 level = &matroska->levels[matroska->num_levels++];
1113 static int matroska_ebmlnum_sint(MatroskaDemuxContext *matroska,
1120 if ((res = ebml_read_num(matroska, pb, 8, &unum, 1)) < 0)
1129 static int ebml_parse(MatroskaDemuxContext *matroska,
1145 static int ebml_parse_nest(MatroskaDemuxContext *matroska, EbmlSyntax *syntax,
1175 if (!matroska->levels[matroska->num_levels - 1].length) {
1176 matroska->num_levels--;
1182 res = ebml_parse(matroska, syntax, data);
1201 static MatroskaLevel1Element *matroska_find_level1_elem(MatroskaDemuxContext *matroska,
1215 for (i = 0; i < matroska->num_level1_elems; i++) {
1216 if (matroska->level1_elems[i].id == id) {
1217 if (matroska->level1_elems[i].pos == pos ||
1219 return &matroska->level1_elems[i];
1224 if (matroska->num_level1_elems >= FF_ARRAY_ELEMS(matroska->level1_elems)) {
1225 av_log(matroska->ctx, AV_LOG_ERROR, "Too many level1 elements.\n");
1229 elem = &matroska->level1_elems[matroska->num_level1_elems++];
1235 static int ebml_parse(MatroskaDemuxContext *matroska,
1251 AVIOContext *pb = matroska->ctx->pb;
1257 MatroskaLevel *level = matroska->num_levels ? &matroska->levels[matroska->num_levels - 1] : NULL;
1259 if (!matroska->current_id) {
1261 res = ebml_read_num(matroska, pb, 4, &id, 0);
1264 if (matroska->is_live)
1270 matroska->num_levels--;
1273 av_log(matroska->ctx, AV_LOG_ERROR, "File ended prematurely "
1280 matroska->current_id = id | 1 << 7 * res;
1284 pos -= (av_log2(matroska->current_id) + 7) / 8;
1287 id = matroska->current_id;
1297 matroska->num_levels--;
1303 av_log(matroska->ctx, AV_LOG_DEBUG, "Unknown entry 0x%"PRIX32" at pos. "
1329 matroska->current_id = 0;
1330 if ((res = ebml_read_length(matroska, pb, &length)) < 0)
1335 if (matroska->num_levels > 0) {
1346 av_log(matroska->ctx, AV_LOG_ERROR,
1355 av_log(matroska->ctx, AV_LOG_ERROR, "Unknown-sized element "
1365 av_log(matroska->ctx, AV_LOG_WARNING,
1377 av_log(matroska->ctx, AV_LOG_ERROR,
1382 av_log(matroska->ctx, AV_LOG_ERROR,
1387 av_log(matroska->ctx, AV_LOG_ERROR,
1418 matroska->unknown_count = 0;
1420 int64_t dist = length + UNKNOWN_EQUIV * matroska->unknown_count++;
1422 if (matroska->unknown_count > 3)
1423 dist += pos_alt - matroska->resync_pos;
1426 av_log(matroska->ctx, AV_LOG_ERROR,
1430 " in a row\n", id, pos, length, matroska->resync_pos,
1431 matroska->unknown_count);
1441 matroska->resync_pos = pos;
1467 if ((res = ebml_read_master(matroska, length, pos_alt)) < 0)
1470 matroska->segment_start = pos_alt;
1472 matroska->cues_parsing_deferred = 0;
1474 (level1_elem = matroska_find_level1_elem(matroska, syntax->id, pos))) {
1479 av_log(matroska->ctx, AV_LOG_ERROR, "Duplicate element\n");
1482 if (res = ebml_parse_nest(matroska, syntax->def.n, data))
1521 av_log(matroska->ctx, AV_LOG_ERROR, "Invalid element\n");
1523 av_log(matroska->ctx, AV_LOG_ERROR, "Read error\n");
1525 av_log(matroska->ctx, AV_LOG_ERROR, "File ended prematurely\n");
1539 if (level_check == LEVEL_ENDED && matroska->num_levels) {
1540 level = &matroska->levels[matroska->num_levels - 1];
1545 while (matroska->num_levels && pos == level->start + level->length) {
1546 matroska->num_levels--;
1636 static MatroskaTrack *matroska_find_track_by_num(MatroskaDemuxContext *matroska,
1639 MatroskaTrack *tracks = matroska->tracks.elem;
1642 for (i = 0; i < matroska->tracks.nb_elem; i++)
1646 av_log(matroska->ctx, AV_LOG_ERROR, "Invalid track number %"PRIu64"\n", num);
1829 MatroskaDemuxContext *matroska = s->priv_data;
1830 MatroskaTags *tags = matroska->tags.elem;
1833 for (i = 0; i < matroska->tags.nb_elem; i++) {
1835 MatroskaAttachment *attachment = matroska->attachments.elem;
1837 for (j = 0; j < matroska->attachments.nb_elem; j++) {
1852 MatroskaChapter *chapter = matroska->chapters.elem;
1854 for (j = 0; j < matroska->chapters.nb_elem; j++) {
1869 MatroskaTrack *track = matroska->tracks.elem;
1871 for (j = 0; j < matroska->tracks.nb_elem; j++) {
1892 static int matroska_parse_seekhead_entry(MatroskaDemuxContext *matroska,
1895 uint32_t saved_id = matroska->current_id;
1896 int64_t before_pos = avio_tell(matroska->ctx->pb);
1901 if (avio_seek(matroska->ctx->pb, pos, SEEK_SET) == pos) {
1904 if (matroska->num_levels == EBML_MAX_DEPTH) {
1905 av_log(matroska->ctx, AV_LOG_INFO,
1910 matroska->levels[matroska->num_levels] = (MatroskaLevel) { 0, EBML_UNKNOWN_LENGTH };
1911 matroska->num_levels++;
1912 matroska->current_id = 0;
1914 ret = ebml_parse(matroska, matroska_segment, matroska);
1923 ret2 = matroska_reset_status(matroska, saved_id, before_pos);
1930 static void matroska_execute_seekhead(MatroskaDemuxContext *matroska)
1932 EbmlList *seekhead_list = &matroska->seekhead;
1936 if (!(matroska->ctx->pb->seekable & AVIO_SEEKABLE_NORMAL))
1942 int64_t pos = seekheads[i].pos + matroska->segment_start;
1945 if (id != seekheads[i].id || pos < matroska->segment_start)
1948 elem = matroska_find_level1_elem(matroska, id, pos);
1958 if (matroska_parse_seekhead_entry(matroska, pos) < 0) {
1960 matroska->cues_parsing_deferred = -1;
1968 static void matroska_add_index_entries(MatroskaDemuxContext *matroska)
1975 if (matroska->ctx->flags & AVFMT_FLAG_IGNIDX)
1978 index_list = &matroska->index;
1982 if (index[1].time > 1E14 / matroska->time_scale) {
1983 av_log(matroska->ctx, AV_LOG_WARNING, "Dropping apparently-broken index.\n");
1990 MatroskaTrack *track = matroska_find_track_by_num(matroska,
1994 pos[j].pos + matroska->segment_start,
2001 static void matroska_parse_cues(MatroskaDemuxContext *matroska) {
2004 if (matroska->ctx->flags & AVFMT_FLAG_IGNIDX)
2007 for (i = 0; i < matroska->num_level1_elems; i++) {
2008 MatroskaLevel1Element *elem = &matroska->level1_elems[i];
2010 if (matroska_parse_seekhead_entry(matroska, elem->pos) < 0)
2011 matroska->cues_parsing_deferred = -1;
2017 matroska_add_index_entries(matroska);
2102 static int mkv_field_order(MatroskaDemuxContext *matroska, uint64_t field_order)
2108 if (matroska->muxingapp && sscanf(matroska->muxingapp, "Lavf57.%d.%d", &minor, &micro) == 2)
2434 MatroskaDemuxContext *matroska = s->priv_data;
2435 MatroskaTrack *tracks = matroska->tracks.elem;
2439 for (i = 0; i < matroska->tracks.nb_elem; i++) {
2459 av_log(matroska->ctx, AV_LOG_INFO,
2472 av_log(matroska->ctx, AV_LOG_INFO, "Inconsistent track type\n");
2478 av_log(matroska->ctx, AV_LOG_WARNING,
2488 av_log(matroska->ctx, AV_LOG_WARNING,
2506 av_log(matroska->ctx, AV_LOG_ERROR,
2523 av_log(matroska->ctx, AV_LOG_ERROR,
2538 av_log(matroska->ctx, AV_LOG_ERROR,
2548 av_log(matroska->ctx, AV_LOG_ERROR,
2652 av_log(matroska->ctx, AV_LOG_ERROR,
2725 av_log(matroska->ctx, AV_LOG_WARNING,
2729 if (matroska->ctx->error_recognition & AV_EF_EXPLODE)
2746 bytestream_put_le32(&ptr, av_rescale(matroska->duration * matroska->time_scale,
2807 av_log(matroska->ctx, AV_LOG_INFO, "Assuming WavPack version 4.10 "
2824 av_log(matroska->ctx, AV_LOG_INFO,
2828 av_log(matroska->ctx, AV_LOG_WARNING,
2833 avpriv_set_pts_info(st, 64, matroska->time_scale * track->time_scale,
2887 st->codecpar->field_order = mkv_field_order(matroska, track->video.field_order);
2933 for (k=0; k < matroska->tracks.nb_elem; k++)
2951 ret = mkv_parse_video_projection(st, track, matroska->ctx);
3010 MatroskaDemuxContext *matroska = s->priv_data;
3011 EbmlList *attachments_list = &matroska->attachments;
3012 EbmlList *chapters_list = &matroska->chapters;
3020 matroska->ctx = s;
3021 matroska->cues_parsing_deferred = 1;
3024 if (ebml_parse(matroska, ebml_syntax, &ebml) || !ebml.doctype) {
3025 av_log(matroska->ctx, AV_LOG_ERROR, "EBML header parsing failed\n");
3033 avpriv_report_missing_feature(matroska->ctx,
3039 av_log(matroska->ctx, AV_LOG_WARNING,
3049 if (matroska->ctx->error_recognition & AV_EF_EXPLODE) {
3056 matroska->pkt = si->parse_pkt;
3059 pos = avio_tell(matroska->ctx->pb);
3060 res = ebml_parse(matroska, matroska_segments, matroska);
3063 res = matroska_resync(matroska, pos);
3066 pos = avio_tell(matroska->ctx->pb);
3067 res = ebml_parse(matroska, matroska_segment, matroska);
3072 if (matroska->current_id == MATROSKA_ID_CLUSTER)
3073 si->data_offset = avio_tell(matroska->ctx->pb) - 4;
3074 matroska_execute_seekhead(matroska);
3076 if (!matroska->time_scale)
3077 matroska->time_scale = 1000000;
3078 if (isnan(matroska->duration))
3079 matroska->duration = 0;
3080 if (matroska->duration)
3081 matroska->ctx->duration = matroska->duration * matroska->time_scale *
3083 av_dict_set(&s->metadata, "title", matroska->title, 0);
3084 av_dict_set(&s->metadata, "encoder", matroska->muxingapp, 0);
3086 if (matroska->date_utc.size == 8)
3087 matroska_metadata_creation_time(&s->metadata, AV_RB64(matroska->date_utc.data));
3097 av_log(matroska->ctx, AV_LOG_ERROR, "incomplete attachment\n");
3150 matroska_add_index_entries(matroska);
3161 static int matroska_deliver_packet(MatroskaDemuxContext *matroska,
3164 if (matroska->queue.head) {
3165 MatroskaTrack *tracks = matroska->tracks.elem;
3168 avpriv_packet_list_get(&matroska->queue, pkt);
3173 av_log(matroska->ctx, AV_LOG_ERROR, "Cannot append palette to packet\n");
3188 static void matroska_clear_queue(MatroskaDemuxContext *matroska)
3190 avpriv_packet_list_free(&matroska->queue);
3193 static int matroska_parse_laces(MatroskaDemuxContext *matroska, uint8_t **buf,
3253 n = ebml_read_num(matroska, pb, 8, &num, 1);
3264 r = matroska_ebmlnum_sint(matroska, pb, &snum);
3289 static int matroska_parse_rm_audio(MatroskaDemuxContext *matroska,
3307 av_log(matroska->ctx, AV_LOG_ERROR,
3316 av_log(matroska->ctx, AV_LOG_ERROR,
3323 av_log(matroska->ctx, AV_LOG_ERROR,
3343 AVPacket *pkt = matroska->pkt;
3356 ret = avpriv_packet_list_put(&matroska->queue, pkt, NULL, 0);
3366 /* reconstruct full wavpack blocks from mangled matroska ones */
3472 static int matroska_parse_webvtt(MatroskaDemuxContext *matroska,
3480 AVPacket *pkt = matroska->pkt;
3578 err = avpriv_packet_list_put(&matroska->queue, pkt, NULL, 0);
3587 static int matroska_parse_frame(MatroskaDemuxContext *matroska,
3597 AVPacket *pkt = matroska->pkt;
3602 av_log(matroska->ctx, AV_LOG_ERROR,
3615 av_log(matroska->ctx, AV_LOG_ERROR,
3680 res = avpriv_packet_list_put(&matroska->queue, pkt, NULL, 0);
3695 static int matroska_parse_block(MatroskaDemuxContext *matroska, AVBufferRef *buf, uint8_t *data,
3716 if ((n = ebml_read_num(matroska, &pb.pub, 8, &num, 1)) < 0)
3721 track = matroska_find_track_by_num(matroska, num);
3726 av_log(matroska->ctx, AV_LOG_VERBOSE,
3752 ff_reduce_index(matroska->ctx, st->index);
3758 if (matroska->skip_to_keyframe &&
3763 if ((int64_t)timecode < (int64_t)matroska->skip_to_timecode)
3766 matroska->skip_to_keyframe = 0;
3768 av_log(matroska->ctx, AV_LOG_ERROR, "File is broken, keyframes not correctly marked!\n");
3769 matroska->skip_to_keyframe = 0;
3773 res = matroska_parse_laces(matroska, &data, size, (flags & 0x06) >> 1,
3776 av_log(matroska->ctx, AV_LOG_ERROR, "Error parsing frame sizes.\n");
3790 block_duration = track->default_duration * laces / matroska->time_scale;
3813 res = matroska_parse_rm_audio(matroska, track, st,
3821 res = matroska_parse_webvtt(matroska, track, st,
3830 res = matroska_parse_frame(matroska, track, st, buf, out_data,
3847 static int matroska_parse_cluster(MatroskaDemuxContext *matroska)
3849 MatroskaCluster *cluster = &matroska->current_cluster;
3853 av_assert0(matroska->num_levels <= 2);
3855 if (matroska->num_levels == 1) {
3856 res = ebml_parse(matroska, matroska_segment, NULL);
3860 cluster->pos = avio_tell(matroska->ctx->pb) - 4;
3862 res = ebml_parse(matroska, matroska_cluster_enter, cluster);
3868 if (matroska->num_levels == 2) {
3870 res = ebml_parse(matroska, matroska_cluster_parsing, cluster);
3877 res = matroska_parse_block(matroska, block->bin.buf, block->bin.data,
3887 } else if (!matroska->num_levels) {
3888 if (!avio_feof(matroska->ctx->pb)) {
3889 avio_r8(matroska->ctx->pb);
3890 if (!avio_feof(matroska->ctx->pb)) {
3891 av_log(matroska->ctx, AV_LOG_WARNING, "File extends beyond "
3896 matroska->done = 1;
3905 MatroskaDemuxContext *matroska = s->priv_data;
3908 if (matroska->resync_pos == -1) {
3910 matroska->resync_pos = avio_tell(s->pb);
3913 while (matroska_deliver_packet(matroska, pkt)) {
3914 if (matroska->done)
3916 if (matroska_parse_cluster(matroska) < 0 && !matroska->done)
3917 ret = matroska_resync(matroska, matroska->resync_pos);
3926 MatroskaDemuxContext *matroska = s->priv_data;
3933 if (matroska->cues_parsing_deferred > 0) {
3934 matroska->cues_parsing_deferred = 0;
3935 matroska_parse_cues(matroska);
3944 matroska_reset_status(matroska, 0, sti->index_entries[sti->nb_index_entries - 1].pos);
3947 matroska_clear_queue(matroska);
3948 if (matroska_parse_cluster(matroska) < 0)
3953 matroska_clear_queue(matroska);
3954 if (index < 0 || (matroska->cues_parsing_deferred < 0 &&
3958 tracks = matroska->tracks.elem;
3959 for (i = 0; i < matroska->tracks.nb_elem; i++) {
3967 matroska_reset_status(matroska, 0, sti->index_entries[index].pos);
3970 matroska->skip_to_timecode = timestamp;
3973 matroska->skip_to_timecode = sti->index_entries[index].timestamp;
3975 matroska->skip_to_keyframe = 1;
3976 matroska->done = 0;
3982 matroska_reset_status(matroska, 0, -1);
3983 matroska->resync_pos = -1;
3984 matroska_clear_queue(matroska);
3986 matroska->skip_to_keyframe = 0;
3987 matroska->done = 0;
3993 MatroskaDemuxContext *matroska = s->priv_data;
3994 MatroskaTrack *tracks = matroska->tracks.elem;
3997 matroska_clear_queue(matroska);
3999 for (n = 0; n < matroska->tracks.nb_elem; n++)
4002 ebml_free(matroska_segment, matroska);
4020 MatroskaDemuxContext *matroska = s->priv_data;
4027 if (ts >= (int64_t)(matroska->duration * matroska->time_scale))
4030 if (index_entries[i - 1].timestamp * matroska->time_scale <= ts &&
4031 index_entries[i].timestamp * matroska->time_scale > ts) {
4036 cue_desc.start_time_ns = index_entries[i].timestamp * matroska->time_scale;
4037 cue_desc.start_offset = index_entries[i].pos - matroska->segment_start;
4039 cue_desc.end_time_ns = index_entries[i + 1].timestamp * matroska->time_scale;
4040 cue_desc.end_offset = index_entries[i + 1].pos - matroska->segment_start;
4042 cue_desc.end_time_ns = matroska->duration * matroska->time_scale;
4046 cue_desc.end_offset = cues_start - matroska->segment_start;
4053 MatroskaDemuxContext *matroska = s->priv_data;
4056 uint32_t id = matroska->current_id;
4075 read = ebml_read_num(matroska, matroska->ctx->pb, 4, &cluster_id, 1);
4078 read = ebml_read_length(matroska, matroska->ctx->pb, &cluster_length);
4082 matroska_reset_status(matroska, 0, cluster_pos);
4083 matroska_clear_queue(matroska);
4084 if (matroska_parse_cluster(matroska) < 0 ||
4085 !matroska->queue.head) {
4088 pkt = &matroska->queue.head->pkt;
4098 matroska_reset_status(matroska, id, before_pos);
4186 MatroskaDemuxContext *matroska = s->priv_data;
4193 int64_t time_ns = sti->index_entries[i].timestamp * matroska->time_scale;
4218 if (matroska->duration * matroska->time_scale >= prebuffered_ns)
4252 (double)(matroska->duration * matroska->time_scale) / nano_seconds_per_second;
4282 MatroskaDemuxContext *matroska = s->priv_data;
4283 EbmlList *seekhead_list = &matroska->seekhead;
4300 before_pos = avio_tell(matroska->ctx->pb);
4301 cues_start = seekhead[i].pos + matroska->segment_start;
4302 if (avio_seek(matroska->ctx->pb, cues_start, SEEK_SET) == cues_start) {
4308 bytes_read = ebml_read_num (matroska, matroska->ctx->pb, 4, &cues_id, 1);
4311 bytes_read = ebml_read_length(matroska, matroska->ctx->pb, &cues_length);
4316 avio_seek(matroska->ctx->pb, before_pos, SEEK_SET);
4320 matroska_parse_cues(matroska);
4369 MatroskaDemuxContext *matroska = s->priv_data;
4374 if (!matroska->tracks.nb_elem || !s->nb_streams) {
4379 if (!matroska->is_live) {
4380 buf = av_asprintf("%g", matroska->duration);
4397 tracks = matroska->tracks.elem;
4401 if (!matroska->is_live) {
4410 if (matroska->bandwidth > 0) {
4412 matroska->bandwidth, 0);
4449 .name = "matroska,webm",
4459 .mime_type = "audio/webm,audio/x-matroska,video/webm,video/x-matroska"