Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
F
ffmpeg
Project
Project
Details
Activity
Releases
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
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Stefan Westerfeld
ffmpeg
Commits
9c2d36fc
Commit
9c2d36fc
authored
Apr 11, 2016
by
Luca Barbato
Committed by
Diego Biurrun
Feb 11, 2017
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
dv: Convert to the new bitstream reader
parent
ba30b746
Changes
2
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
69 additions
and
53 deletions
+69
-53
bitstream.h
libavcodec/bitstream.h
+28
-0
dvdec.c
libavcodec/dvdec.c
+41
-53
No files found.
libavcodec/bitstream.h
View file @
9c2d36fc
...
...
@@ -384,4 +384,32 @@ static inline int bitstream_apply_sign(BitstreamContext *bc, int val)
return
(
val
^
sign
)
-
sign
;
}
/* Unwind the cache so a refill_32 can fill it again. */
static
inline
void
bitstream_unwind
(
BitstreamContext
*
bc
)
{
int
unwind
=
4
;
int
unwind_bits
=
unwind
*
8
;
if
(
bc
->
bits_left
<
unwind_bits
)
return
;
bc
->
bits
>>=
unwind_bits
;
bc
->
bits
<<=
unwind_bits
;
bc
->
bits_left
-=
unwind_bits
;
bc
->
ptr
-=
unwind
;
}
/* Unget up to 32 bits. */
static
inline
void
bitstream_unget
(
BitstreamContext
*
bc
,
uint64_t
value
,
size_t
amount
)
{
size_t
cache_size
=
sizeof
(
bc
->
bits
)
*
8
;
if
(
bc
->
bits_left
+
amount
>
cache_size
)
bitstream_unwind
(
bc
);
bc
->
bits
=
(
bc
->
bits
>>
amount
)
|
(
value
<<
(
cache_size
-
amount
));
bc
->
bits_left
+=
amount
;
}
#endif
/* AVCODEC_BITSTREAM_H */
libavcodec/dvdec.c
View file @
9c2d36fc
...
...
@@ -40,9 +40,9 @@
#include "libavutil/pixdesc.h"
#include "avcodec.h"
#include "bitstream.h"
#include "dv.h"
#include "dvdata.h"
#include "get_bits.h"
#include "idctdsp.h"
#include "internal.h"
#include "put_bits.h"
...
...
@@ -80,51 +80,34 @@ static av_cold int dvvideo_decode_init(AVCodecContext *avctx)
}
/* decode AC coefficients */
static
void
dv_decode_ac
(
GetBitContext
*
gb
,
BlockInfo
*
mb
,
int16_t
*
block
)
static
void
dv_decode_ac
(
BitstreamContext
*
bc
,
BlockInfo
*
mb
,
int16_t
*
block
)
{
int
last_index
=
gb
->
size_in_bits
;
const
uint8_t
*
scan_table
=
mb
->
scan_table
;
const
uint32_t
*
factor_table
=
mb
->
factor_table
;
int
pos
=
mb
->
pos
;
int
partial_bit_count
=
mb
->
partial_bit_count
;
int
level
,
run
,
vlc_len
,
index
;
OPEN_READER_NOSIZE
(
re
,
gb
);
UPDATE_CACHE
(
re
,
gb
);
int
level
,
run
;
/* if we must parse a partial VLC, we do it here */
if
(
partial_bit_count
>
0
)
{
re_cache
=
re_cache
>>
partial_bit_count
|
mb
->
partial_bit_buffer
;
re_index
-=
partial_bit_count
;
bitstream_unget
(
bc
,
mb
->
partial_bit_buffer
,
partial_bit_count
);
mb
->
partial_bit_count
=
0
;
}
/* get the AC coefficients until last_index is reached */
for
(;;)
{
ff_dlog
(
NULL
,
"%2d: bits=%04x index=%u
\n
"
,
pos
,
SHOW_UBITS
(
re
,
gb
,
16
),
re_index
);
/* our own optimized GET_RL_VLC */
index
=
NEG_USR32
(
re_cache
,
TEX_VLC_BITS
);
vlc_len
=
ff_dv_rl_vlc
[
index
].
len
;
if
(
vlc_len
<
0
)
{
index
=
NEG_USR32
((
unsigned
)
re_cache
<<
TEX_VLC_BITS
,
-
vlc_len
)
+
ff_dv_rl_vlc
[
index
].
level
;
vlc_len
=
TEX_VLC_BITS
-
vlc_len
;
}
level
=
ff_dv_rl_vlc
[
index
].
level
;
run
=
ff_dv_rl_vlc
[
index
].
run
;
/* gotta check if we're still within gb boundaries */
if
(
re_index
+
vlc_len
>
last_index
)
{
/* should be < 16 bits otherwise a codeword could have been parsed */
mb
->
partial_bit_count
=
last_index
-
re_index
;
mb
->
partial_bit_buffer
=
re_cache
&
~
(
-
1u
>>
mb
->
partial_bit_count
);
re_index
=
last_index
;
BitstreamContext
tmp
=
*
bc
;
ff_dlog
(
NULL
,
"%2d: bits=%04x index=%d
\n
"
,
pos
,
bitstream_peek
(
bc
,
16
),
bitstream_tell
(
bc
));
BITSTREAM_RL_VLC
(
level
,
run
,
bc
,
ff_dv_rl_vlc
,
TEX_VLC_BITS
,
2
);
if
(
bitstream_bits_left
(
bc
)
<
0
)
{
mb
->
partial_bit_count
=
bitstream_bits_left
(
&
tmp
);
mb
->
partial_bit_buffer
=
bitstream_peek
(
&
tmp
,
mb
->
partial_bit_count
);
break
;
}
re_index
+=
vlc_len
;
ff_dlog
(
NULL
,
"run=%d level=%d
\n
"
,
run
,
level
);
pos
+=
run
;
if
(
pos
>=
64
)
...
...
@@ -133,22 +116,22 @@ static void dv_decode_ac(GetBitContext *gb, BlockInfo *mb, int16_t *block)
level
=
(
level
*
factor_table
[
pos
]
+
(
1
<<
(
dv_iweight_bits
-
1
)))
>>
dv_iweight_bits
;
block
[
scan_table
[
pos
]]
=
level
;
UPDATE_CACHE
(
re
,
gb
);
}
CLOSE_READER
(
re
,
gb
);
mb
->
pos
=
pos
;
}
static
inline
void
bit_copy
(
PutBitContext
*
pb
,
GetBitContext
*
gb
)
static
inline
void
bit_copy
(
PutBitContext
*
pb
,
BitstreamContext
*
bc
)
{
int
bits_left
=
get_bits_left
(
gb
);
while
(
bits_left
>=
MIN_CACHE_BITS
)
{
put_bits
(
pb
,
MIN_CACHE_BITS
,
get_bits
(
gb
,
MIN_CACHE_BITS
));
bits_left
-=
MIN_CACHE_BITS
;
int
bits_left
=
bitstream_bits_left
(
bc
);
while
(
bits_left
>=
32
)
{
int
read
=
bitstream_read
(
bc
,
32
);
put_bits32
(
pb
,
read
);
bits_left
-=
32
;
}
if
(
bits_left
>
0
)
put_bits
(
pb
,
bits_left
,
get_bits
(
gb
,
bits_left
));
put_bits
(
pb
,
bits_left
,
bitstream_read
(
bc
,
bits_left
));
}
/* mb_x and mb_y are in units of 8 pixels */
...
...
@@ -164,13 +147,14 @@ static int dv_decode_video_segment(AVCodecContext *avctx, void *arg)
uint8_t
*
y_ptr
;
const
uint8_t
*
buf_ptr
;
PutBitContext
pb
,
vs_pb
;
GetBitContext
gb
;
BitstreamContext
bc
;
BlockInfo
mb_data
[
5
*
DV_MAX_BPM
],
*
mb
,
*
mb1
;
LOCAL_ALIGNED_16
(
int16_t
,
sblock
,
[
5
*
DV_MAX_BPM
],
[
64
]);
LOCAL_ALIGNED_16
(
uint8_t
,
mb_bit_buffer
,
[
80
+
AV_INPUT_BUFFER_PADDING_SIZE
]);
/* allow some slack */
LOCAL_ALIGNED_16
(
uint8_t
,
vs_bit_buffer
,
[
80
*
5
+
AV_INPUT_BUFFER_PADDING_SIZE
]);
/* allow some slack */
const
int
log2_blocksize
=
3
;
int
is_field_mode
[
5
];
int
mb_bits
;
assert
((((
int
)
mb_bit_buffer
)
&
7
)
==
0
);
assert
((((
int
)
vs_bit_buffer
)
&
7
)
==
0
);
...
...
@@ -192,12 +176,12 @@ static int dv_decode_video_segment(AVCodecContext *avctx, void *arg)
is_field_mode
[
mb_index
]
=
0
;
for
(
j
=
0
;
j
<
s
->
sys
->
bpm
;
j
++
)
{
last_index
=
s
->
sys
->
block_sizes
[
j
];
init_get_bits
(
&
gb
,
buf_ptr
,
last_index
);
bitstream_init
(
&
bc
,
buf_ptr
,
last_index
);
/* get the DC */
dc
=
get_sbits
(
&
gb
,
9
);
dct_mode
=
get_bits1
(
&
gb
);
class1
=
get_bits
(
&
gb
,
2
);
dc
=
bitstream_read_signed
(
&
bc
,
9
);
dct_mode
=
bitstream_read_bit
(
&
bc
);
class1
=
bitstream_read
(
&
bc
,
2
);
if
(
DV_PROFILE_IS_HD
(
s
->
sys
))
{
mb
->
idct_put
=
s
->
idct_put
[
0
];
mb
->
scan_table
=
s
->
dv_zigzag
[
0
];
...
...
@@ -223,12 +207,12 @@ static int dv_decode_video_segment(AVCodecContext *avctx, void *arg)
mb
->
partial_bit_count
=
0
;
ff_dlog
(
avctx
,
"MB block: %d, %d "
,
mb_index
,
j
);
dv_decode_ac
(
&
gb
,
mb
,
block
);
dv_decode_ac
(
&
bc
,
mb
,
block
);
/* write the remaining bits in a new buffer only if the
* block is finished */
if
(
mb
->
pos
>=
64
)
bit_copy
(
&
pb
,
&
gb
);
bit_copy
(
&
pb
,
&
bc
);
block
+=
64
;
mb
++
;
...
...
@@ -238,12 +222,15 @@ static int dv_decode_video_segment(AVCodecContext *avctx, void *arg)
ff_dlog
(
avctx
,
"***pass 2 size=%d MB#=%d
\n
"
,
put_bits_count
(
&
pb
),
mb_index
);
block
=
block1
;
mb
=
mb1
;
init_get_bits
(
&
gb
,
mb_bit_buffer
,
put_bits_count
(
&
pb
));
mb_bits
=
put_bits_count
(
&
pb
);
put_bits32
(
&
pb
,
0
);
// padding must be zeroed
flush_put_bits
(
&
pb
);
bitstream_init
(
&
bc
,
mb_bit_buffer
,
mb_bits
);
for
(
j
=
0
;
j
<
s
->
sys
->
bpm
;
j
++
,
block
+=
64
,
mb
++
)
{
if
(
mb
->
pos
<
64
&&
get_bits_left
(
&
gb
)
>
0
)
{
dv_decode_ac
(
&
gb
,
mb
,
block
);
if
(
mb
->
pos
<
64
&&
bitstream_bits_left
(
&
bc
)
>
0
)
{
dv_decode_ac
(
&
bc
,
mb
,
block
);
/* if still not finished, no need to parse other blocks */
if
(
mb
->
pos
<
64
)
break
;
...
...
@@ -252,21 +239,22 @@ static int dv_decode_video_segment(AVCodecContext *avctx, void *arg)
/* all blocks are finished, so the extra bytes can be used at
* the video segment level */
if
(
j
>=
s
->
sys
->
bpm
)
bit_copy
(
&
vs_pb
,
&
gb
);
bit_copy
(
&
vs_pb
,
&
bc
);
}
/* we need a pass over the whole video segment */
ff_dlog
(
avctx
,
"***pass 3 size=%d
\n
"
,
put_bits_count
(
&
vs_pb
));
block
=
&
sblock
[
0
][
0
];
mb
=
mb_data
;
init_get_bits
(
&
gb
,
vs_bit_buffer
,
put_bits_count
(
&
vs_pb
)
);
mb_bits
=
put_bits_count
(
&
vs_pb
);
put_bits32
(
&
vs_pb
,
0
);
// padding must be zeroed
flush_put_bits
(
&
vs_pb
);
bitstream_init
(
&
bc
,
vs_bit_buffer
,
mb_bits
);
for
(
mb_index
=
0
;
mb_index
<
5
;
mb_index
++
)
{
for
(
j
=
0
;
j
<
s
->
sys
->
bpm
;
j
++
)
{
if
(
mb
->
pos
<
64
)
{
ff_dlog
(
avctx
,
"start %d:%d
\n
"
,
mb_index
,
j
);
dv_decode_ac
(
&
gb
,
mb
,
block
);
dv_decode_ac
(
&
bc
,
mb
,
block
);
}
if
(
mb
->
pos
>=
64
&&
mb
->
pos
<
127
)
av_log
(
avctx
,
AV_LOG_ERROR
,
...
...
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