Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Greenplum
Opencv
提交
6f139b4f
O
Opencv
项目概览
Greenplum
/
Opencv
11 个月 前同步成功
通知
7
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
O
Opencv
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
6f139b4f
编写于
4月 05, 2016
作者:
A
Alexander Alekhin
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
ffmpeg: interrupt callback fix
backport from master
上级
86a72593
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
52 addition
and
18 deletion
+52
-18
modules/highgui/src/cap_ffmpeg_impl.hpp
modules/highgui/src/cap_ffmpeg_impl.hpp
+52
-18
未找到文件。
modules/highgui/src/cap_ffmpeg_impl.hpp
浏览文件 @
6f139b4f
...
...
@@ -190,7 +190,8 @@ extern "C" {
#endif
#if USE_AV_INTERRUPT_CALLBACK
#define LIBAVFORMAT_INTERRUPT_TIMEOUT_MS 30000
#define LIBAVFORMAT_INTERRUPT_OPEN_TIMEOUT_MS 30000
#define LIBAVFORMAT_INTERRUPT_READ_TIMEOUT_MS 30000
#ifdef WIN32
// http://stackoverflow.com/questions/5404277/porting-clock-gettime-to-windows
...
...
@@ -375,6 +376,11 @@ inline int _opencv_ffmpeg_interrupt_callback(void *ptr)
AVInterruptCallbackMetadata
*
metadata
=
(
AVInterruptCallbackMetadata
*
)
ptr
;
assert
(
metadata
);
if
(
metadata
->
timeout_after_ms
==
0
)
{
return
0
;
// timeout is disabled
}
timespec
now
;
get_monotonic_time
(
&
now
);
...
...
@@ -741,7 +747,7 @@ bool CvCapture_FFMPEG::open( const char* _filename )
#if USE_AV_INTERRUPT_CALLBACK
/* interrupt callback */
interrupt_metadata
.
timeout_after_ms
=
LIBAVFORMAT_INTERRUPT_TIMEOUT_MS
;
interrupt_metadata
.
timeout_after_ms
=
LIBAVFORMAT_INTERRUPT_
OPEN_
TIMEOUT_MS
;
get_monotonic_time
(
&
interrupt_metadata
.
value
);
ic
=
avformat_alloc_context
();
...
...
@@ -832,6 +838,11 @@ bool CvCapture_FFMPEG::open( const char* _filename )
exit_func:
#if USE_AV_INTERRUPT_CALLBACK
// deactivate interrupt callback
interrupt_metadata
.
timeout_after_ms
=
0
;
#endif
if
(
!
valid
)
close
();
...
...
@@ -855,6 +866,12 @@ bool CvCapture_FFMPEG::grabFrame()
picture_pts
=
AV_NOPTS_VALUE_
;
#if USE_AV_INTERRUPT_CALLBACK
// activate interrupt callback
get_monotonic_time
(
&
interrupt_metadata
.
value
);
interrupt_metadata
.
timeout_after_ms
=
LIBAVFORMAT_INTERRUPT_READ_TIMEOUT_MS
;
#endif
// get the next frame
while
(
!
valid
)
{
...
...
@@ -903,11 +920,6 @@ bool CvCapture_FFMPEG::grabFrame()
picture_pts
=
packet
.
pts
!=
AV_NOPTS_VALUE_
&&
packet
.
pts
!=
0
?
packet
.
pts
:
packet
.
dts
;
frame_number
++
;
valid
=
true
;
#if USE_AV_INTERRUPT_CALLBACK
// update interrupt value
get_monotonic_time
(
&
interrupt_metadata
.
value
);
#endif
}
else
{
...
...
@@ -920,6 +932,11 @@ bool CvCapture_FFMPEG::grabFrame()
if
(
valid
&&
first_frame_number
<
0
)
first_frame_number
=
dts_to_frame_number
(
picture_pts
);
#if USE_AV_INTERRUPT_CALLBACK
// deactivate interrupt callback
interrupt_metadata
.
timeout_after_ms
=
0
;
#endif
// return if we have a new picture or not
return
valid
;
}
...
...
@@ -2382,7 +2399,7 @@ bool InputMediaStream_FFMPEG::open(const char* fileName, int* codec, int* chroma
#if USE_AV_INTERRUPT_CALLBACK
/* interrupt callback */
interrupt_metadata
.
timeout_after_ms
=
LIBAVFORMAT_INTERRUPT_TIMEOUT_MS
;
interrupt_metadata
.
timeout_after_ms
=
LIBAVFORMAT_INTERRUPT_
OPEN_
TIMEOUT_MS
;
get_monotonic_time
(
&
interrupt_metadata
.
value
);
ctx_
=
avformat_alloc_context
();
...
...
@@ -2478,6 +2495,11 @@ bool InputMediaStream_FFMPEG::open(const char* fileName, int* codec, int* chroma
av_init_packet
(
&
pkt_
);
#if USE_AV_INTERRUPT_CALLBACK
// deactivate interrupt callback
interrupt_metadata
.
timeout_after_ms
=
0
;
#endif
return
true
;
}
...
...
@@ -2499,6 +2521,14 @@ void InputMediaStream_FFMPEG::close()
bool
InputMediaStream_FFMPEG
::
read
(
unsigned
char
**
data
,
int
*
size
,
int
*
endOfFile
)
{
bool
result
=
false
;
#if USE_AV_INTERRUPT_CALLBACK
// activate interrupt callback
get_monotonic_time
(
&
interrupt_metadata
.
value
);
interrupt_metadata
.
timeout_after_ms
=
LIBAVFORMAT_INTERRUPT_READ_TIMEOUT_MS
;
#endif
// free last packet if exist
if
(
pkt_
.
data
)
av_free_packet
(
&
pkt_
);
...
...
@@ -2518,16 +2548,11 @@ bool InputMediaStream_FFMPEG::read(unsigned char** data, int* size, int* endOfFi
if
(
ret
==
AVERROR
(
EAGAIN
))
continue
;
#if USE_AV_INTERRUPT_CALLBACK
// update interrupt value
get_monotonic_time
(
&
interrupt_metadata
.
value
);
#endif
if
(
ret
<
0
)
{
if
(
ret
==
(
int
)
AVERROR_EOF
)
*
endOfFile
=
true
;
return
false
;
break
;
}
if
(
pkt_
.
stream_index
!=
video_stream_id_
)
...
...
@@ -2536,14 +2561,23 @@ bool InputMediaStream_FFMPEG::read(unsigned char** data, int* size, int* endOfFi
continue
;
}
result
=
true
;
break
;
}
*
data
=
pkt_
.
data
;
*
size
=
pkt_
.
size
;
*
endOfFile
=
false
;
#if USE_AV_INTERRUPT_CALLBACK
// deactivate interrupt callback
interrupt_metadata
.
timeout_after_ms
=
0
;
#endif
if
(
result
)
{
*
data
=
pkt_
.
data
;
*
size
=
pkt_
.
size
;
*
endOfFile
=
false
;
}
return
true
;
return
result
;
}
InputMediaStream_FFMPEG
*
create_InputMediaStream_FFMPEG
(
const
char
*
fileName
,
int
*
codec
,
int
*
chroma_format
,
int
*
width
,
int
*
height
)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录