Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
小白菜888
Ffmpeg
提交
ef196bee
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,发现更多精彩内容 >>
提交
ef196bee
编写于
8月 22, 2013
作者:
L
Luca Barbato
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
mov: Refactor audio specific parsing in mov_parse_stsd_audio
上级
a3b53ff0
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
87 addition
and
78 deletion
+87
-78
libavformat/mov.c
libavformat/mov.c
+87
-78
未找到文件。
libavformat/mov.c
浏览文件 @
ef196bee
...
...
@@ -1206,6 +1206,92 @@ static void mov_parse_stsd_video(MOVContext *c, AVIOContext *pb,
}
}
static
void
mov_parse_stsd_audio
(
MOVContext
*
c
,
AVIOContext
*
pb
,
AVStream
*
st
,
MOVStreamContext
*
sc
)
{
int
bits_per_sample
,
flags
;
uint16_t
version
=
avio_rb16
(
pb
);
avio_rb16
(
pb
);
/* revision level */
avio_rb32
(
pb
);
/* vendor */
st
->
codec
->
channels
=
avio_rb16
(
pb
);
/* channel count */
st
->
codec
->
bits_per_coded_sample
=
avio_rb16
(
pb
);
/* sample size */
av_dlog
(
c
->
fc
,
"audio channels %d
\n
"
,
st
->
codec
->
channels
);
sc
->
audio_cid
=
avio_rb16
(
pb
);
avio_rb16
(
pb
);
/* packet size = 0 */
st
->
codec
->
sample_rate
=
((
avio_rb32
(
pb
)
>>
16
));
// Read QT version 1 fields. In version 0 these do not exist.
av_dlog
(
c
->
fc
,
"version =%d, isom =%d
\n
"
,
version
,
c
->
isom
);
if
(
!
c
->
isom
)
{
if
(
version
==
1
)
{
sc
->
samples_per_frame
=
avio_rb32
(
pb
);
avio_rb32
(
pb
);
/* bytes per packet */
sc
->
bytes_per_frame
=
avio_rb32
(
pb
);
avio_rb32
(
pb
);
/* bytes per sample */
}
else
if
(
version
==
2
)
{
avio_rb32
(
pb
);
/* sizeof struct only */
st
->
codec
->
sample_rate
=
av_int2double
(
avio_rb64
(
pb
));
st
->
codec
->
channels
=
avio_rb32
(
pb
);
avio_rb32
(
pb
);
/* always 0x7F000000 */
st
->
codec
->
bits_per_coded_sample
=
avio_rb32
(
pb
);
flags
=
avio_rb32
(
pb
);
/* lpcm format specific flag */
sc
->
bytes_per_frame
=
avio_rb32
(
pb
);
sc
->
samples_per_frame
=
avio_rb32
(
pb
);
if
(
st
->
codec
->
codec_tag
==
MKTAG
(
'l'
,
'p'
,
'c'
,
'm'
))
st
->
codec
->
codec_id
=
ff_mov_get_lpcm_codec_id
(
st
->
codec
->
bits_per_coded_sample
,
flags
);
}
}
switch
(
st
->
codec
->
codec_id
)
{
case
AV_CODEC_ID_PCM_S8
:
case
AV_CODEC_ID_PCM_U8
:
if
(
st
->
codec
->
bits_per_coded_sample
==
16
)
st
->
codec
->
codec_id
=
AV_CODEC_ID_PCM_S16BE
;
break
;
case
AV_CODEC_ID_PCM_S16LE
:
case
AV_CODEC_ID_PCM_S16BE
:
if
(
st
->
codec
->
bits_per_coded_sample
==
8
)
st
->
codec
->
codec_id
=
AV_CODEC_ID_PCM_S8
;
else
if
(
st
->
codec
->
bits_per_coded_sample
==
24
)
st
->
codec
->
codec_id
=
st
->
codec
->
codec_id
==
AV_CODEC_ID_PCM_S16BE
?
AV_CODEC_ID_PCM_S24BE
:
AV_CODEC_ID_PCM_S24LE
;
break
;
/* set values for old format before stsd version 1 appeared */
case
AV_CODEC_ID_MACE3
:
sc
->
samples_per_frame
=
6
;
sc
->
bytes_per_frame
=
2
*
st
->
codec
->
channels
;
break
;
case
AV_CODEC_ID_MACE6
:
sc
->
samples_per_frame
=
6
;
sc
->
bytes_per_frame
=
1
*
st
->
codec
->
channels
;
break
;
case
AV_CODEC_ID_ADPCM_IMA_QT
:
sc
->
samples_per_frame
=
64
;
sc
->
bytes_per_frame
=
34
*
st
->
codec
->
channels
;
break
;
case
AV_CODEC_ID_GSM
:
sc
->
samples_per_frame
=
160
;
sc
->
bytes_per_frame
=
33
;
break
;
default:
break
;
}
bits_per_sample
=
av_get_bits_per_sample
(
st
->
codec
->
codec_id
);
if
(
bits_per_sample
)
{
st
->
codec
->
bits_per_coded_sample
=
bits_per_sample
;
sc
->
sample_size
=
(
bits_per_sample
>>
3
)
*
st
->
codec
->
channels
;
}
}
int
ff_mov_read_stsd_entries
(
MOVContext
*
c
,
AVIOContext
*
pb
,
int
entries
)
{
AVStream
*
st
;
...
...
@@ -1266,85 +1352,8 @@ int ff_mov_read_stsd_entries(MOVContext *c, AVIOContext *pb, int entries)
st
->
codec
->
codec_id
=
id
;
mov_parse_stsd_video
(
c
,
pb
,
st
,
sc
);
}
else
if
(
st
->
codec
->
codec_type
==
AVMEDIA_TYPE_AUDIO
)
{
int
bits_per_sample
,
flags
;
uint16_t
version
=
avio_rb16
(
pb
);
st
->
codec
->
codec_id
=
id
;
avio_rb16
(
pb
);
/* revision level */
avio_rb32
(
pb
);
/* vendor */
st
->
codec
->
channels
=
avio_rb16
(
pb
);
/* channel count */
av_dlog
(
c
->
fc
,
"audio channels %d
\n
"
,
st
->
codec
->
channels
);
st
->
codec
->
bits_per_coded_sample
=
avio_rb16
(
pb
);
/* sample size */
sc
->
audio_cid
=
avio_rb16
(
pb
);
avio_rb16
(
pb
);
/* packet size = 0 */
st
->
codec
->
sample_rate
=
((
avio_rb32
(
pb
)
>>
16
));
//Read QT version 1 fields. In version 0 these do not exist.
av_dlog
(
c
->
fc
,
"version =%d, isom =%d
\n
"
,
version
,
c
->
isom
);
if
(
!
c
->
isom
)
{
if
(
version
==
1
)
{
sc
->
samples_per_frame
=
avio_rb32
(
pb
);
avio_rb32
(
pb
);
/* bytes per packet */
sc
->
bytes_per_frame
=
avio_rb32
(
pb
);
avio_rb32
(
pb
);
/* bytes per sample */
}
else
if
(
version
==
2
)
{
avio_rb32
(
pb
);
/* sizeof struct only */
st
->
codec
->
sample_rate
=
av_int2double
(
avio_rb64
(
pb
));
/* float 64 */
st
->
codec
->
channels
=
avio_rb32
(
pb
);
avio_rb32
(
pb
);
/* always 0x7F000000 */
st
->
codec
->
bits_per_coded_sample
=
avio_rb32
(
pb
);
/* bits per channel if sound is uncompressed */
flags
=
avio_rb32
(
pb
);
/* lpcm format specific flag */
sc
->
bytes_per_frame
=
avio_rb32
(
pb
);
/* bytes per audio packet if constant */
sc
->
samples_per_frame
=
avio_rb32
(
pb
);
/* lpcm frames per audio packet if constant */
if
(
format
==
MKTAG
(
'l'
,
'p'
,
'c'
,
'm'
))
st
->
codec
->
codec_id
=
ff_mov_get_lpcm_codec_id
(
st
->
codec
->
bits_per_coded_sample
,
flags
);
}
}
switch
(
st
->
codec
->
codec_id
)
{
case
AV_CODEC_ID_PCM_S8
:
case
AV_CODEC_ID_PCM_U8
:
if
(
st
->
codec
->
bits_per_coded_sample
==
16
)
st
->
codec
->
codec_id
=
AV_CODEC_ID_PCM_S16BE
;
break
;
case
AV_CODEC_ID_PCM_S16LE
:
case
AV_CODEC_ID_PCM_S16BE
:
if
(
st
->
codec
->
bits_per_coded_sample
==
8
)
st
->
codec
->
codec_id
=
AV_CODEC_ID_PCM_S8
;
else
if
(
st
->
codec
->
bits_per_coded_sample
==
24
)
st
->
codec
->
codec_id
=
st
->
codec
->
codec_id
==
AV_CODEC_ID_PCM_S16BE
?
AV_CODEC_ID_PCM_S24BE
:
AV_CODEC_ID_PCM_S24LE
;
break
;
/* set values for old format before stsd version 1 appeared */
case
AV_CODEC_ID_MACE3
:
sc
->
samples_per_frame
=
6
;
sc
->
bytes_per_frame
=
2
*
st
->
codec
->
channels
;
break
;
case
AV_CODEC_ID_MACE6
:
sc
->
samples_per_frame
=
6
;
sc
->
bytes_per_frame
=
1
*
st
->
codec
->
channels
;
break
;
case
AV_CODEC_ID_ADPCM_IMA_QT
:
sc
->
samples_per_frame
=
64
;
sc
->
bytes_per_frame
=
34
*
st
->
codec
->
channels
;
break
;
case
AV_CODEC_ID_GSM
:
sc
->
samples_per_frame
=
160
;
sc
->
bytes_per_frame
=
33
;
break
;
default:
break
;
}
bits_per_sample
=
av_get_bits_per_sample
(
st
->
codec
->
codec_id
);
if
(
bits_per_sample
)
{
st
->
codec
->
bits_per_coded_sample
=
bits_per_sample
;
sc
->
sample_size
=
(
bits_per_sample
>>
3
)
*
st
->
codec
->
channels
;
}
mov_parse_stsd_audio
(
c
,
pb
,
st
,
sc
);
}
else
if
(
st
->
codec
->
codec_type
==
AVMEDIA_TYPE_SUBTITLE
){
// ttxt stsd contains display flags, justification, background
// color, fonts, and default styles, so fake an atom to read it
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录