Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
小白菜888
Ffmpeg
提交
a96b68b7
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,发现更多精彩内容 >>
提交
a96b68b7
编写于
9月 23, 2001
作者:
F
Fabrice Bellard
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
added pcm codecs
Originally committed as revision 140 to
svn://svn.ffmpeg.org/ffmpeg/trunk
上级
a56c66a7
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
446 addition
and
22 deletion
+446
-22
libavcodec/Makefile
libavcodec/Makefile
+1
-1
libavcodec/avcodec.h
libavcodec/avcodec.h
+39
-4
libavcodec/pcm.c
libavcodec/pcm.c
+367
-0
libavcodec/utils.c
libavcodec/utils.c
+39
-17
未找到文件。
libavcodec/Makefile
浏览文件 @
a96b68b7
...
...
@@ -6,7 +6,7 @@ LDFLAGS= -g
OBJS
=
common.o utils.o mpegvideo.o h263.o jrevdct.o jfdctfst.o
\
mpegaudio.o ac3enc.o mjpeg.o resample.o dsputil.o
\
motion_est.o imgconvert.o imgresample.o msmpeg4.o
\
mpeg12.o h263dec.o rv10.o mpegaudiodec.o
mpeg12.o h263dec.o rv10.o mpegaudiodec.o
pcm.o
ASM_OBJS
=
# currently using libac3 for ac3 decoding
...
...
libavcodec/avcodec.h
浏览文件 @
a96b68b7
#ifndef AVCODEC_H
#define AVCODEC_H
#include "common.h"
enum
CodecID
{
...
...
@@ -9,11 +12,20 @@ enum CodecID {
CODEC_ID_AC3
,
CODEC_ID_MJPEG
,
CODEC_ID_MPEG4
,
CODEC_ID_PCM
,
CODEC_ID_RAWVIDEO
,
CODEC_ID_MSMPEG4
,
CODEC_ID_H263P
,
CODEC_ID_H263I
,
/* various pcm "codecs" */
CODEC_ID_PCM_S16LE
,
CODEC_ID_PCM_S16BE
,
CODEC_ID_PCM_U16LE
,
CODEC_ID_PCM_U16BE
,
CODEC_ID_PCM_S8
,
CODEC_ID_PCM_U8
,
CODEC_ID_PCM_MULAW
,
CODEC_ID_PCM_ALAW
,
};
enum
CodecType
{
...
...
@@ -30,6 +42,11 @@ enum PixelFormat {
PIX_FMT_YUV444P
,
};
/* currently unused, may be used if 24/32 bits samples ever supported */
enum
SampleFormat
{
SAMPLE_FMT_S16
=
0
,
/* signed 16 bits */
};
/* in bytes */
#define AVCODEC_MAX_AUDIO_FRAME_SIZE 18432
...
...
@@ -74,6 +91,7 @@ typedef struct AVCodecContext {
/* audio only */
int
sample_rate
;
/* samples per sec */
int
channels
;
int
sample_fmt
;
/* sample format, currenly unused */
/* the following data should not be initialized */
int
frame_size
;
/* in samples, initialized when calling 'init' */
...
...
@@ -130,13 +148,28 @@ extern AVCodec mpeg_decoder;
extern
AVCodec
h263i_decoder
;
extern
AVCodec
rv10_decoder
;
extern
AVCodec
mjpeg_decoder
;
extern
AVCodec
mp3_decoder
;
/* dummy raw codecs */
extern
AVCodec
pcm_codec
;
/* pcm codecs */
#define PCM_CODEC(id, name) \
extern AVCodec name ## _decoder; \
extern AVCodec name ## _encoder;
PCM_CODEC
(
CODEC_ID_PCM_S16LE
,
pcm_s16le
);
PCM_CODEC
(
CODEC_ID_PCM_S16BE
,
pcm_s16be
);
PCM_CODEC
(
CODEC_ID_PCM_U16LE
,
pcm_u16le
);
PCM_CODEC
(
CODEC_ID_PCM_U16BE
,
pcm_u16be
);
PCM_CODEC
(
CODEC_ID_PCM_S8
,
pcm_s8
);
PCM_CODEC
(
CODEC_ID_PCM_U8
,
pcm_u8
);
PCM_CODEC
(
CODEC_ID_PCM_ALAW
,
pcm_alaw
);
PCM_CODEC
(
CODEC_ID_PCM_MULAW
,
pcm_mulaw
);
#undef PCM_CODEC
/* dummy raw video codec */
extern
AVCodec
rawvideo_codec
;
/* the following codecs use external GPL libs */
extern
AVCodec
mp3_decoder
;
extern
AVCodec
ac3_decoder
;
/* resample.c */
...
...
@@ -203,3 +236,5 @@ int avcodec_encode_video(AVCodecContext *avctx, UINT8 *buf, int buf_size,
int
avcodec_close
(
AVCodecContext
*
avctx
);
void
avcodec_register_all
(
void
);
#endif
/* AVCODEC_H */
libavcodec/pcm.c
0 → 100644
浏览文件 @
a96b68b7
/*
* PCM codecs
* Copyright (c) 2001 Gerard Lantau.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include "avcodec.h"
/* from g711.c by SUN microsystems (unrestricted use) */
#define SIGN_BIT (0x80)
/* Sign bit for a A-law byte. */
#define QUANT_MASK (0xf)
/* Quantization field mask. */
#define NSEGS (8)
/* Number of A-law segments. */
#define SEG_SHIFT (4)
/* Left shift for segment number. */
#define SEG_MASK (0x70)
/* Segment field mask. */
#define BIAS (0x84)
/* Bias for linear code. */
/*
* alaw2linear() - Convert an A-law value to 16-bit linear PCM
*
*/
static
int
alaw2linear
(
unsigned
char
a_val
)
{
int
t
;
int
seg
;
a_val
^=
0x55
;
t
=
(
a_val
&
QUANT_MASK
)
<<
4
;
seg
=
((
unsigned
)
a_val
&
SEG_MASK
)
>>
SEG_SHIFT
;
switch
(
seg
)
{
case
0
:
t
+=
8
;
break
;
case
1
:
t
+=
0x108
;
break
;
default:
t
+=
0x108
;
t
<<=
seg
-
1
;
}
return
((
a_val
&
SIGN_BIT
)
?
t
:
-
t
);
}
static
int
ulaw2linear
(
unsigned
char
u_val
)
{
int
t
;
/* Complement to obtain normal u-law value. */
u_val
=
~
u_val
;
/*
* Extract and bias the quantization bits. Then
* shift up by the segment number and subtract out the bias.
*/
t
=
((
u_val
&
QUANT_MASK
)
<<
3
)
+
BIAS
;
t
<<=
((
unsigned
)
u_val
&
SEG_MASK
)
>>
SEG_SHIFT
;
return
((
u_val
&
SIGN_BIT
)
?
(
BIAS
-
t
)
:
(
t
-
BIAS
));
}
/* 16384 entries per table */
static
UINT8
*
linear_to_alaw
=
NULL
;
static
int
linear_to_alaw_ref
=
0
;
static
UINT8
*
linear_to_ulaw
=
NULL
;
static
int
linear_to_ulaw_ref
=
0
;
static
void
build_xlaw_table
(
UINT8
*
linear_to_xlaw
,
int
(
*
xlaw2linear
)(
unsigned
char
),
int
mask
)
{
int
i
,
j
,
v
,
v1
,
v2
;
j
=
0
;
for
(
i
=
0
;
i
<
128
;
i
++
)
{
if
(
i
!=
127
)
{
v1
=
xlaw2linear
(
i
^
mask
);
v2
=
xlaw2linear
((
i
+
1
)
^
mask
);
v
=
(
v1
+
v2
+
4
)
>>
3
;
}
else
{
v
=
8192
;
}
for
(;
j
<
v
;
j
++
)
{
linear_to_xlaw
[
8192
+
j
]
=
(
i
^
mask
);
if
(
j
>
0
)
linear_to_xlaw
[
8192
-
j
]
=
(
i
^
(
mask
^
0x80
));
}
}
linear_to_xlaw
[
0
]
=
linear_to_xlaw
[
1
];
}
static
int
encode_init
(
AVCodecContext
*
avctx
)
{
avctx
->
frame_size
=
1
;
switch
(
avctx
->
codec
->
id
)
{
case
CODEC_ID_PCM_ALAW
:
if
(
linear_to_alaw_ref
==
0
)
{
linear_to_alaw
=
malloc
(
16384
);
if
(
!
linear_to_alaw
)
return
-
1
;
build_xlaw_table
(
linear_to_alaw
,
alaw2linear
,
0xd5
);
}
linear_to_alaw_ref
++
;
break
;
case
CODEC_ID_PCM_MULAW
:
if
(
linear_to_ulaw_ref
==
0
)
{
linear_to_ulaw
=
malloc
(
16384
);
if
(
!
linear_to_ulaw
)
return
-
1
;
build_xlaw_table
(
linear_to_ulaw
,
ulaw2linear
,
0xff
);
}
linear_to_ulaw_ref
++
;
break
;
default:
break
;
}
return
0
;
}
static
int
encode_close
(
AVCodecContext
*
avctx
)
{
switch
(
avctx
->
codec
->
id
)
{
case
CODEC_ID_PCM_ALAW
:
if
(
--
linear_to_alaw_ref
==
0
)
free
(
linear_to_alaw
);
break
;
case
CODEC_ID_PCM_MULAW
:
if
(
--
linear_to_ulaw_ref
==
0
)
free
(
linear_to_ulaw
);
break
;
default:
/* nothing to free */
break
;
}
return
0
;
}
static
int
encode_frame
(
AVCodecContext
*
avctx
,
unsigned
char
*
frame
,
int
buf_size
,
void
*
data
)
{
int
n
,
sample_size
,
v
;
short
*
samples
;
unsigned
char
*
dst
;
switch
(
avctx
->
codec
->
id
)
{
case
CODEC_ID_PCM_S16LE
:
case
CODEC_ID_PCM_S16BE
:
case
CODEC_ID_PCM_U16LE
:
case
CODEC_ID_PCM_U16BE
:
sample_size
=
2
;
break
;
default:
sample_size
=
1
;
break
;
}
n
=
buf_size
/
sample_size
;
samples
=
data
;
dst
=
frame
;
switch
(
avctx
->
codec
->
id
)
{
case
CODEC_ID_PCM_S16LE
:
for
(;
n
>
0
;
n
--
)
{
v
=
*
samples
++
;
dst
[
0
]
=
v
&
0xff
;
dst
[
1
]
=
v
>>
8
;
dst
+=
2
;
}
break
;
case
CODEC_ID_PCM_S16BE
:
for
(;
n
>
0
;
n
--
)
{
v
=
*
samples
++
;
dst
[
0
]
=
v
>>
8
;
dst
[
1
]
=
v
;
dst
+=
2
;
}
break
;
case
CODEC_ID_PCM_U16LE
:
for
(;
n
>
0
;
n
--
)
{
v
=
*
samples
++
;
v
+=
0x8000
;
dst
[
0
]
=
v
&
0xff
;
dst
[
1
]
=
v
>>
8
;
dst
+=
2
;
}
break
;
case
CODEC_ID_PCM_U16BE
:
for
(;
n
>
0
;
n
--
)
{
v
=
*
samples
++
;
v
+=
0x8000
;
dst
[
0
]
=
v
>>
8
;
dst
[
1
]
=
v
;
dst
+=
2
;
}
break
;
case
CODEC_ID_PCM_S8
:
for
(;
n
>
0
;
n
--
)
{
v
=
*
samples
++
;
dst
[
0
]
=
(
v
+
128
)
>>
8
;
dst
++
;
}
break
;
case
CODEC_ID_PCM_U8
:
for
(;
n
>
0
;
n
--
)
{
v
=
*
samples
++
;
dst
[
0
]
=
((
v
+
128
)
>>
8
)
+
128
;
dst
++
;
}
break
;
case
CODEC_ID_PCM_ALAW
:
for
(;
n
>
0
;
n
--
)
{
v
=
*
samples
++
;
dst
[
0
]
=
linear_to_alaw
[(
v
+
32768
)
>>
2
];
dst
++
;
}
break
;
case
CODEC_ID_PCM_MULAW
:
for
(;
n
>
0
;
n
--
)
{
v
=
*
samples
++
;
dst
[
0
]
=
linear_to_ulaw
[(
v
+
32768
)
>>
2
];
dst
++
;
}
break
;
default:
return
-
1
;
}
return
dst
-
frame
;
}
typedef
struct
PCMDecode
{
short
table
[
256
];
}
PCMDecode
;
static
int
decode_init
(
AVCodecContext
*
avctx
)
{
PCMDecode
*
s
=
avctx
->
priv_data
;
int
i
;
switch
(
avctx
->
codec
->
id
)
{
case
CODEC_ID_PCM_ALAW
:
for
(
i
=
0
;
i
<
256
;
i
++
)
s
->
table
[
i
]
=
alaw2linear
(
i
);
break
;
case
CODEC_ID_PCM_MULAW
:
for
(
i
=
0
;
i
<
256
;
i
++
)
s
->
table
[
i
]
=
ulaw2linear
(
i
);
break
;
default:
break
;
}
return
0
;
}
static
int
decode_frame
(
AVCodecContext
*
avctx
,
void
*
data
,
int
*
data_size
,
UINT8
*
buf
,
int
buf_size
)
{
PCMDecode
*
s
=
avctx
->
priv_data
;
int
n
;
short
*
samples
;
UINT8
*
src
;
samples
=
data
;
src
=
buf
;
switch
(
avctx
->
codec
->
id
)
{
case
CODEC_ID_PCM_S16LE
:
n
=
buf_size
>>
1
;
for
(;
n
>
0
;
n
--
)
{
*
samples
++
=
src
[
0
]
|
(
src
[
1
]
<<
8
);
src
+=
2
;
}
break
;
case
CODEC_ID_PCM_S16BE
:
n
=
buf_size
>>
1
;
for
(;
n
>
0
;
n
--
)
{
*
samples
++
=
(
src
[
0
]
<<
8
)
|
src
[
1
];
src
+=
2
;
}
break
;
case
CODEC_ID_PCM_U16LE
:
n
=
buf_size
>>
1
;
for
(;
n
>
0
;
n
--
)
{
*
samples
++
=
(
src
[
0
]
|
(
src
[
1
]
<<
8
))
-
0x8000
;
src
+=
2
;
}
break
;
case
CODEC_ID_PCM_U16BE
:
n
=
buf_size
>>
1
;
for
(;
n
>
0
;
n
--
)
{
*
samples
++
=
((
src
[
0
]
<<
8
)
|
src
[
1
])
-
0x8000
;
src
+=
2
;
}
break
;
case
CODEC_ID_PCM_S8
:
n
=
buf_size
;
for
(;
n
>
0
;
n
--
)
{
*
samples
++
=
src
[
0
]
<<
8
;
src
++
;
}
break
;
case
CODEC_ID_PCM_U8
:
n
=
buf_size
;
for
(;
n
>
0
;
n
--
)
{
*
samples
++
=
((
int
)
src
[
0
]
-
128
)
<<
8
;
src
++
;
}
break
;
case
CODEC_ID_PCM_ALAW
:
case
CODEC_ID_PCM_MULAW
:
n
=
buf_size
;
for
(;
n
>
0
;
n
--
)
{
*
samples
++
=
s
->
table
[
src
[
0
]];
src
++
;
}
break
;
default:
*
data_size
=
0
;
return
-
1
;
}
*
data_size
=
(
UINT8
*
)
samples
-
(
UINT8
*
)
data
;
return
src
-
buf
;
}
#define PCM_CODEC(id, name) \
AVCodec name ## _encoder = { \
#name, \
CODEC_TYPE_AUDIO, \
id, \
0, \
encode_init, \
encode_frame, \
encode_close, \
NULL, \
}; \
AVCodec name ## _decoder = { \
#name, \
CODEC_TYPE_AUDIO, \
id, \
sizeof(PCMDecode), \
decode_init, \
NULL, \
NULL, \
decode_frame, \
};
PCM_CODEC
(
CODEC_ID_PCM_S16LE
,
pcm_s16le
);
PCM_CODEC
(
CODEC_ID_PCM_S16BE
,
pcm_s16be
);
PCM_CODEC
(
CODEC_ID_PCM_U16LE
,
pcm_u16le
);
PCM_CODEC
(
CODEC_ID_PCM_U16BE
,
pcm_u16be
);
PCM_CODEC
(
CODEC_ID_PCM_S8
,
pcm_s8
);
PCM_CODEC
(
CODEC_ID_PCM_U8
,
pcm_u8
);
PCM_CODEC
(
CODEC_ID_PCM_ALAW
,
pcm_alaw
);
PCM_CODEC
(
CODEC_ID_PCM_MULAW
,
pcm_mulaw
);
libavcodec/utils.c
浏览文件 @
a96b68b7
...
...
@@ -205,6 +205,7 @@ void avcodec_string(char *buf, int buf_size, AVCodecContext *enc, int encode)
const
char
*
codec_name
;
AVCodec
*
p
;
char
buf1
[
32
];
int
bitrate
;
if
(
encode
)
p
=
avcodec_find_encoder
(
enc
->
codec_id
);
...
...
@@ -245,6 +246,7 @@ void avcodec_string(char *buf, int buf_size, AVCodecContext *enc, int encode)
enc
->
width
,
enc
->
height
,
(
float
)
enc
->
frame_rate
/
FRAME_RATE_BASE
);
}
bitrate
=
enc
->
bit_rate
;
break
;
case
CODEC_TYPE_AUDIO
:
snprintf
(
buf
,
buf_size
,
...
...
@@ -256,13 +258,31 @@ void avcodec_string(char *buf, int buf_size, AVCodecContext *enc, int encode)
enc
->
sample_rate
,
enc
->
channels
==
2
?
"stereo"
:
"mono"
);
}
/* for PCM codecs, compute bitrate directly */
switch
(
enc
->
codec_id
)
{
case
CODEC_ID_PCM_S16LE
:
case
CODEC_ID_PCM_S16BE
:
case
CODEC_ID_PCM_U16LE
:
case
CODEC_ID_PCM_U16BE
:
bitrate
=
enc
->
sample_rate
*
16
;
break
;
case
CODEC_ID_PCM_S8
:
case
CODEC_ID_PCM_U8
:
case
CODEC_ID_PCM_ALAW
:
case
CODEC_ID_PCM_MULAW
:
bitrate
=
enc
->
sample_rate
*
8
;
break
;
default:
bitrate
=
enc
->
bit_rate
;
break
;
}
break
;
default:
abort
();
}
if
(
enc
->
bit_
rate
!=
0
)
{
if
(
bit
rate
!=
0
)
{
snprintf
(
buf
+
strlen
(
buf
),
buf_size
-
strlen
(
buf
),
", %d kb/s"
,
enc
->
bit_
rate
/
1000
);
", %d kb/s"
,
bit
rate
/
1000
);
}
}
...
...
@@ -370,7 +390,6 @@ void avcodec_register_all(void)
register_avcodec
(
&
mpeg4_encoder
);
register_avcodec
(
&
msmpeg4_encoder
);
#endif
/* CONFIG_ENCODERS */
register_avcodec
(
&
pcm_codec
);
register_avcodec
(
&
rawvideo_codec
);
/* decoders */
...
...
@@ -382,13 +401,28 @@ void avcodec_register_all(void)
register_avcodec
(
&
h263i_decoder
);
register_avcodec
(
&
rv10_decoder
);
register_avcodec
(
&
mjpeg_decoder
);
//#ifdef CONFIG_MPGLIB
register_avcodec
(
&
mp3_decoder
);
//#endif
#ifdef CONFIG_AC3
register_avcodec
(
&
ac3_decoder
);
#endif
#endif
/* CONFIG_DECODERS */
/* pcm codecs */
#define PCM_CODEC(id, name) \
register_avcodec(& name ## _encoder); \
register_avcodec(& name ## _decoder); \
PCM_CODEC
(
CODEC_ID_PCM_S16LE
,
pcm_s16le
);
PCM_CODEC
(
CODEC_ID_PCM_S16BE
,
pcm_s16be
);
PCM_CODEC
(
CODEC_ID_PCM_U16LE
,
pcm_u16le
);
PCM_CODEC
(
CODEC_ID_PCM_U16BE
,
pcm_u16be
);
PCM_CODEC
(
CODEC_ID_PCM_S8
,
pcm_s8
);
PCM_CODEC
(
CODEC_ID_PCM_U8
,
pcm_u8
);
PCM_CODEC
(
CODEC_ID_PCM_ALAW
,
pcm_alaw
);
PCM_CODEC
(
CODEC_ID_PCM_MULAW
,
pcm_mulaw
);
#undef PCM_CODEC
}
static
int
encode_init
(
AVCodecContext
*
s
)
...
...
@@ -409,18 +443,6 @@ static int encode_frame(AVCodecContext *avctx,
return
-
1
;
}
/* dummy pcm codec */
AVCodec
pcm_codec
=
{
"pcm"
,
CODEC_TYPE_AUDIO
,
CODEC_ID_PCM
,
0
,
encode_init
,
encode_frame
,
NULL
,
decode_frame
,
};
AVCodec
rawvideo_codec
=
{
"rawvideo"
,
CODEC_TYPE_VIDEO
,
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录