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
66f09105
Commit
66f09105
authored
Sep 04, 2013
by
Vittorio Giovara
Committed by
Diego Biurrun
Sep 05, 2013
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
mpeg12enc: drop forward declarations
Signed-off-by:
Diego Biurrun
<
diego@biurrun.de
>
parent
c3e6e8f0
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
158 additions
and
163 deletions
+158
-163
mpeg12enc.c
libavcodec/mpeg12enc.c
+158
-163
No files found.
libavcodec/mpeg12enc.c
View file @
66f09105
...
...
@@ -50,11 +50,6 @@ static const uint8_t svcd_scan_offset_placeholder[14] = {
0xff
,
0xff
,
0xff
,
};
static
void
mpeg1_encode_block
(
MpegEncContext
*
s
,
int16_t
*
block
,
int
component
);
static
void
mpeg1_encode_motion
(
MpegEncContext
*
s
,
int
val
,
int
f_or_b_code
);
// RAL: f_code parameter added
static
uint8_t
mv_penalty
[
MAX_FCODE
+
1
][
MAX_MV
*
2
+
1
];
static
uint8_t
fcode_tab
[
MAX_MV
*
2
+
1
];
...
...
@@ -432,6 +427,164 @@ static inline void put_mb_modes(MpegEncContext *s, int n, int bits,
}
}
// RAL: Parameter added: f_or_b_code
static
void
mpeg1_encode_motion
(
MpegEncContext
*
s
,
int
val
,
int
f_or_b_code
)
{
if
(
val
==
0
)
{
/* zero vector */
put_bits
(
&
s
->
pb
,
ff_mpeg12_mbMotionVectorTable
[
0
][
1
],
ff_mpeg12_mbMotionVectorTable
[
0
][
0
]);
}
else
{
int
code
,
sign
,
bits
;
int
bit_size
=
f_or_b_code
-
1
;
int
range
=
1
<<
bit_size
;
/* modulo encoding */
val
=
sign_extend
(
val
,
5
+
bit_size
);
if
(
val
>=
0
)
{
val
--
;
code
=
(
val
>>
bit_size
)
+
1
;
bits
=
val
&
(
range
-
1
);
sign
=
0
;
}
else
{
val
=
-
val
;
val
--
;
code
=
(
val
>>
bit_size
)
+
1
;
bits
=
val
&
(
range
-
1
);
sign
=
1
;
}
assert
(
code
>
0
&&
code
<=
16
);
put_bits
(
&
s
->
pb
,
ff_mpeg12_mbMotionVectorTable
[
code
][
1
],
ff_mpeg12_mbMotionVectorTable
[
code
][
0
]);
put_bits
(
&
s
->
pb
,
1
,
sign
);
if
(
bit_size
>
0
)
{
put_bits
(
&
s
->
pb
,
bit_size
,
bits
);
}
}
}
static
inline
void
encode_dc
(
MpegEncContext
*
s
,
int
diff
,
int
component
)
{
if
(((
unsigned
)
(
diff
+
255
))
>=
511
){
int
index
;
if
(
diff
<
0
){
index
=
av_log2_16bit
(
-
2
*
diff
);
diff
--
;
}
else
{
index
=
av_log2_16bit
(
2
*
diff
);
}
if
(
component
==
0
)
{
put_bits
(
&
s
->
pb
,
ff_mpeg12_vlc_dc_lum_bits
[
index
]
+
index
,
(
ff_mpeg12_vlc_dc_lum_code
[
index
]
<<
index
)
+
(
diff
&
((
1
<<
index
)
-
1
)));
}
else
{
put_bits
(
&
s
->
pb
,
ff_mpeg12_vlc_dc_chroma_bits
[
index
]
+
index
,
(
ff_mpeg12_vlc_dc_chroma_code
[
index
]
<<
index
)
+
(
diff
&
((
1
<<
index
)
-
1
)));
}
}
else
{
if
(
component
==
0
)
{
put_bits
(
&
s
->
pb
,
mpeg1_lum_dc_uni
[
diff
+
255
]
&
0xFF
,
mpeg1_lum_dc_uni
[
diff
+
255
]
>>
8
);
}
else
{
put_bits
(
&
s
->
pb
,
mpeg1_chr_dc_uni
[
diff
+
255
]
&
0xFF
,
mpeg1_chr_dc_uni
[
diff
+
255
]
>>
8
);
}
}
}
static
void
mpeg1_encode_block
(
MpegEncContext
*
s
,
int16_t
*
block
,
int
n
)
{
int
alevel
,
level
,
last_non_zero
,
dc
,
diff
,
i
,
j
,
run
,
last_index
,
sign
;
int
code
,
component
;
const
uint16_t
(
*
table_vlc
)[
2
]
=
ff_rl_mpeg1
.
table_vlc
;
last_index
=
s
->
block_last_index
[
n
];
/* DC coef */
if
(
s
->
mb_intra
)
{
component
=
(
n
<=
3
?
0
:
(
n
&
1
)
+
1
);
dc
=
block
[
0
];
/* overflow is impossible */
diff
=
dc
-
s
->
last_dc
[
component
];
encode_dc
(
s
,
diff
,
component
);
s
->
last_dc
[
component
]
=
dc
;
i
=
1
;
if
(
s
->
intra_vlc_format
)
table_vlc
=
ff_rl_mpeg2
.
table_vlc
;
}
else
{
/* encode the first coefficient : needs to be done here because
it is handled slightly differently */
level
=
block
[
0
];
if
(
abs
(
level
)
==
1
)
{
code
=
((
uint32_t
)
level
>>
31
);
/* the sign bit */
put_bits
(
&
s
->
pb
,
2
,
code
|
0x02
);
i
=
1
;
}
else
{
i
=
0
;
last_non_zero
=
-
1
;
goto
next_coef
;
}
}
/* now quantify & encode AC coefs */
last_non_zero
=
i
-
1
;
for
(;
i
<=
last_index
;
i
++
)
{
j
=
s
->
intra_scantable
.
permutated
[
i
];
level
=
block
[
j
];
next_coef
:
/* encode using VLC */
if
(
level
!=
0
)
{
run
=
i
-
last_non_zero
-
1
;
alevel
=
level
;
MASK_ABS
(
sign
,
alevel
);
sign
&=
1
;
if
(
alevel
<=
mpeg1_max_level
[
0
][
run
]){
code
=
mpeg1_index_run
[
0
][
run
]
+
alevel
-
1
;
/* store the vlc & sign at once */
put_bits
(
&
s
->
pb
,
table_vlc
[
code
][
1
]
+
1
,
(
table_vlc
[
code
][
0
]
<<
1
)
+
sign
);
}
else
{
/* escape seems to be pretty rare <5% so I do not optimize it */
put_bits
(
&
s
->
pb
,
table_vlc
[
111
][
1
],
table_vlc
[
111
][
0
]);
/* escape: only clip in this case */
put_bits
(
&
s
->
pb
,
6
,
run
);
if
(
s
->
codec_id
==
AV_CODEC_ID_MPEG1VIDEO
){
if
(
alevel
<
128
)
{
put_sbits
(
&
s
->
pb
,
8
,
level
);
}
else
{
if
(
level
<
0
)
{
put_bits
(
&
s
->
pb
,
16
,
0x8001
+
level
+
255
);
}
else
{
put_sbits
(
&
s
->
pb
,
16
,
level
);
}
}
}
else
{
put_sbits
(
&
s
->
pb
,
12
,
level
);
}
}
last_non_zero
=
i
;
}
}
/* end of block */
put_bits
(
&
s
->
pb
,
table_vlc
[
112
][
1
],
table_vlc
[
112
][
0
]);
}
static
av_always_inline
void
mpeg1_encode_mb_internal
(
MpegEncContext
*
s
,
int16_t
block
[
6
][
64
],
int
motion_x
,
int
motion_y
,
...
...
@@ -663,47 +816,6 @@ void ff_mpeg1_encode_mb(MpegEncContext *s, int16_t block[6][64], int motion_x, i
else
mpeg1_encode_mb_internal
(
s
,
block
,
motion_x
,
motion_y
,
8
);
}
// RAL: Parameter added: f_or_b_code
static
void
mpeg1_encode_motion
(
MpegEncContext
*
s
,
int
val
,
int
f_or_b_code
)
{
if
(
val
==
0
)
{
/* zero vector */
put_bits
(
&
s
->
pb
,
ff_mpeg12_mbMotionVectorTable
[
0
][
1
],
ff_mpeg12_mbMotionVectorTable
[
0
][
0
]);
}
else
{
int
code
,
sign
,
bits
;
int
bit_size
=
f_or_b_code
-
1
;
int
range
=
1
<<
bit_size
;
/* modulo encoding */
val
=
sign_extend
(
val
,
5
+
bit_size
);
if
(
val
>=
0
)
{
val
--
;
code
=
(
val
>>
bit_size
)
+
1
;
bits
=
val
&
(
range
-
1
);
sign
=
0
;
}
else
{
val
=
-
val
;
val
--
;
code
=
(
val
>>
bit_size
)
+
1
;
bits
=
val
&
(
range
-
1
);
sign
=
1
;
}
assert
(
code
>
0
&&
code
<=
16
);
put_bits
(
&
s
->
pb
,
ff_mpeg12_mbMotionVectorTable
[
code
][
1
],
ff_mpeg12_mbMotionVectorTable
[
code
][
0
]);
put_bits
(
&
s
->
pb
,
1
,
sign
);
if
(
bit_size
>
0
)
{
put_bits
(
&
s
->
pb
,
bit_size
,
bits
);
}
}
}
av_cold
void
ff_mpeg1_encode_init
(
MpegEncContext
*
s
)
{
static
int
done
=
0
;
...
...
@@ -802,123 +914,6 @@ av_cold void ff_mpeg1_encode_init(MpegEncContext *s)
s
->
inter_ac_vlc_last_length
=
uni_mpeg1_ac_vlc_len
;
}
static
inline
void
encode_dc
(
MpegEncContext
*
s
,
int
diff
,
int
component
)
{
if
(((
unsigned
)
(
diff
+
255
))
>=
511
){
int
index
;
if
(
diff
<
0
){
index
=
av_log2_16bit
(
-
2
*
diff
);
diff
--
;
}
else
{
index
=
av_log2_16bit
(
2
*
diff
);
}
if
(
component
==
0
)
{
put_bits
(
&
s
->
pb
,
ff_mpeg12_vlc_dc_lum_bits
[
index
]
+
index
,
(
ff_mpeg12_vlc_dc_lum_code
[
index
]
<<
index
)
+
(
diff
&
((
1
<<
index
)
-
1
)));
}
else
{
put_bits
(
&
s
->
pb
,
ff_mpeg12_vlc_dc_chroma_bits
[
index
]
+
index
,
(
ff_mpeg12_vlc_dc_chroma_code
[
index
]
<<
index
)
+
(
diff
&
((
1
<<
index
)
-
1
)));
}
}
else
{
if
(
component
==
0
)
{
put_bits
(
&
s
->
pb
,
mpeg1_lum_dc_uni
[
diff
+
255
]
&
0xFF
,
mpeg1_lum_dc_uni
[
diff
+
255
]
>>
8
);
}
else
{
put_bits
(
&
s
->
pb
,
mpeg1_chr_dc_uni
[
diff
+
255
]
&
0xFF
,
mpeg1_chr_dc_uni
[
diff
+
255
]
>>
8
);
}
}
}
static
void
mpeg1_encode_block
(
MpegEncContext
*
s
,
int16_t
*
block
,
int
n
)
{
int
alevel
,
level
,
last_non_zero
,
dc
,
diff
,
i
,
j
,
run
,
last_index
,
sign
;
int
code
,
component
;
const
uint16_t
(
*
table_vlc
)[
2
]
=
ff_rl_mpeg1
.
table_vlc
;
last_index
=
s
->
block_last_index
[
n
];
/* DC coef */
if
(
s
->
mb_intra
)
{
component
=
(
n
<=
3
?
0
:
(
n
&
1
)
+
1
);
dc
=
block
[
0
];
/* overflow is impossible */
diff
=
dc
-
s
->
last_dc
[
component
];
encode_dc
(
s
,
diff
,
component
);
s
->
last_dc
[
component
]
=
dc
;
i
=
1
;
if
(
s
->
intra_vlc_format
)
table_vlc
=
ff_rl_mpeg2
.
table_vlc
;
}
else
{
/* encode the first coefficient : needs to be done here because
it is handled slightly differently */
level
=
block
[
0
];
if
(
abs
(
level
)
==
1
)
{
code
=
((
uint32_t
)
level
>>
31
);
/* the sign bit */
put_bits
(
&
s
->
pb
,
2
,
code
|
0x02
);
i
=
1
;
}
else
{
i
=
0
;
last_non_zero
=
-
1
;
goto
next_coef
;
}
}
/* now quantify & encode AC coefs */
last_non_zero
=
i
-
1
;
for
(;
i
<=
last_index
;
i
++
)
{
j
=
s
->
intra_scantable
.
permutated
[
i
];
level
=
block
[
j
];
next_coef
:
/* encode using VLC */
if
(
level
!=
0
)
{
run
=
i
-
last_non_zero
-
1
;
alevel
=
level
;
MASK_ABS
(
sign
,
alevel
);
sign
&=
1
;
if
(
alevel
<=
mpeg1_max_level
[
0
][
run
]){
code
=
mpeg1_index_run
[
0
][
run
]
+
alevel
-
1
;
/* store the vlc & sign at once */
put_bits
(
&
s
->
pb
,
table_vlc
[
code
][
1
]
+
1
,
(
table_vlc
[
code
][
0
]
<<
1
)
+
sign
);
}
else
{
/* escape seems to be pretty rare <5% so I do not optimize it */
put_bits
(
&
s
->
pb
,
table_vlc
[
111
][
1
],
table_vlc
[
111
][
0
]);
/* escape: only clip in this case */
put_bits
(
&
s
->
pb
,
6
,
run
);
if
(
s
->
codec_id
==
AV_CODEC_ID_MPEG1VIDEO
){
if
(
alevel
<
128
)
{
put_sbits
(
&
s
->
pb
,
8
,
level
);
}
else
{
if
(
level
<
0
)
{
put_bits
(
&
s
->
pb
,
16
,
0x8001
+
level
+
255
);
}
else
{
put_sbits
(
&
s
->
pb
,
16
,
level
);
}
}
}
else
{
put_sbits
(
&
s
->
pb
,
12
,
level
);
}
}
last_non_zero
=
i
;
}
}
/* end of block */
put_bits
(
&
s
->
pb
,
table_vlc
[
112
][
1
],
table_vlc
[
112
][
0
]);
}
#define OFFSET(x) offsetof(MpegEncContext, x)
#define VE AV_OPT_FLAG_ENCODING_PARAM | AV_OPT_FLAG_VIDEO_PARAM
#define COMMON_OPTS\
...
...
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