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
0404ec61
Commit
0404ec61
authored
Apr 04, 2013
by
Diego Biurrun
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
h261: cosmetics: Move functions to avoid forward declarations
parent
b78f81c8
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
161 additions
and
166 deletions
+161
-166
h261dec.c
libavcodec/h261dec.c
+88
-90
h261enc.c
libavcodec/h261enc.c
+73
-76
No files found.
libavcodec/h261dec.c
View file @
0404ec61
...
...
@@ -44,8 +44,6 @@ static VLC h261_mtype_vlc;
static
VLC
h261_mv_vlc
;
static
VLC
h261_cbp_vlc
;
static
int
h261_decode_block
(
H261Context
*
h
,
int16_t
*
block
,
int
n
,
int
coded
);
static
av_cold
void
h261_decode_init_vlc
(
H261Context
*
h
)
{
static
int
done
=
0
;
...
...
@@ -246,6 +244,94 @@ static int decode_mv_component(GetBitContext *gb, int v)
return
v
;
}
/**
* Decode a macroblock.
* @return <0 if an error occurred
*/
static
int
h261_decode_block
(
H261Context
*
h
,
int16_t
*
block
,
int
n
,
int
coded
)
{
MpegEncContext
*
const
s
=
&
h
->
s
;
int
code
,
level
,
i
,
j
,
run
;
RLTable
*
rl
=
&
h261_rl_tcoeff
;
const
uint8_t
*
scan_table
;
/* For the variable length encoding there are two code tables, one being
* used for the first transmitted LEVEL in INTER, INTER + MC and
* INTER + MC + FIL blocks, the second for all other LEVELs except the
* first one in INTRA blocks which is fixed length coded with 8 bits.
* NOTE: The two code tables only differ in one VLC so we handle that
* manually. */
scan_table
=
s
->
intra_scantable
.
permutated
;
if
(
s
->
mb_intra
)
{
/* DC coef */
level
=
get_bits
(
&
s
->
gb
,
8
);
// 0 (00000000b) and -128 (10000000b) are FORBIDDEN
if
((
level
&
0x7F
)
==
0
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"illegal dc %d at %d %d
\n
"
,
level
,
s
->
mb_x
,
s
->
mb_y
);
return
-
1
;
}
/* The code 1000 0000 is not used, the reconstruction level of 1024
* being coded as 1111 1111. */
if
(
level
==
255
)
level
=
128
;
block
[
0
]
=
level
;
i
=
1
;
}
else
if
(
coded
)
{
// Run Level Code
// EOB Not possible for first level when cbp is available (that's why the table is different)
// 0 1 1s
// * * 0*
int
check
=
show_bits
(
&
s
->
gb
,
2
);
i
=
0
;
if
(
check
&
0x2
)
{
skip_bits
(
&
s
->
gb
,
2
);
block
[
0
]
=
(
check
&
0x1
)
?
-
1
:
1
;
i
=
1
;
}
}
else
{
i
=
0
;
}
if
(
!
coded
)
{
s
->
block_last_index
[
n
]
=
i
-
1
;
return
0
;
}
for
(;;)
{
code
=
get_vlc2
(
&
s
->
gb
,
rl
->
vlc
.
table
,
TCOEFF_VLC_BITS
,
2
);
if
(
code
<
0
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"illegal ac vlc code at %dx%d
\n
"
,
s
->
mb_x
,
s
->
mb_y
);
return
-
1
;
}
if
(
code
==
rl
->
n
)
{
/* escape */
/* The remaining combinations of (run, level) are encoded with a
* 20-bit word consisting of 6 bits escape, 6 bits run and 8 bits
* level. */
run
=
get_bits
(
&
s
->
gb
,
6
);
level
=
get_sbits
(
&
s
->
gb
,
8
);
}
else
if
(
code
==
0
)
{
break
;
}
else
{
run
=
rl
->
table_run
[
code
];
level
=
rl
->
table_level
[
code
];
if
(
get_bits1
(
&
s
->
gb
))
level
=
-
level
;
}
i
+=
run
;
if
(
i
>=
64
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"run overflow at %dx%d
\n
"
,
s
->
mb_x
,
s
->
mb_y
);
return
-
1
;
}
j
=
scan_table
[
i
];
block
[
j
]
=
level
;
i
++
;
}
s
->
block_last_index
[
n
]
=
i
-
1
;
return
0
;
}
static
int
h261_decode_mb
(
H261Context
*
h
)
{
MpegEncContext
*
const
s
=
&
h
->
s
;
...
...
@@ -353,94 +439,6 @@ intra:
return
SLICE_OK
;
}
/**
* Decode a macroblock.
* @return <0 if an error occurred
*/
static
int
h261_decode_block
(
H261Context
*
h
,
int16_t
*
block
,
int
n
,
int
coded
)
{
MpegEncContext
*
const
s
=
&
h
->
s
;
int
code
,
level
,
i
,
j
,
run
;
RLTable
*
rl
=
&
h261_rl_tcoeff
;
const
uint8_t
*
scan_table
;
/* For the variable length encoding there are two code tables, one being
* used for the first transmitted LEVEL in INTER, INTER + MC and
* INTER + MC + FIL blocks, the second for all other LEVELs except the
* first one in INTRA blocks which is fixed length coded with 8 bits.
* NOTE: The two code tables only differ in one VLC so we handle that
* manually. */
scan_table
=
s
->
intra_scantable
.
permutated
;
if
(
s
->
mb_intra
)
{
/* DC coef */
level
=
get_bits
(
&
s
->
gb
,
8
);
// 0 (00000000b) and -128 (10000000b) are FORBIDDEN
if
((
level
&
0x7F
)
==
0
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"illegal dc %d at %d %d
\n
"
,
level
,
s
->
mb_x
,
s
->
mb_y
);
return
-
1
;
}
/* The code 1000 0000 is not used, the reconstruction level of 1024
* being coded as 1111 1111. */
if
(
level
==
255
)
level
=
128
;
block
[
0
]
=
level
;
i
=
1
;
}
else
if
(
coded
)
{
// Run Level Code
// EOB Not possible for first level when cbp is available (that's why the table is different)
// 0 1 1s
// * * 0*
int
check
=
show_bits
(
&
s
->
gb
,
2
);
i
=
0
;
if
(
check
&
0x2
)
{
skip_bits
(
&
s
->
gb
,
2
);
block
[
0
]
=
(
check
&
0x1
)
?
-
1
:
1
;
i
=
1
;
}
}
else
{
i
=
0
;
}
if
(
!
coded
)
{
s
->
block_last_index
[
n
]
=
i
-
1
;
return
0
;
}
for
(;;)
{
code
=
get_vlc2
(
&
s
->
gb
,
rl
->
vlc
.
table
,
TCOEFF_VLC_BITS
,
2
);
if
(
code
<
0
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"illegal ac vlc code at %dx%d
\n
"
,
s
->
mb_x
,
s
->
mb_y
);
return
-
1
;
}
if
(
code
==
rl
->
n
)
{
/* escape */
/* The remaining combinations of (run, level) are encoded with a
* 20-bit word consisting of 6 bits escape, 6 bits run and 8 bits
* level. */
run
=
get_bits
(
&
s
->
gb
,
6
);
level
=
get_sbits
(
&
s
->
gb
,
8
);
}
else
if
(
code
==
0
)
{
break
;
}
else
{
run
=
rl
->
table_run
[
code
];
level
=
rl
->
table_level
[
code
];
if
(
get_bits1
(
&
s
->
gb
))
level
=
-
level
;
}
i
+=
run
;
if
(
i
>=
64
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"run overflow at %dx%d
\n
"
,
s
->
mb_x
,
s
->
mb_y
);
return
-
1
;
}
j
=
scan_table
[
i
];
block
[
j
]
=
level
;
i
++
;
}
s
->
block_last_index
[
n
]
=
i
-
1
;
return
0
;
}
/**
* Decode the H.261 picture header.
* @return <0 if no startcode found
...
...
libavcodec/h261enc.c
View file @
0404ec61
...
...
@@ -31,9 +31,6 @@
#include "h261.h"
#include "h261data.h"
static
void
h261_encode_block
(
H261Context
*
h
,
int16_t
*
block
,
int
n
);
int
ff_h261_get_picture_format
(
int
width
,
int
height
)
{
// QCIF
...
...
@@ -155,6 +152,79 @@ static inline int get_cbp(MpegEncContext *s, int16_t block[6][64])
return
cbp
;
}
/**
* Encode an 8x8 block.
* @param block the 8x8 block
* @param n block index (0-3 are luma, 4-5 are chroma)
*/
static
void
h261_encode_block
(
H261Context
*
h
,
int16_t
*
block
,
int
n
)
{
MpegEncContext
*
const
s
=
&
h
->
s
;
int
level
,
run
,
i
,
j
,
last_index
,
last_non_zero
,
sign
,
slevel
,
code
;
RLTable
*
rl
;
rl
=
&
h261_rl_tcoeff
;
if
(
s
->
mb_intra
)
{
/* DC coef */
level
=
block
[
0
];
/* 255 cannot be represented, so we clamp */
if
(
level
>
254
)
{
level
=
254
;
block
[
0
]
=
254
;
}
/* 0 cannot be represented also */
else
if
(
level
<
1
)
{
level
=
1
;
block
[
0
]
=
1
;
}
if
(
level
==
128
)
put_bits
(
&
s
->
pb
,
8
,
0xff
);
else
put_bits
(
&
s
->
pb
,
8
,
level
);
i
=
1
;
}
else
if
((
block
[
0
]
==
1
||
block
[
0
]
==
-
1
)
&&
(
s
->
block_last_index
[
n
]
>
-
1
))
{
// special case
put_bits
(
&
s
->
pb
,
2
,
block
[
0
]
>
0
?
2
:
3
);
i
=
1
;
}
else
{
i
=
0
;
}
/* AC coefs */
last_index
=
s
->
block_last_index
[
n
];
last_non_zero
=
i
-
1
;
for
(;
i
<=
last_index
;
i
++
)
{
j
=
s
->
intra_scantable
.
permutated
[
i
];
level
=
block
[
j
];
if
(
level
)
{
run
=
i
-
last_non_zero
-
1
;
sign
=
0
;
slevel
=
level
;
if
(
level
<
0
)
{
sign
=
1
;
level
=
-
level
;
}
code
=
get_rl_index
(
rl
,
0
/*no last in H.261, EOB is used*/
,
run
,
level
);
if
(
run
==
0
&&
level
<
16
)
code
+=
1
;
put_bits
(
&
s
->
pb
,
rl
->
table_vlc
[
code
][
1
],
rl
->
table_vlc
[
code
][
0
]);
if
(
code
==
rl
->
n
)
{
put_bits
(
&
s
->
pb
,
6
,
run
);
assert
(
slevel
!=
0
);
assert
(
level
<=
127
);
put_sbits
(
&
s
->
pb
,
8
,
slevel
);
}
else
{
put_bits
(
&
s
->
pb
,
1
,
sign
);
}
last_non_zero
=
i
;
}
}
if
(
last_index
>
-
1
)
put_bits
(
&
s
->
pb
,
rl
->
table_vlc
[
0
][
1
],
rl
->
table_vlc
[
0
][
0
]);
// EOB
}
void
ff_h261_encode_mb
(
MpegEncContext
*
s
,
int16_t
block
[
6
][
64
],
int
motion_x
,
int
motion_y
)
{
...
...
@@ -252,79 +322,6 @@ void ff_h261_encode_init(MpegEncContext *s)
s
->
c_dc_scale_table
=
ff_mpeg1_dc_scale_table
;
}
/**
* Encode an 8x8 block.
* @param block the 8x8 block
* @param n block index (0-3 are luma, 4-5 are chroma)
*/
static
void
h261_encode_block
(
H261Context
*
h
,
int16_t
*
block
,
int
n
)
{
MpegEncContext
*
const
s
=
&
h
->
s
;
int
level
,
run
,
i
,
j
,
last_index
,
last_non_zero
,
sign
,
slevel
,
code
;
RLTable
*
rl
;
rl
=
&
h261_rl_tcoeff
;
if
(
s
->
mb_intra
)
{
/* DC coef */
level
=
block
[
0
];
/* 255 cannot be represented, so we clamp */
if
(
level
>
254
)
{
level
=
254
;
block
[
0
]
=
254
;
}
/* 0 cannot be represented also */
else
if
(
level
<
1
)
{
level
=
1
;
block
[
0
]
=
1
;
}
if
(
level
==
128
)
put_bits
(
&
s
->
pb
,
8
,
0xff
);
else
put_bits
(
&
s
->
pb
,
8
,
level
);
i
=
1
;
}
else
if
((
block
[
0
]
==
1
||
block
[
0
]
==
-
1
)
&&
(
s
->
block_last_index
[
n
]
>
-
1
))
{
// special case
put_bits
(
&
s
->
pb
,
2
,
block
[
0
]
>
0
?
2
:
3
);
i
=
1
;
}
else
{
i
=
0
;
}
/* AC coefs */
last_index
=
s
->
block_last_index
[
n
];
last_non_zero
=
i
-
1
;
for
(;
i
<=
last_index
;
i
++
)
{
j
=
s
->
intra_scantable
.
permutated
[
i
];
level
=
block
[
j
];
if
(
level
)
{
run
=
i
-
last_non_zero
-
1
;
sign
=
0
;
slevel
=
level
;
if
(
level
<
0
)
{
sign
=
1
;
level
=
-
level
;
}
code
=
get_rl_index
(
rl
,
0
/*no last in H.261, EOB is used*/
,
run
,
level
);
if
(
run
==
0
&&
level
<
16
)
code
+=
1
;
put_bits
(
&
s
->
pb
,
rl
->
table_vlc
[
code
][
1
],
rl
->
table_vlc
[
code
][
0
]);
if
(
code
==
rl
->
n
)
{
put_bits
(
&
s
->
pb
,
6
,
run
);
assert
(
slevel
!=
0
);
assert
(
level
<=
127
);
put_sbits
(
&
s
->
pb
,
8
,
slevel
);
}
else
{
put_bits
(
&
s
->
pb
,
1
,
sign
);
}
last_non_zero
=
i
;
}
}
if
(
last_index
>
-
1
)
put_bits
(
&
s
->
pb
,
rl
->
table_vlc
[
0
][
1
],
rl
->
table_vlc
[
0
][
0
]);
// EOB
}
FF_MPV_GENERIC_CLASS
(
h261
)
AVCodec
ff_h261_encoder
=
{
...
...
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