diff --git a/src/mkv/mkv.c b/src/mkv/mkv.c index 5d083f4a2cdbeb6dccdea3a6081b1b3bde4b50d6..7f0c9e2ec49f9703dc6534df4db62a7f9343c6bd 100644 --- a/src/mkv/mkv.c +++ b/src/mkv/mkv.c @@ -29,9 +29,10 @@ #define EBML_MKV_TAG_NAME 0x000045a3 #define EBML_MKV_TAG_STRING 0x00004487 #define EBML_MKV_TAG_BINARY 0x00004485 -#define EBML_MKV_SEG_DURATION 0x00004489 /* Segment: Duration, L2 */ -#define EBML_MKV_SEG_TS_SCALE 0x002ad7b1 /* Segment: TimestampScale, L2 */ -#define EBML_MKV_SEG_NAME 0x00007ba9 /* Segment: Title, L2 */ +#define EBML_MKV_INFO 0x1549a966 /* Segment: Info L1 */ +#define EBML_MKV_SEG_DURATION 0x00004489 /* Segment: Duration L2 */ +#define EBML_MKV_SEG_TS_SCALE 0x002ad7b1 /* Segment: TimestampScale L2 */ +#define EBML_MKV_SEG_NAME 0x00007ba9 /* Segment: Title L2 */ #define EBML_MKV_ATTACHEMENT 0x1941a469 #define EBML_MKV_ATTCH_NAME 0x0000466e /* Attachement: FileName, L3 */ #define EBML_MKV_ATTCH_DESC 0x0000467e /* Attachement: FileDescription, L3 */ @@ -499,7 +500,7 @@ kara_read_tags(struct bufferfd *bf, struct kara_metadata *dst) } static int -kara_read_segment(struct bufferfd *bf, size_t *len) +kara_read_segment_info(struct bufferfd *bf, size_t *len) { /* TODO: Read correct elements, Duration and TimestampScale, the result will be `*len = Duration * TimestampScale`. */ @@ -513,29 +514,25 @@ kara_read_segment(struct bufferfd *bf, size_t *len) uint32_t eid; uint64_t elen; - if ((n = mkv_read_element_id(bf, &eid)) < 0 || eid != EBML_MKV_SEGMENT) + if ((n = mkv_read_element_id(bf, &eid)) < 0) { return -1; + } data_len -= n; if ((n = mkv_read_element_length(bf, &elen)) < 0) return -1; - data_len -= n; + data_len -= (n + elen); /* Find what we need */ - if (eid == EBML_MKV_SEG_DURATION || - eid == EBML_MKV_SEG_TS_SCALE) { - switch (*len) { - case 0: - *len = 1; - /* Fallthrough */ - default: - printf("Len: %ld\n", n); - *len *= 1; - } + if (eid == EBML_MKV_SEG_DURATION) { + /* HANDLE (TODO) */ + *len = 1; } + + bufferfd_skip(bf, elen); } return 0; @@ -574,15 +571,17 @@ kara_read_length(size_t *len, const char *filename) if (eid == EBML_MKV_SEEKHEAD) { if (mkv_seek(&file, (size_t) header_len, (size_t) EBML_MKV_SEGMENT) < 0) goto error; - } else if (eid == EBML_MKV_SEGMENT) { - if (kara_read_segment(&file, len) < 0) + } else if (eid == EBML_MKV_INFO) { + if (kara_read_segment_info(&file, len) < 0) goto error; break; } else { if (mkv_read_element_length(&file, &elength) < 0) goto error; - if (bufferfd_skip(&file, elength) < 0) + if (bufferfd_skip(&file, elength) < 0) { + printf("Failed to skip %ld (bufferfd)\n", elength); goto error; + } } }