static int decode_tag(AVCodecContext *avctx, void *data, int *got_frame_ptr, AVPacket *avpkt) { const uint8_t *buf = avpkt->data; const uint8_t *side=av_packet_get_side_data(avpkt, 'F', NULL); int buf_size = avpkt->size; NellyMoserDecodeContext *s = avctx->priv_data; int blocks, i, ret; int16_t *samples_s16; float *samples_flt; blocks = buf_size / NELLY_BLOCK_LEN; if (blocks <= 0) { av_log(avctx, AV_LOG_ERROR, "Packet is too small\n"); return AVERROR_INVALIDDATA; } if (buf_size % NELLY_BLOCK_LEN) { av_log(avctx, AV_LOG_WARNING, "Leftover bytes: %d.\n", buf_size % NELLY_BLOCK_LEN); } /* Normal numbers of blocks for sample rates: * 8000 Hz - 1 * 11025 Hz - 2 * 16000 Hz - 3 * 22050 Hz - 4 * 44100 Hz - 8 */ if(side && blocks>1 && avctx->sample_rate%11025==0 && (1<<((side[0]>>2)&3)) == blocks) avctx->sample_rate= 11025*(blocks/2); /* get output buffer */ s->frame.nb_samples = NELLY_SAMPLES * blocks; if ((ret = avctx->get_buffer(avctx, &s->frame)) < 0) { av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); return ret; } samples_s16 = (int16_t *)s->frame.data[0]; samples_flt = (float *)s->frame.data[0]; for (i=0 ; i<blocks ; i++) { if (avctx->sample_fmt == SAMPLE_FMT_FLT) { nelly_decode_block(s, buf, samples_flt); samples_flt += NELLY_SAMPLES; } else { nelly_decode_block(s, buf, s->float_buf); s->fmt_conv.float_to_int16(samples_s16, s->float_buf, NELLY_SAMPLES); samples_s16 += NELLY_SAMPLES; } buf += NELLY_BLOCK_LEN; } *got_frame_ptr = 1; *(AVFrame *)data = s->frame; return buf_size; }
static int decode_tag(AVCodecContext * avctx, void *data, int *data_size, AVPacket *avpkt) { const uint8_t *buf = avpkt->data; const uint8_t *side=av_packet_get_side_data(avpkt, 'F', NULL); int buf_size = avpkt->size; NellyMoserDecodeContext *s = avctx->priv_data; int data_max = *data_size; int blocks, i, block_size; int16_t *samples_s16 = data; float *samples_flt = data; *data_size = 0; block_size = NELLY_SAMPLES * av_get_bytes_per_sample(avctx->sample_fmt); blocks = buf_size / NELLY_BLOCK_LEN; if (blocks <= 0) { av_log(avctx, AV_LOG_ERROR, "Packet is too small\n"); return AVERROR_INVALIDDATA; } if (data_max < blocks * block_size) { av_log(avctx, AV_LOG_ERROR, "Output buffer is too small\n"); return AVERROR(EINVAL); } if (buf_size % NELLY_BLOCK_LEN) { av_log(avctx, AV_LOG_WARNING, "Leftover bytes: %d.\n", buf_size % NELLY_BLOCK_LEN); } /* Normal numbers of blocks for sample rates: * 8000 Hz - 1 * 11025 Hz - 2 * 16000 Hz - 3 * 22050 Hz - 4 * 44100 Hz - 8 */ if(side && blocks>1 && avctx->sample_rate%11025==0 && (1<<((side[0]>>2)&3)) == blocks) avctx->sample_rate= 11025*(blocks/2); for (i=0 ; i<blocks ; i++) { if (avctx->sample_fmt == SAMPLE_FMT_FLT) { nelly_decode_block(s, buf, samples_flt); samples_flt += NELLY_SAMPLES; } else { nelly_decode_block(s, buf, s->float_buf); s->fmt_conv.float_to_int16(samples_s16, s->float_buf, NELLY_SAMPLES); samples_s16 += NELLY_SAMPLES; } buf += NELLY_BLOCK_LEN; } *data_size = blocks * block_size; return buf_size; }
static int decode_tag(AVCodecContext * avctx, void *data, int *data_size, AVPacket *avpkt) { const uint8_t *buf = avpkt->data; int buf_size = avpkt->size; NellyMoserDecodeContext *s = avctx->priv_data; int data_max = *data_size; int blocks, i, block_size; int16_t *samples_s16 = data; float *samples_flt = data; *data_size = 0; if (buf_size < avctx->block_align) { return buf_size; } if (buf_size % NELLY_BLOCK_LEN) { av_log(avctx, AV_LOG_ERROR, "Tag size %d.\n", buf_size); return buf_size; } block_size = NELLY_SAMPLES * av_get_bytes_per_sample(avctx->sample_fmt); blocks = FFMIN(buf_size / NELLY_BLOCK_LEN, data_max / block_size); if (blocks <= 0) { av_log(avctx, AV_LOG_ERROR, "Output buffer is too small\n"); return AVERROR(EINVAL); } /* Normal numbers of blocks for sample rates: * 8000 Hz - 1 * 11025 Hz - 2 * 16000 Hz - 3 * 22050 Hz - 4 * 44100 Hz - 8 */ for (i=0 ; i<blocks ; i++) { if (avctx->sample_fmt == SAMPLE_FMT_FLT) { nelly_decode_block(s, buf, samples_flt); samples_flt += NELLY_SAMPLES; } else { nelly_decode_block(s, buf, s->float_buf); s->fmt_conv.float_to_int16(samples_s16, s->float_buf, NELLY_SAMPLES); samples_s16 += NELLY_SAMPLES; } buf += NELLY_BLOCK_LEN; } *data_size = blocks * block_size; return buf_size; }
static int decode_tag(AVCodecContext * avctx, void *data, int *data_size, const uint8_t * buf, int buf_size) { NellyMoserDecodeContext *s = avctx->priv_data; int blocks, i; int16_t* samples; *data_size = 0; samples = (int16_t*)data; if (buf_size < avctx->block_align) return buf_size; switch (buf_size) { case 64: // 8000Hz blocks = 1; break; case 128: // 11025Hz blocks = 2; break; case 256: // 22050Hz blocks = 4; break; case 512: // 44100Hz blocks = 8; break; default: av_log(avctx, AV_LOG_DEBUG, "Tag size %d.\n", buf_size); return buf_size; } for (i=0 ; i<blocks ; i++) { nelly_decode_block(s, &buf[i*NELLY_BLOCK_LEN], s->float_buf); s->dsp.float_to_int16(&samples[i*NELLY_SAMPLES], s->float_buf, NELLY_SAMPLES); *data_size += NELLY_SAMPLES*sizeof(int16_t); } return buf_size; }
static int decode_tag(AVCodecContext * avctx, void *data, int *data_size, AVPacket *avpkt) { const uint8_t *buf = avpkt->data; int buf_size = avpkt->size; NellyMoserDecodeContext *s = avctx->priv_data; int blocks, i; int16_t* samples; *data_size = 0; samples = (int16_t*)data; if (buf_size < avctx->block_align) return buf_size; if (buf_size % 64) { av_log(avctx, AV_LOG_ERROR, "Tag size %d.\n", buf_size); return buf_size; } blocks = buf_size / 64; /* Normal numbers of blocks for sample rates: * 8000 Hz - 1 * 11025 Hz - 2 * 16000 Hz - 3 * 22050 Hz - 4 * 44100 Hz - 8 */ for (i=0 ; i<blocks ; i++) { nelly_decode_block(s, &buf[i*NELLY_BLOCK_LEN], s->float_buf); s->dsp.float_to_int16(&samples[i*NELLY_SAMPLES], s->float_buf, NELLY_SAMPLES); *data_size += NELLY_SAMPLES*sizeof(int16_t); } return buf_size; }
static int decode_tag(AVCodecContext *avctx, void *data, int *got_frame_ptr, AVPacket *avpkt) { AVFrame *frame = data; const uint8_t *buf = avpkt->data; const uint8_t *side=av_packet_get_side_data(avpkt, 'F', NULL); int buf_size = avpkt->size; NellyMoserDecodeContext *s = avctx->priv_data; int blocks, i, ret; float *samples_flt; blocks = buf_size / NELLY_BLOCK_LEN; if (blocks <= 0) { av_log(avctx, AV_LOG_ERROR, "Packet is too small\n"); return AVERROR_INVALIDDATA; } if (buf_size % NELLY_BLOCK_LEN) { av_log(avctx, AV_LOG_WARNING, "Leftover bytes: %d.\n", buf_size % NELLY_BLOCK_LEN); } /* Normal numbers of blocks for sample rates: * 8000 Hz - 1 * 11025 Hz - 2 * 16000 Hz - 3 * 22050 Hz - 4 * 44100 Hz - 8 */ if(side && blocks>1 && avctx->sample_rate%11025==0 && (1<<((side[0]>>2)&3)) == blocks) avctx->sample_rate= 11025*(blocks/2); /* get output buffer */ frame->nb_samples = NELLY_SAMPLES * blocks; if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) return ret; samples_flt = (float *)frame->data[0]; for (i=0 ; i<blocks ; i++) { nelly_decode_block(s, buf, samples_flt); samples_flt += NELLY_SAMPLES; buf += NELLY_BLOCK_LEN; } *got_frame_ptr = 1; return buf_size; }