Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
小白菜888
Ffmpeg
提交
095be4fb
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,发现更多精彩内容 >>
提交
095be4fb
编写于
8月 25, 2012
作者:
J
Justin Ruggles
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
adpcmenc: use planar sample format for adpcm_ima_wav and adpcm_ima_qt
上级
d9a13c2f
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
42 addition
and
30 deletion
+42
-30
libavcodec/adpcmenc.c
libavcodec/adpcmenc.c
+42
-30
未找到文件。
libavcodec/adpcmenc.c
浏览文件 @
095be4fb
...
@@ -271,12 +271,11 @@ static inline uint8_t adpcm_yamaha_compress_sample(ADPCMChannelStatus *c,
...
@@ -271,12 +271,11 @@ static inline uint8_t adpcm_yamaha_compress_sample(ADPCMChannelStatus *c,
static
void
adpcm_compress_trellis
(
AVCodecContext
*
avctx
,
static
void
adpcm_compress_trellis
(
AVCodecContext
*
avctx
,
const
int16_t
*
samples
,
uint8_t
*
dst
,
const
int16_t
*
samples
,
uint8_t
*
dst
,
ADPCMChannelStatus
*
c
,
int
n
)
ADPCMChannelStatus
*
c
,
int
n
,
int
stride
)
{
{
//FIXME 6% faster if frontier is a compile-time constant
//FIXME 6% faster if frontier is a compile-time constant
ADPCMEncodeContext
*
s
=
avctx
->
priv_data
;
ADPCMEncodeContext
*
s
=
avctx
->
priv_data
;
const
int
frontier
=
1
<<
avctx
->
trellis
;
const
int
frontier
=
1
<<
avctx
->
trellis
;
const
int
stride
=
avctx
->
channels
;
const
int
version
=
avctx
->
codec
->
id
;
const
int
version
=
avctx
->
codec
->
id
;
TrellisPath
*
paths
=
s
->
paths
,
*
p
;
TrellisPath
*
paths
=
s
->
paths
,
*
p
;
TrellisNode
*
node_buf
=
s
->
node_buf
;
TrellisNode
*
node_buf
=
s
->
node_buf
;
...
@@ -480,11 +479,13 @@ static int adpcm_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
...
@@ -480,11 +479,13 @@ static int adpcm_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
{
{
int
n
,
i
,
ch
,
st
,
pkt_size
,
ret
;
int
n
,
i
,
ch
,
st
,
pkt_size
,
ret
;
const
int16_t
*
samples
;
const
int16_t
*
samples
;
int16_t
**
samples_p
;
uint8_t
*
dst
;
uint8_t
*
dst
;
ADPCMEncodeContext
*
c
=
avctx
->
priv_data
;
ADPCMEncodeContext
*
c
=
avctx
->
priv_data
;
uint8_t
*
buf
;
uint8_t
*
buf
;
samples
=
(
const
int16_t
*
)
frame
->
data
[
0
];
samples
=
(
const
int16_t
*
)
frame
->
data
[
0
];
samples_p
=
(
int16_t
**
)
frame
->
extended_data
;
st
=
avctx
->
channels
==
2
;
st
=
avctx
->
channels
==
2
;
if
(
avctx
->
codec_id
==
AV_CODEC_ID_ADPCM_SWF
)
if
(
avctx
->
codec_id
==
AV_CODEC_ID_ADPCM_SWF
)
...
@@ -506,7 +507,7 @@ static int adpcm_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
...
@@ -506,7 +507,7 @@ static int adpcm_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
for
(
ch
=
0
;
ch
<
avctx
->
channels
;
ch
++
)
{
for
(
ch
=
0
;
ch
<
avctx
->
channels
;
ch
++
)
{
ADPCMChannelStatus
*
status
=
&
c
->
status
[
ch
];
ADPCMChannelStatus
*
status
=
&
c
->
status
[
ch
];
status
->
prev_sample
=
samples
[
ch
];
status
->
prev_sample
=
samples
_p
[
ch
][
0
];
/* status->step_index = 0;
/* status->step_index = 0;
XXX: not sure how to init the state machine */
XXX: not sure how to init the state machine */
bytestream_put_le16
(
&
dst
,
status
->
prev_sample
);
bytestream_put_le16
(
&
dst
,
status
->
prev_sample
);
...
@@ -518,9 +519,9 @@ static int adpcm_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
...
@@ -518,9 +519,9 @@ static int adpcm_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
if
(
avctx
->
trellis
>
0
)
{
if
(
avctx
->
trellis
>
0
)
{
FF_ALLOC_OR_GOTO
(
avctx
,
buf
,
avctx
->
channels
*
blocks
*
8
,
error
);
FF_ALLOC_OR_GOTO
(
avctx
,
buf
,
avctx
->
channels
*
blocks
*
8
,
error
);
for
(
ch
=
0
;
ch
<
avctx
->
channels
;
ch
++
)
{
for
(
ch
=
0
;
ch
<
avctx
->
channels
;
ch
++
)
{
adpcm_compress_trellis
(
avctx
,
&
samples
[
avctx
->
channels
+
ch
],
adpcm_compress_trellis
(
avctx
,
&
samples
_p
[
ch
][
1
],
buf
+
ch
*
blocks
*
8
,
&
c
->
status
[
ch
],
buf
+
ch
*
blocks
*
8
,
&
c
->
status
[
ch
],
blocks
*
8
);
blocks
*
8
,
1
);
}
}
for
(
i
=
0
;
i
<
blocks
;
i
++
)
{
for
(
i
=
0
;
i
<
blocks
;
i
++
)
{
for
(
ch
=
0
;
ch
<
avctx
->
channels
;
ch
++
)
{
for
(
ch
=
0
;
ch
<
avctx
->
channels
;
ch
++
)
{
...
@@ -534,10 +535,10 @@ static int adpcm_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
...
@@ -534,10 +535,10 @@ static int adpcm_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
for
(
i
=
0
;
i
<
blocks
;
i
++
)
{
for
(
i
=
0
;
i
<
blocks
;
i
++
)
{
for
(
ch
=
0
;
ch
<
avctx
->
channels
;
ch
++
)
{
for
(
ch
=
0
;
ch
<
avctx
->
channels
;
ch
++
)
{
ADPCMChannelStatus
*
status
=
&
c
->
status
[
ch
];
ADPCMChannelStatus
*
status
=
&
c
->
status
[
ch
];
const
int16_t
*
smp
=
&
samples
[
avctx
->
channels
*
(
1
+
i
*
8
)
+
ch
];
const
int16_t
*
smp
=
&
samples
_p
[
ch
][
1
+
i
*
8
];
for
(
j
=
0
;
j
<
8
;
j
+=
2
)
{
for
(
j
=
0
;
j
<
8
;
j
+=
2
)
{
*
dst
++
=
adpcm_ima_compress_sample
(
status
,
smp
[
avctx
->
channels
*
j
])
|
*
dst
++
=
adpcm_ima_compress_sample
(
status
,
smp
[
j
])
|
(
adpcm_ima_compress_sample
(
status
,
smp
[
avctx
->
channels
*
(
j
+
1
)
])
<<
4
);
(
adpcm_ima_compress_sample
(
status
,
smp
[
j
+
1
])
<<
4
);
}
}
}
}
}
}
...
@@ -550,20 +551,20 @@ static int adpcm_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
...
@@ -550,20 +551,20 @@ static int adpcm_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
init_put_bits
(
&
pb
,
dst
,
pkt_size
*
8
);
init_put_bits
(
&
pb
,
dst
,
pkt_size
*
8
);
for
(
ch
=
0
;
ch
<
avctx
->
channels
;
ch
++
)
{
for
(
ch
=
0
;
ch
<
avctx
->
channels
;
ch
++
)
{
put_bits
(
&
pb
,
9
,
(
c
->
status
[
ch
].
prev_sample
&
0xFFFF
)
>>
7
);
ADPCMChannelStatus
*
status
=
&
c
->
status
[
ch
];
put_bits
(
&
pb
,
7
,
c
->
status
[
ch
].
step_index
);
put_bits
(
&
pb
,
9
,
(
status
->
prev_sample
&
0xFFFF
)
>>
7
);
put_bits
(
&
pb
,
7
,
status
->
step_index
);
if
(
avctx
->
trellis
>
0
)
{
if
(
avctx
->
trellis
>
0
)
{
uint8_t
buf
[
64
];
uint8_t
buf
[
64
];
adpcm_compress_trellis
(
avctx
,
samples
+
ch
,
buf
,
&
c
->
status
[
ch
],
64
);
adpcm_compress_trellis
(
avctx
,
&
samples_p
[
ch
][
1
],
buf
,
status
,
64
,
1
);
for
(
i
=
0
;
i
<
64
;
i
++
)
for
(
i
=
0
;
i
<
64
;
i
++
)
put_bits
(
&
pb
,
4
,
buf
[
i
^
1
]);
put_bits
(
&
pb
,
4
,
buf
[
i
^
1
]);
}
else
{
}
else
{
for
(
i
=
0
;
i
<
64
;
i
+=
2
)
{
for
(
i
=
0
;
i
<
64
;
i
+=
2
)
{
int
t1
,
t2
;
int
t1
,
t2
;
t1
=
adpcm_ima_qt_compress_sample
(
&
c
->
status
[
ch
],
t1
=
adpcm_ima_qt_compress_sample
(
status
,
samples_p
[
ch
][
i
]);
samples
[
avctx
->
channels
*
(
i
+
0
)
+
ch
]);
t2
=
adpcm_ima_qt_compress_sample
(
status
,
samples_p
[
ch
][
i
+
1
]);
t2
=
adpcm_ima_qt_compress_sample
(
&
c
->
status
[
ch
],
samples
[
avctx
->
channels
*
(
i
+
1
)
+
ch
]);
put_bits
(
&
pb
,
4
,
t2
);
put_bits
(
&
pb
,
4
,
t2
);
put_bits
(
&
pb
,
4
,
t1
);
put_bits
(
&
pb
,
4
,
t1
);
}
}
...
@@ -595,10 +596,11 @@ static int adpcm_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
...
@@ -595,10 +596,11 @@ static int adpcm_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
if
(
avctx
->
trellis
>
0
)
{
if
(
avctx
->
trellis
>
0
)
{
FF_ALLOC_OR_GOTO
(
avctx
,
buf
,
2
*
n
,
error
);
FF_ALLOC_OR_GOTO
(
avctx
,
buf
,
2
*
n
,
error
);
adpcm_compress_trellis
(
avctx
,
samples
+
avctx
->
channels
,
buf
,
adpcm_compress_trellis
(
avctx
,
samples
+
avctx
->
channels
,
buf
,
&
c
->
status
[
0
],
n
);
&
c
->
status
[
0
],
n
,
avctx
->
channels
);
if
(
avctx
->
channels
==
2
)
if
(
avctx
->
channels
==
2
)
adpcm_compress_trellis
(
avctx
,
samples
+
avctx
->
channels
+
1
,
adpcm_compress_trellis
(
avctx
,
samples
+
avctx
->
channels
+
1
,
buf
+
n
,
&
c
->
status
[
1
],
n
);
buf
+
n
,
&
c
->
status
[
1
],
n
,
avctx
->
channels
);
for
(
i
=
0
;
i
<
n
;
i
++
)
{
for
(
i
=
0
;
i
<
n
;
i
++
)
{
put_bits
(
&
pb
,
4
,
buf
[
i
]);
put_bits
(
&
pb
,
4
,
buf
[
i
]);
if
(
avctx
->
channels
==
2
)
if
(
avctx
->
channels
==
2
)
...
@@ -642,12 +644,15 @@ static int adpcm_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
...
@@ -642,12 +644,15 @@ static int adpcm_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
n
=
avctx
->
block_align
-
7
*
avctx
->
channels
;
n
=
avctx
->
block_align
-
7
*
avctx
->
channels
;
FF_ALLOC_OR_GOTO
(
avctx
,
buf
,
2
*
n
,
error
);
FF_ALLOC_OR_GOTO
(
avctx
,
buf
,
2
*
n
,
error
);
if
(
avctx
->
channels
==
1
)
{
if
(
avctx
->
channels
==
1
)
{
adpcm_compress_trellis
(
avctx
,
samples
,
buf
,
&
c
->
status
[
0
],
n
);
adpcm_compress_trellis
(
avctx
,
samples
,
buf
,
&
c
->
status
[
0
],
n
,
avctx
->
channels
);
for
(
i
=
0
;
i
<
n
;
i
+=
2
)
for
(
i
=
0
;
i
<
n
;
i
+=
2
)
*
dst
++
=
(
buf
[
i
]
<<
4
)
|
buf
[
i
+
1
];
*
dst
++
=
(
buf
[
i
]
<<
4
)
|
buf
[
i
+
1
];
}
else
{
}
else
{
adpcm_compress_trellis
(
avctx
,
samples
,
buf
,
&
c
->
status
[
0
],
n
);
adpcm_compress_trellis
(
avctx
,
samples
,
buf
,
adpcm_compress_trellis
(
avctx
,
samples
+
1
,
buf
+
n
,
&
c
->
status
[
1
],
n
);
&
c
->
status
[
0
],
n
,
avctx
->
channels
);
adpcm_compress_trellis
(
avctx
,
samples
+
1
,
buf
+
n
,
&
c
->
status
[
1
],
n
,
avctx
->
channels
);
for
(
i
=
0
;
i
<
n
;
i
++
)
for
(
i
=
0
;
i
<
n
;
i
++
)
*
dst
++
=
(
buf
[
i
]
<<
4
)
|
buf
[
n
+
i
];
*
dst
++
=
(
buf
[
i
]
<<
4
)
|
buf
[
n
+
i
];
}
}
...
@@ -667,12 +672,15 @@ static int adpcm_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
...
@@ -667,12 +672,15 @@ static int adpcm_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
FF_ALLOC_OR_GOTO
(
avctx
,
buf
,
2
*
n
*
2
,
error
);
FF_ALLOC_OR_GOTO
(
avctx
,
buf
,
2
*
n
*
2
,
error
);
n
*=
2
;
n
*=
2
;
if
(
avctx
->
channels
==
1
)
{
if
(
avctx
->
channels
==
1
)
{
adpcm_compress_trellis
(
avctx
,
samples
,
buf
,
&
c
->
status
[
0
],
n
);
adpcm_compress_trellis
(
avctx
,
samples
,
buf
,
&
c
->
status
[
0
],
n
,
avctx
->
channels
);
for
(
i
=
0
;
i
<
n
;
i
+=
2
)
for
(
i
=
0
;
i
<
n
;
i
+=
2
)
*
dst
++
=
buf
[
i
]
|
(
buf
[
i
+
1
]
<<
4
);
*
dst
++
=
buf
[
i
]
|
(
buf
[
i
+
1
]
<<
4
);
}
else
{
}
else
{
adpcm_compress_trellis
(
avctx
,
samples
,
buf
,
&
c
->
status
[
0
],
n
);
adpcm_compress_trellis
(
avctx
,
samples
,
buf
,
adpcm_compress_trellis
(
avctx
,
samples
+
1
,
buf
+
n
,
&
c
->
status
[
1
],
n
);
&
c
->
status
[
0
],
n
,
avctx
->
channels
);
adpcm_compress_trellis
(
avctx
,
samples
+
1
,
buf
+
n
,
&
c
->
status
[
1
],
n
,
avctx
->
channels
);
for
(
i
=
0
;
i
<
n
;
i
++
)
for
(
i
=
0
;
i
<
n
;
i
++
)
*
dst
++
=
buf
[
i
]
|
(
buf
[
n
+
i
]
<<
4
);
*
dst
++
=
buf
[
i
]
|
(
buf
[
n
+
i
]
<<
4
);
}
}
...
@@ -700,7 +708,11 @@ static const enum AVSampleFormat sample_fmts[] = {
...
@@ -700,7 +708,11 @@ static const enum AVSampleFormat sample_fmts[] = {
AV_SAMPLE_FMT_S16
,
AV_SAMPLE_FMT_NONE
AV_SAMPLE_FMT_S16
,
AV_SAMPLE_FMT_NONE
};
};
#define ADPCM_ENCODER(id_, name_, long_name_) \
static
const
enum
AVSampleFormat
sample_fmts_p
[]
=
{
AV_SAMPLE_FMT_S16P
,
AV_SAMPLE_FMT_NONE
};
#define ADPCM_ENCODER(id_, name_, sample_fmts_, long_name_) \
AVCodec ff_ ## name_ ## _encoder = { \
AVCodec ff_ ## name_ ## _encoder = { \
.name = #name_, \
.name = #name_, \
.type = AVMEDIA_TYPE_AUDIO, \
.type = AVMEDIA_TYPE_AUDIO, \
...
@@ -709,12 +721,12 @@ AVCodec ff_ ## name_ ## _encoder = { \
...
@@ -709,12 +721,12 @@ AVCodec ff_ ## name_ ## _encoder = { \
.init = adpcm_encode_init, \
.init = adpcm_encode_init, \
.encode2 = adpcm_encode_frame, \
.encode2 = adpcm_encode_frame, \
.close = adpcm_encode_close, \
.close = adpcm_encode_close, \
.sample_fmts = sample_fmts
,
\
.sample_fmts = sample_fmts
_,
\
.long_name = NULL_IF_CONFIG_SMALL(long_name_), \
.long_name = NULL_IF_CONFIG_SMALL(long_name_), \
}
}
ADPCM_ENCODER
(
AV_CODEC_ID_ADPCM_IMA_QT
,
adpcm_ima_qt
,
"ADPCM IMA QuickTime"
);
ADPCM_ENCODER
(
AV_CODEC_ID_ADPCM_IMA_QT
,
adpcm_ima_qt
,
sample_fmts_p
,
"ADPCM IMA QuickTime"
);
ADPCM_ENCODER
(
AV_CODEC_ID_ADPCM_IMA_WAV
,
adpcm_ima_wav
,
"ADPCM IMA WAV"
);
ADPCM_ENCODER
(
AV_CODEC_ID_ADPCM_IMA_WAV
,
adpcm_ima_wav
,
sample_fmts_p
,
"ADPCM IMA WAV"
);
ADPCM_ENCODER
(
AV_CODEC_ID_ADPCM_MS
,
adpcm_ms
,
"ADPCM Microsoft"
);
ADPCM_ENCODER
(
AV_CODEC_ID_ADPCM_MS
,
adpcm_ms
,
sample_fmts
,
"ADPCM Microsoft"
);
ADPCM_ENCODER
(
AV_CODEC_ID_ADPCM_SWF
,
adpcm_swf
,
"ADPCM Shockwave Flash"
);
ADPCM_ENCODER
(
AV_CODEC_ID_ADPCM_SWF
,
adpcm_swf
,
sample_fmts
,
"ADPCM Shockwave Flash"
);
ADPCM_ENCODER
(
AV_CODEC_ID_ADPCM_YAMAHA
,
adpcm_yamaha
,
"ADPCM Yamaha"
);
ADPCM_ENCODER
(
AV_CODEC_ID_ADPCM_YAMAHA
,
adpcm_yamaha
,
sample_fmts
,
"ADPCM Yamaha"
);
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录