分类:
2015-11-17 11:09:38
原文地址:MP3解码算法分析(6)——帧解码器接口定义与选择 作者:gliethttp
:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://kware.blogbus.com/logs/30741670.html
1. 帧解码器接口的定义
帧解码器负责实施解码一个 MPEG 音频帧
回顾:当前该接口太薄,应该增加诸如说明输出缓冲、合成过滤以及其他可能的解码器对象等方法。
public interface FrameDecoder {
// 解码一帧 MPEG 音频
public void decodeFrame();
}
2. MP3 分层帧解码器的选择
protected FrameDecoder retrieveDecoder(Header header, Bitstream stream, int layer)
throws DecoderException {
FrameDecoder decoder = null; // 帧解码器变量
// 评论:允许通道输出选择类型(LEFT, RIGHT, BOTH, DOWNMIX)
switch (layer) { // 每帧的层号不同,帧解码器就不同
case 3: // 对层 Layer III
if (l3decoder==null) { // 如果L3层帧解码器没创建,
l3decoder = new LayerIIIDecoder(stream, // 就创建它
header, filter1, filter2, // 把流、头、过滤器、输出池、需要的通道数传给它
output, OutputChannels.BOTH_CHANNELS);
}
decoder = l3decoder; break; // 当前帧解码器就是它;退出;
case 2:
if (l2decoder==null) { // 如果L2层帧解码器没创建,
l2decoder = new LayerIIDecoder(); // 就创建它
l2decoder.create(stream, header, filter1, filter2, output, OutputChannels.BOTH_CHANNELS);
}
decoder = l2decoder; break; // 当前帧解码器就是它;退出;
case 1:
if (l1decoder==null) { // 如果L1层帧解码器没创建,
l1decoder = new LayerIDecoder(); // 就创建它
l1decoder.create(stream, header, filter1, filter2, output, OutputChannels.BOTH_CHANNELS);
}
decoder = l1decoder; break; // 当前帧解码器就是它;退出;
}
if (decoder==null) // 如果当前帧解码器没选上;抛出异常;
throw newDecoderException(UNSUPPORTED_LAYER, null);
return decoder; // 返回选择的帧解码器;
}