Go to the documentation of this file.
39 #define FREEZE_INTERVAL 128
43 #define MAX_FRAME_SIZE 32768
48 #define MAX_TRELLIS 16
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,
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];
189 for (
i = 0; i < nb_samples >> 1;
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;
325 int xlow, xhigh, ilow, ihigh;
332 *dst = ihigh << 6 | ilow;
336 uint8_t *dst,
int nb_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] };
385 #if FF_API_OLD_CHANNEL_LAYOUT
int frame_size
Number of samples per channel in an audio frame.
#define AV_LOG_WARNING
Something somehow does not look correct.
#define FF_CODEC_CAP_INIT_CLEANUP
The codec allows calling the close function for deallocation even if the init function returned a fai...
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
#define PREV_SAMPLES_BUF_SIZE
#define AV_CH_LAYOUT_MONO
This structure describes decoded (raw) audio or video data.
#define AV_CHANNEL_LAYOUT_MONO
const FFCodec ff_adpcm_g722_encoder
static int encode_high(const struct G722Band *state, int xhigh)
static void filter_samples(G722Context *c, const int16_t *samples, int *xlow, int *xhigh)
static av_cold int g722_encode_init(AVCodecContext *avctx)
AVCodec p
The public AVCodec.
static void g722_encode_no_trellis(G722Context *c, uint8_t *dst, int nb_samples, const int16_t *samples)
const int16_t ff_g722_low_inv_quant6[64]
int initial_padding
Audio only.
#define FF_CODEC_ENCODE_CB(func)
static av_always_inline int64_t ff_samples_to_time_base(AVCodecContext *avctx, int64_t samples)
Rescale from sample rate to AVCodecContext.time_base.
const int16_t ff_g722_high_inv_quant[4]
void ff_g722_update_high_predictor(struct G722Band *band, const int dhigh, const int ihigh)
static void g722_encode_trellis(G722Context *c, int trellis, uint8_t *dst, int nb_samples, const int16_t *samples)
static av_cold int g722_encode_close(AVCodecContext *avctx)
int trellis
trellis RD quantization
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
An AVChannelLayout holds information about the channel layout of audio data.
static const int16_t low_quant[33]
#define AV_NOPTS_VALUE
Undefined timestamp value.
static int encode_low(const struct G722Band *state, int xlow)
#define i(width, name, range_min, range_max)
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
AVSampleFormat
Audio sample formats.
#define FF_CODEC_CAP_INIT_THREADSAFE
The codec does not modify any global variables in the init function, allowing to call the init functi...
@ AV_SAMPLE_FMT_S16
signed 16 bits
const char * name
Name of the codec implementation.
void * av_calloc(size_t nmemb, size_t size)
static double limit(double x)
static const float pred[4]
#define FFSWAP(type, a, b)
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several the filter must be ready for frames arriving randomly on any input any filter with several inputs will most likely require some kind of queuing mechanism It is perfectly acceptable to have a limited queue and to drop frames when the inputs are too unbalanced request_frame For filters that do not use the this method is called when a frame is wanted on an output For a it should directly call filter_frame on the corresponding output For a if there are queued frames already one of these frames should be pushed If the filter should request a frame on one of its repeatedly until at least one frame has been pushed Return or at least make progress towards producing a frame
main external API structure.
#define STORE_NODE(index, UPDATE, VALUE)
int ff_get_encode_buffer(AVCodecContext *avctx, AVPacket *avpkt, int64_t size, int flags)
Get a buffer for a packet.
Filter the word “frame” indicates either a video frame or a group of audio samples
static int g722_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, const AVFrame *frame, int *got_packet_ptr)
static av_always_inline int diff(const uint32_t a, const uint32_t b)
This structure stores compressed data.
void ff_g722_update_low_predictor(struct G722Band *band, const int ilow)
av_cold void ff_g722dsp_init(G722DSPContext *c)
#define AV_CODEC_CAP_SMALL_LAST_FRAME
Codec can be fed a final frame with a smaller size.
static av_always_inline void encode_byte(G722Context *c, uint8_t *dst, const int16_t *samples)