Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
小白菜888
Ffmpeg
提交
4d686fb7
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,发现更多精彩内容 >>
提交
4d686fb7
编写于
8月 05, 2014
作者:
V
Vittorio Giovara
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
matroskaenc: convert avstream stereo3d side data during encoding
Write the StereoMode Embl to bitstream.
上级
d4ae8ac9
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
76 addition
and
18 deletion
+76
-18
libavformat/matroskaenc.c
libavformat/matroskaenc.c
+76
-18
未找到文件。
libavformat/matroskaenc.c
浏览文件 @
4d686fb7
...
...
@@ -43,6 +43,7 @@
#include "libavutil/opt.h"
#include "libavutil/random_seed.h"
#include "libavutil/samplefmt.h"
#include "libavutil/stereo3d.h"
#include "libavcodec/xiph.h"
#include "libavcodec/mpeg4audio.h"
...
...
@@ -624,25 +625,78 @@ static int mkv_write_codecprivate(AVFormatContext *s, AVIOContext *pb,
return
ret
;
}
static
void
mkv_write_stereo_mode
(
AVIOContext
*
pb
,
uint8_t
stereo_fmt
,
int
mode
)
static
int
mkv_write_stereo_mode
(
AVFormatContext
*
s
,
AVIOContext
*
pb
,
AVStream
*
st
,
int
mode
)
{
int
valid_fmt
=
0
;
int
i
;
AVDictionaryEntry
*
tag
;
MatroskaVideoStereoModeType
format
=
MATROSKA_VIDEO_STEREOMODE_TYPE_NB
;
// convert metadata into proper side data and add it to the stream
if
((
tag
=
av_dict_get
(
s
->
metadata
,
"stereo_mode"
,
NULL
,
0
)))
{
int
stereo_mode
=
atoi
(
tag
->
value
);
if
(
stereo_mode
<
MATROSKA_VIDEO_STEREOMODE_TYPE_NB
&&
stereo_mode
!=
10
&&
stereo_mode
!=
12
)
{
int
ret
=
ff_mkv_stereo3d_conv
(
st
,
stereo_mode
);
if
(
ret
<
0
)
return
ret
;
}
}
switch
(
mode
)
{
case
MODE_WEBM
:
if
(
stereo_fmt
<=
MATROSKA_VIDEO_STEREOMODE_TYPE_TOP_BOTTOM
||
stereo_fmt
==
MATROSKA_VIDEO_STEREOMODE_TYPE_RIGHT_LEFT
)
valid_fmt
=
1
;
break
;
case
MODE_MATROSKAv2
:
if
(
stereo_fmt
<=
MATROSKA_VIDEO_STEREOMODE_TYPE_BOTH_EYES_BLOCK_RL
)
valid_fmt
=
1
;
break
;
for
(
i
=
0
;
i
<
st
->
nb_side_data
;
i
++
)
{
AVPacketSideData
sd
=
st
->
side_data
[
i
];
if
(
sd
.
type
==
AV_PKT_DATA_STEREO3D
)
{
AVStereo3D
*
stereo
=
(
AVStereo3D
*
)
sd
.
data
;
switch
(
stereo
->
type
)
{
case
AV_STEREO3D_2D
:
format
=
MATROSKA_VIDEO_STEREOMODE_TYPE_MONO
;
break
;
case
AV_STEREO3D_SIDEBYSIDE
:
format
=
(
stereo
->
flags
&
AV_STEREO3D_FLAG_INVERT
)
?
MATROSKA_VIDEO_STEREOMODE_TYPE_RIGHT_LEFT
:
MATROSKA_VIDEO_STEREOMODE_TYPE_LEFT_RIGHT
;
break
;
case
AV_STEREO3D_TOPBOTTOM
:
format
=
MATROSKA_VIDEO_STEREOMODE_TYPE_TOP_BOTTOM
;
if
(
stereo
->
flags
&
AV_STEREO3D_FLAG_INVERT
)
format
--
;
break
;
case
AV_STEREO3D_CHECKERBOARD
:
format
=
MATROSKA_VIDEO_STEREOMODE_TYPE_CHECKERBOARD_LR
;
if
(
stereo
->
flags
&
AV_STEREO3D_FLAG_INVERT
)
format
--
;
break
;
case
AV_STEREO3D_LINES
:
format
=
MATROSKA_VIDEO_STEREOMODE_TYPE_ROW_INTERLEAVED_LR
;
if
(
stereo
->
flags
&
AV_STEREO3D_FLAG_INVERT
)
format
--
;
break
;
case
AV_STEREO3D_COLUMNS
:
format
=
MATROSKA_VIDEO_STEREOMODE_TYPE_COL_INTERLEAVED_LR
;
if
(
stereo
->
flags
&
AV_STEREO3D_FLAG_INVERT
)
format
--
;
break
;
case
AV_STEREO3D_FRAMESEQUENCE
:
format
=
MATROSKA_VIDEO_STEREOMODE_TYPE_BOTH_EYES_BLOCK_LR
;
if
(
stereo
->
flags
&
AV_STEREO3D_FLAG_INVERT
)
format
++
;
break
;
}
break
;
}
}
if
(
valid_fmt
)
put_ebml_uint
(
pb
,
MATROSKA_ID_VIDEOSTEREOMODE
,
stereo_fmt
);
if
(
mode
==
MODE_WEBM
&&
(
format
>
MATROSKA_VIDEO_STEREOMODE_TYPE_TOP_BOTTOM
&&
format
!=
MATROSKA_VIDEO_STEREOMODE_TYPE_RIGHT_LEFT
))
format
=
MATROSKA_VIDEO_STEREOMODE_TYPE_NB
;
if
(
format
<
MATROSKA_VIDEO_STEREOMODE_TYPE_NB
)
put_ebml_uint
(
pb
,
MATROSKA_ID_VIDEOSTEREOMODE
,
format
);
return
0
;
}
static
int
mkv_write_track
(
AVFormatContext
*
s
,
MatroskaMuxContext
*
mkv
,
...
...
@@ -743,9 +797,13 @@ static int mkv_write_track(AVFormatContext *s, MatroskaMuxContext *mkv,
// XXX: interlace flag?
put_ebml_uint
(
pb
,
MATROSKA_ID_VIDEOPIXELWIDTH
,
codec
->
width
);
put_ebml_uint
(
pb
,
MATROSKA_ID_VIDEOPIXELHEIGHT
,
codec
->
height
);
if
((
tag
=
av_dict_get
(
s
->
metadata
,
"stereo_mode"
,
NULL
,
0
)))
{
mkv_write_stereo_mode
(
pb
,
atoi
(
tag
->
value
),
mkv
->
mode
);
}
// check both side data and metadata for stereo information,
// write the result to the bitstream if any is found
ret
=
mkv_write_stereo_mode
(
s
,
pb
,
st
,
mkv
->
mode
);
if
(
ret
<
0
)
return
ret
;
if
(
st
->
sample_aspect_ratio
.
num
)
{
int
d_width
=
codec
->
width
*
av_q2d
(
st
->
sample_aspect_ratio
);
put_ebml_uint
(
pb
,
MATROSKA_ID_VIDEODISPLAYWIDTH
,
d_width
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录