PCM转PCMA(pcm_alaw,G711.A率)转换表 && PCM转PCMU(pcm_ulaw,G711.U率)转换表
文章目录
- [PCM转PCMA(pcm_alaw,G711.A率)转换表 && PCM转PCMU(pcm_ulaw,G711.U率)转换表](#PCM转PCMA(pcm_alaw,G711.A率)转换表 && PCM转PCMU(pcm_ulaw,G711.U率)转换表)
ffmpeg源码生成转码表
最近要做一个功能,int16_t的PCM数据转为uint8的PCMA数据,
网上的不太可信,找ffmpeg库,发现ffmpeg库使用的是查表发实现的,
而且还有现成的生成表数据的源代码,可信度非常高
c
/*
* Generate a header file for hardcoded PCM tables
*
* Copyright (c) 2010 Reimar Döffinger <Reimar.Doeffinger@gmx.de>
*
* This file is part of FFmpeg.
*
* FFmpeg is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* FFmpeg 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with FFmpeg; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <stdlib.h>
#define CONFIG_HARDCODED_TABLES 0
#include "pcm_tablegen.h"
#include "tableprint.h"
int main(void)
{
pcm_alaw_tableinit();
pcm_ulaw_tableinit();
pcm_vidc_tableinit();
write_fileheader();
WRITE_ARRAY("static const", uint8_t, linear_to_alaw);
WRITE_ARRAY("static const", uint8_t, linear_to_ulaw);
WRITE_ARRAY("static const", uint8_t, linear_to_vidc);
return 0;
}
编译上有些小问题,没太关注,直接使用了注释大法,
没有用的统统干掉,编译通过,执行生成转换映射表。
不用再去研究转换公式,直接对照着表查询结果即可。
拿走不谢
使用方式
可参照ffmpeg源代码pcm.c使用
c
case AV_CODEC_ID_PCM_ALAW:
for (; n > 0; n--) {
v = *samples++;
*dst++ = linear_to_alaw[(v + 32768) >> 2];
}
break;
case AV_CODEC_ID_PCM_MULAW:
for (; n > 0; n--) {
v = *samples++;
*dst++ = linear_to_ulaw[(v + 32768) >> 2];
}
break;
PCM有符号,加上32768变成正数除以4查表即可。
生成源码
表数据太大,CSDN不让保存,放到我个人服务器上了(大神手下留情不要攻击)。
http://118.126.97.61:8084/src_libs/ffmpeg_pcm_table/