int ebml_read_sint (ebml_parser_t *ebml, ebml_elem_t *elem, int64_t *num) { uint8_t data[8]; uint64_t size = elem->len; if ((elem->len < 1) || (elem->len > 8)) { xprintf(ebml->xine, XINE_VERBOSITY_LOG, "ebml: Invalid integer element size %" PRIu64 "\n", size); return 0; } if (!ebml_read_elem_data(ebml, data, size)) return 0; /* propagate negative bit */ if (data[0] & 80) *num = -1; else *num = 0; while (size > 0) { *num = (*num << 8) | data[elem->len - size]; size--; } return 1; }
int ebml_read_float (ebml_parser_t *ebml, ebml_elem_t *elem, double *num) { uint8_t data[10]; uint64_t size = elem->len; if ((size != 4) && (size != 8) && (size != 10)) { xprintf(ebml->xine, XINE_VERBOSITY_LOG, "ebml: Invalid float element size %" PRIu64 "\n", size); return 0; } if (!ebml_read_elem_data(ebml, data, size)) return 0; if (size == 10) { xprintf(ebml->xine, XINE_VERBOSITY_LOG, "ebml: FIXME! 10-byte floats unimplemented\n"); return 0; } if (size == 4) { float f; *((uint32_t *) &f) = _X_BE_32(data); *num = f; } else { double d; *((uint64_t *) &d) = _X_BE_64(data); *num = d; } return 1; }
int ebml_read_ascii(ebml_parser_t *ebml, ebml_elem_t *elem, char *str) { uint64_t size = elem->len; if (!ebml_read_elem_data(ebml, str, size)) return 0; return 1; }
int ebml_read_binary(ebml_parser_t *ebml, ebml_elem_t *elem, void *binary) { return !!ebml_read_elem_data(ebml, binary, elem->len); }