From 83e5dd938e03406fd9c4d1c41b7853e648e647d5 Mon Sep 17 00:00:00 2001 From: Kubat <mael.martin31@gmail.com> Date: Tue, 19 May 2020 17:31:09 +0200 Subject: [PATCH] Working state --- inc/common/common.h | 8 ++++++-- src/common.c | 26 ++++++++++++++++++-------- src/mkv/mkv.c | 8 +++++++- 3 files changed, 31 insertions(+), 11 deletions(-) diff --git a/inc/common/common.h b/inc/common/common.h index 3831a078..faf50a37 100644 --- a/inc/common/common.h +++ b/inc/common/common.h @@ -33,8 +33,12 @@ uint32_t be_uint32_t(const uint8_t bytes[], size_t n); uint64_t be_uint64_t(const uint8_t bytes[], size_t n); /* Same as `be_uint64_t` but for Big-endian doubles. - Restriction: n <= 8 */ -double be_double_t(const uint8_t bytes[], size_t n); + Restriction: bytes must be of length 8. */ +double be_double_t(const uint8_t bytes[]); + +/* Same as `be_double_t` but for floats. Restriction: bytes must + be of length 4. */ +float be_float_t(const uint8_t bytes[]); /* Trim the string `str` of the char `c` from the right and the left. The string may not be null terminated. diff --git a/src/common.c b/src/common.c index 36486e0c..59f748da 100644 --- a/src/common.c +++ b/src/common.c @@ -33,16 +33,15 @@ be_uint32_t(const uint8_t bytes[], size_t n) return res; } -double -be_double_t(const uint8_t bytes[], size_t n) +float +be_float_t(const uint8_t bytes[]) { union { - uint8_t _bytes[8]; - double _double; - } res; - for (size_t i = 0; i < n; ++i) - res._bytes[i] = bytes[n - i - 1] & 0xff; - return res._double; + uint32_t _uint; + float _float; + } ret; + ret._uint = be_uint32_t(bytes, 4); + return ret._float; } uint64_t @@ -54,6 +53,17 @@ be_uint64_t(const uint8_t bytes[], size_t n) return res; } +double +be_double_t(const uint8_t bytes[]) +{ + union { + uint64_t _uint; + double _double; + } ret; + ret._uint = be_uint64_t(bytes, 8); + return ret._double; +} + char * trim(char *str, size_t len, char c) { diff --git a/src/mkv/mkv.c b/src/mkv/mkv.c index c6ce2ee7..c202b661 100644 --- a/src/mkv/mkv.c +++ b/src/mkv/mkv.c @@ -150,7 +150,12 @@ mkv_read_float(struct bufferfd *bf, double *res) if (bufferfd_bytes(bf, data_len, data) < 0) return -1; - *res = be_double_t(data, data_len); + if (data_len == 8) + *res = be_double_t(data); + else if (data_len == 4) + *res = (double) be_float_t(data); + else + return -1; } return n + (ssize_t) data_len; @@ -545,6 +550,7 @@ kara_read_segment_info(struct bufferfd *bf, double *len) if (eid == EBML_MKV_SEG_DURATION) { if ((n = mkv_read_float(bf, len)) < 0) return -1; + printf("%ld\n", n); } else if (eid == EBML_MKV_SEG_TS_SCALE) { -- GitLab