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
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