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
b7d26739
Commit
b7d26739
authored
May 03, 2016
by
foo86
Committed by
James Almer
May 03, 2016
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
avcodec/dca: convert to AVCRC
Signed-off-by:
James Almer
<
jamrial@gmail.com
>
parent
77a7ff8f
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
33 additions
and
52 deletions
+33
-52
dca_core.c
libavcodec/dca_core.c
+10
-15
dca_exss.c
libavcodec/dca_exss.c
+1
-2
dca_xll.c
libavcodec/dca_xll.c
+3
-6
dcadec.c
libavcodec/dcadec.c
+2
-27
dcadec.h
libavcodec/dcadec.h
+17
-2
No files found.
libavcodec/dca_core.c
View file @
b7d26739
...
...
@@ -269,8 +269,7 @@ static int parse_coding_header(DCACoreDecoder *s, enum HeaderType header, int xc
// Check CRC
if
(
s
->
xxch_crc_present
&&
(
s
->
avctx
->
err_recognition
&
(
AV_EF_CRCCHECK
|
AV_EF_CAREFUL
))
&&
ff_dca_check_crc
(
&
s
->
gb
,
header_pos
,
header_pos
+
header_size
*
8
))
{
&&
ff_dca_check_crc
(
s
->
avctx
,
&
s
->
gb
,
header_pos
,
header_pos
+
header_size
*
8
))
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"Invalid XXCH channel set header checksum
\n
"
);
return
AVERROR_INVALIDDATA
;
}
...
...
@@ -977,8 +976,7 @@ static int parse_xxch_frame(DCACoreDecoder *s)
header_size
=
get_bits
(
&
s
->
gb
,
6
)
+
1
;
// Check XXCH frame header CRC
if
((
s
->
avctx
->
err_recognition
&
(
AV_EF_CRCCHECK
|
AV_EF_CAREFUL
))
&&
ff_dca_check_crc
(
&
s
->
gb
,
header_pos
+
32
,
header_pos
+
header_size
*
8
))
{
if
(
ff_dca_check_crc
(
s
->
avctx
,
&
s
->
gb
,
header_pos
+
32
,
header_pos
+
header_size
*
8
))
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"Invalid XXCH frame header checksum
\n
"
);
return
AVERROR_INVALIDDATA
;
}
...
...
@@ -1193,8 +1191,7 @@ static int parse_xbr_frame(DCACoreDecoder *s)
header_size
=
get_bits
(
&
s
->
gb
,
6
)
+
1
;
// Check XBR frame header CRC
if
((
s
->
avctx
->
err_recognition
&
(
AV_EF_CRCCHECK
|
AV_EF_CAREFUL
))
&&
ff_dca_check_crc
(
&
s
->
gb
,
header_pos
+
32
,
header_pos
+
header_size
*
8
))
{
if
(
ff_dca_check_crc
(
s
->
avctx
,
&
s
->
gb
,
header_pos
+
32
,
header_pos
+
header_size
*
8
))
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"Invalid XBR frame header checksum
\n
"
);
return
AVERROR_INVALIDDATA
;
}
...
...
@@ -1509,8 +1506,7 @@ static int parse_x96_coding_header(DCACoreDecoder *s, int exss, int xch_base)
// Check CRC
if
(
s
->
x96_crc_present
&&
(
s
->
avctx
->
err_recognition
&
(
AV_EF_CRCCHECK
|
AV_EF_CAREFUL
))
&&
ff_dca_check_crc
(
&
s
->
gb
,
header_pos
,
header_pos
+
header_size
*
8
))
{
&&
ff_dca_check_crc
(
s
->
avctx
,
&
s
->
gb
,
header_pos
,
header_pos
+
header_size
*
8
))
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"Invalid X96 channel set header checksum
\n
"
);
return
AVERROR_INVALIDDATA
;
}
...
...
@@ -1665,8 +1661,7 @@ static int parse_x96_frame_exss(DCACoreDecoder *s)
header_size
=
get_bits
(
&
s
->
gb
,
6
)
+
1
;
// Check X96 frame header CRC
if
((
s
->
avctx
->
err_recognition
&
(
AV_EF_CRCCHECK
|
AV_EF_CAREFUL
))
&&
ff_dca_check_crc
(
&
s
->
gb
,
header_pos
+
32
,
header_pos
+
header_size
*
8
))
{
if
(
ff_dca_check_crc
(
s
->
avctx
,
&
s
->
gb
,
header_pos
+
32
,
header_pos
+
header_size
*
8
))
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"Invalid X96 frame header checksum
\n
"
);
return
AVERROR_INVALIDDATA
;
}
...
...
@@ -1785,8 +1780,7 @@ static int parse_aux_data(DCACoreDecoder *s)
skip_bits
(
&
s
->
gb
,
16
);
// Check CRC
if
((
s
->
avctx
->
err_recognition
&
(
AV_EF_CRCCHECK
|
AV_EF_CAREFUL
))
&&
ff_dca_check_crc
(
&
s
->
gb
,
aux_pos
,
get_bits_count
(
&
s
->
gb
)))
{
if
(
ff_dca_check_crc
(
s
->
avctx
,
&
s
->
gb
,
aux_pos
,
get_bits_count
(
&
s
->
gb
)))
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"Invalid auxiliary data checksum
\n
"
);
return
AVERROR_INVALIDDATA
;
}
...
...
@@ -1884,9 +1878,10 @@ static int parse_optional_info(DCACoreDecoder *s)
if
(
AV_RB32
(
s
->
gb
.
buffer
+
sync_pos
*
4
)
==
DCA_SYNCWORD_XXCH
)
{
s
->
gb
.
index
=
(
sync_pos
+
1
)
*
32
;
size
=
get_bits
(
&
s
->
gb
,
6
)
+
1
;
if
(
size
>=
11
&&
!
ff_dca_check_crc
(
&
s
->
gb
,
(
sync_pos
+
1
)
*
32
,
sync_pos
*
32
+
size
*
8
))
{
dist
=
s
->
gb
.
size_in_bits
/
8
-
sync_pos
*
4
;
if
(
size
>=
11
&&
size
<=
dist
&&
!
av_crc
(
dca
->
crctab
,
0xffff
,
s
->
gb
.
buffer
+
(
sync_pos
+
1
)
*
4
,
size
-
4
))
{
s
->
xxch_pos
=
sync_pos
*
32
;
break
;
}
...
...
libavcodec/dca_exss.c
View file @
b7d26739
...
...
@@ -398,8 +398,7 @@ int ff_dca_exss_parse(DCAExssParser *s, uint8_t *data, int size)
header_size
=
get_bits
(
&
s
->
gb
,
8
+
4
*
wide_hdr
)
+
1
;
// Check CRC
if
((
s
->
avctx
->
err_recognition
&
(
AV_EF_CRCCHECK
|
AV_EF_CAREFUL
))
&&
ff_dca_check_crc
(
&
s
->
gb
,
32
+
8
,
header_size
*
8
))
{
if
(
ff_dca_check_crc
(
s
->
avctx
,
&
s
->
gb
,
32
+
8
,
header_size
*
8
))
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"Invalid EXSS header checksum
\n
"
);
return
AVERROR_INVALIDDATA
;
}
...
...
libavcodec/dca_xll.c
View file @
b7d26739
...
...
@@ -123,8 +123,7 @@ static int chs_parse_header(DCAXllDecoder *s, DCAXllChSet *c, DCAExssAsset *asse
header_size
=
get_bits
(
&
s
->
gb
,
10
)
+
1
;
// Check CRC
if
((
s
->
avctx
->
err_recognition
&
(
AV_EF_CRCCHECK
|
AV_EF_CAREFUL
))
&&
ff_dca_check_crc
(
&
s
->
gb
,
header_pos
,
header_pos
+
header_size
*
8
))
{
if
(
ff_dca_check_crc
(
s
->
avctx
,
&
s
->
gb
,
header_pos
,
header_pos
+
header_size
*
8
))
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"Invalid XLL sub-header checksum
\n
"
);
return
AVERROR_INVALIDDATA
;
}
...
...
@@ -784,8 +783,7 @@ static int parse_common_header(DCAXllDecoder *s)
header_size
=
get_bits
(
&
s
->
gb
,
8
)
+
1
;
// Check CRC
if
((
s
->
avctx
->
err_recognition
&
(
AV_EF_CRCCHECK
|
AV_EF_CAREFUL
))
&&
ff_dca_check_crc
(
&
s
->
gb
,
32
,
header_size
*
8
))
{
if
(
ff_dca_check_crc
(
s
->
avctx
,
&
s
->
gb
,
32
,
header_size
*
8
))
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"Invalid XLL common header checksum
\n
"
);
return
AVERROR_INVALIDDATA
;
}
...
...
@@ -993,8 +991,7 @@ static int parse_navi_table(DCAXllDecoder *s)
skip_bits
(
&
s
->
gb
,
16
);
// Check CRC
if
((
s
->
avctx
->
err_recognition
&
(
AV_EF_CRCCHECK
|
AV_EF_CAREFUL
))
&&
ff_dca_check_crc
(
&
s
->
gb
,
navi_pos
,
get_bits_count
(
&
s
->
gb
)))
{
if
(
ff_dca_check_crc
(
s
->
avctx
,
&
s
->
gb
,
navi_pos
,
get_bits_count
(
&
s
->
gb
)))
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"Invalid NAVI checksum
\n
"
);
return
AVERROR_INVALIDDATA
;
}
...
...
libavcodec/dcadec.c
View file @
b7d26739
...
...
@@ -76,33 +76,6 @@ int ff_dca_set_channel_layout(AVCodecContext *avctx, int *ch_remap, int dca_mask
return
nchannels
;
}
static
uint16_t
crc16
(
const
uint8_t
*
data
,
int
size
)
{
static
const
uint16_t
crctab
[
16
]
=
{
0x0000
,
0x1021
,
0x2042
,
0x3063
,
0x4084
,
0x50a5
,
0x60c6
,
0x70e7
,
0x8108
,
0x9129
,
0xa14a
,
0xb16b
,
0xc18c
,
0xd1ad
,
0xe1ce
,
0xf1ef
,
};
uint16_t
res
=
0xffff
;
int
i
;
for
(
i
=
0
;
i
<
size
;
i
++
)
{
res
=
(
res
<<
4
)
^
crctab
[(
data
[
i
]
>>
4
)
^
(
res
>>
12
)];
res
=
(
res
<<
4
)
^
crctab
[(
data
[
i
]
&
15
)
^
(
res
>>
12
)];
}
return
res
;
}
int
ff_dca_check_crc
(
GetBitContext
*
s
,
int
p1
,
int
p2
)
{
if
(((
p1
|
p2
)
&
7
)
||
p1
<
0
||
p2
>
s
->
size_in_bits
||
p2
-
p1
<
16
)
return
-
1
;
if
(
crc16
(
s
->
buffer
+
p1
/
8
,
(
p2
-
p1
)
/
8
))
return
-
1
;
return
0
;
}
void
ff_dca_downmix_to_stereo_fixed
(
DCADSPContext
*
dcadsp
,
int32_t
**
samples
,
int
*
coeff_l
,
int
nsamples
,
int
ch_mask
)
{
...
...
@@ -359,6 +332,8 @@ static av_cold int dcadec_init(AVCodecContext *avctx)
s
->
core
.
dcadsp
=
&
s
->
dcadsp
;
s
->
xll
.
dcadsp
=
&
s
->
dcadsp
;
s
->
crctab
=
av_crc_get_table
(
AV_CRC_16_CCITT
);
switch
(
avctx
->
request_channel_layout
&
~
AV_CH_LAYOUT_NATIVE
)
{
case
0
:
s
->
request_channel_layout
=
0
;
...
...
libavcodec/dcadec.h
View file @
b7d26739
...
...
@@ -22,6 +22,7 @@
#define AVCODEC_DCADEC_H
#include "libavutil/common.h"
#include "libavutil/crc.h"
#include "libavutil/float_dsp.h"
#include "avcodec.h"
...
...
@@ -49,6 +50,8 @@ typedef struct DCAContext {
DCADSPContext
dcadsp
;
const
AVCRC
*
crctab
;
uint8_t
*
buffer
;
///< Packet buffer
unsigned
int
buffer_size
;
...
...
@@ -62,13 +65,25 @@ typedef struct DCAContext {
int
ff_dca_set_channel_layout
(
AVCodecContext
*
avctx
,
int
*
ch_remap
,
int
dca_mask
);
int
ff_dca_check_crc
(
GetBitContext
*
s
,
int
p1
,
int
p2
);
void
ff_dca_downmix_to_stereo_fixed
(
DCADSPContext
*
dcadsp
,
int32_t
**
samples
,
int
*
coeff_l
,
int
nsamples
,
int
ch_mask
);
void
ff_dca_downmix_to_stereo_float
(
AVFloatDSPContext
*
fdsp
,
float
**
samples
,
int
*
coeff_l
,
int
nsamples
,
int
ch_mask
);
static
inline
int
ff_dca_check_crc
(
AVCodecContext
*
avctx
,
GetBitContext
*
s
,
int
p1
,
int
p2
)
{
DCAContext
*
dca
=
avctx
->
priv_data
;
if
(
!
(
avctx
->
err_recognition
&
(
AV_EF_CRCCHECK
|
AV_EF_CAREFUL
)))
return
0
;
if
(((
p1
|
p2
)
&
7
)
||
p1
<
0
||
p2
>
s
->
size_in_bits
||
p2
-
p1
<
16
)
return
-
1
;
if
(
av_crc
(
dca
->
crctab
,
0xffff
,
s
->
buffer
+
p1
/
8
,
(
p2
-
p1
)
/
8
))
return
-
1
;
return
0
;
}
static
inline
int
ff_dca_seek_bits
(
GetBitContext
*
s
,
int
p
)
{
if
(
p
<
s
->
index
||
p
>
s
->
size_in_bits
)
...
...
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