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
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
881 additions
and
892 deletions
+881
-892
mpeg12.c
libavcodec/mpeg12.c
+881
-892
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
;
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
{
if
(
code
==
rl
->
n
)
{
//esc
run
=
65
;
level
=
0
;
}
else
if
(
code
==
rl
->
n
+
1
)
{
//eob
run
=
0
;
level
=
127
;
/* 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
{
run
=
rl
->
table_run
[
code
]
+
1
;
level
=
rl
->
table_level
[
code
]
;
level
=
(
level
*
qscale
*
quant_matrix
[
j
])
>>
4
;
level
=
(
level
-
1
)
|
1
;
}
}
rl
->
rl_vlc
[
0
][
i
].
len
=
len
;
rl
->
rl_vlc
[
0
][
i
].
level
=
level
;
rl
->
rl_vlc
[
0
][
i
].
run
=
run
;
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
;
}
}
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
];
block
[
j
]
=
level
;
}
CLOSE_READER
(
re
,
&
s
->
gb
);
}
s
->
block_last_index
[
n
]
=
i
;
return
0
;
}
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
;
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
);
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
(
&
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
]);
{
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_2D_VLC_RL
(
ff_rl_mpeg1
,
680
);
INIT_2D_VLC_RL
(
ff_rl_mpeg2
,
674
);
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
;
}
}
static
inline
int
get_dmv
(
MpegEncContext
*
s
)
{
if
(
get_bits1
(
&
s
->
gb
))
return
1
-
(
get_bits1
(
&
s
->
gb
)
<<
1
);
else
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_qscale
(
MpegEncContext
*
s
)
{
int
qscale
=
get_bits
(
&
s
->
gb
,
5
);
if
(
s
->
q_scale_type
)
{
return
non_linear_qscale
[
qscale
];
}
else
{
return
qscale
<<
1
;
}
}
/* motion type (for MPEG-2) */
#define MT_FIELD 1
#define MT_FRAME 2
#define MT_16X8 2
#define MT_DMV 3
static
int
mpeg_decode_mb
(
MpegEncContext
*
s
,
DCTELEM
block
[
12
][
64
])
static
inline
int
mpeg1_fast_decode_block_inter
(
MpegEncContext
*
s
,
DCTELEM
*
block
,
int
n
)
{
int
i
,
j
,
k
,
cbp
,
val
,
mb_type
,
motion_type
;
const
int
mb_block_count
=
4
+
(
1
<<
s
->
chroma_format
);
av_dlog
(
s
->
avctx
,
"decode_mb: x=%d y=%d
\n
"
,
s
->
mb_x
,
s
->
mb_y
);
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
;
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));
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
->
mv
[
0
][
0
][
0
]
|
s
->
mv
[
0
][
0
][
1
]
|
s
->
mv
[
1
][
0
][
0
]
|
s
->
mv
[
1
][
0
][
1
])
==
0
)
s
->
mb_skipped
=
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
;
}
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
);
return
-
1
;
}
mb_type
=
MB_TYPE_QUANT
|
MB_TYPE_INTRA
;
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
{
mb_type
=
MB_TYPE_INTRA
;
/* 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
);
}
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
;
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
;
}
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
];
block
[
j
]
=
level
;
if
(((
int32_t
)
GET_CACHE
(
re
,
&
s
->
gb
))
<=
(
int32_t
)
0xBFFFFFFF
)
break
;
UPDATE_CACHE
(
re
,
&
s
->
gb
);
}
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
]);
end:
LAST_SKIP_BITS
(
re
,
&
s
->
gb
,
2
);
CLOSE_READER
(
re
,
&
s
->
gb
);
}
s
->
block_last_index
[
n
]
=
i
;
return
0
;
}
/* 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
);
}
if
(
IS_QUANT
(
mb_type
))
s
->
qscale
=
get_qscale
(
s
);
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
->
concealment_motion_vectors
)
{
/* just parse them */
if
(
s
->
picture_structure
!=
PICT_FRAME
)
skip_bits1
(
&
s
->
gb
);
/* field select */
mismatch
=
1
;
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
]);
{
OPEN_READER
(
re
,
&
s
->
gb
);
i
=
-
1
;
if
(
n
<
4
)
quant_matrix
=
s
->
inter_matrix
;
else
quant_matrix
=
s
->
chroma_inter_matrix
;
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
);
}
// 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
;
}
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
);
}
/* 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
);
}
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
*
2
+
1
)
*
qscale
*
quant_matrix
[
j
])
>>
5
;
level
=
-
level
;
}
else
{
level
=
((
level
*
2
+
1
)
*
qscale
*
quant_matrix
[
j
])
>>
5
;
}
}
}
else
{
for
(
i
=
0
;
i
<
6
;
i
++
)
{
if
(
mpeg1_decode_block_intra
(
s
,
*
s
->
pblocks
[
i
],
i
)
<
0
)
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
{
if
(
mb_type
&
MB_TYPE_ZERO_MV
)
{
assert
(
mb_type
&
MB_TYPE_CBP
);
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
;
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
);
if
(
IS_QUANT
(
mb_type
))
s
->
qscale
=
get_qscale
(
s
);
s
->
block_last_index
[
n
]
=
i
;
return
0
;
}
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
);
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
;
// 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
;
}
if
(
IS_QUANT
(
mb_type
))
s
->
qscale
=
get_qscale
(
s
);
/* now quantify & encode AC coefficients */
for
(;;)
{
GET_RL_VLC
(
level
,
run
,
re
,
&
s
->
gb
,
rl
->
rl_vlc
[
0
],
TEX_VLC_BITS
,
2
,
0
);
/* 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
;
}
}
}
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
{
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
);
}
}
}
/* 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
{
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
;
}
}
level
=
((
level
*
2
+
1
)
*
qscale
)
>>
1
;
}
}
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
->
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
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
;
}
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
;
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
;
/* 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
;
/* DC coefficient */
if
(
n
<
4
)
{
quant_matrix
=
s
->
intra_matrix
;
component
=
0
;
}
else
{
mb_type
|=
MB_TYPE_16x16
;
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
]
++
;
}
}
quant_matrix
=
s
->
chroma_intra_matrix
;
component
=
(
n
&
1
)
+
1
;
}
break
;
default:
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"00 motion_type at %d %d
\n
"
,
s
->
mb_x
,
s
->
mb_y
);
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
;
s
->
mb_intra
=
0
;
if
(
HAS_CBP
(
mb_type
))
{
s
->
dsp
.
clear_blocks
(
s
->
block
[
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
);
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
(
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
;
}
if
(
cbp
<=
0
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"invalid cbp at %d %d
\n
"
,
s
->
mb_x
,
s
->
mb_y
);
}
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
;
}
//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
);
mismatch
^=
level
;
block
[
j
]
=
level
;
}
CLOSE_READER
(
re
,
&
s
->
gb
);
}
block
[
63
]
^=
mismatch
&
1
;
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
);
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
{
s
->
block_last_index
[
i
]
=
-
1
;
}
cbp
+=
cbp
;
quant_matrix
=
s
->
chroma_intra_matrix
;
component
=
(
n
&
1
)
+
1
;
}
}
else
{
cbp
<<=
12
-
mb_block_count
;
for
(
i
=
0
;
i
<
mb_block_count
;
i
++
)
{
if
(
cbp
&
(
1
<<
11
))
{
if
(
mpeg2_decode_block_non_intra
(
s
,
*
s
->
pblocks
[
i
],
i
)
<
0
)
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
;
{
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
->
block_last_index
[
i
]
=
-
1
;
}
cbp
+=
cbp
;
/* 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
;
}
}
}
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
;
block
[
j
]
=
level
;
}
cbp
+=
cbp
;
CLOSE_READER
(
re
,
&
s
->
gb
)
;
}
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
{
for
(
i
=
0
;
i
<
6
;
i
++
)
{
if
(
cbp
&
32
)
{
if
(
mpeg1_decode_block_inter
(
s
,
*
s
->
pblocks
[
i
],
i
)
<
0
)
return
-
1
;
if
(
code
==
rl
->
n
)
{
//esc
run
=
65
;
level
=
0
;
}
else
if
(
code
==
rl
->
n
+
1
)
{
//eob
run
=
0
;
level
=
127
;
}
else
{
s
->
block_last_index
[
i
]
=
-
1
;
}
cbp
+=
cbp
;
}
}
run
=
rl
->
table_run
[
code
]
+
1
;
level
=
rl
->
table_level
[
code
];
}
}
else
{
for
(
i
=
0
;
i
<
12
;
i
++
)
s
->
block_last_index
[
i
]
=
-
1
;
}
rl
->
rl_vlc
[
0
][
i
].
len
=
len
;
rl
->
rl_vlc
[
0
][
i
].
level
=
level
;
rl
->
rl_vlc
[
0
][
i
].
run
=
run
;
}
}
s
->
current_picture
.
f
.
mb_type
[
s
->
mb_x
+
s
->
mb_y
*
s
->
mb_stride
]
=
mb_type
;
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
];
return
0
;
}
/* as H.263, but only 17 codes */
static
int
mpeg_decode_motion
(
MpegEncContext
*
s
,
int
fcode
,
int
pred
)
void
ff_mpeg1_clean_buffers
(
MpegEncContext
*
s
)
{
int
code
,
sign
,
val
,
l
,
shift
;
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
));
}
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
;
/******************************************/
/* decoding */
/* modulo decoding */
l
=
INT_BIT
-
5
-
shift
;
val
=
(
val
<<
l
)
>>
l
;
return
val
;
VLC
ff_dc_lum_vlc
;
VLC
ff_dc_chroma_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
;
if
(
!
done
)
{
done
=
1
;
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
);
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
]);
INIT_2D_VLC_RL
(
ff_rl_mpeg1
,
680
);
INIT_2D_VLC_RL
(
ff_rl_mpeg2
,
674
);
}
}
static
inline
int
mpeg1_decode_block_intra
(
MpegEncContext
*
s
,
DCTELEM
*
block
,
int
n
)
static
inline
int
get_dmv
(
MpegEncContext
*
s
)
{
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
;
/* 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
(
get_bits1
(
&
s
->
gb
))
return
1
-
(
get_bits1
(
&
s
->
gb
)
<<
1
);
else
return
0
;
}
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
;
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
{
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
;
}
CLOSE_READER
(
re
,
&
s
->
gb
);
return
qscale
<<
1
;
}
s
->
block_last_index
[
n
]
=
i
;
return
0
;
}
int
ff_mpeg1_decode_block_intra
(
MpegEncContext
*
s
,
DCTELEM
*
block
,
int
n
)
static
void
exchange_uv
(
MpegEncContext
*
s
)
{
return
mpeg1_decode_block_intra
(
s
,
block
,
n
);
DCTELEM
(
*
tmp
)[
64
];
tmp
=
s
->
pblocks
[
4
];
s
->
pblocks
[
4
]
=
s
->
pblocks
[
5
];
s
->
pblocks
[
5
]
=
tmp
;
}
static
inline
int
mpeg1_decode_block_inter
(
MpegEncContext
*
s
,
DCTELEM
*
block
,
int
n
)
/* motion type (for MPEG-2) */
#define MT_FIELD 1
#define MT_FRAME 2
#define MT_16X8 2
#define MT_DMV 3
static
int
mpeg_decode_mb
(
MpegEncContext
*
s
,
DCTELEM
block
[
12
][
64
])
{
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
;
int
i
,
j
,
k
,
cbp
,
val
,
mb_type
,
motion_type
;
const
int
mb_block_count
=
4
+
(
1
<<
s
->
chroma_format
);
{
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
);
av_dlog
(
s
->
avctx
,
"decode_mb: x=%d y=%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
-
1
)
|
1
;
level
=
(
level
^
SHOW_SBITS
(
re
,
&
s
->
gb
,
1
))
-
SHOW_SBITS
(
re
,
&
s
->
gb
,
1
);
SKIP_BITS
(
re
,
&
s
->
gb
,
1
);
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
{
/* 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
);
int
mb_type
;
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));
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
;
}
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
;
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
;
}
mb_type
=
MB_TYPE_QUANT
|
MB_TYPE_INTRA
;
}
else
{
level
=
((
level
*
2
+
1
)
*
qscale
*
quant_matrix
[
j
])
>>
5
;
level
=
(
level
-
1
)
|
1
;
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
;
}
if
(
i
>
63
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"ac-tex damaged at %d %d
\n
"
,
s
->
mb_x
,
s
->
mb_y
);
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
;
}
block
[
j
]
=
level
;
if
(((
int32_t
)
GET_CACHE
(
re
,
&
s
->
gb
))
<=
(
int32_t
)
0xBFFFFFFF
)
mb_type
=
btype2mb_type
[
mb_type
];
break
;
UPDATE_CACHE
(
re
,
&
s
->
gb
);
}
end:
LAST_SKIP_BITS
(
re
,
&
s
->
gb
,
2
);
CLOSE_READER
(
re
,
&
s
->
gb
);
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
]);
}
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
;
/* 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
);
}
{
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
(
IS_QUANT
(
mb_type
))
s
->
qscale
=
get_qscale
(
s
);
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
]
=
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
]);
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
)
>>
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
);
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
);
}
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
;
for
(
i
=
0
;
i
<
mb_block_count
;
i
++
)
{
if
(
mpeg2_decode_block_intra
(
s
,
*
s
->
pblocks
[
i
],
i
)
<
0
)
return
-
1
;
}
}
block
[
j
]
=
level
;
if
(((
int32_t
)
GET_CACHE
(
re
,
&
s
->
gb
))
<=
(
int32_t
)
0xBFFFFFFF
)
break
;
UPDATE_CACHE
(
re
,
&
s
->
gb
);
}
else
{
for
(
i
=
0
;
i
<
6
;
i
++
)
{
if
(
mpeg1_decode_block_intra
(
s
,
*
s
->
pblocks
[
i
],
i
)
<
0
)
return
-
1
;
}
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
;
mismatch
=
1
;
{
OPEN_READER
(
re
,
&
s
->
gb
);
i
=
-
1
;
if
(
n
<
4
)
quant_matrix
=
s
->
inter_matrix
;
else
quant_matrix
=
s
->
chroma_inter_matrix
;
}
else
{
if
(
mb_type
&
MB_TYPE_ZERO_MV
)
{
assert
(
mb_type
&
MB_TYPE_CBP
);
// 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
;
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
;
}
/* 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
*
quant_matrix
[
j
])
>>
5
;
level
=
(
level
^
SHOW_SBITS
(
re
,
&
s
->
gb
,
1
))
-
SHOW_SBITS
(
re
,
&
s
->
gb
,
1
)
;
SKIP_BITS
(
re
,
&
s
->
gb
,
1
)
;
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
{
/* 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
);
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
);
}
i
+=
run
;
j
=
scantable
[
i
];
if
(
level
<
0
)
{
level
=
((
-
level
*
2
+
1
)
*
qscale
*
quant_matrix
[
j
])
>>
5
;
level
=
-
level
;
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
{
level
=
((
level
*
2
+
1
)
*
qscale
*
quant_matrix
[
j
])
>>
5
;
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
;
}
}
}
}
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
;
if
(((
int32_t
)
GET_CACHE
(
re
,
&
s
->
gb
))
<=
(
int32_t
)
0xBFFFFFFF
)
break
;
UPDATE_CACHE
(
re
,
&
s
->
gb
);
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
);
}
end:
LAST_SKIP_BITS
(
re
,
&
s
->
gb
,
2
);
CLOSE_READER
(
re
,
&
s
->
gb
);
}
block
[
63
]
^=
(
mismatch
&
1
);
}
}
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
;
s
->
block_last_index
[
n
]
=
i
;
return
0
;
}
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
);
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
;
// 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
[
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
if
(
s
->
picture_structure
==
PICT_FRAME
)
{
mb_type
|=
MB_TYPE_16x16
|
MB_TYPE_INTERLACED
;
/* now quantify & encode AC coefficients */
for
(;;)
{
GET_RL_VLC
(
level
,
run
,
re
,
&
s
->
gb
,
rl
->
rl_vlc
[
0
],
TEX_VLC_BITS
,
2
,
0
);
// m = 1 + 2 * s->top_field_first;
m
=
s
->
top_field_first
?
1
:
3
;
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
)
;
/* 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
{
/* 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
);
mb_type
|=
MB_TYPE_16x16
;
i
+=
run
;
j
=
scantable
[
i
]
;
if
(
level
<
0
)
{
level
=
((
-
level
*
2
+
1
)
*
qscale
)
>>
1
;
level
=
-
level
;
}
else
{
level
=
((
level
*
2
+
1
)
*
qscale
)
>>
1
;
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
]
++
;
}
}
}
block
[
j
]
=
level
;
if
(((
int32_t
)
GET_CACHE
(
re
,
&
s
->
gb
))
<=
(
int32_t
)
0xBFFFFFFF
)
break
;
UPDATE_CACHE
(
re
,
&
s
->
gb
);
default:
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"00 motion_type at %d %d
\n
"
,
s
->
mb_x
,
s
->
mb_y
);
return
-
1
;
}
}
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
;
s
->
mb_intra
=
0
;
if
(
HAS_CBP
(
mb_type
))
{
s
->
dsp
.
clear_blocks
(
s
->
block
[
0
]);
/* DC coefficient */
if
(
n
<
4
)
{
quant_matrix
=
s
->
intra_matrix
;
component
=
0
;
}
else
{
quant_matrix
=
s
->
chroma_intra_matrix
;
component
=
(
n
&
1
)
+
1
;
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
]);
}
diff
=
decode_dc
(
&
s
->
gb
,
component
);
if
(
diff
>=
0xffff
)
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
=
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 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
);
}
}
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
;
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
{
level
=
(
level
*
qscale
*
quant_matrix
[
j
])
>>
4
;
s
->
block_last_index
[
i
]
=
-
1
;
}
cbp
+=
cbp
;
}
if
(
i
>
63
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"ac-tex damaged at %d %d
\n
"
,
s
->
mb_x
,
s
->
mb_y
);
}
else
{
cbp
<<=
12
-
mb_block_count
;
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
;
}
mismatch
^=
level
;
block
[
j
]
=
level
;
cbp
+=
cbp
;
}
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
{
quant_matrix
=
s
->
chroma_intra_matrix
;
component
=
(
n
&
1
)
+
1
;
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
;
}
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
;
{
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
{
/* 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
;
for
(
i
=
0
;
i
<
6
;
i
++
)
{
if
(
cbp
&
32
)
{
if
(
mpeg1_decode_block_inter
(
s
,
*
s
->
pblocks
[
i
],
i
)
<
0
)
return
-
1
;
}
else
{
level
=
(
level
*
qscale
*
quant_matrix
[
j
])
>>
4
;
s
->
block_last_index
[
i
]
=
-
1
;
}
cbp
+=
cbp
;
}
block
[
j
]
=
level
;
}
CLOSE_READER
(
re
,
&
s
->
gb
);
}
}
else
{
for
(
i
=
0
;
i
<
12
;
i
++
)
s
->
block_last_index
[
i
]
=
-
1
;
}
}
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