Skip to main content

mxf/
lib.rs

1
2extern crate byteorder;
3
4pub mod klv;
5pub mod serializer;
6
7#[cfg(test)]
8mod test {
9  // use serializer::decoder::*;
10  // use serializer::encoder::*;
11  use klv::ul::*;
12  use klv::klv::*;
13  use klv::klv_reader::*;
14  use klv::value::value::*;
15  use klv::value::value::Element;
16
17  #[test]
18  fn read_empty_file() {
19    use std::io::Cursor;
20
21    let stream = Cursor::new(vec![0; 0]);
22    let mut reader = KlvReader{
23      stream: stream,
24      elements: vec![]
25    };
26
27    let result = next_klv(&mut reader);
28
29    assert!(result.is_ok());
30    assert!(result.unwrap() == None);
31  }
32
33  #[test]
34  fn read_first_key() {
35    use std::io::Cursor;
36
37    let data = vec![
38      0x06, 0x0e, 0x2b, 0x34, 0x02, 0x05, 0x01, 0x01, 0x0d, 0x01, 0x02, 0x01, 0x01, 0x02, 0x04, 0x00,
39      0x83, 0x00, 0x00, 0x68,
40      0x00, 0x01, 0x00, 0x02, // version major and minor
41      0x00, 0x00, 0x01, 0x00, // kag size
42      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // this partition
43      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // previous partition
44      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // footer partition
45      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // header byte count
46      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // index byte count
47      0x00, 0x00, 0x00, 0x00, // index sid
48      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // body byte count
49      0x00, 0x00, 0x00, 0x00, // body sid
50      0x06, 0x0e, 0x2b, 0x34, 0x04, 0x01, 0x01, 0x01, 0x0d, 0x01, 0x02, 0x01, 0x01, 0x01, 0x09, 0x00, // operational pattern
51      0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, // UL batch
52      0x06, 0x0e, 0x2b, 0x34, 0x04, 0x01, 0x01, 0x02, 0x0d, 0x01, 0x03, 0x01, 0x02, 0x04, 0x97, 0x01, // Mpeg ES
53    ];
54
55    let stream = Cursor::new(data);
56    let mut reader = KlvReader{
57      stream: stream,
58      elements: vec![]
59    };
60
61    let valid_klv = next_klv(&mut reader).unwrap().unwrap();
62    
63    assert_eq!(valid_klv, Klv {
64      key: Ul::HeaderPartition,
65      value: Value {
66        elements: vec![
67          Element {
68            identifier: Ul::PartitionMajor,
69            value: Some(ValueData::Uint16{ data: 1 })
70          },
71          Element {
72            identifier: Ul::PartitionMinor,
73            value: Some(ValueData::Uint16{ data: 2 })
74          },
75          Element {
76            identifier: Ul::PartitionKagSize,
77            value: Some(ValueData::Uint32{ data: 256 })
78          },
79          Element {
80            identifier: Ul::PartitionThisPartition,
81            value: Some(ValueData::Uint64{ data: 0 })
82          },
83          Element {
84            identifier: Ul::PartitionPreviousPartition,
85            value: Some(ValueData::Uint64{ data: 0 })
86          },
87          Element {
88            identifier: Ul::PartitionFooterPartition,
89            value: Some(ValueData::Uint64{ data: 0 })
90          },
91          Element {
92            identifier: Ul::PartitionHeaderByteCount,
93            value: Some(ValueData::Uint64{ data: 0 })
94          },
95          Element {
96            identifier: Ul::PartitionIndexByteCount,
97            value: Some(ValueData::Uint64{ data: 0 })
98          },
99          Element {
100            identifier: Ul::PartitionIndexSid,
101            value: Some(ValueData::Uint32{ data: 0 })
102          },
103          Element {
104            identifier: Ul::PartitionByteOffset,
105            value: Some(ValueData::Uint64{ data: 0 })
106          },
107          Element {
108            identifier: Ul::PartitionBodySid,
109            value: Some(ValueData::Uint32{ data: 0 })
110          },
111          // Element {
112          //   identifier: Ul::PartitionOperationalPattern,
113          //   value: None
114          // },
115          Element {
116            identifier: Ul::PartitionEssenceContainers,
117            value: Some(ValueData::ArrayUl {
118              data: vec![Ul::Essence_MpegEsWithStreamIdFrameWrapped]
119            })
120          }
121        ]
122      }
123    });
124  }
125
126  // #[test]
127  // fn generate_file() {
128  //   use std::io::prelude::*;
129  //   use std::io::Cursor;
130
131  //   let mut stream = Cursor::new(vec![0; 0]);
132
133  //   let header_value = Value {
134  //     elements: vec![
135  //       Element{
136  //         identifier: Ul::PartitionMajor,
137  //         value: None
138  //       },
139  //       Element{
140  //         identifier: Ul::PartitionMinor,
141  //         value: None
142  //       },
143  //       Element{
144  //         identifier: Ul::PartitionKagSize,
145  //         value: None
146  //       },
147  //       Element{
148  //         identifier: Ul::PartitionThisPartition,
149  //         value: None
150  //       },
151  //       Element{
152  //         identifier: Ul::PartitionPreviousPartition,
153  //         value: None
154  //       },
155  //       Element{
156  //         identifier: Ul::PartitionFooterPartition,
157  //         value: None
158  //       },
159  //       Element{
160  //         identifier: Ul::PartitionHeaderByteCount,
161  //         value: None
162  //       },
163  //       Element{
164  //         identifier: Ul::PartitionIndexByteCount,
165  //         value: None
166  //       },
167  //       Element{
168  //         identifier: Ul::PartitionIndexSid,
169  //         value: None
170  //       },
171  //       Element{
172  //         identifier: Ul::PartitionByteOffset,
173  //         value: None
174  //       },
175  //       Element{
176  //         identifier: Ul::PartitionBodySid,
177  //         value: None
178  //       },
179  //       Element{
180  //         identifier: Ul::PartitionOperationalPattern,
181  //         value: None
182  //       },
183  //       Element{
184  //         identifier: Ul::PartitionEssenceContainers,
185  //         value: None
186  //       },
187  //     ]
188  //   };
189
190  //   let header_klv = Klv {
191  //     key: Ul::HeaderPartition,
192  //     value: header_value
193  //   };
194
195  //   stream.write(Encoder::serialise(&header_klv).as_ref()).unwrap();
196
197  //   let frame_value = Value {
198  //     elements: vec![
199  //       Element{
200  //         identifier: Ul::Unknown,
201  //         value: None
202  //       }
203  //     ]
204  //   };
205
206  //   let frame_klv = Klv {
207  //     key: Ul::PictureItemMpegFrameWrappedPictureElement,
208  //     value: frame_value
209  //   };
210
211  //   stream.write(Encoder::serialise(&frame_klv).as_ref()).unwrap();
212  //   assert_eq!(stream.get_ref().len(), 2124);
213  // }
214}