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
b2e95e01
Commit
b2e95e01
authored
Aug 14, 2015
by
Michael Niedermayer
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
avcodec/faxcompr: Factor decode_uncompressed() out
Signed-off-by:
Michael Niedermayer
<
michael@niedermayer.cc
>
parent
fedc4226
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
85 additions
and
127 deletions
+85
-127
faxcompr.c
libavcodec/faxcompr.c
+85
-127
No files found.
libavcodec/faxcompr.c
View file @
b2e95e01
...
...
@@ -122,6 +122,77 @@ av_cold void ff_ccitt_unpack_init(void)
initialized
=
1
;
}
static
int
decode_uncompressed
(
AVCodecContext
*
avctx
,
GetBitContext
*
gb
,
unsigned
int
*
pix_left
,
int
**
runs
,
const
int
*
runend
,
int
*
mode
)
{
int
eob
=
0
;
int
newmode
;
int
saved_run
=
0
;
do
{
int
cwi
,
k
;
int
cw
=
0
;
int
codes
[
2
];
do
{
cwi
=
show_bits
(
gb
,
11
);
if
(
!
cwi
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"Invalid uncompressed codeword
\n
"
);
return
AVERROR_INVALIDDATA
;
}
cwi
=
10
-
av_log2
(
cwi
);
skip_bits
(
gb
,
cwi
+
1
);
if
(
cwi
>
5
)
{
newmode
=
get_bits1
(
gb
);
eob
=
1
;
cwi
-=
6
;
}
cw
+=
cwi
;
}
while
(
cwi
==
5
);
codes
[
0
]
=
cw
;
codes
[
1
]
=
!
eob
;
for
(
k
=
0
;
k
<
2
;
k
++
)
{
if
(
codes
[
k
])
{
if
(
*
mode
==
k
)
{
*
(
*
runs
)
++
=
saved_run
;
if
(
*
runs
>=
runend
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"uncompressed run overrun
\n
"
);
return
AVERROR_INVALIDDATA
;
}
if
(
*
pix_left
<=
saved_run
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"uncompressed run went out of bounds
\n
"
);
return
AVERROR_INVALIDDATA
;
}
*
pix_left
-=
saved_run
;
saved_run
=
0
;
*
mode
=
!*
mode
;
}
saved_run
+=
codes
[
k
];
}
}
}
while
(
!
eob
);
*
(
*
runs
)
++
=
saved_run
;
if
(
*
runs
>=
runend
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"uncompressed run overrun
\n
"
);
return
AVERROR_INVALIDDATA
;
}
if
(
*
pix_left
<=
saved_run
)
{
if
(
*
pix_left
==
saved_run
)
return
1
;
av_log
(
avctx
,
AV_LOG_ERROR
,
"uncompressed run went out of boundsE
\n
"
);
return
AVERROR_INVALIDDATA
;
}
*
pix_left
-=
saved_run
;
saved_run
=
0
;
*
mode
=
!*
mode
;
if
(
newmode
!=
*
mode
)
{
//FIXME CHECK
*
(
*
runs
)
++
=
0
;
*
mode
=
newmode
;
}
return
0
;
}
static
int
decode_group3_1d_line
(
AVCodecContext
*
avctx
,
GetBitContext
*
gb
,
unsigned
int
pix_left
,
int
*
runs
,
...
...
@@ -150,72 +221,13 @@ static int decode_group3_1d_line(AVCodecContext *avctx, GetBitContext *gb,
mode
=
!
mode
;
}
else
if
((
int
)
t
==
-
1
)
{
if
(
show_bits
(
gb
,
12
)
==
15
)
{
int
eob
=
0
;
int
newmode
;
int
saved_run
=
0
;
int
ret
;
skip_bits
(
gb
,
12
);
do
{
int
cwi
,
k
;
int
cw
=
0
;
int
codes
[
2
];
do
{
cwi
=
show_bits
(
gb
,
11
);
if
(
!
cwi
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"Invalid uncompressed codeword
\n
"
);
return
AVERROR_INVALIDDATA
;
}
cwi
=
10
-
av_log2
(
cwi
);
skip_bits
(
gb
,
cwi
+
1
);
if
(
cwi
>
5
)
{
newmode
=
get_bits1
(
gb
);
eob
=
1
;
cwi
-=
6
;
}
cw
+=
cwi
;
}
while
(
cwi
==
5
);
codes
[
0
]
=
cw
;
codes
[
1
]
=
!
eob
;
for
(
k
=
0
;
k
<
2
;
k
++
)
{
if
(
codes
[
k
])
{
if
(
mode
==
k
)
{
*
runs
++
=
saved_run
;
if
(
runs
>=
runend
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"uncompressed run overrun
\n
"
);
return
AVERROR_INVALIDDATA
;
}
if
(
pix_left
<=
saved_run
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"uncompressed run went out of bounds
\n
"
);
return
AVERROR_INVALIDDATA
;
}
pix_left
-=
saved_run
;
saved_run
=
0
;
mode
=
!
mode
;
}
saved_run
+=
codes
[
k
];
}
}
}
while
(
!
eob
);
*
runs
++
=
saved_run
;
if
(
runs
>=
runend
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"uncompressed run overrun
\n
"
);
return
AVERROR_INVALIDDATA
;
}
if
(
pix_left
<=
saved_run
)
{
if
(
pix_left
==
saved_run
)
break
;
av_log
(
avctx
,
AV_LOG_ERROR
,
"uncompressed run went out of boundsE
\n
"
);
return
AVERROR_INVALIDDATA
;
}
pix_left
-=
saved_run
;
saved_run
=
0
;
mode
=
!
mode
;
if
(
newmode
!=
mode
)
{
//FIXME CHECK
*
runs
++
=
0
;
mode
=
newmode
;
}
ret
=
decode_uncompressed
(
avctx
,
gb
,
&
pix_left
,
&
runs
,
runend
,
&
mode
);
if
(
ret
<
0
)
{
return
ret
;
}
else
if
(
ret
)
break
;
}
else
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"Incorrect code
\n
"
);
return
AVERROR_INVALIDDATA
;
...
...
@@ -282,73 +294,19 @@ static int decode_group3_2d_line(AVCodecContext *avctx, GetBitContext *gb,
}
else
if
(
cmode
==
9
||
cmode
==
10
)
{
int
xxx
=
get_bits
(
gb
,
3
);
if
(
cmode
==
9
&&
xxx
==
7
)
{
int
eob
=
0
;
int
newmode
;
int
ret
;
int
pix_left
=
width
-
offs
;
if
(
saved_run
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"saved run %d on entering uncompressed mode
\n
"
,
saved_run
);
return
AVERROR_INVALIDDATA
;
}
do
{
int
cwi
,
k
;
int
cw
=
0
;
int
codes
[
2
];
do
{
cwi
=
show_bits
(
gb
,
11
);
if
(
!
cwi
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"Invalid uncompressed codeword
\n
"
);
return
AVERROR_INVALIDDATA
;
}
cwi
=
10
-
av_log2
(
cwi
);
skip_bits
(
gb
,
cwi
+
1
);
if
(
cwi
>
5
)
{
newmode
=
get_bits1
(
gb
);
eob
=
1
;
cwi
-=
6
;
}
cw
+=
cwi
;
}
while
(
cwi
==
5
);
codes
[
0
]
=
cw
;
codes
[
1
]
=
!
eob
;
for
(
k
=
0
;
k
<
2
;
k
++
)
{
if
(
codes
[
k
])
{
if
(
mode
==
k
)
{
*
runs
++
=
saved_run
;
if
(
runs
>=
runend
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"uncompressed run overrun
\n
"
);
return
AVERROR_INVALIDDATA
;
}
offs
+=
saved_run
;
if
(
offs
>
width
||
run
>
width
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"uncompressed run went out of bounds
\n
"
);
return
AVERROR_INVALIDDATA
;
}
saved_run
=
0
;
mode
=
!
mode
;
}
saved_run
+=
codes
[
k
];
}
}
}
while
(
!
eob
);
*
runs
++
=
saved_run
;
if
(
runs
>=
runend
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"uncompressed run overrun
\n
"
);
return
AVERROR_INVALIDDATA
;
}
offs
+=
saved_run
;
if
(
offs
>
width
||
run
>
width
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"uncompressed run went out of bounds
\n
"
);
return
AVERROR_INVALIDDATA
;
}
saved_run
=
0
;
mode
=
!
mode
;
if
(
newmode
!=
mode
)
{
//FIXME CHECK
*
runs
++
=
0
;
mode
=
newmode
;
}
ret
=
decode_uncompressed
(
avctx
,
gb
,
&
pix_left
,
&
runs
,
runend
,
&
mode
);
offs
=
width
-
pix_left
;
if
(
ret
<
0
)
{
return
ret
;
}
else
if
(
ret
)
break
;
}
else
{
avpriv_report_missing_feature
(
avctx
,
"Special mode %d xxx=%d support"
,
cmode
,
xxx
);
return
AVERROR_PATCHWELCOME
;
...
...
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