23 #define BITSTREAM_READER_LE
31 static const int8_t
map_3bit[] = { -4, -3, -2, -1, +1, +2, +3, +4 };
87 for (x3 = 0; x3 < 3; x3++)
88 for (x2 = 0; x2 < 3; x2++)
89 for (x1 = 0; x1 < 3; x1++)
90 mul_3x3[x1 + x2 * 3 + x3* 3 * 3] = x1 + (x2 << 4) + (x3 << 8);
91 for (x3 = 0; x3 < 5; x3++)
92 for (x2 = 0; x2 < 5; x2++)
93 for (x1 = 0; x1 < 5; x1++)
94 mul_3x5[x1 + x2 * 5 + x3 * 5 * 5] = x1 + (x2 << 4) + (x3 << 8);
95 for (x2 = 0; x2 < 11; x2++)
96 for (x1 = 0; x1 < 11; x1++)
97 mul_2x11[x1 + x2 * 11] = x1 + (x2 << 4);
102 #define set_pos(s, r, c, idx) do { \
103 unsigned pos = ((r) << s->level) + (c); \
104 s->block[pos] = s->midbuf[(idx)]; \
111 for (i = 0; i < s->
rows; i++)
125 int b, middle = 1 << (ind - 1);
127 for (i = 0; i < s->
rows; i++) {
129 set_pos(s, i, col, b - middle);
139 for (i = 0; i < s->
rows; i++) {
164 for (i = 0; i < s->
rows; i++) {
182 for (i = 0; i < s->
rows; i++) {
186 if (i >= s->
rows)
break;
208 for (i = 0; i < s->
rows; i++) {
226 for (i = 0; i < s->
rows; i++) {
260 for (i = 0; i < s->
rows; i++) {
285 for (i = 0; i < s->
rows; i++) {
312 for (i = 0; i < s->
rows; i++) {
331 for (i = 0; i < s->
rows; i++) {
340 n2 = ((
mul_3x3[
b] >> 4) & 0x0F) - 1;
341 n3 = ((
mul_3x3[
b] >> 8) & 0x0F) - 1;
360 for (i = 0; i < s->
rows; i++) {
369 n2 = ((
mul_3x5[
b] >> 4) & 0x0F) - 2;
370 n3 = ((
mul_3x5[
b] >> 8) & 0x0F) - 2;
388 for (i = 0; i < s->
rows; i++) {
426 for (i = 0; i < s->
cols; i++) {
435 static void juggle(
int *wrap_p,
int *block_p,
unsigned sub_len,
unsigned sub_count)
438 int *p, r0, r1, r2, r3;
440 for (i = 0; i < sub_len; i++) {
444 for (j = 0; j < sub_count/2; j++) {
446 *p = r1 * 2 + (r0 + r2);
449 *p = r2 * 2 - (r1 + r3);
463 unsigned sub_count, sub_len, todo_count, step_subcount, i;
464 int *wrap_p, *block_p, *p;
474 step_subcount = (2048 >> s->
level) - 2;
480 todo_count = s->
rows;
484 sub_count = step_subcount;
485 if (sub_count > todo_count)
486 sub_count = todo_count;
488 sub_len = s->
cols / 2;
491 juggle(wrap_p, block_p, sub_len, sub_count);
492 wrap_p += sub_len * 2;
494 for (i = 0, p = block_p; i < sub_count; i++) {
499 while (sub_len > 1) {
502 juggle(wrap_p, block_p, sub_len, sub_count);
503 wrap_p += sub_len * 2;
506 if (todo_count <= step_subcount)
509 todo_count -= step_subcount;
510 block_p += step_subcount << s->
level;
524 for (i = 0, x = 0; i <
count; i++) {
529 for (i = 1, x = -val; i <=
count; i++) {
551 int ret,
n, buf_size, input_buf_size;
559 input_buf_size = buf_size;
569 if (buf_size < s->max_framesize && pkt->
data) {
571 return input_buf_size;
586 samples = (int16_t *)frame->
data[0];
596 if (n > buf_size && pkt->
data) {
605 return input_buf_size;
624 .
name =
"interplayacm",
#define FF_CODEC_CAP_INIT_CLEANUP
The codec allows calling the close function for deallocation even if the init function returned a fai...
const char const char void * val
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
This structure describes decoded (raw) audio or video data.
ptrdiff_t const GLvoid * data
static const int8_t map_2bit_far[]
static int linear(InterplayACMContext *s, unsigned ind, unsigned col)
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
static int k24(InterplayACMContext *s, unsigned ind, unsigned col)
static int mul_3x5[5 *5 *5]
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_RL16
static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame_ptr, AVPacket *pkt)
void * av_calloc(size_t nmemb, size_t size)
Non-inlined equivalent of av_mallocz_array().
static int decode_block(InterplayACMContext *s)
#define AV_CODEC_CAP_DELAY
Encoder or decoder requires flushing with NULL input at the end in order to give the complete and cor...
enum AVSampleFormat sample_fmt
audio sample format
uint8_t * extradata
some codecs need / can use extradata like Huffman tables.
static int k35(InterplayACMContext *s, unsigned ind, unsigned col)
static int get_bits_count(const GetBitContext *s)
static const int8_t map_2bit_near[]
bitstream reader API header.
static int mul_2x11[11 *11]
AVCodec ff_interplay_acm_decoder
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
static int t15(InterplayACMContext *s, unsigned ind, unsigned col)
static int k44(InterplayACMContext *s, unsigned ind, unsigned col)
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
static av_cold int decode_close(AVCodecContext *avctx)
static int t27(InterplayACMContext *s, unsigned ind, unsigned col)
const char * name
Name of the codec implementation.
#define set_pos(s, r, c, idx)
static int k34(InterplayACMContext *s, unsigned ind, unsigned col)
int(* filler)(InterplayACMContext *s, unsigned ind, unsigned col)
static int zero(InterplayACMContext *s, unsigned ind, unsigned col)
static int fill_block(InterplayACMContext *s)
static void juggle_block(InterplayACMContext *s)
static av_cold int decode_init(AVCodecContext *avctx)
static int k12(InterplayACMContext *s, unsigned ind, unsigned col)
Libavcodec external API header.
static int k13(InterplayACMContext *s, unsigned ind, unsigned col)
static int init_get_bits8(GetBitContext *s, const uint8_t *buffer, int byte_size)
Initialize GetBitContext.
main external API structure.
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
static const filler filler_list[]
static unsigned int get_bits1(GetBitContext *s)
static void skip_bits(GetBitContext *s, int n)
static int t37(InterplayACMContext *s, unsigned ind, unsigned col)
static void juggle(int *wrap_p, int *block_p, unsigned sub_len, unsigned sub_count)
static const int8_t map_3bit[]
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
static int mul_3x3[3 *3 *3]
common internal api header.
static int k23(InterplayACMContext *s, unsigned ind, unsigned col)
#define AV_INPUT_BUFFER_PADDING_SIZE
Required number of additionally allocated bytes at the end of the input bitstream for decoding...
static const int8_t map_1bit[]
int channels
number of audio channels
static int bad(InterplayACMContext *s, unsigned ind, unsigned col)
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.
static int k45(InterplayACMContext *s, unsigned ind, unsigned col)