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
3a3f06b0
Commit
3a3f06b0
authored
Mar 19, 2012
by
Ronald S. Bultje
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
dpcm: convert to bytestream2.
parent
f31a68e7
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
31 additions
and
27 deletions
+31
-27
dpcm.c
libavcodec/dpcm.c
+31
-27
No files found.
libavcodec/dpcm.c
View file @
3a3f06b0
...
...
@@ -40,6 +40,7 @@
#include "libavutil/intreadwrite.h"
#include "avcodec.h"
#include "bytestream.h"
#include "mathops.h"
typedef
struct
DPCMContext
{
AVFrame
frame
;
...
...
@@ -173,20 +174,18 @@ static av_cold int dpcm_decode_init(AVCodecContext *avctx)
static
int
dpcm_decode_frame
(
AVCodecContext
*
avctx
,
void
*
data
,
int
*
got_frame_ptr
,
AVPacket
*
avpkt
)
{
const
uint8_t
*
buf
=
avpkt
->
data
;
int
buf_size
=
avpkt
->
size
;
const
uint8_t
*
buf_end
=
buf
+
buf_size
;
DPCMContext
*
s
=
avctx
->
priv_data
;
int
out
=
0
,
ret
;
int
predictor
[
2
];
int
ch
=
0
;
int
stereo
=
s
->
channels
-
1
;
int16_t
*
output_samples
;
int16_t
*
output_samples
,
*
samples_end
;
GetByteContext
gb
;
if
(
stereo
&&
(
buf_size
&
1
))
{
if
(
stereo
&&
(
buf_size
&
1
))
buf_size
--
;
buf_end
--
;
}
bytestream2_init
(
&
gb
,
avpkt
->
data
,
buf_size
);
/* calculate output size */
switch
(
avctx
->
codec
->
id
)
{
...
...
@@ -218,22 +217,23 @@ static int dpcm_decode_frame(AVCodecContext *avctx, void *data,
return
ret
;
}
output_samples
=
(
int16_t
*
)
s
->
frame
.
data
[
0
];
samples_end
=
output_samples
+
out
;
switch
(
avctx
->
codec
->
id
)
{
case
CODEC_ID_ROQ_DPCM
:
b
uf
+=
6
;
b
ytestream2_skipu
(
&
gb
,
6
)
;
if
(
stereo
)
{
predictor
[
1
]
=
(
int16_t
)(
bytestream_get_byte
(
&
buf
)
<<
8
);
predictor
[
0
]
=
(
int16_t
)(
bytestream_get_byte
(
&
buf
)
<<
8
);
predictor
[
1
]
=
sign_extend
(
bytestream2_get_byteu
(
&
gb
)
<<
8
,
16
);
predictor
[
0
]
=
sign_extend
(
bytestream2_get_byteu
(
&
gb
)
<<
8
,
16
);
}
else
{
predictor
[
0
]
=
(
int16_t
)
bytestream_get_le16
(
&
buf
);
predictor
[
0
]
=
sign_extend
(
bytestream2_get_le16u
(
&
gb
),
16
);
}
/* decode the samples */
while
(
buf
<
buf
_end
)
{
predictor
[
ch
]
+=
s
->
roq_square_array
[
*
buf
++
];
while
(
output_samples
<
samples
_end
)
{
predictor
[
ch
]
+=
s
->
roq_square_array
[
bytestream2_get_byteu
(
&
gb
)
];
predictor
[
ch
]
=
av_clip_int16
(
predictor
[
ch
]);
*
output_samples
++
=
predictor
[
ch
];
...
...
@@ -243,16 +243,16 @@ static int dpcm_decode_frame(AVCodecContext *avctx, void *data,
break
;
case
CODEC_ID_INTERPLAY_DPCM
:
b
uf
+=
6
;
/* skip over the stream mask and stream length */
b
ytestream2_skipu
(
&
gb
,
6
)
;
/* skip over the stream mask and stream length */
for
(
ch
=
0
;
ch
<
s
->
channels
;
ch
++
)
{
predictor
[
ch
]
=
(
int16_t
)
bytestream_get_le16
(
&
buf
);
predictor
[
ch
]
=
sign_extend
(
bytestream2_get_le16u
(
&
gb
),
16
);
*
output_samples
++
=
predictor
[
ch
];
}
ch
=
0
;
while
(
buf
<
buf
_end
)
{
predictor
[
ch
]
+=
interplay_delta_table
[
*
buf
++
];
while
(
output_samples
<
samples
_end
)
{
predictor
[
ch
]
+=
interplay_delta_table
[
bytestream2_get_byteu
(
&
gb
)
];
predictor
[
ch
]
=
av_clip_int16
(
predictor
[
ch
]);
*
output_samples
++
=
predictor
[
ch
];
...
...
@@ -266,16 +266,19 @@ static int dpcm_decode_frame(AVCodecContext *avctx, void *data,
int
shift
[
2
]
=
{
4
,
4
};
for
(
ch
=
0
;
ch
<
s
->
channels
;
ch
++
)
predictor
[
ch
]
=
(
int16_t
)
bytestream_get_le16
(
&
buf
);
predictor
[
ch
]
=
sign_extend
(
bytestream2_get_le16u
(
&
gb
),
16
);
ch
=
0
;
while
(
buf
<
buf_end
)
{
uint8_t
n
=
*
buf
++
;
int16_t
diff
=
(
n
&
0xFC
)
<<
8
;
if
((
n
&
0x03
)
==
3
)
while
(
output_samples
<
samples_end
)
{
int
diff
=
bytestream2_get_byteu
(
&
gb
);
int
n
=
diff
&
3
;
if
(
n
==
3
)
shift
[
ch
]
++
;
else
shift
[
ch
]
-=
(
2
*
(
n
&
3
));
shift
[
ch
]
-=
(
2
*
n
);
diff
=
sign_extend
((
diff
&~
3
)
<<
8
,
16
);
/* saturate the shifter to a lower limit of 0 */
if
(
shift
[
ch
]
<
0
)
shift
[
ch
]
=
0
;
...
...
@@ -293,9 +296,10 @@ static int dpcm_decode_frame(AVCodecContext *avctx, void *data,
}
case
CODEC_ID_SOL_DPCM
:
if
(
avctx
->
codec_tag
!=
3
)
{
uint8_t
*
output_samples_u8
=
s
->
frame
.
data
[
0
];
while
(
buf
<
buf_end
)
{
uint8_t
n
=
*
buf
++
;
uint8_t
*
output_samples_u8
=
s
->
frame
.
data
[
0
],
*
samples_end_u8
=
output_samples_u8
+
out
;
while
(
output_samples_u8
<
samples_end_u8
)
{
int
n
=
bytestream2_get_byteu
(
&
gb
);
s
->
sample
[
0
]
+=
s
->
sol_table
[
n
>>
4
];
s
->
sample
[
0
]
=
av_clip_uint8
(
s
->
sample
[
0
]);
...
...
@@ -306,8 +310,8 @@ static int dpcm_decode_frame(AVCodecContext *avctx, void *data,
*
output_samples_u8
++
=
s
->
sample
[
stereo
];
}
}
else
{
while
(
buf
<
buf
_end
)
{
uint8_t
n
=
*
buf
++
;
while
(
output_samples
<
samples
_end
)
{
int
n
=
bytestream2_get_byteu
(
&
gb
)
;
if
(
n
&
0x80
)
s
->
sample
[
ch
]
-=
sol_table_16
[
n
&
0x7F
];
else
s
->
sample
[
ch
]
+=
sol_table_16
[
n
&
0x7F
];
s
->
sample
[
ch
]
=
av_clip_int16
(
s
->
sample
[
ch
]);
...
...
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