Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
F
ffmpeg
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
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
submodule
ffmpeg
Commits
c43eb731
Commit
c43eb731
authored
Apr 09, 2016
by
Alexandra Hájková
Committed by
Anton Khirnov
Nov 18, 2016
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
escape124: Convert to the new bitstream reader
Signed-off-by:
Anton Khirnov
<
anton@khirnov.net
>
parent
d8618570
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
41 additions
and
44 deletions
+41
-44
escape124.c
libavcodec/escape124.c
+41
-44
No files found.
libavcodec/escape124.c
View file @
c43eb731
...
@@ -21,7 +21,7 @@
...
@@ -21,7 +21,7 @@
#define BITSTREAM_READER_LE
#define BITSTREAM_READER_LE
#include "avcodec.h"
#include "avcodec.h"
#include "
get_bits
.h"
#include "
bitstream
.h"
#include "internal.h"
#include "internal.h"
typedef
union
MacroBlock
{
typedef
union
MacroBlock
{
...
@@ -48,8 +48,9 @@ typedef struct Escape124Context {
...
@@ -48,8 +48,9 @@ typedef struct Escape124Context {
CodeBook
codebooks
[
3
];
CodeBook
codebooks
[
3
];
}
Escape124Context
;
}
Escape124Context
;
static
int
can_safely_read
(
GetBitContext
*
gb
,
int
bits
)
{
static
int
can_safely_read
(
BitstreamContext
*
bc
,
int
bits
)
return
get_bits_left
(
gb
)
>=
bits
;
{
return
bitstream_bits_left
(
bc
)
>=
bits
;
}
}
/**
/**
...
@@ -86,13 +87,13 @@ static av_cold int escape124_decode_close(AVCodecContext *avctx)
...
@@ -86,13 +87,13 @@ static av_cold int escape124_decode_close(AVCodecContext *avctx)
return
0
;
return
0
;
}
}
static
CodeBook
unpack_codebook
(
GetBitContext
*
gb
,
unsigned
depth
,
static
CodeBook
unpack_codebook
(
BitstreamContext
*
bc
,
unsigned
depth
,
unsigned
size
)
unsigned
size
)
{
{
unsigned
i
,
j
;
unsigned
i
,
j
;
CodeBook
cb
=
{
0
};
CodeBook
cb
=
{
0
};
if
(
!
can_safely_read
(
gb
,
size
*
34
))
if
(
!
can_safely_read
(
bc
,
size
*
34
))
return
cb
;
return
cb
;
if
(
size
>=
INT_MAX
/
sizeof
(
MacroBlock
))
if
(
size
>=
INT_MAX
/
sizeof
(
MacroBlock
))
...
@@ -104,9 +105,9 @@ static CodeBook unpack_codebook(GetBitContext* gb, unsigned depth,
...
@@ -104,9 +105,9 @@ static CodeBook unpack_codebook(GetBitContext* gb, unsigned depth,
cb
.
depth
=
depth
;
cb
.
depth
=
depth
;
cb
.
size
=
size
;
cb
.
size
=
size
;
for
(
i
=
0
;
i
<
size
;
i
++
)
{
for
(
i
=
0
;
i
<
size
;
i
++
)
{
unsigned
mask_bits
=
get_bits
(
gb
,
4
);
unsigned
mask_bits
=
bitstream_read
(
bc
,
4
);
unsigned
color0
=
get_bits
(
gb
,
15
);
unsigned
color0
=
bitstream_read
(
bc
,
15
);
unsigned
color1
=
get_bits
(
gb
,
15
);
unsigned
color1
=
bitstream_read
(
bc
,
15
);
for
(
j
=
0
;
j
<
4
;
j
++
)
{
for
(
j
=
0
;
j
<
4
;
j
++
)
{
if
(
mask_bits
&
(
1
<<
j
))
if
(
mask_bits
&
(
1
<<
j
))
...
@@ -118,47 +119,43 @@ static CodeBook unpack_codebook(GetBitContext* gb, unsigned depth,
...
@@ -118,47 +119,43 @@ static CodeBook unpack_codebook(GetBitContext* gb, unsigned depth,
return
cb
;
return
cb
;
}
}
static
unsigned
decode_skip_count
(
GetBitContext
*
gb
)
static
unsigned
decode_skip_count
(
BitstreamContext
*
bc
)
{
{
unsigned
value
;
unsigned
value
;
// This function reads a maximum of 23 bits,
// This function reads a maximum of 23 bits,
// which is within the padding space
// which is within the padding space
if
(
!
can_safely_read
(
gb
,
1
))
if
(
!
can_safely_read
(
bc
,
1
))
return
-
1
;
return
-
1
;
value
=
get_bits1
(
gb
);
value
=
bitstream_read_bit
(
bc
);
if
(
!
value
)
if
(
!
value
)
return
value
;
return
value
;
value
+=
get_bits
(
gb
,
3
);
value
+=
bitstream_read
(
bc
,
3
);
if
(
value
!=
(
1
+
((
1
<<
3
)
-
1
)))
if
(
value
!=
(
1
+
((
1
<<
3
)
-
1
)))
return
value
;
return
value
;
value
+=
get_bits
(
gb
,
7
);
value
+=
bitstream_read
(
bc
,
7
);
if
(
value
!=
(
1
+
((
1
<<
3
)
-
1
))
+
((
1
<<
7
)
-
1
))
if
(
value
!=
(
1
+
((
1
<<
3
)
-
1
))
+
((
1
<<
7
)
-
1
))
return
value
;
return
value
;
return
value
+
get_bits
(
gb
,
12
);
return
value
+
bitstream_read
(
bc
,
12
);
}
}
static
MacroBlock
decode_macroblock
(
Escape124Context
*
s
,
GetBitContext
*
gb
,
static
MacroBlock
decode_macroblock
(
Escape124Context
*
s
,
BitstreamContext
*
bc
,
int
*
codebook_index
,
int
superblock_index
)
int
*
codebook_index
,
int
superblock_index
)
{
{
// This function reads a maximum of 22 bits; the callers
// This function reads a maximum of 22 bits; the callers
// guard this function appropriately
// guard this function appropriately
unsigned
block_index
,
depth
;
unsigned
block_index
,
depth
;
int
value
=
get_bits1
(
gb
);
int
value
=
bitstream_read_bit
(
bc
);
if
(
value
)
{
if
(
value
)
{
static
const
char
transitions
[
3
][
2
]
=
{
{
2
,
1
},
{
0
,
2
},
{
1
,
0
}
};
static
const
char
transitions
[
3
][
2
]
=
{
{
2
,
1
},
{
0
,
2
},
{
1
,
0
}
};
value
=
get_bits1
(
gb
);
value
=
bitstream_read_bit
(
bc
);
*
codebook_index
=
transitions
[
*
codebook_index
][
value
];
*
codebook_index
=
transitions
[
*
codebook_index
][
value
];
}
}
depth
=
s
->
codebooks
[
*
codebook_index
].
depth
;
depth
=
s
->
codebooks
[
*
codebook_index
].
depth
;
block_index
=
bitstream_read
(
bc
,
depth
);
// depth = 0 means that this shouldn't read any bits;
// in theory, this is the same as get_bits(gb, 0), but
// that doesn't actually work.
block_index
=
get_bitsz
(
gb
,
depth
);
if
(
*
codebook_index
==
1
)
{
if
(
*
codebook_index
==
1
)
{
block_index
+=
superblock_index
<<
s
->
codebooks
[
1
].
depth
;
block_index
+=
superblock_index
<<
s
->
codebooks
[
1
].
depth
;
...
@@ -208,7 +205,7 @@ static int escape124_decode_frame(AVCodecContext *avctx,
...
@@ -208,7 +205,7 @@ static int escape124_decode_frame(AVCodecContext *avctx,
Escape124Context
*
s
=
avctx
->
priv_data
;
Escape124Context
*
s
=
avctx
->
priv_data
;
AVFrame
*
frame
=
data
;
AVFrame
*
frame
=
data
;
GetBitContext
gb
;
BitstreamContext
bc
;
unsigned
frame_flags
,
frame_size
;
unsigned
frame_flags
,
frame_size
;
unsigned
i
;
unsigned
i
;
...
@@ -220,15 +217,15 @@ static int escape124_decode_frame(AVCodecContext *avctx,
...
@@ -220,15 +217,15 @@ static int escape124_decode_frame(AVCodecContext *avctx,
unsigned
old_stride
,
new_stride
;
unsigned
old_stride
,
new_stride
;
int
ret
;
int
ret
;
init_get_bits
(
&
gb
,
buf
,
buf_size
*
8
);
bitstream_init
(
&
bc
,
buf
,
buf_size
*
8
);
// This call also guards the potential depth reads for the
// This call also guards the potential depth reads for the
// codebook unpacking.
// codebook unpacking.
if
(
!
can_safely_read
(
&
gb
,
64
))
if
(
!
can_safely_read
(
&
bc
,
64
))
return
-
1
;
return
-
1
;
frame_flags
=
get_bits_long
(
&
gb
,
32
);
frame_flags
=
bitstream_read
(
&
bc
,
32
);
frame_size
=
get_bits_long
(
&
gb
,
32
);
frame_size
=
bitstream_read
(
&
bc
,
32
);
// Leave last frame unchanged
// Leave last frame unchanged
// FIXME: Is this necessary? I haven't seen it in any real samples
// FIXME: Is this necessary? I haven't seen it in any real samples
...
@@ -251,10 +248,10 @@ static int escape124_decode_frame(AVCodecContext *avctx,
...
@@ -251,10 +248,10 @@ static int escape124_decode_frame(AVCodecContext *avctx,
if
(
i
==
2
)
{
if
(
i
==
2
)
{
// This codebook can be cut off at places other than
// This codebook can be cut off at places other than
// powers of 2, leaving some of the entries undefined.
// powers of 2, leaving some of the entries undefined.
cb_size
=
get_bits_long
(
&
gb
,
20
);
cb_size
=
bitstream_read
(
&
bc
,
20
);
cb_depth
=
av_log2
(
cb_size
-
1
)
+
1
;
cb_depth
=
av_log2
(
cb_size
-
1
)
+
1
;
}
else
{
}
else
{
cb_depth
=
get_bits
(
&
gb
,
4
);
cb_depth
=
bitstream_read
(
&
bc
,
4
);
if
(
i
==
0
)
{
if
(
i
==
0
)
{
// This is the most basic codebook: pow(2,depth) entries
// This is the most basic codebook: pow(2,depth) entries
// for a depth-length key
// for a depth-length key
...
@@ -267,7 +264,7 @@ static int escape124_decode_frame(AVCodecContext *avctx,
...
@@ -267,7 +264,7 @@ static int escape124_decode_frame(AVCodecContext *avctx,
}
}
}
}
av_free
(
s
->
codebooks
[
i
].
blocks
);
av_free
(
s
->
codebooks
[
i
].
blocks
);
s
->
codebooks
[
i
]
=
unpack_codebook
(
&
gb
,
cb_depth
,
cb_size
);
s
->
codebooks
[
i
]
=
unpack_codebook
(
&
bc
,
cb_depth
,
cb_size
);
if
(
!
s
->
codebooks
[
i
].
blocks
)
if
(
!
s
->
codebooks
[
i
].
blocks
)
return
-
1
;
return
-
1
;
}
}
...
@@ -292,7 +289,7 @@ static int escape124_decode_frame(AVCodecContext *avctx,
...
@@ -292,7 +289,7 @@ static int escape124_decode_frame(AVCodecContext *avctx,
if
(
skip
==
-
1
)
{
if
(
skip
==
-
1
)
{
// Note that this call will make us skip the rest of the blocks
// Note that this call will make us skip the rest of the blocks
// if the frame prematurely ends
// if the frame prematurely ends
skip
=
decode_skip_count
(
&
gb
);
skip
=
decode_skip_count
(
&
bc
);
}
}
if
(
skip
)
{
if
(
skip
)
{
...
@@ -302,10 +299,10 @@ static int escape124_decode_frame(AVCodecContext *avctx,
...
@@ -302,10 +299,10 @@ static int escape124_decode_frame(AVCodecContext *avctx,
copy_superblock
(
sb
.
pixels
,
8
,
copy_superblock
(
sb
.
pixels
,
8
,
old_frame_data
,
old_stride
);
old_frame_data
,
old_stride
);
while
(
can_safely_read
(
&
gb
,
1
)
&&
!
get_bits1
(
&
gb
))
{
while
(
can_safely_read
(
&
bc
,
1
)
&&
!
bitstream_read_bit
(
&
bc
))
{
unsigned
mask
;
unsigned
mask
;
mb
=
decode_macroblock
(
s
,
&
gb
,
&
cb_index
,
superblock_index
);
mb
=
decode_macroblock
(
s
,
&
bc
,
&
cb_index
,
superblock_index
);
mask
=
get_bits
(
&
gb
,
16
);
mask
=
bitstream_read
(
&
bc
,
16
);
multi_mask
|=
mask
;
multi_mask
|=
mask
;
for
(
i
=
0
;
i
<
16
;
i
++
)
{
for
(
i
=
0
;
i
<
16
;
i
++
)
{
if
(
mask
&
mask_matrix
[
i
])
{
if
(
mask
&
mask_matrix
[
i
])
{
...
@@ -314,29 +311,29 @@ static int escape124_decode_frame(AVCodecContext *avctx,
...
@@ -314,29 +311,29 @@ static int escape124_decode_frame(AVCodecContext *avctx,
}
}
}
}
if
(
can_safely_read
(
&
gb
,
1
)
&&
!
get_bits1
(
&
gb
))
{
if
(
can_safely_read
(
&
bc
,
1
)
&&
!
bitstream_read_bit
(
&
bc
))
{
unsigned
inv_mask
=
get_bits
(
&
gb
,
4
);
unsigned
inv_mask
=
bitstream_read
(
&
bc
,
4
);
for
(
i
=
0
;
i
<
4
;
i
++
)
{
for
(
i
=
0
;
i
<
4
;
i
++
)
{
if
(
inv_mask
&
(
1
<<
i
))
{
if
(
inv_mask
&
(
1
<<
i
))
{
multi_mask
^=
0xF
<<
i
*
4
;
multi_mask
^=
0xF
<<
i
*
4
;
}
else
{
}
else
{
multi_mask
^=
get_bits
(
&
gb
,
4
)
<<
i
*
4
;
multi_mask
^=
bitstream_read
(
&
bc
,
4
)
<<
i
*
4
;
}
}
}
}
for
(
i
=
0
;
i
<
16
;
i
++
)
{
for
(
i
=
0
;
i
<
16
;
i
++
)
{
if
(
multi_mask
&
mask_matrix
[
i
])
{
if
(
multi_mask
&
mask_matrix
[
i
])
{
if
(
!
can_safely_read
(
&
gb
,
1
))
if
(
!
can_safely_read
(
&
bc
,
1
))
break
;
break
;
mb
=
decode_macroblock
(
s
,
&
gb
,
&
cb_index
,
mb
=
decode_macroblock
(
s
,
&
bc
,
&
cb_index
,
superblock_index
);
superblock_index
);
insert_mb_into_sb
(
&
sb
,
mb
,
i
);
insert_mb_into_sb
(
&
sb
,
mb
,
i
);
}
}
}
}
}
else
if
(
frame_flags
&
(
1
<<
16
))
{
}
else
if
(
frame_flags
&
(
1
<<
16
))
{
while
(
can_safely_read
(
&
gb
,
1
)
&&
!
get_bits1
(
&
gb
))
{
while
(
can_safely_read
(
&
bc
,
1
)
&&
!
bitstream_read_bit
(
&
bc
))
{
mb
=
decode_macroblock
(
s
,
&
gb
,
&
cb_index
,
superblock_index
);
mb
=
decode_macroblock
(
s
,
&
bc
,
&
cb_index
,
superblock_index
);
insert_mb_into_sb
(
&
sb
,
mb
,
get_bits
(
&
gb
,
4
));
insert_mb_into_sb
(
&
sb
,
mb
,
bitstream_read
(
&
bc
,
4
));
}
}
}
}
...
@@ -358,7 +355,7 @@ static int escape124_decode_frame(AVCodecContext *avctx,
...
@@ -358,7 +355,7 @@ static int escape124_decode_frame(AVCodecContext *avctx,
av_log
(
NULL
,
AV_LOG_DEBUG
,
av_log
(
NULL
,
AV_LOG_DEBUG
,
"Escape sizes: %i, %i, %i
\n
"
,
"Escape sizes: %i, %i, %i
\n
"
,
frame_size
,
buf_size
,
get_bits_count
(
&
gb
)
/
8
);
frame_size
,
buf_size
,
bitstream_tell
(
&
bc
)
/
8
);
av_frame_unref
(
s
->
frame
);
av_frame_unref
(
s
->
frame
);
if
((
ret
=
av_frame_ref
(
s
->
frame
,
frame
))
<
0
)
if
((
ret
=
av_frame_ref
(
s
->
frame
,
frame
))
<
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