Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
F
ffmpeg
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
submodule
ffmpeg
Commits
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 @@
...
@@ -49,1069 +49,1062 @@
#define MB_PTYPE_VLC_BITS 6
#define MB_PTYPE_VLC_BITS 6
#define MB_BTYPE_VLC_BITS 6
#define MB_BTYPE_VLC_BITS 6
static
inline
int
mpeg1_decode_block_intra
(
MpegEncContext
*
s
,
DCTELEM
*
block
,
int
n
);
static
VLC
mv_vlc
;
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
const
enum
PixelFormat
pixfmt_xvmc_mpg2_420
[]
=
{
/* as H.263, but only 17 codes */
PIX_FMT_XVMC_MPEG2_IDCT
,
static
int
mpeg_decode_motion
(
MpegEncContext
*
s
,
int
fcode
,
int
pred
)
PIX_FMT_XVMC_MPEG2_MC
,
{
PIX_FMT_NONE
}
;
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)\
/* modulo decoding */
{\
l
=
INT_BIT
-
5
-
shift
;
static RL_VLC_ELEM rl_vlc_table[static_size];\
val
=
(
val
<<
l
)
>>
l
;
INIT_VLC_STATIC(&rl.vlc, TEX_VLC_BITS, rl.n + 2,\
return
val
;
&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
)
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
++
)
{
/* DC coefficient */
int
code
=
rl
->
vlc
.
table
[
i
][
0
];
component
=
(
n
<=
3
?
0
:
n
-
4
+
1
);
int
len
=
rl
->
vlc
.
table
[
i
][
1
];
diff
=
decode_dc
(
&
s
->
gb
,
component
);
int
level
,
run
;
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
if
(
level
==
127
)
{
run
=
65
;
break
;
level
=
MAX_LEVEL
;
}
else
if
(
level
!=
0
)
{
}
else
if
(
len
<
0
)
{
//more bits needed
i
+=
run
;
run
=
0
;
j
=
scantable
[
i
];
level
=
code
;
level
=
(
level
*
qscale
*
quant_matrix
[
j
])
>>
4
;
}
else
{
level
=
(
level
-
1
)
|
1
;
if
(
code
==
rl
->
n
)
{
//esc
level
=
(
level
^
SHOW_SBITS
(
re
,
&
s
->
gb
,
1
))
-
SHOW_SBITS
(
re
,
&
s
->
gb
,
1
);
run
=
65
;
LAST_SKIP_BITS
(
re
,
&
s
->
gb
,
1
);
level
=
0
;
}
else
if
(
code
==
rl
->
n
+
1
)
{
//eob
run
=
0
;
level
=
127
;
}
else
{
}
else
{
run
=
rl
->
table_run
[
code
]
+
1
;
/* escape */
level
=
rl
->
table_level
[
code
];
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
;
CLOSE_READER
(
re
,
&
s
->
gb
);
rl
->
rl_vlc
[
0
][
i
].
level
=
level
;
rl
->
rl_vlc
[
0
][
i
].
run
=
run
;
}
}
s
->
block_last_index
[
n
]
=
i
;
return
0
;
}
}
void
ff_mpeg12_common_init
(
MpegEncContext
*
s
)
int
ff_mpeg1_decode_block_intra
(
MpegEncContext
*
s
,
DCTELEM
*
block
,
int
n
)
{
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
)
{
{
s
->
last_dc
[
0
]
=
1
<<
(
7
+
s
->
intra_dc_precision
);
return
mpeg1_decode_block_intra
(
s
,
block
,
n
);
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
));
}
}
static
inline
int
mpeg1_decode_block_inter
(
MpegEncContext
*
s
,
DCTELEM
*
block
,
int
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
int
done
=
0
;
int
level
,
i
,
j
,
run
;
RLTable
*
rl
=
&
ff_rl_mpeg1
;
if
(
!
done
)
{
uint8_t
*
const
scantable
=
s
->
intra_scantable
.
permutated
;
done
=
1
;
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
,
OPEN_READER
(
re
,
&
s
->
gb
);
ff_mpeg12_vlc_dc_lum_code
,
2
,
2
,
512
);
i
=
-
1
;
INIT_VLC_STATIC
(
&
ff_dc_chroma_vlc
,
DC_VLC_BITS
,
12
,
// special case for first coefficient, no need to add second VLC table
ff_mpeg12_vlc_dc_chroma_bits
,
1
,
1
,
UPDATE_CACHE
(
re
,
&
s
->
gb
);
ff_mpeg12_vlc_dc_chroma_code
,
2
,
2
,
514
);
if
(((
int32_t
)
GET_CACHE
(
re
,
&
s
->
gb
))
<
0
)
{
INIT_VLC_STATIC
(
&
mv_vlc
,
MV_VLC_BITS
,
17
,
level
=
(
3
*
qscale
*
quant_matrix
[
0
])
>>
5
;
&
ff_mpeg12_mbMotionVectorTable
[
0
][
1
],
2
,
1
,
level
=
(
level
-
1
)
|
1
;
&
ff_mpeg12_mbMotionVectorTable
[
0
][
0
],
2
,
1
,
518
);
if
(
GET_CACHE
(
re
,
&
s
->
gb
)
&
0x40000000
)
INIT_VLC_STATIC
(
&
mbincr_vlc
,
MBINCR_VLC_BITS
,
36
,
level
=
-
level
;
&
ff_mpeg12_mbAddrIncrTable
[
0
][
1
],
2
,
1
,
block
[
0
]
=
level
;
&
ff_mpeg12_mbAddrIncrTable
[
0
][
0
],
2
,
1
,
538
);
i
++
;
INIT_VLC_STATIC
(
&
mb_pat_vlc
,
MB_PAT_VLC_BITS
,
64
,
SKIP_BITS
(
re
,
&
s
->
gb
,
2
);
&
ff_mpeg12_mbPatTable
[
0
][
1
],
2
,
1
,
if
(((
int32_t
)
GET_CACHE
(
re
,
&
s
->
gb
))
<=
(
int32_t
)
0xBFFFFFFF
)
&
ff_mpeg12_mbPatTable
[
0
][
0
],
2
,
1
,
512
);
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
,
if
(
level
!=
0
)
{
&
table_mb_ptype
[
0
][
1
],
2
,
1
,
i
+=
run
;
&
table_mb_ptype
[
0
][
0
],
2
,
1
,
64
);
j
=
scantable
[
i
];
INIT_VLC_STATIC
(
&
mb_btype_vlc
,
MB_BTYPE_VLC_BITS
,
11
,
level
=
((
level
*
2
+
1
)
*
qscale
*
quant_matrix
[
j
])
>>
5
;
&
table_mb_btype
[
0
][
1
],
2
,
1
,
level
=
(
level
-
1
)
|
1
;
&
table_mb_btype
[
0
][
0
],
2
,
1
,
64
);
level
=
(
level
^
SHOW_SBITS
(
re
,
&
s
->
gb
,
1
))
-
SHOW_SBITS
(
re
,
&
s
->
gb
,
1
);
init_rl
(
&
ff_rl_mpeg1
,
ff_mpeg12_static_rl_table_store
[
0
]);
SKIP_BITS
(
re
,
&
s
->
gb
,
1
);
init_rl
(
&
ff_rl_mpeg2
,
ff_mpeg12_static_rl_table_store
[
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
);
block
[
j
]
=
level
;
INIT_2D_VLC_RL
(
ff_rl_mpeg2
,
674
);
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
))
int
level
,
i
,
j
,
run
;
return
1
-
(
get_bits1
(
&
s
->
gb
)
<<
1
);
RLTable
*
rl
=
&
ff_rl_mpeg1
;
else
uint8_t
*
const
scantable
=
s
->
intra_scantable
.
permutated
;
return
0
;
const
int
qscale
=
s
->
qscale
;
}
static
inline
int
get_qscale
(
MpegEncContext
*
s
)
{
{
OPEN_READER
(
re
,
&
s
->
gb
);
int
qscale
=
get_bits
(
&
s
->
gb
,
5
);
i
=
-
1
;
if
(
s
->
q_scale_type
)
{
// special case for first coefficient, no need to add second VLC table
return
non_linear_qscale
[
qscale
];
UPDATE_CACHE
(
re
,
&
s
->
gb
);
}
else
{
if
(((
int32_t
)
GET_CACHE
(
re
,
&
s
->
gb
))
<
0
)
{
return
qscale
<<
1
;
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) */
/* now quantify & encode AC coefficients */
#define MT_FIELD 1
for
(;;)
{
#define MT_FRAME 2
GET_RL_VLC
(
level
,
run
,
re
,
&
s
->
gb
,
rl
->
rl_vlc
[
0
],
TEX_VLC_BITS
,
2
,
0
);
#define MT_16X8 2
#define MT_DMV 3
static
int
mpeg_decode_mb
(
MpegEncContext
*
s
,
DCTELEM
block
[
12
][
64
])
if
(
level
!=
0
)
{
{
i
+=
run
;
int
i
,
j
,
k
,
cbp
,
val
,
mb_type
,
motion_type
;
j
=
scantable
[
i
];
const
int
mb_block_count
=
4
+
(
1
<<
s
->
chroma_format
);
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
)
{
static
inline
int
mpeg2_decode_block_non_intra
(
MpegEncContext
*
s
,
DCTELEM
*
block
,
int
n
)
if
(
s
->
pict_type
==
AV_PICTURE_TYPE_P
)
{
{
s
->
mb_skipped
=
1
;
int
level
,
i
,
j
,
run
;
s
->
current_picture
.
f
.
mb_type
[
s
->
mb_x
+
s
->
mb_y
*
s
->
mb_stride
]
=
MB_TYPE_SKIP
|
MB_TYPE_L0
|
MB_TYPE_16x16
;
RLTable
*
rl
=
&
ff_rl_mpeg1
;
}
else
{
uint8_t
*
const
scantable
=
s
->
intra_scantable
.
permutated
;
int
mb_type
;
const
uint16_t
*
quant_matrix
;
const
int
qscale
=
s
->
qscale
;
int
mismatch
;
if
(
s
->
mb_x
)
mismatch
=
1
;
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
;
OPEN_READER
(
re
,
&
s
->
gb
);
// assert(s->current_picture.f.mb_type[s->mb_x + s->mb_y * s->mb_stride - 1] & (MB_TYPE_16x16 | MB_TYPE_16x8));
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
)
// special case for first coefficient, no need to add second VLC table
s
->
mb_skipped
=
1
;
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
)
{
if
(
level
!=
0
)
{
default:
i
+=
run
;
case
AV_PICTURE_TYPE_I
:
j
=
scantable
[
i
];
if
(
get_bits1
(
&
s
->
gb
)
==
0
)
{
level
=
((
level
*
2
+
1
)
*
qscale
*
quant_matrix
[
j
])
>>
5
;
if
(
get_bits1
(
&
s
->
gb
)
==
0
)
{
level
=
(
level
^
SHOW_SBITS
(
re
,
&
s
->
gb
,
1
))
-
SHOW_SBITS
(
re
,
&
s
->
gb
,
1
);
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"invalid mb type in I Frame at %d %d
\n
"
,
s
->
mb_x
,
s
->
mb_y
);
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
;
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
)
{
mismatch
^=
level
;
s
->
dsp
.
clear_blocks
(
s
->
block
[
6
]);
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 */
s
->
block_last_index
[
n
]
=
i
;
if
(
s
->
picture_structure
==
PICT_FRAME
&&
// FIXME add an interlaced_dct coded var?
return
0
;
!
s
->
frame_pred_frame_dct
)
{
}
s
->
interlaced_dct
=
get_bits1
(
&
s
->
gb
);
}
if
(
IS_QUANT
(
mb_type
))
static
inline
int
mpeg2_fast_decode_block_non_intra
(
MpegEncContext
*
s
,
s
->
qscale
=
get_qscale
(
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
)
{
// special case for first coefficient, no need to add second VLC table
/* just parse them */
UPDATE_CACHE
(
re
,
&
s
->
gb
);
if
(
s
->
picture_structure
!=
PICT_FRAME
)
if
(((
int32_t
)
GET_CACHE
(
re
,
&
s
->
gb
))
<
0
)
{
skip_bits1
(
&
s
->
gb
);
/* field select */
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
]
=
/* now quantify & encode AC coefficients */
mpeg_decode_motion
(
s
,
s
->
mpeg_f_code
[
0
][
0
],
s
->
last_mv
[
0
][
0
][
0
]);
for
(;;)
{
s
->
mv
[
0
][
0
][
1
]
=
s
->
last_mv
[
0
][
0
][
1
]
=
s
->
last_mv
[
0
][
1
][
1
]
=
GET_RL_VLC
(
level
,
run
,
re
,
&
s
->
gb
,
rl
->
rl_vlc
[
0
],
TEX_VLC_BITS
,
2
,
0
);
mpeg_decode_motion
(
s
,
s
->
mpeg_f_code
[
0
][
1
],
s
->
last_mv
[
0
][
0
][
1
]);
skip_bits1
(
&
s
->
gb
);
/* marker */
if
(
level
!=
0
)
{
}
else
i
+=
run
;
memset
(
s
->
last_mv
,
0
,
sizeof
(
s
->
last_mv
));
/* reset mv prediction */
j
=
scantable
[
i
];
s
->
mb_intra
=
1
;
level
=
((
level
*
2
+
1
)
*
qscale
)
>>
1
;
// if 1, we memcpy blocks in xvmcvideo
level
=
(
level
^
SHOW_SBITS
(
re
,
&
s
->
gb
,
1
))
-
SHOW_SBITS
(
re
,
&
s
->
gb
,
1
);
if
(
CONFIG_MPEG_XVMC_DECODER
&&
s
->
avctx
->
xvmc_acceleration
>
1
)
{
SKIP_BITS
(
re
,
&
s
->
gb
,
1
);
ff_xvmc_pack_pblocks
(
s
,
-
1
);
// inter are always full blocks
}
else
{
if
(
s
->
swap_uv
)
{
/* escape */
exchange_uv
(
s
);
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
)
{
block
[
j
]
=
level
;
if
(
s
->
flags2
&
CODEC_FLAG2_FAST
)
{
if
(((
int32_t
)
GET_CACHE
(
re
,
&
s
->
gb
))
<=
(
int32_t
)
0xBFFFFFFF
)
for
(
i
=
0
;
i
<
6
;
i
++
)
{
break
;
mpeg2_fast_decode_block_intra
(
s
,
*
s
->
pblocks
[
i
],
i
);
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
{
}
else
{
for
(
i
=
0
;
i
<
mb_block_count
;
i
++
)
{
/* escape */
if
(
mpeg2_decode_block_intra
(
s
,
*
s
->
pblocks
[
i
],
i
)
<
0
)
run
=
SHOW_UBITS
(
re
,
&
s
->
gb
,
6
)
+
1
;
LAST_SKIP_BITS
(
re
,
&
s
->
gb
,
6
);
return
-
1
;
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
{
if
(
i
>
63
)
{
for
(
i
=
0
;
i
<
6
;
i
++
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"ac-tex damaged at %d %d
\n
"
,
s
->
mb_x
,
s
->
mb_y
);
if
(
mpeg1_decode_block_intra
(
s
,
*
s
->
pblocks
[
i
],
i
)
<
0
)
return
-
1
;
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
{
}
else
{
if
(
mb_type
&
MB_TYPE_ZERO_MV
)
{
quant_matrix
=
s
->
chroma_intra_matrix
;
assert
(
mb_type
&
MB_TYPE_CBP
);
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
)
{
OPEN_READER
(
re
,
&
s
->
gb
);
if
(
!
s
->
frame_pred_frame_dct
)
/* now quantify & encode AC coefficients */
s
->
interlaced_dct
=
get_bits1
(
&
s
->
gb
);
for
(;;)
{
s
->
mv_type
=
MV_TYPE_16X16
;
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
{
}
else
{
s
->
mv_type
=
MV_TYPE_FIELD
;
/* escape */
mb_type
|=
MB_TYPE_INTERLACED
;
run
=
SHOW_UBITS
(
re
,
&
s
->
gb
,
6
)
+
1
;
LAST_SKIP_BITS
(
re
,
&
s
->
gb
,
6
);
s
->
field_select
[
0
][
0
]
=
s
->
picture_structure
-
1
;
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
))
block
[
j
]
=
level
;
s
->
qscale
=
get_qscale
(
s
);
}
CLOSE_READER
(
re
,
&
s
->
gb
);
}
s
->
last_mv
[
0
][
0
][
0
]
=
0
;
s
->
block_last_index
[
n
]
=
scantable
-
s
->
intra_scantable
.
permutated
;
s
->
last_mv
[
0
][
0
][
1
]
=
0
;
return
0
;
s
->
last_mv
[
0
][
1
][
0
]
=
0
;
}
s
->
last_mv
[
0
][
1
][
1
]
=
0
;
s
->
mv
[
0
][
0
][
0
]
=
0
;
uint8_t
ff_mpeg12_static_rl_table_store
[
2
][
2
][
2
*
MAX_RUN
+
MAX_LEVEL
+
3
];
s
->
mv
[
0
][
0
][
1
]
=
0
;
#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
{
}
else
{
assert
(
mb_type
&
MB_TYPE_L0L1
);
if
(
code
==
rl
->
n
)
{
//esc
// FIXME decide if MBs in field pictures are MB_TYPE_INTERLACED
run
=
65
;
/* get additional motion vector type */
level
=
0
;
if
(
s
->
frame_pred_frame_dct
)
}
else
if
(
code
==
rl
->
n
+
1
)
{
//eob
motion_type
=
MT_FRAME
;
run
=
0
;
else
{
level
=
127
;
motion_type
=
get_bits
(
&
s
->
gb
,
2
);
}
else
{
if
(
s
->
picture_structure
==
PICT_FRAME
&&
HAS_CBP
(
mb_type
))
run
=
rl
->
table_run
[
code
]
+
1
;
s
->
interlaced_dct
=
get_bits1
(
&
s
->
gb
)
;
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
))
void
ff_mpeg12_common_init
(
MpegEncContext
*
s
)
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
);
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
;
void
ff_mpeg1_clean_buffers
(
MpegEncContext
*
s
)
s
->
mv
[
i
][
0
][
1
]
=
my
;
{
s
->
mv
[
i
][
1
][
0
]
=
mx
;
// not used
s
->
last_dc
[
0
]
=
1
<<
(
7
+
s
->
intra_dc_precision
);
s
->
mv
[
i
][
1
][
1
]
=
my
;
// not used
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 */
VLC
ff_dc_lum_vlc
;
s
->
mv
[
i
][
2
][
0
]
=
((
mx
*
m
+
(
mx
>
0
))
>>
1
)
+
dmx
;
VLC
ff_dc_chroma_vlc
;
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
;
s
->
mv
[
i
][
2
][
0
]
=
((
mx
+
(
mx
>
0
))
>>
1
)
+
dmx
;
static
VLC
mbincr_vlc
;
s
->
mv
[
i
][
2
][
1
]
=
((
my
+
(
my
>
0
))
>>
1
)
+
dmy
;
static
VLC
mb_ptype_vlc
;
if
(
s
->
picture_structure
==
PICT_TOP_FIELD
)
static
VLC
mb_btype_vlc
;
s
->
mv
[
i
][
2
][
1
]
--
;
static
VLC
mb_pat_vlc
;
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
;
}
}
s
->
mb_intra
=
0
;
av_cold
void
ff_mpeg12_init_vlcs
(
void
)
if
(
HAS_CBP
(
mb_type
))
{
{
s
->
dsp
.
clear_blocks
(
s
->
block
[
0
])
;
static
int
done
=
0
;
cbp
=
get_vlc2
(
&
s
->
gb
,
mb_pat_vlc
.
table
,
MB_PAT_VLC_BITS
,
1
);
if
(
!
done
)
{
if
(
mb_block_count
>
6
)
{
done
=
1
;
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 1, we memcpy blocks in xvmcvideo
INIT_VLC_STATIC
(
&
ff_dc_lum_vlc
,
DC_VLC_BITS
,
12
,
if
(
CONFIG_MPEG_XVMC_DECODER
&&
s
->
avctx
->
xvmc_acceleration
>
1
)
{
ff_mpeg12_vlc_dc_lum_bits
,
1
,
1
,
ff_xvmc_pack_pblocks
(
s
,
cbp
);
ff_mpeg12_vlc_dc_lum_code
,
2
,
2
,
512
);
if
(
s
->
swap_uv
)
{
INIT_VLC_STATIC
(
&
ff_dc_chroma_vlc
,
DC_VLC_BITS
,
12
,
exchange_uv
(
s
);
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
)
{
INIT_VLC_STATIC
(
&
mb_ptype_vlc
,
MB_PTYPE_VLC_BITS
,
7
,
if
(
s
->
flags2
&
CODEC_FLAG2_FAST
)
{
&
table_mb_ptype
[
0
][
1
],
2
,
1
,
for
(
i
=
0
;
i
<
6
;
i
++
)
{
&
table_mb_ptype
[
0
][
0
],
2
,
1
,
64
);
if
(
cbp
&
32
)
{
INIT_VLC_STATIC
(
&
mb_btype_vlc
,
MB_BTYPE_VLC_BITS
,
11
,
mpeg2_fast_decode_block_non_intra
(
s
,
*
s
->
pblocks
[
i
],
i
);
&
table_mb_btype
[
0
][
1
],
2
,
1
,
}
else
{
&
table_mb_btype
[
0
][
0
],
2
,
1
,
64
);
s
->
block_last_index
[
i
]
=
-
1
;
init_rl
(
&
ff_rl_mpeg1
,
ff_mpeg12_static_rl_table_store
[
0
]);
}
init_rl
(
&
ff_rl_mpeg2
,
ff_mpeg12_static_rl_table_store
[
1
]);
cbp
+=
cbp
;
}
}
else
{
cbp
<<=
12
-
mb_block_count
;
for
(
i
=
0
;
i
<
mb_block_count
;
i
++
)
{
INIT_2D_VLC_RL
(
ff_rl_mpeg1
,
680
);
if
(
cbp
&
(
1
<<
11
))
{
INIT_2D_VLC_RL
(
ff_rl_mpeg2
,
674
);
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
;
}
}
}
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
inline
int
get_dmv
(
MpegEncContext
*
s
)
static
int
mpeg_decode_motion
(
MpegEncContext
*
s
,
int
fcode
,
int
pred
)
{
{
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
);
static
inline
int
get_qscale
(
MpegEncContext
*
s
)
if
(
code
==
0
)
{
{
return
pred
;
int
qscale
=
get_bits
(
&
s
->
gb
,
5
);
}
if
(
s
->
q_scale_type
)
{
if
(
code
<
0
)
{
return
non_linear_qscale
[
qscale
];
return
0xffff
;
}
else
{
return
qscale
<<
1
;
}
}
}
sign
=
get_bits1
(
&
s
->
gb
);
static
void
exchange_uv
(
MpegEncContext
*
s
)
shift
=
fcode
-
1
;
{
val
=
code
;
DCTELEM
(
*
tmp
)[
64
];
if
(
shift
)
{
val
=
(
val
-
1
)
<<
shift
;
val
|=
get_bits
(
&
s
->
gb
,
shift
);
val
++
;
}
if
(
sign
)
val
=
-
val
;
val
+=
pred
;
/* modulo decoding */
tmp
=
s
->
pblocks
[
4
];
l
=
INT_BIT
-
5
-
shift
;
s
->
pblocks
[
4
]
=
s
->
pblocks
[
5
];
val
=
(
val
<<
l
)
>>
l
;
s
->
pblocks
[
5
]
=
tmp
;
return
val
;
}
}
static
inline
int
mpeg1_decode_block_intra
(
MpegEncContext
*
s
,
DCTELEM
*
block
,
int
n
)
/* motion type (for MPEG-2) */
{
#define MT_FIELD 1
int
level
,
dc
,
diff
,
i
,
j
,
run
;
#define MT_FRAME 2
int
component
;
#define MT_16X8 2
RLTable
*
rl
=
&
ff_rl_mpeg1
;
#define MT_DMV 3
uint8_t
*
const
scantable
=
s
->
intra_scantable
.
permutated
;
const
uint16_t
*
quant_matrix
=
s
->
intra_matrix
;
const
int
qscale
=
s
->
qscale
;
/* DC coefficient */
static
int
mpeg_decode_mb
(
MpegEncContext
*
s
,
DCTELEM
block
[
12
][
64
])
component
=
(
n
<=
3
?
0
:
n
-
4
+
1
);
{
diff
=
decode_dc
(
&
s
->
gb
,
component
);
int
i
,
j
,
k
,
cbp
,
val
,
mb_type
,
motion_type
;
if
(
diff
>=
0xffff
)
const
int
mb_block_count
=
4
+
(
1
<<
s
->
chroma_format
);
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
(
level
==
127
)
{
av_dlog
(
s
->
avctx
,
"decode_mb: x=%d y=%d
\n
"
,
s
->
mb_x
,
s
->
mb_y
);
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
;
}
block
[
j
]
=
level
;
assert
(
s
->
mb_skipped
==
0
);
}
CLOSE_READER
(
re
,
&
s
->
gb
);
}
s
->
block_last_index
[
n
]
=
i
;
return
0
;
}
int
ff_mpeg1_decode_block_intra
(
MpegEncContext
*
s
,
DCTELEM
*
block
,
int
n
)
if
(
s
->
mb_skip_run
--
!=
0
)
{
{
if
(
s
->
pict_type
==
AV_PICTURE_TYPE_P
)
{
return
mpeg1_decode_block_intra
(
s
,
block
,
n
);
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
)
if
(
s
->
mb_x
)
{
mb_type
=
s
->
current_picture
.
f
.
mb_type
[
s
->
mb_x
+
s
->
mb_y
*
s
->
mb_stride
-
1
];
int
level
,
i
,
j
,
run
;
else
RLTable
*
rl
=
&
ff_rl_mpeg1
;
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
uint8_t
*
const
scantable
=
s
->
intra_scantable
.
permutated
;
if
(
IS_INTRA
(
mb_type
))
const
uint16_t
*
quant_matrix
=
s
->
inter_matrix
;
return
-
1
;
const
int
qscale
=
s
->
qscale
;
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));
{
if
((
s
->
mv
[
0
][
0
][
0
]
|
s
->
mv
[
0
][
0
][
1
]
|
s
->
mv
[
1
][
0
][
0
]
|
s
->
mv
[
1
][
0
][
1
])
==
0
)
OPEN_READER
(
re
,
&
s
->
gb
);
s
->
mb_skipped
=
1
;
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
);
if
(
level
!=
0
)
{
return
0
;
i
+=
run
;
}
j
=
scantable
[
i
];
level
=
((
level
*
2
+
1
)
*
qscale
*
quant_matrix
[
j
])
>>
5
;
switch
(
s
->
pict_type
)
{
level
=
(
level
-
1
)
|
1
;
default:
level
=
(
level
^
SHOW_SBITS
(
re
,
&
s
->
gb
,
1
))
-
SHOW_SBITS
(
re
,
&
s
->
gb
,
1
);
case
AV_PICTURE_TYPE_I
:
SKIP_BITS
(
re
,
&
s
->
gb
,
1
);
if
(
get_bits1
(
&
s
->
gb
)
==
0
)
{
}
else
{
if
(
get_bits1
(
&
s
->
gb
)
==
0
)
{
/* escape */
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"invalid mb type in I Frame at %d %d
\n
"
,
s
->
mb_x
,
s
->
mb_y
);
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
;
return
-
1
;
}
}
mb_type
=
MB_TYPE_QUANT
|
MB_TYPE_INTRA
;
block
[
j
]
=
level
;
}
else
{
if
(((
int32_t
)
GET_CACHE
(
re
,
&
s
->
gb
))
<=
(
int32_t
)
0xBFFFFFFF
)
mb_type
=
MB_TYPE_INTRA
;
break
;
UPDATE_CACHE
(
re
,
&
s
->
gb
);
}
}
end:
break
;
LAST_SKIP_BITS
(
re
,
&
s
->
gb
,
2
);
case
AV_PICTURE_TYPE_P
:
CLOSE_READER
(
re
,
&
s
->
gb
);
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
;
av_dlog
(
s
->
avctx
,
"mb_type=%x
\n
"
,
mb_type
);
return
0
;
// motion_type = 0; /* avoid warning */
}
if
(
IS_INTRA
(
mb_type
))
{
s
->
dsp
.
clear_blocks
(
s
->
block
[
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
;
{
if
(
!
s
->
chroma_y_shift
)
{
OPEN_READER
(
re
,
&
s
->
gb
);
s
->
dsp
.
clear_blocks
(
s
->
block
[
6
]);
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
;
}
}
/* now quantify & encode AC coefficients */
/* compute DCT type */
for
(;;)
{
if
(
s
->
picture_structure
==
PICT_FRAME
&&
// FIXME add an interlaced_dct coded var?
GET_RL_VLC
(
level
,
run
,
re
,
&
s
->
gb
,
rl
->
rl_vlc
[
0
],
TEX_VLC_BITS
,
2
,
0
);
!
s
->
frame_pred_frame_dct
)
{
s
->
interlaced_dct
=
get_bits1
(
&
s
->
gb
);
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
);
}
}
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
)
if
(
IS_QUANT
(
mb_type
))
{
s
->
qscale
=
get_qscale
(
s
);
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
;
mismatch
=
1
;
if
(
s
->
concealment_motion_vectors
)
{
/* just parse them */
if
(
s
->
picture_structure
!=
PICT_FRAME
)
skip_bits1
(
&
s
->
gb
);
/* field select */
{
s
->
mv
[
0
][
0
][
0
]
=
s
->
last_mv
[
0
][
0
][
0
]
=
s
->
last_mv
[
0
][
1
][
0
]
=
OPEN_READER
(
re
,
&
s
->
gb
);
mpeg_decode_motion
(
s
,
s
->
mpeg_f_code
[
0
][
0
],
s
->
last_mv
[
0
][
0
][
0
]);
i
=
-
1
;
s
->
mv
[
0
][
0
][
1
]
=
s
->
last_mv
[
0
][
0
][
1
]
=
s
->
last_mv
[
0
][
1
][
1
]
=
if
(
n
<
4
)
mpeg_decode_motion
(
s
,
s
->
mpeg_f_code
[
0
][
1
],
s
->
last_mv
[
0
][
0
][
1
]);
quant_matrix
=
s
->
inter_matrix
;
else
quant_matrix
=
s
->
chroma_inter_matrix
;
// special case for first coefficient, no need to add second VLC table
skip_bits1
(
&
s
->
gb
);
/* marker */
UPDATE_CACHE
(
re
,
&
s
->
gb
);
}
else
if
(((
int32_t
)
GET_CACHE
(
re
,
&
s
->
gb
))
<
0
)
{
memset
(
s
->
last_mv
,
0
,
sizeof
(
s
->
last_mv
));
/* reset mv prediction */
level
=
(
3
*
qscale
*
quant_matrix
[
0
])
>>
5
;
s
->
mb_intra
=
1
;
if
(
GET_CACHE
(
re
,
&
s
->
gb
)
&
0x40000000
)
// if 1, we memcpy blocks in xvmcvideo
level
=
-
level
;
if
(
CONFIG_MPEG_XVMC_DECODER
&&
s
->
avctx
->
xvmc_acceleration
>
1
)
{
block
[
0
]
=
level
;
ff_xvmc_pack_pblocks
(
s
,
-
1
);
// inter are always full blocks
mismatch
^=
level
;
if
(
s
->
swap_uv
)
{
i
++
;
exchange_uv
(
s
);
SKIP_BITS
(
re
,
&
s
->
gb
,
2
);
}
if
(((
int32_t
)
GET_CACHE
(
re
,
&
s
->
gb
))
<=
(
int32_t
)
0xBFFFFFFF
)
goto
end
;
}
}
/* now quantify & encode AC coefficients */
if
(
s
->
codec_id
==
CODEC_ID_MPEG2VIDEO
)
{
for
(;;)
{
if
(
s
->
flags2
&
CODEC_FLAG2_FAST
)
{
GET_RL_VLC
(
level
,
run
,
re
,
&
s
->
gb
,
rl
->
rl_vlc
[
0
],
TEX_VLC_BITS
,
2
,
0
);
for
(
i
=
0
;
i
<
6
;
i
++
)
{
mpeg2_fast_decode_block_intra
(
s
,
*
s
->
pblocks
[
i
],
i
);
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
{
}
else
{
/* escape */
for
(
i
=
0
;
i
<
mb_block_count
;
i
++
)
{
run
=
SHOW_UBITS
(
re
,
&
s
->
gb
,
6
)
+
1
;
LAST_SKIP_BITS
(
re
,
&
s
->
gb
,
6
);
if
(
mpeg2_decode_block_intra
(
s
,
*
s
->
pblocks
[
i
],
i
)
<
0
)
UPDATE_CACHE
(
re
,
&
s
->
gb
);
return
-
1
;
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
)
{
}
else
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"ac-tex damaged at %d %d
\n
"
,
s
->
mb_x
,
s
->
mb_y
);
for
(
i
=
0
;
i
<
6
;
i
++
)
{
return
-
1
;
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:
}
else
{
LAST_SKIP_BITS
(
re
,
&
s
->
gb
,
2
);
if
(
mb_type
&
MB_TYPE_ZERO_MV
)
{
CLOSE_READER
(
re
,
&
s
->
gb
);
assert
(
mb_type
&
MB_TYPE_CBP
);
}
block
[
63
]
^=
(
mismatch
&
1
);
s
->
block_last_index
[
n
]
=
i
;
s
->
mv_dir
=
MV_DIR_FORWARD
;
return
0
;
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
,
if
(
IS_QUANT
(
mb_type
))
DCTELEM
*
block
,
int
n
)
s
->
qscale
=
get_qscale
(
s
);
{
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
;
// special case for first coefficient, no need to add second VLC table
s
->
last_mv
[
0
][
0
][
0
]
=
0
;
UPDATE_CACHE
(
re
,
&
s
->
gb
);
s
->
last_mv
[
0
][
0
][
1
]
=
0
;
if
(((
int32_t
)
GET_CACHE
(
re
,
&
s
->
gb
))
<
0
)
{
s
->
last_mv
[
0
][
1
][
0
]
=
0
;
level
=
(
3
*
qscale
)
>>
1
;
s
->
last_mv
[
0
][
1
][
1
]
=
0
;
if
(
GET_CACHE
(
re
,
&
s
->
gb
)
&
0x40000000
)
s
->
mv
[
0
][
0
][
0
]
=
0
;
level
=
-
level
;
s
->
mv
[
0
][
0
][
1
]
=
0
;
block
[
0
]
=
level
;
}
else
{
i
++
;
assert
(
mb_type
&
MB_TYPE_L0L1
);
SKIP_BITS
(
re
,
&
s
->
gb
,
2
);
// FIXME decide if MBs in field pictures are MB_TYPE_INTERLACED
if
(((
int32_t
)
GET_CACHE
(
re
,
&
s
->
gb
))
<=
(
int32_t
)
0xBFFFFFFF
)
/* get additional motion vector type */
goto
end
;
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 */
if
(
IS_QUANT
(
mb_type
))
for
(;;)
{
s
->
qscale
=
get_qscale
(
s
);
GET_RL_VLC
(
level
,
run
,
re
,
&
s
->
gb
,
rl
->
rl_vlc
[
0
],
TEX_VLC_BITS
,
2
,
0
);
if
(
level
!=
0
)
{
/* motion vectors */
i
+=
run
;
s
->
mv_dir
=
(
mb_type
>>
13
)
&
3
;
j
=
scantable
[
i
];
av_dlog
(
s
->
avctx
,
"motion_type=%d
\n
"
,
motion_type
);
level
=
((
level
*
2
+
1
)
*
qscale
)
>>
1
;
switch
(
motion_type
)
{
level
=
(
level
^
SHOW_SBITS
(
re
,
&
s
->
gb
,
1
))
-
SHOW_SBITS
(
re
,
&
s
->
gb
,
1
);
case
MT_FRAME
:
/* or MT_16X8 */
SKIP_BITS
(
re
,
&
s
->
gb
,
1
);
if
(
s
->
picture_structure
==
PICT_FRAME
)
{
}
else
{
mb_type
|=
MB_TYPE_16x16
;
/* escape */
s
->
mv_type
=
MV_TYPE_16X16
;
run
=
SHOW_UBITS
(
re
,
&
s
->
gb
,
6
)
+
1
;
LAST_SKIP_BITS
(
re
,
&
s
->
gb
,
6
);
for
(
i
=
0
;
i
<
2
;
i
++
)
{
UPDATE_CACHE
(
re
,
&
s
->
gb
);
if
(
USES_LIST
(
mb_type
,
i
))
{
level
=
SHOW_SBITS
(
re
,
&
s
->
gb
,
12
);
SKIP_BITS
(
re
,
&
s
->
gb
,
12
);
/* 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
;
s
->
last_mv
[
i
][
0
][
1
]
=
my
<<
my_shift
;
if
(((
int32_t
)
GET_CACHE
(
re
,
&
s
->
gb
))
<=
(
int32_t
)
0xBFFFFFFF
)
s
->
last_mv
[
i
][
1
][
1
]
=
my
<<
my_shift
;
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
->
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
)
if
(
s
->
picture_structure
==
PICT_FRAME
)
{
{
mb_type
|=
MB_TYPE_16x16
|
MB_TYPE_INTERLACED
;
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 */
// m = 1 + 2 * s->top_field_first;
if
(
n
<
4
)
{
m
=
s
->
top_field_first
?
1
:
3
;
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
;
{
/* top -> top pred */
OPEN_READER
(
re
,
&
s
->
gb
);
s
->
mv
[
i
][
2
][
0
]
=
((
mx
*
m
+
(
mx
>
0
))
>>
1
)
+
dmx
;
/* now quantify & encode AC coefficients */
s
->
mv
[
i
][
2
][
1
]
=
((
my
*
m
+
(
my
>
0
))
>>
1
)
+
dmy
-
1
;
for
(;;)
{
m
=
4
-
m
;
UPDATE_CACHE
(
re
,
&
s
->
gb
);
s
->
mv
[
i
][
3
][
0
]
=
((
mx
*
m
+
(
mx
>
0
))
>>
1
)
+
dmx
;
GET_RL_VLC
(
level
,
run
,
re
,
&
s
->
gb
,
rl
->
rl_vlc
[
0
],
TEX_VLC_BITS
,
2
,
0
);
s
->
mv
[
i
][
3
][
1
]
=
((
my
*
m
+
(
my
>
0
))
>>
1
)
+
dmy
+
1
;
}
else
{
mb_type
|=
MB_TYPE_16x16
;
if
(
level
==
127
)
{
s
->
mv
[
i
][
2
][
0
]
=
((
mx
+
(
mx
>
0
))
>>
1
)
+
dmx
;
break
;
s
->
mv
[
i
][
2
][
1
]
=
((
my
+
(
my
>
0
))
>>
1
)
+
dmy
;
}
else
if
(
level
!=
0
)
{
if
(
s
->
picture_structure
==
PICT_TOP_FIELD
)
i
+=
run
;
s
->
mv
[
i
][
2
][
1
]
--
;
j
=
scantable
[
i
];
else
level
=
(
level
*
qscale
*
quant_matrix
[
j
])
>>
4
;
s
->
mv
[
i
][
2
][
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
,
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
;
}
}
}
break
;
if
(
i
>
63
)
{
default:
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"
ac-tex damaged
at %d %d
\n
"
,
s
->
mb_x
,
s
->
mb_y
);
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"
00 motion_type
at %d %d
\n
"
,
s
->
mb_x
,
s
->
mb_y
);
return
-
1
;
return
-
1
;
}
}
mismatch
^=
level
;
block
[
j
]
=
level
;
}
}
CLOSE_READER
(
re
,
&
s
->
gb
);
}
block
[
63
]
^=
mismatch
&
1
;
s
->
block_last_index
[
n
]
=
i
;
s
->
mb_intra
=
0
;
return
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
)
cbp
=
get_vlc2
(
&
s
->
gb
,
mb_pat_vlc
.
table
,
MB_PAT_VLC_BITS
,
1
);
{
if
(
mb_block_count
>
6
)
{
int
level
,
dc
,
diff
,
j
,
run
;
cbp
<<=
mb_block_count
-
6
;
int
component
;
cbp
|=
get_bits
(
&
s
->
gb
,
mb_block_count
-
6
);
RLTable
*
rl
;
s
->
dsp
.
clear_blocks
(
s
->
block
[
6
]);
uint8_t
*
scantable
=
s
->
intra_scantable
.
permutated
;
}
const
uint16_t
*
quant_matrix
;
if
(
cbp
<=
0
)
{
const
int
qscale
=
s
->
qscale
;
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"invalid cbp at %d %d
\n
"
,
s
->
mb_x
,
s
->
mb_y
);
return
-
1
;
}
/* DC coefficient */
//if 1, we memcpy blocks in xvmcvideo
if
(
n
<
4
)
{
if
(
CONFIG_MPEG_XVMC_DECODER
&&
s
->
avctx
->
xvmc_acceleration
>
1
)
{
quant_matrix
=
s
->
intra_matrix
;
ff_xvmc_pack_pblocks
(
s
,
cbp
);
component
=
0
;
if
(
s
->
swap_uv
)
{
}
else
{
exchange_uv
(
s
);
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
(
s
->
codec_id
==
CODEC_ID_MPEG2VIDEO
)
{
OPEN_READER
(
re
,
&
s
->
gb
);
if
(
s
->
flags2
&
CODEC_FLAG2_FAST
)
{
/* now quantify & encode AC coefficients */
for
(
i
=
0
;
i
<
6
;
i
++
)
{
for
(;;)
{
if
(
cbp
&
32
)
{
UPDATE_CACHE
(
re
,
&
s
->
gb
);
mpeg2_fast_decode_block_non_intra
(
s
,
*
s
->
pblocks
[
i
],
i
);
GET_RL_VLC
(
level
,
run
,
re
,
&
s
->
gb
,
rl
->
rl_vlc
[
0
],
TEX_VLC_BITS
,
2
,
0
);
}
else
{
s
->
block_last_index
[
i
]
=
-
1
;
}
cbp
+=
cbp
;
}
}
else
{
cbp
<<=
12
-
mb_block_count
;
if
(
level
==
127
)
{
for
(
i
=
0
;
i
<
mb_block_count
;
i
++
)
{
break
;
if
(
cbp
&
(
1
<<
11
))
{
}
else
if
(
level
!=
0
)
{
if
(
mpeg2_decode_block_non_intra
(
s
,
*
s
->
pblocks
[
i
],
i
)
<
0
)
scantable
+=
run
;
return
-
1
;
j
=
*
scantable
;
}
else
{
level
=
(
level
*
qscale
*
quant_matrix
[
j
])
>>
4
;
s
->
block_last_index
[
i
]
=
-
1
;
level
=
(
level
^
SHOW_SBITS
(
re
,
&
s
->
gb
,
1
))
-
SHOW_SBITS
(
re
,
&
s
->
gb
,
1
);
}
LAST_SKIP_BITS
(
re
,
&
s
->
gb
,
1
);
cbp
+=
cbp
;
}
}
}
else
{
}
else
{
/* escape */
if
(
s
->
flags2
&
CODEC_FLAG2_FAST
)
{
run
=
SHOW_UBITS
(
re
,
&
s
->
gb
,
6
)
+
1
;
LAST_SKIP_BITS
(
re
,
&
s
->
gb
,
6
);
for
(
i
=
0
;
i
<
6
;
i
++
)
{
UPDATE_CACHE
(
re
,
&
s
->
gb
);
if
(
cbp
&
32
)
{
level
=
SHOW_SBITS
(
re
,
&
s
->
gb
,
12
);
SKIP_BITS
(
re
,
&
s
->
gb
,
12
);
mpeg1_fast_decode_block_inter
(
s
,
*
s
->
pblocks
[
i
],
i
);
scantable
+=
run
;
}
else
{
j
=
*
scantable
;
s
->
block_last_index
[
i
]
=
-
1
;
if
(
level
<
0
)
{
}
level
=
(
-
level
*
qscale
*
quant_matrix
[
j
])
>>
4
;
cbp
+=
cbp
;
level
=
-
level
;
}
}
else
{
}
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
;
}
}
}
}
}
}
else
{
block
[
j
]
=
level
;
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
;
return
0
;
}
}
...
@@ -1193,6 +1186,11 @@ static void quant_matrix_rebuild(uint16_t *matrix, const uint8_t *old_perm,
...
@@ -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
)
static
enum
PixelFormat
mpeg_get_pixelformat
(
AVCodecContext
*
avctx
)
{
{
Mpeg1Context
*
s1
=
avctx
->
priv_data
;
Mpeg1Context
*
s1
=
avctx
->
priv_data
;
...
@@ -1573,15 +1571,6 @@ static void mpeg_decode_picture_coding_extension(Mpeg1Context *s1)
...
@@ -1573,15 +1571,6 @@ static void mpeg_decode_picture_coding_extension(Mpeg1Context *s1)
av_dlog
(
s
->
avctx
,
"progressive_frame=%d
\n
"
,
s
->
progressive_frame
);
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
)
static
int
mpeg_field_start
(
MpegEncContext
*
s
,
const
uint8_t
*
buf
,
int
buf_size
)
{
{
AVCodecContext
*
avctx
=
s
->
avctx
;
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