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
78c8a765
Commit
78c8a765
authored
Mar 26, 2019
by
Paul B Mahol
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
avcodec/get_bits: unbreak get_bits_le() with cached reader
parent
dd06f022
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
60 additions
and
26 deletions
+60
-26
get_bits.h
libavcodec/get_bits.h
+58
-24
utvideodec.c
libavcodec/utvideodec.c
+2
-2
No files found.
libavcodec/get_bits.h
View file @
78c8a765
...
...
@@ -226,34 +226,32 @@ static inline int get_bits_count(const GetBitContext *s)
}
#if CACHED_BITSTREAM_READER
static
inline
void
refill_32
(
GetBitContext
*
s
)
static
inline
void
refill_32
(
GetBitContext
*
s
,
int
is_le
)
{
#if !UNCHECKED_BITSTREAM_READER
if
(
s
->
index
>>
3
>=
s
->
buffer_end
-
s
->
buffer
)
return
;
#endif
#ifdef BITSTREAM_READER_LE
if
(
is_le
)
s
->
cache
=
(
uint64_t
)
AV_RL32
(
s
->
buffer
+
(
s
->
index
>>
3
))
<<
s
->
bits_left
|
s
->
cache
;
#
else
else
s
->
cache
=
s
->
cache
|
(
uint64_t
)
AV_RB32
(
s
->
buffer
+
(
s
->
index
>>
3
))
<<
(
32
-
s
->
bits_left
);
#endif
s
->
index
+=
32
;
s
->
bits_left
+=
32
;
}
static
inline
void
refill_64
(
GetBitContext
*
s
)
static
inline
void
refill_64
(
GetBitContext
*
s
,
int
is_le
)
{
#if !UNCHECKED_BITSTREAM_READER
if
(
s
->
index
>>
3
>=
s
->
buffer_end
-
s
->
buffer
)
return
;
#endif
#ifdef BITSTREAM_READER_LE
if
(
is_le
)
s
->
cache
=
AV_RL64
(
s
->
buffer
+
(
s
->
index
>>
3
));
#
else
else
s
->
cache
=
AV_RB64
(
s
->
buffer
+
(
s
->
index
>>
3
));
#endif
s
->
index
+=
64
;
s
->
bits_left
=
64
;
}
...
...
@@ -385,7 +383,11 @@ static inline unsigned int get_bits(GetBitContext *s, int n)
av_assert2
(
n
>
0
&&
n
<=
32
);
if
(
n
>
s
->
bits_left
)
{
refill_32
(
s
);
#ifdef BITSTREAM_READER_LE
refill_32
(
s
,
1
);
#else
refill_32
(
s
,
0
);
#endif
if
(
s
->
bits_left
<
32
)
s
->
bits_left
=
n
;
}
...
...
@@ -420,7 +422,7 @@ static inline unsigned int get_bits_le(GetBitContext *s, int n)
#if CACHED_BITSTREAM_READER
av_assert2
(
n
>
0
&&
n
<=
32
);
if
(
n
>
s
->
bits_left
)
{
refill_32
(
s
);
refill_32
(
s
,
1
);
if
(
s
->
bits_left
<
32
)
s
->
bits_left
=
n
;
}
...
...
@@ -446,7 +448,11 @@ static inline unsigned int show_bits(GetBitContext *s, int n)
register
unsigned
int
tmp
;
#if CACHED_BITSTREAM_READER
if
(
n
>
s
->
bits_left
)
refill_32
(
s
);
#ifdef BITSTREAM_READER_LE
refill_32
(
s
,
1
);
#else
refill_32
(
s
,
0
);
#endif
tmp
=
show_val
(
s
,
n
);
#else
...
...
@@ -474,7 +480,11 @@ static inline void skip_bits(GetBitContext *s, int n)
n
-=
skip
;
s
->
index
+=
skip
;
}
refill_64
(
s
);
#ifdef BITSTREAM_READER_LE
refill_64
(
s
,
1
);
#else
refill_64
(
s
,
0
);
#endif
if
(
n
)
skip_remaining
(
s
,
n
);
}
...
...
@@ -489,7 +499,11 @@ static inline unsigned int get_bits1(GetBitContext *s)
{
#if CACHED_BITSTREAM_READER
if
(
!
s
->
bits_left
)
refill_64
(
s
);
#ifdef BITSTREAM_READER_LE
refill_64
(
s
,
1
);
#else
refill_64
(
s
,
0
);
#endif
#ifdef BITSTREAM_READER_LE
return
get_val
(
s
,
1
,
1
);
...
...
@@ -605,16 +619,8 @@ static inline int check_marker(void *logctx, GetBitContext *s, const char *msg)
return
bit
;
}
/**
* Initialize GetBitContext.
* @param buffer bitstream buffer, must be AV_INPUT_BUFFER_PADDING_SIZE bytes
* larger than the actual read bits because some optimized bitstream
* readers read 32 or 64 bit at once and could read over the end
* @param bit_size the size of the buffer in bits
* @return 0 on success, AVERROR_INVALIDDATA if the buffer_size would overflow.
*/
static
inline
int
init_get_bits
(
GetBitContext
*
s
,
const
uint8_t
*
buffer
,
int
bit_size
)
static
inline
int
init_get_bits_xe
(
GetBitContext
*
s
,
const
uint8_t
*
buffer
,
int
bit_size
,
int
is_le
)
{
int
buffer_size
;
int
ret
=
0
;
...
...
@@ -634,12 +640,32 @@ static inline int init_get_bits(GetBitContext *s, const uint8_t *buffer,
s
->
index
=
0
;
#if CACHED_BITSTREAM_READER
refill_64
(
s
);
s
->
cache
=
0
;
s
->
bits_left
=
0
;
refill_64
(
s
,
is_le
);
#endif
return
ret
;
}
/**
* Initialize GetBitContext.
* @param buffer bitstream buffer, must be AV_INPUT_BUFFER_PADDING_SIZE bytes
* larger than the actual read bits because some optimized bitstream
* readers read 32 or 64 bit at once and could read over the end
* @param bit_size the size of the buffer in bits
* @return 0 on success, AVERROR_INVALIDDATA if the buffer_size would overflow.
*/
static
inline
int
init_get_bits
(
GetBitContext
*
s
,
const
uint8_t
*
buffer
,
int
bit_size
)
{
#ifdef BITSTREAM_READER_LE
return
init_get_bits_xe
(
s
,
buffer
,
bit_size
,
1
);
#else
return
init_get_bits_xe
(
s
,
buffer
,
bit_size
,
0
);
#endif
}
/**
* Initialize GetBitContext.
* @param buffer bitstream buffer, must be AV_INPUT_BUFFER_PADDING_SIZE bytes
...
...
@@ -656,6 +682,14 @@ static inline int init_get_bits8(GetBitContext *s, const uint8_t *buffer,
return
init_get_bits
(
s
,
buffer
,
byte_size
*
8
);
}
static
inline
int
init_get_bits8_le
(
GetBitContext
*
s
,
const
uint8_t
*
buffer
,
int
byte_size
)
{
if
(
byte_size
>
INT_MAX
/
8
||
byte_size
<
0
)
byte_size
=
-
1
;
return
init_get_bits_xe
(
s
,
buffer
,
byte_size
*
8
,
1
);
}
static
inline
const
uint8_t
*
align_get_bits
(
GetBitContext
*
s
)
{
int
n
=
-
get_bits_count
(
s
)
&
7
;
...
...
libavcodec/utvideodec.c
View file @
78c8a765
...
...
@@ -258,11 +258,11 @@ static int decode_plane(UtvideoContext *c, int plane_no,
GetBitContext
cbit
,
pbit
;
uint8_t
*
dest
,
*
p
;
ret
=
init_get_bits8
(
&
cbit
,
c
->
control_stream
[
plane_no
][
slice
],
c
->
control_stream_size
[
plane_no
][
slice
]);
ret
=
init_get_bits8
_le
(
&
cbit
,
c
->
control_stream
[
plane_no
][
slice
],
c
->
control_stream_size
[
plane_no
][
slice
]);
if
(
ret
<
0
)
return
ret
;
ret
=
init_get_bits8
(
&
pbit
,
c
->
packed_stream
[
plane_no
][
slice
],
c
->
packed_stream_size
[
plane_no
][
slice
]);
ret
=
init_get_bits8
_le
(
&
pbit
,
c
->
packed_stream
[
plane_no
][
slice
],
c
->
packed_stream_size
[
plane_no
][
slice
]);
if
(
ret
<
0
)
return
ret
;
...
...
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