Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
F
ffmpeg.wasm-core
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Linshizhi
ffmpeg.wasm-core
Commits
464310c1
Commit
464310c1
authored
Apr 03, 2018
by
Paul B Mahol
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
avcodec: add siren audio decoder
parent
26ae9c9f
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
790 additions
and
1 deletion
+790
-1
Changelog
Changelog
+1
-0
Makefile
libavcodec/Makefile
+1
-0
allcodecs.c
libavcodec/allcodecs.c
+1
-0
avcodec.h
libavcodec/avcodec.h
+1
-0
codec_desc.c
libavcodec/codec_desc.c
+7
-0
siren.c
libavcodec/siren.c
+773
-0
version.h
libavcodec/version.h
+1
-1
vivo.c
libavformat/vivo.c
+5
-0
No files found.
Changelog
View file @
464310c1
...
...
@@ -37,6 +37,7 @@ version <next>:
- afirsrc audio filter source
- pad_opencl filter
- CDToons video decoder
- siren audio decoder
version 4.2:
...
...
libavcodec/Makefile
View file @
464310c1
...
...
@@ -584,6 +584,7 @@ OBJS-$(CONFIG_SIPR_DECODER) += sipr.o acelp_pitch_delay.o \
celp_math.o
acelp_vectors.o
\
acelp_filters.o
celp_filters.o
\
sipr16k.o
OBJS-$(CONFIG_SIREN_DECODER)
+=
siren.o
OBJS-$(CONFIG_SMACKAUD_DECODER)
+=
smacker.o
OBJS-$(CONFIG_SMACKER_DECODER)
+=
smacker.o
OBJS-$(CONFIG_SMC_DECODER)
+=
smc.o
...
...
libavcodec/allcodecs.c
View file @
464310c1
...
...
@@ -474,6 +474,7 @@ extern AVCodec ff_sbc_encoder;
extern
AVCodec
ff_sbc_decoder
;
extern
AVCodec
ff_shorten_decoder
;
extern
AVCodec
ff_sipr_decoder
;
extern
AVCodec
ff_siren_decoder
;
extern
AVCodec
ff_smackaud_decoder
;
extern
AVCodec
ff_sonic_encoder
;
extern
AVCodec
ff_sonic_decoder
;
...
...
libavcodec/avcodec.h
View file @
464310c1
...
...
@@ -661,6 +661,7 @@ enum AVCodecID {
AV_CODEC_ID_HCOM
,
AV_CODEC_ID_ACELP_KELVIN
,
AV_CODEC_ID_MPEGH_3D_AUDIO
,
AV_CODEC_ID_SIREN
,
/* subtitle codecs */
AV_CODEC_ID_FIRST_SUBTITLE
=
0x17000
,
///< A dummy ID pointing at the start of subtitle codecs.
...
...
libavcodec/codec_desc.c
View file @
464310c1
...
...
@@ -3044,6 +3044,13 @@ static const AVCodecDescriptor codec_descriptors[] = {
.
long_name
=
NULL_IF_CONFIG_SMALL
(
"MPEG-H 3D Audio"
),
.
props
=
AV_CODEC_PROP_LOSSY
,
},
{
.
id
=
AV_CODEC_ID_SIREN
,
.
type
=
AVMEDIA_TYPE_AUDIO
,
.
name
=
"siren"
,
.
long_name
=
NULL_IF_CONFIG_SMALL
(
"Siren"
),
.
props
=
AV_CODEC_PROP_INTRA_ONLY
|
AV_CODEC_PROP_LOSSY
,
},
/* subtitle codecs */
{
...
...
libavcodec/siren.c
0 → 100644
View file @
464310c1
/*
* Siren audio decoder
* Copyright (c) 2012 Youness Alaoui <kakaroto@kakaroto.homelinux.net>
* Copyright (c) 2018 Paul B Mahol
* Copyright (c) 2019 Lynne <dev@lynne.ee>
*
* This file is part of FFmpeg.
*
* FFmpeg is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* FFmpeg is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with FFmpeg; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "libavutil/tx.h"
#include "libavutil/float_dsp.h"
#include "avcodec.h"
#include "get_bits.h"
#include "internal.h"
#include "mathops.h"
static
const
uint8_t
index_table
[
8
]
=
{
4
,
4
,
3
,
3
,
2
,
2
,
1
,
0
};
static
const
uint8_t
vector_dimension
[
8
]
=
{
2
,
2
,
2
,
4
,
4
,
5
,
5
,
1
};
static
const
uint8_t
number_of_vectors
[
8
]
=
{
10
,
10
,
10
,
5
,
5
,
4
,
4
,
20
};
static
const
uint8_t
expected_bits_table
[
8
]
=
{
52
,
47
,
43
,
37
,
29
,
22
,
16
,
0
};
static
const
int8_t
differential_decoder_tree
[
27
][
24
][
2
]
=
{
{
{
1
,
2
},
{
3
,
4
},
{
5
,
6
},
{
7
,
8
},
{
9
,
10
},
{
11
,
-
12
},
{
-
11
,
-
10
},
{
-
8
,
-
9
},
{
-
7
,
-
6
},
{
-
13
,
12
},
{
-
5
,
-
4
},
{
0
,
13
},
{
-
3
,
-
14
},
{
-
2
,
14
},
{
-
1
,
15
},
{
-
15
,
16
},
{
-
16
,
17
},
{
-
17
,
18
},
{
19
,
20
},
{
21
,
22
},
{
-
18
,
-
19
},
{
-
20
,
-
21
},
{
-
22
,
-
23
},
{
-
32
,
-
32
}
},
{
{
1
,
2
},
{
3
,
4
},
{
5
,
6
},
{
7
,
8
},
{
-
10
,
-
9
},
{
-
8
,
-
11
},
{
-
7
,
-
6
},
{
9
,
-
5
},
{
10
,
-
12
},
{
-
4
,
11
},
{
-
13
,
-
3
},
{
12
,
-
2
},
{
13
,
-
14
},
{
-
1
,
14
},
{
15
,
-
15
},
{
0
,
16
},
{
-
16
,
17
},
{
-
17
,
18
},
{
-
18
,
19
},
{
20
,
21
},{
22
,
-
19
},
{
-
20
,
-
21
},
{
-
22
,
-
23
},
{
-
32
,
-
32
}
},
{
{
1
,
2
},
{
3
,
4
},
{
5
,
6
},
{
7
,
8
},
{
9
,
10
},
{
-
12
,
11
},
{
-
11
,
-
13
},
{
-
10
,
-
9
},
{
12
,
-
14
},
{
-
8
,
-
7
},
{
-
15
,
-
6
},
{
13
,
-
5
},
{
-
16
,
-
4
},
{
14
,
-
17
},
{
15
,
-
3
},
{
16
,
-
18
},
{
-
2
,
17
},
{
18
,
-
19
},
{
-
1
,
19
},
{
-
20
,
20
},
{
0
,
21
},
{
22
,
-
21
},
{
-
22
,
-
23
},
{
-
32
,
-
32
}
},
{
{
1
,
2
},
{
3
,
4
},
{
5
,
6
},
{
-
11
,
-
10
},
{
7
,
-
12
},
{
8
,
-
9
},
{
9
,
-
13
},
{
-
14
,
10
},
{
-
8
,
-
15
},
{
-
16
,
11
},
{
-
7
,
12
},
{
-
17
,
-
6
},
{
13
,
14
},
{
-
18
,
15
},
{
-
5
,
-
4
},
{
16
,
17
},
{
-
3
,
-
2
},
{
-
19
,
18
},
{
-
1
,
19
},
{
-
20
,
20
},
{
21
,
22
},
{
0
,
-
21
},
{
-
22
,
-
23
},
{
-
32
,
-
32
}
},
{
{
1
,
2
},
{
3
,
4
},
{
5
,
6
},
{
-
12
,
-
11
},
{
-
13
,
7
},
{
8
,
-
14
},
{
-
10
,
9
},
{
10
,
-
15
},
{
-
9
,
11
},
{
-
8
,
12
},
{
-
16
,
13
},
{
-
7
,
-
6
},
{
-
17
,
14
},
{
-
5
,
-
18
},
{
15
,
-
4
},
{
16
,
-
19
},
{
17
,
-
3
},
{
-
20
,
18
},
{
-
2
,
19
},
{
-
21
,
20
},
{
0
,
21
},
{
22
,
-
1
},
{
-
22
,
-
23
},
{
-
32
,
-
32
}
},
{
{
1
,
2
},
{
3
,
4
},
{
5
,
6
},
{
-
11
,
7
},
{
-
12
,
-
10
},
{
-
13
,
-
9
},
{
8
,
9
},
{
-
14
,
-
8
},
{
10
,
-
15
},
{
-
7
,
11
},
{
-
16
,
12
},
{
-
6
,
-
17
},
{
13
,
14
},
{
-
5
,
15
},
{
-
18
,
16
},
{
-
4
,
17
},
{
-
3
,
-
19
},
{
18
,
-
2
},
{
-
20
,
19
},
{
-
1
,
20
},
{
0
,
21
},
{
22
,
-
21
},
{
-
22
,
-
23
},
{
-
32
,
-
32
}
},
{
{
1
,
2
},
{
3
,
4
},
{
5
,
-
12
},
{
6
,
-
11
},
{
-
10
,
-
13
},
{
-
9
,
7
},
{
8
,
-
14
},
{
9
,
-
8
},
{
-
15
,
10
},
{
-
7
,
-
16
},
{
11
,
-
6
},
{
12
,
-
17
},
{
13
,
-
5
},
{
-
18
,
14
},
{
15
,
-
4
},
{
-
19
,
16
},
{
17
,
-
3
},
{
-
20
,
18
},
{
19
,
20
},
{
21
,
22
},
{
0
,
-
2
},
{
-
1
,
-
21
},
{
-
22
,
-
23
},
{
-
32
,
-
32
}
},
{
{
1
,
2
},
{
3
,
4
},
{
5
,
-
12
},
{
6
,
-
13
},
{
-
11
,
-
10
},
{
7
,
-
14
},
{
8
,
-
9
},
{
9
,
-
15
},
{
-
8
,
10
},
{
-
7
,
-
16
},
{
11
,
12
},
{
-
6
,
-
17
},
{
-
5
,
13
},
{
14
,
15
},
{
-
18
,
-
4
},
{
-
19
,
16
},
{
-
3
,
17
},
{
18
,
-
2
},
{
-
20
,
19
},
{
20
,
21
},
{
22
,
0
},
{
-
1
,
-
21
},
{
-
22
,
-
23
},
{
-
32
,
-
32
}
},
{
{
1
,
2
},
{
3
,
4
},
{
5
,
6
},
{
-
11
,
-
10
},
{
-
12
,
-
9
},
{
7
,
8
},
{
-
13
,
-
8
},
{
9
,
-
14
},
{
-
7
,
10
},
{
-
6
,
-
15
},
{
11
,
12
},
{
-
5
,
-
16
},
{
13
,
14
},
{
-
17
,
15
},
{
-
4
,
16
},
{
17
,
-
18
},
{
18
,
-
3
},
{
-
2
,
19
},
{
-
1
,
0
},
{
-
19
,
20
},
{
-
20
,
21
},
{
22
,
-
21
},
{
-
22
,
-
23
},
{
-
32
,
-
32
}
},
{
{
1
,
2
},
{
3
,
4
},
{
5
,
6
},
{
-
11
,
7
},
{
-
10
,
-
12
},
{
-
9
,
8
},
{
-
8
,
-
13
},
{
9
,
-
7
},
{
10
,
-
14
},
{
-
6
,
11
},
{
-
15
,
12
},
{
-
5
,
13
},
{
-
16
,
-
4
},
{
14
,
15
},
{
-
17
,
-
3
},
{
-
18
,
16
},
{
17
,
-
19
},
{
-
2
,
18
},
{
-
20
,
19
},
{
-
1
,
20
},
{
21
,
22
},
{
0
,
-
21
},
{
-
22
,
-
23
},
{
-
32
,
-
32
}
},
{
{
1
,
2
},
{
3
,
4
},
{
5
,
-
12
},
{
6
,
-
11
},
{
7
,
8
},
{
-
10
,
-
13
},
{
-
9
,
9
},
{
-
8
,
-
14
},
{
10
,
-
7
},
{
11
,
-
15
},
{
-
6
,
12
},
{
-
5
,
13
},
{
-
4
,
-
16
},
{
14
,
15
},
{
-
3
,
-
17
},
{
16
,
17
},
{
-
18
,
-
2
},
{
18
,
-
19
},
{
-
1
,
19
},
{
-
20
,
20
},
{
-
21
,
21
},
{
22
,
0
},
{
-
22
,
-
23
},
{
-
32
,
-
32
}
},
{
{
1
,
2
},
{
3
,
4
},
{
5
,
-
12
},
{
-
13
,
6
},
{
-
11
,
7
},
{
-
14
,
8
},
{
-
10
,
9
},
{
-
15
,
-
9
},
{
-
8
,
10
},
{
-
7
,
-
16
},
{
11
,
-
6
},
{
12
,
-
5
},
{
-
17
,
13
},
{
14
,
-
18
},
{
15
,
-
4
},
{
16
,
-
19
},
{
17
,
-
3
},
{
18
,
-
2
},
{
19
,
-
1
},
{
-
20
,
20
},
{
21
,
22
},
{
0
,
-
21
},
{
-
22
,
-
23
},
{
-
32
,
-
32
}
},
{
{
1
,
2
},
{
3
,
4
},
{
-
12
,
5
},
{
-
11
,
-
13
},
{
6
,
-
14
},
{
-
10
,
7
},
{
8
,
-
15
},
{
-
9
,
9
},
{
-
16
,
10
},
{
-
8
,
-
17
},
{
11
,
12
},
{
-
7
,
-
18
},
{
-
6
,
13
},
{
14
,
-
5
},
{
15
,
-
19
},
{
-
4
,
16
},
{
-
20
,
17
},
{
18
,
19
},
{
20
,
21
},
{
22
,
0
},
{
-
1
,
-
3
},
{
-
2
,
-
21
},
{
-
22
,
-
23
},
{
-
32
,
-
32
}
},
{
{
1
,
2
},
{
3
,
4
},
{
-
12
,
5
},
{
-
11
,
-
13
},
{
6
,
-
14
},
{
-
10
,
7
},
{
8
,
-
15
},
{
-
9
,
9
},
{
-
16
,
10
},
{
-
8
,
-
17
},
{
11
,
12
},
{
-
7
,
-
18
},
{
-
6
,
13
},
{
14
,
-
5
},
{
15
,
-
19
},
{
-
4
,
16
},
{
-
20
,
17
},
{
18
,
19
},
{
20
,
21
},
{
22
,
0
},
{
-
1
,
-
3
},
{
-
2
,
-
21
},
{
-
22
,
-
23
},
{
-
32
,
-
32
}
},
{
{
1
,
2
},
{
3
,
4
},
{
-
12
,
5
},
{
-
11
,
-
13
},
{
6
,
-
14
},
{
-
10
,
7
},
{
8
,
-
15
},
{
-
9
,
9
},
{
-
16
,
10
},
{
-
8
,
-
17
},
{
11
,
12
},
{
-
7
,
-
18
},
{
-
6
,
13
},
{
14
,
-
5
},
{
15
,
-
19
},
{
-
4
,
16
},
{
-
20
,
17
},
{
18
,
19
},
{
20
,
21
},
{
22
,
0
},
{
-
1
,
-
3
},
{
-
2
,
-
21
},
{
-
22
,
-
23
},
{
-
32
,
-
32
}
},
{
{
1
,
2
},
{
3
,
4
},
{
-
12
,
5
},
{
-
11
,
-
13
},
{
6
,
-
14
},
{
-
10
,
7
},
{
8
,
-
15
},
{
-
9
,
9
},
{
-
16
,
10
},
{
-
8
,
-
17
},
{
11
,
12
},
{
-
7
,
-
18
},
{
-
6
,
13
},
{
14
,
-
5
},
{
15
,
-
19
},
{
-
4
,
16
},
{
-
20
,
17
},
{
18
,
19
},
{
20
,
21
},
{
22
,
0
},
{
-
1
,
-
3
},
{
-
2
,
-
21
},
{
-
22
,
-
23
},
{
-
32
,
-
32
}
},
{
{
1
,
2
},
{
3
,
4
},
{
-
12
,
5
},
{
-
11
,
-
13
},
{
6
,
-
14
},
{
-
10
,
7
},
{
8
,
-
15
},
{
-
9
,
9
},
{
-
16
,
10
},
{
-
8
,
-
17
},
{
11
,
12
},
{
-
7
,
-
18
},
{
-
6
,
13
},
{
14
,
-
5
},
{
15
,
-
19
},
{
-
4
,
16
},
{
-
20
,
17
},
{
18
,
19
},
{
20
,
21
},
{
22
,
0
},
{
-
1
,
-
3
},
{
-
2
,
-
21
},
{
-
22
,
-
23
},
{
-
32
,
-
32
}
},
{
{
1
,
2
},
{
3
,
4
},
{
-
12
,
5
},
{
-
11
,
-
13
},
{
6
,
-
14
},
{
-
10
,
7
},
{
8
,
-
15
},
{
-
9
,
9
},
{
-
16
,
10
},
{
-
8
,
-
17
},
{
11
,
12
},
{
-
7
,
-
18
},
{
-
6
,
13
},
{
14
,
-
5
},
{
15
,
-
19
},
{
-
4
,
16
},
{
-
20
,
17
},
{
18
,
19
},
{
20
,
21
},
{
22
,
0
},
{
-
1
,
-
3
},
{
-
2
,
-
21
},
{
-
22
,
-
23
},
{
-
32
,
-
32
}
},
{
{
1
,
2
},
{
3
,
4
},
{
-
12
,
5
},
{
-
11
,
-
13
},
{
6
,
-
14
},
{
-
10
,
7
},
{
8
,
-
15
},
{
-
9
,
9
},
{
-
16
,
10
},
{
-
8
,
-
17
},
{
11
,
12
},
{
-
7
,
-
18
},
{
-
6
,
13
},
{
14
,
-
5
},
{
15
,
-
19
},
{
-
4
,
16
},
{
-
20
,
17
},
{
18
,
19
},
{
20
,
21
},
{
22
,
0
},
{
-
1
,
-
3
},
{
-
2
,
-
21
},
{
-
22
,
-
23
},
{
-
32
,
-
32
}
},
{
{
1
,
2
},
{
3
,
4
},
{
-
12
,
5
},
{
-
11
,
-
13
},
{
6
,
-
14
},
{
-
10
,
7
},
{
8
,
-
15
},
{
-
9
,
9
},
{
-
16
,
10
},
{
-
8
,
-
17
},
{
11
,
12
},
{
-
7
,
-
18
},
{
-
6
,
13
},
{
14
,
-
5
},
{
15
,
-
19
},
{
-
4
,
16
},
{
-
20
,
17
},
{
18
,
19
},
{
20
,
21
},
{
22
,
0
},
{
-
1
,
-
3
},
{
-
2
,
-
21
},
{
-
22
,
-
23
},
{
-
32
,
-
32
}
},
{
{
1
,
2
},
{
3
,
4
},
{
-
12
,
5
},
{
-
11
,
-
13
},
{
6
,
-
14
},
{
-
10
,
7
},
{
8
,
-
15
},
{
-
9
,
9
},
{
-
16
,
10
},
{
-
8
,
-
17
},
{
11
,
12
},
{
-
7
,
-
18
},
{
-
6
,
13
},
{
14
,
-
5
},
{
15
,
-
19
},
{
-
4
,
16
},
{
-
20
,
17
},
{
18
,
19
},
{
20
,
21
},
{
22
,
0
},
{
-
1
,
-
3
},
{
-
2
,
-
21
},
{
-
22
,
-
23
},
{
-
32
,
-
32
}
},
{
{
1
,
2
},
{
3
,
4
},
{
-
12
,
5
},
{
-
11
,
-
13
},
{
6
,
-
14
},
{
-
10
,
7
},
{
8
,
-
15
},
{
-
9
,
9
},
{
-
16
,
10
},
{
-
8
,
-
17
},
{
11
,
12
},
{
-
7
,
-
18
},
{
-
6
,
13
},
{
14
,
-
5
},
{
15
,
-
19
},
{
-
4
,
16
},
{
-
20
,
17
},
{
18
,
19
},
{
20
,
21
},
{
22
,
0
},
{
-
1
,
-
3
},
{
-
2
,
-
21
},
{
-
22
,
-
23
},
{
-
32
,
-
32
}
},
{
{
1
,
2
},
{
3
,
4
},
{
-
12
,
5
},
{
-
11
,
-
13
},
{
6
,
-
14
},
{
-
10
,
7
},
{
8
,
-
15
},
{
-
9
,
9
},
{
-
16
,
10
},
{
-
8
,
-
17
},
{
11
,
12
},
{
-
7
,
-
18
},
{
-
6
,
13
},
{
14
,
-
5
},
{
15
,
-
19
},
{
-
4
,
16
},
{
-
20
,
17
},
{
18
,
19
},
{
20
,
21
},
{
22
,
0
},
{
-
1
,
-
3
},
{
-
2
,
-
21
},
{
-
22
,
-
23
},
{
-
32
,
-
32
}
},
{
{
1
,
2
},
{
3
,
4
},
{
-
12
,
5
},
{
-
11
,
-
13
},
{
6
,
-
14
},
{
-
10
,
7
},
{
8
,
-
15
},
{
-
9
,
9
},
{
-
16
,
10
},
{
-
8
,
-
17
},
{
11
,
12
},
{
-
7
,
-
18
},
{
-
6
,
13
},
{
14
,
-
5
},
{
15
,
-
19
},
{
-
4
,
16
},
{
-
20
,
17
},
{
18
,
19
},
{
20
,
21
},
{
22
,
0
},
{
-
1
,
-
3
},
{
-
2
,
-
21
},
{
-
22
,
-
23
},
{
-
32
,
-
32
}
},
{
{
1
,
2
},
{
3
,
4
},
{
-
12
,
5
},
{
-
11
,
-
13
},
{
6
,
-
14
},
{
-
10
,
7
},
{
8
,
-
15
},
{
-
9
,
9
},
{
-
16
,
10
},
{
-
8
,
-
17
},
{
11
,
12
},
{
-
7
,
-
18
},
{
-
6
,
13
},
{
14
,
-
5
},
{
15
,
-
19
},
{
-
4
,
16
},
{
-
20
,
17
},
{
18
,
19
},
{
20
,
21
},
{
22
,
0
},
{
-
1
,
-
3
},
{
-
2
,
-
21
},
{
-
22
,
-
23
},
{
-
32
,
-
32
}
},
{
{
1
,
2
},
{
3
,
4
},
{
-
12
,
5
},
{
-
11
,
-
13
},
{
6
,
-
14
},
{
-
10
,
7
},
{
8
,
-
15
},
{
-
9
,
9
},
{
-
16
,
10
},
{
-
8
,
-
17
},
{
11
,
12
},
{
-
7
,
-
18
},
{
-
6
,
13
},
{
14
,
-
5
},
{
15
,
-
19
},
{
-
4
,
16
},
{
-
20
,
17
},
{
18
,
19
},
{
20
,
21
},
{
22
,
0
},
{
-
1
,
-
3
},
{
-
2
,
-
21
},
{
-
22
,
-
23
},
{
-
32
,
-
32
}
},
{
{
1
,
2
},
{
3
,
4
},
{
-
12
,
5
},
{
-
11
,
-
13
},
{
6
,
-
14
},
{
-
10
,
7
},
{
8
,
-
15
},
{
-
9
,
9
},
{
-
16
,
10
},
{
-
8
,
-
17
},
{
11
,
12
},
{
-
7
,
-
18
},
{
-
6
,
13
},
{
14
,
-
5
},
{
15
,
-
19
},
{
-
4
,
16
},
{
-
20
,
17
},
{
18
,
19
},
{
20
,
21
},
{
22
,
0
},
{
-
1
,
-
3
},
{
-
2
,
-
21
},
{
-
22
,
-
23
},
{
-
32
,
-
32
}
},
};
static
const
uint16_t
decoder_tree0
[
360
]
=
{
2
,
1
,
4
,
6
,
8
,
10
,
12
,
14
,
16
,
18
,
33
,
3
,
20
,
22
,
24
,
26
,
28
,
30
,
32
,
34
,
36
,
38
,
35
,
40
,
42
,
44
,
46
,
5
,
48
,
65
,
50
,
52
,
54
,
56
,
58
,
60
,
62
,
64
,
37
,
66
,
67
,
68
,
97
,
70
,
72
,
74
,
7
,
76
,
78
,
80
,
82
,
84
,
86
,
88
,
99
,
90
,
39
,
92
,
94
,
96
,
129
,
98
,
9
,
100
,
102
,
104
,
106
,
108
,
110
,
112
,
41
,
161
,
69
,
114
,
116
,
118
,
131
,
120
,
122
,
11
,
124
,
126
,
128
,
193
,
130
,
132
,
71
,
134
,
43
,
136
,
138
,
140
,
163
,
101
,
13
,
142
,
144
,
146
,
148
,
150
,
152
,
154
,
225
,
156
,
158
,
195
,
160
,
162
,
45
,
164
,
15
,
166
,
73
,
168
,
170
,
133
,
47
,
172
,
257
,
174
,
176
,
178
,
75
,
103
,
180
,
165
,
182
,
17
,
227
,
184
,
105
,
49
,
135
,
186
,
289
,
188
,
259
,
190
,
192
,
194
,
196
,
198
,
291
,
77
,
200
,
202
,
197
,
107
,
204
,
19
,
51
,
229
,
206
,
167
,
208
,
210
,
212
,
214
,
21
,
79
,
81
,
109
,
216
,
218
,
220
,
222
,
53
,
137
,
224
,
199
,
226
,
323
,
321
,
169
,
228
,
111
,
230
,
232
,
139
,
261
,
234
,
83
,
236
,
201
,
238
,
240
,
293
,
242
,
353
,
231
,
141
,
244
,
246
,
113
,
23
,
355
,
85
,
248
,
55
,
115
,
250
,
263
,
252
,
254
,
203
,
171
,
256
,
258
,
233
,
235
,
143
,
357
,
325
,
260
,
295
,
262
,
173
,
145
,
177
,
87
,
264
,
327
,
267
,
266
,
268
,
175
,
270
,
272
,
117
,
297
,
274
,
265
,
147
,
179
,
205
,
276
,
207
,
237
,
269
,
278
,
57
,
59
,
387
,
209
,
280
,
282
,
149
,
329
,
385
,
284
,
25
,
286
,
239
,
119
,
288
,
27
,
290
,
292
,
299
,
294
,
359
,
89
,
296
,
298
,
419
,
181
,
300
,
331
,
271
,
417
,
211
,
361
,
151
,
389
,
241
,
302
,
304
,
303
,
306
,
308
,
421
,
91
,
310
,
312
,
391
,
314
,
121
,
316
,
333
,
318
,
275
,
213
,
301
,
243
,
183
,
335
,
320
,
363
,
322
,
215
,
324
,
393
,
273
,
337
,
153
,
326
,
423
,
365
,
328
,
367
,
247
,
395
,
185
,
123
,
330
,
425
,
245
,
155
,
332
,
334
,
305
,
397
,
336
,
277
,
217
,
338
,
340
,
339
,
427
,
342
,
344
,
346
,
307
,
399
,
187
,
348
,
309
,
341
,
350
,
369
,
279
,
311
,
429
,
249
,
219
,
352
,
354
,
356
,
358
,
431
,
373
,
401
,
371
,
313
,
281
,
433
,
343
,
403
,
251
,
283
};
static
const
uint16_t
decoder_tree1
[
188
]
=
{
2
,
1
,
4
,
6
,
8
,
10
,
12
,
14
,
16
,
3
,
33
,
18
,
20
,
22
,
24
,
26
,
35
,
28
,
30
,
32
,
34
,
36
,
5
,
65
,
38
,
40
,
37
,
42
,
44
,
46
,
67
,
48
,
50
,
52
,
54
,
56
,
58
,
60
,
7
,
62
,
39
,
97
,
64
,
69
,
66
,
99
,
68
,
70
,
72
,
74
,
76
,
78
,
80
,
129
,
41
,
131
,
82
,
9
,
71
,
84
,
86
,
101
,
88
,
90
,
92
,
94
,
96
,
161
,
43
,
11
,
73
,
98
,
103
,
100
,
163
,
102
,
104
,
106
,
108
,
133
,
110
,
105
,
112
,
75
,
114
,
45
,
13
,
116
,
165
,
118
,
195
,
135
,
193
,
120
,
77
,
122
,
47
,
124
,
167
,
225
,
126
,
79
,
107
,
227
,
128
,
137
,
197
,
15
,
130
,
169
,
199
,
132
,
109
,
134
,
17
,
139
,
49
,
136
,
229
,
138
,
140
,
81
,
259
,
142
,
144
,
171
,
146
,
141
,
148
,
111
,
150
,
201
,
231
,
152
,
51
,
257
,
289
,
154
,
19
,
113
,
156
,
261
,
158
,
203
,
173
,
263
,
143
,
160
,
291
,
235
,
83
,
162
,
233
,
265
,
164
,
205
,
166
,
293
,
145
,
168
,
175
,
177
,
237
,
115
,
295
,
170
,
207
,
172
,
267
,
174
,
176
,
297
,
147
,
178
,
180
,
269
,
182
,
271
,
209
,
299
,
239
,
179
,
184
,
301
,
241
,
211
,
0
,
0
};
static
const
uint16_t
decoder_tree2
[
96
]
=
{
2
,
1
,
4
,
6
,
8
,
10
,
12
,
3
,
17
,
14
,
19
,
16
,
18
,
20
,
22
,
24
,
26
,
5
,
21
,
35
,
33
,
28
,
30
,
32
,
34
,
36
,
38
,
37
,
40
,
23
,
51
,
42
,
7
,
49
,
44
,
46
,
48
,
50
,
39
,
53
,
52
,
54
,
56
,
25
,
67
,
9
,
58
,
60
,
65
,
55
,
41
,
62
,
64
,
69
,
66
,
11
,
27
,
68
,
57
,
83
,
70
,
71
,
81
,
43
,
72
,
74
,
13
,
76
,
85
,
29
,
73
,
78
,
99
,
59
,
87
,
101
,
80
,
97
,
45
,
82
,
84
,
75
,
89
,
61
,
86
,
103
,
88
,
77
,
90
,
105
,
91
,
92
,
107
,
93
,
0
,
0
};
static
const
uint16_t
decoder_tree3
[
1040
]
=
{
2
,
4
,
6
,
8
,
10
,
1
,
12
,
14
,
16
,
18
,
20
,
22
,
24
,
26
,
28
,
30
,
32
,
34
,
3
,
36
,
1025
,
38
,
40
,
42
,
44
,
46
,
48
,
50
,
129
,
17
,
52
,
54
,
1153
,
19
,
56
,
58
,
60
,
62
,
64
,
66
,
68
,
145
,
70
,
72
,
74
,
76
,
78
,
1169
,
1027
,
147
,
80
,
82
,
1171
,
84
,
86
,
131
,
88
,
1155
,
1043
,
1041
,
90
,
92
,
5
,
94
,
96
,
98
,
100
,
102
,
104
,
21
,
106
,
108
,
2049
,
2177
,
110
,
112
,
114
,
116
,
118
,
120
,
122
,
124
,
126
,
128
,
130
,
132
,
134
,
136
,
138
,
140
,
142
,
33
,
144
,
163
,
146
,
148
,
150
,
152
,
154
,
161
,
156
,
35
,
158
,
1297
,
160
,
162
,
273
,
257
,
164
,
166
,
149
,
168
,
1281
,
170
,
172
,
2193
,
174
,
176
,
178
,
1299
,
180
,
1045
,
182
,
184
,
1173
,
186
,
3201
,
188
,
190
,
192
,
194
,
2195
,
1187
,
23
,
2179
,
196
,
7
,
198
,
275
,
200
,
2051
,
202
,
2065
,
204
,
206
,
1029
,
1185
,
208
,
210
,
1157
,
37
,
3073
,
2067
,
133
,
212
,
214
,
2321
,
216
,
165
,
218
,
1059
,
220
,
1283
,
222
,
2305
,
224
,
226
,
228
,
230
,
259
,
232
,
234
,
2323
,
236
,
1409
,
1057
,
1315
,
238
,
240
,
242
,
244
,
246
,
1425
,
248
,
1313
,
250
,
252
,
254
,
256
,
258
,
260
,
289
,
262
,
264
,
1189
,
266
,
268
,
179
,
151
,
270
,
272
,
274
,
276
,
278
,
291
,
280
,
282
,
9
,
385
,
284
,
286
,
177
,
49
,
401
,
1061
,
288
,
290
,
292
,
51
,
294
,
296
,
298
,
300
,
302
,
304
,
25
,
306
,
2083
,
39
,
308
,
310
,
3329
,
167
,
312
,
314
,
1175
,
316
,
318
,
1203
,
135
,
320
,
322
,
324
,
326
,
328
,
2211
,
2307
,
330
,
1301
,
332
,
334
,
1047
,
336
,
338
,
2449
,
3217
,
340
,
1427
,
2209
,
53
,
342
,
2339
,
3345
,
344
,
346
,
348
,
403
,
181
,
4097
,
2197
,
350
,
2181
,
1285
,
1317
,
1031
,
352
,
354
,
356
,
3089
,
358
,
360
,
4225
,
277
,
362
,
364
,
366
,
368
,
2069
,
370
,
3203
,
293
,
1201
,
305
,
372
,
3219
,
307
,
2433
,
374
,
376
,
378
,
380
,
2081
,
1411
,
382
,
384
,
3075
,
1443
,
513
,
386
,
387
,
388
,
390
,
1331
,
261
,
392
,
394
,
396
,
398
,
400
,
1441
,
1075
,
67
,
1159
,
402
,
404
,
406
,
408
,
410
,
412
,
414
,
3347
,
2325
,
416
,
65
,
418
,
420
,
422
,
424
,
426
,
2053
,
193
,
1073
,
428
,
430
,
432
,
1537
,
1329
,
2337
,
2213
,
434
,
417
,
183
,
41
,
436
,
438
,
440
,
442
,
444
,
446
,
448
,
450
,
195
,
2435
,
452
,
2085
,
1063
,
1191
,
454
,
456
,
458
,
460
,
419
,
2071
,
1553
,
3091
,
55
,
137
,
462
,
464
,
466
,
468
,
470
,
472
,
474
,
476
,
478
,
2309
,
4113
,
480
,
482
,
484
,
486
,
2451
,
2465
,
1205
,
153
,
488
,
490
,
492
,
494
,
496
,
498
,
500
,
502
,
504
,
506
,
508
,
510
,
512
,
514
,
516
,
518
,
520
,
522
,
524
,
1333
,
526
,
1555
,
2467
,
2227
,
3205
,
3331
,
528
,
530
,
532
,
534
,
536
,
538
,
540
,
542
,
544
,
546
,
548
,
529
,
309
,
1303
,
3473
,
3457
,
389
,
1569
,
1445
,
1077
,
69
,
2199
,
1539
,
4353
,
550
,
552
,
554
,
556
,
558
,
560
,
562
,
1459
,
4241
,
3221
,
1429
,
2341
,
279
,
3475
,
169
,
564
,
545
,
3105
,
323
,
2353
,
2097
,
3235
,
421
,
2229
,
3107
,
3233
,
566
,
568
,
570
,
572
,
574
,
576
,
578
,
580
,
582
,
584
,
586
,
588
,
590
,
592
,
594
,
596
,
2099
,
1091
,
531
,
2437
,
4227
,
405
,
197
,
263
,
1287
,
2577
,
1049
,
1571
,
598
,
600
,
602
,
604
,
606
,
608
,
610
,
612
,
614
,
616
,
618
,
620
,
622
,
624
,
626
,
628
,
630
,
632
,
634
,
636
,
638
,
640
,
642
,
644
,
646
,
648
,
650
,
1345
,
1219
,
3077
,
1457
,
2225
,
2579
,
515
,
2561
,
2469
,
433
,
1221
,
2183
,
4243
,
652
,
654
,
656
,
658
,
660
,
662
,
664
,
666
,
668
,
670
,
1217
,
3333
,
3093
,
435
,
321
,
4369
,
1089
,
2055
,
4099
,
3361
,
1319
,
547
,
1161
,
1177
,
672
,
2355
,
4115
,
1413
,
4257
,
3349
,
2453
,
3109
,
2357
,
2215
,
3363
,
1079
,
1207
,
311
,
1033
,
1347
,
1065
,
674
,
676
,
678
,
680
,
682
,
684
,
686
,
688
,
690
,
692
,
694
,
696
,
698
,
700
,
702
,
704
,
706
,
708
,
710
,
712
,
714
,
716
,
718
,
720
,
722
,
724
,
726
,
728
,
730
,
732
,
734
,
736
,
738
,
740
,
742
,
744
,
746
,
748
,
750
,
752
,
754
,
756
,
758
,
760
,
762
,
764
,
766
,
768
,
770
,
772
,
774
,
776
,
778
,
780
,
782
,
784
,
786
,
788
,
790
,
792
,
794
,
796
,
798
,
800
,
802
,
804
,
806
,
808
,
810
,
812
,
814
,
2593
,
2565
,
4261
,
3253
,
437
,
325
,
3489
,
2311
,
4259
,
1431
,
2087
,
2563
,
295
,
2343
,
449
,
199
,
265
,
2201
,
4371
,
1193
,
816
,
533
,
1557
,
2581
,
2241
,
3365
,
3491
,
3603
,
549
,
2101
,
1461
,
1093
,
2117
,
3459
,
3079
,
4481
,
3095
,
2327
,
3461
,
4129
,
3249
,
1447
,
2471
,
2231
,
71
,
4497
,
2609
,
1289
,
393
,
3251
,
2073
,
3097
,
2371
,
1305
,
2089
,
818
,
820
,
822
,
824
,
826
,
828
,
830
,
832
,
834
,
836
,
838
,
840
,
842
,
844
,
846
,
848
,
850
,
852
,
854
,
856
,
858
,
860
,
862
,
864
,
866
,
868
,
870
,
872
,
874
,
876
,
878
,
880
,
882
,
884
,
886
,
888
,
890
,
892
,
894
,
896
,
898
,
900
,
902
,
904
,
906
,
908
,
910
,
912
,
914
,
916
,
918
,
920
,
922
,
924
,
926
,
928
,
930
,
932
,
934
,
936
,
938
,
940
,
942
,
944
,
946
,
948
,
950
,
952
,
954
,
956
,
958
,
960
,
962
,
964
,
966
,
968
,
970
,
972
,
974
,
976
,
978
,
980
,
982
,
984
,
986
,
988
,
990
,
992
,
994
,
996
,
998
,
1000
,
1002
,
1004
,
1006
,
1008
,
1010
,
1012
,
1014
,
1016
,
1018
,
1020
,
1022
,
1024
,
1026
,
1028
,
1030
,
1032
,
1034
,
1036
,
4161
,
4273
,
3507
,
3493
,
4517
,
2497
,
1573
,
2597
,
3621
,
4531
,
4627
,
3523
,
3125
,
4149
,
4529
,
3139
,
4515
,
451
,
4277
,
2113
,
4163
,
4499
,
3381
,
4405
,
1473
,
4373
,
2485
,
3509
,
565
,
1589
,
2613
,
3585
,
3123
,
4403
,
3141
,
4147
,
563
,
2245
,
3269
,
4357
,
1349
,
2373
,
3397
,
453
,
1477
,
2501
,
2481
,
579
,
1601
,
3477
,
4103
,
3265
,
2243
,
1587
,
3207
,
4231
,
3267
,
4501
,
1475
,
3335
,
4359
,
391
,
1415
,
2439
,
3463
,
4487
,
519
,
1543
,
2567
,
3591
,
4609
,
4289
,
4611
,
2499
,
4119
,
4385
,
4145
,
4401
,
3223
,
4247
,
3379
,
577
,
3393
,
3351
,
4375
,
407
,
1585
,
2455
,
3479
,
4503
,
535
,
1559
,
2583
,
3607
,
3605
,
4513
,
4485
,
3111
,
4135
,
3121
,
517
,
3377
,
3239
,
4263
,
1541
,
4291
,
4229
,
3367
,
4391
,
423
,
2115
,
4131
,
3495
,
551
,
1575
,
2599
,
3635
,
3395
,
2103
,
3127
,
4151
,
3589
,
4101
,
1603
,
3255
,
4279
,
3601
,
1335
,
2359
,
3383
,
439
,
1463
,
2487
,
3511
,
567
,
1591
,
4133
,
1095
,
2119
,
3143
,
2369
,
1223
,
2247
,
3271
,
327
,
1351
,
2375
,
455
,
1479
,
3137
,
3521
,
2057
,
3081
,
4105
,
4387
,
3505
,
2185
,
3209
,
4233
,
3587
,
4355
,
2313
,
3337
,
3237
,
1417
,
2441
,
3465
,
521
,
1545
,
3617
,
3633
,
561
,
4625
,
4121
,
2611
,
2483
,
2595
,
3225
,
4249
,
281
,
4245
,
2329
,
3353
,
409
,
1433
,
2457
,
3481
,
537
,
1561
,
4483
,
3619
,
4389
,
3113
,
4275
,
4117
,
2217
,
3241
,
297
,
1321
,
2345
,
3369
,
425
,
1449
,
2473
,
57
,
1081
,
2105
,
3129
,
185
,
1209
,
2233
,
3257
,
313
,
1337
,
2361
,
441
,
1465
,
73
,
1097
,
201
,
1225
,
0
,
0
};
static
const
uint16_t
decoder_tree4
[
416
]
=
{
2
,
4
,
6
,
1
,
8
,
10
,
12
,
14
,
16
,
18
,
20
,
22
,
24
,
3
,
129
,
26
,
28
,
9
,
33
,
30
,
32
,
34
,
36
,
11
,
161
,
38
,
40
,
42
,
41
,
44
,
46
,
131
,
43
,
169
,
35
,
48
,
137
,
50
,
52
,
54
,
56
,
139
,
163
,
171
,
58
,
60
,
62
,
64
,
5
,
66
,
68
,
70
,
257
,
72
,
74
,
76
,
13
,
78
,
80
,
289
,
82
,
84
,
17
,
86
,
88
,
65
,
90
,
201
,
19
,
92
,
94
,
51
,
193
,
96
,
98
,
49
,
100
,
73
,
102
,
104
,
106
,
45
,
108
,
110
,
297
,
112
,
114
,
116
,
37
,
203
,
118
,
120
,
179
,
122
,
177
,
124
,
265
,
126
,
75
,
133
,
259
,
291
,
147
,
128
,
67
,
195
,
130
,
141
,
173
,
299
,
132
,
145
,
134
,
165
,
136
,
138
,
140
,
142
,
7
,
144
,
146
,
21
,
267
,
148
,
53
,
150
,
321
,
152
,
154
,
15
,
156
,
81
,
158
,
160
,
385
,
162
,
417
,
164
,
166
,
168
,
83
,
170
,
172
,
329
,
174
,
211
,
176
,
27
,
178
,
180
,
182
,
209
,
184
,
186
,
188
,
190
,
25
,
192
,
331
,
194
,
196
,
105
,
57
,
198
,
97
,
200
,
202
,
323
,
225
,
59
,
149
,
204
,
206
,
233
,
307
,
208
,
77
,
181
,
210
,
212
,
214
,
216
,
218
,
220
,
222
,
47
,
224
,
226
,
69
,
228
,
230
,
197
,
232
,
425
,
393
,
205
,
275
,
293
,
39
,
234
,
236
,
238
,
305
,
135
,
155
,
301
,
143
,
240
,
242
,
235
,
395
,
244
,
246
,
248
,
250
,
252
,
254
,
256
,
258
,
260
,
262
,
273
,
269
,
185
,
264
,
266
,
268
,
270
,
272
,
274
,
276
,
261
,
153
,
278
,
280
,
282
,
187
,
337
,
387
,
107
,
284
,
427
,
227
,
167
,
419
,
286
,
288
,
290
,
292
,
294
,
296
,
298
,
300
,
302
,
304
,
306
,
308
,
310
,
312
,
314
,
316
,
318
,
320
,
322
,
324
,
326
,
328
,
330
,
332
,
334
,
336
,
338
,
115
,
99
,
85
,
213
,
29
,
113
,
23
,
89
,
241
,
61
,
449
,
339
,
175
,
340
,
342
,
344
,
346
,
348
,
350
,
352
,
354
,
356
,
358
,
360
,
362
,
364
,
366
,
368
,
370
,
372
,
374
,
376
,
378
,
380
,
382
,
384
,
386
,
388
,
390
,
392
,
394
,
396
,
398
,
400
,
402
,
404
,
406
,
408
,
410
,
412
,
414
,
389
,
361
,
457
,
465
,
429
,
451
,
333
,
109
,
277
,
243
,
263
,
295
,
199
,
283
,
151
,
55
,
183
,
229
,
357
,
363
,
123
,
491
,
397
,
411
,
251
,
313
,
441
,
467
,
345
,
433
,
461
,
219
,
237
,
365
,
435
,
353
,
347
,
405
,
409
,
217
,
309
,
437
,
369
,
371
,
341
,
117
,
245
,
249
,
157
,
285
,
403
,
189
,
317
,
93
,
221
,
315
,
401
,
481
,
391
,
489
,
121
,
421
,
423
,
71
,
483
,
327
,
103
,
231
,
443
,
459
,
271
,
399
,
355
,
91
,
303
,
431
,
79
,
207
,
335
,
111
,
239
,
281
,
325
,
279
,
453
,
101
,
311
,
87
,
215
,
31
,
159
,
63
,
191
};
static
const
uint16_t
decoder_tree5
[
384
]
=
{
2
,
4
,
1
,
6
,
8
,
10
,
12
,
14
,
16
,
18
,
20
,
22
,
3
,
513
,
24
,
26
,
28
,
9
,
129
,
33
,
30
,
32
,
34
,
36
,
38
,
40
,
11
,
42
,
641
,
44
,
46
,
41
,
161
,
48
,
515
,
50
,
52
,
131
,
54
,
35
,
545
,
137
,
56
,
58
,
60
,
521
,
62
,
43
,
673
,
64
,
169
,
66
,
68
,
523
,
70
,
163
,
643
,
139
,
553
,
72
,
649
,
74
,
547
,
76
,
78
,
80
,
681
,
171
,
82
,
84
,
555
,
86
,
675
,
88
,
651
,
5
,
90
,
92
,
1025
,
94
,
96
,
98
,
683
,
13
,
100
,
17
,
102
,
104
,
106
,
65
,
108
,
110
,
257
,
112
,
114
,
1153
,
19
,
116
,
118
,
120
,
122
,
124
,
49
,
126
,
128
,
769
,
289
,
130
,
132
,
134
,
73
,
136
,
138
,
140
,
142
,
193
,
144
,
146
,
148
,
150
,
152
,
154
,
517
,
156
,
158
,
37
,
51
,
160
,
201
,
162
,
145
,
164
,
166
,
168
,
133
,
170
,
801
,
45
,
172
,
174
,
1057
,
176
,
178
,
67
,
180
,
1027
,
577
,
182
,
184
,
186
,
188
,
190
,
192
,
194
,
196
,
198
,
259
,
200
,
202
,
204
,
525
,
177
,
265
,
141
,
206
,
208
,
210
,
212
,
195
,
297
,
214
,
75
,
216
,
1033
,
203
,
585
,
1155
,
1185
,
267
,
1161
,
549
,
218
,
220
,
657
,
777
,
147
,
222
,
224
,
226
,
228
,
230
,
232
,
234
,
236
,
238
,
240
,
587
,
645
,
165
,
242
,
244
,
246
,
248
,
250
,
771
,
291
,
252
,
579
,
1065
,
1035
,
705
,
531
,
529
,
659
,
173
,
254
,
561
,
653
,
256
,
713
,
677
,
557
,
258
,
260
,
262
,
264
,
266
,
268
,
270
,
272
,
274
,
276
,
278
,
280
,
282
,
284
,
286
,
288
,
290
,
292
,
294
,
296
,
298
,
300
,
707
,
1059
,
809
,
715
,
563
,
179
,
691
,
1193
,
21
,
779
,
1067
,
299
,
1187
,
302
,
304
,
306
,
308
,
310
,
312
,
314
,
316
,
318
,
320
,
322
,
324
,
326
,
328
,
330
,
332
,
334
,
336
,
338
,
340
,
342
,
344
,
346
,
348
,
350
,
352
,
354
,
356
,
358
,
360
,
362
,
364
,
366
,
368
,
370
,
372
,
374
,
376
,
378
,
380
,
83
,
69
,
1281
,
803
,
321
,
1195
,
1163
,
811
,
1323
,
689
,
1321
,
1099
,
305
,
835
,
1227
,
331
,
843
,
785
,
593
,
1043
,
1291
,
1283
,
1171
,
275
,
787
,
1217
,
833
,
1075
,
1313
,
1219
,
1203
,
307
,
819
,
841
,
595
,
211
,
723
,
721
,
817
,
1029
,
329
,
81
,
1157
,
261
,
773
,
1097
,
1089
,
1061
,
1169
,
1091
,
1189
,
293
,
805
,
1201
,
581
,
197
,
709
,
1289
,
273
,
1037
,
1315
,
1041
,
1165
,
269
,
781
,
209
,
1073
,
1069
,
323
,
685
,
1197
,
301
,
813
,
77
,
589
,
205
,
717
,
1225
,
533
,
149
,
661
,
53
,
565
,
181
,
693
,
0
,
0
};
static
const
uint16_t
decoder_tree6
[
62
]
=
{
2
,
1
,
4
,
6
,
8
,
10
,
12
,
14
,
16
,
3
,
33
,
5
,
17
,
9
,
18
,
20
,
22
,
24
,
26
,
28
,
30
,
32
,
34
,
7
,
49
,
13
,
25
,
36
,
38
,
11
,
21
,
41
,
35
,
37
,
19
,
40
,
42
,
44
,
46
,
48
,
50
,
15
,
52
,
57
,
29
,
27
,
23
,
53
,
54
,
51
,
39
,
45
,
43
,
56
,
58
,
31
,
55
,
60
,
61
,
47
,
59
,
63
};
static
const
uint16_t
*
const
decoder_tables
[
7
]
=
{
decoder_tree0
,
decoder_tree1
,
decoder_tree2
,
decoder_tree3
,
decoder_tree4
,
decoder_tree5
,
decoder_tree6
,
};
static
const
int
decoder_tables_elements
[
7
]
=
{
FF_ARRAY_ELEMS
(
decoder_tree0
),
FF_ARRAY_ELEMS
(
decoder_tree1
),
FF_ARRAY_ELEMS
(
decoder_tree2
),
FF_ARRAY_ELEMS
(
decoder_tree3
),
FF_ARRAY_ELEMS
(
decoder_tree4
),
FF_ARRAY_ELEMS
(
decoder_tree5
),
FF_ARRAY_ELEMS
(
decoder_tree6
),
};
static
const
float
mlt_quant
[
7
][
14
]
=
{
{
0
.
0
f
,
0
.
392
f
,
0
.
761
f
,
1
.
120
f
,
1
.
477
f
,
1
.
832
f
,
2
.
183
f
,
2
.
541
f
,
2
.
893
f
,
3
.
245
f
,
3
.
598
f
,
3
.
942
f
,
4
.
288
f
,
4
.
724
f
},
{
0
.
0
f
,
0
.
544
f
,
1
.
060
f
,
1
.
563
f
,
2
.
06
8
f
,
2
.
571
f
,
3
.
072
f
,
3
.
562
f
,
4
.
070
f
,
4
.
620
f
,
0
.
0
f
,
0
.
0
f
,
0
.
0
f
,
0
.
0
f
},
{
0
.
0
f
,
0
.
746
f
,
1
.
464
f
,
2
.
180
f
,
2
.
882
f
,
3
.
584
f
,
4
.
316
f
,
0
.
0
f
,
0
.
0
f
,
0
.
0
f
,
0
.
0
f
,
0
.
0
f
,
0
.
0
f
,
0
.
0
f
},
{
0
.
0
f
,
1
.
006
f
,
2
.
000
f
,
2
.
993
f
,
3
.
985
f
,
0
.
0
f
,
0
.
0
f
,
0
.
0
f
,
0
.
0
f
,
0
.
0
f
,
0
.
0
f
,
0
.
0
f
,
0
.
0
f
,
0
.
0
f
},
{
0
.
0
f
,
1
.
321
f
,
2
.
703
f
,
3
.
983
f
,
0
.
0
f
,
0
.
0
f
,
0
.
0
f
,
0
.
0
f
,
0
.
0
f
,
0
.
0
f
,
0
.
0
f
,
0
.
0
f
,
0
.
0
f
,
0
.
0
f
},
{
0
.
0
f
,
1
.
657
f
,
3
.
491
f
,
0
.
0
f
,
0
.
0
f
,
0
.
0
f
,
0
.
0
f
,
0
.
0
f
,
0
.
0
f
,
0
.
0
f
,
0
.
0
f
,
0
.
0
f
,
0
.
0
f
,
0
.
0
f
},
{
0
.
0
f
,
1
.
964
f
,
0
.
0
f
,
0
.
0
f
,
0
.
0
f
,
0
.
0
f
,
0
.
0
f
,
0
.
0
f
,
0
.
0
f
,
0
.
0
f
,
0
.
0
f
,
0
.
0
f
,
0
.
0
f
,
0
.
0
f
}
};
static
const
float
noise_category5
[
20
]
=
{
0
.
70711
f
,
0
.
6179
f
,
0
.
5005
f
,
0
.
3220
f
,
0
.
17678
f
,
0
.
17678
f
,
0
.
17678
f
,
0
.
17678
f
,
0
.
17678
f
,
0
.
17678
f
,
0
.
17678
f
,
0
.
17678
f
,
0
.
17678
f
,
0
.
17678
f
,
0
.
17678
f
,
0
.
17678
f
,
0
.
17678
f
,
0
.
17678
f
,
0
.
17678
f
,
0
.
17678
f
};
static
const
float
noise_category6
[
20
]
=
{
0
.
70711
f
,
0
.
5686
f
,
0
.
3563
f
,
0
.
25
f
,
0
.
25
f
,
0
.
25
f
,
0
.
25
f
,
0
.
25
f
,
0
.
25
f
,
0
.
25
f
,
0
.
25
f
,
0
.
25
f
,
0
.
25
f
,
0
.
25
f
,
0
.
25
f
,
0
.
25
f
,
0
.
25
f
,
0
.
25
f
,
0
.
25
f
,
0
.
25
f
};
#define FRAME_SIZE 320
typedef
struct
SirenContext
{
GetBitContext
gb
;
int
rate_control_possibilities
;
int
esf_adjustment
;
int
number_of_regions
;
int
scale_factor
;
int
sample_rate_bits
;
int
region_size
;
int
dw1
,
dw2
,
dw3
,
dw4
;
int
absolute_region_power_index
[
32
];
float
decoder_standard_deviation
[
32
];
int
power_categories
[
32
];
int
category_balance
[
32
];
float
standard_deviation
[
64
];
float
backup_frame
[
FRAME_SIZE
];
AVFloatDSPContext
*
fdsp
;
av_tx_fn
tx_fn
;
AVTXContext
*
tx_ctx
;
DECLARE_ALIGNED
(
32
,
float
,
imdct_buf
)[
4
][
FRAME_SIZE
];
float
*
window
;
float
*
imdct_in
;
float
*
imdct_out
;
float
*
imdct_prev
;
}
SirenContext
;
static
av_cold
int
siren_init
(
AVCodecContext
*
avctx
)
{
const
float
scale
=
1
.
0
f
/
(
22
.
f
*
32768
.
f
);
SirenContext
*
s
=
avctx
->
priv_data
;
int
i
;
s
->
imdct_in
=
s
->
imdct_buf
[
0
];
s
->
imdct_out
=
s
->
imdct_buf
[
1
];
s
->
imdct_prev
=
s
->
imdct_buf
[
2
];
s
->
window
=
s
->
imdct_buf
[
3
];
avctx
->
channels
=
1
;
avctx
->
channel_layout
=
AV_CH_LAYOUT_MONO
;
avctx
->
sample_fmt
=
AV_SAMPLE_FMT_FLT
;
s
->
rate_control_possibilities
=
16
;
s
->
esf_adjustment
=
7
;
s
->
number_of_regions
=
14
;
s
->
scale_factor
=
22
;
s
->
region_size
=
20
;
s
->
dw1
=
s
->
dw2
=
s
->
dw3
=
s
->
dw4
=
1
;
for
(
i
=
0
;
i
<
64
;
i
++
)
{
float
region_power
=
powf
(
10
,
(
i
-
24
)
*
0
.
3010299957
);
s
->
standard_deviation
[
i
]
=
sqrtf
(
region_power
);
}
for
(
i
=
0
;
i
<
FRAME_SIZE
;
i
++
)
{
float
angle
=
((
i
+
0
.
5
f
)
*
M_PI_2
)
/
320
.
f
;
s
->
window
[
i
]
=
sinf
(
angle
);
}
s
->
fdsp
=
avpriv_float_dsp_alloc
(
avctx
->
flags
&
AV_CODEC_FLAG_BITEXACT
);
if
(
!
s
->
fdsp
)
return
AVERROR
(
ENOMEM
);
return
av_tx_init
(
&
s
->
tx_ctx
,
&
s
->
tx_fn
,
AV_TX_FLOAT_MDCT
,
1
,
FRAME_SIZE
,
&
scale
,
0
);
}
static
int
decode_envelope
(
SirenContext
*
s
,
GetBitContext
*
gb
,
int
number_of_regions
,
float
*
decoder_standard_deviation
,
int
*
absolute_region_power_index
,
int
esf_adjustment
)
{
absolute_region_power_index
[
0
]
=
(
int
)
get_bits
(
gb
,
5
)
-
esf_adjustment
;
decoder_standard_deviation
[
0
]
=
s
->
standard_deviation
[
absolute_region_power_index
[
0
]
+
24
];
for
(
int
i
=
1
;
i
<
number_of_regions
;
i
++
)
{
int
index
=
0
;
do
{
index
=
differential_decoder_tree
[
i
-
1
][
index
][
get_bits1
(
gb
)];
}
while
(
index
>
0
);
absolute_region_power_index
[
i
]
=
absolute_region_power_index
[
i
-
1
]
-
index
-
12
;
decoder_standard_deviation
[
i
]
=
s
->
standard_deviation
[
absolute_region_power_index
[
i
]
+
24
];
}
return
get_bits_count
(
gb
);
}
static
int
categorize_regions
(
int
number_of_regions
,
int
number_of_available_bits
,
int
*
absolute_region_power_index
,
int
*
power_categories
,
int
*
category_balance
)
{
int
region
,
delta
,
i
,
temp
;
int
expected_number_of_code_bits
;
int
min
,
max
;
int
offset
,
num_rate_control_possibilities
=
16
,
raw_value
,
raw_max_idx
=
0
,
raw_min_idx
=
0
;
int
max_rate_categories
[
28
];
int
min_rate_categories
[
28
];
int
temp_category_balances
[
64
];
int
*
min_rate_ptr
=
NULL
;
int
*
max_rate_ptr
=
NULL
;
offset
=
-
32
;
for
(
delta
=
32
;
number_of_regions
>
0
&&
delta
>
0
;
delta
/=
2
)
{
expected_number_of_code_bits
=
0
;
for
(
region
=
0
;
region
<
number_of_regions
;
region
++
)
{
i
=
(
delta
+
offset
-
absolute_region_power_index
[
region
])
>>
1
;
i
=
av_clip_uintp2
(
i
,
3
);
power_categories
[
region
]
=
i
;
expected_number_of_code_bits
+=
expected_bits_table
[
i
];
}
if
(
expected_number_of_code_bits
>=
number_of_available_bits
-
32
)
offset
+=
delta
;
}
expected_number_of_code_bits
=
0
;
for
(
region
=
0
;
region
<
number_of_regions
;
region
++
)
{
i
=
(
offset
-
absolute_region_power_index
[
region
])
>>
1
;
i
=
av_clip_uintp2
(
i
,
3
);
max_rate_categories
[
region
]
=
min_rate_categories
[
region
]
=
power_categories
[
region
]
=
i
;
expected_number_of_code_bits
+=
expected_bits_table
[
i
];
}
min
=
max
=
expected_number_of_code_bits
;
min_rate_ptr
=
max_rate_ptr
=
temp_category_balances
+
num_rate_control_possibilities
;
for
(
i
=
0
;
i
<
num_rate_control_possibilities
-
1
;
i
++
)
{
if
(
min
+
max
>
number_of_available_bits
*
2
)
{
raw_value
=
-
99
;
for
(
region
=
number_of_regions
-
1
;
region
>=
0
;
region
--
)
{
if
(
min_rate_categories
[
region
]
<
7
)
{
temp
=
offset
-
absolute_region_power_index
[
region
]
-
2
*
min_rate_categories
[
region
];
if
(
temp
>
raw_value
)
{
raw_value
=
temp
;
raw_min_idx
=
region
;
}
}
}
*
min_rate_ptr
++
=
raw_min_idx
;
min
+=
expected_bits_table
[
min_rate_categories
[
raw_min_idx
]
+
1
]
-
expected_bits_table
[
min_rate_categories
[
raw_min_idx
]];
min_rate_categories
[
raw_min_idx
]
++
;
}
else
{
raw_value
=
99
;
for
(
region
=
0
;
region
<
number_of_regions
;
region
++
)
{
if
(
max_rate_categories
[
region
]
>
0
)
{
temp
=
offset
-
absolute_region_power_index
[
region
]
-
2
*
max_rate_categories
[
region
];
if
(
temp
<
raw_value
)
{
raw_value
=
temp
;
raw_max_idx
=
region
;
}
}
}
*--
max_rate_ptr
=
raw_max_idx
;
max
+=
expected_bits_table
[
max_rate_categories
[
raw_max_idx
]
-
1
]
-
expected_bits_table
[
max_rate_categories
[
raw_max_idx
]];
max_rate_categories
[
raw_max_idx
]
--
;
}
}
for
(
region
=
0
;
region
<
number_of_regions
;
region
++
)
power_categories
[
region
]
=
max_rate_categories
[
region
];
for
(
i
=
0
;
i
<
num_rate_control_possibilities
-
1
;
i
++
)
category_balance
[
i
]
=
*
max_rate_ptr
++
;
return
0
;
}
static
int
get_dw
(
SirenContext
*
s
)
{
int
ret
=
s
->
dw1
+
s
->
dw4
;
if
((
ret
&
0x8000
)
!=
0
)
ret
++
;
s
->
dw1
=
s
->
dw2
;
s
->
dw2
=
s
->
dw3
;
s
->
dw3
=
s
->
dw4
;
s
->
dw4
=
ret
;
return
ret
;
}
static
int
decode_vector
(
SirenContext
*
s
,
int
number_of_regions
,
int
number_of_available_bits
,
float
*
decoder_standard_deviation
,
int
*
power_categories
,
float
*
coefs
,
int
scale_factor
)
{
GetBitContext
*
gb
=
&
s
->
gb
;
float
*
coefs_ptr
;
float
decoded_value
;
float
noise
;
const
uint16_t
*
decoder_tree
;
int
region
;
int
category
;
int
i
,
j
;
int
index
;
int
error
=
0
;
int
dw1
;
int
dw2
;
for
(
region
=
0
;
region
<
number_of_regions
;
region
++
)
{
category
=
power_categories
[
region
];
coefs_ptr
=
coefs
+
(
region
*
s
->
region_size
);
if
(
category
>=
0
&&
category
<
7
)
{
decoder_tree
=
decoder_tables
[
category
];
for
(
i
=
0
;
i
<
number_of_vectors
[
category
];
i
++
)
{
index
=
0
;
do
{
if
(
get_bits_left
(
gb
)
<=
0
)
{
error
=
1
;
break
;
}
if
(
index
+
show_bits1
(
gb
)
>=
decoder_tables_elements
[
category
])
{
error
=
1
;
break
;
}
index
=
decoder_tree
[
index
+
get_bits1
(
gb
)];
}
while
((
index
&
1
)
==
0
);
index
>>=
1
;
if
(
error
==
0
&&
get_bits_left
(
gb
)
>=
0
)
{
for
(
j
=
0
;
j
<
vector_dimension
[
category
];
j
++
)
{
decoded_value
=
mlt_quant
[
category
][
index
&
((
1
<<
index_table
[
category
])
-
1
)];
index
>>=
index_table
[
category
];
if
(
decoded_value
)
{
if
(
!
get_bits1
(
gb
))
decoded_value
*=
-
decoder_standard_deviation
[
region
];
else
decoded_value
*=
decoder_standard_deviation
[
region
];
}
*
coefs_ptr
++
=
decoded_value
*
scale_factor
;
}
}
else
{
error
=
1
;
break
;
}
}
if
(
error
==
1
)
{
for
(
j
=
region
+
1
;
j
<
number_of_regions
;
j
++
)
power_categories
[
j
]
=
7
;
category
=
7
;
}
}
coefs_ptr
=
coefs
+
(
region
*
s
->
region_size
);
if
(
category
==
5
)
{
i
=
0
;
for
(
j
=
0
;
j
<
s
->
region_size
;
j
++
)
{
if
(
*
coefs_ptr
!=
0
)
i
++
;
coefs_ptr
++
;
}
noise
=
decoder_standard_deviation
[
region
]
*
noise_category5
[
i
];
}
else
if
(
category
==
6
)
{
i
=
0
;
for
(
j
=
0
;
j
<
s
->
region_size
;
j
++
)
{
if
(
*
coefs_ptr
++
!=
0
)
i
++
;
}
noise
=
decoder_standard_deviation
[
region
]
*
noise_category6
[
i
];
}
else
if
(
category
==
7
)
{
noise
=
decoder_standard_deviation
[
region
]
*
0
.
70711
f
;
}
else
{
noise
=
0
;
}
coefs_ptr
=
coefs
+
(
region
*
s
->
region_size
);
if
(
category
==
5
||
category
==
6
||
category
==
7
)
{
dw1
=
get_dw
(
s
);
dw2
=
get_dw
(
s
);
for
(
j
=
0
;
j
<
10
;
j
++
)
{
if
(
category
==
7
||
*
coefs_ptr
==
0
)
*
coefs_ptr
=
dw1
&
1
?
noise
:
-
noise
;
coefs_ptr
++
;
dw1
>>=
1
;
if
(
category
==
7
||
*
coefs_ptr
==
0
)
*
coefs_ptr
=
dw2
&
1
?
noise
:
-
noise
;
coefs_ptr
++
;
dw2
>>=
1
;
}
}
}
return
error
==
1
?
AVERROR_INVALIDDATA
:
get_bits_left
(
gb
);
}
static
int
siren_decode
(
AVCodecContext
*
avctx
,
void
*
data
,
int
*
got_frame
,
AVPacket
*
avpkt
)
{
SirenContext
*
s
=
avctx
->
priv_data
;
GetBitContext
*
gb
=
&
s
->
gb
;
AVFrame
*
frame
=
data
;
int
ret
,
number_of_valid_coefs
=
20
*
s
->
number_of_regions
;
int
frame_error
=
0
,
rate_control
=
0
;
if
((
ret
=
init_get_bits8
(
gb
,
avpkt
->
data
,
avpkt
->
size
))
<
0
)
return
ret
;
decode_envelope
(
s
,
gb
,
s
->
number_of_regions
,
s
->
decoder_standard_deviation
,
s
->
absolute_region_power_index
,
s
->
esf_adjustment
);
rate_control
=
get_bits
(
gb
,
4
);
categorize_regions
(
s
->
number_of_regions
,
get_bits_left
(
gb
),
s
->
absolute_region_power_index
,
s
->
power_categories
,
s
->
category_balance
);
for
(
int
i
=
0
;
i
<
rate_control
;
i
++
)
s
->
power_categories
[
s
->
category_balance
[
i
]]
++
;
ret
=
decode_vector
(
s
,
s
->
number_of_regions
,
get_bits_left
(
gb
),
s
->
decoder_standard_deviation
,
s
->
power_categories
,
s
->
imdct_in
,
s
->
scale_factor
);
if
(
ret
<
0
)
return
ret
;
if
(
get_bits_left
(
gb
)
>
0
)
{
do
{
frame_error
|=
!
get_bits1
(
gb
);
}
while
(
get_bits_left
(
gb
)
>
0
);
}
else
if
(
get_bits_left
(
gb
)
<
0
&&
rate_control
+
1
<
s
->
rate_control_possibilities
)
{
frame_error
=
1
;
}
for
(
int
i
=
0
;
i
<
s
->
number_of_regions
;
i
++
)
{
if
(
s
->
absolute_region_power_index
[
i
]
>
33
||
s
->
absolute_region_power_index
[
i
]
<
-
31
)
frame_error
=
1
;
}
if
(
frame_error
)
{
memcpy
(
s
->
imdct_in
,
s
->
backup_frame
,
number_of_valid_coefs
*
sizeof
(
float
));
memset
(
s
->
backup_frame
,
0
,
number_of_valid_coefs
*
sizeof
(
float
));
}
else
{
memcpy
(
s
->
backup_frame
,
s
->
imdct_in
,
number_of_valid_coefs
*
sizeof
(
float
));
}
frame
->
nb_samples
=
FRAME_SIZE
;
if
((
ret
=
ff_get_buffer
(
avctx
,
frame
,
0
))
<
0
)
return
ret
;
for
(
int
i
=
0
;
i
<
320
;
i
+=
2
)
s
->
imdct_in
[
i
]
*=
-
1
;
s
->
tx_fn
(
s
->
tx_ctx
,
s
->
imdct_out
,
s
->
imdct_in
,
sizeof
(
float
));
s
->
fdsp
->
vector_fmul_window
((
float
*
)
frame
->
data
[
0
],
s
->
imdct_prev
+
(
FRAME_SIZE
>>
1
),
s
->
imdct_out
,
s
->
window
,
FRAME_SIZE
>>
1
);
FFSWAP
(
float
*
,
s
->
imdct_out
,
s
->
imdct_prev
);
*
got_frame
=
1
;
return
avpkt
->
size
;
}
static
av_cold
void
siren_flush
(
AVCodecContext
*
avctx
)
{
SirenContext
*
s
=
avctx
->
priv_data
;
memset
(
s
->
backup_frame
,
0
,
sizeof
(
s
->
backup_frame
));
memset
(
s
->
imdct_prev
,
0
,
FRAME_SIZE
*
sizeof
(
*
s
->
imdct_prev
));
memset
(
s
->
imdct_out
,
0
,
FRAME_SIZE
*
sizeof
(
*
s
->
imdct_out
));
}
static
av_cold
int
siren_close
(
AVCodecContext
*
avctx
)
{
SirenContext
*
s
=
avctx
->
priv_data
;
av_freep
(
&
s
->
fdsp
);
av_tx_uninit
(
&
s
->
tx_ctx
);
return
0
;
}
AVCodec
ff_siren_decoder
=
{
.
name
=
"siren"
,
.
long_name
=
NULL_IF_CONFIG_SMALL
(
"Siren"
),
.
priv_data_size
=
sizeof
(
SirenContext
),
.
type
=
AVMEDIA_TYPE_AUDIO
,
.
id
=
AV_CODEC_ID_SIREN
,
.
init
=
siren_init
,
.
close
=
siren_close
,
.
decode
=
siren_decode
,
.
flush
=
siren_flush
,
.
capabilities
=
AV_CODEC_CAP_DR1
,
.
caps_internal
=
FF_CODEC_CAP_INIT_THREADSAFE
|
FF_CODEC_CAP_INIT_CLEANUP
,
};
libavcodec/version.h
View file @
464310c1
...
...
@@ -28,7 +28,7 @@
#include "libavutil/version.h"
#define LIBAVCODEC_VERSION_MAJOR 58
#define LIBAVCODEC_VERSION_MINOR 7
0
#define LIBAVCODEC_VERSION_MINOR 7
1
#define LIBAVCODEC_VERSION_MICRO 100
#define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
...
...
libavformat/vivo.c
View file @
464310c1
...
...
@@ -231,6 +231,11 @@ static int vivo_read_header(AVFormatContext *s)
ast
->
codecpar
->
bits_per_coded_sample
=
8
;
ast
->
codecpar
->
block_align
=
24
;
ast
->
codecpar
->
bit_rate
=
6400
;
}
else
{
ast
->
codecpar
->
codec_id
=
AV_CODEC_ID_SIREN
;
ast
->
codecpar
->
bits_per_coded_sample
=
16
;
ast
->
codecpar
->
block_align
=
40
;
ast
->
codecpar
->
bit_rate
=
6400
;
}
ast
->
start_time
=
0
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment