Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
F
ffmpeg.wasm-core
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Linshizhi
ffmpeg.wasm-core
Commits
56febc99
Commit
56febc99
authored
Jan 17, 2015
by
Anton Khirnov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
h264: move the slice type variables into the per-slice context
parent
5f390eef
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
13 changed files
with
128 additions
and
123 deletions
+128
-123
dxva2_h264.c
libavcodec/dxva2_h264.c
+5
-4
h264.c
libavcodec/h264.c
+8
-8
h264.h
libavcodec/h264.h
+10
-9
h264_cabac.c
libavcodec/h264_cabac.c
+25
-22
h264_cavlc.c
libavcodec/h264_cavlc.c
+9
-9
h264_direct.c
libavcodec/h264_direct.c
+2
-2
h264_mb.c
libavcodec/h264_mb.c
+1
-1
h264_mvpred.h
libavcodec/h264_mvpred.h
+10
-10
h264_parser.c
libavcodec/h264_parser.c
+5
-5
h264_refs.c
libavcodec/h264_refs.c
+3
-3
h264_slice.c
libavcodec/h264_slice.c
+41
-41
svq3.c
libavcodec/svq3.c
+7
-7
vaapi_h264.c
libavcodec/vaapi_h264.c
+2
-2
No files found.
libavcodec/dxva2_h264.c
View file @
56febc99
...
...
@@ -223,8 +223,8 @@ static void fill_slice_long(AVCodecContext *avctx, DXVA_Slice_H264_Long *slice,
slice
->
first_mb_in_slice
=
(
h
->
mb_y
>>
FIELD_OR_MBAFF_PICTURE
(
h
))
*
h
->
mb_width
+
h
->
mb_x
;
slice
->
NumMbsForSlice
=
0
;
/* XXX it is set once we have all slices */
slice
->
BitOffsetToSliceData
=
get_bits_count
(
&
h
->
gb
);
slice
->
slice_type
=
ff_h264_get_slice_type
(
h
);
if
(
h
->
slice_type_fixed
)
slice
->
slice_type
=
ff_h264_get_slice_type
(
sl
);
if
(
sl
->
slice_type_fixed
)
slice
->
slice_type
+=
5
;
slice
->
luma_log2_weight_denom
=
sl
->
luma_log2_weight_denom
;
slice
->
chroma_log2_weight_denom
=
sl
->
chroma_log2_weight_denom
;
...
...
@@ -278,7 +278,7 @@ static void fill_slice_long(AVCodecContext *avctx, DXVA_Slice_H264_Long *slice,
slice
->
slice_qs_delta
=
0
;
/* XXX not implemented by Libav */
slice
->
slice_qp_delta
=
sl
->
qscale
-
h
->
pps
.
init_qp
;
slice
->
redundant_pic_cnt
=
h
->
redundant_pic_count
;
if
(
h
->
slice_type
==
AV_PICTURE_TYPE_B
)
if
(
sl
->
slice_type
==
AV_PICTURE_TYPE_B
)
slice
->
direct_spatial_mv_pred_flag
=
h
->
direct_spatial_mv_pred
;
slice
->
cabac_init_idc
=
h
->
pps
.
cabac
?
h
->
cabac_init_idc
:
0
;
if
(
h
->
deblocking_filter
<
2
)
...
...
@@ -417,6 +417,7 @@ static int dxva2_h264_decode_slice(AVCodecContext *avctx,
uint32_t
size
)
{
const
H264Context
*
h
=
avctx
->
priv_data
;
const
H264SliceContext
*
sl
=
&
h
->
slice_ctx
[
0
];
struct
dxva_context
*
ctx
=
avctx
->
hwaccel_context
;
const
H264Picture
*
current_picture
=
h
->
cur_pic_ptr
;
struct
dxva2_picture_context
*
ctx_pic
=
current_picture
->
hwaccel_picture_private
;
...
...
@@ -438,7 +439,7 @@ static int dxva2_h264_decode_slice(AVCodecContext *avctx,
&
ctx_pic
->
pp
,
position
,
size
);
ctx_pic
->
slice_count
++
;
if
(
h
->
slice_type
!=
AV_PICTURE_TYPE_I
&&
h
->
slice_type
!=
AV_PICTURE_TYPE_SI
)
if
(
sl
->
slice_type
!=
AV_PICTURE_TYPE_I
&&
sl
->
slice_type
!=
AV_PICTURE_TYPE_SI
)
ctx_pic
->
pp
.
wBitFields
&=
~
(
1
<<
15
);
/* Set IntraPicFlag to 0 */
return
0
;
}
...
...
libavcodec/h264.c
View file @
56febc99
...
...
@@ -1058,7 +1058,7 @@ int ff_pred_weight_table(H264Context *h, H264SliceContext *sl)
}
}
}
if
(
h
->
slice_type_nos
!=
AV_PICTURE_TYPE_B
)
if
(
sl
->
slice_type_nos
!=
AV_PICTURE_TYPE_B
)
break
;
}
sl
->
use_weight
=
sl
->
use_weight
||
sl
->
use_weight_chroma
;
...
...
@@ -1259,7 +1259,7 @@ int ff_h264_set_parameter_from_sps(H264Context *h)
return
0
;
}
int
ff_set_ref_count
(
H264Context
*
h
)
int
ff_set_ref_count
(
H264Context
*
h
,
H264SliceContext
*
sl
)
{
int
ref_count
[
2
],
list_count
;
int
num_ref_idx_active_override_flag
,
max_refs
;
...
...
@@ -1268,8 +1268,8 @@ int ff_set_ref_count(H264Context *h)
ref_count
[
0
]
=
h
->
pps
.
ref_count
[
0
];
ref_count
[
1
]
=
h
->
pps
.
ref_count
[
1
];
if
(
h
->
slice_type_nos
!=
AV_PICTURE_TYPE_I
)
{
if
(
h
->
slice_type_nos
==
AV_PICTURE_TYPE_B
)
if
(
sl
->
slice_type_nos
!=
AV_PICTURE_TYPE_I
)
{
if
(
sl
->
slice_type_nos
==
AV_PICTURE_TYPE_B
)
h
->
direct_spatial_mv_pred
=
get_bits1
(
&
h
->
gb
);
num_ref_idx_active_override_flag
=
get_bits1
(
&
h
->
gb
);
...
...
@@ -1277,14 +1277,14 @@ int ff_set_ref_count(H264Context *h)
ref_count
[
0
]
=
get_ue_golomb
(
&
h
->
gb
)
+
1
;
if
(
ref_count
[
0
]
<
1
)
return
AVERROR_INVALIDDATA
;
if
(
h
->
slice_type_nos
==
AV_PICTURE_TYPE_B
)
{
if
(
sl
->
slice_type_nos
==
AV_PICTURE_TYPE_B
)
{
ref_count
[
1
]
=
get_ue_golomb
(
&
h
->
gb
)
+
1
;
if
(
ref_count
[
1
]
<
1
)
return
AVERROR_INVALIDDATA
;
}
}
if
(
h
->
slice_type_nos
==
AV_PICTURE_TYPE_B
)
if
(
sl
->
slice_type_nos
==
AV_PICTURE_TYPE_B
)
list_count
=
2
;
else
list_count
=
1
;
...
...
@@ -1570,9 +1570,9 @@ again:
(
avctx
->
skip_frame
<
AVDISCARD_NONREF
||
hx
->
nal_ref_idc
)
&&
(
avctx
->
skip_frame
<
AVDISCARD_BIDIR
||
hx
->
slice_type_nos
!=
AV_PICTURE_TYPE_B
)
&&
sl
->
slice_type_nos
!=
AV_PICTURE_TYPE_B
)
&&
(
avctx
->
skip_frame
<
AVDISCARD_NONKEY
||
hx
->
slice_type_nos
==
AV_PICTURE_TYPE_I
)
&&
sl
->
slice_type_nos
==
AV_PICTURE_TYPE_I
)
&&
avctx
->
skip_frame
<
AVDISCARD_ALL
)
{
if
(
avctx
->
hwaccel
)
{
ret
=
avctx
->
hwaccel
->
decode_slice
(
avctx
,
...
...
libavcodec/h264.h
View file @
56febc99
...
...
@@ -299,6 +299,11 @@ typedef struct H264Picture {
typedef
struct
H264SliceContext
{
struct
H264Context
*
h264
;
int
slice_num
;
int
slice_type
;
int
slice_type_nos
;
///< S free slice type (SI/SP are remapped to I/P)
int
slice_type_fixed
;
int
qscale
;
int
chroma_qp
[
2
];
// QPc
int
qp_thresh
;
///< QP threshold to skip loopfilter
...
...
@@ -424,11 +429,7 @@ typedef struct H264Context {
uint32_t
(
*
dequant4_coeff
[
6
])[
16
];
uint32_t
(
*
dequant8_coeff
[
6
])[
64
];
int
slice_num
;
uint16_t
*
slice_table
;
///< slice_table_base + 2*mb_stride + 1
int
slice_type
;
int
slice_type_nos
;
///< S free slice type (SI/SP are remapped to I/P)
int
slice_type_fixed
;
// interlacing specific flags
int
mb_aff_frame
;
...
...
@@ -759,7 +760,7 @@ void ff_h264_free_context(H264Context *h);
/**
* Reconstruct bitstream slice_type.
*/
int
ff_h264_get_slice_type
(
const
H264
Context
*
h
);
int
ff_h264_get_slice_type
(
const
H264
SliceContext
*
sl
);
/**
* Allocate tables.
...
...
@@ -770,7 +771,7 @@ int ff_h264_alloc_tables(H264Context *h);
/**
* Fill the default_ref_list.
*/
int
ff_h264_fill_default_ref_list
(
H264Context
*
h
);
int
ff_h264_fill_default_ref_list
(
H264Context
*
h
,
H264SliceContext
*
sl
);
int
ff_h264_decode_ref_pic_list_reordering
(
H264Context
*
h
);
void
ff_h264_fill_mbaff_ref_list
(
H264Context
*
h
,
H264SliceContext
*
sl
);
...
...
@@ -821,7 +822,7 @@ void ff_h264_init_cabac_states(H264Context *h, H264SliceContext *sl);
void
h264_init_dequant_tables
(
H264Context
*
h
);
void
ff_h264_direct_dist_scale_factor
(
H264Context
*
const
h
);
void
ff_h264_direct_ref_list_init
(
H264Context
*
const
h
);
void
ff_h264_direct_ref_list_init
(
H264Context
*
const
h
,
H264SliceContext
*
sl
);
void
ff_h264_pred_direct_motion
(
H264Context
*
const
h
,
H264SliceContext
*
sl
,
int
*
mb_type
);
...
...
@@ -1023,7 +1024,7 @@ static av_always_inline void write_back_motion(H264Context *h,
if
(
USES_LIST
(
mb_type
,
1
))
write_back_motion_list
(
h
,
sl
,
b_stride
,
b_xy
,
b8_xy
,
mb_type
,
1
);
if
(
h
->
slice_type_nos
==
AV_PICTURE_TYPE_B
&&
CABAC
(
h
))
{
if
(
sl
->
slice_type_nos
==
AV_PICTURE_TYPE_B
&&
CABAC
(
h
))
{
if
(
IS_8X8
(
mb_type
))
{
uint8_t
*
direct_table
=
&
h
->
direct_table
[
4
*
h
->
mb_xy
];
direct_table
[
1
]
=
h
->
sub_mb_type
[
1
]
>>
1
;
...
...
@@ -1056,7 +1057,7 @@ int ff_h264_set_parameter_from_sps(H264Context *h);
void
ff_h264_draw_horiz_band
(
H264Context
*
h
,
int
y
,
int
height
);
int
ff_init_poc
(
H264Context
*
h
,
int
pic_field_poc
[
2
],
int
*
pic_poc
);
int
ff_pred_weight_table
(
H264Context
*
h
,
H264SliceContext
*
sl
);
int
ff_set_ref_count
(
H264Context
*
h
);
int
ff_set_ref_count
(
H264Context
*
h
,
H264SliceContext
*
sl
);
int
ff_h264_decode_slice_header
(
H264Context
*
h
,
H264SliceContext
*
sl
,
H264Context
*
h0
);
int
ff_h264_execute_decode_slices
(
H264Context
*
h
,
unsigned
context_count
);
...
...
libavcodec/h264_cabac.c
View file @
56febc99
...
...
@@ -1267,7 +1267,7 @@ void ff_h264_init_cabac_states(H264Context *h, H264SliceContext *sl)
const
int8_t
(
*
tab
)[
2
];
const
int
slice_qp
=
av_clip
(
sl
->
qscale
-
6
*
(
h
->
sps
.
bit_depth_luma
-
8
),
0
,
51
);
if
(
h
->
slice_type_nos
==
AV_PICTURE_TYPE_I
)
tab
=
cabac_context_init_I
;
if
(
sl
->
slice_type_nos
==
AV_PICTURE_TYPE_I
)
tab
=
cabac_context_init_I
;
else
tab
=
cabac_context_init_PB
[
h
->
cabac_init_idc
];
/* calculate pre-state */
...
...
@@ -1282,13 +1282,14 @@ void ff_h264_init_cabac_states(H264Context *h, H264SliceContext *sl)
}
}
static
int
decode_cabac_field_decoding_flag
(
H264Context
*
h
)
{
static
int
decode_cabac_field_decoding_flag
(
H264Context
*
h
,
H264SliceContext
*
sl
)
{
const
long
mbb_xy
=
h
->
mb_xy
-
2L
*
h
->
mb_stride
;
unsigned
long
ctx
=
0
;
ctx
+=
h
->
mb_field_decoding_flag
&
!!
h
->
mb_x
;
//for FMO:(s->current_picture.mb_type[mba_xy] >> 7) & (h->slice_table[mba_xy] == h->slice_num);
ctx
+=
(
h
->
cur_pic
.
mb_type
[
mbb_xy
]
>>
7
)
&
(
h
->
slice_table
[
mbb_xy
]
==
h
->
slice_num
);
ctx
+=
(
h
->
cur_pic
.
mb_type
[
mbb_xy
]
>>
7
)
&
(
h
->
slice_table
[
mbb_xy
]
==
sl
->
slice_num
);
return
get_cabac_noinline
(
&
h
->
cabac
,
&
(
h
->
cabac_state
+
70
)[
ctx
]
);
}
...
...
@@ -1325,7 +1326,9 @@ static int decode_cabac_intra_mb_type(H264Context *h, H264SliceContext *sl,
return
mb_type
;
}
static
int
decode_cabac_mb_skip
(
H264Context
*
h
,
int
mb_x
,
int
mb_y
)
{
static
int
decode_cabac_mb_skip
(
H264Context
*
h
,
H264SliceContext
*
sl
,
int
mb_x
,
int
mb_y
)
{
int
mba_xy
,
mbb_xy
;
int
ctx
=
0
;
...
...
@@ -1333,13 +1336,13 @@ static int decode_cabac_mb_skip( H264Context *h, int mb_x, int mb_y ) {
int
mb_xy
=
mb_x
+
(
mb_y
&~
1
)
*
h
->
mb_stride
;
mba_xy
=
mb_xy
-
1
;
if
(
(
mb_y
&
1
)
&&
h
->
slice_table
[
mba_xy
]
==
h
->
slice_num
&&
h
->
slice_table
[
mba_xy
]
==
sl
->
slice_num
&&
MB_FIELD
(
h
)
==
!!
IS_INTERLACED
(
h
->
cur_pic
.
mb_type
[
mba_xy
]
)
)
mba_xy
+=
h
->
mb_stride
;
if
(
MB_FIELD
(
h
))
{
mbb_xy
=
mb_xy
-
h
->
mb_stride
;
if
(
!
(
mb_y
&
1
)
&&
h
->
slice_table
[
mbb_xy
]
==
h
->
slice_num
&&
h
->
slice_table
[
mbb_xy
]
==
sl
->
slice_num
&&
IS_INTERLACED
(
h
->
cur_pic
.
mb_type
[
mbb_xy
]
)
)
mbb_xy
-=
h
->
mb_stride
;
}
else
...
...
@@ -1350,12 +1353,12 @@ static int decode_cabac_mb_skip( H264Context *h, int mb_x, int mb_y ) {
mbb_xy
=
mb_xy
-
(
h
->
mb_stride
<<
FIELD_PICTURE
(
h
));
}
if
(
h
->
slice_table
[
mba_xy
]
==
h
->
slice_num
&&
!
IS_SKIP
(
h
->
cur_pic
.
mb_type
[
mba_xy
]
))
if
(
h
->
slice_table
[
mba_xy
]
==
sl
->
slice_num
&&
!
IS_SKIP
(
h
->
cur_pic
.
mb_type
[
mba_xy
]
))
ctx
++
;
if
(
h
->
slice_table
[
mbb_xy
]
==
h
->
slice_num
&&
!
IS_SKIP
(
h
->
cur_pic
.
mb_type
[
mbb_xy
]
))
if
(
h
->
slice_table
[
mbb_xy
]
==
sl
->
slice_num
&&
!
IS_SKIP
(
h
->
cur_pic
.
mb_type
[
mbb_xy
]
))
ctx
++
;
if
(
h
->
slice_type_nos
==
AV_PICTURE_TYPE_B
)
if
(
sl
->
slice_type_nos
==
AV_PICTURE_TYPE_B
)
ctx
+=
13
;
return
get_cabac_noinline
(
&
h
->
cabac
,
&
h
->
cabac_state
[
11
+
ctx
]
);
}
...
...
@@ -1466,7 +1469,7 @@ static int decode_cabac_mb_ref(H264Context *h, H264SliceContext *sl, int list, i
int
ref
=
0
;
int
ctx
=
0
;
if
(
h
->
slice_type_nos
==
AV_PICTURE_TYPE_B
)
{
if
(
sl
->
slice_type_nos
==
AV_PICTURE_TYPE_B
)
{
if
(
refa
>
0
&&
!
(
h
->
direct_cache
[
scan8
[
n
]
-
1
]
&
(
MB_TYPE_DIRECT2
>>
1
))
)
ctx
++
;
if
(
refb
>
0
&&
!
(
h
->
direct_cache
[
scan8
[
n
]
-
8
]
&
(
MB_TYPE_DIRECT2
>>
1
))
)
...
...
@@ -1908,20 +1911,20 @@ int ff_h264_decode_mb_cabac(H264Context *h, H264SliceContext *sl)
mb_xy
=
h
->
mb_xy
=
h
->
mb_x
+
h
->
mb_y
*
h
->
mb_stride
;
tprintf
(
h
->
avctx
,
"pic:%d mb:%d/%d
\n
"
,
h
->
frame_num
,
h
->
mb_x
,
h
->
mb_y
);
if
(
h
->
slice_type_nos
!=
AV_PICTURE_TYPE_I
)
{
if
(
sl
->
slice_type_nos
!=
AV_PICTURE_TYPE_I
)
{
int
skip
;
/* a skipped mb needs the aff flag from the following mb */
if
(
FRAME_MBAFF
(
h
)
&&
(
h
->
mb_y
&
1
)
==
1
&&
sl
->
prev_mb_skipped
)
skip
=
sl
->
next_mb_skipped
;
else
skip
=
decode_cabac_mb_skip
(
h
,
h
->
mb_x
,
h
->
mb_y
);
skip
=
decode_cabac_mb_skip
(
h
,
sl
,
h
->
mb_x
,
h
->
mb_y
);
/* read skip flags */
if
(
skip
)
{
if
(
FRAME_MBAFF
(
h
)
&&
(
h
->
mb_y
&
1
)
==
0
)
{
h
->
cur_pic
.
mb_type
[
mb_xy
]
=
MB_TYPE_SKIP
;
sl
->
next_mb_skipped
=
decode_cabac_mb_skip
(
h
,
h
->
mb_x
,
h
->
mb_y
+
1
);
sl
->
next_mb_skipped
=
decode_cabac_mb_skip
(
h
,
sl
,
h
->
mb_x
,
h
->
mb_y
+
1
);
if
(
!
sl
->
next_mb_skipped
)
h
->
mb_mbaff
=
h
->
mb_field_decoding_flag
=
decode_cabac_field_decoding_flag
(
h
);
h
->
mb_mbaff
=
h
->
mb_field_decoding_flag
=
decode_cabac_field_decoding_flag
(
h
,
sl
);
}
decode_mb_skip
(
h
,
sl
);
...
...
@@ -1937,16 +1940,16 @@ int ff_h264_decode_mb_cabac(H264Context *h, H264SliceContext *sl)
if
(
FRAME_MBAFF
(
h
))
{
if
(
(
h
->
mb_y
&
1
)
==
0
)
h
->
mb_mbaff
=
h
->
mb_field_decoding_flag
=
decode_cabac_field_decoding_flag
(
h
);
h
->
mb_field_decoding_flag
=
decode_cabac_field_decoding_flag
(
h
,
sl
);
}
sl
->
prev_mb_skipped
=
0
;
fill_decode_neighbors
(
h
,
sl
,
-
(
MB_FIELD
(
h
)));
if
(
h
->
slice_type_nos
==
AV_PICTURE_TYPE_B
)
{
if
(
sl
->
slice_type_nos
==
AV_PICTURE_TYPE_B
)
{
int
ctx
=
0
;
assert
(
h
->
slice_type_nos
==
AV_PICTURE_TYPE_B
);
assert
(
sl
->
slice_type_nos
==
AV_PICTURE_TYPE_B
);
if
(
!
IS_DIRECT
(
sl
->
left_type
[
LTOP
]
-
1
))
ctx
++
;
...
...
@@ -1979,7 +1982,7 @@ int ff_h264_decode_mb_cabac(H264Context *h, H264SliceContext *sl)
}
partition_count
=
b_mb_type_info
[
mb_type
].
partition_count
;
mb_type
=
b_mb_type_info
[
mb_type
].
type
;
}
else
if
(
h
->
slice_type_nos
==
AV_PICTURE_TYPE_P
)
{
}
else
if
(
sl
->
slice_type_nos
==
AV_PICTURE_TYPE_P
)
{
if
(
get_cabac_noinline
(
&
h
->
cabac
,
&
h
->
cabac_state
[
14
]
)
==
0
)
{
/* P-type */
if
(
get_cabac_noinline
(
&
h
->
cabac
,
&
h
->
cabac_state
[
15
]
)
==
0
)
{
...
...
@@ -1997,9 +2000,9 @@ int ff_h264_decode_mb_cabac(H264Context *h, H264SliceContext *sl)
}
}
else
{
mb_type
=
decode_cabac_intra_mb_type
(
h
,
sl
,
3
,
1
);
if
(
h
->
slice_type
==
AV_PICTURE_TYPE_SI
&&
mb_type
)
if
(
sl
->
slice_type
==
AV_PICTURE_TYPE_SI
&&
mb_type
)
mb_type
--
;
assert
(
h
->
slice_type_nos
==
AV_PICTURE_TYPE_I
);
assert
(
sl
->
slice_type_nos
==
AV_PICTURE_TYPE_I
);
decode_intra_mb:
partition_count
=
0
;
cbp
=
i_mb_type_info
[
mb_type
].
cbp
;
...
...
@@ -2009,7 +2012,7 @@ decode_intra_mb:
if
(
MB_FIELD
(
h
))
mb_type
|=
MB_TYPE_INTERLACED
;
h
->
slice_table
[
mb_xy
]
=
h
->
slice_num
;
h
->
slice_table
[
mb_xy
]
=
sl
->
slice_num
;
if
(
IS_INTRA_PCM
(
mb_type
))
{
const
int
mb_size
=
ff_h264_mb_sizes
[
h
->
sps
.
chroma_format_idc
]
*
...
...
@@ -2085,7 +2088,7 @@ decode_intra_mb:
}
else
if
(
partition_count
==
4
)
{
int
i
,
j
,
sub_partition_count
[
4
],
list
,
ref
[
2
][
4
];
if
(
h
->
slice_type_nos
==
AV_PICTURE_TYPE_B
)
{
if
(
sl
->
slice_type_nos
==
AV_PICTURE_TYPE_B
)
{
for
(
i
=
0
;
i
<
4
;
i
++
)
{
h
->
sub_mb_type
[
i
]
=
decode_cabac_b_mb_sub_type
(
h
);
sub_partition_count
[
i
]
=
b_sub_mb_type_info
[
h
->
sub_mb_type
[
i
]
].
partition_count
;
...
...
libavcodec/h264_cavlc.c
View file @
56febc99
...
...
@@ -708,7 +708,7 @@ int ff_h264_decode_mb_cavlc(H264Context *h, H264SliceContext *sl)
tprintf
(
h
->
avctx
,
"pic:%d mb:%d/%d
\n
"
,
h
->
frame_num
,
h
->
mb_x
,
h
->
mb_y
);
cbp
=
0
;
/* avoid warning. FIXME: find a solution without slowing
down the code */
if
(
h
->
slice_type_nos
!=
AV_PICTURE_TYPE_I
)
{
if
(
sl
->
slice_type_nos
!=
AV_PICTURE_TYPE_I
)
{
if
(
h
->
mb_skip_run
==-
1
)
h
->
mb_skip_run
=
get_ue_golomb
(
&
h
->
gb
);
...
...
@@ -729,7 +729,7 @@ int ff_h264_decode_mb_cavlc(H264Context *h, H264SliceContext *sl)
sl
->
prev_mb_skipped
=
0
;
mb_type
=
get_ue_golomb
(
&
h
->
gb
);
if
(
h
->
slice_type_nos
==
AV_PICTURE_TYPE_B
)
{
if
(
sl
->
slice_type_nos
==
AV_PICTURE_TYPE_B
)
{
if
(
mb_type
<
23
){
partition_count
=
b_mb_type_info
[
mb_type
].
partition_count
;
mb_type
=
b_mb_type_info
[
mb_type
].
type
;
...
...
@@ -737,7 +737,7 @@ int ff_h264_decode_mb_cavlc(H264Context *h, H264SliceContext *sl)
mb_type
-=
23
;
goto
decode_intra_mb
;
}
}
else
if
(
h
->
slice_type_nos
==
AV_PICTURE_TYPE_P
)
{
}
else
if
(
sl
->
slice_type_nos
==
AV_PICTURE_TYPE_P
)
{
if
(
mb_type
<
5
){
partition_count
=
p_mb_type_info
[
mb_type
].
partition_count
;
mb_type
=
p_mb_type_info
[
mb_type
].
type
;
...
...
@@ -746,12 +746,12 @@ int ff_h264_decode_mb_cavlc(H264Context *h, H264SliceContext *sl)
goto
decode_intra_mb
;
}
}
else
{
assert
(
h
->
slice_type_nos
==
AV_PICTURE_TYPE_I
);
if
(
h
->
slice_type
==
AV_PICTURE_TYPE_SI
&&
mb_type
)
assert
(
sl
->
slice_type_nos
==
AV_PICTURE_TYPE_I
);
if
(
sl
->
slice_type
==
AV_PICTURE_TYPE_SI
&&
mb_type
)
mb_type
--
;
decode_intra_mb
:
if
(
mb_type
>
25
){
av_log
(
h
->
avctx
,
AV_LOG_ERROR
,
"mb_type %d in %c slice too large at %d %d
\n
"
,
mb_type
,
av_get_picture_type_char
(
h
->
slice_type
),
h
->
mb_x
,
h
->
mb_y
);
av_log
(
h
->
avctx
,
AV_LOG_ERROR
,
"mb_type %d in %c slice too large at %d %d
\n
"
,
mb_type
,
av_get_picture_type_char
(
sl
->
slice_type
),
h
->
mb_x
,
h
->
mb_y
);
return
-
1
;
}
partition_count
=
0
;
...
...
@@ -763,7 +763,7 @@ decode_intra_mb:
if
(
MB_FIELD
(
h
))
mb_type
|=
MB_TYPE_INTERLACED
;
h
->
slice_table
[
mb_xy
]
=
h
->
slice_num
;
h
->
slice_table
[
mb_xy
]
=
sl
->
slice_num
;
if
(
IS_INTRA_PCM
(
mb_type
)){
const
int
mb_size
=
ff_h264_mb_sizes
[
h
->
sps
.
chroma_format_idc
]
*
...
...
@@ -834,7 +834,7 @@ decode_intra_mb:
}
else
if
(
partition_count
==
4
){
int
i
,
j
,
sub_partition_count
[
4
],
list
,
ref
[
2
][
4
];
if
(
h
->
slice_type_nos
==
AV_PICTURE_TYPE_B
)
{
if
(
sl
->
slice_type_nos
==
AV_PICTURE_TYPE_B
)
{
for
(
i
=
0
;
i
<
4
;
i
++
){
h
->
sub_mb_type
[
i
]
=
get_ue_golomb_31
(
&
h
->
gb
);
if
(
h
->
sub_mb_type
[
i
]
>=
13
){
...
...
@@ -852,7 +852,7 @@ decode_intra_mb:
sl
->
ref_cache
[
1
][
scan8
[
12
]]
=
PART_NOT_AVAILABLE
;
}
}
else
{
assert
(
h
->
slice_type_nos
==
AV_PICTURE_TYPE_P
);
//FIXME SP correct ?
assert
(
sl
->
slice_type_nos
==
AV_PICTURE_TYPE_P
);
//FIXME SP correct ?
for
(
i
=
0
;
i
<
4
;
i
++
){
h
->
sub_mb_type
[
i
]
=
get_ue_golomb_31
(
&
h
->
gb
);
if
(
h
->
sub_mb_type
[
i
]
>=
4
){
...
...
libavcodec/h264_direct.c
View file @
56febc99
...
...
@@ -104,7 +104,7 @@ static void fill_colmap(H264Context *h, int map[2][16 + 32], int list,
}
}
void
ff_h264_direct_ref_list_init
(
H264Context
*
const
h
)
void
ff_h264_direct_ref_list_init
(
H264Context
*
const
h
,
H264SliceContext
*
sl
)
{
H264Picture
*
const
ref1
=
&
h
->
ref_list
[
1
][
0
];
H264Picture
*
const
cur
=
h
->
cur_pic_ptr
;
...
...
@@ -140,7 +140,7 @@ void ff_h264_direct_ref_list_init(H264Context *const h)
h
->
col_fieldoff
=
2
*
h
->
ref_list
[
1
][
0
].
reference
-
3
;
}
if
(
h
->
slice_type_nos
!=
AV_PICTURE_TYPE_B
||
h
->
direct_spatial_mv_pred
)
if
(
sl
->
slice_type_nos
!=
AV_PICTURE_TYPE_B
||
h
->
direct_spatial_mv_pred
)
return
;
for
(
list
=
0
;
list
<
2
;
list
++
)
{
...
...
libavcodec/h264_mb.c
View file @
56febc99
...
...
@@ -524,7 +524,7 @@ static av_always_inline void xchg_mb_border(H264Context *h, H264SliceContext *sl
}
if
(
h
->
deblocking_filter
==
2
)
{
deblock_topleft
=
h
->
slice_table
[
h
->
mb_xy
-
1
-
h
->
mb_stride
]
==
h
->
slice_num
;
deblock_topleft
=
h
->
slice_table
[
h
->
mb_xy
-
1
-
h
->
mb_stride
]
==
sl
->
slice_num
;
deblock_top
=
sl
->
top_type
;
}
else
{
deblock_topleft
=
(
h
->
mb_x
>
0
);
...
...
libavcodec/h264_mvpred.h
View file @
56febc99
...
...
@@ -423,22 +423,22 @@ static void fill_decode_neighbors(H264Context *h, H264SliceContext *sl, int mb_t
sl
->
left_type
[
LBOT
]
=
h
->
cur_pic
.
mb_type
[
left_xy
[
LBOT
]];
if
(
FMO
)
{
if
(
h
->
slice_table
[
topleft_xy
]
!=
h
->
slice_num
)
if
(
h
->
slice_table
[
topleft_xy
]
!=
sl
->
slice_num
)
sl
->
topleft_type
=
0
;
if
(
h
->
slice_table
[
top_xy
]
!=
h
->
slice_num
)
if
(
h
->
slice_table
[
top_xy
]
!=
sl
->
slice_num
)
sl
->
top_type
=
0
;
if
(
h
->
slice_table
[
left_xy
[
LTOP
]]
!=
h
->
slice_num
)
if
(
h
->
slice_table
[
left_xy
[
LTOP
]]
!=
sl
->
slice_num
)
sl
->
left_type
[
LTOP
]
=
sl
->
left_type
[
LBOT
]
=
0
;
}
else
{
if
(
h
->
slice_table
[
topleft_xy
]
!=
h
->
slice_num
)
{
if
(
h
->
slice_table
[
topleft_xy
]
!=
sl
->
slice_num
)
{
sl
->
topleft_type
=
0
;
if
(
h
->
slice_table
[
top_xy
]
!=
h
->
slice_num
)
if
(
h
->
slice_table
[
top_xy
]
!=
sl
->
slice_num
)
sl
->
top_type
=
0
;
if
(
h
->
slice_table
[
left_xy
[
LTOP
]]
!=
h
->
slice_num
)
if
(
h
->
slice_table
[
left_xy
[
LTOP
]]
!=
sl
->
slice_num
)
sl
->
left_type
[
LTOP
]
=
sl
->
left_type
[
LBOT
]
=
0
;
}
}
if
(
h
->
slice_table
[
topright_xy
]
!=
h
->
slice_num
)
if
(
h
->
slice_table
[
topright_xy
]
!=
sl
->
slice_num
)
sl
->
topright_type
=
0
;
}
...
...
@@ -720,7 +720,7 @@ static void fill_decode_caches(H264Context *h, H264SliceContext *sl, int mb_type
}
AV_ZERO16
(
mvd_cache
[
2
+
8
*
0
]);
AV_ZERO16
(
mvd_cache
[
2
+
8
*
2
]);
if
(
h
->
slice_type_nos
==
AV_PICTURE_TYPE_B
)
{
if
(
sl
->
slice_type_nos
==
AV_PICTURE_TYPE_B
)
{
uint8_t
*
direct_cache
=
&
h
->
direct_cache
[
scan8
[
0
]];
uint8_t
*
direct_table
=
h
->
direct_table
;
fill_rectangle
(
direct_cache
,
4
,
4
,
8
,
MB_TYPE_16x16
>>
1
,
1
);
...
...
@@ -810,7 +810,7 @@ static void av_unused decode_mb_skip(H264Context *h, H264SliceContext *sl)
if
(
MB_FIELD
(
h
))
mb_type
|=
MB_TYPE_INTERLACED
;
if
(
h
->
slice_type_nos
==
AV_PICTURE_TYPE_B
)
{
if
(
sl
->
slice_type_nos
==
AV_PICTURE_TYPE_B
)
{
// just for fill_caches. pred_direct_motion will set the real mb_type
mb_type
|=
MB_TYPE_L0L1
|
MB_TYPE_DIRECT2
|
MB_TYPE_SKIP
;
if
(
h
->
direct_spatial_mv_pred
)
{
...
...
@@ -829,7 +829,7 @@ static void av_unused decode_mb_skip(H264Context *h, H264SliceContext *sl)
write_back_motion
(
h
,
sl
,
mb_type
);
h
->
cur_pic
.
mb_type
[
mb_xy
]
=
mb_type
;
h
->
cur_pic
.
qscale_table
[
mb_xy
]
=
sl
->
qscale
;
h
->
slice_table
[
mb_xy
]
=
h
->
slice_num
;
h
->
slice_table
[
mb_xy
]
=
sl
->
slice_num
;
sl
->
prev_mb_skipped
=
1
;
}
...
...
libavcodec/h264_parser.c
View file @
56febc99
...
...
@@ -104,15 +104,15 @@ static int scan_mmco_reset(AVCodecParserContext *s)
H264Context
*
h
=
&
p
->
h
;
H264SliceContext
*
sl
=
&
h
->
slice_ctx
[
0
];
h
->
slice_type_nos
=
s
->
pict_type
&
3
;
sl
->
slice_type_nos
=
s
->
pict_type
&
3
;
if
(
h
->
pps
.
redundant_pic_cnt_present
)
get_ue_golomb
(
&
h
->
gb
);
// redundant_pic_count
if
(
ff_set_ref_count
(
h
)
<
0
)
if
(
ff_set_ref_count
(
h
,
sl
)
<
0
)
return
AVERROR_INVALIDDATA
;
if
(
h
->
slice_type_nos
!=
AV_PICTURE_TYPE_I
)
{
if
(
sl
->
slice_type_nos
!=
AV_PICTURE_TYPE_I
)
{
int
list
;
for
(
list
=
0
;
list
<
h
->
list_count
;
list
++
)
{
if
(
get_bits1
(
&
h
->
gb
))
{
...
...
@@ -140,8 +140,8 @@ static int scan_mmco_reset(AVCodecParserContext *s)
}
}
if
((
h
->
pps
.
weighted_pred
&&
h
->
slice_type_nos
==
AV_PICTURE_TYPE_P
)
||
(
h
->
pps
.
weighted_bipred_idc
==
1
&&
h
->
slice_type_nos
==
AV_PICTURE_TYPE_B
))
if
((
h
->
pps
.
weighted_pred
&&
sl
->
slice_type_nos
==
AV_PICTURE_TYPE_P
)
||
(
h
->
pps
.
weighted_bipred_idc
==
1
&&
sl
->
slice_type_nos
==
AV_PICTURE_TYPE_B
))
ff_pred_weight_table
(
h
,
sl
);
if
(
get_bits1
(
&
h
->
gb
))
{
// adaptive_ref_pic_marking_mode_flag
...
...
libavcodec/h264_refs.c
View file @
56febc99
...
...
@@ -116,11 +116,11 @@ static int add_sorted(H264Picture **sorted, H264Picture **src, int len, int limi
return
out_i
;
}
int
ff_h264_fill_default_ref_list
(
H264Context
*
h
)
int
ff_h264_fill_default_ref_list
(
H264Context
*
h
,
H264SliceContext
*
sl
)
{
int
i
,
len
;
if
(
h
->
slice_type_nos
==
AV_PICTURE_TYPE_B
)
{
if
(
sl
->
slice_type_nos
==
AV_PICTURE_TYPE_B
)
{
H264Picture
*
sorted
[
32
];
int
cur_poc
,
list
;
int
lens
[
2
];
...
...
@@ -174,7 +174,7 @@ int ff_h264_fill_default_ref_list(H264Context *h)
h
->
default_ref_list
[
0
][
i
].
pic_id
,
h
->
default_ref_list
[
0
][
i
].
f
.
data
[
0
]);
}
if
(
h
->
slice_type_nos
==
AV_PICTURE_TYPE_B
)
{
if
(
sl
->
slice_type_nos
==
AV_PICTURE_TYPE_B
)
{
for
(
i
=
0
;
i
<
h
->
ref_count
[
1
];
i
++
)
{
tprintf
(
h
->
avctx
,
"List1: %s fn:%d 0x%p
\n
"
,
(
h
->
default_ref_list
[
1
][
i
].
long_ref
?
"LT"
:
"ST"
),
...
...
libavcodec/h264_slice.c
View file @
56febc99
This diff is collapsed.
Click to expand it.
libavcodec/svq3.c
View file @
56febc99
...
...
@@ -817,7 +817,7 @@ static int svq3_decode_slice_header(AVCodecContext *avctx)
return
-
1
;
}
h
->
slice_type
=
golomb_to_pict_type
[
slice_id
];
sl
->
slice_type
=
golomb_to_pict_type
[
slice_id
];
if
((
header
&
0x9F
)
==
2
)
{
i
=
(
h
->
mb_num
<
64
)
?
6
:
(
1
+
av_log2
(
h
->
mb_num
-
1
));
...
...
@@ -828,7 +828,7 @@ static int svq3_decode_slice_header(AVCodecContext *avctx)
h
->
mb_skip_run
=
0
;
}
h
->
slice_num
=
get_bits
(
&
h
->
gb
,
8
);
sl
->
slice_num
=
get_bits
(
&
h
->
gb
,
8
);
sl
->
qscale
=
get_bits
(
&
h
->
gb
,
5
);
s
->
adaptive_quant
=
get_bits1
(
&
h
->
gb
);
...
...
@@ -1134,7 +1134,7 @@ static int svq3_decode_frame(AVCodecContext *avctx, void *data,
if
(
svq3_decode_slice_header
(
avctx
))
return
-
1
;
h
->
pict_type
=
h
->
slice_type
;
h
->
pict_type
=
sl
->
slice_type
;
if
(
h
->
pict_type
!=
AV_PICTURE_TYPE_B
)
FFSWAP
(
H264Picture
*
,
s
->
next_pic
,
s
->
last_pic
);
...
...
@@ -1198,7 +1198,7 @@ static int svq3_decode_frame(AVCodecContext *avctx, void *data,
"%c hpel:%d, tpel:%d aqp:%d qp:%d, slice_num:%02X
\n
"
,
av_get_picture_type_char
(
h
->
pict_type
),
s
->
halfpel_flag
,
s
->
thirdpel_flag
,
s
->
adaptive_quant
,
h
->
slice_ctx
[
0
].
qscale
,
h
->
slice_num
);
s
->
adaptive_quant
,
h
->
slice_ctx
[
0
].
qscale
,
sl
->
slice_num
);
if
(
avctx
->
skip_frame
>=
AVDISCARD_NONREF
&&
h
->
pict_type
==
AV_PICTURE_TYPE_B
||
avctx
->
skip_frame
>=
AVDISCARD_NONKEY
&&
h
->
pict_type
!=
AV_PICTURE_TYPE_I
||
...
...
@@ -1213,7 +1213,7 @@ static int svq3_decode_frame(AVCodecContext *avctx, void *data,
}
if
(
h
->
pict_type
==
AV_PICTURE_TYPE_B
)
{
h
->
frame_num_offset
=
h
->
slice_num
-
h
->
prev_frame_num
;
h
->
frame_num_offset
=
sl
->
slice_num
-
h
->
prev_frame_num
;
if
(
h
->
frame_num_offset
<
0
)
h
->
frame_num_offset
+=
256
;
...
...
@@ -1224,7 +1224,7 @@ static int svq3_decode_frame(AVCodecContext *avctx, void *data,
}
}
else
{
h
->
prev_frame_num
=
h
->
frame_num
;
h
->
frame_num
=
h
->
slice_num
;
h
->
frame_num
=
sl
->
slice_num
;
h
->
prev_frame_num_offset
=
h
->
frame_num
-
h
->
prev_frame_num
;
if
(
h
->
prev_frame_num_offset
<
0
)
...
...
libavcodec/vaapi_h264.c
View file @
56febc99
...
...
@@ -329,8 +329,8 @@ static int vaapi_h264_decode_slice(AVCodecContext *avctx,
return
-
1
;
slice_param
->
slice_data_bit_offset
=
get_bits_count
(
&
h
->
gb
)
+
8
;
/* bit buffer started beyond nal_unit_type */
slice_param
->
first_mb_in_slice
=
(
h
->
mb_y
>>
FIELD_OR_MBAFF_PICTURE
(
h
))
*
h
->
mb_width
+
h
->
mb_x
;
slice_param
->
slice_type
=
ff_h264_get_slice_type
(
h
);
slice_param
->
direct_spatial_mv_pred_flag
=
h
->
slice_type
==
AV_PICTURE_TYPE_B
?
h
->
direct_spatial_mv_pred
:
0
;
slice_param
->
slice_type
=
ff_h264_get_slice_type
(
sl
);
slice_param
->
direct_spatial_mv_pred_flag
=
sl
->
slice_type
==
AV_PICTURE_TYPE_B
?
h
->
direct_spatial_mv_pred
:
0
;
slice_param
->
num_ref_idx_l0_active_minus1
=
h
->
list_count
>
0
?
h
->
ref_count
[
0
]
-
1
:
0
;
slice_param
->
num_ref_idx_l1_active_minus1
=
h
->
list_count
>
1
?
h
->
ref_count
[
1
]
-
1
:
0
;
slice_param
->
cabac_init_idc
=
h
->
cabac_init_idc
;
...
...
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