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
bc98e8c0
Commit
bc98e8c0
authored
Jan 17, 2015
by
Anton Khirnov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
h264: move mb_field_decoding_flag into the per-slice context
parent
6490a0c0
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
38 additions
and
37 deletions
+38
-37
h264.h
libavcodec/h264.h
+2
-1
h264_cabac.c
libavcodec/h264_cabac.c
+10
-10
h264_cavlc.c
libavcodec/h264_cavlc.c
+3
-3
h264_loopfilter.c
libavcodec/h264_loopfilter.c
+4
-4
h264_mb.c
libavcodec/h264_mb.c
+6
-6
h264_mb_template.c
libavcodec/h264_mb_template.c
+2
-2
h264_mvpred.h
libavcodec/h264_mvpred.h
+6
-6
h264_slice.c
libavcodec/h264_slice.c
+5
-5
No files found.
libavcodec/h264.h
View file @
bc98e8c0
...
...
@@ -364,6 +364,8 @@ typedef struct H264SliceContext {
int
mb_skip_run
;
int
is_complex
;
int
mb_field_decoding_flag
;
int
redundant_pic_count
;
/**
...
...
@@ -494,7 +496,6 @@ typedef struct H264Context {
// interlacing specific flags
int
mb_aff_frame
;
int
mb_field_decoding_flag
;
int
mb_mbaff
;
///< mb_aff_frame && mb_field_decoding_flag
int
picture_structure
;
int
first_field
;
...
...
libavcodec/h264_cabac.c
View file @
bc98e8c0
...
...
@@ -1288,7 +1288,7 @@ static int decode_cabac_field_decoding_flag(H264Context *h, H264SliceContext *sl
unsigned
long
ctx
=
0
;
ctx
+=
h
->
mb_field_decoding_flag
&
!!
sl
->
mb_x
;
//for FMO:(s->current_picture.mb_type[mba_xy] >> 7) & (h->slice_table[mba_xy] == h->slice_num);
ctx
+=
sl
->
mb_field_decoding_flag
&
!!
sl
->
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
]
==
sl
->
slice_num
);
return
get_cabac_noinline
(
&
sl
->
cabac
,
&
(
sl
->
cabac_state
+
70
)[
ctx
]
);
...
...
@@ -1337,9 +1337,9 @@ static int decode_cabac_mb_skip(H264Context *h, H264SliceContext *sl,
mba_xy
=
mb_xy
-
1
;
if
(
(
mb_y
&
1
)
&&
h
->
slice_table
[
mba_xy
]
==
sl
->
slice_num
&&
MB_FIELD
(
h
)
==
!!
IS_INTERLACED
(
h
->
cur_pic
.
mb_type
[
mba_xy
]
)
)
&&
MB_FIELD
(
sl
)
==
!!
IS_INTERLACED
(
h
->
cur_pic
.
mb_type
[
mba_xy
]
)
)
mba_xy
+=
h
->
mb_stride
;
if
(
MB_FIELD
(
h
))
{
if
(
MB_FIELD
(
sl
))
{
mbb_xy
=
mb_xy
-
h
->
mb_stride
;
if
(
!
(
mb_y
&
1
)
&&
h
->
slice_table
[
mbb_xy
]
==
sl
->
slice_num
...
...
@@ -1646,9 +1646,9 @@ decode_cabac_residual_internal(H264Context *h, H264SliceContext *sl,
#endif
significant_coeff_ctx_base
=
sl
->
cabac_state
+
significant_coeff_flag_offset
[
MB_FIELD
(
h
)][
cat
];
+
significant_coeff_flag_offset
[
MB_FIELD
(
sl
)][
cat
];
last_coeff_ctx_base
=
sl
->
cabac_state
+
last_coeff_flag_offset
[
MB_FIELD
(
h
)][
cat
];
+
last_coeff_flag_offset
[
MB_FIELD
(
sl
)][
cat
];
abs_level_m1_ctx_base
=
sl
->
cabac_state
+
coeff_abs_level_m1_offset
[
cat
];
...
...
@@ -1668,7 +1668,7 @@ decode_cabac_residual_internal(H264Context *h, H264SliceContext *sl,
if( last == max_coeff -1 ) {\
index[coeff_count++] = last;\
}
const
uint8_t
*
sig_off
=
significant_coeff_flag_offset_8x8
[
MB_FIELD
(
h
)];
const
uint8_t
*
sig_off
=
significant_coeff_flag_offset_8x8
[
MB_FIELD
(
sl
)];
#ifdef decode_significance
coeff_count
=
decode_significance_8x8
(
CC
,
significant_coeff_ctx_base
,
index
,
last_coeff_ctx_base
,
sig_off
);
...
...
@@ -1930,7 +1930,7 @@ int ff_h264_decode_mb_cabac(H264Context *h, H264SliceContext *sl)
h
->
cur_pic
.
mb_type
[
mb_xy
]
=
MB_TYPE_SKIP
;
sl
->
next_mb_skipped
=
decode_cabac_mb_skip
(
h
,
sl
,
sl
->
mb_x
,
sl
->
mb_y
+
1
);
if
(
!
sl
->
next_mb_skipped
)
h
->
mb_mbaff
=
h
->
mb_field_decoding_flag
=
decode_cabac_field_decoding_flag
(
h
,
sl
);
h
->
mb_mbaff
=
sl
->
mb_field_decoding_flag
=
decode_cabac_field_decoding_flag
(
h
,
sl
);
}
decode_mb_skip
(
h
,
sl
);
...
...
@@ -1946,12 +1946,12 @@ int ff_h264_decode_mb_cabac(H264Context *h, H264SliceContext *sl)
if
(
FRAME_MBAFF
(
h
))
{
if
((
sl
->
mb_y
&
1
)
==
0
)
h
->
mb_mbaff
=
h
->
mb_field_decoding_flag
=
decode_cabac_field_decoding_flag
(
h
,
sl
);
sl
->
mb_field_decoding_flag
=
decode_cabac_field_decoding_flag
(
h
,
sl
);
}
sl
->
prev_mb_skipped
=
0
;
fill_decode_neighbors
(
h
,
sl
,
-
(
MB_FIELD
(
h
)));
fill_decode_neighbors
(
h
,
sl
,
-
(
MB_FIELD
(
sl
)));
if
(
sl
->
slice_type_nos
==
AV_PICTURE_TYPE_B
)
{
int
ctx
=
0
;
...
...
@@ -2015,7 +2015,7 @@ decode_intra_mb:
sl
->
intra16x16_pred_mode
=
i_mb_type_info
[
mb_type
].
pred_mode
;
mb_type
=
i_mb_type_info
[
mb_type
].
type
;
}
if
(
MB_FIELD
(
h
))
if
(
MB_FIELD
(
sl
))
mb_type
|=
MB_TYPE_INTERLACED
;
h
->
slice_table
[
mb_xy
]
=
sl
->
slice_num
;
...
...
libavcodec/h264_cavlc.c
View file @
bc98e8c0
...
...
@@ -715,7 +715,7 @@ int ff_h264_decode_mb_cavlc(H264Context *h, H264SliceContext *sl)
if
(
sl
->
mb_skip_run
--
)
{
if
(
FRAME_MBAFF
(
h
)
&&
(
sl
->
mb_y
&
1
)
==
0
)
{
if
(
sl
->
mb_skip_run
==
0
)
h
->
mb_mbaff
=
h
->
mb_field_decoding_flag
=
get_bits1
(
&
sl
->
gb
);
h
->
mb_mbaff
=
sl
->
mb_field_decoding_flag
=
get_bits1
(
&
sl
->
gb
);
}
decode_mb_skip
(
h
,
sl
);
return
0
;
...
...
@@ -723,7 +723,7 @@ int ff_h264_decode_mb_cavlc(H264Context *h, H264SliceContext *sl)
}
if
(
FRAME_MBAFF
(
h
))
{
if
((
sl
->
mb_y
&
1
)
==
0
)
h
->
mb_mbaff
=
h
->
mb_field_decoding_flag
=
get_bits1
(
&
sl
->
gb
);
h
->
mb_mbaff
=
sl
->
mb_field_decoding_flag
=
get_bits1
(
&
sl
->
gb
);
}
sl
->
prev_mb_skipped
=
0
;
...
...
@@ -760,7 +760,7 @@ decode_intra_mb:
mb_type
=
i_mb_type_info
[
mb_type
].
type
;
}
if
(
MB_FIELD
(
h
))
if
(
MB_FIELD
(
sl
))
mb_type
|=
MB_TYPE_INTERLACED
;
h
->
slice_table
[
mb_xy
]
=
sl
->
slice_num
;
...
...
libavcodec/h264_loopfilter.c
View file @
bc98e8c0
...
...
@@ -755,9 +755,9 @@ void ff_h264_filter_mb(H264Context *h, H264SliceContext *sl,
{
3
+
4
*
0
,
3
+
4
*
1
,
3
+
4
*
2
,
3
+
4
*
3
,
3
+
4
*
0
,
3
+
4
*
1
,
3
+
4
*
2
,
3
+
4
*
3
},
}
};
const
uint8_t
*
off
=
offset
[
MB_FIELD
(
h
)][
mb_y
&
1
];
const
uint8_t
*
off
=
offset
[
MB_FIELD
(
sl
)][
mb_y
&
1
];
for
(
i
=
0
;
i
<
8
;
i
++
)
{
int
j
=
MB_FIELD
(
h
)
?
i
>>
2
:
i
&
1
;
int
j
=
MB_FIELD
(
sl
)
?
i
>>
2
:
i
&
1
;
int
mbn_xy
=
sl
->
left_mb_xy
[
LEFT
(
j
)];
int
mbn_type
=
sl
->
left_type
[
LEFT
(
j
)];
...
...
@@ -766,7 +766,7 @@ void ff_h264_filter_mb(H264Context *h, H264SliceContext *sl,
else
{
bS
[
i
]
=
1
+
!!
(
sl
->
non_zero_count_cache
[
12
+
8
*
(
i
>>
1
)]
|
((
!
h
->
pps
.
cabac
&&
IS_8x8DCT
(
mbn_type
))
?
(
h
->
cbp_table
[
mbn_xy
]
&
(((
MB_FIELD
(
h
)
?
(
i
&
2
)
:
(
mb_y
&
1
))
?
8
:
2
)
<<
12
))
(
h
->
cbp_table
[
mbn_xy
]
&
(((
MB_FIELD
(
sl
)
?
(
i
&
2
)
:
(
mb_y
&
1
))
?
8
:
2
)
<<
12
))
:
h
->
non_zero_count
[
mbn_xy
][
off
[
i
]
]));
}
...
...
@@ -790,7 +790,7 @@ void ff_h264_filter_mb(H264Context *h, H264SliceContext *sl,
/* Filter edge */
tprintf
(
h
->
avctx
,
"filter mb:%d/%d MBAFF, QPy:%d/%d, QPb:%d/%d QPr:%d/%d ls:%d uvls:%d"
,
mb_x
,
mb_y
,
qp
[
0
],
qp
[
1
],
bqp
[
0
],
bqp
[
1
],
rqp
[
0
],
rqp
[
1
],
linesize
,
uvlinesize
);
{
int
i
;
for
(
i
=
0
;
i
<
8
;
i
++
)
tprintf
(
h
->
avctx
,
" bS[%d]:%d"
,
i
,
bS
[
i
]);
tprintf
(
h
->
avctx
,
"
\n
"
);
}
if
(
MB_FIELD
(
h
))
{
if
(
MB_FIELD
(
sl
))
{
filter_mb_mbaff_edgev
(
h
,
img_y
,
linesize
,
bS
,
1
,
qp
[
0
],
a
,
b
,
1
);
filter_mb_mbaff_edgev
(
h
,
img_y
+
8
*
linesize
,
linesize
,
bS
+
4
,
1
,
qp
[
1
],
a
,
b
,
1
);
if
(
chroma
){
...
...
libavcodec/h264_mb.c
View file @
bc98e8c0
...
...
@@ -57,7 +57,7 @@ static inline void get_lowest_part_y(const H264Context *h, H264SliceContext *sl,
{
int
my
;
y_offset
+=
16
*
(
sl
->
mb_y
>>
MB_FIELD
(
h
));
y_offset
+=
16
*
(
sl
->
mb_y
>>
MB_FIELD
(
sl
));
if
(
list0
)
{
int
ref_n
=
sl
->
ref_cache
[
0
][
scan8
[
n
]];
...
...
@@ -225,7 +225,7 @@ static av_always_inline void mc_dir_part(const H264Context *h, H264SliceContext
const
int
full_mx
=
mx
>>
2
;
const
int
full_my
=
my
>>
2
;
const
int
pic_width
=
16
*
h
->
mb_width
;
const
int
pic_height
=
16
*
h
->
mb_height
>>
MB_FIELD
(
h
);
const
int
pic_height
=
16
*
h
->
mb_height
>>
MB_FIELD
(
sl
);
int
ysh
;
if
(
mx
&
7
)
...
...
@@ -285,7 +285,7 @@ static av_always_inline void mc_dir_part(const H264Context *h, H264SliceContext
}
ysh
=
3
-
(
chroma_idc
==
2
/* yuv422 */
);
if
(
chroma_idc
==
1
/* yuv420 */
&&
MB_FIELD
(
h
))
{
if
(
chroma_idc
==
1
/* yuv420 */
&&
MB_FIELD
(
sl
))
{
// chroma offset when predicting from a field of opposite parity
my
+=
2
*
((
sl
->
mb_y
&
1
)
-
(
pic
->
reference
-
1
));
emu
|=
(
my
>>
3
)
<
0
||
(
my
>>
3
)
+
8
>=
(
pic_height
>>
1
);
...
...
@@ -346,7 +346,7 @@ static av_always_inline void mc_part_std(const H264Context *h, H264SliceContext
dest_cr
+=
(
x_offset
<<
pixel_shift
)
+
y_offset
*
sl
->
mb_uvlinesize
;
}
x_offset
+=
8
*
sl
->
mb_x
;
y_offset
+=
8
*
(
sl
->
mb_y
>>
MB_FIELD
(
h
));
y_offset
+=
8
*
(
sl
->
mb_y
>>
MB_FIELD
(
sl
));
if
(
list0
)
{
H264Picture
*
ref
=
&
sl
->
ref_list
[
0
][
sl
->
ref_cache
[
0
][
scan8
[
n
]]];
...
...
@@ -400,7 +400,7 @@ static av_always_inline void mc_part_weighted(const H264Context *h, H264SliceCon
dest_cr
+=
(
x_offset
<<
pixel_shift
)
+
y_offset
*
sl
->
mb_uvlinesize
;
}
x_offset
+=
8
*
sl
->
mb_x
;
y_offset
+=
8
*
(
sl
->
mb_y
>>
MB_FIELD
(
h
));
y_offset
+=
8
*
(
sl
->
mb_y
>>
MB_FIELD
(
sl
));
if
(
list0
&&
list1
)
{
/* don't optimize for luma-only case, since B-frames usually
...
...
@@ -528,7 +528,7 @@ static av_always_inline void xchg_mb_border(const H264Context *h, H264SliceConte
deblock_top
=
sl
->
top_type
;
}
else
{
deblock_topleft
=
(
sl
->
mb_x
>
0
);
deblock_top
=
(
sl
->
mb_y
>
!!
MB_FIELD
(
h
));
deblock_top
=
(
sl
->
mb_y
>
!!
MB_FIELD
(
sl
));
}
src_y
-=
linesize
+
1
+
pixel_shift
;
...
...
libavcodec/h264_mb_template.c
View file @
bc98e8c0
...
...
@@ -66,7 +66,7 @@ static av_noinline void FUNC(hl_decode_mb)(const H264Context *h, H264SliceContex
h
->
list_counts
[
mb_xy
]
=
sl
->
list_count
;
if
(
!
SIMPLE
&&
MB_FIELD
(
h
))
{
if
(
!
SIMPLE
&&
MB_FIELD
(
sl
))
{
linesize
=
sl
->
mb_linesize
=
h
->
linesize
*
2
;
uvlinesize
=
sl
->
mb_uvlinesize
=
h
->
uvlinesize
*
2
;
block_offset
=
&
h
->
block_offset
[
48
];
...
...
@@ -294,7 +294,7 @@ static av_noinline void FUNC(hl_decode_mb_444)(const H264Context *h, H264SliceCo
h
->
list_counts
[
mb_xy
]
=
sl
->
list_count
;
if
(
!
SIMPLE
&&
MB_FIELD
(
h
))
{
if
(
!
SIMPLE
&&
MB_FIELD
(
sl
))
{
linesize
=
sl
->
mb_linesize
=
sl
->
mb_uvlinesize
=
h
->
linesize
*
2
;
block_offset
=
&
h
->
block_offset
[
48
];
if
(
mb_y
&
1
)
// FIXME move out of this function?
...
...
libavcodec/h264_mvpred.h
View file @
bc98e8c0
...
...
@@ -62,11 +62,11 @@ static av_always_inline int fetch_diagonal_mv(const H264Context *h, H264SliceCon
AV_ZERO32
(
sl
->
mv_cache
[
list
][
scan8
[
0
]
-
2
]);
*
C
=
sl
->
mv_cache
[
list
][
scan8
[
0
]
-
2
];
if
(
!
MB_FIELD
(
h
)
&&
IS_INTERLACED
(
sl
->
left_type
[
0
]))
{
if
(
!
MB_FIELD
(
sl
)
&&
IS_INTERLACED
(
sl
->
left_type
[
0
]))
{
SET_DIAG_MV
(
*
2
,
>>
1
,
sl
->
left_mb_xy
[
0
]
+
h
->
mb_stride
,
(
sl
->
mb_y
&
1
)
*
2
+
(
i
>>
5
));
}
if
(
MB_FIELD
(
h
)
&&
!
IS_INTERLACED
(
sl
->
left_type
[
0
]))
{
if
(
MB_FIELD
(
sl
)
&&
!
IS_INTERLACED
(
sl
->
left_type
[
0
]))
{
// left shift will turn LIST_NOT_USED into PART_NOT_AVAILABLE, but that's OK.
SET_DIAG_MV
(
/
2
,
<<
1
,
sl
->
left_mb_xy
[
i
>=
36
],
((
i
>>
2
))
&
3
);
}
...
...
@@ -237,7 +237,7 @@ static av_always_inline void pred_8x16_motion(const H264Context *const h,
#define FIX_MV_MBAFF(type, refn, mvn, idx) \
if (FRAME_MBAFF(h)) { \
if (MB_FIELD(
h)) {
\
if (MB_FIELD(
sl)) {
\
if (!IS_INTERLACED(type)) { \
refn <<= 1; \
AV_COPY32(mvbuf[idx], mvn); \
...
...
@@ -366,7 +366,7 @@ static void fill_decode_neighbors(const H264Context *h, H264SliceContext *sl, in
sl
->
topleft_partition
=
-
1
;
top_xy
=
mb_xy
-
(
h
->
mb_stride
<<
MB_FIELD
(
h
));
top_xy
=
mb_xy
-
(
h
->
mb_stride
<<
MB_FIELD
(
sl
));
/* Wow, what a mess, why didn't they simplify the interlacing & intra
* stuff, I can't imagine that these complex rules are worth it. */
...
...
@@ -767,7 +767,7 @@ static void fill_decode_caches(const H264Context *h, H264SliceContext *sl, int m
MAP_F2F(scan8[0] - 1 + 3 * 8, left_type[LBOT])
if
(
FRAME_MBAFF
(
h
))
{
if
(
MB_FIELD
(
h
))
{
if
(
MB_FIELD
(
sl
))
{
#define MAP_F2F(idx, mb_type) \
if (!IS_INTERLACED(mb_type) && sl->ref_cache[list][idx] >= 0) { \
...
...
@@ -807,7 +807,7 @@ static void av_unused decode_mb_skip(const H264Context *h, H264SliceContext *sl)
memset
(
h
->
non_zero_count
[
mb_xy
],
0
,
48
);
if
(
MB_FIELD
(
h
))
if
(
MB_FIELD
(
sl
))
mb_type
|=
MB_TYPE_INTERLACED
;
if
(
sl
->
slice_type_nos
==
AV_PICTURE_TYPE_B
)
{
...
...
libavcodec/h264_slice.c
View file @
bc98e8c0
...
...
@@ -1373,7 +1373,7 @@ int ff_h264_decode_slice_header(H264Context *h, H264SliceContext *sl, H264Contex
h
->
mb_aff_frame
=
h
->
sps
.
mb_aff
;
}
}
h
->
mb_field_decoding_flag
=
h
->
picture_structure
!=
PICT_FRAME
;
sl
->
mb_field_decoding_flag
=
h
->
picture_structure
!=
PICT_FRAME
;
if
(
h0
->
current_slice
!=
0
)
{
if
(
last_pic_structure
!=
h
->
picture_structure
||
...
...
@@ -1914,7 +1914,7 @@ static int fill_filter_caches(H264Context *h, H264SliceContext *sl, int mb_type)
uint8_t
*
nnz
;
uint8_t
*
nnz_cache
;
top_xy
=
mb_xy
-
(
h
->
mb_stride
<<
MB_FIELD
(
h
));
top_xy
=
mb_xy
-
(
h
->
mb_stride
<<
MB_FIELD
(
sl
));
/* Wow, what a mess, why didn't they simplify the interlacing & intra
* stuff, I can't imagine that these complex rules are worth it. */
...
...
@@ -2071,7 +2071,7 @@ static void loop_filter(H264Context *h, H264SliceContext *sl, int start_x, int e
if
(
FRAME_MBAFF
(
h
))
h
->
mb_mbaff
=
h
->
mb_field_decoding_flag
=
!!
IS_INTERLACED
(
mb_type
);
sl
->
mb_field_decoding_flag
=
!!
IS_INTERLACED
(
mb_type
);
sl
->
mb_x
=
mb_x
;
sl
->
mb_y
=
mb_y
;
...
...
@@ -2085,7 +2085,7 @@ static void loop_filter(H264Context *h, H264SliceContext *sl, int start_x, int e
mb_y
*
h
->
uvlinesize
*
block_h
;
// FIXME simplify above
if
(
MB_FIELD
(
h
))
{
if
(
MB_FIELD
(
sl
))
{
linesize
=
sl
->
mb_linesize
=
h
->
linesize
*
2
;
uvlinesize
=
sl
->
mb_uvlinesize
=
h
->
uvlinesize
*
2
;
if
(
mb_y
&
1
)
{
// FIXME move out of this function?
...
...
@@ -2127,7 +2127,7 @@ static void predict_field_decoding_flag(H264Context *h, H264SliceContext *sl)
h
->
cur_pic
.
mb_type
[
mb_xy
-
1
]
:
(
h
->
slice_table
[
mb_xy
-
h
->
mb_stride
]
==
sl
->
slice_num
)
?
h
->
cur_pic
.
mb_type
[
mb_xy
-
h
->
mb_stride
]
:
0
;
h
->
mb_mbaff
=
h
->
mb_field_decoding_flag
=
IS_INTERLACED
(
mb_type
)
?
1
:
0
;
h
->
mb_mbaff
=
sl
->
mb_field_decoding_flag
=
IS_INTERLACED
(
mb_type
)
?
1
:
0
;
}
/**
...
...
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