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
7f93a861
Commit
7f93a861
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: K&R formatting cosmetics
Signed-off-by:
Diego Biurrun
<
diego@biurrun.de
>
parent
66f09105
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
529 additions
and
455 deletions
+529
-455
mpeg12enc.c
libavcodec/mpeg12enc.c
+529
-455
No files found.
libavcodec/mpeg12enc.c
View file @
7f93a861
...
...
@@ -25,99 +25,98 @@
* MPEG1/2 encoder
*/
#include "libavutil/attributes.h"
#include "libavutil/log.h"
#include "libavutil/opt.h"
#include "avcodec.h"
#include "bytestream.h"
#include "mathops.h"
#include "mpegvideo.h"
#include "mpeg12.h"
#include "mpeg12data.h"
#include "
bytestream
.h"
#include "
mpegvideo
.h"
#include "libavutil/attributes.h"
#include "libavutil/log.h"
#include "libavutil/opt.h"
static
const
uint8_t
inv_non_linear_qscale
[
13
]
=
{
0
,
2
,
4
,
6
,
8
,
9
,
10
,
11
,
12
,
13
,
14
,
15
,
16
,
static
const
uint8_t
inv_non_linear_qscale
[]
=
{
0
,
2
,
4
,
6
,
8
,
9
,
10
,
11
,
12
,
13
,
14
,
15
,
16
,
};
static
const
uint8_t
svcd_scan_offset_placeholder
[
14
]
=
{
0x10
,
0x0E
,
0x00
,
0x80
,
0x81
,
0x00
,
0x80
,
0x81
,
0xff
,
0xff
,
0xff
,
0xff
,
0xff
,
0xff
,
static
const
uint8_t
svcd_scan_offset_placeholder
[]
=
{
0x10
,
0x0E
,
0x00
,
0x80
,
0x81
,
0x00
,
0x80
,
0x81
,
0xff
,
0xff
,
0xff
,
0xff
,
0xff
,
0xff
,
};
static
uint8_t
mv_penalty
[
MAX_FCODE
+
1
][
MAX_MV
*
2
+
1
];
static
uint8_t
fcode_tab
[
MAX_MV
*
2
+
1
];
static
uint8_t
mv_penalty
[
MAX_FCODE
+
1
][
MAX_MV
*
2
+
1
];
static
uint8_t
fcode_tab
[
MAX_MV
*
2
+
1
];
static
uint8_t
uni_mpeg1_ac_vlc_len
[
64
*
64
*
2
];
static
uint8_t
uni_mpeg2_ac_vlc_len
[
64
*
64
*
2
];
static
uint8_t
uni_mpeg1_ac_vlc_len
[
64
*
64
*
2
];
static
uint8_t
uni_mpeg2_ac_vlc_len
[
64
*
64
*
2
];
/* simple include everything table for dc, first byte is bits number next 3 are code*/
/* simple include everything table for dc, first byte is bits
* number next 3 are code */
static
uint32_t
mpeg1_lum_dc_uni
[
512
];
static
uint32_t
mpeg1_chr_dc_uni
[
512
];
static
uint8_t
mpeg1_index_run
[
2
][
64
];
static
int8_t
mpeg1_max_level
[
2
][
64
];
static
int8_t
mpeg1_max_level
[
2
][
64
];
static
av_cold
void
init_uni_ac_vlc
(
RLTable
*
rl
,
uint8_t
*
uni_ac_vlc_len
)
{
int
i
;
for
(
i
=
0
;
i
<
128
;
i
++
)
{
int
level
=
i
-
64
;
for
(
i
=
0
;
i
<
128
;
i
++
)
{
int
level
=
i
-
64
;
int
run
;
if
(
!
level
)
continue
;
for
(
run
=
0
;
run
<
64
;
run
++
)
{
for
(
run
=
0
;
run
<
64
;
run
++
)
{
int
len
,
code
;
int
alevel
=
FFABS
(
level
);
int
alevel
=
FFABS
(
level
);
if
(
alevel
>
rl
->
max_level
[
0
][
run
])
code
=
111
;
/*rl->n
*/
code
=
111
;
/* rl->n
*/
else
code
=
rl
->
index_run
[
0
][
run
]
+
alevel
-
1
;
code
=
rl
->
index_run
[
0
][
run
]
+
alevel
-
1
;
if
(
code
<
111
/* rl->n */
)
{
/* length of
vlc
and sign */
len
=
rl
->
table_vlc
[
code
][
1
]
+
1
;
if
(
code
<
111
)
{
/* rl->n */
/* length of
VLC
and sign */
len
=
rl
->
table_vlc
[
code
][
1
]
+
1
;
}
else
{
len
=
rl
->
table_vlc
[
111
/*rl->n*/
][
1
]
+
6
;
len
=
rl
->
table_vlc
[
111
][
1
]
+
6
;
/* rl->n */
if
(
alevel
<
128
)
{
if
(
alevel
<
128
)
len
+=
8
;
}
else
{
else
len
+=
16
;
}
}
uni_ac_vlc_len
[
UNI_AC_ENC_INDEX
(
run
,
i
)]
=
len
;
uni_ac_vlc_len
[
UNI_AC_ENC_INDEX
(
run
,
i
)]
=
len
;
}
}
}
static
int
find_frame_rate_index
(
MpegEncContext
*
s
)
{
static
int
find_frame_rate_index
(
MpegEncContext
*
s
)
{
int
i
;
int64_t
dmin
=
INT64_MAX
;
int64_t
dmin
=
INT64_MAX
;
int64_t
d
;
for
(
i
=
1
;
i
<
14
;
i
++
)
{
int64_t
n0
=
1001LL
/
ff_mpeg12_frame_rate_tab
[
i
].
den
*
ff_mpeg12_frame_rate_tab
[
i
].
num
*
s
->
avctx
->
time_base
.
num
;
int64_t
n1
=
1001LL
*
s
->
avctx
->
time_base
.
den
;
if
(
s
->
avctx
->
strict_std_compliance
>
FF_COMPLIANCE_UNOFFICIAL
&&
i
>=
9
)
break
;
for
(
i
=
1
;
i
<
14
;
i
++
)
{
int64_t
n0
=
1001LL
/
ff_mpeg12_frame_rate_tab
[
i
].
den
*
ff_mpeg12_frame_rate_tab
[
i
].
num
*
s
->
avctx
->
time_base
.
num
;
int64_t
n1
=
1001LL
*
s
->
avctx
->
time_base
.
den
;
if
(
s
->
avctx
->
strict_std_compliance
>
FF_COMPLIANCE_UNOFFICIAL
&&
i
>=
9
)
break
;
d
=
FFABS
(
n0
-
n1
);
if
(
d
<
dmin
)
{
dmin
=
d
;
s
->
frame_rate_index
=
i
;
if
(
d
<
dmin
)
{
dmin
=
d
;
s
->
frame_rate_index
=
i
;
}
}
if
(
dmin
)
if
(
dmin
)
return
-
1
;
else
return
0
;
...
...
@@ -127,43 +126,54 @@ static av_cold int encode_init(AVCodecContext *avctx)
{
MpegEncContext
*
s
=
avctx
->
priv_data
;
if
(
ff_MPV_encode_init
(
avctx
)
<
0
)
if
(
ff_MPV_encode_init
(
avctx
)
<
0
)
return
-
1
;
if
(
find_frame_rate_index
(
s
)
<
0
){
if
(
s
->
strict_std_compliance
>
FF_COMPLIANCE_EXPERIMENTAL
){
av_log
(
avctx
,
AV_LOG_ERROR
,
"MPEG1/2 does not support %d/%d fps
\n
"
,
avctx
->
time_base
.
den
,
avctx
->
time_base
.
num
);
if
(
find_frame_rate_index
(
s
)
<
0
)
{
if
(
s
->
strict_std_compliance
>
FF_COMPLIANCE_EXPERIMENTAL
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"MPEG1/2 does not support %d/%d fps
\n
"
,
avctx
->
time_base
.
den
,
avctx
->
time_base
.
num
);
return
-
1
;
}
else
{
av_log
(
avctx
,
AV_LOG_INFO
,
"MPEG1/2 does not support %d/%d fps, there may be AV sync issues
\n
"
,
avctx
->
time_base
.
den
,
avctx
->
time_base
.
num
);
}
else
{
av_log
(
avctx
,
AV_LOG_INFO
,
"MPEG1/2 does not support %d/%d fps, there may be AV sync issues
\n
"
,
avctx
->
time_base
.
den
,
avctx
->
time_base
.
num
);
}
}
if
(
avctx
->
profile
==
FF_PROFILE_UNKNOWN
)
{
if
(
avctx
->
level
!=
FF_LEVEL_UNKNOWN
)
{
if
(
avctx
->
profile
==
FF_PROFILE_UNKNOWN
)
{
if
(
avctx
->
level
!=
FF_LEVEL_UNKNOWN
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"Set profile and level
\n
"
);
return
-
1
;
}
avctx
->
profile
=
s
->
chroma_format
==
CHROMA_420
?
4
:
0
;
/* Main or 4:2:2 */
/* Main or 4:2:2 */
avctx
->
profile
=
s
->
chroma_format
==
CHROMA_420
?
4
:
0
;
}
if
(
avctx
->
level
==
FF_LEVEL_UNKNOWN
){
if
(
avctx
->
profile
==
0
){
/* 4:2:2 */
if
(
avctx
->
width
<=
720
&&
avctx
->
height
<=
608
)
avctx
->
level
=
5
;
/* Main */
else
avctx
->
level
=
2
;
/* High */
}
else
{
if
(
avctx
->
profile
!=
1
&&
s
->
chroma_format
!=
CHROMA_420
){
av_log
(
avctx
,
AV_LOG_ERROR
,
"Only High(1) and 4:2:2(0) profiles support 4:2:2 color sampling
\n
"
);
if
(
avctx
->
level
==
FF_LEVEL_UNKNOWN
)
{
if
(
avctx
->
profile
==
0
)
{
/* 4:2:2 */
if
(
avctx
->
width
<=
720
&&
avctx
->
height
<=
608
)
avctx
->
level
=
5
;
/* Main */
else
avctx
->
level
=
2
;
/* High */
}
else
{
if
(
avctx
->
profile
!=
1
&&
s
->
chroma_format
!=
CHROMA_420
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"Only High(1) and 4:2:2(0) profiles support 4:2:2 color sampling
\n
"
);
return
-
1
;
}
if
(
avctx
->
width
<=
720
&&
avctx
->
height
<=
576
)
avctx
->
level
=
8
;
/* Main */
else
if
(
avctx
->
width
<=
1440
)
avctx
->
level
=
6
;
/* High 1440 */
else
avctx
->
level
=
4
;
/* High */
if
(
avctx
->
width
<=
720
&&
avctx
->
height
<=
576
)
avctx
->
level
=
8
;
/* Main */
else
if
(
avctx
->
width
<=
1440
)
avctx
->
level
=
6
;
/* High 1440 */
else
avctx
->
level
=
4
;
/* High */
}
}
if
(
s
->
drop_frame_timecode
&&
s
->
frame_rate_index
!=
4
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"Drop frame time code only allowed with 1001/30000 fps
\n
"
);
av_log
(
avctx
,
AV_LOG_ERROR
,
"Drop frame time code only allowed with 1001/30000 fps
\n
"
);
return
-
1
;
}
...
...
@@ -173,131 +183,137 @@ static av_cold int encode_init(AVCodecContext *avctx)
static
void
put_header
(
MpegEncContext
*
s
,
int
header
)
{
avpriv_align_put_bits
(
&
s
->
pb
);
put_bits
(
&
s
->
pb
,
16
,
header
>>
16
);
put_bits
(
&
s
->
pb
,
16
,
header
>>
16
);
put_sbits
(
&
s
->
pb
,
16
,
header
);
}
/* put sequence header if needed */
static
void
mpeg1_encode_sequence_header
(
MpegEncContext
*
s
)
{
unsigned
int
vbv_buffer_size
;
unsigned
int
fps
,
v
;
int
i
;
uint64_t
time_code
;
float
best_aspect_error
=
1E10
;
float
aspect_ratio
=
av_q2d
(
s
->
avctx
->
sample_aspect_ratio
);
int
constraint_parameter_flag
;
unsigned
int
vbv_buffer_size
,
fps
,
v
;
int
i
,
constraint_parameter_flag
;
uint64_t
time_code
;
float
best_aspect_error
=
1E10
;
float
aspect_ratio
=
av_q2d
(
s
->
avctx
->
sample_aspect_ratio
);
if
(
aspect_ratio
==
0
.
0
)
aspect_ratio
=
1
.
0
;
//pixel aspect 1:1 (VGA)
if
(
aspect_ratio
==
0
.
0
)
aspect_ratio
=
1
.
0
;
// pixel aspect 1.1 (VGA)
if
(
s
->
current_picture
.
f
.
key_frame
)
{
AVRational
framerate
=
ff_mpeg12_frame_rate_tab
[
s
->
frame_rate_index
];
if
(
s
->
current_picture
.
f
.
key_frame
)
{
AVRational
framerate
=
ff_mpeg12_frame_rate_tab
[
s
->
frame_rate_index
];
/* mpeg1 header repeated every gop */
put_header
(
s
,
SEQ_START_CODE
);
/* mpeg1 header repeated every gop */
put_header
(
s
,
SEQ_START_CODE
);
put_sbits
(
&
s
->
pb
,
12
,
s
->
width
);
put_sbits
(
&
s
->
pb
,
12
,
s
->
height
);
put_sbits
(
&
s
->
pb
,
12
,
s
->
width
);
put_sbits
(
&
s
->
pb
,
12
,
s
->
height
);
for
(
i
=
1
;
i
<
15
;
i
++
)
{
float
error
=
aspect_ratio
;
if
(
s
->
codec_id
==
AV_CODEC_ID_MPEG1VIDEO
||
i
<=
1
)
error
-=
1
.
0
/
ff_mpeg1_aspect
[
i
];
else
error
-=
av_q2d
(
ff_mpeg2_aspect
[
i
])
*
s
->
height
/
s
->
width
;
for
(
i
=
1
;
i
<
15
;
i
++
)
{
float
error
=
aspect_ratio
;
if
(
s
->
codec_id
==
AV_CODEC_ID_MPEG1VIDEO
||
i
<=
1
)
error
-=
1
.
0
/
ff_mpeg1_aspect
[
i
];
else
error
-=
av_q2d
(
ff_mpeg2_aspect
[
i
])
*
s
->
height
/
s
->
width
;
error
=
FFABS
(
error
);
error
=
FFABS
(
error
);
if
(
error
<
best_aspect_error
){
best_aspect_error
=
error
;
s
->
aspect_ratio_info
=
i
;
}
if
(
error
<
best_aspect_error
)
{
best_aspect_error
=
error
;
s
->
aspect_ratio_info
=
i
;
}
}
put_bits
(
&
s
->
pb
,
4
,
s
->
aspect_ratio_info
);
put_bits
(
&
s
->
pb
,
4
,
s
->
frame_rate_index
);
put_bits
(
&
s
->
pb
,
4
,
s
->
aspect_ratio_info
);
put_bits
(
&
s
->
pb
,
4
,
s
->
frame_rate_index
);
if
(
s
->
avctx
->
rc_max_rate
)
{
v
=
(
s
->
avctx
->
rc_max_rate
+
399
)
/
400
;
if
(
v
>
0x3ffff
&&
s
->
codec_id
==
AV_CODEC_ID_MPEG1VIDEO
)
v
=
0x3ffff
;
}
else
{
v
=
0x3FFFF
;
}
if
(
s
->
avctx
->
rc_max_rate
)
{
v
=
(
s
->
avctx
->
rc_max_rate
+
399
)
/
400
;
if
(
v
>
0x3ffff
&&
s
->
codec_id
==
AV_CODEC_ID_MPEG1VIDEO
)
v
=
0x3ffff
;
}
else
{
v
=
0x3FFFF
;
}
if
(
s
->
avctx
->
rc_buffer_size
)
vbv_buffer_size
=
s
->
avctx
->
rc_buffer_size
;
else
/* VBV calculation: Scaled so that a VCD has the proper VBV size of 40 kilobytes */
vbv_buffer_size
=
((
20
*
s
->
bit_rate
)
/
(
1151929
/
2
))
*
8
*
1024
;
vbv_buffer_size
=
(
vbv_buffer_size
+
16383
)
/
16384
;
put_sbits
(
&
s
->
pb
,
18
,
v
);
put_bits
(
&
s
->
pb
,
1
,
1
);
/* marker */
put_sbits
(
&
s
->
pb
,
10
,
vbv_buffer_size
);
constraint_parameter_flag
=
s
->
width
<=
768
&&
s
->
height
<=
576
&&
s
->
mb_width
*
s
->
mb_height
<=
396
&&
s
->
mb_width
*
s
->
mb_height
*
framerate
.
num
<=
framerate
.
den
*
396
*
25
&&
framerate
.
num
<=
framerate
.
den
*
30
&&
s
->
avctx
->
me_range
&&
s
->
avctx
->
me_range
<
128
&&
vbv_buffer_size
<=
20
&&
v
<=
1856000
/
400
&&
s
->
codec_id
==
AV_CODEC_ID_MPEG1VIDEO
;
put_bits
(
&
s
->
pb
,
1
,
constraint_parameter_flag
);
ff_write_quant_matrix
(
&
s
->
pb
,
s
->
avctx
->
intra_matrix
);
ff_write_quant_matrix
(
&
s
->
pb
,
s
->
avctx
->
inter_matrix
);
if
(
s
->
codec_id
==
AV_CODEC_ID_MPEG2VIDEO
){
put_header
(
s
,
EXT_START_CODE
);
put_bits
(
&
s
->
pb
,
4
,
1
);
//seq ext
put_bits
(
&
s
->
pb
,
1
,
s
->
avctx
->
profile
==
0
);
//escx 1 for 4:2:2 profile */
put_bits
(
&
s
->
pb
,
3
,
s
->
avctx
->
profile
);
//profile
put_bits
(
&
s
->
pb
,
4
,
s
->
avctx
->
level
);
//level
put_bits
(
&
s
->
pb
,
1
,
s
->
progressive_sequence
);
put_bits
(
&
s
->
pb
,
2
,
s
->
chroma_format
);
put_bits
(
&
s
->
pb
,
2
,
s
->
width
>>
12
);
put_bits
(
&
s
->
pb
,
2
,
s
->
height
>>
12
);
put_bits
(
&
s
->
pb
,
12
,
v
>>
18
);
//bitrate ext
put_bits
(
&
s
->
pb
,
1
,
1
);
//marker
put_bits
(
&
s
->
pb
,
8
,
vbv_buffer_size
>>
10
);
//vbv buffer ext
put_bits
(
&
s
->
pb
,
1
,
s
->
low_delay
);
put_bits
(
&
s
->
pb
,
2
,
0
);
// frame_rate_ext_n
put_bits
(
&
s
->
pb
,
5
,
0
);
// frame_rate_ext_d
}
if
(
s
->
avctx
->
rc_buffer_size
)
vbv_buffer_size
=
s
->
avctx
->
rc_buffer_size
;
else
/* VBV calculation: Scaled so that a VCD has the proper
* VBV size of 40 kilobytes */
vbv_buffer_size
=
((
20
*
s
->
bit_rate
)
/
(
1151929
/
2
))
*
8
*
1024
;
vbv_buffer_size
=
(
vbv_buffer_size
+
16383
)
/
16384
;
put_sbits
(
&
s
->
pb
,
18
,
v
);
put_bits
(
&
s
->
pb
,
1
,
1
);
// marker
put_sbits
(
&
s
->
pb
,
10
,
vbv_buffer_size
);
constraint_parameter_flag
=
s
->
width
<=
768
&&
s
->
height
<=
576
&&
s
->
mb_width
*
s
->
mb_height
<=
396
&&
s
->
mb_width
*
s
->
mb_height
*
framerate
.
num
<=
396
*
25
*
framerate
.
den
&&
framerate
.
num
<=
framerate
.
den
*
30
&&
s
->
avctx
->
me_range
&&
s
->
avctx
->
me_range
<
128
&&
vbv_buffer_size
<=
20
&&
v
<=
1856000
/
400
&&
s
->
codec_id
==
AV_CODEC_ID_MPEG1VIDEO
;
put_bits
(
&
s
->
pb
,
1
,
constraint_parameter_flag
);
ff_write_quant_matrix
(
&
s
->
pb
,
s
->
avctx
->
intra_matrix
);
ff_write_quant_matrix
(
&
s
->
pb
,
s
->
avctx
->
inter_matrix
);
if
(
s
->
codec_id
==
AV_CODEC_ID_MPEG2VIDEO
)
{
put_header
(
s
,
EXT_START_CODE
);
put_bits
(
&
s
->
pb
,
4
,
1
);
// seq ext
put_bits
(
&
s
->
pb
,
1
,
s
->
avctx
->
profile
==
0
);
// escx 1 for 4:2:2 profile
put_bits
(
&
s
->
pb
,
3
,
s
->
avctx
->
profile
);
// profile
put_bits
(
&
s
->
pb
,
4
,
s
->
avctx
->
level
);
// level
put_bits
(
&
s
->
pb
,
1
,
s
->
progressive_sequence
);
put_bits
(
&
s
->
pb
,
2
,
s
->
chroma_format
);
put_bits
(
&
s
->
pb
,
2
,
s
->
width
>>
12
);
put_bits
(
&
s
->
pb
,
2
,
s
->
height
>>
12
);
put_bits
(
&
s
->
pb
,
12
,
v
>>
18
);
// bitrate ext
put_bits
(
&
s
->
pb
,
1
,
1
);
// marker
put_bits
(
&
s
->
pb
,
8
,
vbv_buffer_size
>>
10
);
// vbv buffer ext
put_bits
(
&
s
->
pb
,
1
,
s
->
low_delay
);
put_bits
(
&
s
->
pb
,
2
,
0
);
// frame_rate_ext_n
put_bits
(
&
s
->
pb
,
5
,
0
);
// frame_rate_ext_d
}
put_header
(
s
,
GOP_START_CODE
);
put_bits
(
&
s
->
pb
,
1
,
s
->
drop_frame_timecode
);
/* drop frame flag */
/* time code : we must convert from the real frame rate to a
fake mpeg frame rate in case of low frame rate */
fps
=
(
framerate
.
num
+
framerate
.
den
/
2
)
/
framerate
.
den
;
time_code
=
s
->
current_picture_ptr
->
f
.
coded_picture_number
+
s
->
avctx
->
timecode_frame_start
;
s
->
gop_picture_number
=
s
->
current_picture_ptr
->
f
.
coded_picture_number
;
if
(
s
->
drop_frame_timecode
)
{
/* only works for NTSC 29.97 */
int
d
=
time_code
/
17982
;
int
m
=
time_code
%
17982
;
//if (m < 2) m += 2; /* not needed since -2,-1 / 1798 in C returns 0 */
time_code
+=
18
*
d
+
2
*
((
m
-
2
)
/
1798
);
}
put_bits
(
&
s
->
pb
,
5
,
(
uint32_t
)((
time_code
/
(
fps
*
3600
))
%
24
));
put_bits
(
&
s
->
pb
,
6
,
(
uint32_t
)((
time_code
/
(
fps
*
60
))
%
60
));
put_bits
(
&
s
->
pb
,
1
,
1
);
put_bits
(
&
s
->
pb
,
6
,
(
uint32_t
)((
time_code
/
fps
)
%
60
));
put_bits
(
&
s
->
pb
,
6
,
(
uint32_t
)((
time_code
%
fps
)));
put_bits
(
&
s
->
pb
,
1
,
!!
(
s
->
flags
&
CODEC_FLAG_CLOSED_GOP
));
put_bits
(
&
s
->
pb
,
1
,
0
);
/* broken link */
put_header
(
s
,
GOP_START_CODE
);
put_bits
(
&
s
->
pb
,
1
,
s
->
drop_frame_timecode
);
// drop frame flag
/* time code: we must convert from the real frame rate to a
* fake MPEG frame rate in case of low frame rate */
fps
=
(
framerate
.
num
+
framerate
.
den
/
2
)
/
framerate
.
den
;
time_code
=
s
->
current_picture_ptr
->
f
.
coded_picture_number
+
s
->
avctx
->
timecode_frame_start
;
s
->
gop_picture_number
=
s
->
current_picture_ptr
->
f
.
coded_picture_number
;
if
(
s
->
drop_frame_timecode
)
{
/* only works for NTSC 29.97 */
int
d
=
time_code
/
17982
;
int
m
=
time_code
%
17982
;
/* not needed since -2,-1 / 1798 in C returns 0 */
// if (m < 2)
// m += 2;
time_code
+=
18
*
d
+
2
*
((
m
-
2
)
/
1798
);
}
put_bits
(
&
s
->
pb
,
5
,
(
uint32_t
)((
time_code
/
(
fps
*
3600
))
%
24
));
put_bits
(
&
s
->
pb
,
6
,
(
uint32_t
)((
time_code
/
(
fps
*
60
))
%
60
));
put_bits
(
&
s
->
pb
,
1
,
1
);
put_bits
(
&
s
->
pb
,
6
,
(
uint32_t
)((
time_code
/
fps
)
%
60
));
put_bits
(
&
s
->
pb
,
6
,
(
uint32_t
)((
time_code
%
fps
)));
put_bits
(
&
s
->
pb
,
1
,
!!
(
s
->
flags
&
CODEC_FLAG_CLOSED_GOP
));
put_bits
(
&
s
->
pb
,
1
,
0
);
// broken link
}
}
static
inline
void
encode_mb_skip_run
(
MpegEncContext
*
s
,
int
run
){
static
inline
void
encode_mb_skip_run
(
MpegEncContext
*
s
,
int
run
)
{
while
(
run
>=
33
)
{
put_bits
(
&
s
->
pb
,
11
,
0x008
);
run
-=
33
;
...
...
@@ -308,23 +324,26 @@ static inline void encode_mb_skip_run(MpegEncContext *s, int run){
static
av_always_inline
void
put_qscale
(
MpegEncContext
*
s
)
{
if
(
s
->
q_scale_type
)
{
assert
(
s
->
qscale
>=
1
&&
s
->
qscale
<=
12
);
if
(
s
->
q_scale_type
)
{
assert
(
s
->
qscale
>=
1
&&
s
->
qscale
<=
12
);
put_bits
(
&
s
->
pb
,
5
,
inv_non_linear_qscale
[
s
->
qscale
]);
}
else
{
}
else
{
put_bits
(
&
s
->
pb
,
5
,
s
->
qscale
);
}
}
void
ff_mpeg1_encode_slice_header
(
MpegEncContext
*
s
){
void
ff_mpeg1_encode_slice_header
(
MpegEncContext
*
s
)
{
if
(
s
->
height
>
2800
)
{
put_header
(
s
,
SLICE_MIN_START_CODE
+
(
s
->
mb_y
&
127
));
put_bits
(
&
s
->
pb
,
3
,
s
->
mb_y
>>
7
);
/* slice_vertical_position_extension */
/* slice_vertical_position_extension */
put_bits
(
&
s
->
pb
,
3
,
s
->
mb_y
>>
7
);
}
else
{
put_header
(
s
,
SLICE_MIN_START_CODE
+
s
->
mb_y
);
}
put_qscale
(
s
);
put_bits
(
&
s
->
pb
,
1
,
0
);
/* slice extra information */
/* slice extra information */
put_bits
(
&
s
->
pb
,
1
,
0
);
}
void
ff_mpeg1_encode_picture_header
(
MpegEncContext
*
s
,
int
picture_number
)
...
...
@@ -336,60 +355,60 @@ void ff_mpeg1_encode_picture_header(MpegEncContext *s, int picture_number)
/* temporal reference */
// RAL: s->picture_number instead of s->fake_picture_number
put_bits
(
&
s
->
pb
,
10
,
(
s
->
picture_number
-
s
->
gop_picture_number
)
&
0x3ff
);
put_bits
(
&
s
->
pb
,
10
,
(
s
->
picture_number
-
s
->
gop_picture_number
)
&
0x3ff
);
put_bits
(
&
s
->
pb
,
3
,
s
->
pict_type
);
s
->
vbv_delay_ptr
=
s
->
pb
.
buf
+
put_bits_count
(
&
s
->
pb
)
/
8
;
put_bits
(
&
s
->
pb
,
16
,
0xFFFF
);
/* vbv_delay */
s
->
vbv_delay_ptr
=
s
->
pb
.
buf
+
put_bits_count
(
&
s
->
pb
)
/
8
;
put_bits
(
&
s
->
pb
,
16
,
0xFFFF
);
/* vbv_delay */
// RAL: Forward f_code also needed for B frames
if
(
s
->
pict_type
==
AV_PICTURE_TYPE_P
||
s
->
pict_type
==
AV_PICTURE_TYPE_B
)
{
put_bits
(
&
s
->
pb
,
1
,
0
);
/* half pel coordinates */
if
(
s
->
codec_id
==
AV_CODEC_ID_MPEG1VIDEO
)
put_bits
(
&
s
->
pb
,
3
,
s
->
f_code
);
/* forward_f_code */
// RAL: Forward f_code also needed for B-frames
if
(
s
->
pict_type
==
AV_PICTURE_TYPE_P
||
s
->
pict_type
==
AV_PICTURE_TYPE_B
)
{
put_bits
(
&
s
->
pb
,
1
,
0
);
/* half pel coordinates */
if
(
s
->
codec_id
==
AV_CODEC_ID_MPEG1VIDEO
)
put_bits
(
&
s
->
pb
,
3
,
s
->
f_code
);
/* forward_f_code */
else
put_bits
(
&
s
->
pb
,
3
,
7
);
/* forward_f_code */
put_bits
(
&
s
->
pb
,
3
,
7
);
/* forward_f_code */
}
// RAL: Backward f_code necessary for B
frames
// RAL: Backward f_code necessary for B
-
frames
if
(
s
->
pict_type
==
AV_PICTURE_TYPE_B
)
{
put_bits
(
&
s
->
pb
,
1
,
0
);
/* half pel coordinates */
if
(
s
->
codec_id
==
AV_CODEC_ID_MPEG1VIDEO
)
put_bits
(
&
s
->
pb
,
3
,
s
->
b_code
);
/* backward_f_code */
put_bits
(
&
s
->
pb
,
1
,
0
);
/* half pel coordinates */
if
(
s
->
codec_id
==
AV_CODEC_ID_MPEG1VIDEO
)
put_bits
(
&
s
->
pb
,
3
,
s
->
b_code
);
/* backward_f_code */
else
put_bits
(
&
s
->
pb
,
3
,
7
);
/* backward_f_code */
put_bits
(
&
s
->
pb
,
3
,
7
);
/* backward_f_code */
}
put_bits
(
&
s
->
pb
,
1
,
0
);
/* extra bit picture */
put_bits
(
&
s
->
pb
,
1
,
0
);
/* extra bit picture */
s
->
frame_pred_frame_dct
=
1
;
if
(
s
->
codec_id
==
AV_CODEC_ID_MPEG2VIDEO
)
{
if
(
s
->
codec_id
==
AV_CODEC_ID_MPEG2VIDEO
)
{
put_header
(
s
,
EXT_START_CODE
);
put_bits
(
&
s
->
pb
,
4
,
8
);
//pic ext
if
(
s
->
pict_type
==
AV_PICTURE_TYPE_P
||
s
->
pict_type
==
AV_PICTURE_TYPE_B
)
{
put_bits
(
&
s
->
pb
,
4
,
8
);
/* pic ext */
if
(
s
->
pict_type
==
AV_PICTURE_TYPE_P
||
s
->
pict_type
==
AV_PICTURE_TYPE_B
)
{
put_bits
(
&
s
->
pb
,
4
,
s
->
f_code
);
put_bits
(
&
s
->
pb
,
4
,
s
->
f_code
);
}
else
{
}
else
{
put_bits
(
&
s
->
pb
,
8
,
255
);
}
if
(
s
->
pict_type
==
AV_PICTURE_TYPE_B
)
{
put_bits
(
&
s
->
pb
,
4
,
s
->
b_code
);
put_bits
(
&
s
->
pb
,
4
,
s
->
b_code
);
}
else
{
}
else
{
put_bits
(
&
s
->
pb
,
8
,
255
);
}
put_bits
(
&
s
->
pb
,
2
,
s
->
intra_dc_precision
);
assert
(
s
->
picture_structure
==
PICT_FRAME
);
put_bits
(
&
s
->
pb
,
2
,
s
->
picture_structure
);
if
(
s
->
progressive_sequence
)
{
put_bits
(
&
s
->
pb
,
1
,
0
);
/* no repeat */
}
else
{
if
(
s
->
progressive_sequence
)
put_bits
(
&
s
->
pb
,
1
,
0
);
/* no repeat */
else
put_bits
(
&
s
->
pb
,
1
,
s
->
current_picture_ptr
->
f
.
top_field_first
);
}
/* XXX: optimize the generation of this flag with entropy
measures */
/* XXX: optimize the generation of this flag with entropy measures */
s
->
frame_pred_frame_dct
=
s
->
progressive_sequence
;
put_bits
(
&
s
->
pb
,
1
,
s
->
frame_pred_frame_dct
);
...
...
@@ -399,20 +418,21 @@ void ff_mpeg1_encode_picture_header(MpegEncContext *s, int picture_number)
put_bits
(
&
s
->
pb
,
1
,
s
->
alternate_scan
);
put_bits
(
&
s
->
pb
,
1
,
s
->
repeat_first_field
);
s
->
progressive_frame
=
s
->
progressive_sequence
;
put_bits
(
&
s
->
pb
,
1
,
s
->
chroma_format
==
CHROMA_420
?
s
->
progressive_frame
:
0
);
/* chroma_420_type */
/* chroma_420_type */
put_bits
(
&
s
->
pb
,
1
,
s
->
chroma_format
==
CHROMA_420
?
s
->
progressive_frame
:
0
);
put_bits
(
&
s
->
pb
,
1
,
s
->
progressive_frame
);
put_bits
(
&
s
->
pb
,
1
,
0
);
//composite_display_flag
put_bits
(
&
s
->
pb
,
1
,
0
);
/* composite_display_flag */
}
if
(
s
->
scan_offset
)
{
int
i
;
put_header
(
s
,
USER_START_CODE
);
for
(
i
=
0
;
i
<
sizeof
(
svcd_scan_offset_placeholder
);
i
++
){
for
(
i
=
0
;
i
<
sizeof
(
svcd_scan_offset_placeholder
);
i
++
)
put_bits
(
&
s
->
pb
,
8
,
svcd_scan_offset_placeholder
[
i
]);
}
}
s
->
mb_y
=
0
;
s
->
mb_y
=
0
;
ff_mpeg1_encode_slice_header
(
s
);
}
...
...
@@ -422,7 +442,8 @@ static inline void put_mb_modes(MpegEncContext *s, int n, int bits,
put_bits
(
&
s
->
pb
,
n
,
bits
);
if
(
!
s
->
frame_pred_frame_dct
)
{
if
(
has_mv
)
put_bits
(
&
s
->
pb
,
2
,
2
-
field_motion
);
/* motion_type: frame/field */
/* motion_type: frame/field */
put_bits
(
&
s
->
pb
,
2
,
2
-
field_motion
);
put_bits
(
&
s
->
pb
,
1
,
s
->
interlaced_dct
);
}
}
...
...
@@ -438,7 +459,7 @@ static void mpeg1_encode_motion(MpegEncContext *s, int val, int f_or_b_code)
}
else
{
int
code
,
sign
,
bits
;
int
bit_size
=
f_or_b_code
-
1
;
int
range
=
1
<<
bit_size
;
int
range
=
1
<<
bit_size
;
/* modulo encoding */
val
=
sign_extend
(
val
,
5
+
bit_size
);
...
...
@@ -462,52 +483,45 @@ static void mpeg1_encode_motion(MpegEncContext *s, int val, int f_or_b_code)
ff_mpeg12_mbMotionVectorTable
[
code
][
0
]);
put_bits
(
&
s
->
pb
,
1
,
sign
);
if
(
bit_size
>
0
)
{
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
)
{
if
(((
unsigned
)
(
diff
+
255
))
>=
511
)
{
int
index
;
if
(
diff
<
0
)
{
index
=
av_log2_16bit
(
-
2
*
diff
);
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
{
index
=
av_log2_16bit
(
2
*
diff
);
}
}
else
{
if
(
component
==
0
)
{
put_bits
(
&
s
->
pb
,
mpeg1_lum_dc_uni
[
diff
+
255
]
&
0xFF
,
mpeg1_lum_dc_uni
[
diff
+
255
]
>>
8
);
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
{
put_bits
(
&
s
->
pb
,
mpeg1_chr_dc_uni
[
diff
+
255
]
&
0xFF
,
mpeg1_chr_dc_uni
[
diff
+
255
]
>>
8
);
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
)
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
;
...
...
@@ -517,24 +531,24 @@ static void mpeg1_encode_block(MpegEncContext *s,
/* 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
];
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 */
/* 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
;
code
=
((
uint32_t
)
level
>>
31
);
/* the sign bit */
put_bits
(
&
s
->
pb
,
2
,
code
|
0x02
);
i
=
1
;
}
else
{
i
=
0
;
i
=
0
;
last_non_zero
=
-
1
;
goto
next_coef
;
}
...
...
@@ -543,38 +557,39 @@ static void mpeg1_encode_block(MpegEncContext *s,
/* now quantify & encode AC coefs */
last_non_zero
=
i
-
1
;
for
(;
i
<=
last_index
;
i
++
)
{
j
=
s
->
intra_scantable
.
permutated
[
i
];
for
(;
i
<=
last_index
;
i
++
)
{
j
=
s
->
intra_scantable
.
permutated
[
i
];
level
=
block
[
j
];
next_coef
:
next_coef:
/* encode using VLC */
if
(
level
!=
0
)
{
run
=
i
-
last_non_zero
-
1
;
alevel
=
level
;
alevel
=
level
;
MASK_ABS
(
sign
,
alevel
);
sign
&=
1
;
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
);
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
(
s
->
codec_id
==
AV_CODEC_ID_MPEG1VIDEO
)
{
if
(
alevel
<
128
)
{
put_sbits
(
&
s
->
pb
,
8
,
level
);
}
else
{
if
(
level
<
0
)
{
if
(
level
<
0
)
put_bits
(
&
s
->
pb
,
16
,
0x8001
+
level
+
255
);
}
else
{
else
put_sbits
(
&
s
->
pb
,
16
,
level
);
}
}
}
else
{
}
else
{
put_sbits
(
&
s
->
pb
,
12
,
level
);
}
}
...
...
@@ -586,340 +601,399 @@ static void mpeg1_encode_block(MpegEncContext *s,
}
static
av_always_inline
void
mpeg1_encode_mb_internal
(
MpegEncContext
*
s
,
int16_t
block
[
6
][
64
],
int
motion_x
,
int
motion_y
,
int
mb_block_count
)
int16_t
block
[
6
][
64
],
int
motion_x
,
int
motion_y
,
int
mb_block_count
)
{
int
i
,
cbp
;
const
int
mb_x
=
s
->
mb_x
;
const
int
mb_y
=
s
->
mb_y
;
const
int
first_mb
=
mb_x
==
s
->
resync_mb_x
&&
mb_y
==
s
->
resync_mb_y
;
const
int
mb_x
=
s
->
mb_x
;
const
int
mb_y
=
s
->
mb_y
;
const
int
first_mb
=
mb_x
==
s
->
resync_mb_x
&&
mb_y
==
s
->
resync_mb_y
;
/* compute cbp */
cbp
=
0
;
for
(
i
=
0
;
i
<
mb_block_count
;
i
++
)
{
for
(
i
=
0
;
i
<
mb_block_count
;
i
++
)
if
(
s
->
block_last_index
[
i
]
>=
0
)
cbp
|=
1
<<
(
mb_block_count
-
1
-
i
);
}
if
(
cbp
==
0
&&
!
first_mb
&&
s
->
mv_type
==
MV_TYPE_16X16
&&
(
mb_x
!=
s
->
mb_width
-
1
||
(
mb_y
!=
s
->
mb_height
-
1
&&
s
->
codec_id
==
AV_CODEC_ID_MPEG1VIDEO
))
&&
(
mb_x
!=
s
->
mb_width
-
1
||
(
mb_y
!=
s
->
mb_height
-
1
&&
s
->
codec_id
==
AV_CODEC_ID_MPEG1VIDEO
))
&&
((
s
->
pict_type
==
AV_PICTURE_TYPE_P
&&
(
motion_x
|
motion_y
)
==
0
)
||
(
s
->
pict_type
==
AV_PICTURE_TYPE_B
&&
s
->
mv_dir
==
s
->
last_mv_dir
&&
(((
s
->
mv_dir
&
MV_DIR_FORWARD
)
?
((
s
->
mv
[
0
][
0
][
0
]
-
s
->
last_mv
[
0
][
0
][
0
])
|
(
s
->
mv
[
0
][
0
][
1
]
-
s
->
last_mv
[
0
][
0
][
1
]))
:
0
)
|
((
s
->
mv_dir
&
MV_DIR_BACKWARD
)
?
((
s
->
mv
[
1
][
0
][
0
]
-
s
->
last_mv
[
1
][
0
][
0
])
|
(
s
->
mv
[
1
][
0
][
1
]
-
s
->
last_mv
[
1
][
0
][
1
]))
:
0
))
==
0
)))
{
(
s
->
pict_type
==
AV_PICTURE_TYPE_B
&&
s
->
mv_dir
==
s
->
last_mv_dir
&&
(((
s
->
mv_dir
&
MV_DIR_FORWARD
)
?
((
s
->
mv
[
0
][
0
][
0
]
-
s
->
last_mv
[
0
][
0
][
0
])
|
(
s
->
mv
[
0
][
0
][
1
]
-
s
->
last_mv
[
0
][
0
][
1
]))
:
0
)
|
((
s
->
mv_dir
&
MV_DIR_BACKWARD
)
?
((
s
->
mv
[
1
][
0
][
0
]
-
s
->
last_mv
[
1
][
0
][
0
])
|
(
s
->
mv
[
1
][
0
][
1
]
-
s
->
last_mv
[
1
][
0
][
1
]))
:
0
))
==
0
)))
{
s
->
mb_skip_run
++
;
s
->
qscale
-=
s
->
dquant
;
s
->
skip_count
++
;
s
->
misc_bits
++
;
s
->
last_bits
++
;
if
(
s
->
pict_type
==
AV_PICTURE_TYPE_P
){
s
->
last_mv
[
0
][
1
][
0
]
=
s
->
last_mv
[
0
][
0
][
0
]
=
s
->
last_mv
[
0
][
1
][
1
]
=
s
->
last_mv
[
0
][
0
][
1
]
=
0
;
if
(
s
->
pict_type
==
AV_PICTURE_TYPE_P
)
{
s
->
last_mv
[
0
][
0
][
0
]
=
s
->
last_mv
[
0
][
0
][
1
]
=
s
->
last_mv
[
0
][
1
][
0
]
=
s
->
last_mv
[
0
][
1
][
1
]
=
0
;
}
}
else
{
if
(
first_mb
)
{
if
(
first_mb
)
{
assert
(
s
->
mb_skip_run
==
0
);
encode_mb_skip_run
(
s
,
s
->
mb_x
);
}
else
{
}
else
{
encode_mb_skip_run
(
s
,
s
->
mb_skip_run
);
}
if
(
s
->
pict_type
==
AV_PICTURE_TYPE_I
)
{
if
(
s
->
dquant
&&
cbp
){
put_mb_modes
(
s
,
2
,
1
,
0
,
0
);
/* macroblock_type : macroblock_quant = 1 */
if
(
s
->
dquant
&&
cbp
)
{
/* macroblock_type: macroblock_quant = 1 */
put_mb_modes
(
s
,
2
,
1
,
0
,
0
);
put_qscale
(
s
);
}
else
{
put_mb_modes
(
s
,
1
,
1
,
0
,
0
);
/* macroblock_type : macroblock_quant = 0 */
}
else
{
/* macroblock_type: macroblock_quant = 0 */
put_mb_modes
(
s
,
1
,
1
,
0
,
0
);
s
->
qscale
-=
s
->
dquant
;
}
s
->
misc_bits
+=
get_bits_diff
(
s
);
s
->
misc_bits
+=
get_bits_diff
(
s
);
s
->
i_count
++
;
}
else
if
(
s
->
mb_intra
)
{
if
(
s
->
dquant
&&
cbp
)
{
if
(
s
->
dquant
&&
cbp
)
{
put_mb_modes
(
s
,
6
,
0x01
,
0
,
0
);
put_qscale
(
s
);
}
else
{
}
else
{
put_mb_modes
(
s
,
5
,
0x03
,
0
,
0
);
s
->
qscale
-=
s
->
dquant
;
}
s
->
misc_bits
+=
get_bits_diff
(
s
);
s
->
misc_bits
+=
get_bits_diff
(
s
);
s
->
i_count
++
;
memset
(
s
->
last_mv
,
0
,
sizeof
(
s
->
last_mv
));
}
else
if
(
s
->
pict_type
==
AV_PICTURE_TYPE_P
)
{
if
(
s
->
mv_type
==
MV_TYPE_16X16
)
{
if
(
s
->
mv_type
==
MV_TYPE_16X16
)
{
if
(
cbp
!=
0
)
{
if
((
motion_x
|
motion_y
)
==
0
)
{
if
(
s
->
dquant
){
put_mb_modes
(
s
,
5
,
1
,
0
,
0
);
/* macroblock_pattern & quant */
if
((
motion_x
|
motion_y
)
==
0
)
{
if
(
s
->
dquant
)
{
/* macroblock_pattern & quant */
put_mb_modes
(
s
,
5
,
1
,
0
,
0
);
put_qscale
(
s
);
}
else
{
put_mb_modes
(
s
,
2
,
1
,
0
,
0
);
/* macroblock_pattern only */
}
else
{
/* macroblock_pattern only */
put_mb_modes
(
s
,
2
,
1
,
0
,
0
);
}
s
->
misc_bits
+=
get_bits_diff
(
s
);
s
->
misc_bits
+=
get_bits_diff
(
s
);
}
else
{
if
(
s
->
dquant
)
{
put_mb_modes
(
s
,
5
,
2
,
1
,
0
);
/* motion + cbp */
if
(
s
->
dquant
)
{
put_mb_modes
(
s
,
5
,
2
,
1
,
0
);
/* motion + cbp */
put_qscale
(
s
);
}
else
{
put_mb_modes
(
s
,
1
,
1
,
1
,
0
);
/* motion + cbp */
}
else
{
put_mb_modes
(
s
,
1
,
1
,
1
,
0
);
/* motion + cbp */
}
s
->
misc_bits
+=
get_bits_diff
(
s
);
mpeg1_encode_motion
(
s
,
motion_x
-
s
->
last_mv
[
0
][
0
][
0
],
s
->
f_code
);
// RAL: f_code parameter added
mpeg1_encode_motion
(
s
,
motion_y
-
s
->
last_mv
[
0
][
0
][
1
],
s
->
f_code
);
// RAL: f_code parameter added
s
->
mv_bits
+=
get_bits_diff
(
s
);
s
->
misc_bits
+=
get_bits_diff
(
s
);
// RAL: f_code parameter added
mpeg1_encode_motion
(
s
,
motion_x
-
s
->
last_mv
[
0
][
0
][
0
],
s
->
f_code
);
// RAL: f_code parameter added
mpeg1_encode_motion
(
s
,
motion_y
-
s
->
last_mv
[
0
][
0
][
1
],
s
->
f_code
);
s
->
mv_bits
+=
get_bits_diff
(
s
);
}
}
else
{
put_bits
(
&
s
->
pb
,
3
,
1
);
/* motion only */
put_bits
(
&
s
->
pb
,
3
,
1
);
/* motion only */
if
(
!
s
->
frame_pred_frame_dct
)
put_bits
(
&
s
->
pb
,
2
,
2
);
/* motion_type: frame */
s
->
misc_bits
+=
get_bits_diff
(
s
);
mpeg1_encode_motion
(
s
,
motion_x
-
s
->
last_mv
[
0
][
0
][
0
],
s
->
f_code
);
// RAL: f_code parameter added
mpeg1_encode_motion
(
s
,
motion_y
-
s
->
last_mv
[
0
][
0
][
1
],
s
->
f_code
);
// RAL: f_code parameter added
s
->
qscale
-=
s
->
dquant
;
s
->
mv_bits
+=
get_bits_diff
(
s
);
put_bits
(
&
s
->
pb
,
2
,
2
);
/* motion_type: frame */
s
->
misc_bits
+=
get_bits_diff
(
s
);
// RAL: f_code parameter added
mpeg1_encode_motion
(
s
,
motion_x
-
s
->
last_mv
[
0
][
0
][
0
],
s
->
f_code
);
// RAL: f_code parameter added
mpeg1_encode_motion
(
s
,
motion_y
-
s
->
last_mv
[
0
][
0
][
1
],
s
->
f_code
);
s
->
qscale
-=
s
->
dquant
;
s
->
mv_bits
+=
get_bits_diff
(
s
);
}
s
->
last_mv
[
0
][
1
][
0
]
=
s
->
last_mv
[
0
][
0
][
0
]
=
motion_x
;
s
->
last_mv
[
0
][
1
][
1
]
=
s
->
last_mv
[
0
][
0
][
1
]
=
motion_y
;
}
else
{
s
->
last_mv
[
0
][
1
][
0
]
=
s
->
last_mv
[
0
][
0
][
0
]
=
motion_x
;
s
->
last_mv
[
0
][
1
][
1
]
=
s
->
last_mv
[
0
][
0
][
1
]
=
motion_y
;
}
else
{
assert
(
!
s
->
frame_pred_frame_dct
&&
s
->
mv_type
==
MV_TYPE_FIELD
);
if
(
cbp
)
{
if
(
s
->
dquant
)
{
put_mb_modes
(
s
,
5
,
2
,
1
,
1
);
/* motion + cbp */
if
(
s
->
dquant
)
{
put_mb_modes
(
s
,
5
,
2
,
1
,
1
);
/* motion + cbp */
put_qscale
(
s
);
}
else
{
put_mb_modes
(
s
,
1
,
1
,
1
,
1
);
/* motion + cbp */
}
else
{
put_mb_modes
(
s
,
1
,
1
,
1
,
1
);
/* motion + cbp */
}
}
else
{
put_bits
(
&
s
->
pb
,
3
,
1
);
/* motion only */
put_bits
(
&
s
->
pb
,
2
,
1
);
/* motion_type: field */
put_bits
(
&
s
->
pb
,
3
,
1
);
/* motion only */
put_bits
(
&
s
->
pb
,
2
,
1
);
/* motion_type: field */
s
->
qscale
-=
s
->
dquant
;
}
s
->
misc_bits
+=
get_bits_diff
(
s
);
for
(
i
=
0
;
i
<
2
;
i
++
)
{
s
->
misc_bits
+=
get_bits_diff
(
s
);
for
(
i
=
0
;
i
<
2
;
i
++
)
{
put_bits
(
&
s
->
pb
,
1
,
s
->
field_select
[
0
][
i
]);
mpeg1_encode_motion
(
s
,
s
->
mv
[
0
][
i
][
0
]
-
s
->
last_mv
[
0
][
i
][
0
]
,
s
->
f_code
);
mpeg1_encode_motion
(
s
,
s
->
mv
[
0
][
i
][
1
]
-
(
s
->
last_mv
[
0
][
i
][
1
]
>>
1
),
s
->
f_code
);
s
->
last_mv
[
0
][
i
][
0
]
=
s
->
mv
[
0
][
i
][
0
];
s
->
last_mv
[
0
][
i
][
1
]
=
2
*
s
->
mv
[
0
][
i
][
1
];
mpeg1_encode_motion
(
s
,
s
->
mv
[
0
][
i
][
0
]
-
s
->
last_mv
[
0
][
i
][
0
],
s
->
f_code
);
mpeg1_encode_motion
(
s
,
s
->
mv
[
0
][
i
][
1
]
-
(
s
->
last_mv
[
0
][
i
][
1
]
>>
1
),
s
->
f_code
);
s
->
last_mv
[
0
][
i
][
0
]
=
s
->
mv
[
0
][
i
][
0
];
s
->
last_mv
[
0
][
i
][
1
]
=
2
*
s
->
mv
[
0
][
i
][
1
];
}
s
->
mv_bits
+=
get_bits_diff
(
s
);
s
->
mv_bits
+=
get_bits_diff
(
s
);
}
if
(
cbp
)
{
if
(
cbp
)
{
if
(
s
->
chroma_y_shift
)
{
put_bits
(
&
s
->
pb
,
ff_mpeg12_mbPatTable
[
cbp
][
1
],
ff_mpeg12_mbPatTable
[
cbp
][
0
]);
put_bits
(
&
s
->
pb
,
ff_mpeg12_mbPatTable
[
cbp
][
1
],
ff_mpeg12_mbPatTable
[
cbp
][
0
]);
}
else
{
put_bits
(
&
s
->
pb
,
ff_mpeg12_mbPatTable
[
cbp
>>
2
][
1
],
ff_mpeg12_mbPatTable
[
cbp
>>
2
][
0
]);
put_bits
(
&
s
->
pb
,
ff_mpeg12_mbPatTable
[
cbp
>>
2
][
1
],
ff_mpeg12_mbPatTable
[
cbp
>>
2
][
0
]);
put_sbits
(
&
s
->
pb
,
2
,
cbp
);
}
}
s
->
f_count
++
;
}
else
{
if
(
s
->
mv_type
==
MV_TYPE_16X16
)
{
if
(
cbp
)
{
// With coded bloc pattern
}
else
{
if
(
s
->
mv_type
==
MV_TYPE_16X16
)
{
if
(
cbp
)
{
// With coded bloc pattern
if
(
s
->
dquant
)
{
if
(
s
->
mv_dir
==
MV_DIR_FORWARD
)
if
(
s
->
mv_dir
==
MV_DIR_FORWARD
)
put_mb_modes
(
s
,
6
,
3
,
1
,
0
);
else
put_mb_modes
(
s
,
8
-
s
->
mv_dir
,
2
,
1
,
0
);
put_mb_modes
(
s
,
8
-
s
->
mv_dir
,
2
,
1
,
0
);
put_qscale
(
s
);
}
else
{
put_mb_modes
(
s
,
5
-
s
->
mv_dir
,
3
,
1
,
0
);
put_mb_modes
(
s
,
5
-
s
->
mv_dir
,
3
,
1
,
0
);
}
}
else
{
// No coded bloc pattern
put_bits
(
&
s
->
pb
,
5
-
s
->
mv_dir
,
2
);
}
else
{
// No coded bloc pattern
put_bits
(
&
s
->
pb
,
5
-
s
->
mv_dir
,
2
);
if
(
!
s
->
frame_pred_frame_dct
)
put_bits
(
&
s
->
pb
,
2
,
2
);
/* motion_type: frame */
s
->
qscale
-=
s
->
dquant
;
}
s
->
misc_bits
+=
get_bits_diff
(
s
);
if
(
s
->
mv_dir
&
MV_DIR_FORWARD
){
mpeg1_encode_motion
(
s
,
s
->
mv
[
0
][
0
][
0
]
-
s
->
last_mv
[
0
][
0
][
0
],
s
->
f_code
);
mpeg1_encode_motion
(
s
,
s
->
mv
[
0
][
0
][
1
]
-
s
->
last_mv
[
0
][
0
][
1
],
s
->
f_code
);
s
->
last_mv
[
0
][
0
][
0
]
=
s
->
last_mv
[
0
][
1
][
0
]
=
s
->
mv
[
0
][
0
][
0
];
s
->
last_mv
[
0
][
0
][
1
]
=
s
->
last_mv
[
0
][
1
][
1
]
=
s
->
mv
[
0
][
0
][
1
];
if
(
s
->
mv_dir
&
MV_DIR_FORWARD
)
{
mpeg1_encode_motion
(
s
,
s
->
mv
[
0
][
0
][
0
]
-
s
->
last_mv
[
0
][
0
][
0
],
s
->
f_code
);
mpeg1_encode_motion
(
s
,
s
->
mv
[
0
][
0
][
1
]
-
s
->
last_mv
[
0
][
0
][
1
],
s
->
f_code
);
s
->
last_mv
[
0
][
0
][
0
]
=
s
->
last_mv
[
0
][
1
][
0
]
=
s
->
mv
[
0
][
0
][
0
];
s
->
last_mv
[
0
][
0
][
1
]
=
s
->
last_mv
[
0
][
1
][
1
]
=
s
->
mv
[
0
][
0
][
1
];
s
->
f_count
++
;
}
if
(
s
->
mv_dir
&
MV_DIR_BACKWARD
){
mpeg1_encode_motion
(
s
,
s
->
mv
[
1
][
0
][
0
]
-
s
->
last_mv
[
1
][
0
][
0
],
s
->
b_code
);
mpeg1_encode_motion
(
s
,
s
->
mv
[
1
][
0
][
1
]
-
s
->
last_mv
[
1
][
0
][
1
],
s
->
b_code
);
s
->
last_mv
[
1
][
0
][
0
]
=
s
->
last_mv
[
1
][
1
][
0
]
=
s
->
mv
[
1
][
0
][
0
];
s
->
last_mv
[
1
][
0
][
1
]
=
s
->
last_mv
[
1
][
1
][
1
]
=
s
->
mv
[
1
][
0
][
1
];
if
(
s
->
mv_dir
&
MV_DIR_BACKWARD
)
{
mpeg1_encode_motion
(
s
,
s
->
mv
[
1
][
0
][
0
]
-
s
->
last_mv
[
1
][
0
][
0
],
s
->
b_code
);
mpeg1_encode_motion
(
s
,
s
->
mv
[
1
][
0
][
1
]
-
s
->
last_mv
[
1
][
0
][
1
],
s
->
b_code
);
s
->
last_mv
[
1
][
0
][
0
]
=
s
->
last_mv
[
1
][
1
][
0
]
=
s
->
mv
[
1
][
0
][
0
];
s
->
last_mv
[
1
][
0
][
1
]
=
s
->
last_mv
[
1
][
1
][
1
]
=
s
->
mv
[
1
][
0
][
1
];
s
->
b_count
++
;
}
}
else
{
}
else
{
assert
(
s
->
mv_type
==
MV_TYPE_FIELD
);
assert
(
!
s
->
frame_pred_frame_dct
);
if
(
cbp
)
{
// With coded bloc pattern
if
(
cbp
)
{
// With coded bloc pattern
if
(
s
->
dquant
)
{
if
(
s
->
mv_dir
==
MV_DIR_FORWARD
)
if
(
s
->
mv_dir
==
MV_DIR_FORWARD
)
put_mb_modes
(
s
,
6
,
3
,
1
,
1
);
else
put_mb_modes
(
s
,
8
-
s
->
mv_dir
,
2
,
1
,
1
);
put_mb_modes
(
s
,
8
-
s
->
mv_dir
,
2
,
1
,
1
);
put_qscale
(
s
);
}
else
{
put_mb_modes
(
s
,
5
-
s
->
mv_dir
,
3
,
1
,
1
);
put_mb_modes
(
s
,
5
-
s
->
mv_dir
,
3
,
1
,
1
);
}
}
else
{
// No coded bloc pattern
put_bits
(
&
s
->
pb
,
5
-
s
->
mv_dir
,
2
);
put_bits
(
&
s
->
pb
,
2
,
1
);
/* motion_type: field */
}
else
{
// No coded bloc pattern
put_bits
(
&
s
->
pb
,
5
-
s
->
mv_dir
,
2
);
put_bits
(
&
s
->
pb
,
2
,
1
);
/* motion_type: field */
s
->
qscale
-=
s
->
dquant
;
}
s
->
misc_bits
+=
get_bits_diff
(
s
);
if
(
s
->
mv_dir
&
MV_DIR_FORWARD
)
{
for
(
i
=
0
;
i
<
2
;
i
++
)
{
if
(
s
->
mv_dir
&
MV_DIR_FORWARD
)
{
for
(
i
=
0
;
i
<
2
;
i
++
)
{
put_bits
(
&
s
->
pb
,
1
,
s
->
field_select
[
0
][
i
]);
mpeg1_encode_motion
(
s
,
s
->
mv
[
0
][
i
][
0
]
-
s
->
last_mv
[
0
][
i
][
0
]
,
s
->
f_code
);
mpeg1_encode_motion
(
s
,
s
->
mv
[
0
][
i
][
1
]
-
(
s
->
last_mv
[
0
][
i
][
1
]
>>
1
),
s
->
f_code
);
s
->
last_mv
[
0
][
i
][
0
]
=
s
->
mv
[
0
][
i
][
0
];
s
->
last_mv
[
0
][
i
][
1
]
=
2
*
s
->
mv
[
0
][
i
][
1
];
mpeg1_encode_motion
(
s
,
s
->
mv
[
0
][
i
][
0
]
-
s
->
last_mv
[
0
][
i
][
0
],
s
->
f_code
);
mpeg1_encode_motion
(
s
,
s
->
mv
[
0
][
i
][
1
]
-
(
s
->
last_mv
[
0
][
i
][
1
]
>>
1
),
s
->
f_code
);
s
->
last_mv
[
0
][
i
][
0
]
=
s
->
mv
[
0
][
i
][
0
];
s
->
last_mv
[
0
][
i
][
1
]
=
s
->
mv
[
0
][
i
][
1
]
*
2
;
}
s
->
f_count
++
;
}
if
(
s
->
mv_dir
&
MV_DIR_BACKWARD
)
{
for
(
i
=
0
;
i
<
2
;
i
++
)
{
if
(
s
->
mv_dir
&
MV_DIR_BACKWARD
)
{
for
(
i
=
0
;
i
<
2
;
i
++
)
{
put_bits
(
&
s
->
pb
,
1
,
s
->
field_select
[
1
][
i
]);
mpeg1_encode_motion
(
s
,
s
->
mv
[
1
][
i
][
0
]
-
s
->
last_mv
[
1
][
i
][
0
]
,
s
->
b_code
);
mpeg1_encode_motion
(
s
,
s
->
mv
[
1
][
i
][
1
]
-
(
s
->
last_mv
[
1
][
i
][
1
]
>>
1
),
s
->
b_code
);
s
->
last_mv
[
1
][
i
][
0
]
=
s
->
mv
[
1
][
i
][
0
];
s
->
last_mv
[
1
][
i
][
1
]
=
2
*
s
->
mv
[
1
][
i
][
1
];
mpeg1_encode_motion
(
s
,
s
->
mv
[
1
][
i
][
0
]
-
s
->
last_mv
[
1
][
i
][
0
],
s
->
b_code
);
mpeg1_encode_motion
(
s
,
s
->
mv
[
1
][
i
][
1
]
-
(
s
->
last_mv
[
1
][
i
][
1
]
>>
1
),
s
->
b_code
);
s
->
last_mv
[
1
][
i
][
0
]
=
s
->
mv
[
1
][
i
][
0
];
s
->
last_mv
[
1
][
i
][
1
]
=
s
->
mv
[
1
][
i
][
1
]
*
2
;
}
s
->
b_count
++
;
}
}
s
->
mv_bits
+=
get_bits_diff
(
s
);
if
(
cbp
)
{
if
(
cbp
)
{
if
(
s
->
chroma_y_shift
)
{
put_bits
(
&
s
->
pb
,
ff_mpeg12_mbPatTable
[
cbp
][
1
],
ff_mpeg12_mbPatTable
[
cbp
][
0
]);
put_bits
(
&
s
->
pb
,
ff_mpeg12_mbPatTable
[
cbp
][
1
],
ff_mpeg12_mbPatTable
[
cbp
][
0
]);
}
else
{
put_bits
(
&
s
->
pb
,
ff_mpeg12_mbPatTable
[
cbp
>>
2
][
1
],
ff_mpeg12_mbPatTable
[
cbp
>>
2
][
0
]);
put_bits
(
&
s
->
pb
,
ff_mpeg12_mbPatTable
[
cbp
>>
2
][
1
],
ff_mpeg12_mbPatTable
[
cbp
>>
2
][
0
]);
put_sbits
(
&
s
->
pb
,
2
,
cbp
);
}
}
}
for
(
i
=
0
;
i
<
mb_block_count
;
i
++
)
{
if
(
cbp
&
(
1
<<
(
mb_block_count
-
1
-
i
)))
{
for
(
i
=
0
;
i
<
mb_block_count
;
i
++
)
if
(
cbp
&
(
1
<<
(
mb_block_count
-
1
-
i
)))
mpeg1_encode_block
(
s
,
block
[
i
],
i
);
}
}
s
->
mb_skip_run
=
0
;
if
(
s
->
mb_intra
)
s
->
i_tex_bits
+=
get_bits_diff
(
s
);
if
(
s
->
mb_intra
)
s
->
i_tex_bits
+=
get_bits_diff
(
s
);
else
s
->
p_tex_bits
+=
get_bits_diff
(
s
);
s
->
p_tex_bits
+=
get_bits_diff
(
s
);
}
}
void
ff_mpeg1_encode_mb
(
MpegEncContext
*
s
,
int16_t
block
[
6
][
64
],
int
motion_x
,
int
motion_y
)
void
ff_mpeg1_encode_mb
(
MpegEncContext
*
s
,
int16_t
block
[
6
][
64
],
int
motion_x
,
int
motion_y
)
{
if
(
s
->
chroma_format
==
CHROMA_420
)
mpeg1_encode_mb_internal
(
s
,
block
,
motion_x
,
motion_y
,
6
);
else
mpeg1_encode_mb_internal
(
s
,
block
,
motion_x
,
motion_y
,
8
);
if
(
s
->
chroma_format
==
CHROMA_420
)
mpeg1_encode_mb_internal
(
s
,
block
,
motion_x
,
motion_y
,
6
);
else
mpeg1_encode_mb_internal
(
s
,
block
,
motion_x
,
motion_y
,
8
);
}
av_cold
void
ff_mpeg1_encode_init
(
MpegEncContext
*
s
)
{
static
int
done
=
0
;
static
int
done
=
0
;
ff_mpeg12_common_init
(
s
);
if
(
!
done
)
{
if
(
!
done
)
{
int
f_code
;
int
mv
;
int
i
;
done
=
1
;
done
=
1
;
ff_init_rl
(
&
ff_rl_mpeg1
,
ff_mpeg12_static_rl_table_store
[
0
]);
ff_init_rl
(
&
ff_rl_mpeg2
,
ff_mpeg12_static_rl_table_store
[
1
]);
for
(
i
=
0
;
i
<
64
;
i
++
)
{
mpeg1_max_level
[
0
][
i
]
=
ff_rl_mpeg1
.
max_level
[
0
][
i
];
mpeg1_index_run
[
0
][
i
]
=
ff_rl_mpeg1
.
index_run
[
0
][
i
];
for
(
i
=
0
;
i
<
64
;
i
++
)
{
mpeg1_max_level
[
0
][
i
]
=
ff_rl_mpeg1
.
max_level
[
0
][
i
];
mpeg1_index_run
[
0
][
i
]
=
ff_rl_mpeg1
.
index_run
[
0
][
i
];
}
init_uni_ac_vlc
(
&
ff_rl_mpeg1
,
uni_mpeg1_ac_vlc_len
);
if
(
s
->
intra_vlc_format
)
if
(
s
->
intra_vlc_format
)
init_uni_ac_vlc
(
&
ff_rl_mpeg2
,
uni_mpeg2_ac_vlc_len
);
/* build unified dc encoding tables */
for
(
i
=-
255
;
i
<
256
;
i
++
)
{
int
adiff
,
index
;
int
bits
,
code
;
int
diff
=
i
;
adiff
=
FFABS
(
diff
);
if
(
diff
<
0
)
diff
--
;
index
=
av_log2
(
2
*
adiff
);
bits
=
ff_mpeg12_vlc_dc_lum_bits
[
index
]
+
index
;
code
=
(
ff_mpeg12_vlc_dc_lum_code
[
index
]
<<
index
)
+
(
diff
&
((
1
<<
index
)
-
1
));
mpeg1_lum_dc_uni
[
i
+
255
]
=
bits
+
(
code
<<
8
);
bits
=
ff_mpeg12_vlc_dc_chroma_bits
[
index
]
+
index
;
code
=
(
ff_mpeg12_vlc_dc_chroma_code
[
index
]
<<
index
)
+
(
diff
&
((
1
<<
index
)
-
1
));
mpeg1_chr_dc_uni
[
i
+
255
]
=
bits
+
(
code
<<
8
);
for
(
i
=
-
255
;
i
<
256
;
i
++
)
{
int
adiff
,
index
;
int
bits
,
code
;
int
diff
=
i
;
adiff
=
FFABS
(
diff
);
if
(
diff
<
0
)
diff
--
;
index
=
av_log2
(
2
*
adiff
);
bits
=
ff_mpeg12_vlc_dc_lum_bits
[
index
]
+
index
;
code
=
(
ff_mpeg12_vlc_dc_lum_code
[
index
]
<<
index
)
+
(
diff
&
((
1
<<
index
)
-
1
));
mpeg1_lum_dc_uni
[
i
+
255
]
=
bits
+
(
code
<<
8
);
bits
=
ff_mpeg12_vlc_dc_chroma_bits
[
index
]
+
index
;
code
=
(
ff_mpeg12_vlc_dc_chroma_code
[
index
]
<<
index
)
+
(
diff
&
((
1
<<
index
)
-
1
));
mpeg1_chr_dc_uni
[
i
+
255
]
=
bits
+
(
code
<<
8
);
}
for
(
f_code
=
1
;
f_code
<=
MAX_FCODE
;
f_code
++
){
for
(
mv
=-
MAX_MV
;
mv
<=
MAX_MV
;
mv
++
)
{
for
(
f_code
=
1
;
f_code
<=
MAX_FCODE
;
f_code
++
)
for
(
mv
=
-
MAX_MV
;
mv
<=
MAX_MV
;
mv
++
)
{
int
len
;
if
(
mv
==
0
)
len
=
ff_mpeg12_mbMotionVectorTable
[
0
][
1
];
else
{
if
(
mv
==
0
)
{
len
=
ff_mpeg12_mbMotionVectorTable
[
0
][
1
];
}
else
{
int
val
,
bit_size
,
code
;
bit_size
=
f_code
-
1
;
val
=
mv
;
val
=
mv
;
if
(
val
<
0
)
val
=
-
val
;
val
--
;
code
=
(
val
>>
bit_size
)
+
1
;
if
(
code
<
17
){
len
=
ff_mpeg12_mbMotionVectorTable
[
code
][
1
]
+
1
+
bit_size
;
}
else
{
len
=
ff_mpeg12_mbMotionVectorTable
[
16
][
1
]
+
2
+
bit_size
;
}
if
(
code
<
17
)
len
=
ff_mpeg12_mbMotionVectorTable
[
code
][
1
]
+
1
+
bit_size
;
else
len
=
ff_mpeg12_mbMotionVectorTable
[
16
][
1
]
+
2
+
bit_size
;
}
mv_penalty
[
f_code
][
mv
+
MAX_MV
]
=
len
;
mv_penalty
[
f_code
][
mv
+
MAX_MV
]
=
len
;
}
}
for
(
f_code
=
MAX_FCODE
;
f_code
>
0
;
f_code
--
){
for
(
mv
=-
(
8
<<
f_code
);
mv
<
(
8
<<
f_code
);
mv
++
){
fcode_tab
[
mv
+
MAX_MV
]
=
f_code
;
}
}
for
(
f_code
=
MAX_FCODE
;
f_code
>
0
;
f_code
--
)
for
(
mv
=
-
(
8
<<
f_code
);
mv
<
(
8
<<
f_code
);
mv
++
)
fcode_tab
[
mv
+
MAX_MV
]
=
f_code
;
}
s
->
me
.
mv_penalty
=
mv_penalty
;
s
->
fcode_tab
=
fcode_tab
;
if
(
s
->
codec_id
==
AV_CODEC_ID_MPEG1VIDEO
)
{
s
->
min_qcoeff
=
-
255
;
s
->
max_qcoeff
=
255
;
}
else
{
s
->
min_qcoeff
=
-
2047
;
s
->
max_qcoeff
=
2047
;
s
->
me
.
mv_penalty
=
mv_penalty
;
s
->
fcode_tab
=
fcode_tab
;
if
(
s
->
codec_id
==
AV_CODEC_ID_MPEG1VIDEO
)
{
s
->
min_qcoeff
=
-
255
;
s
->
max_qcoeff
=
255
;
}
else
{
s
->
min_qcoeff
=
-
2047
;
s
->
max_qcoeff
=
2047
;
}
if
(
s
->
intra_vlc_format
)
{
s
->
intra_ac_vlc_length
=
s
->
intra_ac_vlc_last_length
=
uni_mpeg2_ac_vlc_len
;
s
->
intra_ac_vlc_length
=
s
->
intra_ac_vlc_last_length
=
uni_mpeg2_ac_vlc_len
;
}
else
{
s
->
intra_ac_vlc_length
=
s
->
intra_ac_vlc_last_length
=
uni_mpeg1_ac_vlc_len
;
s
->
intra_ac_vlc_length
=
s
->
intra_ac_vlc_last_length
=
uni_mpeg1_ac_vlc_len
;
}
s
->
inter_ac_vlc_length
=
s
->
inter_ac_vlc_last_length
=
uni_mpeg1_ac_vlc_len
;
s
->
inter_ac_vlc_length
=
s
->
inter_ac_vlc_last_length
=
uni_mpeg1_ac_vlc_len
;
}
#define OFFSET(x) offsetof(MpegEncContext, x)
#define VE AV_OPT_FLAG_ENCODING_PARAM | AV_OPT_FLAG_VIDEO_PARAM
#define COMMON_OPTS\
{ "intra_vlc", "Use MPEG-2 intra VLC table.", OFFSET(intra_vlc_format), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },\
{ "drop_frame_timecode", "Timecode is in drop frame format.", OFFSET(drop_frame_timecode), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE}, \
{ "scan_offset", "Reserve space for SVCD scan offset user data.", OFFSET(scan_offset), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
#define COMMON_OPTS \
{ "intra_vlc", "Use MPEG-2 intra VLC table.", \
OFFSET(intra_vlc_format), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE }, \
{ "drop_frame_timecode", "Timecode is in drop frame format.", \
OFFSET(drop_frame_timecode), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE }, \
{ "scan_offset", "Reserve space for SVCD scan offset user data.", \
OFFSET(scan_offset), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
static
const
AVOption
mpeg1_options
[]
=
{
COMMON_OPTS
...
...
@@ -929,18 +1003,18 @@ static const AVOption mpeg1_options[] = {
static
const
AVOption
mpeg2_options
[]
=
{
COMMON_OPTS
{
"non_linear_quant"
,
"Use nonlinear quantizer."
,
OFFSET
(
q_scale_type
),
AV_OPT_TYPE_INT
,
{
.
i64
=
0
},
0
,
1
,
VE
},
{
"alternate_scan"
,
"Enable alternate scantable."
,
OFFSET
(
alternate_scan
),
AV_OPT_TYPE_INT
,
{
.
i64
=
0
},
0
,
1
,
VE
},
{
"non_linear_quant"
,
"Use nonlinear quantizer."
,
OFFSET
(
q_scale_type
),
AV_OPT_TYPE_INT
,
{
.
i64
=
0
},
0
,
1
,
VE
},
{
"alternate_scan"
,
"Enable alternate scantable."
,
OFFSET
(
alternate_scan
),
AV_OPT_TYPE_INT
,
{
.
i64
=
0
},
0
,
1
,
VE
},
FF_MPV_COMMON_OPTS
{
NULL
},
};
#define mpeg12_class(x)\
static const AVClass mpeg
## x ##_class = {
\
.class_name
= "mpeg" #x "video encoder",
\
.item_name
= av_default_item_name,
\
.option
= mpeg## x ##_options,
\
.version
= LIBAVUTIL_VERSION_INT,
\
#define mpeg12_class(x)
\
static const AVClass mpeg
## x ## _class = {
\
.class_name
= "mpeg" # x "video encoder",
\
.item_name
= av_default_item_name,
\
.option
= mpeg ## x ## _options,
\
.version
= LIBAVUTIL_VERSION_INT,
\
};
mpeg12_class
(
1
)
...
...
@@ -955,8 +1029,8 @@ AVCodec ff_mpeg1video_encoder = {
.
encode2
=
ff_MPV_encode_picture
,
.
close
=
ff_MPV_encode_end
,
.
supported_framerates
=
ff_mpeg12_frame_rate_tab
+
1
,
.
pix_fmts
=
(
const
enum
AVPixelFormat
[]){
AV_PIX_FMT_YUV420P
,
AV_PIX_FMT_NONE
},
.
pix_fmts
=
(
const
enum
AVPixelFormat
[])
{
AV_PIX_FMT_YUV420P
,
AV_PIX_FMT_NONE
},
.
capabilities
=
CODEC_CAP_DELAY
|
CODEC_CAP_SLICE_THREADS
,
.
long_name
=
NULL_IF_CONFIG_SMALL
(
"MPEG-1 video"
),
.
priv_class
=
&
mpeg1_class
,
...
...
@@ -971,9 +1045,9 @@ AVCodec ff_mpeg2video_encoder = {
.
encode2
=
ff_MPV_encode_picture
,
.
close
=
ff_MPV_encode_end
,
.
supported_framerates
=
ff_mpeg12_frame_rate_tab
+
1
,
.
pix_fmts
=
(
const
enum
AVPixelFormat
[])
{
AV_PIX_FMT_YUV420P
,
AV_PIX_FMT_YUV422P
,
AV_PIX_FMT_NONE
},
.
pix_fmts
=
(
const
enum
AVPixelFormat
[])
{
AV_PIX_FMT_YUV420P
,
AV_PIX_FMT_YUV422P
,
AV_PIX_FMT_NONE
},
.
capabilities
=
CODEC_CAP_DELAY
|
CODEC_CAP_SLICE_THREADS
,
.
long_name
=
NULL_IF_CONFIG_SMALL
(
"MPEG-2 video"
),
.
priv_class
=
&
mpeg2_class
,
...
...
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