23 #define BITSTREAM_READER_LE
31 static const int8_t
map_3bit[] = { -4, -3, -2, -1, +1, +2, +3, +4 };
72 s->cols = 1 <<
s->level;
73 s->wrapbuf_len = 2 *
s->cols - 2;
74 s->block_len =
s->rows *
s->cols;
75 s->max_framesize =
s->block_len;
78 s->wrapbuf =
av_calloc(
s->wrapbuf_len,
sizeof(
int));
81 if (!
s->block || !
s->wrapbuf || !
s->ampbuf || !
s->bitstream)
84 s->midbuf =
s->ampbuf + 0x8000;
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++) {
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)
439 unsigned int r0, r1, r2, r3;
441 for (
i = 0;
i < sub_len;
i++) {
445 for (j = 0; j < sub_count/2; j++) {
447 *p = r1 * 2 + (r0 + r2);
450 *p = r2 * 2 - (r1 + r3);
464 unsigned sub_count, sub_len, todo_count, step_subcount,
i;
465 int *wrap_p, *block_p, *p;
475 step_subcount = (2048 >>
s->level) - 2;
481 todo_count =
s->rows;
485 sub_count = step_subcount;
486 if (sub_count > todo_count)
487 sub_count = todo_count;
489 sub_len =
s->cols / 2;
492 juggle(wrap_p, block_p, sub_len, sub_count);
493 wrap_p += sub_len * 2;
495 for (
i = 0, p = block_p;
i < sub_count;
i++) {
500 while (sub_len > 1) {
503 juggle(wrap_p, block_p, sub_len, sub_count);
504 wrap_p += sub_len * 2;
507 if (todo_count <= step_subcount)
510 todo_count -= step_subcount;
511 block_p += step_subcount <<
s->level;
518 int pwr, count,
val,
i, x, ret;
525 for (
i = 0, x = 0;
i < count;
i++) {
530 for (
i = 1, x = -
val;
i <= count;
i++) {
552 int ret, n, buf_size, input_buf_size;
554 if (!
pkt->
size && !
s->bitstream_size) {
559 buf_size =
FFMIN(
pkt->
size,
s->max_framesize -
s->bitstream_size);
560 input_buf_size = buf_size;
561 if (
s->bitstream_index +
s->bitstream_size + buf_size >
s->max_framesize) {
562 memmove(
s->bitstream, &
s->bitstream[
s->bitstream_index],
s->bitstream_size);
563 s->bitstream_index = 0;
566 memcpy(&
s->bitstream[
s->bitstream_index +
s->bitstream_size],
pkt->
data, buf_size);
567 buf = &
s->bitstream[
s->bitstream_index];
568 buf_size +=
s->bitstream_size;
569 s->bitstream_size = buf_size;
570 if (buf_size < s->max_framesize &&
pkt->
data) {
572 return input_buf_size;
589 int val =
s->block[n] >>
s->level;
597 if (n > buf_size &&
pkt->
data) {
598 s->bitstream_size = 0;
599 s->bitstream_index = 0;
603 if (
s->bitstream_size) {
604 s->bitstream_index += n;
605 s->bitstream_size -= n;
606 return input_buf_size;
619 s->bitstream_size = 0;
625 .
name =
"interplayacm",
static double val(void *priv, double ch)
Libavcodec external API header.
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
bitstream reader API header.
static unsigned int get_bits1(GetBitContext *s)
static void skip_bits(GetBitContext *s, int n)
static int init_get_bits8(GetBitContext *s, const uint8_t *buffer, int byte_size)
Initialize GetBitContext.
static int get_bits_count(const GetBitContext *s)
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
#define AV_CODEC_CAP_DELAY
Encoder or decoder requires flushing with NULL input at the end in order to give the complete and cor...
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
@ AV_CODEC_ID_INTERPLAY_ACM
#define AV_INPUT_BUFFER_PADDING_SIZE
Required number of additionally allocated bytes at the end of the input bitstream for decoding.
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
void * av_calloc(size_t nmemb, size_t size)
Non-inlined equivalent of av_mallocz_array().
@ AV_SAMPLE_FMT_S16
signed 16 bits
static const int8_t map_1bit[]
static int k44(InterplayACMContext *s, unsigned ind, unsigned col)
static int fill_block(InterplayACMContext *s)
#define set_pos(s, r, c, idx)
static int mul_3x3[3 *3 *3]
static int t27(InterplayACMContext *s, unsigned ind, unsigned col)
static void juggle_block(InterplayACMContext *s)
static int t37(InterplayACMContext *s, unsigned ind, unsigned col)
static int mul_3x5[5 *5 *5]
static av_cold int decode_close(AVCodecContext *avctx)
static int t15(InterplayACMContext *s, unsigned ind, unsigned col)
static int k13(InterplayACMContext *s, unsigned ind, unsigned col)
static const filler filler_list[]
static int linear(InterplayACMContext *s, unsigned ind, unsigned col)
static av_cold int decode_init(AVCodecContext *avctx)
static int k24(InterplayACMContext *s, unsigned ind, unsigned col)
static int k12(InterplayACMContext *s, unsigned ind, unsigned col)
static int k23(InterplayACMContext *s, unsigned ind, unsigned col)
AVCodec ff_interplay_acm_decoder
static int k45(InterplayACMContext *s, unsigned ind, unsigned col)
static int zero(InterplayACMContext *s, unsigned ind, unsigned col)
static int k35(InterplayACMContext *s, unsigned ind, unsigned col)
static const int8_t map_2bit_near[]
static int bad(InterplayACMContext *s, unsigned ind, unsigned col)
static void juggle(int *wrap_p, int *block_p, unsigned sub_len, unsigned sub_count)
static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame_ptr, AVPacket *pkt)
int(* filler)(InterplayACMContext *s, unsigned ind, unsigned col)
static const int8_t map_2bit_far[]
static const int8_t map_3bit[]
static int k34(InterplayACMContext *s, unsigned ind, unsigned col)
static int decode_block(InterplayACMContext *s)
static int mul_2x11[11 *11]
#define FF_CODEC_CAP_INIT_CLEANUP
The codec allows calling the close function for deallocation even if the init function returned a fai...
common internal API header
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
main external API structure.
enum AVSampleFormat sample_fmt
audio sample format
uint8_t * extradata
some codecs need / can use extradata like Huffman tables.
int channels
number of audio channels
const char * name
Name of the codec implementation.
This structure describes decoded (raw) audio or video data.
int nb_samples
number of audio samples (per channel) described by this frame
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
This structure stores compressed data.