38 #define DST_MAX_CHANNELS 6 39 #define DST_MAX_ELEMENTS (2 * DST_MAX_CHANNELS) 41 #define DSD_FS44(sample_rate) (sample_rate * 8LL / 44100) 43 #define DST_SAMPLES_PER_FRAME(sample_rate) (588 * DSD_FS44(sample_rate)) 101 for (i = 0; i < avctx->
channels; i++)
127 memset(
map, 0,
sizeof(*
map) * DST_MAX_CHANNELS);
141 int coeff_bits,
int is_signed,
int offset)
151 int length_bits,
int coeff_bits,
int is_signed,
int offset)
153 unsigned int i, j, k;
159 int method =
get_bits(gb, 2), lsb_size;
166 for (j = method + 1; j < t->
length[
i]; j++) {
168 for (k = 0; k < method + 1; k++)
169 x += code_pred_coeff[method][k] * (
unsigned)t->
coeff[
i][j - k - 1];
176 if (c < offset || c >= offset + (1<<coeff_bits))
194 unsigned int k = (ac->
a >> 8) | ((ac->
a >> 7) & 1);
195 unsigned int q = k * p;
196 unsigned int a_q = ac->
a - q;
222 for (i = 0; i < fsets->
elements; i++) {
225 for (j = 0; j < 16; j++) {
226 int total = av_clip(length - j * 8, 0, 8);
228 for (k = 0; k < 256; k++) {
231 for (l = 0; l < total; l++)
232 v += (((k >> l) & 1) * 2 - 1) * fsets->
coeff[
i][j * 8 + l];
240 int *got_frame_ptr,
AVPacket *avpkt)
245 unsigned i, ch, same_map, dst_x_bit;
256 if (avpkt->
size <= 1)
262 dsd = frame->
data[0];
263 pcm = (
float *)frame->
data[0];
297 if ((ret =
read_map(gb, &s->
fsets, map_ch_to_felem, channels)) < 0)
302 memcpy(map_ch_to_pelem, map_ch_to_felem,
sizeof(map_ch_to_felem));
305 if ((ret =
read_map(gb, &s->
probs, map_ch_to_pelem, channels)) < 0)
335 memset(dsd, 0, frame->
nb_samples * 4 * channels);
339 for (i = 0; i < samples_per_frame; i++) {
341 const unsigned felem = map_ch_to_felem[ch];
344 int prob, residual, v;
346 #define F(x) filter[(x)][status[(x)]] 347 const int16_t
predict =
F( 0) +
F( 1) +
F( 2) +
F( 3) +
348 F( 4) +
F( 5) +
F( 6) +
F( 7) +
349 F( 8) +
F( 9) +
F(10) +
F(11) +
350 F(12) +
F(13) +
F(14) +
F(15);
353 if (!half_prob[ch] || i >= s->
fsets.
length[felem]) {
354 unsigned pelem = map_ch_to_pelem[ch];
361 ac_get(ac, gb, prob, &residual);
362 v = ((predict >> 15) ^ residual) & 1;
363 dsd[((i >> 3) * channels + ch) << 2] |= v << (7 - (i & 0x7 ));
373 frame->
data[0] + i * 4,
374 channels * 4, pcm + i, channels);
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
static av_always_inline int get_sr_golomb_dst(GetBitContext *gb, unsigned int k)
This structure describes decoded (raw) audio or video data.
ptrdiff_t const GLvoid * data
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
static av_cold int init(AVCodecContext *avctx)
const uint8_t ff_reverse[256]
#define avpriv_request_sample(...)
static int get_ur_golomb_jpegls(GetBitContext *gb, int k, int limit, int esc_len)
read unsigned golomb rice code (jpegls).
av_cold void ff_init_dsd_data(void)
static int read_map(GetBitContext *gb, Table *t, unsigned int map[DST_MAX_CHANNELS], int channels)
static av_always_inline void predict(PredictorState *ps, float *coef, int output_enable)
static int get_sbits(GetBitContext *s, int n)
static void decode(AVCodecContext *dec_ctx, AVPacket *pkt, AVFrame *frame, FILE *outfile)
static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame_ptr, AVPacket *avpkt)
#define FF_CODEC_CAP_INIT_THREADSAFE
The codec does not modify any global variables in the init function, allowing to call the init functi...
enum AVSampleFormat sample_fmt
audio sample format
void ff_dsd2pcm_translate(DSDContext *s, size_t samples, int lsbf, const uint8_t *src, ptrdiff_t src_stride, float *dst, ptrdiff_t dst_stride)
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf offset
static const int8_t fsets_code_pred_coeff[3][3]
static void ac_init(ArithCoder *ac, GetBitContext *gb)
#define DECLARE_ALIGNED(n, t, v)
Declare a variable that is aligned in memory.
bitstream reader API header.
static const uint16_t table[]
#define prob(name, subs,...)
static int get_bits_left(GetBitContext *gb)
static void read_uncoded_coeff(GetBitContext *gb, int *dst, unsigned int elements, int coeff_bits, int is_signed, int offset)
int16_t filter[DST_MAX_ELEMENTS][16][256]
filter_frame For filters that do not use the this method is called when a frame is pushed to the filter s input It can be called at any time except in a reentrant way If the input frame is enough to produce then the filter should push the output frames on the output link immediately As an exception to the previous rule if the input frame is enough to produce several output frames then the filter needs output only at least one per link The additional frames can be left buffered in the filter
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
simple assert() macros that are a bit more flexible than ISO C assert().
const char * name
Name of the codec implementation.
static av_cold int decode_init(AVCodecContext *avctx)
static const int8_t probs_code_pred_coeff[3][3]
static const ElemCat * elements[ELEMENT_COUNT]
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
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
unsigned int length[DST_MAX_ELEMENTS]
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
Libavcodec external API header.
AVSampleFormat
Audio sample formats.
int sample_rate
samples per second
static int init_get_bits8(GetBitContext *s, const uint8_t *buffer, int byte_size)
Initialize GetBitContext.
static uint8_t prob_dst_x_bit(int c)
int coeff[DST_MAX_ELEMENTS][128]
static av_always_inline void ac_get(ArithCoder *ac, GetBitContext *gb, int p, int *e)
main external API structure.
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
static unsigned int get_bits1(GetBitContext *s)
static void skip_bits1(GetBitContext *s)
Describe the class of an AVClass context structure.
they must not be accessed directly The fifo field contains the frames that are queued in the input for processing by the filter The status_in and status_out fields contains the queued status(EOF or error) of the link
const VDPAUPixFmtMap * map
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
common internal api header.
static void build_filter(int16_t table[DST_MAX_ELEMENTS][16][256], const Table *fsets)
uint8_t status[DST_MAX_CHANNELS][16]
#define DST_SAMPLES_PER_FRAME(sample_rate)
DSDContext dsdctx[DST_MAX_CHANNELS]
static int read_table(GetBitContext *gb, Table *t, const int8_t code_pred_coeff[3][3], int length_bits, int coeff_bits, int is_signed, int offset)
int channels
number of audio channels
static const double coeff[2][5]
static enum AVSampleFormat sample_fmts[]
This structure stores compressed data.
int nb_samples
number of audio samples (per channel) described by this frame
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() for allocating buffers and supports custom allocators.