Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
小白菜888
Ffmpeg
提交
96dca089
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,发现更多精彩内容 >>
提交
96dca089
编写于
7月 21, 2015
作者:
A
Anton Khirnov
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
qsvdec: move qsv_process_data() from qsvdec_h264 to the common code
It will be shared with the upcoming mpeg2 and hevc decoders.
上级
fa85fcf2
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
118 addition
and
110 deletion
+118
-110
libavcodec/qsvdec.c
libavcodec/qsvdec.c
+106
-3
libavcodec/qsvdec.h
libavcodec/qsvdec.h
+9
-3
libavcodec/qsvdec_h264.c
libavcodec/qsvdec_h264.c
+3
-104
未找到文件。
libavcodec/qsvdec.c
浏览文件 @
96dca089
...
...
@@ -34,6 +34,7 @@
#include "avcodec.h"
#include "internal.h"
#include "qsv.h"
#include "qsv_internal.h"
#include "qsvdec.h"
...
...
@@ -209,9 +210,9 @@ static QSVFrame *find_frame(QSVContext *q, mfxFrameSurface1 *surf)
return
NULL
;
}
int
ff_
qsv_decode
(
AVCodecContext
*
avctx
,
QSVContext
*
q
,
AVFrame
*
frame
,
int
*
got_frame
,
AVPacket
*
avpkt
)
static
int
qsv_decode
(
AVCodecContext
*
avctx
,
QSVContext
*
q
,
AVFrame
*
frame
,
int
*
got_frame
,
AVPacket
*
avpkt
)
{
QSVFrame
*
out_frame
;
mfxFrameSurface1
*
insurf
;
...
...
@@ -317,8 +318,110 @@ int ff_qsv_decode_close(QSVContext *q)
av_fifo_free
(
q
->
async_fifo
);
q
->
async_fifo
=
NULL
;
av_parser_close
(
q
->
parser
);
avcodec_free_context
(
&
q
->
avctx_internal
);
if
(
q
->
internal_session
)
MFXClose
(
q
->
internal_session
);
return
0
;
}
int
ff_qsv_process_data
(
AVCodecContext
*
avctx
,
QSVContext
*
q
,
AVFrame
*
frame
,
int
*
got_frame
,
AVPacket
*
pkt
)
{
uint8_t
*
dummy_data
;
int
dummy_size
;
int
ret
;
if
(
!
q
->
avctx_internal
)
{
q
->
avctx_internal
=
avcodec_alloc_context3
(
NULL
);
if
(
!
q
->
avctx_internal
)
return
AVERROR
(
ENOMEM
);
if
(
avctx
->
extradata
)
{
q
->
avctx_internal
->
extradata
=
av_mallocz
(
avctx
->
extradata_size
+
FF_INPUT_BUFFER_PADDING_SIZE
);
if
(
!
q
->
avctx_internal
->
extradata
)
return
AVERROR
(
ENOMEM
);
memcpy
(
q
->
avctx_internal
->
extradata
,
avctx
->
extradata
,
avctx
->
extradata_size
);
q
->
avctx_internal
->
extradata_size
=
avctx
->
extradata_size
;
}
q
->
parser
=
av_parser_init
(
avctx
->
codec_id
);
if
(
!
q
->
parser
)
return
AVERROR
(
ENOMEM
);
q
->
parser
->
flags
|=
PARSER_FLAG_COMPLETE_FRAMES
;
q
->
orig_pix_fmt
=
AV_PIX_FMT_NONE
;
}
if
(
!
pkt
->
size
)
return
qsv_decode
(
avctx
,
q
,
frame
,
got_frame
,
pkt
);
/* we assume the packets are already split properly and want
* just the codec parameters here */
av_parser_parse2
(
q
->
parser
,
q
->
avctx_internal
,
&
dummy_data
,
&
dummy_size
,
pkt
->
data
,
pkt
->
size
,
pkt
->
pts
,
pkt
->
dts
,
pkt
->
pos
);
/* TODO: flush delayed frames on reinit */
if
(
q
->
parser
->
format
!=
q
->
orig_pix_fmt
||
q
->
parser
->
coded_width
!=
avctx
->
coded_width
||
q
->
parser
->
coded_height
!=
avctx
->
coded_height
)
{
mfxSession
session
=
NULL
;
enum
AVPixelFormat
pix_fmts
[
3
]
=
{
AV_PIX_FMT_QSV
,
AV_PIX_FMT_NONE
,
AV_PIX_FMT_NONE
};
enum
AVPixelFormat
qsv_format
;
qsv_format
=
ff_qsv_map_pixfmt
(
q
->
parser
->
format
);
if
(
qsv_format
<
0
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"Only 8-bit YUV420 streams are supported.
\n
"
);
ret
=
AVERROR
(
ENOSYS
);
goto
reinit_fail
;
}
q
->
orig_pix_fmt
=
q
->
parser
->
format
;
avctx
->
pix_fmt
=
pix_fmts
[
1
]
=
qsv_format
;
avctx
->
width
=
q
->
parser
->
width
;
avctx
->
height
=
q
->
parser
->
height
;
avctx
->
coded_width
=
q
->
parser
->
coded_width
;
avctx
->
coded_height
=
q
->
parser
->
coded_height
;
avctx
->
level
=
q
->
avctx_internal
->
level
;
avctx
->
profile
=
q
->
avctx_internal
->
profile
;
ret
=
ff_get_format
(
avctx
,
pix_fmts
);
if
(
ret
<
0
)
goto
reinit_fail
;
avctx
->
pix_fmt
=
ret
;
if
(
avctx
->
hwaccel_context
)
{
AVQSVContext
*
user_ctx
=
avctx
->
hwaccel_context
;
session
=
user_ctx
->
session
;
q
->
iopattern
=
user_ctx
->
iopattern
;
q
->
ext_buffers
=
user_ctx
->
ext_buffers
;
q
->
nb_ext_buffers
=
user_ctx
->
nb_ext_buffers
;
}
ret
=
ff_qsv_decode_init
(
avctx
,
q
,
session
);
if
(
ret
<
0
)
goto
reinit_fail
;
}
return
qsv_decode
(
avctx
,
q
,
frame
,
got_frame
,
pkt
);
reinit_fail:
q
->
orig_pix_fmt
=
q
->
parser
->
format
=
avctx
->
pix_fmt
=
AV_PIX_FMT_NONE
;
return
ret
;
}
void
ff_qsv_decode_flush
(
AVCodecContext
*
avctx
,
QSVContext
*
q
)
{
q
->
orig_pix_fmt
=
AV_PIX_FMT_NONE
;
}
libavcodec/qsvdec.h
浏览文件 @
96dca089
...
...
@@ -50,6 +50,11 @@ typedef struct QSVContext {
AVFifoBuffer
*
async_fifo
;
// the internal parser and codec context for parsing the data
AVCodecParserContext
*
parser
;
AVCodecContext
*
avctx_internal
;
enum
AVPixelFormat
orig_pix_fmt
;
// options set by the caller
int
async_depth
;
int
iopattern
;
...
...
@@ -62,9 +67,10 @@ int ff_qsv_map_pixfmt(enum AVPixelFormat format);
int
ff_qsv_decode_init
(
AVCodecContext
*
s
,
QSVContext
*
q
,
mfxSession
session
);
int
ff_qsv_decode
(
AVCodecContext
*
s
,
QSVContext
*
q
,
AVFrame
*
frame
,
int
*
got_frame
,
AVPacket
*
avpkt
);
int
ff_qsv_process_data
(
AVCodecContext
*
avctx
,
QSVContext
*
q
,
AVFrame
*
frame
,
int
*
got_frame
,
AVPacket
*
pkt
);
void
ff_qsv_decode_flush
(
AVCodecContext
*
avctx
,
QSVContext
*
q
);
int
ff_qsv_decode_close
(
QSVContext
*
q
);
...
...
libavcodec/qsvdec_h264.c
浏览文件 @
96dca089
...
...
@@ -41,11 +41,6 @@ typedef struct QSVH264Context {
AVClass
*
class
;
QSVContext
qsv
;
// the internal parser and codec context for parsing the data
AVCodecParserContext
*
parser
;
AVCodecContext
*
avctx_internal
;
enum
AVPixelFormat
orig_pix_fmt
;
// the filter for converting to Annex B
AVBitStreamFilterContext
*
bsf
;
...
...
@@ -81,8 +76,6 @@ static av_cold int qsv_decode_close(AVCodecContext *avctx)
av_fifo_free
(
s
->
packet_fifo
);
av_bitstream_filter_close
(
s
->
bsf
);
av_parser_close
(
s
->
parser
);
avcodec_free_context
(
&
s
->
avctx_internal
);
return
0
;
}
...
...
@@ -92,7 +85,6 @@ static av_cold int qsv_decode_init(AVCodecContext *avctx)
QSVH264Context
*
s
=
avctx
->
priv_data
;
int
ret
;
s
->
orig_pix_fmt
=
AV_PIX_FMT_NONE
;
s
->
packet_fifo
=
av_fifo_alloc
(
sizeof
(
AVPacket
));
if
(
!
s
->
packet_fifo
)
{
...
...
@@ -106,30 +98,6 @@ static av_cold int qsv_decode_init(AVCodecContext *avctx)
goto
fail
;
}
s
->
avctx_internal
=
avcodec_alloc_context3
(
NULL
);
if
(
!
s
->
avctx_internal
)
{
ret
=
AVERROR
(
ENOMEM
);
goto
fail
;
}
if
(
avctx
->
extradata
)
{
s
->
avctx_internal
->
extradata
=
av_mallocz
(
avctx
->
extradata_size
+
FF_INPUT_BUFFER_PADDING_SIZE
);
if
(
!
s
->
avctx_internal
->
extradata
)
{
ret
=
AVERROR
(
ENOMEM
);
goto
fail
;
}
memcpy
(
s
->
avctx_internal
->
extradata
,
avctx
->
extradata
,
avctx
->
extradata_size
);
s
->
avctx_internal
->
extradata_size
=
avctx
->
extradata_size
;
}
s
->
parser
=
av_parser_init
(
AV_CODEC_ID_H264
);
if
(
!
s
->
parser
)
{
ret
=
AVERROR
(
ENOMEM
);
goto
fail
;
}
s
->
parser
->
flags
|=
PARSER_FLAG_COMPLETE_FRAMES
;
s
->
qsv
.
iopattern
=
MFX_IOPATTERN_OUT_SYSTEM_MEMORY
;
return
0
;
...
...
@@ -138,75 +106,6 @@ fail:
return
ret
;
}
static
int
qsv_process_data
(
AVCodecContext
*
avctx
,
AVFrame
*
frame
,
int
*
got_frame
,
AVPacket
*
pkt
)
{
QSVH264Context
*
s
=
avctx
->
priv_data
;
uint8_t
*
dummy_data
;
int
dummy_size
;
int
ret
;
/* we assume the packets are already split properly and want
* just the codec parameters here */
av_parser_parse2
(
s
->
parser
,
s
->
avctx_internal
,
&
dummy_data
,
&
dummy_size
,
pkt
->
data
,
pkt
->
size
,
pkt
->
pts
,
pkt
->
dts
,
pkt
->
pos
);
/* TODO: flush delayed frames on reinit */
if
(
s
->
parser
->
format
!=
s
->
orig_pix_fmt
||
s
->
parser
->
coded_width
!=
avctx
->
coded_width
||
s
->
parser
->
coded_height
!=
avctx
->
coded_height
)
{
mfxSession
session
=
NULL
;
enum
AVPixelFormat
pix_fmts
[
3
]
=
{
AV_PIX_FMT_QSV
,
AV_PIX_FMT_NONE
,
AV_PIX_FMT_NONE
};
enum
AVPixelFormat
qsv_format
;
qsv_format
=
ff_qsv_map_pixfmt
(
s
->
parser
->
format
);
if
(
qsv_format
<
0
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"Only 8-bit YUV420 streams are supported.
\n
"
);
ret
=
AVERROR
(
ENOSYS
);
goto
reinit_fail
;
}
s
->
orig_pix_fmt
=
s
->
parser
->
format
;
avctx
->
pix_fmt
=
pix_fmts
[
1
]
=
qsv_format
;
avctx
->
width
=
s
->
parser
->
width
;
avctx
->
height
=
s
->
parser
->
height
;
avctx
->
coded_width
=
s
->
parser
->
coded_width
;
avctx
->
coded_height
=
s
->
parser
->
coded_height
;
avctx
->
level
=
s
->
avctx_internal
->
level
;
avctx
->
profile
=
s
->
avctx_internal
->
profile
;
ret
=
ff_get_format
(
avctx
,
pix_fmts
);
if
(
ret
<
0
)
goto
reinit_fail
;
avctx
->
pix_fmt
=
ret
;
if
(
avctx
->
hwaccel_context
)
{
AVQSVContext
*
user_ctx
=
avctx
->
hwaccel_context
;
session
=
user_ctx
->
session
;
s
->
qsv
.
iopattern
=
user_ctx
->
iopattern
;
s
->
qsv
.
ext_buffers
=
user_ctx
->
ext_buffers
;
s
->
qsv
.
nb_ext_buffers
=
user_ctx
->
nb_ext_buffers
;
}
ret
=
ff_qsv_decode_init
(
avctx
,
&
s
->
qsv
,
session
);
if
(
ret
<
0
)
goto
reinit_fail
;
}
return
ff_qsv_decode
(
avctx
,
&
s
->
qsv
,
frame
,
got_frame
,
&
s
->
pkt_filtered
);
reinit_fail:
s
->
orig_pix_fmt
=
s
->
parser
->
format
=
avctx
->
pix_fmt
=
AV_PIX_FMT_NONE
;
return
ret
;
}
static
int
qsv_decode_frame
(
AVCodecContext
*
avctx
,
void
*
data
,
int
*
got_frame
,
AVPacket
*
avpkt
)
{
...
...
@@ -239,7 +138,7 @@ static int qsv_decode_frame(AVCodecContext *avctx, void *data,
/* no more data */
if
(
av_fifo_size
(
s
->
packet_fifo
)
<
sizeof
(
AVPacket
))
return
avpkt
->
size
?
avpkt
->
size
:
ff_qsv_
decode
(
avctx
,
&
s
->
qsv
,
frame
,
got_frame
,
avpkt
);
return
avpkt
->
size
?
avpkt
->
size
:
ff_qsv_
process_data
(
avctx
,
&
s
->
qsv
,
frame
,
got_frame
,
avpkt
);
if
(
s
->
filtered_data
!=
s
->
input_ref
.
data
)
av_freep
(
&
s
->
filtered_data
);
...
...
@@ -259,7 +158,7 @@ static int qsv_decode_frame(AVCodecContext *avctx, void *data,
s
->
pkt_filtered
.
size
=
size
;
}
ret
=
qsv_process_data
(
avctx
,
frame
,
got_frame
,
&
s
->
pkt_filtered
);
ret
=
ff_qsv_process_data
(
avctx
,
&
s
->
qsv
,
frame
,
got_frame
,
&
s
->
pkt_filtered
);
if
(
ret
<
0
)
return
ret
;
...
...
@@ -275,7 +174,7 @@ static void qsv_decode_flush(AVCodecContext *avctx)
QSVH264Context
*
s
=
avctx
->
priv_data
;
qsv_clear_buffers
(
s
);
s
->
orig_pix_fmt
=
AV_PIX_FMT_NONE
;
ff_qsv_decode_flush
(
avctx
,
&
s
->
qsv
)
;
}
AVHWAccel
ff_h264_qsv_hwaccel
=
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录