Skip to content

Commit e1ec6db

Browse files
committed
EBML: Stub implement remaining Segment elements
1 parent 4242baf commit e1ec6db

File tree

7 files changed

+123
-10
lines changed

7 files changed

+123
-10
lines changed

lofty/src/ebml/element_reader.rs

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ use std::ops::{Deref, DerefMut};
88
use byteorder::{BigEndian, ReadBytesExt};
99
use lofty_attr::ebml_master_elements;
1010

11+
#[derive(Copy, Clone, Eq, PartialEq, Debug)]
1112
pub struct ElementHeader {
1213
pub(crate) id: VInt,
1314
pub(crate) size: VInt,
@@ -25,7 +26,7 @@ impl ElementHeader {
2526
}
2627
}
2728

28-
#[derive(Copy, Clone, Eq, PartialEq)]
29+
#[derive(Copy, Clone, Eq, PartialEq, Debug)]
2930
pub enum ElementDataType {
3031
SignedInt,
3132
UnsignedInt,
@@ -37,13 +38,13 @@ pub enum ElementDataType {
3738
Binary,
3839
}
3940

40-
#[derive(Copy, Clone)]
41+
#[derive(Copy, Clone, Debug)]
4142
struct MasterElement {
4243
id: ElementIdent,
4344
children: &'static [(VInt, ChildElementDescriptor)],
4445
}
4546

46-
#[derive(Copy, Clone)]
47+
#[derive(Copy, Clone, Debug)]
4748
pub(crate) struct ChildElementDescriptor {
4849
pub(crate) ident: ElementIdent,
4950
pub(crate) data_type: ElementDataType,
@@ -124,6 +125,23 @@ ebml_master_elements! {
124125
],
125126
},
126127

128+
// segment.tags
129+
Tags: {
130+
id: 0x1254_C367,
131+
children: [
132+
Tag: { 0x7373, Master },
133+
],
134+
},
135+
136+
// segment.tags.tag
137+
Tag: {
138+
id: 0x7373,
139+
children: [
140+
Targets: { 0x63C0, Master },
141+
SimpleTag: { 0x67C8, Master },
142+
],
143+
},
144+
127145
// segment.attachments
128146
Attachments: {
129147
id: 0x1941_A469,

lofty/src/ebml/read.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
mod segment;
2+
mod segment_attachments;
3+
mod segment_chapters;
4+
mod segment_cluster;
25
mod segment_info;
6+
mod segment_tags;
37
mod segment_tracks;
48

59
use super::EbmlFile;

lofty/src/ebml/read/segment.rs

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
use super::{segment_info, segment_tracks};
1+
use super::{
2+
segment_attachments, segment_chapters, segment_cluster, segment_info, segment_tags,
3+
segment_tracks,
4+
};
25
use crate::config::ParseOptions;
36
use crate::ebml::element_reader::{ElementIdent, ElementReader, ElementReaderYield};
47
use crate::ebml::properties::EbmlProperties;
@@ -22,16 +25,36 @@ where
2225
while let Some(child) = children_reader.next()? {
2326
match child {
2427
ElementReaderYield::Master((id, size)) => match id {
25-
ElementIdent::Info => {
28+
ElementIdent::Info if parse_options.read_properties => {
2629
segment_info::read_from(children_reader.inner(), parse_options, properties)?
2730
},
28-
ElementIdent::Cluster => todo!("Support segment.Cluster"),
29-
ElementIdent::Tracks => {
31+
ElementIdent::Cluster if parse_options.read_properties => {
32+
segment_cluster::read_from(children_reader.inner(), parse_options, properties)?
33+
},
34+
ElementIdent::Tracks if parse_options.read_properties => {
3035
segment_tracks::read_from(children_reader.inner(), parse_options, properties)?
3136
},
32-
ElementIdent::Tags => todo!("Support segment.Tags"),
33-
ElementIdent::Attachments => todo!("Support segment.Attachments"),
34-
ElementIdent::Chapters => todo!("Support segment.Chapters"),
37+
ElementIdent::Tags | ElementIdent::Attachments | ElementIdent::Chapters => {
38+
let mut tag = tags.unwrap_or_default();
39+
40+
if id == ElementIdent::Tags {
41+
segment_tags::read_from(children_reader.inner(), parse_options, &mut tag)?
42+
} else if id == ElementIdent::Attachments {
43+
segment_attachments::read_from(
44+
children_reader.inner(),
45+
parse_options,
46+
&mut tag,
47+
)?
48+
} else {
49+
segment_chapters::read_from(
50+
children_reader.inner(),
51+
parse_options,
52+
&mut tag,
53+
)?
54+
}
55+
56+
tags = Some(tag);
57+
},
3558
_ => {
3659
// We do not end up using information from all of the segment
3760
// elements, so we can just skip any useless ones.
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
use crate::config::ParseOptions;
2+
use crate::ebml::element_reader::ElementReader;
3+
use crate::ebml::EbmlTag;
4+
use crate::error::Result;
5+
6+
use std::io::{Read, Seek};
7+
8+
pub(super) fn read_from<R>(
9+
_element_reader: &mut ElementReader<R>,
10+
_parse_options: ParseOptions,
11+
_tag: &mut EbmlTag,
12+
) -> Result<()>
13+
where
14+
R: Read + Seek,
15+
{
16+
unimplemented!("\\Ebml\\Segment\\Attachments")
17+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
use crate::config::ParseOptions;
2+
use crate::ebml::element_reader::ElementReader;
3+
use crate::ebml::EbmlTag;
4+
use crate::error::Result;
5+
6+
use std::io::{Read, Seek};
7+
8+
pub(super) fn read_from<R>(
9+
_element_reader: &mut ElementReader<R>,
10+
_parse_options: ParseOptions,
11+
_tag: &mut EbmlTag,
12+
) -> Result<()>
13+
where
14+
R: Read + Seek,
15+
{
16+
unimplemented!("\\Ebml\\Segment\\Chapters")
17+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
use crate::config::ParseOptions;
2+
use crate::ebml::element_reader::ElementReader;
3+
use crate::ebml::properties::EbmlProperties;
4+
use crate::error::Result;
5+
6+
use std::io::{Read, Seek};
7+
8+
pub(super) fn read_from<R>(
9+
_element_reader: &mut ElementReader<R>,
10+
_parse_options: ParseOptions,
11+
_properties: &mut EbmlProperties,
12+
) -> Result<()>
13+
where
14+
R: Read + Seek,
15+
{
16+
unimplemented!("\\Ebml\\Segment\\Cluster")
17+
}

lofty/src/ebml/read/segment_tags.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
use crate::config::ParseOptions;
2+
use crate::ebml::element_reader::ElementReader;
3+
use crate::ebml::EbmlTag;
4+
use crate::error::Result;
5+
6+
use std::io::{Read, Seek};
7+
8+
pub(super) fn read_from<R>(
9+
_element_reader: &mut ElementReader<R>,
10+
_parse_options: ParseOptions,
11+
_tag: &mut EbmlTag,
12+
) -> Result<()>
13+
where
14+
R: Read + Seek,
15+
{
16+
unimplemented!("\\Ebml\\Segment\\Tags")
17+
}

0 commit comments

Comments
 (0)