Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
小白菜888
Ffmpeg
提交
ecc31f6b
F
Ffmpeg
项目概览
小白菜888
/
Ffmpeg
通知
3
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
F
Ffmpeg
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
ecc31f6b
编写于
3月 23, 2016
作者:
A
Anton Khirnov
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
h264: move ff_h264_check_intra[4x4]_pred_mode() to h264_parse
It is shared with svq3.
上级
1877712c
变更
8
隐藏空白更改
内联
并排
Showing
8 changed file
with
128 addition
and
116 deletion
+128
-116
libavcodec/Makefile
libavcodec/Makefile
+1
-1
libavcodec/h264.c
libavcodec/h264.c
+0
-93
libavcodec/h264.h
libavcodec/h264.h
+0
-13
libavcodec/h264_cabac.c
libavcodec/h264_cabac.c
+7
-3
libavcodec/h264_cavlc.c
libavcodec/h264_cavlc.c
+6
-3
libavcodec/h264_parse.c
libavcodec/h264_parse.c
+92
-0
libavcodec/h264_parse.h
libavcodec/h264_parse.h
+15
-0
libavcodec/svq3.c
libavcodec/svq3.c
+7
-3
未找到文件。
libavcodec/Makefile
浏览文件 @
ecc31f6b
...
...
@@ -418,7 +418,7 @@ OBJS-$(CONFIG_SUNRAST_ENCODER) += sunrastenc.o
OBJS-$(CONFIG_SVQ1_DECODER)
+=
svq1dec.o svq1.o svq13.o h263data.o
OBJS-$(CONFIG_SVQ1_ENCODER)
+=
svq1enc.o svq1.o h263data.o
\
h263.o ituh263enc.o
OBJS-$(CONFIG_SVQ3_DECODER)
+=
svq3.o svq13.o mpegutils.o
OBJS-$(CONFIG_SVQ3_DECODER)
+=
svq3.o svq13.o mpegutils.o
h264_parse.o
OBJS-$(CONFIG_TAK_DECODER)
+=
takdec.o tak.o
OBJS-$(CONFIG_TARGA_DECODER)
+=
targa.o
OBJS-$(CONFIG_TARGA_ENCODER)
+=
targaenc.o rle.o
...
...
libavcodec/h264.c
浏览文件 @
ecc31f6b
...
...
@@ -114,99 +114,6 @@ void ff_h264_draw_horiz_band(const H264Context *h, H264SliceContext *sl,
}
}
/**
* Check if the top & left blocks are available if needed and
* change the dc mode so it only uses the available blocks.
*/
int
ff_h264_check_intra4x4_pred_mode
(
const
H264Context
*
h
,
H264SliceContext
*
sl
)
{
static
const
int8_t
top
[
12
]
=
{
-
1
,
0
,
LEFT_DC_PRED
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
0
};
static
const
int8_t
left
[
12
]
=
{
0
,
-
1
,
TOP_DC_PRED
,
0
,
-
1
,
-
1
,
-
1
,
0
,
-
1
,
DC_128_PRED
};
int
i
;
if
(
!
(
sl
->
top_samples_available
&
0x8000
))
{
for
(
i
=
0
;
i
<
4
;
i
++
)
{
int
status
=
top
[
sl
->
intra4x4_pred_mode_cache
[
scan8
[
0
]
+
i
]];
if
(
status
<
0
)
{
av_log
(
h
->
avctx
,
AV_LOG_ERROR
,
"top block unavailable for requested intra4x4 mode %d at %d %d
\n
"
,
status
,
sl
->
mb_x
,
sl
->
mb_y
);
return
AVERROR_INVALIDDATA
;
}
else
if
(
status
)
{
sl
->
intra4x4_pred_mode_cache
[
scan8
[
0
]
+
i
]
=
status
;
}
}
}
if
((
sl
->
left_samples_available
&
0x8888
)
!=
0x8888
)
{
static
const
int
mask
[
4
]
=
{
0x8000
,
0x2000
,
0x80
,
0x20
};
for
(
i
=
0
;
i
<
4
;
i
++
)
if
(
!
(
sl
->
left_samples_available
&
mask
[
i
]))
{
int
status
=
left
[
sl
->
intra4x4_pred_mode_cache
[
scan8
[
0
]
+
8
*
i
]];
if
(
status
<
0
)
{
av_log
(
h
->
avctx
,
AV_LOG_ERROR
,
"left block unavailable for requested intra4x4 mode %d at %d %d
\n
"
,
status
,
sl
->
mb_x
,
sl
->
mb_y
);
return
AVERROR_INVALIDDATA
;
}
else
if
(
status
)
{
sl
->
intra4x4_pred_mode_cache
[
scan8
[
0
]
+
8
*
i
]
=
status
;
}
}
}
return
0
;
}
// FIXME cleanup like ff_h264_check_intra_pred_mode
/**
* Check if the top & left blocks are available if needed and
* change the dc mode so it only uses the available blocks.
*/
int
ff_h264_check_intra_pred_mode
(
const
H264Context
*
h
,
H264SliceContext
*
sl
,
int
mode
,
int
is_chroma
)
{
static
const
int8_t
top
[
4
]
=
{
LEFT_DC_PRED8x8
,
1
,
-
1
,
-
1
};
static
const
int8_t
left
[
5
]
=
{
TOP_DC_PRED8x8
,
-
1
,
2
,
-
1
,
DC_128_PRED8x8
};
if
(
mode
>
3U
)
{
av_log
(
h
->
avctx
,
AV_LOG_ERROR
,
"out of range intra chroma pred mode at %d %d
\n
"
,
sl
->
mb_x
,
sl
->
mb_y
);
return
AVERROR_INVALIDDATA
;
}
if
(
!
(
sl
->
top_samples_available
&
0x8000
))
{
mode
=
top
[
mode
];
if
(
mode
<
0
)
{
av_log
(
h
->
avctx
,
AV_LOG_ERROR
,
"top block unavailable for requested intra mode at %d %d
\n
"
,
sl
->
mb_x
,
sl
->
mb_y
);
return
AVERROR_INVALIDDATA
;
}
}
if
((
sl
->
left_samples_available
&
0x8080
)
!=
0x8080
)
{
mode
=
left
[
mode
];
if
(
is_chroma
&&
(
sl
->
left_samples_available
&
0x8080
))
{
// mad cow disease mode, aka MBAFF + constrained_intra_pred
mode
=
ALZHEIMER_DC_L0T_PRED8x8
+
(
!
(
sl
->
left_samples_available
&
0x8000
))
+
2
*
(
mode
==
DC_128_PRED8x8
);
}
if
(
mode
<
0
)
{
av_log
(
h
->
avctx
,
AV_LOG_ERROR
,
"left block unavailable for requested intra mode at %d %d
\n
"
,
sl
->
mb_x
,
sl
->
mb_y
);
return
AVERROR_INVALIDDATA
;
}
}
return
mode
;
}
const
uint8_t
*
ff_h264_decode_nal
(
H264Context
*
h
,
H264SliceContext
*
sl
,
const
uint8_t
*
src
,
int
*
dst_length
,
int
*
consumed
,
int
length
)
...
...
libavcodec/h264.h
浏览文件 @
ecc31f6b
...
...
@@ -808,19 +808,6 @@ int ff_h264_decode_ref_pic_marking(H264Context *h, GetBitContext *gb,
int
ff_generate_sliding_window_mmcos
(
H264Context
*
h
,
int
first_slice
);
/**
* Check if the top & left blocks are available if needed & change the
* dc mode so it only uses the available blocks.
*/
int
ff_h264_check_intra4x4_pred_mode
(
const
H264Context
*
h
,
H264SliceContext
*
sl
);
/**
* Check if the top & left blocks are available if needed & change the
* dc mode so it only uses the available blocks.
*/
int
ff_h264_check_intra_pred_mode
(
const
H264Context
*
h
,
H264SliceContext
*
sl
,
int
mode
,
int
is_chroma
);
void
ff_h264_hl_decode_mb
(
const
H264Context
*
h
,
H264SliceContext
*
sl
);
int
ff_h264_decode_extradata
(
H264Context
*
h
);
int
ff_h264_decode_init
(
AVCodecContext
*
avctx
);
...
...
libavcodec/h264_cabac.c
浏览文件 @
ecc31f6b
...
...
@@ -2076,16 +2076,20 @@ decode_intra_mb:
}
}
write_back_intra_pred_mode
(
h
,
sl
);
if
(
ff_h264_check_intra4x4_pred_mode
(
h
,
sl
)
<
0
)
return
-
1
;
if
(
ff_h264_check_intra4x4_pred_mode
(
sl
->
intra4x4_pred_mode_cache
,
h
->
avctx
,
sl
->
top_samples_available
,
sl
->
left_samples_available
)
<
0
)
return
-
1
;
}
else
{
sl
->
intra16x16_pred_mode
=
ff_h264_check_intra_pred_mode
(
h
,
sl
,
sl
->
intra16x16_pred_mode
,
0
);
sl
->
intra16x16_pred_mode
=
ff_h264_check_intra_pred_mode
(
h
->
avctx
,
sl
->
top_samples_available
,
sl
->
left_samples_available
,
sl
->
intra16x16_pred_mode
,
0
);
if
(
sl
->
intra16x16_pred_mode
<
0
)
return
-
1
;
}
if
(
decode_chroma
){
h
->
chroma_pred_mode_table
[
mb_xy
]
=
pred_mode
=
decode_cabac_mb_chroma_pre_mode
(
h
,
sl
);
pred_mode
=
ff_h264_check_intra_pred_mode
(
h
,
sl
,
pred_mode
,
1
);
pred_mode
=
ff_h264_check_intra_pred_mode
(
h
->
avctx
,
sl
->
top_samples_available
,
sl
->
left_samples_available
,
pred_mode
,
1
);
if
(
pred_mode
<
0
)
return
-
1
;
sl
->
chroma_pred_mode
=
pred_mode
;
}
else
{
...
...
libavcodec/h264_cavlc.c
浏览文件 @
ecc31f6b
...
...
@@ -818,15 +818,18 @@ decode_intra_mb:
sl
->
intra4x4_pred_mode_cache
[
scan8
[
i
]]
=
mode
;
}
write_back_intra_pred_mode
(
h
,
sl
);
if
(
ff_h264_check_intra4x4_pred_mode
(
h
,
sl
)
<
0
)
if
(
ff_h264_check_intra4x4_pred_mode
(
sl
->
intra4x4_pred_mode_cache
,
h
->
avctx
,
sl
->
top_samples_available
,
sl
->
left_samples_available
)
<
0
)
return
-
1
;
}
else
{
sl
->
intra16x16_pred_mode
=
ff_h264_check_intra_pred_mode
(
h
,
sl
,
sl
->
intra16x16_pred_mode
,
0
);
sl
->
intra16x16_pred_mode
=
ff_h264_check_intra_pred_mode
(
h
->
avctx
,
sl
->
top_samples_available
,
sl
->
left_samples_available
,
sl
->
intra16x16_pred_mode
,
0
);
if
(
sl
->
intra16x16_pred_mode
<
0
)
return
-
1
;
}
if
(
decode_chroma
){
pred_mode
=
ff_h264_check_intra_pred_mode
(
h
,
sl
,
get_ue_golomb_31
(
&
sl
->
gb
),
1
);
pred_mode
=
ff_h264_check_intra_pred_mode
(
h
->
avctx
,
sl
->
top_samples_available
,
sl
->
left_samples_available
,
get_ue_golomb_31
(
&
sl
->
gb
),
1
);
if
(
pred_mode
<
0
)
return
-
1
;
sl
->
chroma_pred_mode
=
pred_mode
;
...
...
libavcodec/h264_parse.c
浏览文件 @
ecc31f6b
...
...
@@ -84,3 +84,95 @@ int ff_h264_pred_weight_table(GetBitContext *gb, const SPS *sps,
pwt
->
use_weight
=
pwt
->
use_weight
||
pwt
->
use_weight_chroma
;
return
0
;
}
/**
* Check if the top & left blocks are available if needed and
* change the dc mode so it only uses the available blocks.
*/
int
ff_h264_check_intra4x4_pred_mode
(
int8_t
*
pred_mode_cache
,
void
*
logctx
,
int
top_samples_available
,
int
left_samples_available
)
{
static
const
int8_t
top
[
12
]
=
{
-
1
,
0
,
LEFT_DC_PRED
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
0
};
static
const
int8_t
left
[
12
]
=
{
0
,
-
1
,
TOP_DC_PRED
,
0
,
-
1
,
-
1
,
-
1
,
0
,
-
1
,
DC_128_PRED
};
int
i
;
if
(
!
(
top_samples_available
&
0x8000
))
{
for
(
i
=
0
;
i
<
4
;
i
++
)
{
int
status
=
top
[
pred_mode_cache
[
scan8
[
0
]
+
i
]];
if
(
status
<
0
)
{
av_log
(
logctx
,
AV_LOG_ERROR
,
"top block unavailable for requested intra4x4 mode %d
\n
"
,
status
);
return
AVERROR_INVALIDDATA
;
}
else
if
(
status
)
{
pred_mode_cache
[
scan8
[
0
]
+
i
]
=
status
;
}
}
}
if
((
left_samples_available
&
0x8888
)
!=
0x8888
)
{
static
const
int
mask
[
4
]
=
{
0x8000
,
0x2000
,
0x80
,
0x20
};
for
(
i
=
0
;
i
<
4
;
i
++
)
if
(
!
(
left_samples_available
&
mask
[
i
]))
{
int
status
=
left
[
pred_mode_cache
[
scan8
[
0
]
+
8
*
i
]];
if
(
status
<
0
)
{
av_log
(
logctx
,
AV_LOG_ERROR
,
"left block unavailable for requested intra4x4 mode %d
\n
"
,
status
);
return
AVERROR_INVALIDDATA
;
}
else
if
(
status
)
{
pred_mode_cache
[
scan8
[
0
]
+
8
*
i
]
=
status
;
}
}
}
return
0
;
}
/**
* Check if the top & left blocks are available if needed and
* change the dc mode so it only uses the available blocks.
*/
int
ff_h264_check_intra_pred_mode
(
void
*
logctx
,
int
top_samples_available
,
int
left_samples_available
,
int
mode
,
int
is_chroma
)
{
static
const
int8_t
top
[
4
]
=
{
LEFT_DC_PRED8x8
,
1
,
-
1
,
-
1
};
static
const
int8_t
left
[
5
]
=
{
TOP_DC_PRED8x8
,
-
1
,
2
,
-
1
,
DC_128_PRED8x8
};
if
(
mode
>
3U
)
{
av_log
(
logctx
,
AV_LOG_ERROR
,
"out of range intra chroma pred mode
\n
"
);
return
AVERROR_INVALIDDATA
;
}
if
(
!
(
top_samples_available
&
0x8000
))
{
mode
=
top
[
mode
];
if
(
mode
<
0
)
{
av_log
(
logctx
,
AV_LOG_ERROR
,
"top block unavailable for requested intra mode
\n
"
);
return
AVERROR_INVALIDDATA
;
}
}
if
((
left_samples_available
&
0x8080
)
!=
0x8080
)
{
mode
=
left
[
mode
];
if
(
is_chroma
&&
(
left_samples_available
&
0x8080
))
{
// mad cow disease mode, aka MBAFF + constrained_intra_pred
mode
=
ALZHEIMER_DC_L0T_PRED8x8
+
(
!
(
left_samples_available
&
0x8000
))
+
2
*
(
mode
==
DC_128_PRED8x8
);
}
if
(
mode
<
0
)
{
av_log
(
logctx
,
AV_LOG_ERROR
,
"left block unavailable for requested intra mode
\n
"
);
return
AVERROR_INVALIDDATA
;
}
}
return
mode
;
}
libavcodec/h264_parse.h
浏览文件 @
ecc31f6b
...
...
@@ -45,4 +45,19 @@ int ff_h264_pred_weight_table(GetBitContext *gb, const struct SPS *sps,
const
int
*
ref_count
,
int
slice_type_nos
,
H264PredWeightTable
*
pwt
);
/**
* Check if the top & left blocks are available if needed & change the
* dc mode so it only uses the available blocks.
*/
int
ff_h264_check_intra4x4_pred_mode
(
int8_t
*
pred_mode_cache
,
void
*
logctx
,
int
top_samples_available
,
int
left_samples_available
);
/**
* Check if the top & left blocks are available if needed & change the
* dc mode so it only uses the available blocks.
*/
int
ff_h264_check_intra_pred_mode
(
void
*
logctx
,
int
top_samples_available
,
int
left_samples_available
,
int
mode
,
int
is_chroma
);
#endif
/* AVCODEC_H264_PARSE_H */
libavcodec/svq3.c
浏览文件 @
ecc31f6b
...
...
@@ -771,7 +771,9 @@ static int svq3_decode_mb(SVQ3Context *s, unsigned int mb_type)
i4x4
[
6
]
=
i4x4_cache
[
7
+
8
*
1
];
if
(
mb_type
==
8
)
{
ff_h264_check_intra4x4_pred_mode
(
h
,
sl
);
ff_h264_check_intra4x4_pred_mode
(
sl
->
intra4x4_pred_mode_cache
,
h
->
avctx
,
sl
->
top_samples_available
,
sl
->
left_samples_available
);
sl
->
top_samples_available
=
(
s
->
mb_y
==
0
)
?
0x33FF
:
0xFFFF
;
sl
->
left_samples_available
=
(
s
->
mb_x
==
0
)
?
0x5F5F
:
0xFFFF
;
...
...
@@ -788,7 +790,8 @@ static int svq3_decode_mb(SVQ3Context *s, unsigned int mb_type)
dir
=
ff_h264_i_mb_type_info
[
mb_type
-
8
].
pred_mode
;
dir
=
(
dir
>>
1
)
^
3
*
(
dir
&
1
)
^
1
;
if
((
sl
->
intra16x16_pred_mode
=
ff_h264_check_intra_pred_mode
(
h
,
sl
,
dir
,
0
))
<
0
)
{
if
((
sl
->
intra16x16_pred_mode
=
ff_h264_check_intra_pred_mode
(
h
->
avctx
,
sl
->
top_samples_available
,
sl
->
left_samples_available
,
dir
,
0
))
<
0
)
{
av_log
(
h
->
avctx
,
AV_LOG_ERROR
,
"ff_h264_check_intra_pred_mode < 0
\n
"
);
return
sl
->
intra16x16_pred_mode
;
}
...
...
@@ -892,7 +895,8 @@ static int svq3_decode_mb(SVQ3Context *s, unsigned int mb_type)
h
->
cur_pic
.
mb_type
[
mb_xy
]
=
mb_type
;
if
(
IS_INTRA
(
mb_type
))
sl
->
chroma_pred_mode
=
ff_h264_check_intra_pred_mode
(
h
,
sl
,
DC_PRED8x8
,
1
);
sl
->
chroma_pred_mode
=
ff_h264_check_intra_pred_mode
(
h
->
avctx
,
sl
->
top_samples_available
,
sl
->
left_samples_available
,
DC_PRED8x8
,
1
);
return
0
;
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录