yading@10
|
1 /*
|
yading@10
|
2 * Real Audio 1.0 (14.4K)
|
yading@10
|
3 *
|
yading@10
|
4 * Copyright (c) 2008 Vitor Sessak
|
yading@10
|
5 * Copyright (c) 2003 Nick Kurshev
|
yading@10
|
6 * Based on public domain decoder at http://www.honeypot.net/audio
|
yading@10
|
7 *
|
yading@10
|
8 * This file is part of FFmpeg.
|
yading@10
|
9 *
|
yading@10
|
10 * FFmpeg is free software; you can redistribute it and/or
|
yading@10
|
11 * modify it under the terms of the GNU Lesser General Public
|
yading@10
|
12 * License as published by the Free Software Foundation; either
|
yading@10
|
13 * version 2.1 of the License, or (at your option) any later version.
|
yading@10
|
14 *
|
yading@10
|
15 * FFmpeg is distributed in the hope that it will be useful,
|
yading@10
|
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
yading@10
|
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
yading@10
|
18 * Lesser General Public License for more details.
|
yading@10
|
19 *
|
yading@10
|
20 * You should have received a copy of the GNU Lesser General Public
|
yading@10
|
21 * License along with FFmpeg; if not, write to the Free Software
|
yading@10
|
22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
yading@10
|
23 */
|
yading@10
|
24
|
yading@10
|
25 #include "libavutil/channel_layout.h"
|
yading@10
|
26 #include "avcodec.h"
|
yading@10
|
27 #include "get_bits.h"
|
yading@10
|
28 #include "internal.h"
|
yading@10
|
29 #include "ra144.h"
|
yading@10
|
30
|
yading@10
|
31
|
yading@10
|
32 static av_cold int ra144_decode_init(AVCodecContext * avctx)
|
yading@10
|
33 {
|
yading@10
|
34 RA144Context *ractx = avctx->priv_data;
|
yading@10
|
35
|
yading@10
|
36 ractx->avctx = avctx;
|
yading@10
|
37
|
yading@10
|
38 ractx->lpc_coef[0] = ractx->lpc_tables[0];
|
yading@10
|
39 ractx->lpc_coef[1] = ractx->lpc_tables[1];
|
yading@10
|
40
|
yading@10
|
41 avctx->channels = 1;
|
yading@10
|
42 avctx->channel_layout = AV_CH_LAYOUT_MONO;
|
yading@10
|
43 avctx->sample_fmt = AV_SAMPLE_FMT_S16;
|
yading@10
|
44
|
yading@10
|
45 return 0;
|
yading@10
|
46 }
|
yading@10
|
47
|
yading@10
|
48 static void do_output_subblock(RA144Context *ractx, const int16_t *lpc_coefs,
|
yading@10
|
49 int gval, GetBitContext *gb)
|
yading@10
|
50 {
|
yading@10
|
51 int cba_idx = get_bits(gb, 7); // index of the adaptive CB, 0 if none
|
yading@10
|
52 int gain = get_bits(gb, 8);
|
yading@10
|
53 int cb1_idx = get_bits(gb, 7);
|
yading@10
|
54 int cb2_idx = get_bits(gb, 7);
|
yading@10
|
55
|
yading@10
|
56 ff_subblock_synthesis(ractx, lpc_coefs, cba_idx, cb1_idx, cb2_idx, gval,
|
yading@10
|
57 gain);
|
yading@10
|
58 }
|
yading@10
|
59
|
yading@10
|
60 /** Uncompress one block (20 bytes -> 160*2 bytes). */
|
yading@10
|
61 static int ra144_decode_frame(AVCodecContext * avctx, void *data,
|
yading@10
|
62 int *got_frame_ptr, AVPacket *avpkt)
|
yading@10
|
63 {
|
yading@10
|
64 AVFrame *frame = data;
|
yading@10
|
65 const uint8_t *buf = avpkt->data;
|
yading@10
|
66 int buf_size = avpkt->size;
|
yading@10
|
67 static const uint8_t sizes[LPC_ORDER] = {6, 5, 5, 4, 4, 3, 3, 3, 3, 2};
|
yading@10
|
68 unsigned int refl_rms[NBLOCKS]; // RMS of the reflection coefficients
|
yading@10
|
69 int16_t block_coefs[NBLOCKS][LPC_ORDER]; // LPC coefficients of each sub-block
|
yading@10
|
70 unsigned int lpc_refl[LPC_ORDER]; // LPC reflection coefficients of the frame
|
yading@10
|
71 int i, j;
|
yading@10
|
72 int ret;
|
yading@10
|
73 int16_t *samples;
|
yading@10
|
74 unsigned int energy;
|
yading@10
|
75
|
yading@10
|
76 RA144Context *ractx = avctx->priv_data;
|
yading@10
|
77 GetBitContext gb;
|
yading@10
|
78
|
yading@10
|
79 if (buf_size < FRAMESIZE) {
|
yading@10
|
80 av_log(avctx, AV_LOG_ERROR,
|
yading@10
|
81 "Frame too small (%d bytes). Truncated file?\n", buf_size);
|
yading@10
|
82 *got_frame_ptr = 0;
|
yading@10
|
83 return AVERROR_INVALIDDATA;
|
yading@10
|
84 }
|
yading@10
|
85
|
yading@10
|
86 /* get output buffer */
|
yading@10
|
87 frame->nb_samples = NBLOCKS * BLOCKSIZE;
|
yading@10
|
88 if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
|
yading@10
|
89 return ret;
|
yading@10
|
90 samples = (int16_t *)frame->data[0];
|
yading@10
|
91
|
yading@10
|
92 init_get_bits(&gb, buf, FRAMESIZE * 8);
|
yading@10
|
93
|
yading@10
|
94 for (i = 0; i < LPC_ORDER; i++)
|
yading@10
|
95 lpc_refl[i] = ff_lpc_refl_cb[i][get_bits(&gb, sizes[i])];
|
yading@10
|
96
|
yading@10
|
97 ff_eval_coefs(ractx->lpc_coef[0], lpc_refl);
|
yading@10
|
98 ractx->lpc_refl_rms[0] = ff_rms(lpc_refl);
|
yading@10
|
99
|
yading@10
|
100 energy = ff_energy_tab[get_bits(&gb, 5)];
|
yading@10
|
101
|
yading@10
|
102 refl_rms[0] = ff_interp(ractx, block_coefs[0], 1, 1, ractx->old_energy);
|
yading@10
|
103 refl_rms[1] = ff_interp(ractx, block_coefs[1], 2,
|
yading@10
|
104 energy <= ractx->old_energy,
|
yading@10
|
105 ff_t_sqrt(energy*ractx->old_energy) >> 12);
|
yading@10
|
106 refl_rms[2] = ff_interp(ractx, block_coefs[2], 3, 0, energy);
|
yading@10
|
107 refl_rms[3] = ff_rescale_rms(ractx->lpc_refl_rms[0], energy);
|
yading@10
|
108
|
yading@10
|
109 ff_int_to_int16(block_coefs[3], ractx->lpc_coef[0]);
|
yading@10
|
110
|
yading@10
|
111 for (i=0; i < NBLOCKS; i++) {
|
yading@10
|
112 do_output_subblock(ractx, block_coefs[i], refl_rms[i], &gb);
|
yading@10
|
113
|
yading@10
|
114 for (j=0; j < BLOCKSIZE; j++)
|
yading@10
|
115 *samples++ = av_clip_int16(ractx->curr_sblock[j + 10] << 2);
|
yading@10
|
116 }
|
yading@10
|
117
|
yading@10
|
118 ractx->old_energy = energy;
|
yading@10
|
119 ractx->lpc_refl_rms[1] = ractx->lpc_refl_rms[0];
|
yading@10
|
120
|
yading@10
|
121 FFSWAP(unsigned int *, ractx->lpc_coef[0], ractx->lpc_coef[1]);
|
yading@10
|
122
|
yading@10
|
123 *got_frame_ptr = 1;
|
yading@10
|
124
|
yading@10
|
125 return FRAMESIZE;
|
yading@10
|
126 }
|
yading@10
|
127
|
yading@10
|
128 AVCodec ff_ra_144_decoder = {
|
yading@10
|
129 .name = "real_144",
|
yading@10
|
130 .type = AVMEDIA_TYPE_AUDIO,
|
yading@10
|
131 .id = AV_CODEC_ID_RA_144,
|
yading@10
|
132 .priv_data_size = sizeof(RA144Context),
|
yading@10
|
133 .init = ra144_decode_init,
|
yading@10
|
134 .decode = ra144_decode_frame,
|
yading@10
|
135 .capabilities = CODEC_CAP_DR1,
|
yading@10
|
136 .long_name = NULL_IF_CONFIG_SMALL("RealAudio 1.0 (14.4K)"),
|
yading@10
|
137 };
|