/src/mozilla-central/media/libmkv/EbmlBufferWriter.c
Line | Count | Source (jump to first uncovered line) |
1 | | // #include <strmif.h> |
2 | | #include "EbmlBufferWriter.h" |
3 | | #include "EbmlWriter.h" |
4 | | // #include <cassert> |
5 | | // #include <limits> |
6 | | // #include <malloc.h> //_alloca |
7 | | #include <stdlib.h> |
8 | | #include <wchar.h> |
9 | | #include <string.h> |
10 | | |
11 | | void |
12 | | Ebml_Serialize(EbmlGlobal *glob, const void *buffer_in, int buffer_size, unsigned long len) |
13 | 0 | { |
14 | 0 | /* buffer_size: |
15 | 0 | * 1 - int8_t; |
16 | 0 | * 2 - int16_t; |
17 | 0 | * 4 - int32_t; |
18 | 0 | * 8 - int64_t; |
19 | 0 | */ |
20 | 0 | long i; |
21 | 0 | for(i = len-1; i >= 0; i--) { |
22 | 0 | unsigned char x; |
23 | 0 | if (buffer_size == 1) { |
24 | 0 | x = (char)(*(const int8_t *)buffer_in >> (i * 8)); |
25 | 0 | } else if (buffer_size == 2) { |
26 | 0 | x = (char)(*(const int16_t *)buffer_in >> (i * 8)); |
27 | 0 | } else if (buffer_size == 4) { |
28 | 0 | x = (char)(*(const int32_t *)buffer_in >> (i * 8)); |
29 | 0 | } else if (buffer_size == 8) { |
30 | 0 | x = (char)(*(const int64_t *)buffer_in >> (i * 8)); |
31 | 0 | } |
32 | 0 | Ebml_Write(glob, &x, 1); |
33 | 0 | } |
34 | 0 | } |
35 | | |
36 | 0 | void Ebml_Write(EbmlGlobal *glob, const void *buffer_in, unsigned long len) { |
37 | 0 | unsigned char *src = glob->buf; |
38 | 0 | src += glob->offset; |
39 | 0 | memcpy(src, buffer_in, len); |
40 | 0 | glob->offset += len; |
41 | 0 | } |
42 | | |
43 | 0 | static void _Serialize(EbmlGlobal *glob, const unsigned char *p, const unsigned char *q) { |
44 | 0 | while (q != p) { |
45 | 0 | --q; |
46 | 0 |
|
47 | 0 | memcpy(&(glob->buf[glob->offset]), q, 1); |
48 | 0 | glob->offset++; |
49 | 0 | } |
50 | 0 | } |
51 | | |
52 | | /* |
53 | | void Ebml_Serialize(EbmlGlobal *glob, const void *buffer_in, unsigned long len) { |
54 | | // assert(buf); |
55 | | |
56 | | const unsigned char *const p = (const unsigned char *)(buffer_in); |
57 | | const unsigned char *const q = p + len; |
58 | | |
59 | | _Serialize(glob, p, q); |
60 | | } |
61 | | */ |
62 | | |
63 | 0 | void Ebml_StartSubElement(EbmlGlobal *glob, EbmlLoc *ebmlLoc, unsigned long class_id) { |
64 | 0 | unsigned long long unknownLen = 0x01FFFFFFFFFFFFFFLL; |
65 | 0 | Ebml_WriteID(glob, class_id); |
66 | 0 | ebmlLoc->offset = glob->offset; |
67 | 0 | // todo this is always taking 8 bytes, this may need later optimization |
68 | 0 | Ebml_Serialize(glob, (void *)&unknownLen,sizeof(unknownLen), 8); // this is a key that says length unknown |
69 | 0 | } |
70 | | |
71 | 0 | void Ebml_EndSubElement(EbmlGlobal *glob, EbmlLoc *ebmlLoc) { |
72 | 0 | unsigned long long size = glob->offset - ebmlLoc->offset - 8; |
73 | 0 | unsigned long long curOffset = glob->offset; |
74 | 0 | glob->offset = ebmlLoc->offset; |
75 | 0 | size |= 0x0100000000000000LL; |
76 | 0 | Ebml_Serialize(glob, &size,sizeof(size), 8); |
77 | 0 | glob->offset = curOffset; |
78 | 0 | } |
79 | | |