@@ -18,23 +18,24 @@ defmodule Membrane.MP4.Container.ParseHelper do
1818
1919 def parse_boxes ( data , schema , context , acc ) do
2020 withl header_content:
21- { :ok , % { name: name , content_size: content_size } , rest } <- Header . parse ( data ) ,
21+ { :ok , % { name: name , content_size: content_size , header_size: header_size } , rest } <-
22+ Header . parse ( data ) ,
2223 header_content: << content :: binary - size ( content_size ) , data :: binary >> <- rest ,
2324 do: box_schema = schema [ name ] ,
2425 known?: true <- box_schema && not box_schema . black_box? ,
2526 try:
2627 { :ok , { fields , rest } , context } <- parse_fields ( content , box_schema . fields , context ) ,
2728 try:
2829 { :ok , children , << >> , context } <- parse_boxes ( rest , box_schema . children , context , [ ] ) do
29- box = % { fields: fields , children: children }
30+ box = % { fields: fields , children: children , size: content_size , header_size: header_size }
3031 parse_boxes ( data , schema , context , [ { name , box } | acc ] )
3132 else
3233 header_content: _error ->
3334 # more data needed
3435 { :ok , Enum . reverse ( acc ) , data , context }
3536
3637 known?: _ ->
37- box = % { content: content }
38+ box = % { content: content , size: content_size , header_size: header_size }
3839 parse_boxes ( data , schema , context , [ { name , box } | acc ] )
3940
4041 try: { :error , context } ->
@@ -62,11 +63,24 @@ defmodule Membrane.MP4.Container.ParseHelper do
6263 end
6364 end
6465
65- defp parse_field ( data , { name , { type , store: context_name , when: condition } } , context ) do
66- { flag , key } = condition
66+ defp parse_field ( data , { name , { type , store: context_name , when: { key , [ mask: mask ] } } } , context ) do
6767 context_object = Map . get ( context , key , 0 )
6868
69- if ( flag &&& context_object ) == flag do
69+ if ( mask &&& context_object ) == mask do
70+ parse_field ( data , { name , { type , store: context_name } } , context )
71+ else
72+ { :ok , { [ ] , data } , context }
73+ end
74+ end
75+
76+ defp parse_field (
77+ data ,
78+ { name , { type , store: context_name , when: { key , [ value: value ] } } } ,
79+ context
80+ ) do
81+ context_object = Map . get ( context , key , 0 )
82+
83+ if context_object == value do
7084 parse_field ( data , { name , { type , store: context_name } } , context )
7185 else
7286 { :ok , { [ ] , data } , context }
@@ -80,11 +94,20 @@ defmodule Membrane.MP4.Container.ParseHelper do
8094 { :ok , result , context }
8195 end
8296
83- defp parse_field ( data , { name , { type , when: condition } } , context ) do
84- { flag , key } = condition
97+ defp parse_field ( data , { name , { type , when: { key , [ mask: mask ] } } } , context ) do
98+ context_object = Map . get ( context , key , 0 )
99+
100+ if ( mask &&& context_object ) == mask do
101+ parse_field ( data , { name , type } , context )
102+ else
103+ { :ok , { [ ] , data } , context }
104+ end
105+ end
106+
107+ defp parse_field ( data , { name , { type , when: { key , [ value: value ] } } } , context ) do
85108 context_object = Map . get ( context , key , 0 )
86109
87- if ( flag &&& context_object ) == flag do
110+ if context_object == value do
88111 parse_field ( data , { name , type } , context )
89112 else
90113 { :ok , { [ ] , data } , context }
0 commit comments