* qatar/master: (42 commits) swscale: fix signed overflow in yuv2mono_X_c_template snow: fix integer overflows svq1enc: remove stale altivec-related hack snow: fix signed overflow in byte to 32-bit replication adx: rename ff_adx_decode_header() to avpriv_adx_decode_header() avformat: add CRI ADX format demuxer adx: add an ADX parser. adx: move header decoding to ADX common code adx: calculate the number of blocks in a packet adx: define and use 2 new macro constants BLOCK_SIZE and BLOCK_SAMPLES adx: check for unsupported ADX formats adx: simplify encoding by using put_sbits() adx: calculate correct LPC coeffs adx: use 12-bit coefficients instead of 14-bit to avoid integer overflow adx: simplify adx_decode() by using get_sbits() to read residual samples adx: fix the data offset parsing in adx_decode_header() adx: remove unneeded post-decode channel interleaving adx: validate header values adx: cosmetics: general pretty-printing and comment clean-up adx: remove useless comments ... Conflicts: Changelog libavcodec/cook.c libavcodec/fraps.c libavcodec/nuv.c libavcodec/pthread.c libavcodec/version.h libavformat/Makefile libavformat/version.h Merged-by: Michael Niedermayer <michaelni@gmx.at>tags/n0.9
| @@ -125,6 +125,7 @@ easier to use. The changes are: | |||||
| - pan audio filter | - pan audio filter | ||||
| - IFF Amiga Continuous Bitmap (ACBM) decoder | - IFF Amiga Continuous Bitmap (ACBM) decoder | ||||
| - ass filter | - ass filter | ||||
| - CRI ADX audio format demuxer | |||||
| version 0.8: | version 0.8: | ||||
| @@ -79,6 +79,8 @@ library: | |||||
| @item Brute Force & Ignorance @tab @tab X | @item Brute Force & Ignorance @tab @tab X | ||||
| @tab Used in the game Flash Traffic: City of Angels. | @tab Used in the game Flash Traffic: City of Angels. | ||||
| @item BWF @tab X @tab X | @item BWF @tab X @tab X | ||||
| @item CRI ADX @tab @tab X | |||||
| @tab Audio-only format used in console video games. | |||||
| @item Discworld II BMV @tab @tab X | @item Discworld II BMV @tab @tab X | ||||
| @item Interplay C93 @tab @tab X | @item Interplay C93 @tab @tab X | ||||
| @tab Used in the game Cyberia from Interplay. | @tab Used in the game Cyberia from Interplay. | ||||
| @@ -519,7 +519,7 @@ OBJS-$(CONFIG_PCM_U32LE_ENCODER) += pcm.o | |||||
| OBJS-$(CONFIG_PCM_ZORK_DECODER) += pcm.o | OBJS-$(CONFIG_PCM_ZORK_DECODER) += pcm.o | ||||
| OBJS-$(CONFIG_ADPCM_4XM_DECODER) += adpcm.o adpcm_data.o | OBJS-$(CONFIG_ADPCM_4XM_DECODER) += adpcm.o adpcm_data.o | ||||
| OBJS-$(CONFIG_ADPCM_ADX_DECODER) += adxdec.o | |||||
| OBJS-$(CONFIG_ADPCM_ADX_DECODER) += adxdec.o adx.o | |||||
| OBJS-$(CONFIG_ADPCM_ADX_ENCODER) += adxenc.o | OBJS-$(CONFIG_ADPCM_ADX_ENCODER) += adxenc.o | ||||
| OBJS-$(CONFIG_ADPCM_CT_DECODER) += adpcm.o adpcm_data.o | OBJS-$(CONFIG_ADPCM_CT_DECODER) += adpcm.o adpcm_data.o | ||||
| OBJS-$(CONFIG_ADPCM_EA_DECODER) += adpcm.o | OBJS-$(CONFIG_ADPCM_EA_DECODER) += adpcm.o | ||||
| @@ -558,6 +558,7 @@ OBJS-$(CONFIG_ADPCM_YAMAHA_ENCODER) += adpcmenc.o adpcm_data.o | |||||
| # libavformat dependencies | # libavformat dependencies | ||||
| OBJS-$(CONFIG_ADTS_MUXER) += mpeg4audio.o | OBJS-$(CONFIG_ADTS_MUXER) += mpeg4audio.o | ||||
| OBJS-$(CONFIG_ADX_DEMUXER) += adx.o | |||||
| OBJS-$(CONFIG_CAF_DEMUXER) += mpeg4audio.o mpegaudiodata.o | OBJS-$(CONFIG_CAF_DEMUXER) += mpeg4audio.o mpegaudiodata.o | ||||
| OBJS-$(CONFIG_DV_DEMUXER) += dvdata.o | OBJS-$(CONFIG_DV_DEMUXER) += dvdata.o | ||||
| OBJS-$(CONFIG_DV_MUXER) += dvdata.o timecode.o | OBJS-$(CONFIG_DV_MUXER) += dvdata.o timecode.o | ||||
| @@ -632,6 +633,7 @@ OBJS-$(CONFIG_AAC_PARSER) += aac_parser.o aac_ac3_parser.o \ | |||||
| aacadtsdec.o mpeg4audio.o | aacadtsdec.o mpeg4audio.o | ||||
| OBJS-$(CONFIG_AC3_PARSER) += ac3_parser.o ac3tab.o \ | OBJS-$(CONFIG_AC3_PARSER) += ac3_parser.o ac3tab.o \ | ||||
| aac_ac3_parser.o | aac_ac3_parser.o | ||||
| OBJS-$(CONFIG_ADX_PARSER) += adx_parser.o adx.o | |||||
| OBJS-$(CONFIG_CAVSVIDEO_PARSER) += cavs_parser.o | OBJS-$(CONFIG_CAVSVIDEO_PARSER) += cavs_parser.o | ||||
| OBJS-$(CONFIG_DCA_PARSER) += dca_parser.o | OBJS-$(CONFIG_DCA_PARSER) += dca_parser.o | ||||
| OBJS-$(CONFIG_DIRAC_PARSER) += dirac_parser.o | OBJS-$(CONFIG_DIRAC_PARSER) += dirac_parser.o | ||||
| @@ -0,0 +1,81 @@ | |||||
| /* | |||||
| * Copyright (c) 2011 Justin Ruggles | |||||
| * | |||||
| * This file is part of Libav. | |||||
| * | |||||
| * Libav is free software; you can redistribute it and/or | |||||
| * modify it under the terms of the GNU Lesser General Public | |||||
| * License as published by the Free Software Foundation; either | |||||
| * version 2.1 of the License, or (at your option) any later version. | |||||
| * | |||||
| * Libav is distributed in the hope that it will be useful, | |||||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||||
| * Lesser General Public License for more details. | |||||
| * | |||||
| * You should have received a copy of the GNU Lesser General Public | |||||
| * License along with Libav; if not, write to the Free Software | |||||
| * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |||||
| */ | |||||
| #include "libavutil/intreadwrite.h" | |||||
| #include "libavutil/mathematics.h" | |||||
| #include "adx.h" | |||||
| void ff_adx_calculate_coeffs(int cutoff, int sample_rate, int bits, int *coeff) | |||||
| { | |||||
| double a, b, c; | |||||
| a = M_SQRT2 - cos(2.0 * M_PI * cutoff / sample_rate); | |||||
| b = M_SQRT2 - 1.0; | |||||
| c = (a - sqrt((a + b) * (a - b))) / b; | |||||
| coeff[0] = lrintf(c * 2.0 * (1 << bits)); | |||||
| coeff[1] = lrintf(-(c * c) * (1 << bits)); | |||||
| } | |||||
| int avpriv_adx_decode_header(AVCodecContext *avctx, const uint8_t *buf, | |||||
| int bufsize, int *header_size, int *coeff) | |||||
| { | |||||
| int offset, cutoff; | |||||
| if (bufsize < 24) | |||||
| return AVERROR_INVALIDDATA; | |||||
| if (AV_RB16(buf) != 0x8000) | |||||
| return AVERROR_INVALIDDATA; | |||||
| offset = AV_RB16(buf + 2) + 4; | |||||
| /* if copyright string is within the provided data, validate it */ | |||||
| if (bufsize >= offset && memcmp(buf + offset - 6, "(c)CRI", 6)) | |||||
| return AVERROR_INVALIDDATA; | |||||
| /* check for encoding=3 block_size=18, sample_size=4 */ | |||||
| if (buf[4] != 3 || buf[5] != 18 || buf[6] != 4) { | |||||
| av_log_ask_for_sample(avctx, "unsupported ADX format\n"); | |||||
| return AVERROR_PATCHWELCOME; | |||||
| } | |||||
| /* channels */ | |||||
| avctx->channels = buf[7]; | |||||
| if (avctx->channels > 2) | |||||
| return AVERROR_INVALIDDATA; | |||||
| /* sample rate */ | |||||
| avctx->sample_rate = AV_RB32(buf + 8); | |||||
| if (avctx->sample_rate < 1 || | |||||
| avctx->sample_rate > INT_MAX / (avctx->channels * BLOCK_SIZE * 8)) | |||||
| return AVERROR_INVALIDDATA; | |||||
| /* bit rate */ | |||||
| avctx->bit_rate = avctx->sample_rate * avctx->channels * BLOCK_SIZE * 8 / BLOCK_SAMPLES; | |||||
| /* LPC coefficients */ | |||||
| if (coeff) { | |||||
| cutoff = AV_RB16(buf + 16); | |||||
| ff_adx_calculate_coeffs(cutoff, avctx->sample_rate, COEFF_BITS, coeff); | |||||
| } | |||||
| *header_size = offset; | |||||
| return 0; | |||||
| } | |||||
| @@ -31,19 +31,50 @@ | |||||
| #ifndef AVCODEC_ADX_H | #ifndef AVCODEC_ADX_H | ||||
| #define AVCODEC_ADX_H | #define AVCODEC_ADX_H | ||||
| #include <stdint.h> | |||||
| #include "avcodec.h" | |||||
| typedef struct { | typedef struct { | ||||
| int s1,s2; | int s1,s2; | ||||
| } PREV; | |||||
| } ADXChannelState; | |||||
| typedef struct { | typedef struct { | ||||
| PREV prev[2]; | |||||
| int channels; | |||||
| ADXChannelState prev[2]; | |||||
| int header_parsed; | int header_parsed; | ||||
| unsigned char dec_temp[18*2]; | |||||
| int in_temp; | |||||
| int eof; | |||||
| int cutoff; | |||||
| int coeff[2]; | |||||
| } ADXContext; | } ADXContext; | ||||
| #define BASEVOL 0x4000 | |||||
| #define SCALE1 0x7298 | |||||
| #define SCALE2 0x3350 | |||||
| #define COEFF_BITS 12 | |||||
| #define BLOCK_SIZE 18 | |||||
| #define BLOCK_SAMPLES 32 | |||||
| /** | |||||
| * Calculate LPC coefficients based on cutoff frequency and sample rate. | |||||
| * | |||||
| * @param cutoff cutoff frequency | |||||
| * @param sample_rate sample rate | |||||
| * @param bits number of bits used to quantize coefficients | |||||
| * @param[out] coeff 2 quantized LPC coefficients | |||||
| */ | |||||
| void ff_adx_calculate_coeffs(int cutoff, int sample_rate, int bits, int *coeff); | |||||
| /** | |||||
| * Decode ADX stream header. | |||||
| * Sets avctx->channels and avctx->sample_rate. | |||||
| * | |||||
| * @param avctx codec context | |||||
| * @param buf header data | |||||
| * @param bufsize data size, should be at least 24 bytes | |||||
| * @param[out] header_size size of ADX header | |||||
| * @param[out] coeff 2 LPC coefficients, can be NULL | |||||
| * @return data offset or negative error code if header is invalid | |||||
| */ | |||||
| int avpriv_adx_decode_header(AVCodecContext *avctx, const uint8_t *buf, | |||||
| int bufsize, int *header_size, int *coeff); | |||||
| #endif /* AVCODEC_ADX_H */ | #endif /* AVCODEC_ADX_H */ | ||||
| @@ -0,0 +1,104 @@ | |||||
| /* | |||||
| * Copyright (c) 2011 Justin Ruggles | |||||
| * | |||||
| * This file is part of Libav. | |||||
| * | |||||
| * Libav is free software; you can redistribute it and/or | |||||
| * modify it under the terms of the GNU Lesser General Public | |||||
| * License as published by the Free Software Foundation; either | |||||
| * version 2.1 of the License, or (at your option) any later version. | |||||
| * | |||||
| * Libav is distributed in the hope that it will be useful, | |||||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||||
| * Lesser General Public License for more details. | |||||
| * | |||||
| * You should have received a copy of the GNU Lesser General Public | |||||
| * License along with Libav; if not, write to the Free Software | |||||
| * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |||||
| */ | |||||
| /** | |||||
| * @file | |||||
| * ADX audio parser | |||||
| * | |||||
| * Reads header to extradata and splits packets into individual blocks. | |||||
| */ | |||||
| #include "libavutil/intreadwrite.h" | |||||
| #include "parser.h" | |||||
| #include "adx.h" | |||||
| typedef struct ADXParseContext { | |||||
| ParseContext pc; | |||||
| int header_size; | |||||
| int block_size; | |||||
| int buf_pos; | |||||
| } ADXParseContext; | |||||
| #define MIN_HEADER_SIZE 24 | |||||
| static int adx_parse(AVCodecParserContext *s1, | |||||
| AVCodecContext *avctx, | |||||
| const uint8_t **poutbuf, int *poutbuf_size, | |||||
| const uint8_t *buf, int buf_size) | |||||
| { | |||||
| ADXParseContext *s = s1->priv_data; | |||||
| ParseContext *pc = &s->pc; | |||||
| int next = END_NOT_FOUND; | |||||
| if (!avctx->extradata_size) { | |||||
| int ret; | |||||
| ff_combine_frame(pc, END_NOT_FOUND, &buf, &buf_size); | |||||
| if (!s->header_size && pc->index >= MIN_HEADER_SIZE) { | |||||
| if (ret = avpriv_adx_decode_header(avctx, pc->buffer, pc->index, | |||||
| &s->header_size, NULL)) | |||||
| return AVERROR_INVALIDDATA; | |||||
| s->block_size = BLOCK_SIZE * avctx->channels; | |||||
| } | |||||
| if (s->header_size && s->header_size <= pc->index) { | |||||
| avctx->extradata = av_mallocz(s->header_size + FF_INPUT_BUFFER_PADDING_SIZE); | |||||
| if (!avctx->extradata) | |||||
| return AVERROR(ENOMEM); | |||||
| avctx->extradata_size = s->header_size; | |||||
| memcpy(avctx->extradata, pc->buffer, s->header_size); | |||||
| memmove(pc->buffer, pc->buffer + s->header_size, s->header_size); | |||||
| pc->index -= s->header_size; | |||||
| } | |||||
| *poutbuf = NULL; | |||||
| *poutbuf_size = 0; | |||||
| return buf_size; | |||||
| } | |||||
| if (pc->index - s->buf_pos >= s->block_size) { | |||||
| *poutbuf = &pc->buffer[s->buf_pos]; | |||||
| *poutbuf_size = s->block_size; | |||||
| s->buf_pos += s->block_size; | |||||
| return 0; | |||||
| } | |||||
| if (pc->index && s->buf_pos) { | |||||
| memmove(pc->buffer, &pc->buffer[s->buf_pos], pc->index - s->buf_pos); | |||||
| pc->index -= s->buf_pos; | |||||
| s->buf_pos = 0; | |||||
| } | |||||
| if (buf_size + pc->index >= s->block_size) | |||||
| next = s->block_size - pc->index; | |||||
| if (ff_combine_frame(pc, next, &buf, &buf_size) < 0 || !buf_size) { | |||||
| *poutbuf = NULL; | |||||
| *poutbuf_size = 0; | |||||
| return buf_size; | |||||
| } | |||||
| *poutbuf = buf; | |||||
| *poutbuf_size = buf_size; | |||||
| return next; | |||||
| } | |||||
| AVCodecParser ff_adx_parser = { | |||||
| .codec_ids = { CODEC_ID_ADPCM_ADX }, | |||||
| .priv_data_size = sizeof(ADXParseContext), | |||||
| .parser_parse = adx_parse, | |||||
| .parser_close = ff_parse_close, | |||||
| }; | |||||
| @@ -22,6 +22,7 @@ | |||||
| #include "libavutil/intreadwrite.h" | #include "libavutil/intreadwrite.h" | ||||
| #include "avcodec.h" | #include "avcodec.h" | ||||
| #include "adx.h" | #include "adx.h" | ||||
| #include "get_bits.h" | |||||
| /** | /** | ||||
| * @file | * @file | ||||
| @@ -34,136 +35,105 @@ | |||||
| static av_cold int adx_decode_init(AVCodecContext *avctx) | static av_cold int adx_decode_init(AVCodecContext *avctx) | ||||
| { | { | ||||
| ADXContext *c = avctx->priv_data; | |||||
| int ret, header_size; | |||||
| if (avctx->extradata_size < 24) | |||||
| return AVERROR_INVALIDDATA; | |||||
| if ((ret = avpriv_adx_decode_header(avctx, avctx->extradata, | |||||
| avctx->extradata_size, &header_size, | |||||
| c->coeff)) < 0) { | |||||
| av_log(avctx, AV_LOG_ERROR, "error parsing ADX header\n"); | |||||
| return AVERROR_INVALIDDATA; | |||||
| } | |||||
| c->channels = avctx->channels; | |||||
| avctx->sample_fmt = AV_SAMPLE_FMT_S16; | avctx->sample_fmt = AV_SAMPLE_FMT_S16; | ||||
| return 0; | return 0; | ||||
| } | } | ||||
| /* 18 bytes <-> 32 samples */ | |||||
| static void adx_decode(short *out,const unsigned char *in,PREV *prev) | |||||
| /** | |||||
| * Decode 32 samples from 18 bytes. | |||||
| * | |||||
| * A 16-bit scalar value is applied to 32 residuals, which then have a | |||||
| * 2nd-order LPC filter applied to it to form the output signal for a single | |||||
| * channel. | |||||
| */ | |||||
| static int adx_decode(ADXContext *c, int16_t *out, const uint8_t *in, int ch) | |||||
| { | { | ||||
| ADXChannelState *prev = &c->prev[ch]; | |||||
| GetBitContext gb; | |||||
| int scale = AV_RB16(in); | int scale = AV_RB16(in); | ||||
| int i; | int i; | ||||
| int s0,s1,s2,d; | |||||
| int s0, s1, s2, d; | |||||
| // printf("%x ",scale); | |||||
| /* check if this is an EOF packet */ | |||||
| if (scale & 0x8000) | |||||
| return -1; | |||||
| in+=2; | |||||
| init_get_bits(&gb, in + 2, (BLOCK_SIZE - 2) * 8); | |||||
| s1 = prev->s1; | s1 = prev->s1; | ||||
| s2 = prev->s2; | s2 = prev->s2; | ||||
| for(i=0;i<16;i++) { | |||||
| d = in[i]; | |||||
| // d>>=4; if (d&8) d-=16; | |||||
| d = ((signed char)d >> 4); | |||||
| s0 = (BASEVOL*d*scale + SCALE1*s1 - SCALE2*s2)>>14; | |||||
| s2 = s1; | |||||
| s1 = av_clip_int16(s0); | |||||
| *out++=s1; | |||||
| d = in[i]; | |||||
| //d&=15; if (d&8) d-=16; | |||||
| d = ((signed char)(d<<4) >> 4); | |||||
| s0 = (BASEVOL*d*scale + SCALE1*s1 - SCALE2*s2)>>14; | |||||
| for (i = 0; i < BLOCK_SAMPLES; i++) { | |||||
| d = get_sbits(&gb, 4); | |||||
| s0 = ((d << COEFF_BITS) * scale + c->coeff[0] * s1 + c->coeff[1] * s2) >> COEFF_BITS; | |||||
| s2 = s1; | s2 = s1; | ||||
| s1 = av_clip_int16(s0); | s1 = av_clip_int16(s0); | ||||
| *out++=s1; | |||||
| *out = s1; | |||||
| out += c->channels; | |||||
| } | } | ||||
| prev->s1 = s1; | prev->s1 = s1; | ||||
| prev->s2 = s2; | prev->s2 = s2; | ||||
| return 0; | |||||
| } | } | ||||
| static void adx_decode_stereo(short *out,const unsigned char *in,PREV *prev) | |||||
| { | |||||
| short tmp[32*2]; | |||||
| int i; | |||||
| adx_decode(tmp ,in ,prev); | |||||
| adx_decode(tmp+32,in+18,prev+1); | |||||
| for(i=0;i<32;i++) { | |||||
| out[i*2] = tmp[i]; | |||||
| out[i*2+1] = tmp[i+32]; | |||||
| } | |||||
| } | |||||
| /* return data offset or 0 */ | |||||
| static int adx_decode_header(AVCodecContext *avctx,const unsigned char *buf,size_t bufsize) | |||||
| { | |||||
| int offset; | |||||
| if (buf[0]!=0x80) return 0; | |||||
| offset = (AV_RB32(buf)^0x80000000)+4; | |||||
| if (bufsize<offset || memcmp(buf+offset-6,"(c)CRI",6)) return 0; | |||||
| avctx->channels = buf[7]; | |||||
| avctx->sample_rate = AV_RB32(buf+8); | |||||
| avctx->bit_rate = avctx->sample_rate*avctx->channels*18*8/32; | |||||
| return offset; | |||||
| } | |||||
| static int adx_decode_frame(AVCodecContext *avctx, | |||||
| void *data, int *data_size, | |||||
| AVPacket *avpkt) | |||||
| static int adx_decode_frame(AVCodecContext *avctx, void *data, int *data_size, | |||||
| AVPacket *avpkt) | |||||
| { | { | ||||
| const uint8_t *buf0 = avpkt->data; | |||||
| int buf_size = avpkt->size; | |||||
| ADXContext *c = avctx->priv_data; | |||||
| short *samples = data; | |||||
| const uint8_t *buf = buf0; | |||||
| int rest = buf_size; | |||||
| if (!c->header_parsed) { | |||||
| int hdrsize = adx_decode_header(avctx,buf,rest); | |||||
| if (hdrsize==0) return -1; | |||||
| c->header_parsed = 1; | |||||
| buf += hdrsize; | |||||
| rest -= hdrsize; | |||||
| int buf_size = avpkt->size; | |||||
| ADXContext *c = avctx->priv_data; | |||||
| int16_t *samples = data; | |||||
| const uint8_t *buf = avpkt->data; | |||||
| int num_blocks, ch; | |||||
| if (c->eof) { | |||||
| *data_size = 0; | |||||
| return buf_size; | |||||
| } | } | ||||
| /* 18 bytes of data are expanded into 32*2 bytes of audio, | /* 18 bytes of data are expanded into 32*2 bytes of audio, | ||||
| so guard against buffer overflows */ | so guard against buffer overflows */ | ||||
| if(rest/18 > *data_size/64) | |||||
| rest = (*data_size/64) * 18; | |||||
| if (c->in_temp) { | |||||
| int copysize = 18*avctx->channels - c->in_temp; | |||||
| memcpy(c->dec_temp+c->in_temp,buf,copysize); | |||||
| rest -= copysize; | |||||
| buf += copysize; | |||||
| if (avctx->channels==1) { | |||||
| adx_decode(samples,c->dec_temp,c->prev); | |||||
| samples += 32; | |||||
| } else { | |||||
| adx_decode_stereo(samples,c->dec_temp,c->prev); | |||||
| samples += 32*2; | |||||
| } | |||||
| num_blocks = buf_size / (BLOCK_SIZE * c->channels); | |||||
| if (num_blocks > *data_size / (BLOCK_SAMPLES * c->channels)) { | |||||
| buf_size = (*data_size / (BLOCK_SAMPLES * c->channels)) * BLOCK_SIZE; | |||||
| num_blocks = buf_size / (BLOCK_SIZE * c->channels); | |||||
| } | } | ||||
| // | |||||
| if (avctx->channels==1) { | |||||
| while(rest>=18) { | |||||
| adx_decode(samples,buf,c->prev); | |||||
| rest-=18; | |||||
| buf+=18; | |||||
| samples+=32; | |||||
| } | |||||
| } else { | |||||
| while(rest>=18*2) { | |||||
| adx_decode_stereo(samples,buf,c->prev); | |||||
| rest-=18*2; | |||||
| buf+=18*2; | |||||
| samples+=32*2; | |||||
| if (!buf_size || buf_size % (BLOCK_SIZE * avctx->channels)) { | |||||
| if (buf_size >= 4 && (AV_RB16(buf) & 0x8000)) { | |||||
| c->eof = 1; | |||||
| *data_size = 0; | |||||
| return avpkt->size; | |||||
| } | } | ||||
| return AVERROR_INVALIDDATA; | |||||
| } | } | ||||
| // | |||||
| c->in_temp = rest; | |||||
| if (rest) { | |||||
| memcpy(c->dec_temp,buf,rest); | |||||
| buf+=rest; | |||||
| while (num_blocks--) { | |||||
| for (ch = 0; ch < c->channels; ch++) { | |||||
| if (adx_decode(c, samples + ch, buf, ch)) { | |||||
| c->eof = 1; | |||||
| buf = avpkt->data + avpkt->size; | |||||
| break; | |||||
| } | |||||
| buf_size -= BLOCK_SIZE; | |||||
| buf += BLOCK_SIZE; | |||||
| } | |||||
| samples += BLOCK_SAMPLES * c->channels; | |||||
| } | } | ||||
| *data_size = (uint8_t*)samples - (uint8_t*)data; | *data_size = (uint8_t*)samples - (uint8_t*)data; | ||||
| // printf("%d:%d ",buf-buf0,*data_size); fflush(stdout); | |||||
| return buf-buf0; | |||||
| return buf - avpkt->data; | |||||
| } | } | ||||
| AVCodec ff_adpcm_adx_decoder = { | AVCodec ff_adpcm_adx_decoder = { | ||||
| @@ -173,6 +143,5 @@ AVCodec ff_adpcm_adx_decoder = { | |||||
| .priv_data_size = sizeof(ADXContext), | .priv_data_size = sizeof(ADXContext), | ||||
| .init = adx_decode_init, | .init = adx_decode_init, | ||||
| .decode = adx_decode_frame, | .decode = adx_decode_frame, | ||||
| .long_name = NULL_IF_CONFIG_SMALL("SEGA CRI ADX ADPCM"), | |||||
| .long_name = NULL_IF_CONFIG_SMALL("SEGA CRI ADX ADPCM"), | |||||
| }; | }; | ||||
| @@ -22,6 +22,7 @@ | |||||
| #include "libavutil/intreadwrite.h" | #include "libavutil/intreadwrite.h" | ||||
| #include "avcodec.h" | #include "avcodec.h" | ||||
| #include "adx.h" | #include "adx.h" | ||||
| #include "put_bits.h" | |||||
| /** | /** | ||||
| * @file | * @file | ||||
| @@ -34,8 +35,10 @@ | |||||
| /* 18 bytes <-> 32 samples */ | /* 18 bytes <-> 32 samples */ | ||||
| static void adx_encode(unsigned char *adx,const short *wav,PREV *prev) | |||||
| static void adx_encode(ADXContext *c, unsigned char *adx, const short *wav, | |||||
| ADXChannelState *prev) | |||||
| { | { | ||||
| PutBitContext pb; | |||||
| int scale; | int scale; | ||||
| int i; | int i; | ||||
| int s0,s1,s2,d; | int s0,s1,s2,d; | ||||
| @@ -47,7 +50,7 @@ static void adx_encode(unsigned char *adx,const short *wav,PREV *prev) | |||||
| s2 = prev->s2; | s2 = prev->s2; | ||||
| for(i=0;i<32;i++) { | for(i=0;i<32;i++) { | ||||
| s0 = wav[i]; | s0 = wav[i]; | ||||
| d = ((s0<<14) - SCALE1*s1 + SCALE2*s2)/BASEVOL; | |||||
| d = ((s0 << COEFF_BITS) - c->coeff[0] * s1 - c->coeff[1] * s2) >> COEFF_BITS; | |||||
| data[i]=d; | data[i]=d; | ||||
| if (max<d) max=d; | if (max<d) max=d; | ||||
| if (min>d) min=d; | if (min>d) min=d; | ||||
| @@ -71,9 +74,10 @@ static void adx_encode(unsigned char *adx,const short *wav,PREV *prev) | |||||
| AV_WB16(adx, scale); | AV_WB16(adx, scale); | ||||
| for(i=0;i<16;i++) { | |||||
| adx[i+2] = ((data[i*2]/scale)<<4) | ((data[i*2+1]/scale)&0xf); | |||||
| } | |||||
| init_put_bits(&pb, adx + 2, 16); | |||||
| for (i = 0; i < 32; i++) | |||||
| put_sbits(&pb, 4, av_clip(data[i]/scale, -8, 7)); | |||||
| flush_put_bits(&pb); | |||||
| } | } | ||||
| static int adx_encode_header(AVCodecContext *avctx,unsigned char *buf,size_t bufsize) | static int adx_encode_header(AVCodecContext *avctx,unsigned char *buf,size_t bufsize) | ||||
| @@ -101,19 +105,24 @@ static int adx_encode_header(AVCodecContext *avctx,unsigned char *buf,size_t buf | |||||
| } adxhdr; /* big endian */ | } adxhdr; /* big endian */ | ||||
| /* offset-6 "(c)CRI" */ | /* offset-6 "(c)CRI" */ | ||||
| #endif | #endif | ||||
| ADXContext *c = avctx->priv_data; | |||||
| AV_WB32(buf+0x00,0x80000000|0x20); | AV_WB32(buf+0x00,0x80000000|0x20); | ||||
| AV_WB32(buf+0x04,0x03120400|avctx->channels); | AV_WB32(buf+0x04,0x03120400|avctx->channels); | ||||
| AV_WB32(buf+0x08,avctx->sample_rate); | AV_WB32(buf+0x08,avctx->sample_rate); | ||||
| AV_WB32(buf+0x0c,0); /* FIXME: set after */ | AV_WB32(buf+0x0c,0); /* FIXME: set after */ | ||||
| AV_WB32(buf+0x10,0x01040300); | |||||
| AV_WB32(buf+0x14,0x00000000); | |||||
| AV_WB32(buf+0x18,0x00000000); | |||||
| memcpy(buf+0x1c,"\0\0(c)CRI",8); | |||||
| AV_WB16(buf + 0x10, c->cutoff); | |||||
| AV_WB32(buf + 0x12, 0x03000000); | |||||
| AV_WB32(buf + 0x16, 0x00000000); | |||||
| AV_WB32(buf + 0x1a, 0x00000000); | |||||
| memcpy (buf + 0x1e, "(c)CRI", 6); | |||||
| return 0x20+4; | return 0x20+4; | ||||
| } | } | ||||
| static av_cold int adx_encode_init(AVCodecContext *avctx) | static av_cold int adx_encode_init(AVCodecContext *avctx) | ||||
| { | { | ||||
| ADXContext *c = avctx->priv_data; | |||||
| if (avctx->channels > 2) | if (avctx->channels > 2) | ||||
| return -1; /* only stereo or mono =) */ | return -1; /* only stereo or mono =) */ | ||||
| avctx->frame_size = 32; | avctx->frame_size = 32; | ||||
| @@ -123,6 +132,10 @@ static av_cold int adx_encode_init(AVCodecContext *avctx) | |||||
| // avctx->bit_rate = avctx->sample_rate*avctx->channels*18*8/32; | // avctx->bit_rate = avctx->sample_rate*avctx->channels*18*8/32; | ||||
| /* the cutoff can be adjusted, but this seems to work pretty well */ | |||||
| c->cutoff = 500; | |||||
| ff_adx_calculate_coeffs(c->cutoff, avctx->sample_rate, COEFF_BITS, c->coeff); | |||||
| av_log(avctx, AV_LOG_DEBUG, "adx encode init\n"); | av_log(avctx, AV_LOG_DEBUG, "adx encode init\n"); | ||||
| return 0; | return 0; | ||||
| @@ -158,7 +171,7 @@ static int adx_encode_frame(AVCodecContext *avctx, | |||||
| if (avctx->channels==1) { | if (avctx->channels==1) { | ||||
| while(rest>=32) { | while(rest>=32) { | ||||
| adx_encode(dst,samples,c->prev); | |||||
| adx_encode(c, dst, samples, c->prev); | |||||
| dst+=18; | dst+=18; | ||||
| samples+=32; | samples+=32; | ||||
| rest-=32; | rest-=32; | ||||
| @@ -173,8 +186,8 @@ static int adx_encode_frame(AVCodecContext *avctx, | |||||
| tmpbuf[i+32] = samples[i*2+1]; | tmpbuf[i+32] = samples[i*2+1]; | ||||
| } | } | ||||
| adx_encode(dst,tmpbuf,c->prev); | |||||
| adx_encode(dst+18,tmpbuf+32,c->prev+1); | |||||
| adx_encode(c, dst, tmpbuf, c->prev); | |||||
| adx_encode(c, dst + 18, tmpbuf + 32, c->prev + 1); | |||||
| dst+=18*2; | dst+=18*2; | ||||
| samples+=32*2; | samples+=32*2; | ||||
| rest-=32*2; | rest-=32*2; | ||||
| @@ -414,6 +414,7 @@ void avcodec_register_all(void) | |||||
| REGISTER_PARSER (AAC, aac); | REGISTER_PARSER (AAC, aac); | ||||
| REGISTER_PARSER (AAC_LATM, aac_latm); | REGISTER_PARSER (AAC_LATM, aac_latm); | ||||
| REGISTER_PARSER (AC3, ac3); | REGISTER_PARSER (AC3, ac3); | ||||
| REGISTER_PARSER (ADX, adx); | |||||
| REGISTER_PARSER (CAVSVIDEO, cavsvideo); | REGISTER_PARSER (CAVSVIDEO, cavsvideo); | ||||
| REGISTER_PARSER (DCA, dca); | REGISTER_PARSER (DCA, dca); | ||||
| REGISTER_PARSER (DIRAC, dirac); | REGISTER_PARSER (DIRAC, dirac); | ||||
| @@ -690,7 +690,7 @@ static void do_apply_filter(APEContext *ctx, int version, APEFilter *f, | |||||
| /* Update the adaption coefficients */ | /* Update the adaption coefficients */ | ||||
| absres = FFABS(res); | absres = FFABS(res); | ||||
| if (absres) | if (absres) | ||||
| *f->adaptcoeffs = ((res & (1<<31)) - (1<<30)) >> | |||||
| *f->adaptcoeffs = ((res & (-1<<31)) ^ (-1<<30)) >> | |||||
| (25 + (absres <= f->avg*3) + (absres <= f->avg*4/3)); | (25 + (absres <= f->avg*3) + (absres <= f->avg*4/3)); | ||||
| else | else | ||||
| *f->adaptcoeffs = 0; | *f->adaptcoeffs = 0; | ||||
| @@ -1259,7 +1259,7 @@ struct AVCodecInternal; | |||||
| typedef struct AVCodecContext { | typedef struct AVCodecContext { | ||||
| /** | /** | ||||
| * information on struct for av_log | * information on struct for av_log | ||||
| * - set by avcodec_alloc_context | |||||
| * - set by avcodec_alloc_context3 | |||||
| */ | */ | ||||
| const AVClass *av_class; | const AVClass *av_class; | ||||
| /** | /** | ||||
| @@ -2959,8 +2959,8 @@ typedef struct AVCodecContext { | |||||
| * For SUBTITLE_ASS subtitle type, it should contain the whole ASS | * For SUBTITLE_ASS subtitle type, it should contain the whole ASS | ||||
| * [Script Info] and [V4+ Styles] section, plus the [Events] line and | * [Script Info] and [V4+ Styles] section, plus the [Events] line and | ||||
| * the Format line following. It shouldn't include any Dialogue line. | * the Format line following. It shouldn't include any Dialogue line. | ||||
| * - encoding: Set/allocated/freed by user (before avcodec_open()) | |||||
| * - decoding: Set/allocated/freed by libavcodec (by avcodec_open()) | |||||
| * - encoding: Set/allocated/freed by user (before avcodec_open2()) | |||||
| * - decoding: Set/allocated/freed by libavcodec (by avcodec_open2()) | |||||
| */ | */ | ||||
| uint8_t *subtitle_header; | uint8_t *subtitle_header; | ||||
| int subtitle_header_size; | int subtitle_header_size; | ||||
| @@ -3853,7 +3853,7 @@ AVCodecContext *avcodec_alloc_context2(enum AVMediaType); | |||||
| * resulting struct can be deallocated by simply calling av_free(). | * resulting struct can be deallocated by simply calling av_free(). | ||||
| * | * | ||||
| * @param codec if non-NULL, allocate private data and initialize defaults | * @param codec if non-NULL, allocate private data and initialize defaults | ||||
| * for the given codec. It is illegal to then call avcodec_open() | |||||
| * for the given codec. It is illegal to then call avcodec_open2() | |||||
| * with a different codec. | * with a different codec. | ||||
| * | * | ||||
| * @return An AVCodecContext filled with default values or NULL on failure. | * @return An AVCodecContext filled with default values or NULL on failure. | ||||
| @@ -3864,7 +3864,7 @@ AVCodecContext *avcodec_alloc_context3(AVCodec *codec); | |||||
| /** | /** | ||||
| * Copy the settings of the source AVCodecContext into the destination | * Copy the settings of the source AVCodecContext into the destination | ||||
| * AVCodecContext. The resulting destination codec context will be | * AVCodecContext. The resulting destination codec context will be | ||||
| * unopened, i.e. you are required to call avcodec_open() before you | |||||
| * unopened, i.e. you are required to call avcodec_open2() before you | |||||
| * can use this AVCodecContext to decode/encode video/audio data. | * can use this AVCodecContext to decode/encode video/audio data. | ||||
| * | * | ||||
| * @param dest target codec context, should be initialized with | * @param dest target codec context, should be initialized with | ||||
| @@ -3928,7 +3928,7 @@ enum PixelFormat avcodec_default_get_format(struct AVCodecContext *s, const enum | |||||
| #if FF_API_THREAD_INIT | #if FF_API_THREAD_INIT | ||||
| /** | /** | ||||
| * @deprecated Set s->thread_count before calling avcodec_open() instead of calling this. | |||||
| * @deprecated Set s->thread_count before calling avcodec_open2() instead of calling this. | |||||
| */ | */ | ||||
| attribute_deprecated | attribute_deprecated | ||||
| int avcodec_thread_init(AVCodecContext *s, int thread_count); | int avcodec_thread_init(AVCodecContext *s, int thread_count); | ||||
| @@ -3974,7 +3974,7 @@ int avcodec_open(AVCodecContext *avctx, AVCodec *codec); | |||||
| /** | /** | ||||
| * Initialize the AVCodecContext to use the given AVCodec. Prior to using this | * Initialize the AVCodecContext to use the given AVCodec. Prior to using this | ||||
| * function the context has to be allocated with avcodec_alloc_context(). | |||||
| * function the context has to be allocated with avcodec_alloc_context3(). | |||||
| * | * | ||||
| * The functions avcodec_find_decoder_by_name(), avcodec_find_encoder_by_name(), | * The functions avcodec_find_decoder_by_name(), avcodec_find_encoder_by_name(), | ||||
| * avcodec_find_decoder() and avcodec_find_encoder() provide an easy way for | * avcodec_find_decoder() and avcodec_find_encoder() provide an easy way for | ||||
| @@ -3989,9 +3989,9 @@ int avcodec_open(AVCodecContext *avctx, AVCodec *codec); | |||||
| * if (!codec) | * if (!codec) | ||||
| * exit(1); | * exit(1); | ||||
| * | * | ||||
| * context = avcodec_alloc_context(); | |||||
| * context = avcodec_alloc_context3(codec); | |||||
| * | * | ||||
| * if (avcodec_open(context, codec, opts) < 0) | |||||
| * if (avcodec_open2(context, codec, opts) < 0) | |||||
| * exit(1); | * exit(1); | ||||
| * @endcode | * @endcode | ||||
| * | * | ||||
| @@ -273,6 +273,10 @@ static av_cold void init_cplscales_table (COOKContext *q) { | |||||
| */ | */ | ||||
| static inline int decode_bytes(const uint8_t* inbuffer, uint8_t* out, int bytes){ | static inline int decode_bytes(const uint8_t* inbuffer, uint8_t* out, int bytes){ | ||||
| static const uint32_t tab[4] = { | |||||
| AV_BE2NE32C(0x37c511f2), AV_BE2NE32C(0xf237c511), | |||||
| AV_BE2NE32C(0x11f237c5), AV_BE2NE32C(0xc511f237), | |||||
| }; | |||||
| int i, off; | int i, off; | ||||
| uint32_t c; | uint32_t c; | ||||
| const uint32_t* buf; | const uint32_t* buf; | ||||
| @@ -285,7 +289,7 @@ static inline int decode_bytes(const uint8_t* inbuffer, uint8_t* out, int bytes) | |||||
| off = (intptr_t)inbuffer & 3; | off = (intptr_t)inbuffer & 3; | ||||
| buf = (const uint32_t*) (inbuffer - off); | buf = (const uint32_t*) (inbuffer - off); | ||||
| c = av_be2ne32((0x37c511f2 >> (off*8)) | (0x37c511f2 << (32-(off*8)))); | |||||
| c = tab[off]; | |||||
| bytes += 3 + off; | bytes += 3 + off; | ||||
| for (i = 0; i < bytes/4; i++) | for (i = 0; i < bytes/4; i++) | ||||
| obuf[i] = c ^ buf[i]; | obuf[i] = c ^ buf[i]; | ||||
| @@ -1075,7 +1079,7 @@ static av_cold int cook_decode_init(AVCodecContext *avctx) | |||||
| q->subpacket[s].subbands = bytestream_get_be16(&edata_ptr); | q->subpacket[s].subbands = bytestream_get_be16(&edata_ptr); | ||||
| extradata_size -= 8; | extradata_size -= 8; | ||||
| } | } | ||||
| if (extradata_size >= 8){ | |||||
| if (extradata_size >= 8) { | |||||
| bytestream_get_be32(&edata_ptr); //Unknown unused | bytestream_get_be32(&edata_ptr); //Unknown unused | ||||
| q->subpacket[s].js_subband_start = bytestream_get_be16(&edata_ptr); | q->subpacket[s].js_subband_start = bytestream_get_be16(&edata_ptr); | ||||
| q->subpacket[s].js_vlc_bits = bytestream_get_be16(&edata_ptr); | q->subpacket[s].js_vlc_bits = bytestream_get_be16(&edata_ptr); | ||||
| @@ -680,7 +680,8 @@ static int dnxhd_encode_rdo(AVCodecContext *avctx, DNXHDEncContext *ctx) | |||||
| int qscale = 1; | int qscale = 1; | ||||
| int mb = y*ctx->m.mb_width+x; | int mb = y*ctx->m.mb_width+x; | ||||
| for (q = 1; q < avctx->qmax; q++) { | for (q = 1; q < avctx->qmax; q++) { | ||||
| unsigned score = ctx->mb_rc[q][mb].bits*lambda+(ctx->mb_rc[q][mb].ssd<<LAMBDA_FRAC_BITS); | |||||
| unsigned score = ctx->mb_rc[q][mb].bits*lambda+ | |||||
| ((unsigned)ctx->mb_rc[q][mb].ssd<<LAMBDA_FRAC_BITS); | |||||
| if (score < min) { | if (score < min) { | ||||
| min = score; | min = score; | ||||
| qscale = q; | qscale = q; | ||||
| @@ -707,7 +708,7 @@ static int dnxhd_encode_rdo(AVCodecContext *avctx, DNXHDEncContext *ctx) | |||||
| lambda = (lambda+last_higher)>>1; | lambda = (lambda+last_higher)>>1; | ||||
| else | else | ||||
| lambda -= down_step; | lambda -= down_step; | ||||
| down_step *= 5; // XXX tune ? | |||||
| down_step = FFMIN((int64_t)down_step*5, INT_MAX); | |||||
| up_step = 1<<LAMBDA_FRAC_BITS; | up_step = 1<<LAMBDA_FRAC_BITS; | ||||
| lambda = FFMAX(1, lambda); | lambda = FFMAX(1, lambda); | ||||
| if (lambda == last_lower) | if (lambda == last_lower) | ||||
| @@ -364,7 +364,7 @@ typedef struct BlockInfo { | |||||
| uint8_t pos; /* position in block */ | uint8_t pos; /* position in block */ | ||||
| void (*idct_put)(uint8_t *dest, int line_size, DCTELEM *block); | void (*idct_put)(uint8_t *dest, int line_size, DCTELEM *block); | ||||
| uint8_t partial_bit_count; | uint8_t partial_bit_count; | ||||
| uint16_t partial_bit_buffer; | |||||
| uint32_t partial_bit_buffer; | |||||
| int shift_offset; | int shift_offset; | ||||
| } BlockInfo; | } BlockInfo; | ||||
| @@ -392,8 +392,7 @@ static void dv_decode_ac(GetBitContext *gb, BlockInfo *mb, DCTELEM *block) | |||||
| /* if we must parse a partial VLC, we do it here */ | /* if we must parse a partial VLC, we do it here */ | ||||
| if (partial_bit_count > 0) { | if (partial_bit_count > 0) { | ||||
| re_cache = ((unsigned)re_cache >> partial_bit_count) | | |||||
| (mb->partial_bit_buffer << (sizeof(re_cache) * 8 - partial_bit_count)); | |||||
| re_cache = re_cache >> partial_bit_count | mb->partial_bit_buffer; | |||||
| re_index -= partial_bit_count; | re_index -= partial_bit_count; | ||||
| mb->partial_bit_count = 0; | mb->partial_bit_count = 0; | ||||
| } | } | ||||
| @@ -416,7 +415,7 @@ static void dv_decode_ac(GetBitContext *gb, BlockInfo *mb, DCTELEM *block) | |||||
| if (re_index + vlc_len > last_index) { | if (re_index + vlc_len > last_index) { | ||||
| /* should be < 16 bits otherwise a codeword could have been parsed */ | /* should be < 16 bits otherwise a codeword could have been parsed */ | ||||
| mb->partial_bit_count = last_index - re_index; | mb->partial_bit_count = last_index - re_index; | ||||
| mb->partial_bit_buffer = NEG_USR32(re_cache, mb->partial_bit_count); | |||||
| mb->partial_bit_buffer = re_cache & ~(-1u >> mb->partial_bit_count); | |||||
| re_index = last_index; | re_index = last_index; | ||||
| break; | break; | ||||
| } | } | ||||
| @@ -112,9 +112,9 @@ static int fraps2_decode_plane(FrapsContext *s, uint8_t *dst, int stride, int w, | |||||
| */ | */ | ||||
| if(j) dst[i] += dst[i - stride]; | if(j) dst[i] += dst[i - stride]; | ||||
| else if(Uoff) dst[i] += 0x80; | else if(Uoff) dst[i] += 0x80; | ||||
| if(get_bits_left(&gb) < 0){ | |||||
| if (get_bits_left(&gb) < 0) { | |||||
| free_vlc(&vlc); | free_vlc(&vlc); | ||||
| return -1; | |||||
| return AVERROR_INVALIDDATA; | |||||
| } | } | ||||
| } | } | ||||
| dst += stride; | dst += stride; | ||||
| @@ -96,11 +96,11 @@ static int gif_read_image(GifState *s) | |||||
| n = (1 << bits_per_pixel); | n = (1 << bits_per_pixel); | ||||
| spal = palette; | spal = palette; | ||||
| for(i = 0; i < n; i++) { | for(i = 0; i < n; i++) { | ||||
| s->image_palette[i] = (0xff << 24) | AV_RB24(spal); | |||||
| s->image_palette[i] = (0xffu << 24) | AV_RB24(spal); | |||||
| spal += 3; | spal += 3; | ||||
| } | } | ||||
| for(; i < 256; i++) | for(; i < 256; i++) | ||||
| s->image_palette[i] = (0xff << 24); | |||||
| s->image_palette[i] = (0xffu << 24); | |||||
| /* handle transparency */ | /* handle transparency */ | ||||
| if (s->transparent_color_index >= 0) | if (s->transparent_color_index >= 0) | ||||
| s->image_palette[s->transparent_color_index] = 0; | s->image_palette[s->transparent_color_index] = 0; | ||||
| @@ -193,7 +193,7 @@ retry: | |||||
| int w, h, q, res; | int w, h, q, res; | ||||
| if (buf[0] != 'V' || buf_size < 12) { | if (buf[0] != 'V' || buf_size < 12) { | ||||
| av_log(avctx, AV_LOG_ERROR, "invalid nuv video frame (wrong codec_tag?)\n"); | av_log(avctx, AV_LOG_ERROR, "invalid nuv video frame (wrong codec_tag?)\n"); | ||||
| return -1; | |||||
| return AVERROR_INVALIDDATA; | |||||
| } | } | ||||
| w = AV_RL16(&buf[6]); | w = AV_RL16(&buf[6]); | ||||
| h = AV_RL16(&buf[8]); | h = AV_RL16(&buf[8]); | ||||
| @@ -658,7 +658,7 @@ static void frame_thread_free(AVCodecContext *avctx, int thread_count) | |||||
| pthread_cond_signal(&p->input_cond); | pthread_cond_signal(&p->input_cond); | ||||
| pthread_mutex_unlock(&p->mutex); | pthread_mutex_unlock(&p->mutex); | ||||
| if(p->thread) | |||||
| if (p->thread) | |||||
| pthread_join(p->thread, NULL); | pthread_join(p->thread, NULL); | ||||
| if (codec->close) | if (codec->close) | ||||
| @@ -332,7 +332,6 @@ static void qtrle_decode_32bpp(QtrleContext *s, int stream_ptr, int row_ptr, int | |||||
| int rle_code; | int rle_code; | ||||
| int pixel_ptr; | int pixel_ptr; | ||||
| int row_inc = s->frame.linesize[0]; | int row_inc = s->frame.linesize[0]; | ||||
| unsigned char a, r, g, b; | |||||
| unsigned int argb; | unsigned int argb; | ||||
| unsigned char *rgb = s->frame.data[0]; | unsigned char *rgb = s->frame.data[0]; | ||||
| int pixel_limit = s->frame.linesize[0] * s->avctx->height; | int pixel_limit = s->frame.linesize[0] * s->avctx->height; | ||||
| @@ -352,16 +351,13 @@ static void qtrle_decode_32bpp(QtrleContext *s, int stream_ptr, int row_ptr, int | |||||
| /* decode the run length code */ | /* decode the run length code */ | ||||
| rle_code = -rle_code; | rle_code = -rle_code; | ||||
| CHECK_STREAM_PTR(4); | CHECK_STREAM_PTR(4); | ||||
| a = s->buf[stream_ptr++]; | |||||
| r = s->buf[stream_ptr++]; | |||||
| g = s->buf[stream_ptr++]; | |||||
| b = s->buf[stream_ptr++]; | |||||
| argb = (a << 24) | (r << 16) | (g << 8) | (b << 0); | |||||
| argb = AV_RB32(s->buf + stream_ptr); | |||||
| stream_ptr += 4; | |||||
| CHECK_PIXEL_PTR(rle_code * 4); | CHECK_PIXEL_PTR(rle_code * 4); | ||||
| while (rle_code--) { | while (rle_code--) { | ||||
| *(unsigned int *)(&rgb[pixel_ptr]) = argb; | |||||
| AV_WN32A(rgb + pixel_ptr, argb); | |||||
| pixel_ptr += 4; | pixel_ptr += 4; | ||||
| } | } | ||||
| } else { | } else { | ||||
| @@ -370,13 +366,10 @@ static void qtrle_decode_32bpp(QtrleContext *s, int stream_ptr, int row_ptr, int | |||||
| /* copy pixels directly to output */ | /* copy pixels directly to output */ | ||||
| while (rle_code--) { | while (rle_code--) { | ||||
| a = s->buf[stream_ptr++]; | |||||
| r = s->buf[stream_ptr++]; | |||||
| g = s->buf[stream_ptr++]; | |||||
| b = s->buf[stream_ptr++]; | |||||
| argb = (a << 24) | (r << 16) | (g << 8) | (b << 0); | |||||
| *(unsigned int *)(&rgb[pixel_ptr]) = argb; | |||||
| pixel_ptr += 4; | |||||
| argb = AV_RB32(s->buf + stream_ptr); | |||||
| AV_WN32A(rgb + pixel_ptr, argb); | |||||
| stream_ptr += 4; | |||||
| pixel_ptr += 4; | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| @@ -933,7 +933,7 @@ static void rv34_pred_4x4_block(RV34DecContext *r, uint8_t *dst, int stride, int | |||||
| if(itype == VERT_LEFT_PRED) itype = VERT_LEFT_PRED_RV40_NODOWN; | if(itype == VERT_LEFT_PRED) itype = VERT_LEFT_PRED_RV40_NODOWN; | ||||
| } | } | ||||
| if(!right && up){ | if(!right && up){ | ||||
| topleft = dst[-stride + 3] * 0x01010101; | |||||
| topleft = dst[-stride + 3] * 0x01010101u; | |||||
| prev = (uint8_t*)&topleft; | prev = (uint8_t*)&topleft; | ||||
| } | } | ||||
| r->h.pred4x4[itype](dst, prev, stride); | r->h.pred4x4[itype](dst, prev, stride); | ||||
| @@ -28,7 +28,7 @@ | |||||
| static inline void dxt1_decode_pixels(const uint8_t *s, uint32_t *d, | static inline void dxt1_decode_pixels(const uint8_t *s, uint32_t *d, | ||||
| unsigned int qstride, unsigned int flag, | unsigned int qstride, unsigned int flag, | ||||
| uint64_t alpha) { | uint64_t alpha) { | ||||
| unsigned int x, y, c0, c1, a = (!flag * 255) << 24; | |||||
| unsigned int x, y, c0, c1, a = (!flag * 255u) << 24; | |||||
| unsigned int rb0, rb1, rb2, rb3, g0, g1, g2, g3; | unsigned int rb0, rb1, rb2, rb3, g0, g1, g2, g3; | ||||
| uint32_t colors[4], pixels; | uint32_t colors[4], pixels; | ||||
| @@ -290,8 +290,8 @@ static void mc_block(Plane *p, uint8_t *dst, const uint8_t *src, int stride, int | |||||
| void ff_snow_pred_block(SnowContext *s, uint8_t *dst, uint8_t *tmp, int stride, int sx, int sy, int b_w, int b_h, BlockNode *block, int plane_index, int w, int h){ | void ff_snow_pred_block(SnowContext *s, uint8_t *dst, uint8_t *tmp, int stride, int sx, int sy, int b_w, int b_h, BlockNode *block, int plane_index, int w, int h){ | ||||
| if(block->type & BLOCK_INTRA){ | if(block->type & BLOCK_INTRA){ | ||||
| int x, y; | int x, y; | ||||
| const int color = block->color[plane_index]; | |||||
| const int color4= color*0x01010101; | |||||
| const unsigned color = block->color[plane_index]; | |||||
| const unsigned color4 = color*0x01010101; | |||||
| if(b_w==32){ | if(b_w==32){ | ||||
| for(y=0; y < b_h; y++){ | for(y=0; y < b_h; y++){ | ||||
| *(uint32_t*)&dst[0 + y*stride]= color4; | *(uint32_t*)&dst[0 + y*stride]= color4; | ||||
| @@ -154,8 +154,8 @@ typedef struct SnowContext{ | |||||
| Plane plane[MAX_PLANES]; | Plane plane[MAX_PLANES]; | ||||
| BlockNode *block; | BlockNode *block; | ||||
| #define ME_CACHE_SIZE 1024 | #define ME_CACHE_SIZE 1024 | ||||
| int me_cache[ME_CACHE_SIZE]; | |||||
| int me_cache_generation; | |||||
| unsigned me_cache[ME_CACHE_SIZE]; | |||||
| unsigned me_cache_generation; | |||||
| slice_buffer sb; | slice_buffer sb; | ||||
| int memc_only; | int memc_only; | ||||
| @@ -958,7 +958,8 @@ static av_always_inline int check_block(SnowContext *s, int mb_x, int mb_y, int | |||||
| const int b_stride= s->b_width << s->block_max_depth; | const int b_stride= s->b_width << s->block_max_depth; | ||||
| BlockNode *block= &s->block[mb_x + mb_y * b_stride]; | BlockNode *block= &s->block[mb_x + mb_y * b_stride]; | ||||
| BlockNode backup= *block; | BlockNode backup= *block; | ||||
| int rd, index, value; | |||||
| unsigned value; | |||||
| int rd, index; | |||||
| assert(mb_x>=0 && mb_y>=0); | assert(mb_x>=0 && mb_y>=0); | ||||
| assert(mb_x<b_stride); | assert(mb_x<b_stride); | ||||
| @@ -1003,7 +1004,8 @@ static av_always_inline int check_4block_inter(SnowContext *s, int mb_x, int mb_ | |||||
| const int b_stride= s->b_width << s->block_max_depth; | const int b_stride= s->b_width << s->block_max_depth; | ||||
| BlockNode *block= &s->block[mb_x + mb_y * b_stride]; | BlockNode *block= &s->block[mb_x + mb_y * b_stride]; | ||||
| BlockNode backup[4]= {block[0], block[1], block[b_stride], block[b_stride+1]}; | BlockNode backup[4]= {block[0], block[1], block[b_stride], block[b_stride+1]}; | ||||
| int rd, index, value; | |||||
| unsigned value; | |||||
| int rd, index; | |||||
| assert(mb_x>=0 && mb_y>=0); | assert(mb_x>=0 && mb_y>=0); | ||||
| assert(mb_x<b_stride); | assert(mb_x<b_stride); | ||||
| @@ -317,9 +317,9 @@ static int svq1_decode_motion_vector (GetBitContext *bitbuf, svq1_pmv *mv, svq1_ | |||||
| /* add median of motion vector predictors and clip result */ | /* add median of motion vector predictors and clip result */ | ||||
| if (i == 1) | if (i == 1) | ||||
| mv->y = ((diff + mid_pred(pmv[0]->y, pmv[1]->y, pmv[2]->y)) << 26) >> 26; | |||||
| mv->y = sign_extend(diff + mid_pred(pmv[0]->y, pmv[1]->y, pmv[2]->y), 6); | |||||
| else | else | ||||
| mv->x = ((diff + mid_pred(pmv[0]->x, pmv[1]->x, pmv[2]->x)) << 26) >> 26; | |||||
| mv->x = sign_extend(diff + mid_pred(pmv[0]->x, pmv[1]->x, pmv[2]->x), 6); | |||||
| } | } | ||||
| return 0; | return 0; | ||||
| @@ -113,10 +113,6 @@ static void svq1_write_header(SVQ1Context *s, int frame_type) | |||||
| #define QUALITY_THRESHOLD 100 | #define QUALITY_THRESHOLD 100 | ||||
| #define THRESHOLD_MULTIPLIER 0.6 | #define THRESHOLD_MULTIPLIER 0.6 | ||||
| #if HAVE_ALTIVEC | |||||
| #undef vector | |||||
| #endif | |||||
| static int encode_block(SVQ1Context *s, uint8_t *src, uint8_t *ref, uint8_t *decoded, int stride, int level, int threshold, int lambda, int intra){ | static int encode_block(SVQ1Context *s, uint8_t *src, uint8_t *ref, uint8_t *decoded, int stride, int level, int threshold, int lambda, int intra){ | ||||
| int count, y, x, i, j, split, best_mean, best_score, best_count; | int count, y, x, i, j, split, best_mean, best_score, best_count; | ||||
| int best_vector[6]; | int best_vector[6]; | ||||
| @@ -160,7 +156,7 @@ static int encode_block(SVQ1Context *s, uint8_t *src, uint8_t *ref, uint8_t *dec | |||||
| } | } | ||||
| best_count=0; | best_count=0; | ||||
| best_score -= ((block_sum[0]*block_sum[0])>>(level+3)); | |||||
| best_score -= (int)(((unsigned)block_sum[0]*block_sum[0])>>(level+3)); | |||||
| best_mean= (block_sum[0] + (size>>1)) >> (level+3); | best_mean= (block_sum[0] + (size>>1)) >> (level+3); | ||||
| if(level<4){ | if(level<4){ | ||||
| @@ -21,7 +21,7 @@ | |||||
| #define AVCODEC_VERSION_H | #define AVCODEC_VERSION_H | ||||
| #define LIBAVCODEC_VERSION_MAJOR 53 | #define LIBAVCODEC_VERSION_MAJOR 53 | ||||
| #define LIBAVCODEC_VERSION_MINOR 37 | |||||
| #define LIBAVCODEC_VERSION_MINOR 38 | |||||
| #define LIBAVCODEC_VERSION_MICRO 1 | #define LIBAVCODEC_VERSION_MICRO 1 | ||||
| #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ | #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ | ||||
| @@ -25,6 +25,7 @@ OBJS-$(CONFIG_AC3_DEMUXER) += ac3dec.o rawdec.o | |||||
| OBJS-$(CONFIG_AC3_MUXER) += rawenc.o | OBJS-$(CONFIG_AC3_MUXER) += rawenc.o | ||||
| OBJS-$(CONFIG_ACT_DEMUXER) += act.o | OBJS-$(CONFIG_ACT_DEMUXER) += act.o | ||||
| OBJS-$(CONFIG_ADF_DEMUXER) += bintext.o sauce.o | OBJS-$(CONFIG_ADF_DEMUXER) += bintext.o sauce.o | ||||
| OBJS-$(CONFIG_ADX_DEMUXER) += adxdec.o | |||||
| OBJS-$(CONFIG_ADTS_MUXER) += adtsenc.o | OBJS-$(CONFIG_ADTS_MUXER) += adtsenc.o | ||||
| OBJS-$(CONFIG_AEA_DEMUXER) += aea.o pcm.o | OBJS-$(CONFIG_AEA_DEMUXER) += aea.o pcm.o | ||||
| OBJS-$(CONFIG_AIFF_DEMUXER) += aiffdec.o riff.o pcm.o isom.o | OBJS-$(CONFIG_AIFF_DEMUXER) += aiffdec.o riff.o pcm.o isom.o | ||||
| @@ -0,0 +1,111 @@ | |||||
| /* | |||||
| * Copyright (c) 2011 Justin Ruggles | |||||
| * | |||||
| * This file is part of Libav. | |||||
| * | |||||
| * Libav is free software; you can redistribute it and/or | |||||
| * modify it under the terms of the GNU Lesser General Public | |||||
| * License as published by the Free Software Foundation; either | |||||
| * version 2.1 of the License, or (at your option) any later version. | |||||
| * | |||||
| * Libav is distributed in the hope that it will be useful, | |||||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||||
| * Lesser General Public License for more details. | |||||
| * | |||||
| * You should have received a copy of the GNU Lesser General Public | |||||
| * License along with Libav; if not, write to the Free Software | |||||
| * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |||||
| */ | |||||
| /** | |||||
| * @file | |||||
| * CRI ADX demuxer | |||||
| */ | |||||
| #include "libavutil/intreadwrite.h" | |||||
| #include "libavcodec/adx.h" | |||||
| #include "avformat.h" | |||||
| #define BLOCK_SIZE 18 | |||||
| #define BLOCK_SAMPLES 32 | |||||
| typedef struct ADXDemuxerContext { | |||||
| int header_size; | |||||
| } ADXDemuxerContext; | |||||
| static int adx_read_packet(AVFormatContext *s, AVPacket *pkt) | |||||
| { | |||||
| ADXDemuxerContext *c = s->priv_data; | |||||
| AVCodecContext *avctx = s->streams[0]->codec; | |||||
| int ret, size; | |||||
| size = BLOCK_SIZE * avctx->channels; | |||||
| pkt->pos = avio_tell(s->pb); | |||||
| pkt->stream_index = 0; | |||||
| ret = av_get_packet(s->pb, pkt, size); | |||||
| if (ret != size) { | |||||
| av_free_packet(pkt); | |||||
| return ret < 0 ? ret : AVERROR(EIO); | |||||
| } | |||||
| if (AV_RB16(pkt->data) & 0x8000) { | |||||
| av_free_packet(pkt); | |||||
| return AVERROR_EOF; | |||||
| } | |||||
| pkt->size = size; | |||||
| pkt->duration = 1; | |||||
| pkt->pts = (pkt->pos - c->header_size) / size; | |||||
| return 0; | |||||
| } | |||||
| static int adx_read_header(AVFormatContext *s, AVFormatParameters *ap) | |||||
| { | |||||
| ADXDemuxerContext *c = s->priv_data; | |||||
| AVCodecContext *avctx; | |||||
| int ret; | |||||
| AVStream *st = avformat_new_stream(s, NULL); | |||||
| if (!st) | |||||
| return AVERROR(ENOMEM); | |||||
| avctx = s->streams[0]->codec; | |||||
| if (avio_rb16(s->pb) != 0x8000) | |||||
| return AVERROR_INVALIDDATA; | |||||
| c->header_size = avio_rb16(s->pb) + 4; | |||||
| avio_seek(s->pb, -4, SEEK_CUR); | |||||
| avctx->extradata = av_mallocz(c->header_size + FF_INPUT_BUFFER_PADDING_SIZE); | |||||
| if (!avctx->extradata) | |||||
| return AVERROR(ENOMEM); | |||||
| if (avio_read(s->pb, avctx->extradata, c->header_size) < c->header_size) { | |||||
| av_freep(&avctx->extradata); | |||||
| return AVERROR(EIO); | |||||
| } | |||||
| avctx->extradata_size = c->header_size; | |||||
| ret = avpriv_adx_decode_header(avctx, avctx->extradata, | |||||
| avctx->extradata_size, &c->header_size, | |||||
| NULL); | |||||
| if (ret) | |||||
| return ret; | |||||
| st->codec->codec_type = AVMEDIA_TYPE_AUDIO; | |||||
| st->codec->codec_id = s->iformat->value; | |||||
| av_set_pts_info(st, 64, BLOCK_SAMPLES, avctx->sample_rate); | |||||
| return 0; | |||||
| } | |||||
| AVInputFormat ff_adx_demuxer = { | |||||
| .name = "adx", | |||||
| .long_name = NULL_IF_CONFIG_SMALL("CRI ADX"), | |||||
| .priv_data_size = sizeof(ADXDemuxerContext), | |||||
| .read_header = adx_read_header, | |||||
| .read_packet = adx_read_packet, | |||||
| .extensions = "adx", | |||||
| .value = CODEC_ID_ADPCM_ADX, | |||||
| }; | |||||
| @@ -54,6 +54,7 @@ void av_register_all(void) | |||||
| REGISTER_DEMUXER (ACT, act); | REGISTER_DEMUXER (ACT, act); | ||||
| REGISTER_DEMUXER (ADF, adf); | REGISTER_DEMUXER (ADF, adf); | ||||
| REGISTER_MUXER (ADTS, adts); | REGISTER_MUXER (ADTS, adts); | ||||
| REGISTER_DEMUXER (ADX, adx); | |||||
| REGISTER_DEMUXER (AEA, aea); | REGISTER_DEMUXER (AEA, aea); | ||||
| REGISTER_MUXDEMUX (AIFF, aiff); | REGISTER_MUXDEMUX (AIFF, aiff); | ||||
| REGISTER_MUXDEMUX (AMR, amr); | REGISTER_MUXDEMUX (AMR, amr); | ||||
| @@ -172,6 +172,7 @@ static int film_read_header(AVFormatContext *s, | |||||
| if (film->audio_type == CODEC_ID_ADPCM_ADX) { | if (film->audio_type == CODEC_ID_ADPCM_ADX) { | ||||
| st->codec->bits_per_coded_sample = 18 * 8 / 32; | st->codec->bits_per_coded_sample = 18 * 8 / 32; | ||||
| st->codec->block_align = st->codec->channels * 18; | st->codec->block_align = st->codec->channels * 18; | ||||
| st->need_parsing = AVSTREAM_PARSE_FULL; | |||||
| } else { | } else { | ||||
| st->codec->bits_per_coded_sample = film->audio_bits; | st->codec->bits_per_coded_sample = film->audio_bits; | ||||
| st->codec->block_align = st->codec->channels * | st->codec->block_align = st->codec->channels * | ||||
| @@ -23,7 +23,7 @@ | |||||
| * Based on documents from Game Audio Player and own research | * Based on documents from Game Audio Player and own research | ||||
| */ | */ | ||||
| #include "libavutil/bswap.h" | |||||
| #include "libavutil/intreadwrite.h" | |||||
| #include "avformat.h" | #include "avformat.h" | ||||
| #include "pcm.h" | #include "pcm.h" | ||||
| @@ -33,8 +33,7 @@ | |||||
| static int sol_probe(AVProbeData *p) | static int sol_probe(AVProbeData *p) | ||||
| { | { | ||||
| /* check file header */ | /* check file header */ | ||||
| uint16_t magic; | |||||
| magic=av_le2ne16(*((uint16_t*)p->buf)); | |||||
| uint16_t magic = AV_RL32(p->buf); | |||||
| if ((magic == 0x0B8D || magic == 0x0C0D || magic == 0x0C8D) && | if ((magic == 0x0B8D || magic == 0x0C0D || magic == 0x0C8D) && | ||||
| p->buf[2] == 'S' && p->buf[3] == 'O' && | p->buf[2] == 'S' && p->buf[3] == 'O' && | ||||
| p->buf[4] == 'L' && p->buf[5] == 0) | p->buf[4] == 'L' && p->buf[5] == 0) | ||||
| @@ -24,7 +24,7 @@ | |||||
| #include "libavutil/avutil.h" | #include "libavutil/avutil.h" | ||||
| #define LIBAVFORMAT_VERSION_MAJOR 53 | #define LIBAVFORMAT_VERSION_MAJOR 53 | ||||
| #define LIBAVFORMAT_VERSION_MINOR 21 | |||||
| #define LIBAVFORMAT_VERSION_MINOR 22 | |||||
| #define LIBAVFORMAT_VERSION_MICRO 0 | #define LIBAVFORMAT_VERSION_MICRO 0 | ||||
| #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ | #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ | ||||
| @@ -607,7 +607,7 @@ yuv2mono_X_c_template(SwsContext *c, const int16_t *lumFilter, | |||||
| const uint8_t * const d128=dither_8x8_220[y&7]; | const uint8_t * const d128=dither_8x8_220[y&7]; | ||||
| uint8_t *g = c->table_gU[128] + c->table_gV[128]; | uint8_t *g = c->table_gU[128] + c->table_gV[128]; | ||||
| int i; | int i; | ||||
| int acc = 0; | |||||
| unsigned acc = 0; | |||||
| for (i = 0; i < dstW - 1; i += 2) { | for (i = 0; i < dstW - 1; i += 2) { | ||||
| int j; | int j; | ||||