static int gsm_decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPacket *avpkt) { int res; GetBitContext gb; const uint8_t *buf = avpkt->data; int buf_size = avpkt->size; int16_t *samples = data; int frame_bytes = 2 * avctx->frame_size; if (*data_size < frame_bytes) return -1; *data_size = 0; if(buf_size < avctx->block_align) return AVERROR_INVALIDDATA; switch (avctx->codec_id) { case CODEC_ID_GSM: init_get_bits(&gb, buf, buf_size * 8); if (get_bits(&gb, 4) != 0xd) av_log(avctx, AV_LOG_WARNING, "Missing GSM magic!\n"); res = gsm_decode_block(avctx, samples, &gb); if (res < 0) return res; break; case CODEC_ID_GSM_MS: res = ff_msgsm_decode_block(avctx, samples, buf); if (res < 0) return res; } *data_size = frame_bytes; return avctx->block_align; }
static int gsm_decode_frame(AVCodecContext *avctx, void *data, int *got_frame_ptr, AVPacket *avpkt) { GSMContext *s = avctx->priv_data; int res; GetBitContext gb; const uint8_t *buf = avpkt->data; int buf_size = avpkt->size; int16_t *samples; if (buf_size < avctx->block_align) { av_log(avctx, AV_LOG_ERROR, "Packet is too small\n"); return AVERROR_INVALIDDATA; } /* get output buffer */ s->frame.nb_samples = avctx->frame_size; if ((res = avctx->get_buffer(avctx, &s->frame)) < 0) { av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); return res; } samples = (int16_t *)s->frame.data[0]; switch (avctx->codec_id) { case AV_CODEC_ID_GSM: init_get_bits(&gb, buf, buf_size * 8); if (get_bits(&gb, 4) != 0xd) av_log(avctx, AV_LOG_WARNING, "Missing GSM magic!\n"); res = gsm_decode_block(avctx, samples, &gb); if (res < 0) return res; break; case AV_CODEC_ID_GSM_MS: res = ff_msgsm_decode_block(avctx, samples, buf); if (res < 0) return res; } *got_frame_ptr = 1; *(AVFrame *)data = s->frame; return avctx->block_align; }
static int gsm_decode_frame(AVCodecContext *avctx, void *data, int *got_frame_ptr, AVPacket *avpkt) { AVFrame *frame = data; int res; BitstreamContext bc; const uint8_t *buf = avpkt->data; int buf_size = avpkt->size; int16_t *samples; if (buf_size < avctx->block_align) { av_log(avctx, AV_LOG_ERROR, "Packet is too small\n"); return AVERROR_INVALIDDATA; } /* get output buffer */ frame->nb_samples = avctx->frame_size; if ((res = ff_get_buffer(avctx, frame, 0)) < 0) { av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); return res; } samples = (int16_t *)frame->data[0]; switch (avctx->codec_id) { case AV_CODEC_ID_GSM: bitstream_init(&bc, buf, buf_size * 8); if (bitstream_read(&bc, 4) != 0xd) av_log(avctx, AV_LOG_WARNING, "Missing GSM magic!\n"); res = gsm_decode_block(avctx, samples, &bc, GSM_13000); if (res < 0) return res; break; case AV_CODEC_ID_GSM_MS: res = ff_msgsm_decode_block(avctx, samples, buf, (GSM_MS_BLOCK_SIZE - avctx->block_align) / 3); if (res < 0) return res; } *got_frame_ptr = 1; return avctx->block_align; }