39#define FREEZE_INTERVAL 128
43#define MAX_FRAME_SIZE 32768
54 for (
i = 0;
i < 2;
i++) {
66 c->band[0].scale_factor = 8;
67 c->band[1].scale_factor = 2;
68 c->prev_samples_pos = 22;
83 "allowed. Using %d instead of %d\n", new_frame_size,
99 "allowed. Using %d instead of %d\n", new_trellis,
104 int frontier = 1 << avctx->
trellis;
107 for (
int i = 0;
i < 2;
i++) {
109 c->node_buf[
i] =
av_calloc(frontier, 2 *
sizeof(**
c->node_buf));
110 c->nodep_buf[
i] =
av_calloc(frontier, 2 *
sizeof(**
c->nodep_buf));
111 if (!
c->paths[
i] || !
c->node_buf[
i] || !
c->nodep_buf[
i])
123 35, 72, 110, 150, 190, 233, 276, 323,
124 370, 422, 473, 530, 587, 650, 714, 786,
125 858, 940, 1023, 1121, 1219, 1339, 1458, 1612,
126 1765, 1980, 2195, 2557, 2919
130 int *xlow,
int *xhigh)
133 c->prev_samples[
c->prev_samples_pos++] = samples[0];
134 c->prev_samples[
c->prev_samples_pos++] = samples[1];
135 c->dsp.apply_qmf(
c->prev_samples +
c->prev_samples_pos - 24, xout);
136 *xlow = xout[0] + xout[1] >> 14;
137 *xhigh = xout[0] - xout[1] >> 14;
139 memmove(
c->prev_samples,
140 c->prev_samples +
c->prev_samples_pos - 22,
141 22 *
sizeof(
c->prev_samples[0]));
142 c->prev_samples_pos = 22;
149 int pred = 141 *
state->scale_factor >> 8;
165 return (
diff < 0 ? (
i < 2 ? 63 : 33) : 61) -
i;
169 uint8_t *
dst,
int nb_samples,
170 const int16_t *samples)
173 int frontier = 1 << trellis;
176 int pathn[2] = {0, 0}, froze = -1;
179 for (
i = 0;
i < 2;
i++) {
180 nodes[
i] =
c->nodep_buf[
i];
181 nodes_next[
i] =
c->nodep_buf[
i] + frontier;
182 memset(
c->nodep_buf[
i], 0, 2 * frontier *
sizeof(*
c->nodep_buf[
i]));
183 nodes[
i][0] =
c->node_buf[
i] + frontier;
184 nodes[
i][0]->
ssd = 0;
185 nodes[
i][0]->
path = 0;
186 nodes[
i][0]->state =
c->band[
i];
192 int heap_pos[2] = {0, 0};
194 for (j = 0; j < 2; j++) {
195 next[j] =
c->node_buf[j] + frontier*(
i & 1);
196 memset(nodes_next[j], 0, frontier *
sizeof(**nodes_next));
201 for (j = 0; j < frontier && nodes[0][j]; j++) {
207 int range = j < frontier/2 ? 4 : 0;
210 int ilow =
encode_low(&cur_node->state, xlow);
212 for (k = ilow -
range; k <= ilow +
range && k <= 63; k += 4) {
213 int decoded, dec_diff,
pos;
222 + cur_node->state.s_predictor, 14);
223 dec_diff = xlow - decoded;
225#define STORE_NODE(index, UPDATE, VALUE)\
226 ssd = cur_node->ssd + dec_diff*dec_diff;\
229 if (ssd < cur_node->ssd)\
231 if (heap_pos[index] < frontier) {\
232 pos = heap_pos[index]++;\
233 av_assert2(pathn[index] < FREEZE_INTERVAL * frontier);\
234 node = nodes_next[index][pos] = next[index]++;\
235 node->path = pathn[index]++;\
239 pos = (frontier>>1) + (heap_pos[index] & ((frontier>>1) - 1));\
240 if (ssd >= nodes_next[index][pos]->ssd)\
243 node = nodes_next[index][pos];\
246 node->state = cur_node->state;\
248 c->paths[index][node->path].value = VALUE;\
249 c->paths[index][node->path].prev = cur_node->path;\
253 int parent = (pos - 1) >> 1;\
254 if (nodes_next[index][parent]->ssd <= ssd)\
256 FFSWAP(struct TrellisNode*, nodes_next[index][parent],\
257 nodes_next[index][pos]);\
264 for (j = 0; j < frontier && nodes[1][j]; j++) {
272 for (ihigh = 0; ihigh < 4; ihigh++) {
273 int dhigh, decoded, dec_diff,
pos;
277 dhigh = cur_node->state.scale_factor *
279 decoded =
av_clip_intp2(dhigh + cur_node->state.s_predictor, 14);
280 dec_diff = xhigh - decoded;
286 for (j = 0; j < 2; j++) {
289 if (nodes[j][0]->
ssd > (1 << 16)) {
290 for (k = 1; k < frontier && nodes[j][k]; k++)
291 nodes[j][k]->
ssd -= nodes[j][0]->
ssd;
292 nodes[j][0]->ssd = 0;
297 p[0] = &
c->paths[0][nodes[0][0]->path];
298 p[1] = &
c->paths[1][nodes[1][0]->path];
299 for (j =
i; j > froze; j--) {
300 dst[j] = p[1]->value << 6 | p[0]->value;
301 p[0] = &
c->paths[0][p[0]->prev];
302 p[1] = &
c->paths[1][p[1]->prev];
305 pathn[0] = pathn[1] = 0;
306 memset(nodes[0] + 1, 0, (frontier - 1)*
sizeof(**nodes));
307 memset(nodes[1] + 1, 0, (frontier - 1)*
sizeof(**nodes));
311 p[0] = &
c->paths[0][nodes[0][0]->
path];
312 p[1] = &
c->paths[1][nodes[1][0]->
path];
313 for (j =
i; j > froze; j--) {
314 dst[j] = p[1]->value << 6 | p[0]->value;
315 p[0] = &
c->paths[0][p[0]->prev];
316 p[1] = &
c->paths[1][p[1]->prev];
318 c->band[0] = nodes[0][0]->state;
319 c->band[1] = nodes[1][0]->state;
323 const int16_t *samples)
325 int xlow, xhigh, ilow, ihigh;
336 uint8_t *
dst,
int nb_samples,
337 const int16_t *samples)
340 for (
i = 0;
i < nb_samples;
i += 2)
348 const int16_t *samples = (
const int16_t *)
frame->data[0];
355 nb_samples =
frame->nb_samples - (
frame->nb_samples & 1);
363 if (nb_samples < frame->nb_samples) {
364 int16_t last_samples[2] = { samples[nb_samples], samples[nb_samples] };
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
const FFCodec ff_adpcm_g722_encoder
static av_cold void close(AVCodecParserContext *s)
simple assert() macros that are a bit more flexible than ISO C assert().
Libavcodec external API header.
#define i(width, name, range_min, range_max)
Public libavutil channel layout APIs header.
#define CODEC_CH_LAYOUTS(...)
#define FF_CODEC_ENCODE_CB(func)
#define CODEC_LONG_NAME(str)
#define FF_CODEC_CAP_INIT_CLEANUP
The codec allows calling the close function for deallocation even if the init function returned a fai...
#define CODEC_SAMPLEFMTS(...)
common internal and external API header
int(* init)(AVBSFContext *ctx)
int ff_get_encode_buffer(AVCodecContext *avctx, AVPacket *avpkt, int64_t size, int flags)
Get a buffer for a packet.
static av_always_inline int64_t ff_samples_to_time_base(const AVCodecContext *avctx, int64_t samples)
Rescale from sample rate to AVCodecContext.time_base.
static struct @346255127015250356166251341105367306144006377143 state
#define PREV_SAMPLES_BUF_SIZE
static int encode_low(const struct G722Band *state, int xlow)
static void filter_samples(G722Context *c, const int16_t *samples, int *xlow, int *xhigh)
static av_cold int g722_encode_init(AVCodecContext *avctx)
static int g722_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, const AVFrame *frame, int *got_packet_ptr)
static void g722_encode_no_trellis(G722Context *c, uint8_t *dst, int nb_samples, const int16_t *samples)
static int encode_high(const struct G722Band *state, int xhigh)
#define STORE_NODE(index, UPDATE, VALUE)
static av_always_inline void encode_byte(G722Context *c, uint8_t *dst, const int16_t *samples)
static av_cold int g722_encode_close(AVCodecContext *avctx)
static const int16_t low_quant[33]
static void g722_encode_trellis(G722Context *c, int trellis, uint8_t *dst, int nb_samples, const int16_t *samples)
#define AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE
This encoder can reorder user opaque values from input AVFrames and return them with corresponding ou...
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
#define AV_CODEC_CAP_SMALL_LAST_FRAME
Codec can be fed a final frame with a smaller size.
#define AV_CHANNEL_LAYOUT_MONO
#define AV_LOG_WARNING
Something somehow does not look correct.
@ AV_SAMPLE_FMT_S16
signed 16 bits
#define AV_NOPTS_VALUE
Undefined timestamp value.
const int16_t ff_g722_low_inv_quant6[64]
void ff_g722_update_high_predictor(struct G722Band *band, const int dhigh, const int ihigh)
const int16_t ff_g722_high_inv_quant[4]
void ff_g722_update_low_predictor(struct G722Band *band, const int ilow)
av_cold void ff_g722dsp_init(G722DSPContext *c)
#define FFSWAP(type, a, b)
void * av_calloc(size_t nmemb, size_t size)
Memory handling functions.
static const float pred[4]
main external API structure.
int trellis
trellis RD quantization
int initial_padding
Audio only.
int frame_size
Number of samples per channel in an audio frame.
This structure describes decoded (raw) audio or video data.
This structure stores compressed data.
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
static av_always_inline int diff(const struct color_info *a, const struct color_info *b, const int trans_thresh)
static double limit(double x)