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
a05ea77c
Commit
a05ea77c
authored
Sep 08, 2011
by
Diego Biurrun
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
mpeg12: reorder functions to avoid ugly forward declarations
parent
a92d0fa5
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
920 additions
and
931 deletions
+920
-931
mpeg12.c
libavcodec/mpeg12.c
+920
-931
No files found.
libavcodec/mpeg12.c
View file @
a05ea77c
...
...
@@ -49,1069 +49,1062 @@
#define MB_PTYPE_VLC_BITS 6
#define MB_BTYPE_VLC_BITS 6
static
inline
int
mpeg1_decode_block_intra
(
MpegEncContext
*
s
,
DCTELEM
*
block
,
int
n
);
static
inline
int
mpeg1_decode_block_inter
(
MpegEncContext
*
s
,
DCTELEM
*
block
,
int
n
);
static
inline
int
mpeg1_fast_decode_block_inter
(
MpegEncContext
*
s
,
DCTELEM
*
block
,
int
n
);
static
inline
int
mpeg2_decode_block_non_intra
(
MpegEncContext
*
s
,
DCTELEM
*
block
,
int
n
);
static
inline
int
mpeg2_decode_block_intra
(
MpegEncContext
*
s
,
DCTELEM
*
block
,
int
n
);
static
inline
int
mpeg2_fast_decode_block_non_intra
(
MpegEncContext
*
s
,
DCTELEM
*
block
,
int
n
);
static
inline
int
mpeg2_fast_decode_block_intra
(
MpegEncContext
*
s
,
DCTELEM
*
block
,
int
n
);
static
int
mpeg_decode_motion
(
MpegEncContext
*
s
,
int
fcode
,
int
pred
);
static
void
exchange_uv
(
MpegEncContext
*
s
);
static
VLC
mv_vlc
;
static
const
enum
PixelFormat
pixfmt_xvmc_mpg2_420
[]
=
{
PIX_FMT_XVMC_MPEG2_IDCT
,
PIX_FMT_XVMC_MPEG2_MC
,
PIX_FMT_NONE
}
;
/* as H.263, but only 17 codes */
static
int
mpeg_decode_motion
(
MpegEncContext
*
s
,
int
fcode
,
int
pred
)
{
int
code
,
sign
,
val
,
l
,
shift
;
uint8_t
ff_mpeg12_static_rl_table_store
[
2
][
2
][
2
*
MAX_RUN
+
MAX_LEVEL
+
3
];
code
=
get_vlc2
(
&
s
->
gb
,
mv_vlc
.
table
,
MV_VLC_BITS
,
2
);
if
(
code
==
0
)
{
return
pred
;
}
if
(
code
<
0
)
{
return
0xffff
;
}
sign
=
get_bits1
(
&
s
->
gb
);
shift
=
fcode
-
1
;
val
=
code
;
if
(
shift
)
{
val
=
(
val
-
1
)
<<
shift
;
val
|=
get_bits
(
&
s
->
gb
,
shift
);
val
++
;
}
if
(
sign
)
val
=
-
val
;
val
+=
pred
;
#define INIT_2D_VLC_RL(rl, static_size)\
{\
static RL_VLC_ELEM rl_vlc_table[static_size];\
INIT_VLC_STATIC(&rl.vlc, TEX_VLC_BITS, rl.n + 2,\
&rl.table_vlc[0][1], 4, 2,\
&rl.table_vlc[0][0], 4, 2, static_size);\
\
rl.rl_vlc[0] = rl_vlc_table;\
init_2d_vlc_rl(&rl);\
/* modulo decoding */
l
=
INT_BIT
-
5
-
shift
;
val
=
(
val
<<
l
)
>>
l
;
return
val
;
}
static
void
init_2d_vlc_rl
(
RLTable
*
rl
)
static
inline
int
mpeg1_decode_block_intra
(
MpegEncContext
*
s
,
DCTELEM
*
block
,
int
n
)
{
int
i
;
int
level
,
dc
,
diff
,
i
,
j
,
run
;
int
component
;
RLTable
*
rl
=
&
ff_rl_mpeg1
;
uint8_t
*
const
scantable
=
s
->
intra_scantable
.
permutated
;
const
uint16_t
*
quant_matrix
=
s
->
intra_matrix
;
const
int
qscale
=
s
->
qscale
;
for
(
i
=
0
;
i
<
rl
->
vlc
.
table_size
;
i
++
)
{
int
code
=
rl
->
vlc
.
table
[
i
][
0
];
int
len
=
rl
->
vlc
.
table
[
i
][
1
];
int
level
,
run
;
/* DC coefficient */
component
=
(
n
<=
3
?
0
:
n
-
4
+
1
);
diff
=
decode_dc
(
&
s
->
gb
,
component
);
if
(
diff
>=
0xffff
)
return
-
1
;
dc
=
s
->
last_dc
[
component
];
dc
+=
diff
;
s
->
last_dc
[
component
]
=
dc
;
block
[
0
]
=
dc
*
quant_matrix
[
0
];
av_dlog
(
s
->
avctx
,
"dc=%d diff=%d
\n
"
,
dc
,
diff
);
i
=
0
;
{
OPEN_READER
(
re
,
&
s
->
gb
);
/* now quantify & encode AC coefficients */
for
(;;)
{
UPDATE_CACHE
(
re
,
&
s
->
gb
);
GET_RL_VLC
(
level
,
run
,
re
,
&
s
->
gb
,
rl
->
rl_vlc
[
0
],
TEX_VLC_BITS
,
2
,
0
);
if
(
len
==
0
)
{
// illegal code
run
=
65
;
level
=
MAX_LEVEL
;
}
else
if
(
len
<
0
)
{
//more bits needed
run
=
0
;
level
=
code
;
}
else
{
if
(
code
==
rl
->
n
)
{
//esc
run
=
65
;
level
=
0
;
}
else
if
(
code
==
rl
->
n
+
1
)
{
//eob
run
=
0
;
level
=
127
;
if
(
level
==
127
)
{
break
;
}
else
if
(
level
!=
0
)
{
i
+=
run
;
j
=
scantable
[
i
];
level
=
(
level
*
qscale
*
quant_matrix
[
j
])
>>
4
;
level
=
(
level
-
1
)
|
1
;
level
=
(
level
^
SHOW_SBITS
(
re
,
&
s
->
gb
,
1
))
-
SHOW_SBITS
(
re
,
&
s
->
gb
,
1
);
LAST_SKIP_BITS
(
re
,
&
s
->
gb
,
1
);
}
else
{
run
=
rl
->
table_run
[
code
]
+
1
;
level
=
rl
->
table_level
[
code
];
/* escape */
run
=
SHOW_UBITS
(
re
,
&
s
->
gb
,
6
)
+
1
;
LAST_SKIP_BITS
(
re
,
&
s
->
gb
,
6
);
UPDATE_CACHE
(
re
,
&
s
->
gb
);
level
=
SHOW_SBITS
(
re
,
&
s
->
gb
,
8
);
SKIP_BITS
(
re
,
&
s
->
gb
,
8
);
if
(
level
==
-
128
)
{
level
=
SHOW_UBITS
(
re
,
&
s
->
gb
,
8
)
-
256
;
LAST_SKIP_BITS
(
re
,
&
s
->
gb
,
8
);
}
else
if
(
level
==
0
)
{
level
=
SHOW_UBITS
(
re
,
&
s
->
gb
,
8
)
;
LAST_SKIP_BITS
(
re
,
&
s
->
gb
,
8
);
}
i
+=
run
;
j
=
scantable
[
i
];
if
(
level
<
0
)
{
level
=
-
level
;
level
=
(
level
*
qscale
*
quant_matrix
[
j
])
>>
4
;
level
=
(
level
-
1
)
|
1
;
level
=
-
level
;
}
else
{
level
=
(
level
*
qscale
*
quant_matrix
[
j
])
>>
4
;
level
=
(
level
-
1
)
|
1
;
}
}
if
(
i
>
63
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"ac-tex damaged at %d %d
\n
"
,
s
->
mb_x
,
s
->
mb_y
);
return
-
1
;
}
block
[
j
]
=
level
;
}
rl
->
rl_vlc
[
0
][
i
].
len
=
len
;
rl
->
rl_vlc
[
0
][
i
].
level
=
level
;
rl
->
rl_vlc
[
0
][
i
].
run
=
run
;
CLOSE_READER
(
re
,
&
s
->
gb
);
}
s
->
block_last_index
[
n
]
=
i
;
return
0
;
}
void
ff_mpeg12_common_init
(
MpegEncContext
*
s
)
{
s
->
y_dc_scale_table
=
s
->
c_dc_scale_table
=
ff_mpeg2_dc_scale_table
[
s
->
intra_dc_precision
];
}
void
ff_mpeg1_clean_buffers
(
MpegEncContext
*
s
)
int
ff_mpeg1_decode_block_intra
(
MpegEncContext
*
s
,
DCTELEM
*
block
,
int
n
)
{
s
->
last_dc
[
0
]
=
1
<<
(
7
+
s
->
intra_dc_precision
);
s
->
last_dc
[
1
]
=
s
->
last_dc
[
0
];
s
->
last_dc
[
2
]
=
s
->
last_dc
[
0
];
memset
(
s
->
last_mv
,
0
,
sizeof
(
s
->
last_mv
));
return
mpeg1_decode_block_intra
(
s
,
block
,
n
);
}
/******************************************/
/* decoding */
VLC
ff_dc_lum_vlc
;
VLC
ff_dc_chroma_vlc
;
static
VLC
mv_vlc
;
static
VLC
mbincr_vlc
;
static
VLC
mb_ptype_vlc
;
static
VLC
mb_btype_vlc
;
static
VLC
mb_pat_vlc
;
av_cold
void
ff_mpeg12_init_vlcs
(
void
)
static
inline
int
mpeg1_decode_block_inter
(
MpegEncContext
*
s
,
DCTELEM
*
block
,
int
n
)
{
static
int
done
=
0
;
if
(
!
done
)
{
done
=
1
;
int
level
,
i
,
j
,
run
;
RLTable
*
rl
=
&
ff_rl_mpeg1
;
uint8_t
*
const
scantable
=
s
->
intra_scantable
.
permutated
;
const
uint16_t
*
quant_matrix
=
s
->
inter_matrix
;
const
int
qscale
=
s
->
qscale
;
INIT_VLC_STATIC
(
&
ff_dc_lum_vlc
,
DC_VLC_BITS
,
12
,
ff_mpeg12_vlc_dc_lum_bits
,
1
,
1
,
ff_mpeg12_vlc_dc_lum_code
,
2
,
2
,
512
);
INIT_VLC_STATIC
(
&
ff_dc_chroma_vlc
,
DC_VLC_BITS
,
12
,
ff_mpeg12_vlc_dc_chroma_bits
,
1
,
1
,
ff_mpeg12_vlc_dc_chroma_code
,
2
,
2
,
514
);
INIT_VLC_STATIC
(
&
mv_vlc
,
MV_VLC_BITS
,
17
,
&
ff_mpeg12_mbMotionVectorTable
[
0
][
1
],
2
,
1
,
&
ff_mpeg12_mbMotionVectorTable
[
0
][
0
],
2
,
1
,
518
);
INIT_VLC_STATIC
(
&
mbincr_vlc
,
MBINCR_VLC_BITS
,
36
,
&
ff_mpeg12_mbAddrIncrTable
[
0
][
1
],
2
,
1
,
&
ff_mpeg12_mbAddrIncrTable
[
0
][
0
],
2
,
1
,
538
);
INIT_VLC_STATIC
(
&
mb_pat_vlc
,
MB_PAT_VLC_BITS
,
64
,
&
ff_mpeg12_mbPatTable
[
0
][
1
],
2
,
1
,
&
ff_mpeg12_mbPatTable
[
0
][
0
],
2
,
1
,
512
);
{
OPEN_READER
(
re
,
&
s
->
gb
);
i
=
-
1
;
// special case for first coefficient, no need to add second VLC table
UPDATE_CACHE
(
re
,
&
s
->
gb
);
if
(((
int32_t
)
GET_CACHE
(
re
,
&
s
->
gb
))
<
0
)
{
level
=
(
3
*
qscale
*
quant_matrix
[
0
])
>>
5
;
level
=
(
level
-
1
)
|
1
;
if
(
GET_CACHE
(
re
,
&
s
->
gb
)
&
0x40000000
)
level
=
-
level
;
block
[
0
]
=
level
;
i
++
;
SKIP_BITS
(
re
,
&
s
->
gb
,
2
);
if
(((
int32_t
)
GET_CACHE
(
re
,
&
s
->
gb
))
<=
(
int32_t
)
0xBFFFFFFF
)
goto
end
;
}
/* now quantify & encode AC coefficients */
for
(;;)
{
GET_RL_VLC
(
level
,
run
,
re
,
&
s
->
gb
,
rl
->
rl_vlc
[
0
],
TEX_VLC_BITS
,
2
,
0
);
INIT_VLC_STATIC
(
&
mb_ptype_vlc
,
MB_PTYPE_VLC_BITS
,
7
,
&
table_mb_ptype
[
0
][
1
],
2
,
1
,
&
table_mb_ptype
[
0
][
0
],
2
,
1
,
64
);
INIT_VLC_STATIC
(
&
mb_btype_vlc
,
MB_BTYPE_VLC_BITS
,
11
,
&
table_mb_btype
[
0
][
1
],
2
,
1
,
&
table_mb_btype
[
0
][
0
],
2
,
1
,
64
);
init_rl
(
&
ff_rl_mpeg1
,
ff_mpeg12_static_rl_table_store
[
0
]);
init_rl
(
&
ff_rl_mpeg2
,
ff_mpeg12_static_rl_table_store
[
1
]);
if
(
level
!=
0
)
{
i
+=
run
;
j
=
scantable
[
i
];
level
=
((
level
*
2
+
1
)
*
qscale
*
quant_matrix
[
j
])
>>
5
;
level
=
(
level
-
1
)
|
1
;
level
=
(
level
^
SHOW_SBITS
(
re
,
&
s
->
gb
,
1
))
-
SHOW_SBITS
(
re
,
&
s
->
gb
,
1
);
SKIP_BITS
(
re
,
&
s
->
gb
,
1
);
}
else
{
/* escape */
run
=
SHOW_UBITS
(
re
,
&
s
->
gb
,
6
)
+
1
;
LAST_SKIP_BITS
(
re
,
&
s
->
gb
,
6
);
UPDATE_CACHE
(
re
,
&
s
->
gb
);
level
=
SHOW_SBITS
(
re
,
&
s
->
gb
,
8
);
SKIP_BITS
(
re
,
&
s
->
gb
,
8
);
if
(
level
==
-
128
)
{
level
=
SHOW_UBITS
(
re
,
&
s
->
gb
,
8
)
-
256
;
SKIP_BITS
(
re
,
&
s
->
gb
,
8
);
}
else
if
(
level
==
0
)
{
level
=
SHOW_UBITS
(
re
,
&
s
->
gb
,
8
)
;
SKIP_BITS
(
re
,
&
s
->
gb
,
8
);
}
i
+=
run
;
j
=
scantable
[
i
];
if
(
level
<
0
)
{
level
=
-
level
;
level
=
((
level
*
2
+
1
)
*
qscale
*
quant_matrix
[
j
])
>>
5
;
level
=
(
level
-
1
)
|
1
;
level
=
-
level
;
}
else
{
level
=
((
level
*
2
+
1
)
*
qscale
*
quant_matrix
[
j
])
>>
5
;
level
=
(
level
-
1
)
|
1
;
}
}
if
(
i
>
63
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"ac-tex damaged at %d %d
\n
"
,
s
->
mb_x
,
s
->
mb_y
);
return
-
1
;
}
INIT_2D_VLC_RL
(
ff_rl_mpeg1
,
680
);
INIT_2D_VLC_RL
(
ff_rl_mpeg2
,
674
);
block
[
j
]
=
level
;
if
(((
int32_t
)
GET_CACHE
(
re
,
&
s
->
gb
))
<=
(
int32_t
)
0xBFFFFFFF
)
break
;
UPDATE_CACHE
(
re
,
&
s
->
gb
);
}
end:
LAST_SKIP_BITS
(
re
,
&
s
->
gb
,
2
);
CLOSE_READER
(
re
,
&
s
->
gb
);
}
s
->
block_last_index
[
n
]
=
i
;
return
0
;
}
static
inline
int
get_dmv
(
MpegEncContext
*
s
)
static
inline
int
mpeg1_fast_decode_block_inter
(
MpegEncContext
*
s
,
DCTELEM
*
block
,
int
n
)
{
if
(
get_bits1
(
&
s
->
gb
))
return
1
-
(
get_bits1
(
&
s
->
gb
)
<<
1
);
else
return
0
;
}
int
level
,
i
,
j
,
run
;
RLTable
*
rl
=
&
ff_rl_mpeg1
;
uint8_t
*
const
scantable
=
s
->
intra_scantable
.
permutated
;
const
int
qscale
=
s
->
qscale
;
static
inline
int
get_qscale
(
MpegEncContext
*
s
)
{
int
qscale
=
get_bits
(
&
s
->
gb
,
5
);
if
(
s
->
q_scale_type
)
{
return
non_linear_qscale
[
qscale
];
}
else
{
return
qscale
<<
1
;
}
}
{
OPEN_READER
(
re
,
&
s
->
gb
);
i
=
-
1
;
// special case for first coefficient, no need to add second VLC table
UPDATE_CACHE
(
re
,
&
s
->
gb
);
if
(((
int32_t
)
GET_CACHE
(
re
,
&
s
->
gb
))
<
0
)
{
level
=
(
3
*
qscale
)
>>
1
;
level
=
(
level
-
1
)
|
1
;
if
(
GET_CACHE
(
re
,
&
s
->
gb
)
&
0x40000000
)
level
=
-
level
;
block
[
0
]
=
level
;
i
++
;
SKIP_BITS
(
re
,
&
s
->
gb
,
2
);
if
(((
int32_t
)
GET_CACHE
(
re
,
&
s
->
gb
))
<=
(
int32_t
)
0xBFFFFFFF
)
goto
end
;
}
/* motion type (for MPEG-2) */
#define MT_FIELD 1
#define MT_FRAME 2
#define MT_16X8 2
#define MT_DMV 3
/* now quantify & encode AC coefficients */
for
(;;)
{
GET_RL_VLC
(
level
,
run
,
re
,
&
s
->
gb
,
rl
->
rl_vlc
[
0
],
TEX_VLC_BITS
,
2
,
0
);
static
int
mpeg_decode_mb
(
MpegEncContext
*
s
,
DCTELEM
block
[
12
][
64
])
{
int
i
,
j
,
k
,
cbp
,
val
,
mb_type
,
motion_type
;
const
int
mb_block_count
=
4
+
(
1
<<
s
->
chroma_format
);
if
(
level
!=
0
)
{
i
+=
run
;
j
=
scantable
[
i
];
level
=
((
level
*
2
+
1
)
*
qscale
)
>>
1
;
level
=
(
level
-
1
)
|
1
;
level
=
(
level
^
SHOW_SBITS
(
re
,
&
s
->
gb
,
1
))
-
SHOW_SBITS
(
re
,
&
s
->
gb
,
1
);
SKIP_BITS
(
re
,
&
s
->
gb
,
1
);
}
else
{
/* escape */
run
=
SHOW_UBITS
(
re
,
&
s
->
gb
,
6
)
+
1
;
LAST_SKIP_BITS
(
re
,
&
s
->
gb
,
6
);
UPDATE_CACHE
(
re
,
&
s
->
gb
);
level
=
SHOW_SBITS
(
re
,
&
s
->
gb
,
8
);
SKIP_BITS
(
re
,
&
s
->
gb
,
8
);
if
(
level
==
-
128
)
{
level
=
SHOW_UBITS
(
re
,
&
s
->
gb
,
8
)
-
256
;
SKIP_BITS
(
re
,
&
s
->
gb
,
8
);
}
else
if
(
level
==
0
)
{
level
=
SHOW_UBITS
(
re
,
&
s
->
gb
,
8
)
;
SKIP_BITS
(
re
,
&
s
->
gb
,
8
);
}
i
+=
run
;
j
=
scantable
[
i
];
if
(
level
<
0
)
{
level
=
-
level
;
level
=
((
level
*
2
+
1
)
*
qscale
)
>>
1
;
level
=
(
level
-
1
)
|
1
;
level
=
-
level
;
}
else
{
level
=
((
level
*
2
+
1
)
*
qscale
)
>>
1
;
level
=
(
level
-
1
)
|
1
;
}
}
av_dlog
(
s
->
avctx
,
"decode_mb: x=%d y=%d
\n
"
,
s
->
mb_x
,
s
->
mb_y
);
block
[
j
]
=
level
;
if
(((
int32_t
)
GET_CACHE
(
re
,
&
s
->
gb
))
<=
(
int32_t
)
0xBFFFFFFF
)
break
;
UPDATE_CACHE
(
re
,
&
s
->
gb
);
}
end:
LAST_SKIP_BITS
(
re
,
&
s
->
gb
,
2
);
CLOSE_READER
(
re
,
&
s
->
gb
);
}
s
->
block_last_index
[
n
]
=
i
;
return
0
;
}
assert
(
s
->
mb_skipped
==
0
);
if
(
s
->
mb_skip_run
--
!=
0
)
{
if
(
s
->
pict_type
==
AV_PICTURE_TYPE_P
)
{
s
->
mb_skipped
=
1
;
s
->
current_picture
.
f
.
mb_type
[
s
->
mb_x
+
s
->
mb_y
*
s
->
mb_stride
]
=
MB_TYPE_SKIP
|
MB_TYPE_L0
|
MB_TYPE_16x16
;
}
else
{
int
mb_type
;
static
inline
int
mpeg2_decode_block_non_intra
(
MpegEncContext
*
s
,
DCTELEM
*
block
,
int
n
)
{
int
level
,
i
,
j
,
run
;
RLTable
*
rl
=
&
ff_rl_mpeg1
;
uint8_t
*
const
scantable
=
s
->
intra_scantable
.
permutated
;
const
uint16_t
*
quant_matrix
;
const
int
qscale
=
s
->
qscale
;
int
mismatch
;
if
(
s
->
mb_x
)
mb_type
=
s
->
current_picture
.
f
.
mb_type
[
s
->
mb_x
+
s
->
mb_y
*
s
->
mb_stride
-
1
];
else
mb_type
=
s
->
current_picture
.
f
.
mb_type
[
s
->
mb_width
+
(
s
->
mb_y
-
1
)
*
s
->
mb_stride
-
1
];
// FIXME not sure if this is allowed in MPEG at all
if
(
IS_INTRA
(
mb_type
))
return
-
1
;
mismatch
=
1
;
s
->
current_picture
.
f
.
mb_type
[
s
->
mb_x
+
s
->
mb_y
*
s
->
mb_stride
]
=
mb_type
|
MB_TYPE_SKIP
;
// assert(s->current_picture.f.mb_type[s->mb_x + s->mb_y * s->mb_stride - 1] & (MB_TYPE_16x16 | MB_TYPE_16x8));
{
OPEN_READER
(
re
,
&
s
->
gb
);
i
=
-
1
;
if
(
n
<
4
)
quant_matrix
=
s
->
inter_matrix
;
else
quant_matrix
=
s
->
chroma_inter_matrix
;
if
((
s
->
mv
[
0
][
0
][
0
]
|
s
->
mv
[
0
][
0
][
1
]
|
s
->
mv
[
1
][
0
][
0
]
|
s
->
mv
[
1
][
0
][
1
])
==
0
)
s
->
mb_skipped
=
1
;
// special case for first coefficient, no need to add second VLC table
UPDATE_CACHE
(
re
,
&
s
->
gb
);
if
(((
int32_t
)
GET_CACHE
(
re
,
&
s
->
gb
))
<
0
)
{
level
=
(
3
*
qscale
*
quant_matrix
[
0
])
>>
5
;
if
(
GET_CACHE
(
re
,
&
s
->
gb
)
&
0x40000000
)
level
=
-
level
;
block
[
0
]
=
level
;
mismatch
^=
level
;
i
++
;
SKIP_BITS
(
re
,
&
s
->
gb
,
2
);
if
(((
int32_t
)
GET_CACHE
(
re
,
&
s
->
gb
))
<=
(
int32_t
)
0xBFFFFFFF
)
goto
end
;
}
return
0
;
}
/* now quantify & encode AC coefficients */
for
(;;)
{
GET_RL_VLC
(
level
,
run
,
re
,
&
s
->
gb
,
rl
->
rl_vlc
[
0
],
TEX_VLC_BITS
,
2
,
0
);
switch
(
s
->
pict_type
)
{
default:
case
AV_PICTURE_TYPE_I
:
if
(
get_bits1
(
&
s
->
gb
)
==
0
)
{
if
(
get_bits1
(
&
s
->
gb
)
==
0
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"invalid mb type in I Frame at %d %d
\n
"
,
s
->
mb_x
,
s
->
mb_y
);
if
(
level
!=
0
)
{
i
+=
run
;
j
=
scantable
[
i
];
level
=
((
level
*
2
+
1
)
*
qscale
*
quant_matrix
[
j
])
>>
5
;
level
=
(
level
^
SHOW_SBITS
(
re
,
&
s
->
gb
,
1
))
-
SHOW_SBITS
(
re
,
&
s
->
gb
,
1
);
SKIP_BITS
(
re
,
&
s
->
gb
,
1
);
}
else
{
/* escape */
run
=
SHOW_UBITS
(
re
,
&
s
->
gb
,
6
)
+
1
;
LAST_SKIP_BITS
(
re
,
&
s
->
gb
,
6
);
UPDATE_CACHE
(
re
,
&
s
->
gb
);
level
=
SHOW_SBITS
(
re
,
&
s
->
gb
,
12
);
SKIP_BITS
(
re
,
&
s
->
gb
,
12
);
i
+=
run
;
j
=
scantable
[
i
];
if
(
level
<
0
)
{
level
=
((
-
level
*
2
+
1
)
*
qscale
*
quant_matrix
[
j
])
>>
5
;
level
=
-
level
;
}
else
{
level
=
((
level
*
2
+
1
)
*
qscale
*
quant_matrix
[
j
])
>>
5
;
}
}
if
(
i
>
63
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"ac-tex damaged at %d %d
\n
"
,
s
->
mb_x
,
s
->
mb_y
);
return
-
1
;
}
mb_type
=
MB_TYPE_QUANT
|
MB_TYPE_INTRA
;
}
else
{
mb_type
=
MB_TYPE_INTRA
;
}
break
;
case
AV_PICTURE_TYPE_P
:
mb_type
=
get_vlc2
(
&
s
->
gb
,
mb_ptype_vlc
.
table
,
MB_PTYPE_VLC_BITS
,
1
);
if
(
mb_type
<
0
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"invalid mb type in P Frame at %d %d
\n
"
,
s
->
mb_x
,
s
->
mb_y
);
return
-
1
;
}
mb_type
=
ptype2mb_type
[
mb_type
];
break
;
case
AV_PICTURE_TYPE_B
:
mb_type
=
get_vlc2
(
&
s
->
gb
,
mb_btype_vlc
.
table
,
MB_BTYPE_VLC_BITS
,
1
);
if
(
mb_type
<
0
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"invalid mb type in B Frame at %d %d
\n
"
,
s
->
mb_x
,
s
->
mb_y
);
return
-
1
;
}
mb_type
=
btype2mb_type
[
mb_type
];
break
;
}
av_dlog
(
s
->
avctx
,
"mb_type=%x
\n
"
,
mb_type
);
// motion_type = 0; /* avoid warning */
if
(
IS_INTRA
(
mb_type
))
{
s
->
dsp
.
clear_blocks
(
s
->
block
[
0
]);
if
(
!
s
->
chroma_y_shift
)
{
s
->
dsp
.
clear_blocks
(
s
->
block
[
6
]);
mismatch
^=
level
;
block
[
j
]
=
level
;
if
(((
int32_t
)
GET_CACHE
(
re
,
&
s
->
gb
))
<=
(
int32_t
)
0xBFFFFFFF
)
break
;
UPDATE_CACHE
(
re
,
&
s
->
gb
);
}
end:
LAST_SKIP_BITS
(
re
,
&
s
->
gb
,
2
);
CLOSE_READER
(
re
,
&
s
->
gb
);
}
block
[
63
]
^=
(
mismatch
&
1
);
/* compute DCT type */
if
(
s
->
picture_structure
==
PICT_FRAME
&&
// FIXME add an interlaced_dct coded var?
!
s
->
frame_pred_frame_dct
)
{
s
->
interlaced_dct
=
get_bits1
(
&
s
->
gb
);
}
s
->
block_last_index
[
n
]
=
i
;
return
0
;
}
if
(
IS_QUANT
(
mb_type
))
s
->
qscale
=
get_qscale
(
s
);
static
inline
int
mpeg2_fast_decode_block_non_intra
(
MpegEncContext
*
s
,
DCTELEM
*
block
,
int
n
)
{
int
level
,
i
,
j
,
run
;
RLTable
*
rl
=
&
ff_rl_mpeg1
;
uint8_t
*
const
scantable
=
s
->
intra_scantable
.
permutated
;
const
int
qscale
=
s
->
qscale
;
OPEN_READER
(
re
,
&
s
->
gb
);
i
=
-
1
;
if
(
s
->
concealment_motion_vectors
)
{
/* just parse them */
if
(
s
->
picture_structure
!=
PICT_FRAME
)
skip_bits1
(
&
s
->
gb
);
/* field select */
// special case for first coefficient, no need to add second VLC table
UPDATE_CACHE
(
re
,
&
s
->
gb
);
if
(((
int32_t
)
GET_CACHE
(
re
,
&
s
->
gb
))
<
0
)
{
level
=
(
3
*
qscale
)
>>
1
;
if
(
GET_CACHE
(
re
,
&
s
->
gb
)
&
0x40000000
)
level
=
-
level
;
block
[
0
]
=
level
;
i
++
;
SKIP_BITS
(
re
,
&
s
->
gb
,
2
);
if
(((
int32_t
)
GET_CACHE
(
re
,
&
s
->
gb
))
<=
(
int32_t
)
0xBFFFFFFF
)
goto
end
;
}
s
->
mv
[
0
][
0
][
0
]
=
s
->
last_mv
[
0
][
0
][
0
]
=
s
->
last_mv
[
0
][
1
][
0
]
=
mpeg_decode_motion
(
s
,
s
->
mpeg_f_code
[
0
][
0
],
s
->
last_mv
[
0
][
0
][
0
]);
s
->
mv
[
0
][
0
][
1
]
=
s
->
last_mv
[
0
][
0
][
1
]
=
s
->
last_mv
[
0
][
1
][
1
]
=
mpeg_decode_motion
(
s
,
s
->
mpeg_f_code
[
0
][
1
],
s
->
last_mv
[
0
][
0
][
1
]);
/* now quantify & encode AC coefficients */
for
(;;)
{
GET_RL_VLC
(
level
,
run
,
re
,
&
s
->
gb
,
rl
->
rl_vlc
[
0
],
TEX_VLC_BITS
,
2
,
0
);
skip_bits1
(
&
s
->
gb
);
/* marker */
}
else
memset
(
s
->
last_mv
,
0
,
sizeof
(
s
->
last_mv
));
/* reset mv prediction */
s
->
mb_intra
=
1
;
// if 1, we memcpy blocks in xvmcvideo
if
(
CONFIG_MPEG_XVMC_DECODER
&&
s
->
avctx
->
xvmc_acceleration
>
1
)
{
ff_xvmc_pack_pblocks
(
s
,
-
1
);
// inter are always full blocks
if
(
s
->
swap_uv
)
{
exchange_uv
(
s
);
if
(
level
!=
0
)
{
i
+=
run
;
j
=
scantable
[
i
];
level
=
((
level
*
2
+
1
)
*
qscale
)
>>
1
;
level
=
(
level
^
SHOW_SBITS
(
re
,
&
s
->
gb
,
1
))
-
SHOW_SBITS
(
re
,
&
s
->
gb
,
1
);
SKIP_BITS
(
re
,
&
s
->
gb
,
1
);
}
else
{
/* escape */
run
=
SHOW_UBITS
(
re
,
&
s
->
gb
,
6
)
+
1
;
LAST_SKIP_BITS
(
re
,
&
s
->
gb
,
6
);
UPDATE_CACHE
(
re
,
&
s
->
gb
);
level
=
SHOW_SBITS
(
re
,
&
s
->
gb
,
12
);
SKIP_BITS
(
re
,
&
s
->
gb
,
12
);
i
+=
run
;
j
=
scantable
[
i
];
if
(
level
<
0
)
{
level
=
((
-
level
*
2
+
1
)
*
qscale
)
>>
1
;
level
=
-
level
;
}
else
{
level
=
((
level
*
2
+
1
)
*
qscale
)
>>
1
;
}
}
if
(
s
->
codec_id
==
CODEC_ID_MPEG2VIDEO
)
{
if
(
s
->
flags2
&
CODEC_FLAG2_FAST
)
{
for
(
i
=
0
;
i
<
6
;
i
++
)
{
mpeg2_fast_decode_block_intra
(
s
,
*
s
->
pblocks
[
i
],
i
);
}
block
[
j
]
=
level
;
if
(((
int32_t
)
GET_CACHE
(
re
,
&
s
->
gb
))
<=
(
int32_t
)
0xBFFFFFFF
)
break
;
UPDATE_CACHE
(
re
,
&
s
->
gb
);
}
end:
LAST_SKIP_BITS
(
re
,
&
s
->
gb
,
2
);
CLOSE_READER
(
re
,
&
s
->
gb
);
s
->
block_last_index
[
n
]
=
i
;
return
0
;
}
static
inline
int
mpeg2_decode_block_intra
(
MpegEncContext
*
s
,
DCTELEM
*
block
,
int
n
)
{
int
level
,
dc
,
diff
,
i
,
j
,
run
;
int
component
;
RLTable
*
rl
;
uint8_t
*
const
scantable
=
s
->
intra_scantable
.
permutated
;
const
uint16_t
*
quant_matrix
;
const
int
qscale
=
s
->
qscale
;
int
mismatch
;
/* DC coefficient */
if
(
n
<
4
)
{
quant_matrix
=
s
->
intra_matrix
;
component
=
0
;
}
else
{
quant_matrix
=
s
->
chroma_intra_matrix
;
component
=
(
n
&
1
)
+
1
;
}
diff
=
decode_dc
(
&
s
->
gb
,
component
);
if
(
diff
>=
0xffff
)
return
-
1
;
dc
=
s
->
last_dc
[
component
];
dc
+=
diff
;
s
->
last_dc
[
component
]
=
dc
;
block
[
0
]
=
dc
<<
(
3
-
s
->
intra_dc_precision
);
av_dlog
(
s
->
avctx
,
"dc=%d
\n
"
,
block
[
0
]);
mismatch
=
block
[
0
]
^
1
;
i
=
0
;
if
(
s
->
intra_vlc_format
)
rl
=
&
ff_rl_mpeg2
;
else
rl
=
&
ff_rl_mpeg1
;
{
OPEN_READER
(
re
,
&
s
->
gb
);
/* now quantify & encode AC coefficients */
for
(;;)
{
UPDATE_CACHE
(
re
,
&
s
->
gb
);
GET_RL_VLC
(
level
,
run
,
re
,
&
s
->
gb
,
rl
->
rl_vlc
[
0
],
TEX_VLC_BITS
,
2
,
0
);
if
(
level
==
127
)
{
break
;
}
else
if
(
level
!=
0
)
{
i
+=
run
;
j
=
scantable
[
i
];
level
=
(
level
*
qscale
*
quant_matrix
[
j
])
>>
4
;
level
=
(
level
^
SHOW_SBITS
(
re
,
&
s
->
gb
,
1
))
-
SHOW_SBITS
(
re
,
&
s
->
gb
,
1
);
LAST_SKIP_BITS
(
re
,
&
s
->
gb
,
1
);
}
else
{
for
(
i
=
0
;
i
<
mb_block_count
;
i
++
)
{
if
(
mpeg2_decode_block_intra
(
s
,
*
s
->
pblocks
[
i
],
i
)
<
0
)
return
-
1
;
/* escape */
run
=
SHOW_UBITS
(
re
,
&
s
->
gb
,
6
)
+
1
;
LAST_SKIP_BITS
(
re
,
&
s
->
gb
,
6
);
UPDATE_CACHE
(
re
,
&
s
->
gb
);
level
=
SHOW_SBITS
(
re
,
&
s
->
gb
,
12
);
SKIP_BITS
(
re
,
&
s
->
gb
,
12
);
i
+=
run
;
j
=
scantable
[
i
];
if
(
level
<
0
)
{
level
=
(
-
level
*
qscale
*
quant_matrix
[
j
])
>>
4
;
level
=
-
level
;
}
else
{
level
=
(
level
*
qscale
*
quant_matrix
[
j
])
>>
4
;
}
}
}
else
{
for
(
i
=
0
;
i
<
6
;
i
++
)
{
if
(
mpeg1_decode_block_intra
(
s
,
*
s
->
pblocks
[
i
],
i
)
<
0
)
return
-
1
;
if
(
i
>
63
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"ac-tex damaged at %d %d
\n
"
,
s
->
mb_x
,
s
->
mb_y
);
return
-
1
;
}
mismatch
^=
level
;
block
[
j
]
=
level
;
}
CLOSE_READER
(
re
,
&
s
->
gb
);
}
block
[
63
]
^=
mismatch
&
1
;
s
->
block_last_index
[
n
]
=
i
;
return
0
;
}
static
inline
int
mpeg2_fast_decode_block_intra
(
MpegEncContext
*
s
,
DCTELEM
*
block
,
int
n
)
{
int
level
,
dc
,
diff
,
j
,
run
;
int
component
;
RLTable
*
rl
;
uint8_t
*
scantable
=
s
->
intra_scantable
.
permutated
;
const
uint16_t
*
quant_matrix
;
const
int
qscale
=
s
->
qscale
;
/* DC coefficient */
if
(
n
<
4
)
{
quant_matrix
=
s
->
intra_matrix
;
component
=
0
;
}
else
{
if
(
mb_type
&
MB_TYPE_ZERO_MV
)
{
assert
(
mb_type
&
MB_TYPE_CBP
);
quant_matrix
=
s
->
chroma_intra_matrix
;
component
=
(
n
&
1
)
+
1
;
}
diff
=
decode_dc
(
&
s
->
gb
,
component
);
if
(
diff
>=
0xffff
)
return
-
1
;
dc
=
s
->
last_dc
[
component
];
dc
+=
diff
;
s
->
last_dc
[
component
]
=
dc
;
block
[
0
]
=
dc
<<
(
3
-
s
->
intra_dc_precision
);
if
(
s
->
intra_vlc_format
)
rl
=
&
ff_rl_mpeg2
;
else
rl
=
&
ff_rl_mpeg1
;
s
->
mv_dir
=
MV_DIR_FORWARD
;
if
(
s
->
picture_structure
==
PICT_FRAME
)
{
if
(
!
s
->
frame_pred_frame_dct
)
s
->
interlaced_dct
=
get_bits1
(
&
s
->
gb
);
s
->
mv_type
=
MV_TYPE_16X16
;
{
OPEN_READER
(
re
,
&
s
->
gb
);
/* now quantify & encode AC coefficients */
for
(;;)
{
UPDATE_CACHE
(
re
,
&
s
->
gb
);
GET_RL_VLC
(
level
,
run
,
re
,
&
s
->
gb
,
rl
->
rl_vlc
[
0
],
TEX_VLC_BITS
,
2
,
0
);
if
(
level
==
127
)
{
break
;
}
else
if
(
level
!=
0
)
{
scantable
+=
run
;
j
=
*
scantable
;
level
=
(
level
*
qscale
*
quant_matrix
[
j
])
>>
4
;
level
=
(
level
^
SHOW_SBITS
(
re
,
&
s
->
gb
,
1
))
-
SHOW_SBITS
(
re
,
&
s
->
gb
,
1
);
LAST_SKIP_BITS
(
re
,
&
s
->
gb
,
1
);
}
else
{
s
->
mv_type
=
MV_TYPE_FIELD
;
mb_type
|=
MB_TYPE_INTERLACED
;
s
->
field_select
[
0
][
0
]
=
s
->
picture_structure
-
1
;
/* escape */
run
=
SHOW_UBITS
(
re
,
&
s
->
gb
,
6
)
+
1
;
LAST_SKIP_BITS
(
re
,
&
s
->
gb
,
6
);
UPDATE_CACHE
(
re
,
&
s
->
gb
);
level
=
SHOW_SBITS
(
re
,
&
s
->
gb
,
12
);
SKIP_BITS
(
re
,
&
s
->
gb
,
12
);
scantable
+=
run
;
j
=
*
scantable
;
if
(
level
<
0
)
{
level
=
(
-
level
*
qscale
*
quant_matrix
[
j
])
>>
4
;
level
=
-
level
;
}
else
{
level
=
(
level
*
qscale
*
quant_matrix
[
j
])
>>
4
;
}
}
if
(
IS_QUANT
(
mb_type
))
s
->
qscale
=
get_qscale
(
s
);
block
[
j
]
=
level
;
}
CLOSE_READER
(
re
,
&
s
->
gb
);
}
s
->
last_mv
[
0
][
0
][
0
]
=
0
;
s
->
last_mv
[
0
][
0
][
1
]
=
0
;
s
->
last_mv
[
0
][
1
][
0
]
=
0
;
s
->
last_mv
[
0
][
1
][
1
]
=
0
;
s
->
mv
[
0
][
0
][
0
]
=
0
;
s
->
mv
[
0
][
0
][
1
]
=
0
;
s
->
block_last_index
[
n
]
=
scantable
-
s
->
intra_scantable
.
permutated
;
return
0
;
}
uint8_t
ff_mpeg12_static_rl_table_store
[
2
][
2
][
2
*
MAX_RUN
+
MAX_LEVEL
+
3
];
#define INIT_2D_VLC_RL(rl, static_size)\
{\
static RL_VLC_ELEM rl_vlc_table[static_size];\
INIT_VLC_STATIC(&rl.vlc, TEX_VLC_BITS, rl.n + 2,\
&rl.table_vlc[0][1], 4, 2,\
&rl.table_vlc[0][0], 4, 2, static_size);\
\
rl.rl_vlc[0] = rl_vlc_table;\
init_2d_vlc_rl(&rl);\
}
static
void
init_2d_vlc_rl
(
RLTable
*
rl
)
{
int
i
;
for
(
i
=
0
;
i
<
rl
->
vlc
.
table_size
;
i
++
)
{
int
code
=
rl
->
vlc
.
table
[
i
][
0
];
int
len
=
rl
->
vlc
.
table
[
i
][
1
];
int
level
,
run
;
if
(
len
==
0
)
{
// illegal code
run
=
65
;
level
=
MAX_LEVEL
;
}
else
if
(
len
<
0
)
{
//more bits needed
run
=
0
;
level
=
code
;
}
else
{
assert
(
mb_type
&
MB_TYPE_L0L1
);
// FIXME decide if MBs in field pictures are MB_TYPE_INTERLACED
/* get additional motion vector type */
if
(
s
->
frame_pred_frame_dct
)
motion_type
=
MT_FRAME
;
else
{
motion_type
=
get_bits
(
&
s
->
gb
,
2
);
if
(
s
->
picture_structure
==
PICT_FRAME
&&
HAS_CBP
(
mb_type
))
s
->
interlaced_dct
=
get_bits1
(
&
s
->
gb
)
;
if
(
code
==
rl
->
n
)
{
//esc
run
=
65
;
level
=
0
;
}
else
if
(
code
==
rl
->
n
+
1
)
{
//eob
run
=
0
;
level
=
127
;
}
else
{
run
=
rl
->
table_run
[
code
]
+
1
;
level
=
rl
->
table_level
[
code
]
;
}
}
rl
->
rl_vlc
[
0
][
i
].
len
=
len
;
rl
->
rl_vlc
[
0
][
i
].
level
=
level
;
rl
->
rl_vlc
[
0
][
i
].
run
=
run
;
}
}
if
(
IS_QUANT
(
mb_type
))
s
->
qscale
=
get_qscale
(
s
);
/* motion vectors */
s
->
mv_dir
=
(
mb_type
>>
13
)
&
3
;
av_dlog
(
s
->
avctx
,
"motion_type=%d
\n
"
,
motion_type
);
switch
(
motion_type
)
{
case
MT_FRAME
:
/* or MT_16X8 */
if
(
s
->
picture_structure
==
PICT_FRAME
)
{
mb_type
|=
MB_TYPE_16x16
;
s
->
mv_type
=
MV_TYPE_16X16
;
for
(
i
=
0
;
i
<
2
;
i
++
)
{
if
(
USES_LIST
(
mb_type
,
i
))
{
/* MT_FRAME */
s
->
mv
[
i
][
0
][
0
]
=
s
->
last_mv
[
i
][
0
][
0
]
=
s
->
last_mv
[
i
][
1
][
0
]
=
mpeg_decode_motion
(
s
,
s
->
mpeg_f_code
[
i
][
0
],
s
->
last_mv
[
i
][
0
][
0
]);
s
->
mv
[
i
][
0
][
1
]
=
s
->
last_mv
[
i
][
0
][
1
]
=
s
->
last_mv
[
i
][
1
][
1
]
=
mpeg_decode_motion
(
s
,
s
->
mpeg_f_code
[
i
][
1
],
s
->
last_mv
[
i
][
0
][
1
]);
/* full_pel: only for MPEG-1 */
if
(
s
->
full_pel
[
i
])
{
s
->
mv
[
i
][
0
][
0
]
<<=
1
;
s
->
mv
[
i
][
0
][
1
]
<<=
1
;
}
}
}
}
else
{
mb_type
|=
MB_TYPE_16x8
|
MB_TYPE_INTERLACED
;
s
->
mv_type
=
MV_TYPE_16X8
;
for
(
i
=
0
;
i
<
2
;
i
++
)
{
if
(
USES_LIST
(
mb_type
,
i
))
{
/* MT_16X8 */
for
(
j
=
0
;
j
<
2
;
j
++
)
{
s
->
field_select
[
i
][
j
]
=
get_bits1
(
&
s
->
gb
);
for
(
k
=
0
;
k
<
2
;
k
++
)
{
val
=
mpeg_decode_motion
(
s
,
s
->
mpeg_f_code
[
i
][
k
],
s
->
last_mv
[
i
][
j
][
k
]);
s
->
last_mv
[
i
][
j
][
k
]
=
val
;
s
->
mv
[
i
][
j
][
k
]
=
val
;
}
}
}
}
}
break
;
case
MT_FIELD
:
s
->
mv_type
=
MV_TYPE_FIELD
;
if
(
s
->
picture_structure
==
PICT_FRAME
)
{
mb_type
|=
MB_TYPE_16x8
|
MB_TYPE_INTERLACED
;
for
(
i
=
0
;
i
<
2
;
i
++
)
{
if
(
USES_LIST
(
mb_type
,
i
))
{
for
(
j
=
0
;
j
<
2
;
j
++
)
{
s
->
field_select
[
i
][
j
]
=
get_bits1
(
&
s
->
gb
);
val
=
mpeg_decode_motion
(
s
,
s
->
mpeg_f_code
[
i
][
0
],
s
->
last_mv
[
i
][
j
][
0
]);
s
->
last_mv
[
i
][
j
][
0
]
=
val
;
s
->
mv
[
i
][
j
][
0
]
=
val
;
av_dlog
(
s
->
avctx
,
"fmx=%d
\n
"
,
val
);
val
=
mpeg_decode_motion
(
s
,
s
->
mpeg_f_code
[
i
][
1
],
s
->
last_mv
[
i
][
j
][
1
]
>>
1
);
s
->
last_mv
[
i
][
j
][
1
]
=
val
<<
1
;
s
->
mv
[
i
][
j
][
1
]
=
val
;
av_dlog
(
s
->
avctx
,
"fmy=%d
\n
"
,
val
);
}
}
}
}
else
{
mb_type
|=
MB_TYPE_16x16
|
MB_TYPE_INTERLACED
;
for
(
i
=
0
;
i
<
2
;
i
++
)
{
if
(
USES_LIST
(
mb_type
,
i
))
{
s
->
field_select
[
i
][
0
]
=
get_bits1
(
&
s
->
gb
);
for
(
k
=
0
;
k
<
2
;
k
++
)
{
val
=
mpeg_decode_motion
(
s
,
s
->
mpeg_f_code
[
i
][
k
],
s
->
last_mv
[
i
][
0
][
k
]);
s
->
last_mv
[
i
][
0
][
k
]
=
val
;
s
->
last_mv
[
i
][
1
][
k
]
=
val
;
s
->
mv
[
i
][
0
][
k
]
=
val
;
}
}
}
}
break
;
case
MT_DMV
:
s
->
mv_type
=
MV_TYPE_DMV
;
for
(
i
=
0
;
i
<
2
;
i
++
)
{
if
(
USES_LIST
(
mb_type
,
i
))
{
int
dmx
,
dmy
,
mx
,
my
,
m
;
const
int
my_shift
=
s
->
picture_structure
==
PICT_FRAME
;
mx
=
mpeg_decode_motion
(
s
,
s
->
mpeg_f_code
[
i
][
0
],
s
->
last_mv
[
i
][
0
][
0
]);
s
->
last_mv
[
i
][
0
][
0
]
=
mx
;
s
->
last_mv
[
i
][
1
][
0
]
=
mx
;
dmx
=
get_dmv
(
s
);
my
=
mpeg_decode_motion
(
s
,
s
->
mpeg_f_code
[
i
][
1
],
s
->
last_mv
[
i
][
0
][
1
]
>>
my_shift
);
dmy
=
get_dmv
(
s
);
void
ff_mpeg12_common_init
(
MpegEncContext
*
s
)
{
s
->
y_dc_scale_table
=
s
->
c_dc_scale_table
=
ff_mpeg2_dc_scale_table
[
s
->
intra_dc_precision
];
s
->
last_mv
[
i
][
0
][
1
]
=
my
<<
my_shift
;
s
->
last_mv
[
i
][
1
][
1
]
=
my
<<
my_shift
;
}
s
->
mv
[
i
][
0
][
0
]
=
mx
;
s
->
mv
[
i
][
0
][
1
]
=
my
;
s
->
mv
[
i
][
1
][
0
]
=
mx
;
// not used
s
->
mv
[
i
][
1
][
1
]
=
my
;
// not used
void
ff_mpeg1_clean_buffers
(
MpegEncContext
*
s
)
{
s
->
last_dc
[
0
]
=
1
<<
(
7
+
s
->
intra_dc_precision
);
s
->
last_dc
[
1
]
=
s
->
last_dc
[
0
];
s
->
last_dc
[
2
]
=
s
->
last_dc
[
0
];
memset
(
s
->
last_mv
,
0
,
sizeof
(
s
->
last_mv
));
}
if
(
s
->
picture_structure
==
PICT_FRAME
)
{
mb_type
|=
MB_TYPE_16x16
|
MB_TYPE_INTERLACED
;
// m = 1 + 2 * s->top_field_first;
m
=
s
->
top_field_first
?
1
:
3
;
/******************************************/
/* decoding */
/* top -> top pred */
s
->
mv
[
i
][
2
][
0
]
=
((
mx
*
m
+
(
mx
>
0
))
>>
1
)
+
dmx
;
s
->
mv
[
i
][
2
][
1
]
=
((
my
*
m
+
(
my
>
0
))
>>
1
)
+
dmy
-
1
;
m
=
4
-
m
;
s
->
mv
[
i
][
3
][
0
]
=
((
mx
*
m
+
(
mx
>
0
))
>>
1
)
+
dmx
;
s
->
mv
[
i
][
3
][
1
]
=
((
my
*
m
+
(
my
>
0
))
>>
1
)
+
dmy
+
1
;
}
else
{
mb_type
|=
MB_TYPE_16x16
;
VLC
ff_dc_lum_vlc
;
VLC
ff_dc_chroma_vlc
;
s
->
mv
[
i
][
2
][
0
]
=
((
mx
+
(
mx
>
0
))
>>
1
)
+
dmx
;
s
->
mv
[
i
][
2
][
1
]
=
((
my
+
(
my
>
0
))
>>
1
)
+
dmy
;
if
(
s
->
picture_structure
==
PICT_TOP_FIELD
)
s
->
mv
[
i
][
2
][
1
]
--
;
else
s
->
mv
[
i
][
2
][
1
]
++
;
}
}
}
break
;
default:
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"00 motion_type at %d %d
\n
"
,
s
->
mb_x
,
s
->
mb_y
);
return
-
1
;
}
}
static
VLC
mbincr_vlc
;
static
VLC
mb_ptype_vlc
;
static
VLC
mb_btype_vlc
;
static
VLC
mb_pat_vlc
;
s
->
mb_intra
=
0
;
if
(
HAS_CBP
(
mb_type
))
{
s
->
dsp
.
clear_blocks
(
s
->
block
[
0
])
;
av_cold
void
ff_mpeg12_init_vlcs
(
void
)
{
static
int
done
=
0
;
cbp
=
get_vlc2
(
&
s
->
gb
,
mb_pat_vlc
.
table
,
MB_PAT_VLC_BITS
,
1
);
if
(
mb_block_count
>
6
)
{
cbp
<<=
mb_block_count
-
6
;
cbp
|=
get_bits
(
&
s
->
gb
,
mb_block_count
-
6
);
s
->
dsp
.
clear_blocks
(
s
->
block
[
6
]);
}
if
(
cbp
<=
0
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"invalid cbp at %d %d
\n
"
,
s
->
mb_x
,
s
->
mb_y
);
return
-
1
;
}
if
(
!
done
)
{
done
=
1
;
//if 1, we memcpy blocks in xvmcvideo
if
(
CONFIG_MPEG_XVMC_DECODER
&&
s
->
avctx
->
xvmc_acceleration
>
1
)
{
ff_xvmc_pack_pblocks
(
s
,
cbp
);
if
(
s
->
swap_uv
)
{
exchange_uv
(
s
);
}
}
INIT_VLC_STATIC
(
&
ff_dc_lum_vlc
,
DC_VLC_BITS
,
12
,
ff_mpeg12_vlc_dc_lum_bits
,
1
,
1
,
ff_mpeg12_vlc_dc_lum_code
,
2
,
2
,
512
);
INIT_VLC_STATIC
(
&
ff_dc_chroma_vlc
,
DC_VLC_BITS
,
12
,
ff_mpeg12_vlc_dc_chroma_bits
,
1
,
1
,
ff_mpeg12_vlc_dc_chroma_code
,
2
,
2
,
514
);
INIT_VLC_STATIC
(
&
mv_vlc
,
MV_VLC_BITS
,
17
,
&
ff_mpeg12_mbMotionVectorTable
[
0
][
1
],
2
,
1
,
&
ff_mpeg12_mbMotionVectorTable
[
0
][
0
],
2
,
1
,
518
);
INIT_VLC_STATIC
(
&
mbincr_vlc
,
MBINCR_VLC_BITS
,
36
,
&
ff_mpeg12_mbAddrIncrTable
[
0
][
1
],
2
,
1
,
&
ff_mpeg12_mbAddrIncrTable
[
0
][
0
],
2
,
1
,
538
);
INIT_VLC_STATIC
(
&
mb_pat_vlc
,
MB_PAT_VLC_BITS
,
64
,
&
ff_mpeg12_mbPatTable
[
0
][
1
],
2
,
1
,
&
ff_mpeg12_mbPatTable
[
0
][
0
],
2
,
1
,
512
);
if
(
s
->
codec_id
==
CODEC_ID_MPEG2VIDEO
)
{
if
(
s
->
flags2
&
CODEC_FLAG2_FAST
)
{
for
(
i
=
0
;
i
<
6
;
i
++
)
{
if
(
cbp
&
32
)
{
mpeg2_fast_decode_block_non_intra
(
s
,
*
s
->
pblocks
[
i
],
i
);
}
else
{
s
->
block_last_index
[
i
]
=
-
1
;
}
cbp
+=
cbp
;
}
}
else
{
cbp
<<=
12
-
mb_block_count
;
INIT_VLC_STATIC
(
&
mb_ptype_vlc
,
MB_PTYPE_VLC_BITS
,
7
,
&
table_mb_ptype
[
0
][
1
],
2
,
1
,
&
table_mb_ptype
[
0
][
0
],
2
,
1
,
64
);
INIT_VLC_STATIC
(
&
mb_btype_vlc
,
MB_BTYPE_VLC_BITS
,
11
,
&
table_mb_btype
[
0
][
1
],
2
,
1
,
&
table_mb_btype
[
0
][
0
],
2
,
1
,
64
);
init_rl
(
&
ff_rl_mpeg1
,
ff_mpeg12_static_rl_table_store
[
0
]);
init_rl
(
&
ff_rl_mpeg2
,
ff_mpeg12_static_rl_table_store
[
1
]);
for
(
i
=
0
;
i
<
mb_block_count
;
i
++
)
{
if
(
cbp
&
(
1
<<
11
))
{
if
(
mpeg2_decode_block_non_intra
(
s
,
*
s
->
pblocks
[
i
],
i
)
<
0
)
return
-
1
;
}
else
{
s
->
block_last_index
[
i
]
=
-
1
;
}
cbp
+=
cbp
;
}
}
}
else
{
if
(
s
->
flags2
&
CODEC_FLAG2_FAST
)
{
for
(
i
=
0
;
i
<
6
;
i
++
)
{
if
(
cbp
&
32
)
{
mpeg1_fast_decode_block_inter
(
s
,
*
s
->
pblocks
[
i
],
i
);
}
else
{
s
->
block_last_index
[
i
]
=
-
1
;
}
cbp
+=
cbp
;
}
}
else
{
for
(
i
=
0
;
i
<
6
;
i
++
)
{
if
(
cbp
&
32
)
{
if
(
mpeg1_decode_block_inter
(
s
,
*
s
->
pblocks
[
i
],
i
)
<
0
)
return
-
1
;
}
else
{
s
->
block_last_index
[
i
]
=
-
1
;
}
cbp
+=
cbp
;
}
}
}
}
else
{
for
(
i
=
0
;
i
<
12
;
i
++
)
s
->
block_last_index
[
i
]
=
-
1
;
}
INIT_2D_VLC_RL
(
ff_rl_mpeg1
,
680
);
INIT_2D_VLC_RL
(
ff_rl_mpeg2
,
674
);
}
s
->
current_picture
.
f
.
mb_type
[
s
->
mb_x
+
s
->
mb_y
*
s
->
mb_stride
]
=
mb_type
;
return
0
;
}
/* as H.263, but only 17 codes */
static
int
mpeg_decode_motion
(
MpegEncContext
*
s
,
int
fcode
,
int
pred
)
static
inline
int
get_dmv
(
MpegEncContext
*
s
)
{
int
code
,
sign
,
val
,
l
,
shift
;
if
(
get_bits1
(
&
s
->
gb
))
return
1
-
(
get_bits1
(
&
s
->
gb
)
<<
1
);
else
return
0
;
}
code
=
get_vlc2
(
&
s
->
gb
,
mv_vlc
.
table
,
MV_VLC_BITS
,
2
);
if
(
code
==
0
)
{
return
pred
;
}
if
(
code
<
0
)
{
return
0xffff
;
static
inline
int
get_qscale
(
MpegEncContext
*
s
)
{
int
qscale
=
get_bits
(
&
s
->
gb
,
5
);
if
(
s
->
q_scale_type
)
{
return
non_linear_qscale
[
qscale
];
}
else
{
return
qscale
<<
1
;
}
}
sign
=
get_bits1
(
&
s
->
gb
);
shift
=
fcode
-
1
;
val
=
code
;
if
(
shift
)
{
val
=
(
val
-
1
)
<<
shift
;
val
|=
get_bits
(
&
s
->
gb
,
shift
);
val
++
;
}
if
(
sign
)
val
=
-
val
;
val
+=
pred
;
static
void
exchange_uv
(
MpegEncContext
*
s
)
{
DCTELEM
(
*
tmp
)[
64
];
/* modulo decoding */
l
=
INT_BIT
-
5
-
shift
;
val
=
(
val
<<
l
)
>>
l
;
return
val
;
tmp
=
s
->
pblocks
[
4
];
s
->
pblocks
[
4
]
=
s
->
pblocks
[
5
];
s
->
pblocks
[
5
]
=
tmp
;
}
static
inline
int
mpeg1_decode_block_intra
(
MpegEncContext
*
s
,
DCTELEM
*
block
,
int
n
)
{
int
level
,
dc
,
diff
,
i
,
j
,
run
;
int
component
;
RLTable
*
rl
=
&
ff_rl_mpeg1
;
uint8_t
*
const
scantable
=
s
->
intra_scantable
.
permutated
;
const
uint16_t
*
quant_matrix
=
s
->
intra_matrix
;
const
int
qscale
=
s
->
qscale
;
/* motion type (for MPEG-2) */
#define MT_FIELD 1
#define MT_FRAME 2
#define MT_16X8 2
#define MT_DMV 3
/* DC coefficient */
component
=
(
n
<=
3
?
0
:
n
-
4
+
1
);
diff
=
decode_dc
(
&
s
->
gb
,
component
);
if
(
diff
>=
0xffff
)
return
-
1
;
dc
=
s
->
last_dc
[
component
];
dc
+=
diff
;
s
->
last_dc
[
component
]
=
dc
;
block
[
0
]
=
dc
*
quant_matrix
[
0
];
av_dlog
(
s
->
avctx
,
"dc=%d diff=%d
\n
"
,
dc
,
diff
);
i
=
0
;
{
OPEN_READER
(
re
,
&
s
->
gb
);
/* now quantify & encode AC coefficients */
for
(;;)
{
UPDATE_CACHE
(
re
,
&
s
->
gb
);
GET_RL_VLC
(
level
,
run
,
re
,
&
s
->
gb
,
rl
->
rl_vlc
[
0
],
TEX_VLC_BITS
,
2
,
0
);
static
int
mpeg_decode_mb
(
MpegEncContext
*
s
,
DCTELEM
block
[
12
][
64
])
{
int
i
,
j
,
k
,
cbp
,
val
,
mb_type
,
motion_type
;
const
int
mb_block_count
=
4
+
(
1
<<
s
->
chroma_format
);
if
(
level
==
127
)
{
break
;
}
else
if
(
level
!=
0
)
{
i
+=
run
;
j
=
scantable
[
i
];
level
=
(
level
*
qscale
*
quant_matrix
[
j
])
>>
4
;
level
=
(
level
-
1
)
|
1
;
level
=
(
level
^
SHOW_SBITS
(
re
,
&
s
->
gb
,
1
))
-
SHOW_SBITS
(
re
,
&
s
->
gb
,
1
);
LAST_SKIP_BITS
(
re
,
&
s
->
gb
,
1
);
}
else
{
/* escape */
run
=
SHOW_UBITS
(
re
,
&
s
->
gb
,
6
)
+
1
;
LAST_SKIP_BITS
(
re
,
&
s
->
gb
,
6
);
UPDATE_CACHE
(
re
,
&
s
->
gb
);
level
=
SHOW_SBITS
(
re
,
&
s
->
gb
,
8
);
SKIP_BITS
(
re
,
&
s
->
gb
,
8
);
if
(
level
==
-
128
)
{
level
=
SHOW_UBITS
(
re
,
&
s
->
gb
,
8
)
-
256
;
LAST_SKIP_BITS
(
re
,
&
s
->
gb
,
8
);
}
else
if
(
level
==
0
)
{
level
=
SHOW_UBITS
(
re
,
&
s
->
gb
,
8
)
;
LAST_SKIP_BITS
(
re
,
&
s
->
gb
,
8
);
}
i
+=
run
;
j
=
scantable
[
i
];
if
(
level
<
0
)
{
level
=
-
level
;
level
=
(
level
*
qscale
*
quant_matrix
[
j
])
>>
4
;
level
=
(
level
-
1
)
|
1
;
level
=
-
level
;
}
else
{
level
=
(
level
*
qscale
*
quant_matrix
[
j
])
>>
4
;
level
=
(
level
-
1
)
|
1
;
}
}
if
(
i
>
63
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"ac-tex damaged at %d %d
\n
"
,
s
->
mb_x
,
s
->
mb_y
);
return
-
1
;
}
av_dlog
(
s
->
avctx
,
"decode_mb: x=%d y=%d
\n
"
,
s
->
mb_x
,
s
->
mb_y
);
block
[
j
]
=
level
;
}
CLOSE_READER
(
re
,
&
s
->
gb
);
}
s
->
block_last_index
[
n
]
=
i
;
return
0
;
}
assert
(
s
->
mb_skipped
==
0
);
int
ff_mpeg1_decode_block_intra
(
MpegEncContext
*
s
,
DCTELEM
*
block
,
int
n
)
{
return
mpeg1_decode_block_intra
(
s
,
block
,
n
);
}
if
(
s
->
mb_skip_run
--
!=
0
)
{
if
(
s
->
pict_type
==
AV_PICTURE_TYPE_P
)
{
s
->
mb_skipped
=
1
;
s
->
current_picture
.
f
.
mb_type
[
s
->
mb_x
+
s
->
mb_y
*
s
->
mb_stride
]
=
MB_TYPE_SKIP
|
MB_TYPE_L0
|
MB_TYPE_16x16
;
}
else
{
int
mb_type
;
static
inline
int
mpeg1_decode_block_inter
(
MpegEncContext
*
s
,
DCTELEM
*
block
,
int
n
)
{
int
level
,
i
,
j
,
run
;
RLTable
*
rl
=
&
ff_rl_mpeg1
;
uint8_t
*
const
scantable
=
s
->
intra_scantable
.
permutated
;
const
uint16_t
*
quant_matrix
=
s
->
inter_matrix
;
const
int
qscale
=
s
->
qscale
;
if
(
s
->
mb_x
)
mb_type
=
s
->
current_picture
.
f
.
mb_type
[
s
->
mb_x
+
s
->
mb_y
*
s
->
mb_stride
-
1
];
else
mb_type
=
s
->
current_picture
.
f
.
mb_type
[
s
->
mb_width
+
(
s
->
mb_y
-
1
)
*
s
->
mb_stride
-
1
];
// FIXME not sure if this is allowed in MPEG at all
if
(
IS_INTRA
(
mb_type
))
return
-
1
;
s
->
current_picture
.
f
.
mb_type
[
s
->
mb_x
+
s
->
mb_y
*
s
->
mb_stride
]
=
mb_type
|
MB_TYPE_SKIP
;
// assert(s->current_picture.f.mb_type[s->mb_x + s->mb_y * s->mb_stride - 1] & (MB_TYPE_16x16 | MB_TYPE_16x8));
{
OPEN_READER
(
re
,
&
s
->
gb
);
i
=
-
1
;
// special case for first coefficient, no need to add second VLC table
UPDATE_CACHE
(
re
,
&
s
->
gb
);
if
(((
int32_t
)
GET_CACHE
(
re
,
&
s
->
gb
))
<
0
)
{
level
=
(
3
*
qscale
*
quant_matrix
[
0
])
>>
5
;
level
=
(
level
-
1
)
|
1
;
if
(
GET_CACHE
(
re
,
&
s
->
gb
)
&
0x40000000
)
level
=
-
level
;
block
[
0
]
=
level
;
i
++
;
SKIP_BITS
(
re
,
&
s
->
gb
,
2
);
if
(((
int32_t
)
GET_CACHE
(
re
,
&
s
->
gb
))
<=
(
int32_t
)
0xBFFFFFFF
)
goto
end
;
if
((
s
->
mv
[
0
][
0
][
0
]
|
s
->
mv
[
0
][
0
][
1
]
|
s
->
mv
[
1
][
0
][
0
]
|
s
->
mv
[
1
][
0
][
1
])
==
0
)
s
->
mb_skipped
=
1
;
}
/* now quantify & encode AC coefficients */
for
(;;)
{
GET_RL_VLC
(
level
,
run
,
re
,
&
s
->
gb
,
rl
->
rl_vlc
[
0
],
TEX_VLC_BITS
,
2
,
0
);
if
(
level
!=
0
)
{
i
+=
run
;
j
=
scantable
[
i
];
level
=
((
level
*
2
+
1
)
*
qscale
*
quant_matrix
[
j
])
>>
5
;
level
=
(
level
-
1
)
|
1
;
level
=
(
level
^
SHOW_SBITS
(
re
,
&
s
->
gb
,
1
))
-
SHOW_SBITS
(
re
,
&
s
->
gb
,
1
);
SKIP_BITS
(
re
,
&
s
->
gb
,
1
);
}
else
{
/* escape */
run
=
SHOW_UBITS
(
re
,
&
s
->
gb
,
6
)
+
1
;
LAST_SKIP_BITS
(
re
,
&
s
->
gb
,
6
);
UPDATE_CACHE
(
re
,
&
s
->
gb
);
level
=
SHOW_SBITS
(
re
,
&
s
->
gb
,
8
);
SKIP_BITS
(
re
,
&
s
->
gb
,
8
);
if
(
level
==
-
128
)
{
level
=
SHOW_UBITS
(
re
,
&
s
->
gb
,
8
)
-
256
;
SKIP_BITS
(
re
,
&
s
->
gb
,
8
);
}
else
if
(
level
==
0
)
{
level
=
SHOW_UBITS
(
re
,
&
s
->
gb
,
8
)
;
SKIP_BITS
(
re
,
&
s
->
gb
,
8
);
}
i
+=
run
;
j
=
scantable
[
i
];
if
(
level
<
0
)
{
level
=
-
level
;
level
=
((
level
*
2
+
1
)
*
qscale
*
quant_matrix
[
j
])
>>
5
;
level
=
(
level
-
1
)
|
1
;
level
=
-
level
;
}
else
{
level
=
((
level
*
2
+
1
)
*
qscale
*
quant_matrix
[
j
])
>>
5
;
level
=
(
level
-
1
)
|
1
;
}
}
if
(
i
>
63
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"ac-tex damaged at %d %d
\n
"
,
s
->
mb_x
,
s
->
mb_y
);
return
0
;
}
switch
(
s
->
pict_type
)
{
default:
case
AV_PICTURE_TYPE_I
:
if
(
get_bits1
(
&
s
->
gb
)
==
0
)
{
if
(
get_bits1
(
&
s
->
gb
)
==
0
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"invalid mb type in I Frame at %d %d
\n
"
,
s
->
mb_x
,
s
->
mb_y
);
return
-
1
;
}
block
[
j
]
=
level
;
if
(((
int32_t
)
GET_CACHE
(
re
,
&
s
->
gb
))
<=
(
int32_t
)
0xBFFFFFFF
)
break
;
UPDATE_CACHE
(
re
,
&
s
->
gb
);
mb_type
=
MB_TYPE_QUANT
|
MB_TYPE_INTRA
;
}
else
{
mb_type
=
MB_TYPE_INTRA
;
}
end:
LAST_SKIP_BITS
(
re
,
&
s
->
gb
,
2
);
CLOSE_READER
(
re
,
&
s
->
gb
);
break
;
case
AV_PICTURE_TYPE_P
:
mb_type
=
get_vlc2
(
&
s
->
gb
,
mb_ptype_vlc
.
table
,
MB_PTYPE_VLC_BITS
,
1
);
if
(
mb_type
<
0
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"invalid mb type in P Frame at %d %d
\n
"
,
s
->
mb_x
,
s
->
mb_y
);
return
-
1
;
}
mb_type
=
ptype2mb_type
[
mb_type
];
break
;
case
AV_PICTURE_TYPE_B
:
mb_type
=
get_vlc2
(
&
s
->
gb
,
mb_btype_vlc
.
table
,
MB_BTYPE_VLC_BITS
,
1
);
if
(
mb_type
<
0
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"invalid mb type in B Frame at %d %d
\n
"
,
s
->
mb_x
,
s
->
mb_y
);
return
-
1
;
}
mb_type
=
btype2mb_type
[
mb_type
];
break
;
}
s
->
block_last_index
[
n
]
=
i
;
return
0
;
}
static
inline
int
mpeg1_fast_decode_block_inter
(
MpegEncContext
*
s
,
DCTELEM
*
block
,
int
n
)
{
int
level
,
i
,
j
,
run
;
RLTable
*
rl
=
&
ff_rl_mpeg1
;
uint8_t
*
const
scantable
=
s
->
intra_scantable
.
permutated
;
const
int
qscale
=
s
->
qscale
;
av_dlog
(
s
->
avctx
,
"mb_type=%x
\n
"
,
mb_type
);
// motion_type = 0; /* avoid warning */
if
(
IS_INTRA
(
mb_type
))
{
s
->
dsp
.
clear_blocks
(
s
->
block
[
0
]);
{
OPEN_READER
(
re
,
&
s
->
gb
);
i
=
-
1
;
// special case for first coefficient, no need to add second VLC table
UPDATE_CACHE
(
re
,
&
s
->
gb
);
if
(((
int32_t
)
GET_CACHE
(
re
,
&
s
->
gb
))
<
0
)
{
level
=
(
3
*
qscale
)
>>
1
;
level
=
(
level
-
1
)
|
1
;
if
(
GET_CACHE
(
re
,
&
s
->
gb
)
&
0x40000000
)
level
=
-
level
;
block
[
0
]
=
level
;
i
++
;
SKIP_BITS
(
re
,
&
s
->
gb
,
2
);
if
(((
int32_t
)
GET_CACHE
(
re
,
&
s
->
gb
))
<=
(
int32_t
)
0xBFFFFFFF
)
goto
end
;
if
(
!
s
->
chroma_y_shift
)
{
s
->
dsp
.
clear_blocks
(
s
->
block
[
6
]);
}
/* now quantify & encode AC coefficients */
for
(;;)
{
GET_RL_VLC
(
level
,
run
,
re
,
&
s
->
gb
,
rl
->
rl_vlc
[
0
],
TEX_VLC_BITS
,
2
,
0
);
if
(
level
!=
0
)
{
i
+=
run
;
j
=
scantable
[
i
];
level
=
((
level
*
2
+
1
)
*
qscale
)
>>
1
;
level
=
(
level
-
1
)
|
1
;
level
=
(
level
^
SHOW_SBITS
(
re
,
&
s
->
gb
,
1
))
-
SHOW_SBITS
(
re
,
&
s
->
gb
,
1
);
SKIP_BITS
(
re
,
&
s
->
gb
,
1
);
}
else
{
/* escape */
run
=
SHOW_UBITS
(
re
,
&
s
->
gb
,
6
)
+
1
;
LAST_SKIP_BITS
(
re
,
&
s
->
gb
,
6
);
UPDATE_CACHE
(
re
,
&
s
->
gb
);
level
=
SHOW_SBITS
(
re
,
&
s
->
gb
,
8
);
SKIP_BITS
(
re
,
&
s
->
gb
,
8
);
if
(
level
==
-
128
)
{
level
=
SHOW_UBITS
(
re
,
&
s
->
gb
,
8
)
-
256
;
SKIP_BITS
(
re
,
&
s
->
gb
,
8
);
}
else
if
(
level
==
0
)
{
level
=
SHOW_UBITS
(
re
,
&
s
->
gb
,
8
)
;
SKIP_BITS
(
re
,
&
s
->
gb
,
8
);
}
i
+=
run
;
j
=
scantable
[
i
];
if
(
level
<
0
)
{
level
=
-
level
;
level
=
((
level
*
2
+
1
)
*
qscale
)
>>
1
;
level
=
(
level
-
1
)
|
1
;
level
=
-
level
;
}
else
{
level
=
((
level
*
2
+
1
)
*
qscale
)
>>
1
;
level
=
(
level
-
1
)
|
1
;
}
}
block
[
j
]
=
level
;
if
(((
int32_t
)
GET_CACHE
(
re
,
&
s
->
gb
))
<=
(
int32_t
)
0xBFFFFFFF
)
break
;
UPDATE_CACHE
(
re
,
&
s
->
gb
);
/* compute DCT type */
if
(
s
->
picture_structure
==
PICT_FRAME
&&
// FIXME add an interlaced_dct coded var?
!
s
->
frame_pred_frame_dct
)
{
s
->
interlaced_dct
=
get_bits1
(
&
s
->
gb
);
}
end:
LAST_SKIP_BITS
(
re
,
&
s
->
gb
,
2
);
CLOSE_READER
(
re
,
&
s
->
gb
);
}
s
->
block_last_index
[
n
]
=
i
;
return
0
;
}
static
inline
int
mpeg2_decode_block_non_intra
(
MpegEncContext
*
s
,
DCTELEM
*
block
,
int
n
)
{
int
level
,
i
,
j
,
run
;
RLTable
*
rl
=
&
ff_rl_mpeg1
;
uint8_t
*
const
scantable
=
s
->
intra_scantable
.
permutated
;
const
uint16_t
*
quant_matrix
;
const
int
qscale
=
s
->
qscale
;
int
mismatch
;
if
(
IS_QUANT
(
mb_type
))
s
->
qscale
=
get_qscale
(
s
);
mismatch
=
1
;
if
(
s
->
concealment_motion_vectors
)
{
/* just parse them */
if
(
s
->
picture_structure
!=
PICT_FRAME
)
skip_bits1
(
&
s
->
gb
);
/* field select */
{
OPEN_READER
(
re
,
&
s
->
gb
);
i
=
-
1
;
if
(
n
<
4
)
quant_matrix
=
s
->
inter_matrix
;
else
quant_matrix
=
s
->
chroma_inter_matrix
;
s
->
mv
[
0
][
0
][
0
]
=
s
->
last_mv
[
0
][
0
][
0
]
=
s
->
last_mv
[
0
][
1
][
0
]
=
mpeg_decode_motion
(
s
,
s
->
mpeg_f_code
[
0
][
0
],
s
->
last_mv
[
0
][
0
][
0
]);
s
->
mv
[
0
][
0
][
1
]
=
s
->
last_mv
[
0
][
0
][
1
]
=
s
->
last_mv
[
0
][
1
][
1
]
=
mpeg_decode_motion
(
s
,
s
->
mpeg_f_code
[
0
][
1
],
s
->
last_mv
[
0
][
0
][
1
]);
// special case for first coefficient, no need to add second VLC table
UPDATE_CACHE
(
re
,
&
s
->
gb
);
if
(((
int32_t
)
GET_CACHE
(
re
,
&
s
->
gb
))
<
0
)
{
level
=
(
3
*
qscale
*
quant_matrix
[
0
])
>>
5
;
if
(
GET_CACHE
(
re
,
&
s
->
gb
)
&
0x40000000
)
level
=
-
level
;
block
[
0
]
=
level
;
mismatch
^=
level
;
i
++
;
SKIP_BITS
(
re
,
&
s
->
gb
,
2
);
if
(((
int32_t
)
GET_CACHE
(
re
,
&
s
->
gb
))
<=
(
int32_t
)
0xBFFFFFFF
)
goto
end
;
skip_bits1
(
&
s
->
gb
);
/* marker */
}
else
memset
(
s
->
last_mv
,
0
,
sizeof
(
s
->
last_mv
));
/* reset mv prediction */
s
->
mb_intra
=
1
;
// if 1, we memcpy blocks in xvmcvideo
if
(
CONFIG_MPEG_XVMC_DECODER
&&
s
->
avctx
->
xvmc_acceleration
>
1
)
{
ff_xvmc_pack_pblocks
(
s
,
-
1
);
// inter are always full blocks
if
(
s
->
swap_uv
)
{
exchange_uv
(
s
);
}
}
/* now quantify & encode AC coefficients */
for
(;;)
{
GET_RL_VLC
(
level
,
run
,
re
,
&
s
->
gb
,
rl
->
rl_vlc
[
0
],
TEX_VLC_BITS
,
2
,
0
);
if
(
level
!=
0
)
{
i
+=
run
;
j
=
scantable
[
i
];
level
=
((
level
*
2
+
1
)
*
qscale
*
quant_matrix
[
j
])
>>
5
;
level
=
(
level
^
SHOW_SBITS
(
re
,
&
s
->
gb
,
1
))
-
SHOW_SBITS
(
re
,
&
s
->
gb
,
1
);
SKIP_BITS
(
re
,
&
s
->
gb
,
1
);
if
(
s
->
codec_id
==
CODEC_ID_MPEG2VIDEO
)
{
if
(
s
->
flags2
&
CODEC_FLAG2_FAST
)
{
for
(
i
=
0
;
i
<
6
;
i
++
)
{
mpeg2_fast_decode_block_intra
(
s
,
*
s
->
pblocks
[
i
],
i
);
}
}
else
{
/* escape */
run
=
SHOW_UBITS
(
re
,
&
s
->
gb
,
6
)
+
1
;
LAST_SKIP_BITS
(
re
,
&
s
->
gb
,
6
);
UPDATE_CACHE
(
re
,
&
s
->
gb
);
level
=
SHOW_SBITS
(
re
,
&
s
->
gb
,
12
);
SKIP_BITS
(
re
,
&
s
->
gb
,
12
);
i
+=
run
;
j
=
scantable
[
i
];
if
(
level
<
0
)
{
level
=
((
-
level
*
2
+
1
)
*
qscale
*
quant_matrix
[
j
])
>>
5
;
level
=
-
level
;
}
else
{
level
=
((
level
*
2
+
1
)
*
qscale
*
quant_matrix
[
j
])
>>
5
;
for
(
i
=
0
;
i
<
mb_block_count
;
i
++
)
{
if
(
mpeg2_decode_block_intra
(
s
,
*
s
->
pblocks
[
i
],
i
)
<
0
)
return
-
1
;
}
}
if
(
i
>
63
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"ac-tex damaged at %d %d
\n
"
,
s
->
mb_x
,
s
->
mb_y
);
return
-
1
;
}
else
{
for
(
i
=
0
;
i
<
6
;
i
++
)
{
if
(
mpeg1_decode_block_intra
(
s
,
*
s
->
pblocks
[
i
],
i
)
<
0
)
return
-
1
;
}
mismatch
^=
level
;
block
[
j
]
=
level
;
if
(((
int32_t
)
GET_CACHE
(
re
,
&
s
->
gb
))
<=
(
int32_t
)
0xBFFFFFFF
)
break
;
UPDATE_CACHE
(
re
,
&
s
->
gb
);
}
end:
LAST_SKIP_BITS
(
re
,
&
s
->
gb
,
2
);
CLOSE_READER
(
re
,
&
s
->
gb
);
}
block
[
63
]
^=
(
mismatch
&
1
);
}
else
{
if
(
mb_type
&
MB_TYPE_ZERO_MV
)
{
assert
(
mb_type
&
MB_TYPE_CBP
);
s
->
block_last_index
[
n
]
=
i
;
return
0
;
}
s
->
mv_dir
=
MV_DIR_FORWARD
;
if
(
s
->
picture_structure
==
PICT_FRAME
)
{
if
(
!
s
->
frame_pred_frame_dct
)
s
->
interlaced_dct
=
get_bits1
(
&
s
->
gb
);
s
->
mv_type
=
MV_TYPE_16X16
;
}
else
{
s
->
mv_type
=
MV_TYPE_FIELD
;
mb_type
|=
MB_TYPE_INTERLACED
;
s
->
field_select
[
0
][
0
]
=
s
->
picture_structure
-
1
;
}
static
inline
int
mpeg2_fast_decode_block_non_intra
(
MpegEncContext
*
s
,
DCTELEM
*
block
,
int
n
)
{
int
level
,
i
,
j
,
run
;
RLTable
*
rl
=
&
ff_rl_mpeg1
;
uint8_t
*
const
scantable
=
s
->
intra_scantable
.
permutated
;
const
int
qscale
=
s
->
qscale
;
OPEN_READER
(
re
,
&
s
->
gb
);
i
=
-
1
;
if
(
IS_QUANT
(
mb_type
))
s
->
qscale
=
get_qscale
(
s
);
// special case for first coefficient, no need to add second VLC table
UPDATE_CACHE
(
re
,
&
s
->
gb
);
if
(((
int32_t
)
GET_CACHE
(
re
,
&
s
->
gb
))
<
0
)
{
level
=
(
3
*
qscale
)
>>
1
;
if
(
GET_CACHE
(
re
,
&
s
->
gb
)
&
0x40000000
)
level
=
-
level
;
block
[
0
]
=
level
;
i
++
;
SKIP_BITS
(
re
,
&
s
->
gb
,
2
);
if
(((
int32_t
)
GET_CACHE
(
re
,
&
s
->
gb
))
<=
(
int32_t
)
0xBFFFFFFF
)
goto
end
;
}
s
->
last_mv
[
0
][
0
][
0
]
=
0
;
s
->
last_mv
[
0
][
0
][
1
]
=
0
;
s
->
last_mv
[
0
][
1
][
0
]
=
0
;
s
->
last_mv
[
0
][
1
][
1
]
=
0
;
s
->
mv
[
0
][
0
][
0
]
=
0
;
s
->
mv
[
0
][
0
][
1
]
=
0
;
}
else
{
assert
(
mb_type
&
MB_TYPE_L0L1
);
// FIXME decide if MBs in field pictures are MB_TYPE_INTERLACED
/* get additional motion vector type */
if
(
s
->
frame_pred_frame_dct
)
motion_type
=
MT_FRAME
;
else
{
motion_type
=
get_bits
(
&
s
->
gb
,
2
);
if
(
s
->
picture_structure
==
PICT_FRAME
&&
HAS_CBP
(
mb_type
))
s
->
interlaced_dct
=
get_bits1
(
&
s
->
gb
);
}
/* now quantify & encode AC coefficients */
for
(;;)
{
GET_RL_VLC
(
level
,
run
,
re
,
&
s
->
gb
,
rl
->
rl_vlc
[
0
],
TEX_VLC_BITS
,
2
,
0
);
if
(
IS_QUANT
(
mb_type
))
s
->
qscale
=
get_qscale
(
s
);
if
(
level
!=
0
)
{
i
+=
run
;
j
=
scantable
[
i
];
level
=
((
level
*
2
+
1
)
*
qscale
)
>>
1
;
level
=
(
level
^
SHOW_SBITS
(
re
,
&
s
->
gb
,
1
))
-
SHOW_SBITS
(
re
,
&
s
->
gb
,
1
);
SKIP_BITS
(
re
,
&
s
->
gb
,
1
);
}
else
{
/* escape */
run
=
SHOW_UBITS
(
re
,
&
s
->
gb
,
6
)
+
1
;
LAST_SKIP_BITS
(
re
,
&
s
->
gb
,
6
);
UPDATE_CACHE
(
re
,
&
s
->
gb
);
level
=
SHOW_SBITS
(
re
,
&
s
->
gb
,
12
);
SKIP_BITS
(
re
,
&
s
->
gb
,
12
);
/* motion vectors */
s
->
mv_dir
=
(
mb_type
>>
13
)
&
3
;
av_dlog
(
s
->
avctx
,
"motion_type=%d
\n
"
,
motion_type
);
switch
(
motion_type
)
{
case
MT_FRAME
:
/* or MT_16X8 */
if
(
s
->
picture_structure
==
PICT_FRAME
)
{
mb_type
|=
MB_TYPE_16x16
;
s
->
mv_type
=
MV_TYPE_16X16
;
for
(
i
=
0
;
i
<
2
;
i
++
)
{
if
(
USES_LIST
(
mb_type
,
i
))
{
/* MT_FRAME */
s
->
mv
[
i
][
0
][
0
]
=
s
->
last_mv
[
i
][
0
][
0
]
=
s
->
last_mv
[
i
][
1
][
0
]
=
mpeg_decode_motion
(
s
,
s
->
mpeg_f_code
[
i
][
0
],
s
->
last_mv
[
i
][
0
][
0
]);
s
->
mv
[
i
][
0
][
1
]
=
s
->
last_mv
[
i
][
0
][
1
]
=
s
->
last_mv
[
i
][
1
][
1
]
=
mpeg_decode_motion
(
s
,
s
->
mpeg_f_code
[
i
][
1
],
s
->
last_mv
[
i
][
0
][
1
]);
/* full_pel: only for MPEG-1 */
if
(
s
->
full_pel
[
i
])
{
s
->
mv
[
i
][
0
][
0
]
<<=
1
;
s
->
mv
[
i
][
0
][
1
]
<<=
1
;
}
}
}
}
else
{
mb_type
|=
MB_TYPE_16x8
|
MB_TYPE_INTERLACED
;
s
->
mv_type
=
MV_TYPE_16X8
;
for
(
i
=
0
;
i
<
2
;
i
++
)
{
if
(
USES_LIST
(
mb_type
,
i
))
{
/* MT_16X8 */
for
(
j
=
0
;
j
<
2
;
j
++
)
{
s
->
field_select
[
i
][
j
]
=
get_bits1
(
&
s
->
gb
);
for
(
k
=
0
;
k
<
2
;
k
++
)
{
val
=
mpeg_decode_motion
(
s
,
s
->
mpeg_f_code
[
i
][
k
],
s
->
last_mv
[
i
][
j
][
k
]);
s
->
last_mv
[
i
][
j
][
k
]
=
val
;
s
->
mv
[
i
][
j
][
k
]
=
val
;
}
}
}
}
}
break
;
case
MT_FIELD
:
s
->
mv_type
=
MV_TYPE_FIELD
;
if
(
s
->
picture_structure
==
PICT_FRAME
)
{
mb_type
|=
MB_TYPE_16x8
|
MB_TYPE_INTERLACED
;
for
(
i
=
0
;
i
<
2
;
i
++
)
{
if
(
USES_LIST
(
mb_type
,
i
))
{
for
(
j
=
0
;
j
<
2
;
j
++
)
{
s
->
field_select
[
i
][
j
]
=
get_bits1
(
&
s
->
gb
);
val
=
mpeg_decode_motion
(
s
,
s
->
mpeg_f_code
[
i
][
0
],
s
->
last_mv
[
i
][
j
][
0
]);
s
->
last_mv
[
i
][
j
][
0
]
=
val
;
s
->
mv
[
i
][
j
][
0
]
=
val
;
av_dlog
(
s
->
avctx
,
"fmx=%d
\n
"
,
val
);
val
=
mpeg_decode_motion
(
s
,
s
->
mpeg_f_code
[
i
][
1
],
s
->
last_mv
[
i
][
j
][
1
]
>>
1
);
s
->
last_mv
[
i
][
j
][
1
]
=
val
<<
1
;
s
->
mv
[
i
][
j
][
1
]
=
val
;
av_dlog
(
s
->
avctx
,
"fmy=%d
\n
"
,
val
);
}
}
}
}
else
{
mb_type
|=
MB_TYPE_16x16
|
MB_TYPE_INTERLACED
;
for
(
i
=
0
;
i
<
2
;
i
++
)
{
if
(
USES_LIST
(
mb_type
,
i
))
{
s
->
field_select
[
i
][
0
]
=
get_bits1
(
&
s
->
gb
);
for
(
k
=
0
;
k
<
2
;
k
++
)
{
val
=
mpeg_decode_motion
(
s
,
s
->
mpeg_f_code
[
i
][
k
],
s
->
last_mv
[
i
][
0
][
k
]);
s
->
last_mv
[
i
][
0
][
k
]
=
val
;
s
->
last_mv
[
i
][
1
][
k
]
=
val
;
s
->
mv
[
i
][
0
][
k
]
=
val
;
}
}
}
}
break
;
case
MT_DMV
:
s
->
mv_type
=
MV_TYPE_DMV
;
for
(
i
=
0
;
i
<
2
;
i
++
)
{
if
(
USES_LIST
(
mb_type
,
i
))
{
int
dmx
,
dmy
,
mx
,
my
,
m
;
const
int
my_shift
=
s
->
picture_structure
==
PICT_FRAME
;
mx
=
mpeg_decode_motion
(
s
,
s
->
mpeg_f_code
[
i
][
0
],
s
->
last_mv
[
i
][
0
][
0
]);
s
->
last_mv
[
i
][
0
][
0
]
=
mx
;
s
->
last_mv
[
i
][
1
][
0
]
=
mx
;
dmx
=
get_dmv
(
s
);
my
=
mpeg_decode_motion
(
s
,
s
->
mpeg_f_code
[
i
][
1
],
s
->
last_mv
[
i
][
0
][
1
]
>>
my_shift
);
dmy
=
get_dmv
(
s
);
i
+=
run
;
j
=
scantable
[
i
];
if
(
level
<
0
)
{
level
=
((
-
level
*
2
+
1
)
*
qscale
)
>>
1
;
level
=
-
level
;
}
else
{
level
=
((
level
*
2
+
1
)
*
qscale
)
>>
1
;
}
}
block
[
j
]
=
level
;
if
(((
int32_t
)
GET_CACHE
(
re
,
&
s
->
gb
))
<=
(
int32_t
)
0xBFFFFFFF
)
break
;
UPDATE_CACHE
(
re
,
&
s
->
gb
);
}
end:
LAST_SKIP_BITS
(
re
,
&
s
->
gb
,
2
);
CLOSE_READER
(
re
,
&
s
->
gb
);
s
->
block_last_index
[
n
]
=
i
;
return
0
;
}
s
->
last_mv
[
i
][
0
][
1
]
=
my
<<
my_shift
;
s
->
last_mv
[
i
][
1
][
1
]
=
my
<<
my_shift
;
s
->
mv
[
i
][
0
][
0
]
=
mx
;
s
->
mv
[
i
][
0
][
1
]
=
my
;
s
->
mv
[
i
][
1
][
0
]
=
mx
;
// not used
s
->
mv
[
i
][
1
][
1
]
=
my
;
// not used
static
inline
int
mpeg2_decode_block_intra
(
MpegEncContext
*
s
,
DCTELEM
*
block
,
int
n
)
{
int
level
,
dc
,
diff
,
i
,
j
,
run
;
int
component
;
RLTable
*
rl
;
uint8_t
*
const
scantable
=
s
->
intra_scantable
.
permutated
;
const
uint16_t
*
quant_matrix
;
const
int
qscale
=
s
->
qscale
;
int
mismatch
;
if
(
s
->
picture_structure
==
PICT_FRAME
)
{
mb_type
|=
MB_TYPE_16x16
|
MB_TYPE_INTERLACED
;
/* DC coefficient */
if
(
n
<
4
)
{
quant_matrix
=
s
->
intra_matrix
;
component
=
0
;
}
else
{
quant_matrix
=
s
->
chroma_intra_matrix
;
component
=
(
n
&
1
)
+
1
;
}
diff
=
decode_dc
(
&
s
->
gb
,
component
);
if
(
diff
>=
0xffff
)
return
-
1
;
dc
=
s
->
last_dc
[
component
];
dc
+=
diff
;
s
->
last_dc
[
component
]
=
dc
;
block
[
0
]
=
dc
<<
(
3
-
s
->
intra_dc_precision
);
av_dlog
(
s
->
avctx
,
"dc=%d
\n
"
,
block
[
0
]);
mismatch
=
block
[
0
]
^
1
;
i
=
0
;
if
(
s
->
intra_vlc_format
)
rl
=
&
ff_rl_mpeg2
;
else
rl
=
&
ff_rl_mpeg1
;
// m = 1 + 2 * s->top_field_first;
m
=
s
->
top_field_first
?
1
:
3
;
{
OPEN_READER
(
re
,
&
s
->
gb
);
/* now quantify & encode AC coefficients */
for
(;;)
{
UPDATE_CACHE
(
re
,
&
s
->
gb
);
GET_RL_VLC
(
level
,
run
,
re
,
&
s
->
gb
,
rl
->
rl_vlc
[
0
],
TEX_VLC_BITS
,
2
,
0
);
/* top -> top pred */
s
->
mv
[
i
][
2
][
0
]
=
((
mx
*
m
+
(
mx
>
0
))
>>
1
)
+
dmx
;
s
->
mv
[
i
][
2
][
1
]
=
((
my
*
m
+
(
my
>
0
))
>>
1
)
+
dmy
-
1
;
m
=
4
-
m
;
s
->
mv
[
i
][
3
][
0
]
=
((
mx
*
m
+
(
mx
>
0
))
>>
1
)
+
dmx
;
s
->
mv
[
i
][
3
][
1
]
=
((
my
*
m
+
(
my
>
0
))
>>
1
)
+
dmy
+
1
;
}
else
{
mb_type
|=
MB_TYPE_16x16
;
if
(
level
==
127
)
{
break
;
}
else
if
(
level
!=
0
)
{
i
+=
run
;
j
=
scantable
[
i
];
level
=
(
level
*
qscale
*
quant_matrix
[
j
])
>>
4
;
level
=
(
level
^
SHOW_SBITS
(
re
,
&
s
->
gb
,
1
))
-
SHOW_SBITS
(
re
,
&
s
->
gb
,
1
);
LAST_SKIP_BITS
(
re
,
&
s
->
gb
,
1
);
}
else
{
/* escape */
run
=
SHOW_UBITS
(
re
,
&
s
->
gb
,
6
)
+
1
;
LAST_SKIP_BITS
(
re
,
&
s
->
gb
,
6
);
UPDATE_CACHE
(
re
,
&
s
->
gb
);
level
=
SHOW_SBITS
(
re
,
&
s
->
gb
,
12
);
SKIP_BITS
(
re
,
&
s
->
gb
,
12
);
i
+=
run
;
j
=
scantable
[
i
];
if
(
level
<
0
)
{
level
=
(
-
level
*
qscale
*
quant_matrix
[
j
])
>>
4
;
level
=
-
level
;
}
else
{
level
=
(
level
*
qscale
*
quant_matrix
[
j
])
>>
4
;
s
->
mv
[
i
][
2
][
0
]
=
((
mx
+
(
mx
>
0
))
>>
1
)
+
dmx
;
s
->
mv
[
i
][
2
][
1
]
=
((
my
+
(
my
>
0
))
>>
1
)
+
dmy
;
if
(
s
->
picture_structure
==
PICT_TOP_FIELD
)
s
->
mv
[
i
][
2
][
1
]
--
;
else
s
->
mv
[
i
][
2
][
1
]
++
;
}
}
}
}
if
(
i
>
63
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"
ac-tex damaged
at %d %d
\n
"
,
s
->
mb_x
,
s
->
mb_y
);
break
;
default:
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"
00 motion_type
at %d %d
\n
"
,
s
->
mb_x
,
s
->
mb_y
);
return
-
1
;
}
mismatch
^=
level
;
block
[
j
]
=
level
;
}
CLOSE_READER
(
re
,
&
s
->
gb
);
}
block
[
63
]
^=
mismatch
&
1
;
s
->
block_last_index
[
n
]
=
i
;
return
0
;
}
s
->
mb_intra
=
0
;
if
(
HAS_CBP
(
mb_type
))
{
s
->
dsp
.
clear_blocks
(
s
->
block
[
0
]);
static
inline
int
mpeg2_fast_decode_block_intra
(
MpegEncContext
*
s
,
DCTELEM
*
block
,
int
n
)
{
int
level
,
dc
,
diff
,
j
,
run
;
int
component
;
RLTable
*
rl
;
uint8_t
*
scantable
=
s
->
intra_scantable
.
permutated
;
const
uint16_t
*
quant_matrix
;
const
int
qscale
=
s
->
qscale
;
cbp
=
get_vlc2
(
&
s
->
gb
,
mb_pat_vlc
.
table
,
MB_PAT_VLC_BITS
,
1
);
if
(
mb_block_count
>
6
)
{
cbp
<<=
mb_block_count
-
6
;
cbp
|=
get_bits
(
&
s
->
gb
,
mb_block_count
-
6
);
s
->
dsp
.
clear_blocks
(
s
->
block
[
6
]);
}
if
(
cbp
<=
0
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"invalid cbp at %d %d
\n
"
,
s
->
mb_x
,
s
->
mb_y
);
return
-
1
;
}
/* DC coefficient */
if
(
n
<
4
)
{
quant_matrix
=
s
->
intra_matrix
;
component
=
0
;
}
else
{
quant_matrix
=
s
->
chroma_intra_matrix
;
component
=
(
n
&
1
)
+
1
;
}
diff
=
decode_dc
(
&
s
->
gb
,
component
);
if
(
diff
>=
0xffff
)
return
-
1
;
dc
=
s
->
last_dc
[
component
];
dc
+=
diff
;
s
->
last_dc
[
component
]
=
dc
;
block
[
0
]
=
dc
<<
(
3
-
s
->
intra_dc_precision
);
if
(
s
->
intra_vlc_format
)
rl
=
&
ff_rl_mpeg2
;
else
rl
=
&
ff_rl_mpeg1
;
//if 1, we memcpy blocks in xvmcvideo
if
(
CONFIG_MPEG_XVMC_DECODER
&&
s
->
avctx
->
xvmc_acceleration
>
1
)
{
ff_xvmc_pack_pblocks
(
s
,
cbp
);
if
(
s
->
swap_uv
)
{
exchange_uv
(
s
);
}
}
{
OPEN_READER
(
re
,
&
s
->
gb
);
/* now quantify & encode AC coefficients */
for
(;;)
{
UPDATE_CACHE
(
re
,
&
s
->
gb
);
GET_RL_VLC
(
level
,
run
,
re
,
&
s
->
gb
,
rl
->
rl_vlc
[
0
],
TEX_VLC_BITS
,
2
,
0
);
if
(
s
->
codec_id
==
CODEC_ID_MPEG2VIDEO
)
{
if
(
s
->
flags2
&
CODEC_FLAG2_FAST
)
{
for
(
i
=
0
;
i
<
6
;
i
++
)
{
if
(
cbp
&
32
)
{
mpeg2_fast_decode_block_non_intra
(
s
,
*
s
->
pblocks
[
i
],
i
);
}
else
{
s
->
block_last_index
[
i
]
=
-
1
;
}
cbp
+=
cbp
;
}
}
else
{
cbp
<<=
12
-
mb_block_count
;
if
(
level
==
127
)
{
break
;
}
else
if
(
level
!=
0
)
{
scantable
+=
run
;
j
=
*
scantable
;
level
=
(
level
*
qscale
*
quant_matrix
[
j
])
>>
4
;
level
=
(
level
^
SHOW_SBITS
(
re
,
&
s
->
gb
,
1
))
-
SHOW_SBITS
(
re
,
&
s
->
gb
,
1
);
LAST_SKIP_BITS
(
re
,
&
s
->
gb
,
1
);
for
(
i
=
0
;
i
<
mb_block_count
;
i
++
)
{
if
(
cbp
&
(
1
<<
11
))
{
if
(
mpeg2_decode_block_non_intra
(
s
,
*
s
->
pblocks
[
i
],
i
)
<
0
)
return
-
1
;
}
else
{
s
->
block_last_index
[
i
]
=
-
1
;
}
cbp
+=
cbp
;
}
}
}
else
{
/* escape */
run
=
SHOW_UBITS
(
re
,
&
s
->
gb
,
6
)
+
1
;
LAST_SKIP_BITS
(
re
,
&
s
->
gb
,
6
);
UPDATE_CACHE
(
re
,
&
s
->
gb
);
level
=
SHOW_SBITS
(
re
,
&
s
->
gb
,
12
);
SKIP_BITS
(
re
,
&
s
->
gb
,
12
);
scantable
+=
run
;
j
=
*
scantable
;
if
(
level
<
0
)
{
level
=
(
-
level
*
qscale
*
quant_matrix
[
j
])
>>
4
;
level
=
-
level
;
if
(
s
->
flags2
&
CODEC_FLAG2_FAST
)
{
for
(
i
=
0
;
i
<
6
;
i
++
)
{
if
(
cbp
&
32
)
{
mpeg1_fast_decode_block_inter
(
s
,
*
s
->
pblocks
[
i
],
i
);
}
else
{
s
->
block_last_index
[
i
]
=
-
1
;
}
cbp
+=
cbp
;
}
}
else
{
level
=
(
level
*
qscale
*
quant_matrix
[
j
])
>>
4
;
for
(
i
=
0
;
i
<
6
;
i
++
)
{
if
(
cbp
&
32
)
{
if
(
mpeg1_decode_block_inter
(
s
,
*
s
->
pblocks
[
i
],
i
)
<
0
)
return
-
1
;
}
else
{
s
->
block_last_index
[
i
]
=
-
1
;
}
cbp
+=
cbp
;
}
}
}
block
[
j
]
=
level
;
}
else
{
for
(
i
=
0
;
i
<
12
;
i
++
)
s
->
block_last_index
[
i
]
=
-
1
;
}
CLOSE_READER
(
re
,
&
s
->
gb
);
}
s
->
block_last_index
[
n
]
=
scantable
-
s
->
intra_scantable
.
permutated
;
s
->
current_picture
.
f
.
mb_type
[
s
->
mb_x
+
s
->
mb_y
*
s
->
mb_stride
]
=
mb_type
;
return
0
;
}
...
...
@@ -1193,6 +1186,11 @@ static void quant_matrix_rebuild(uint16_t *matrix, const uint8_t *old_perm,
}
}
static
const
enum
PixelFormat
pixfmt_xvmc_mpg2_420
[]
=
{
PIX_FMT_XVMC_MPEG2_IDCT
,
PIX_FMT_XVMC_MPEG2_MC
,
PIX_FMT_NONE
};
static
enum
PixelFormat
mpeg_get_pixelformat
(
AVCodecContext
*
avctx
)
{
Mpeg1Context
*
s1
=
avctx
->
priv_data
;
...
...
@@ -1573,15 +1571,6 @@ static void mpeg_decode_picture_coding_extension(Mpeg1Context *s1)
av_dlog
(
s
->
avctx
,
"progressive_frame=%d
\n
"
,
s
->
progressive_frame
);
}
static
void
exchange_uv
(
MpegEncContext
*
s
)
{
DCTELEM
(
*
tmp
)[
64
];
tmp
=
s
->
pblocks
[
4
];
s
->
pblocks
[
4
]
=
s
->
pblocks
[
5
];
s
->
pblocks
[
5
]
=
tmp
;
}
static
int
mpeg_field_start
(
MpegEncContext
*
s
,
const
uint8_t
*
buf
,
int
buf_size
)
{
AVCodecContext
*
avctx
=
s
->
avctx
;
...
...
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