libavcodec/adxdec.c
Go to the documentation of this file.
1 /*
2  * ADX ADPCM codecs
3  * Copyright (c) 2001,2003 BERO
4  *
5  * This file is part of FFmpeg.
6  *
7  * FFmpeg is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * FFmpeg is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with FFmpeg; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21 
22 #include "libavutil/intreadwrite.h"
23 #include "avcodec.h"
24 #include "adx.h"
25 #include "get_bits.h"
26 #include "internal.h"
27 
28 /**
29  * @file
30  * SEGA CRI adx codecs.
31  *
32  * Reference documents:
33  * http://ku-www.ss.titech.ac.jp/~yatsushi/adx.html
34  * adx2wav & wav2adx http://www.geocities.co.jp/Playtown/2004/
35  */
36 
38 {
39  ADXContext *c = avctx->priv_data;
40  int ret, header_size;
41 
42  if (avctx->extradata_size >= 24) {
43  if ((ret = avpriv_adx_decode_header(avctx, avctx->extradata,
44  avctx->extradata_size, &header_size,
45  c->coeff)) < 0) {
46  av_log(avctx, AV_LOG_ERROR, "error parsing ADX header\n");
47  return AVERROR_INVALIDDATA;
48  }
49  c->channels = avctx->channels;
50  c->header_parsed = 1;
51  }
52 
54 
55  return 0;
56 }
57 
58 /**
59  * Decode 32 samples from 18 bytes.
60  *
61  * A 16-bit scalar value is applied to 32 residuals, which then have a
62  * 2nd-order LPC filter applied to it to form the output signal for a single
63  * channel.
64  */
65 static int adx_decode(ADXContext *c, int16_t *out, int offset,
66  const uint8_t *in, int ch)
67 {
68  ADXChannelState *prev = &c->prev[ch];
69  GetBitContext gb;
70  int scale = AV_RB16(in);
71  int i;
72  int s0, s1, s2, d;
73 
74  /* check if this is an EOF packet */
75  if (scale & 0x8000)
76  return -1;
77 
78  init_get_bits(&gb, in + 2, (BLOCK_SIZE - 2) * 8);
79  out += offset;
80  s1 = prev->s1;
81  s2 = prev->s2;
82  for (i = 0; i < BLOCK_SAMPLES; i++) {
83  d = get_sbits(&gb, 4);
84  s0 = ((d << COEFF_BITS) * scale + c->coeff[0] * s1 + c->coeff[1] * s2) >> COEFF_BITS;
85  s2 = s1;
86  s1 = av_clip_int16(s0);
87  *out++ = s1;
88  }
89  prev->s1 = s1;
90  prev->s2 = s2;
91 
92  return 0;
93 }
94 
95 static int adx_decode_frame(AVCodecContext *avctx, void *data,
96  int *got_frame_ptr, AVPacket *avpkt)
97 {
98  AVFrame *frame = data;
99  int buf_size = avpkt->size;
100  ADXContext *c = avctx->priv_data;
101  int16_t **samples;
102  int samples_offset;
103  const uint8_t *buf = avpkt->data;
104  const uint8_t *buf_end = buf + avpkt->size;
105  int num_blocks, ch, ret;
106 
107  if (c->eof) {
108  *got_frame_ptr = 0;
109  return buf_size;
110  }
111 
112  if (!c->header_parsed && buf_size >= 2 && AV_RB16(buf) == 0x8000) {
113  int header_size;
114  if ((ret = avpriv_adx_decode_header(avctx, buf, buf_size, &header_size,
115  c->coeff)) < 0) {
116  av_log(avctx, AV_LOG_ERROR, "error parsing ADX header\n");
117  return AVERROR_INVALIDDATA;
118  }
119  c->channels = avctx->channels;
120  c->header_parsed = 1;
121  if (buf_size < header_size)
122  return AVERROR_INVALIDDATA;
123  buf += header_size;
124  buf_size -= header_size;
125  }
126  if (!c->header_parsed)
127  return AVERROR_INVALIDDATA;
128 
129  /* calculate number of blocks in the packet */
130  num_blocks = buf_size / (BLOCK_SIZE * c->channels);
131 
132  /* if the packet is not an even multiple of BLOCK_SIZE, check for an EOF
133  packet */
134  if (!num_blocks || buf_size % (BLOCK_SIZE * avctx->channels)) {
135  if (buf_size >= 4 && (AV_RB16(buf) & 0x8000)) {
136  c->eof = 1;
137  *got_frame_ptr = 0;
138  return avpkt->size;
139  }
140  return AVERROR_INVALIDDATA;
141  }
142 
143  /* get output buffer */
144  frame->nb_samples = num_blocks * BLOCK_SAMPLES;
145  if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
146  return ret;
147  samples = (int16_t **)frame->extended_data;
148  samples_offset = 0;
149 
150  while (num_blocks--) {
151  for (ch = 0; ch < c->channels; ch++) {
152  if (buf_end - buf < BLOCK_SIZE || adx_decode(c, samples[ch], samples_offset, buf, ch)) {
153  c->eof = 1;
154  buf = avpkt->data + avpkt->size;
155  break;
156  }
157  buf_size -= BLOCK_SIZE;
158  buf += BLOCK_SIZE;
159  }
160  samples_offset += BLOCK_SAMPLES;
161  }
162 
163  *got_frame_ptr = 1;
164 
165  return buf - avpkt->data;
166 }
167 
168 static void adx_decode_flush(AVCodecContext *avctx)
169 {
170  ADXContext *c = avctx->priv_data;
171  memset(c->prev, 0, sizeof(c->prev));
172  c->eof = 0;
173 }
174 
176  .name = "adpcm_adx",
177  .type = AVMEDIA_TYPE_AUDIO,
178  .id = AV_CODEC_ID_ADPCM_ADX,
179  .priv_data_size = sizeof(ADXContext),
183  .capabilities = CODEC_CAP_DR1,
184  .long_name = NULL_IF_CONFIG_SMALL("SEGA CRI ADX ADPCM"),
185  .sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_S16P,
187 };
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:59
This structure describes decoded (raw) audio or video data.
Definition: frame.h:76
static av_cold int adx_decode_init(AVCodecContext *avctx)
static av_cold int init(AVCodecContext *avctx)
Definition: avrndec.c:35
int coeff[2]
Definition: adx.h:48
About Git write you should know how to use GIT properly Luckily Git comes with excellent documentation git help man git shows you the available git< command > help man git< command > shows information about the subcommand< command > The most comprehensive manual is the website Git Reference visit they are quite exhaustive You do not need a special username or password All you need is to provide a ssh public key to the Git server admin What follows now is a basic introduction to Git and some FFmpeg specific guidelines Read it at least if you are granted commit privileges to the FFmpeg project you are expected to be familiar with these rules I if not You can get git from etc no matter how small Every one of them has been saved from looking like a fool by this many times It s very easy for stray debug output or cosmetic modifications to slip in
Definition: git-howto.txt:5
#define BLOCK_SIZE
Definition: adx.h:53
static int get_sbits(GetBitContext *s, int n)
Definition: get_bits.h:225
struct ADXContext ADXContext
set threshold d
enum AVSampleFormat sample_fmt
audio sample format
uint8_t
#define av_cold
Definition: attributes.h:78
uint8_t * extradata
some codecs need / can use extradata like Huffman tables.
#define CODEC_CAP_DR1
Codec uses get_buffer() for allocating buffers and supports custom allocators.
uint8_t * data
bitstream reader API header.
frame
Definition: stft.m:14
#define COEFF_BITS
Definition: adx.h:51
#define s2
Definition: regdef.h:39
#define AV_RB16
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
Spectrum Plot time data
#define s0
Definition: regdef.h:37
void av_log(void *avcl, int level, const char *fmt,...)
Definition: log.c:246
const char * name
Name of the codec implementation.
static const uint8_t offset[127][2]
Definition: vf_spp.c:70
external API header
static void adx_decode_flush(AVCodecContext *avctx)
ret
Definition: avfilter.c:821
int header_parsed
Definition: adx.h:45
static int adx_decode_frame(AVCodecContext *avctx, void *data, int *got_frame_ptr, AVPacket *avpkt)
static void flush(AVCodecContext *avctx)
static int adx_decode(ADXContext *c, int16_t *out, int offset, const uint8_t *in, int ch)
Decode 32 samples from 18 bytes.
#define BLOCK_SAMPLES
Definition: adx.h:54
main external API structure.
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:148
void * buf
Definition: avisynth_c.h:594
Definition: adx.h:42
int s2
Definition: adx.h:39
synthesis window for stochastic i
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
Definition: get_bits.h:379
#define s1
Definition: regdef.h:38
int avpriv_adx_decode_header(AVCodecContext *avctx, const uint8_t *buf, int bufsize, int *header_size, int *coeff)
Decode ADX stream header.
Definition: adx.c:38
Synth Windw Norm while(pin< pend)%Until the end...%---Analysis x_w
common internal api header.
static double c[64]
AVCodec ff_adpcm_adx_decoder
AVSampleFormat
Audio Sample Formats.
Definition: samplefmt.h:49
int eof
Definition: adx.h:46
int s1
Definition: adx.h:39
Same thing on a dB scale
ADXChannelState prev[2]
Definition: adx.h:44
int channels
number of audio channels
signed 16 bits, planar
Definition: samplefmt.h:58
Filter the word “frame” indicates either a video frame or a group of audio samples
uint8_t pi<< 24) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_U8, uint8_t,(*(const uint8_t *) pi-0x80)*(1.0f/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_U8, uint8_t,(*(const uint8_t *) pi-0x80)*(1.0/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S16, int16_t,(*(const int16_t *) pi >> 8)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S16, int16_t,*(const int16_t *) pi *(1.0f/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S16, int16_t,*(const int16_t *) pi *(1.0/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S32, int32_t,(*(const int32_t *) pi >> 24)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S32, int32_t,*(const int32_t *) pi *(1.0f/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S32, int32_t,*(const int32_t *) pi *(1.0/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_FLT, float, av_clip_uint8(lrintf(*(const float *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_FLT, float, av_clip_int16(lrintf(*(const float *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_FLT, float, av_clipl_int32(llrintf(*(const float *) pi *(1U<< 31)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_DBL, double, av_clip_uint8(lrint(*(const double *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_DBL, double, av_clip_int16(lrint(*(const double *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_DBL, double, av_clipl_int32(llrint(*(const double *) pi *(1U<< 31))))#define SET_CONV_FUNC_GROUP(ofmt, ifmt) static void set_generic_function(AudioConvert *ac){}void ff_audio_convert_free(AudioConvert **ac){if(!*ac) return;ff_dither_free(&(*ac) ->dc);av_freep(ac);}AudioConvert *ff_audio_convert_alloc(AVAudioResampleContext *avr, enum AVSampleFormat out_fmt, enum AVSampleFormat in_fmt, int channels, int sample_rate, int apply_map){AudioConvert *ac;int in_planar, out_planar;ac=av_mallocz(sizeof(*ac));if(!ac) return NULL;ac->avr=avr;ac->out_fmt=out_fmt;ac->in_fmt=in_fmt;ac->channels=channels;ac->apply_map=apply_map;if(avr->dither_method!=AV_RESAMPLE_DITHER_NONE &&av_get_packed_sample_fmt(out_fmt)==AV_SAMPLE_FMT_S16 &&av_get_bytes_per_sample(in_fmt) > 2){ac->dc=ff_dither_alloc(avr, out_fmt, in_fmt, channels, sample_rate, apply_map);if(!ac->dc){av_free(ac);return NULL;}return ac;}in_planar=av_sample_fmt_is_planar(in_fmt);out_planar=av_sample_fmt_is_planar(out_fmt);if(in_planar==out_planar){ac->func_type=CONV_FUNC_TYPE_FLAT;ac->planes=in_planar?ac->channels:1;}else if(in_planar) ac->func_type=CONV_FUNC_TYPE_INTERLEAVE;else ac->func_type=CONV_FUNC_TYPE_DEINTERLEAVE;set_generic_function(ac);if(ARCH_ARM) ff_audio_convert_init_arm(ac);if(ARCH_X86) ff_audio_convert_init_x86(ac);return ac;}int ff_audio_convert(AudioConvert *ac, AudioData *out, AudioData *in){int use_generic=1;int len=in->nb_samples;int p;if(ac->dc){av_dlog(ac->avr,"%d samples - audio_convert: %s to %s (dithered)\n", len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt));return ff_convert_dither(ac-> out
static int decode(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
Definition: crystalhd.c:868
SEGA CRI adx codecs.
uint8_t ** extended_data
pointers to the data planes/channels.
Definition: frame.h:117
This structure stores compressed data.
int nb_samples
number of audio samples (per channel) described by this frame
Definition: frame.h:127
int channels
Definition: adx.h:43