* qatar/master: build: fix standalone compilation of OMA muxer build: fix standalone compilation of Microsoft XMV demuxer build: fix standalone compilation of Core Audio Format demuxer kvmc: fix invalid reads 4xm: Add a check in decode_i_frame to prevent buffer overreads adpcm: fix IMA SMJPEG decoding options: set minimum for "threads" to zero bsd: use number of logical CPUs as automatic thread count windows: use number of CPUs as automatic thread count linux: use number of CPUs as automatic thread count pthreads: reset active_thread_type when slice thread_init returrns early v410dec: include correct headers Drop ALT_ prefix from BITSTREAM_READER_LE name. lavfi: always build vsrc_buffer. ra144enc: zero the reflection coeffs if the filter is unstable sws: readd PAL8 to isPacked() mov: Don't stick the QuickTime field ordering atom in extradata. truespeech: fix invalid reads in truespeech_apply_twopoint_filter() Conflicts: configure libavcodec/4xm.c libavcodec/avcodec.h libavfilter/Makefile libavfilter/allfilters.c libavformat/Makefile libswscale/swscale_internal.h Merged-by: Michael Niedermayer <michaelni@gmx.at>tags/n0.10
| @@ -2139,6 +2139,7 @@ static int transcode_init(OutputFile *output_files, | |||||
| codec->bit_rate = icodec->bit_rate; | codec->bit_rate = icodec->bit_rate; | ||||
| codec->rc_max_rate = icodec->rc_max_rate; | codec->rc_max_rate = icodec->rc_max_rate; | ||||
| codec->rc_buffer_size = icodec->rc_buffer_size; | codec->rc_buffer_size = icodec->rc_buffer_size; | ||||
| codec->field_order = icodec->field_order; | |||||
| codec->extradata = av_mallocz(extra_size); | codec->extradata = av_mallocz(extra_size); | ||||
| if (!codec->extradata) { | if (!codec->extradata) { | ||||
| return AVERROR(ENOMEM); | return AVERROR(ENOMEM); | ||||
| @@ -1174,6 +1174,7 @@ HAVE_LIST=" | |||||
| gethrtime | gethrtime | ||||
| GetProcessMemoryInfo | GetProcessMemoryInfo | ||||
| GetProcessTimes | GetProcessTimes | ||||
| GetSystemInfo | |||||
| getrusage | getrusage | ||||
| gnu_as | gnu_as | ||||
| ibm_asm | ibm_asm | ||||
| @@ -1206,6 +1207,7 @@ HAVE_LIST=" | |||||
| posix_memalign | posix_memalign | ||||
| round | round | ||||
| roundf | roundf | ||||
| sched_getaffinity | |||||
| sdl | sdl | ||||
| sdl_video_size | sdl_video_size | ||||
| setmode | setmode | ||||
| @@ -1224,6 +1226,7 @@ HAVE_LIST=" | |||||
| symver | symver | ||||
| symver_asm_label | symver_asm_label | ||||
| symver_gnu_asm | symver_gnu_asm | ||||
| sysctl | |||||
| sys_mman_h | sys_mman_h | ||||
| sys_resource_h | sys_resource_h | ||||
| sys_select_h | sys_select_h | ||||
| @@ -1654,14 +1657,13 @@ postproc_deps="gpl" | |||||
| # programs | # programs | ||||
| avconv_deps="avcodec avformat swscale" | avconv_deps="avcodec avformat swscale" | ||||
| avconv_select="buffer_filter" | |||||
| ffplay_deps="avcodec avformat swscale sdl" | ffplay_deps="avcodec avformat swscale sdl" | ||||
| ffplay_select="buffersink_filter rdft" | ffplay_select="buffersink_filter rdft" | ||||
| ffprobe_deps="avcodec avformat" | ffprobe_deps="avcodec avformat" | ||||
| ffserver_deps="avformat ffm_muxer fork rtp_protocol rtsp_demuxer" | ffserver_deps="avformat ffm_muxer fork rtp_protocol rtsp_demuxer" | ||||
| ffserver_extralibs='$ldl' | ffserver_extralibs='$ldl' | ||||
| ffmpeg_deps="avcodec avformat swscale swresample" | ffmpeg_deps="avcodec avformat swscale swresample" | ||||
| ffmpeg_select="buffer_filter buffersink_filter" | |||||
| ffmpeg_select="buffersink_filter" | |||||
| doc_deps="texi2html" | doc_deps="texi2html" | ||||
| @@ -3000,12 +3002,15 @@ check_func ${malloc_prefix}posix_memalign && enable posix_memalign | |||||
| check_func setrlimit | check_func setrlimit | ||||
| check_func strerror_r | check_func strerror_r | ||||
| check_func strptime | check_func strptime | ||||
| check_func sched_getaffinity | |||||
| check_func sysctl | |||||
| check_func_headers conio.h kbhit | check_func_headers conio.h kbhit | ||||
| check_func_headers windows.h PeekNamedPipe | check_func_headers windows.h PeekNamedPipe | ||||
| check_func_headers io.h setmode | check_func_headers io.h setmode | ||||
| check_func_headers lzo/lzo1x.h lzo1x_999_compress | check_func_headers lzo/lzo1x.h lzo1x_999_compress | ||||
| check_lib2 "windows.h psapi.h" GetProcessMemoryInfo -lpsapi | check_lib2 "windows.h psapi.h" GetProcessMemoryInfo -lpsapi | ||||
| check_func_headers windows.h GetProcessTimes | check_func_headers windows.h GetProcessTimes | ||||
| check_func_headers windows.h GetSystemInfo | |||||
| check_func_headers windows.h MapViewOfFile | check_func_headers windows.h MapViewOfFile | ||||
| check_func_headers windows.h VirtualAlloc | check_func_headers windows.h VirtualAlloc | ||||
| @@ -2213,6 +2213,7 @@ static int transcode_init(OutputFile *output_files, int nb_output_files, | |||||
| codec->bit_rate = icodec->bit_rate; | codec->bit_rate = icodec->bit_rate; | ||||
| codec->rc_max_rate = icodec->rc_max_rate; | codec->rc_max_rate = icodec->rc_max_rate; | ||||
| codec->rc_buffer_size = icodec->rc_buffer_size; | codec->rc_buffer_size = icodec->rc_buffer_size; | ||||
| codec->field_order = icodec->field_order; | |||||
| codec->extradata = av_mallocz(extra_size); | codec->extradata = av_mallocz(extra_size); | ||||
| if (!codec->extradata) { | if (!codec->extradata) { | ||||
| return AVERROR(ENOMEM); | return AVERROR(ENOMEM); | ||||
| @@ -688,10 +688,13 @@ static int decode_i_frame(FourXContext *f, const uint8_t *buf, int length){ | |||||
| unsigned int prestream_size; | unsigned int prestream_size; | ||||
| const uint8_t *prestream; | const uint8_t *prestream; | ||||
| if (bitstream_size > (1<<26) || length < bitstream_size + 12) | |||||
| return -1; | |||||
| prestream_size = 4*AV_RL32(buf + bitstream_size + 4); | |||||
| prestream = buf + bitstream_size + 12; | |||||
| if (bitstream_size > (1<<26) || length < bitstream_size + 12) { | |||||
| av_log(f->avctx, AV_LOG_ERROR, "packet size too small\n"); | |||||
| return AVERROR_INVALIDDATA; | |||||
| } | |||||
| prestream_size = 4 * AV_RL32(buf + bitstream_size + 4); | |||||
| prestream = buf + bitstream_size + 12; | |||||
| if (prestream_size > (1<<26) || | if (prestream_size > (1<<26) || | ||||
| prestream_size != length - (bitstream_size + 12)){ | prestream_size != length - (bitstream_size + 12)){ | ||||
| @@ -1007,11 +1007,15 @@ static int adpcm_decode_frame(AVCodecContext *avctx, void *data, | |||||
| break; | break; | ||||
| case CODEC_ID_ADPCM_IMA_AMV: | case CODEC_ID_ADPCM_IMA_AMV: | ||||
| case CODEC_ID_ADPCM_IMA_SMJPEG: | case CODEC_ID_ADPCM_IMA_SMJPEG: | ||||
| c->status[0].predictor = (int16_t)bytestream_get_le16(&src); | |||||
| c->status[0].step_index = bytestream_get_le16(&src); | |||||
| if (avctx->codec->id == CODEC_ID_ADPCM_IMA_AMV) | |||||
| src+=4; | |||||
| if (avctx->codec->id == CODEC_ID_ADPCM_IMA_AMV) { | |||||
| c->status[0].predictor = sign_extend(bytestream_get_le16(&src), 16); | |||||
| c->status[0].step_index = bytestream_get_le16(&src); | |||||
| src += 4; | |||||
| } else { | |||||
| c->status[0].predictor = sign_extend(bytestream_get_be16(&src), 16); | |||||
| c->status[0].step_index = bytestream_get_byte(&src); | |||||
| src += 1; | |||||
| } | |||||
| for (n = nb_samples >> (1 - st); n > 0; n--, src++) { | for (n = nb_samples >> (1 - st); n > 0; n--, src++) { | ||||
| char hi, lo; | char hi, lo; | ||||
| @@ -20,7 +20,7 @@ | |||||
| * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | ||||
| */ | */ | ||||
| #define ALT_BITSTREAM_READER_LE | |||||
| #define BITSTREAM_READER_LE | |||||
| #include "avcodec.h" | #include "avcodec.h" | ||||
| #include "dsputil.h" | #include "dsputil.h" | ||||
| #include "get_bits.h" | #include "get_bits.h" | ||||
| @@ -1335,6 +1335,15 @@ typedef struct AVFrame { | |||||
| struct AVCodecInternal; | struct AVCodecInternal; | ||||
| enum AVFieldOrder { | |||||
| AV_FIELD_UNKNOWN, | |||||
| AV_FIELD_PROGRESSIVE, | |||||
| AV_FIELD_TT, //< Top coded_first, top displayed first | |||||
| AV_FIELD_BB, //< Bottom coded first, bottom displayed first | |||||
| AV_FIELD_TB, //< Top coded first, bottom displayed first | |||||
| AV_FIELD_BT, //< Bottom coded first, top displayed first | |||||
| }; | |||||
| /** | /** | ||||
| * main external API structure. | * main external API structure. | ||||
| * New fields can be added to the end with minor version bumps. | * New fields can be added to the end with minor version bumps. | ||||
| @@ -3191,6 +3200,12 @@ typedef struct AVCodecContext { | |||||
| */ | */ | ||||
| struct AVCodecInternal *internal; | struct AVCodecInternal *internal; | ||||
| /** Field order | |||||
| * - encoding: set by libavcodec | |||||
| * - decoding: Set by libavcodec | |||||
| */ | |||||
| enum AVFieldOrder field_order; | |||||
| /** | /** | ||||
| * Current statistics for PTS correction. | * Current statistics for PTS correction. | ||||
| * - decoding: maintained and used by libavcodec, not intended to be used by user apps | * - decoding: maintained and used by libavcodec, not intended to be used by user apps | ||||
| @@ -27,7 +27,7 @@ | |||||
| #include "binkdsp.h" | #include "binkdsp.h" | ||||
| #include "mathops.h" | #include "mathops.h" | ||||
| #define ALT_BITSTREAM_READER_LE | |||||
| #define BITSTREAM_READER_LE | |||||
| #include "get_bits.h" | #include "get_bits.h" | ||||
| #define BINK_FLAG_ALPHA 0x00100000 | #define BINK_FLAG_ALPHA 0x00100000 | ||||
| @@ -29,7 +29,7 @@ | |||||
| */ | */ | ||||
| #include "avcodec.h" | #include "avcodec.h" | ||||
| #define ALT_BITSTREAM_READER_LE | |||||
| #define BITSTREAM_READER_LE | |||||
| #include "get_bits.h" | #include "get_bits.h" | ||||
| #include "dsputil.h" | #include "dsputil.h" | ||||
| #include "dct.h" | #include "dct.h" | ||||
| @@ -29,7 +29,7 @@ | |||||
| */ | */ | ||||
| #include "avcodec.h" | #include "avcodec.h" | ||||
| #define ALT_BITSTREAM_READER_LE | |||||
| #define BITSTREAM_READER_LE | |||||
| #include "get_bits.h" | #include "get_bits.h" | ||||
| #include "bytestream.h" | #include "bytestream.h" | ||||
| #include "dsputil.h" | #include "dsputil.h" | ||||
| @@ -29,7 +29,7 @@ | |||||
| */ | */ | ||||
| #include "avcodec.h" | #include "avcodec.h" | ||||
| #define ALT_BITSTREAM_READER_LE | |||||
| #define BITSTREAM_READER_LE | |||||
| #include "get_bits.h" | #include "get_bits.h" | ||||
| #include "libavutil/lzo.h" | #include "libavutil/lzo.h" | ||||
| #include "libavutil/imgutils.h" | #include "libavutil/imgutils.h" | ||||
| @@ -21,7 +21,7 @@ | |||||
| #include "avcodec.h" | #include "avcodec.h" | ||||
| #define ALT_BITSTREAM_READER_LE | |||||
| #define BITSTREAM_READER_LE | |||||
| #include "get_bits.h" | #include "get_bits.h" | ||||
| typedef union MacroBlock { | typedef union MacroBlock { | ||||
| @@ -21,7 +21,7 @@ | |||||
| #include "avcodec.h" | #include "avcodec.h" | ||||
| #define ALT_BITSTREAM_READER_LE | |||||
| #define BITSTREAM_READER_LE | |||||
| #include "get_bits.h" | #include "get_bits.h" | ||||
| typedef struct Escape130Context { | typedef struct Escape130Context { | ||||
| @@ -26,7 +26,7 @@ | |||||
| */ | */ | ||||
| #include "avcodec.h" | #include "avcodec.h" | ||||
| #define ALT_BITSTREAM_READER_LE | |||||
| #define BITSTREAM_READER_LE | |||||
| #include "get_bits.h" | #include "get_bits.h" | ||||
| #include "acelp_vectors.h" | #include "acelp_vectors.h" | ||||
| #include "celp_filters.h" | #include "celp_filters.h" | ||||
| @@ -124,7 +124,7 @@ for examples see get_bits, show_bits, skip_bits, get_vlc | |||||
| #define CLOSE_READER(name, gb) (gb)->index = name##_index | #define CLOSE_READER(name, gb) (gb)->index = name##_index | ||||
| #ifdef ALT_BITSTREAM_READER_LE | |||||
| #ifdef BITSTREAM_READER_LE | |||||
| # ifdef LONG_BITSTREAM_READER | # ifdef LONG_BITSTREAM_READER | ||||
| # define UPDATE_CACHE(name, gb) name##_cache = \ | # define UPDATE_CACHE(name, gb) name##_cache = \ | ||||
| @@ -164,7 +164,7 @@ for examples see get_bits, show_bits, skip_bits, get_vlc | |||||
| #define LAST_SKIP_BITS(name, gb, num) SKIP_COUNTER(name, gb, num) | #define LAST_SKIP_BITS(name, gb, num) SKIP_COUNTER(name, gb, num) | ||||
| #ifdef ALT_BITSTREAM_READER_LE | |||||
| #ifdef BITSTREAM_READER_LE | |||||
| # define SHOW_UBITS(name, gb, num) zero_extend(name##_cache, num) | # define SHOW_UBITS(name, gb, num) zero_extend(name##_cache, num) | ||||
| # define SHOW_SBITS(name, gb, num) sign_extend(name##_cache, num) | # define SHOW_SBITS(name, gb, num) sign_extend(name##_cache, num) | ||||
| #else | #else | ||||
| @@ -254,7 +254,7 @@ static inline unsigned int get_bits1(GetBitContext *s) | |||||
| { | { | ||||
| unsigned int index = s->index; | unsigned int index = s->index; | ||||
| uint8_t result = s->buffer[index>>3]; | uint8_t result = s->buffer[index>>3]; | ||||
| #ifdef ALT_BITSTREAM_READER_LE | |||||
| #ifdef BITSTREAM_READER_LE | |||||
| result >>= index & 7; | result >>= index & 7; | ||||
| result &= 1; | result &= 1; | ||||
| #else | #else | ||||
| @@ -288,7 +288,7 @@ static inline unsigned int get_bits_long(GetBitContext *s, int n) | |||||
| if (n <= MIN_CACHE_BITS) | if (n <= MIN_CACHE_BITS) | ||||
| return get_bits(s, n); | return get_bits(s, n); | ||||
| else { | else { | ||||
| #ifdef ALT_BITSTREAM_READER_LE | |||||
| #ifdef BITSTREAM_READER_LE | |||||
| int ret = get_bits(s, 16); | int ret = get_bits(s, 16); | ||||
| return ret | (get_bits(s, n-16) << 16); | return ret | (get_bits(s, n-16) << 16); | ||||
| #else | #else | ||||
| @@ -23,7 +23,7 @@ | |||||
| * @file | * @file | ||||
| * Intel Indeo 2 decoder. | * Intel Indeo 2 decoder. | ||||
| */ | */ | ||||
| #define ALT_BITSTREAM_READER_LE | |||||
| #define BITSTREAM_READER_LE | |||||
| #include "avcodec.h" | #include "avcodec.h" | ||||
| #include "get_bits.h" | #include "get_bits.h" | ||||
| #include "indeo2data.h" | #include "indeo2data.h" | ||||
| @@ -163,7 +163,7 @@ static int ir2_decode_frame(AVCodecContext *avctx, | |||||
| s->decode_delta = buf[18]; | s->decode_delta = buf[18]; | ||||
| /* decide whether frame uses deltas or not */ | /* decide whether frame uses deltas or not */ | ||||
| #ifndef ALT_BITSTREAM_READER_LE | |||||
| #ifndef BITSTREAM_READER_LE | |||||
| for (i = 0; i < buf_size; i++) | for (i = 0; i < buf_size; i++) | ||||
| buf[i] = av_reverse[buf[i]]; | buf[i] = av_reverse[buf[i]]; | ||||
| #endif | #endif | ||||
| @@ -205,7 +205,7 @@ static av_cold int ir2_decode_init(AVCodecContext *avctx){ | |||||
| ir2_vlc.table = vlc_tables; | ir2_vlc.table = vlc_tables; | ||||
| ir2_vlc.table_allocated = 1 << CODE_VLC_BITS; | ir2_vlc.table_allocated = 1 << CODE_VLC_BITS; | ||||
| #ifdef ALT_BITSTREAM_READER_LE | |||||
| #ifdef BITSTREAM_READER_LE | |||||
| init_vlc(&ir2_vlc, CODE_VLC_BITS, IR2_CODES, | init_vlc(&ir2_vlc, CODE_VLC_BITS, IR2_CODES, | ||||
| &ir2_codes[0][1], 4, 2, | &ir2_codes[0][1], 4, 2, | ||||
| &ir2_codes[0][0], 4, 2, INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE); | &ir2_codes[0][0], 4, 2, INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE); | ||||
| @@ -26,7 +26,7 @@ | |||||
| #define IR2_CODES 143 | #define IR2_CODES 143 | ||||
| static const uint16_t ir2_codes[IR2_CODES][2] = { | static const uint16_t ir2_codes[IR2_CODES][2] = { | ||||
| #ifdef ALT_BITSTREAM_READER_LE | |||||
| #ifdef BITSTREAM_READER_LE | |||||
| {0x0000, 3}, {0x0004, 3}, {0x0006, 3}, {0x0001, 5}, | {0x0000, 3}, {0x0004, 3}, {0x0006, 3}, {0x0001, 5}, | ||||
| {0x0009, 5}, {0x0019, 5}, {0x000D, 5}, {0x001D, 5}, | {0x0009, 5}, {0x0019, 5}, {0x000D, 5}, {0x001D, 5}, | ||||
| {0x0023, 6}, {0x0013, 6}, {0x0033, 6}, {0x000B, 6}, | {0x0023, 6}, {0x0013, 6}, {0x0033, 6}, {0x000B, 6}, | ||||
| @@ -27,7 +27,7 @@ | |||||
| * Known FOURCCs: 'IV50' | * Known FOURCCs: 'IV50' | ||||
| */ | */ | ||||
| #define ALT_BITSTREAM_READER_LE | |||||
| #define BITSTREAM_READER_LE | |||||
| #include "avcodec.h" | #include "avcodec.h" | ||||
| #include "get_bits.h" | #include "get_bits.h" | ||||
| #include "dsputil.h" | #include "dsputil.h" | ||||
| @@ -41,7 +41,7 @@ | |||||
| #include "avcodec.h" | #include "avcodec.h" | ||||
| #include "bytestream.h" | #include "bytestream.h" | ||||
| #include "dsputil.h" | #include "dsputil.h" | ||||
| #define ALT_BITSTREAM_READER_LE | |||||
| #define BITSTREAM_READER_LE | |||||
| #include "get_bits.h" | #include "get_bits.h" | ||||
| #define PALETTE_COUNT 256 | #define PALETTE_COUNT 256 | ||||
| @@ -26,7 +26,7 @@ | |||||
| * Indeo5 decoders. | * Indeo5 decoders. | ||||
| */ | */ | ||||
| #define ALT_BITSTREAM_READER_LE | |||||
| #define BITSTREAM_READER_LE | |||||
| #include "avcodec.h" | #include "avcodec.h" | ||||
| #include "get_bits.h" | #include "get_bits.h" | ||||
| #include "ivi_common.h" | #include "ivi_common.h" | ||||
| @@ -57,17 +57,21 @@ typedef struct BitBuf { | |||||
| #define kmvc_init_getbits(bb, src) bb.bits = 7; bb.bitbuf = *src++; | #define kmvc_init_getbits(bb, src) bb.bits = 7; bb.bitbuf = *src++; | ||||
| #define kmvc_getbit(bb, src, res) {\ | |||||
| #define kmvc_getbit(bb, src, src_end, res) {\ | |||||
| res = 0; \ | res = 0; \ | ||||
| if (bb.bitbuf & (1 << bb.bits)) res = 1; \ | if (bb.bitbuf & (1 << bb.bits)) res = 1; \ | ||||
| bb.bits--; \ | bb.bits--; \ | ||||
| if(bb.bits == -1) { \ | if(bb.bits == -1) { \ | ||||
| if (src >= src_end) { \ | |||||
| av_log(ctx->avctx, AV_LOG_ERROR, "Data overrun\n"); \ | |||||
| return AVERROR_INVALIDDATA; \ | |||||
| } \ | |||||
| bb.bitbuf = *src++; \ | bb.bitbuf = *src++; \ | ||||
| bb.bits = 7; \ | bb.bits = 7; \ | ||||
| } \ | } \ | ||||
| } | } | ||||
| static void kmvc_decode_intra_8x8(KmvcContext * ctx, const uint8_t * src, int w, int h) | |||||
| static int kmvc_decode_intra_8x8(KmvcContext * ctx, const uint8_t * src, int src_size, int w, int h) | |||||
| { | { | ||||
| BitBuf bb; | BitBuf bb; | ||||
| int res, val; | int res, val; | ||||
| @@ -75,13 +79,18 @@ static void kmvc_decode_intra_8x8(KmvcContext * ctx, const uint8_t * src, int w, | |||||
| int bx, by; | int bx, by; | ||||
| int l0x, l1x, l0y, l1y; | int l0x, l1x, l0y, l1y; | ||||
| int mx, my; | int mx, my; | ||||
| const uint8_t *src_end = src + src_size; | |||||
| kmvc_init_getbits(bb, src); | kmvc_init_getbits(bb, src); | ||||
| for (by = 0; by < h; by += 8) | for (by = 0; by < h; by += 8) | ||||
| for (bx = 0; bx < w; bx += 8) { | for (bx = 0; bx < w; bx += 8) { | ||||
| kmvc_getbit(bb, src, res); | |||||
| kmvc_getbit(bb, src, src_end, res); | |||||
| if (!res) { // fill whole 8x8 block | if (!res) { // fill whole 8x8 block | ||||
| if (src >= src_end) { | |||||
| av_log(ctx->avctx, AV_LOG_ERROR, "Data overrun\n"); | |||||
| return AVERROR_INVALIDDATA; | |||||
| } | |||||
| val = *src++; | val = *src++; | ||||
| for (i = 0; i < 64; i++) | for (i = 0; i < 64; i++) | ||||
| BLK(ctx->cur, bx + (i & 0x7), by + (i >> 3)) = val; | BLK(ctx->cur, bx + (i & 0x7), by + (i >> 3)) = val; | ||||
| @@ -89,14 +98,22 @@ static void kmvc_decode_intra_8x8(KmvcContext * ctx, const uint8_t * src, int w, | |||||
| for (i = 0; i < 4; i++) { | for (i = 0; i < 4; i++) { | ||||
| l0x = bx + (i & 1) * 4; | l0x = bx + (i & 1) * 4; | ||||
| l0y = by + (i & 2) * 2; | l0y = by + (i & 2) * 2; | ||||
| kmvc_getbit(bb, src, res); | |||||
| kmvc_getbit(bb, src, src_end, res); | |||||
| if (!res) { | if (!res) { | ||||
| kmvc_getbit(bb, src, res); | |||||
| kmvc_getbit(bb, src, src_end, res); | |||||
| if (!res) { // fill whole 4x4 block | if (!res) { // fill whole 4x4 block | ||||
| if (src >= src_end) { | |||||
| av_log(ctx->avctx, AV_LOG_ERROR, "Data overrun\n"); | |||||
| return AVERROR_INVALIDDATA; | |||||
| } | |||||
| val = *src++; | val = *src++; | ||||
| for (j = 0; j < 16; j++) | for (j = 0; j < 16; j++) | ||||
| BLK(ctx->cur, l0x + (j & 3), l0y + (j >> 2)) = val; | BLK(ctx->cur, l0x + (j & 3), l0y + (j >> 2)) = val; | ||||
| } else { // copy block from already decoded place | } else { // copy block from already decoded place | ||||
| if (src >= src_end) { | |||||
| av_log(ctx->avctx, AV_LOG_ERROR, "Data overrun\n"); | |||||
| return AVERROR_INVALIDDATA; | |||||
| } | |||||
| val = *src++; | val = *src++; | ||||
| mx = val & 0xF; | mx = val & 0xF; | ||||
| my = val >> 4; | my = val >> 4; | ||||
| @@ -108,16 +125,24 @@ static void kmvc_decode_intra_8x8(KmvcContext * ctx, const uint8_t * src, int w, | |||||
| for (j = 0; j < 4; j++) { | for (j = 0; j < 4; j++) { | ||||
| l1x = l0x + (j & 1) * 2; | l1x = l0x + (j & 1) * 2; | ||||
| l1y = l0y + (j & 2); | l1y = l0y + (j & 2); | ||||
| kmvc_getbit(bb, src, res); | |||||
| kmvc_getbit(bb, src, src_end, res); | |||||
| if (!res) { | if (!res) { | ||||
| kmvc_getbit(bb, src, res); | |||||
| kmvc_getbit(bb, src, src_end, res); | |||||
| if (!res) { // fill whole 2x2 block | if (!res) { // fill whole 2x2 block | ||||
| if (src >= src_end) { | |||||
| av_log(ctx->avctx, AV_LOG_ERROR, "Data overrun\n"); | |||||
| return AVERROR_INVALIDDATA; | |||||
| } | |||||
| val = *src++; | val = *src++; | ||||
| BLK(ctx->cur, l1x, l1y) = val; | BLK(ctx->cur, l1x, l1y) = val; | ||||
| BLK(ctx->cur, l1x + 1, l1y) = val; | BLK(ctx->cur, l1x + 1, l1y) = val; | ||||
| BLK(ctx->cur, l1x, l1y + 1) = val; | BLK(ctx->cur, l1x, l1y + 1) = val; | ||||
| BLK(ctx->cur, l1x + 1, l1y + 1) = val; | BLK(ctx->cur, l1x + 1, l1y + 1) = val; | ||||
| } else { // copy block from already decoded place | } else { // copy block from already decoded place | ||||
| if (src >= src_end) { | |||||
| av_log(ctx->avctx, AV_LOG_ERROR, "Data overrun\n"); | |||||
| return AVERROR_INVALIDDATA; | |||||
| } | |||||
| val = *src++; | val = *src++; | ||||
| mx = val & 0xF; | mx = val & 0xF; | ||||
| my = val >> 4; | my = val >> 4; | ||||
| @@ -140,9 +165,11 @@ static void kmvc_decode_intra_8x8(KmvcContext * ctx, const uint8_t * src, int w, | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| return 0; | |||||
| } | } | ||||
| static void kmvc_decode_inter_8x8(KmvcContext * ctx, const uint8_t * src, int w, int h) | |||||
| static int kmvc_decode_inter_8x8(KmvcContext * ctx, const uint8_t * src, int src_size, int w, int h) | |||||
| { | { | ||||
| BitBuf bb; | BitBuf bb; | ||||
| int res, val; | int res, val; | ||||
| @@ -150,15 +177,20 @@ static void kmvc_decode_inter_8x8(KmvcContext * ctx, const uint8_t * src, int w, | |||||
| int bx, by; | int bx, by; | ||||
| int l0x, l1x, l0y, l1y; | int l0x, l1x, l0y, l1y; | ||||
| int mx, my; | int mx, my; | ||||
| const uint8_t *src_end = src + src_size; | |||||
| kmvc_init_getbits(bb, src); | kmvc_init_getbits(bb, src); | ||||
| for (by = 0; by < h; by += 8) | for (by = 0; by < h; by += 8) | ||||
| for (bx = 0; bx < w; bx += 8) { | for (bx = 0; bx < w; bx += 8) { | ||||
| kmvc_getbit(bb, src, res); | |||||
| kmvc_getbit(bb, src, src_end, res); | |||||
| if (!res) { | if (!res) { | ||||
| kmvc_getbit(bb, src, res); | |||||
| kmvc_getbit(bb, src, src_end, res); | |||||
| if (!res) { // fill whole 8x8 block | if (!res) { // fill whole 8x8 block | ||||
| if (src >= src_end) { | |||||
| av_log(ctx->avctx, AV_LOG_ERROR, "Data overrun\n"); | |||||
| return AVERROR_INVALIDDATA; | |||||
| } | |||||
| val = *src++; | val = *src++; | ||||
| for (i = 0; i < 64; i++) | for (i = 0; i < 64; i++) | ||||
| BLK(ctx->cur, bx + (i & 0x7), by + (i >> 3)) = val; | BLK(ctx->cur, bx + (i & 0x7), by + (i >> 3)) = val; | ||||
| @@ -171,14 +203,22 @@ static void kmvc_decode_inter_8x8(KmvcContext * ctx, const uint8_t * src, int w, | |||||
| for (i = 0; i < 4; i++) { | for (i = 0; i < 4; i++) { | ||||
| l0x = bx + (i & 1) * 4; | l0x = bx + (i & 1) * 4; | ||||
| l0y = by + (i & 2) * 2; | l0y = by + (i & 2) * 2; | ||||
| kmvc_getbit(bb, src, res); | |||||
| kmvc_getbit(bb, src, src_end, res); | |||||
| if (!res) { | if (!res) { | ||||
| kmvc_getbit(bb, src, res); | |||||
| kmvc_getbit(bb, src, src_end, res); | |||||
| if (!res) { // fill whole 4x4 block | if (!res) { // fill whole 4x4 block | ||||
| if (src >= src_end) { | |||||
| av_log(ctx->avctx, AV_LOG_ERROR, "Data overrun\n"); | |||||
| return AVERROR_INVALIDDATA; | |||||
| } | |||||
| val = *src++; | val = *src++; | ||||
| for (j = 0; j < 16; j++) | for (j = 0; j < 16; j++) | ||||
| BLK(ctx->cur, l0x + (j & 3), l0y + (j >> 2)) = val; | BLK(ctx->cur, l0x + (j & 3), l0y + (j >> 2)) = val; | ||||
| } else { // copy block | } else { // copy block | ||||
| if (src >= src_end) { | |||||
| av_log(ctx->avctx, AV_LOG_ERROR, "Data overrun\n"); | |||||
| return AVERROR_INVALIDDATA; | |||||
| } | |||||
| val = *src++; | val = *src++; | ||||
| mx = (val & 0xF) - 8; | mx = (val & 0xF) - 8; | ||||
| my = (val >> 4) - 8; | my = (val >> 4) - 8; | ||||
| @@ -190,16 +230,24 @@ static void kmvc_decode_inter_8x8(KmvcContext * ctx, const uint8_t * src, int w, | |||||
| for (j = 0; j < 4; j++) { | for (j = 0; j < 4; j++) { | ||||
| l1x = l0x + (j & 1) * 2; | l1x = l0x + (j & 1) * 2; | ||||
| l1y = l0y + (j & 2); | l1y = l0y + (j & 2); | ||||
| kmvc_getbit(bb, src, res); | |||||
| kmvc_getbit(bb, src, src_end, res); | |||||
| if (!res) { | if (!res) { | ||||
| kmvc_getbit(bb, src, res); | |||||
| kmvc_getbit(bb, src, src_end, res); | |||||
| if (!res) { // fill whole 2x2 block | if (!res) { // fill whole 2x2 block | ||||
| if (src >= src_end) { | |||||
| av_log(ctx->avctx, AV_LOG_ERROR, "Data overrun\n"); | |||||
| return AVERROR_INVALIDDATA; | |||||
| } | |||||
| val = *src++; | val = *src++; | ||||
| BLK(ctx->cur, l1x, l1y) = val; | BLK(ctx->cur, l1x, l1y) = val; | ||||
| BLK(ctx->cur, l1x + 1, l1y) = val; | BLK(ctx->cur, l1x + 1, l1y) = val; | ||||
| BLK(ctx->cur, l1x, l1y + 1) = val; | BLK(ctx->cur, l1x, l1y + 1) = val; | ||||
| BLK(ctx->cur, l1x + 1, l1y + 1) = val; | BLK(ctx->cur, l1x + 1, l1y + 1) = val; | ||||
| } else { // copy block | } else { // copy block | ||||
| if (src >= src_end) { | |||||
| av_log(ctx->avctx, AV_LOG_ERROR, "Data overrun\n"); | |||||
| return AVERROR_INVALIDDATA; | |||||
| } | |||||
| val = *src++; | val = *src++; | ||||
| mx = (val & 0xF) - 8; | mx = (val & 0xF) - 8; | ||||
| my = (val >> 4) - 8; | my = (val >> 4) - 8; | ||||
| @@ -222,6 +270,8 @@ static void kmvc_decode_inter_8x8(KmvcContext * ctx, const uint8_t * src, int w, | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| return 0; | |||||
| } | } | ||||
| static int decode_frame(AVCodecContext * avctx, void *data, int *data_size, AVPacket *avpkt) | static int decode_frame(AVCodecContext * avctx, void *data, int *data_size, AVPacket *avpkt) | ||||
| @@ -299,10 +349,10 @@ static int decode_frame(AVCodecContext * avctx, void *data, int *data_size, AVPa | |||||
| memcpy(ctx->cur, ctx->prev, 320 * 200); | memcpy(ctx->cur, ctx->prev, 320 * 200); | ||||
| break; | break; | ||||
| case 3: | case 3: | ||||
| kmvc_decode_intra_8x8(ctx, buf, avctx->width, avctx->height); | |||||
| kmvc_decode_intra_8x8(ctx, buf, buf_size, avctx->width, avctx->height); | |||||
| break; | break; | ||||
| case 4: | case 4: | ||||
| kmvc_decode_inter_8x8(ctx, buf, avctx->width, avctx->height); | |||||
| kmvc_decode_inter_8x8(ctx, buf, buf_size, avctx->width, avctx->height); | |||||
| break; | break; | ||||
| default: | default: | ||||
| av_log(avctx, AV_LOG_ERROR, "Unknown compression method %i\n", header & KMVC_METHOD); | av_log(avctx, AV_LOG_ERROR, "Unknown compression method %i\n", header & KMVC_METHOD); | ||||
| @@ -112,12 +112,9 @@ av_cold int ff_mjpeg_decode_init(AVCodecContext *avctx) | |||||
| build_basic_mjpeg_vlc(s); | build_basic_mjpeg_vlc(s); | ||||
| } | } | ||||
| } | } | ||||
| if (avctx->extradata_size > 9 && | |||||
| AV_RL32(avctx->extradata + 4) == MKTAG('f','i','e','l')) { | |||||
| if (avctx->extradata[9] == 6) { /* quicktime icefloe 019 */ | |||||
| s->interlace_polarity = 1; /* bottom field first */ | |||||
| av_log(avctx, AV_LOG_DEBUG, "mjpeg bottom field first\n"); | |||||
| } | |||||
| if (avctx->field_order == AV_FIELD_BB) { /* quicktime icefloe 019 */ | |||||
| s->interlace_polarity = 1; /* bottom field first */ | |||||
| av_log(avctx, AV_LOG_DEBUG, "mjpeg bottom field first\n"); | |||||
| } | } | ||||
| if (avctx->codec->id == CODEC_ID_AMV) | if (avctx->codec->id == CODEC_ID_AMV) | ||||
| s->flipped = 1; | s->flipped = 1; | ||||
| @@ -19,7 +19,7 @@ | |||||
| * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | ||||
| */ | */ | ||||
| #define ALT_BITSTREAM_READER_LE | |||||
| #define BITSTREAM_READER_LE | |||||
| #include "avcodec.h" | #include "avcodec.h" | ||||
| #include "msgsmdec.h" | #include "msgsmdec.h" | ||||
| #include "gsmdec_template.c" | #include "gsmdec_template.c" | ||||
| @@ -35,7 +35,7 @@ | |||||
| #include "avcodec.h" | #include "avcodec.h" | ||||
| #include "dsputil.h" | #include "dsputil.h" | ||||
| #define ALT_BITSTREAM_READER_LE | |||||
| #define BITSTREAM_READER_LE | |||||
| #include "get_bits.h" | #include "get_bits.h" | ||||
| const float ff_nelly_dequantization_table[127] = { | const float ff_nelly_dequantization_table[127] = { | ||||
| @@ -41,7 +41,7 @@ | |||||
| #include "fmtconvert.h" | #include "fmtconvert.h" | ||||
| #include "sinewin.h" | #include "sinewin.h" | ||||
| #define ALT_BITSTREAM_READER_LE | |||||
| #define BITSTREAM_READER_LE | |||||
| #include "get_bits.h" | #include "get_bits.h" | ||||
| @@ -371,7 +371,8 @@ static const AVOption options[]={ | |||||
| {"float", NULL, 0, AV_OPT_TYPE_CONST, {.dbl = FF_AA_FLOAT }, INT_MIN, INT_MAX, V|D, "aa"}, | {"float", NULL, 0, AV_OPT_TYPE_CONST, {.dbl = FF_AA_FLOAT }, INT_MIN, INT_MAX, V|D, "aa"}, | ||||
| #endif | #endif | ||||
| {"qns", "quantizer noise shaping", OFFSET(quantizer_noise_shaping), AV_OPT_TYPE_INT, {.dbl = DEFAULT }, INT_MIN, INT_MAX, V|E}, | {"qns", "quantizer noise shaping", OFFSET(quantizer_noise_shaping), AV_OPT_TYPE_INT, {.dbl = DEFAULT }, INT_MIN, INT_MAX, V|E}, | ||||
| {"threads", NULL, OFFSET(thread_count), AV_OPT_TYPE_INT, {.dbl = 1 }, INT_MIN, INT_MAX, V|E|D}, | |||||
| {"threads", NULL, OFFSET(thread_count), AV_OPT_TYPE_INT, {.dbl = 1 }, 0, INT_MAX, V|E|D, "threads"}, | |||||
| {"auto", "detect a good number of threads", 0, AV_OPT_TYPE_CONST, {.dbl = 0 }, INT_MIN, INT_MAX, V|E|D, "threads"}, | |||||
| {"me_threshold", "motion estimaton threshold", OFFSET(me_threshold), AV_OPT_TYPE_INT, {.dbl = DEFAULT }, INT_MIN, INT_MAX, V|E}, | {"me_threshold", "motion estimaton threshold", OFFSET(me_threshold), AV_OPT_TYPE_INT, {.dbl = DEFAULT }, INT_MIN, INT_MAX, V|E}, | ||||
| {"mb_threshold", "macroblock threshold", OFFSET(mb_threshold), AV_OPT_TYPE_INT, {.dbl = DEFAULT }, INT_MIN, INT_MAX, V|E}, | {"mb_threshold", "macroblock threshold", OFFSET(mb_threshold), AV_OPT_TYPE_INT, {.dbl = DEFAULT }, INT_MIN, INT_MAX, V|E}, | ||||
| {"dc", "intra_dc_precision", OFFSET(intra_dc_precision), AV_OPT_TYPE_INT, {.dbl = 0 }, INT_MIN, INT_MAX, V|E}, | {"dc", "intra_dc_precision", OFFSET(intra_dc_precision), AV_OPT_TYPE_INT, {.dbl = 0 }, INT_MIN, INT_MAX, V|E}, | ||||
| @@ -30,6 +30,17 @@ | |||||
| */ | */ | ||||
| #include "config.h" | #include "config.h" | ||||
| #if HAVE_SCHED_GETAFFINITY | |||||
| #define _GNU_SOURCE | |||||
| #include <sched.h> | |||||
| #elif HAVE_GETSYSTEMINFO | |||||
| #include <windows.h> | |||||
| #elif HAVE_SYSCTL | |||||
| #include <sys/sysctl.h> | |||||
| #include <sys/types.h> | |||||
| #endif | |||||
| #include "avcodec.h" | #include "avcodec.h" | ||||
| #include "internal.h" | #include "internal.h" | ||||
| #include "thread.h" | #include "thread.h" | ||||
| @@ -135,6 +146,40 @@ typedef struct FrameThreadContext { | |||||
| int die; ///< Set when threads should exit. | int die; ///< Set when threads should exit. | ||||
| } FrameThreadContext; | } FrameThreadContext; | ||||
| /* H264 slice threading seems to be buggy with more than 16 threads, | |||||
| * limit the number of threads to 16 for automatic detection */ | |||||
| #define MAX_AUTO_THREADS 16 | |||||
| static int get_logical_cpus(AVCodecContext *avctx) | |||||
| { | |||||
| int ret, nb_cpus = 1; | |||||
| #if HAVE_SCHED_GETAFFINITY | |||||
| cpu_set_t cpuset; | |||||
| CPU_ZERO(&cpuset); | |||||
| ret = sched_getaffinity(0, sizeof(cpuset), &cpuset); | |||||
| if (!ret) { | |||||
| nb_cpus = CPU_COUNT(&cpuset); | |||||
| } | |||||
| #elif HAVE_GETSYSTEMINFO | |||||
| SYSTEM_INFO sysinfo; | |||||
| GetSystemInfo(&sysinfo); | |||||
| nb_cpus = sysinfo.dwNumberOfProcessors; | |||||
| #elif HAVE_SYSCTL | |||||
| int mib[2] = { CTL_HW, HW_NCPU }; | |||||
| size_t len = sizeof(nb_cpus); | |||||
| ret = sysctl(mib, 2, &nb_cpus, &len, NULL, 0); | |||||
| if (ret == -1) | |||||
| nb_cpus = 0; | |||||
| #endif | |||||
| av_log(avctx, AV_LOG_DEBUG, "detected %d logical cores\n", nb_cpus); | |||||
| return FFMIN(nb_cpus, MAX_AUTO_THREADS); | |||||
| } | |||||
| static void* attribute_align_arg worker(void *v) | static void* attribute_align_arg worker(void *v) | ||||
| { | { | ||||
| AVCodecContext *avctx = v; | AVCodecContext *avctx = v; | ||||
| @@ -239,8 +284,17 @@ static int thread_init(AVCodecContext *avctx) | |||||
| ThreadContext *c; | ThreadContext *c; | ||||
| int thread_count = avctx->thread_count; | int thread_count = avctx->thread_count; | ||||
| if (thread_count <= 1) | |||||
| if (!thread_count) { | |||||
| int nb_cpus = get_logical_cpus(avctx); | |||||
| // use number of cores + 1 as thread count if there is motre than one | |||||
| if (nb_cpus > 1) | |||||
| thread_count = avctx->thread_count = nb_cpus + 1; | |||||
| } | |||||
| if (thread_count <= 1) { | |||||
| avctx->active_thread_type = 0; | |||||
| return 0; | return 0; | ||||
| } | |||||
| c = av_mallocz(sizeof(ThreadContext)); | c = av_mallocz(sizeof(ThreadContext)); | ||||
| if (!c) | if (!c) | ||||
| @@ -704,6 +758,13 @@ static int frame_thread_init(AVCodecContext *avctx) | |||||
| FrameThreadContext *fctx; | FrameThreadContext *fctx; | ||||
| int i, err = 0; | int i, err = 0; | ||||
| if (!thread_count) { | |||||
| int nb_cpus = get_logical_cpus(avctx); | |||||
| // use number of cores + 1 as thread count if there is motre than one | |||||
| if (nb_cpus > 1) | |||||
| thread_count = avctx->thread_count = nb_cpus + 1; | |||||
| } | |||||
| if (thread_count <= 1) { | if (thread_count <= 1) { | ||||
| avctx->active_thread_type = 0; | avctx->active_thread_type = 0; | ||||
| return 0; | return 0; | ||||
| @@ -35,7 +35,7 @@ | |||||
| #include <stddef.h> | #include <stddef.h> | ||||
| #include <stdio.h> | #include <stdio.h> | ||||
| #define ALT_BITSTREAM_READER_LE | |||||
| #define BITSTREAM_READER_LE | |||||
| #include "avcodec.h" | #include "avcodec.h" | ||||
| #include "get_bits.h" | #include "get_bits.h" | ||||
| #include "dsputil.h" | #include "dsputil.h" | ||||
| @@ -477,7 +477,10 @@ static int ra144_encode_frame(AVCodecContext *avctx, uint8_t *frame, | |||||
| * The filter is unstable: use the coefficients of the previous frame. | * The filter is unstable: use the coefficients of the previous frame. | ||||
| */ | */ | ||||
| ff_int_to_int16(block_coefs[NBLOCKS - 1], ractx->lpc_coef[1]); | ff_int_to_int16(block_coefs[NBLOCKS - 1], ractx->lpc_coef[1]); | ||||
| ff_eval_refl(lpc_refl, block_coefs[NBLOCKS - 1], avctx); | |||||
| if (ff_eval_refl(lpc_refl, block_coefs[NBLOCKS - 1], avctx)) { | |||||
| /* the filter is still unstable. set reflection coeffs to zero. */ | |||||
| memset(lpc_refl, 0, sizeof(lpc_refl)); | |||||
| } | |||||
| } | } | ||||
| init_put_bits(&pb, frame, buf_size); | init_put_bits(&pb, frame, buf_size); | ||||
| for (i = 0; i < LPC_ORDER; i++) { | for (i = 0; i < LPC_ORDER; i++) { | ||||
| @@ -20,7 +20,7 @@ | |||||
| */ | */ | ||||
| #include "avcodec.h" | #include "avcodec.h" | ||||
| #define ALT_BITSTREAM_READER_LE | |||||
| #define BITSTREAM_READER_LE | |||||
| #include "get_bits.h" | #include "get_bits.h" | ||||
| #include "ra288.h" | #include "ra288.h" | ||||
| #include "lpc.h" | #include "lpc.h" | ||||
| @@ -27,7 +27,7 @@ | |||||
| #include "libavutil/mathematics.h" | #include "libavutil/mathematics.h" | ||||
| #include "avcodec.h" | #include "avcodec.h" | ||||
| #define ALT_BITSTREAM_READER_LE | |||||
| #define BITSTREAM_READER_LE | |||||
| #include "get_bits.h" | #include "get_bits.h" | ||||
| #include "dsputil.h" | #include "dsputil.h" | ||||
| @@ -35,7 +35,7 @@ | |||||
| #include "libavutil/audioconvert.h" | #include "libavutil/audioconvert.h" | ||||
| #include "mathops.h" | #include "mathops.h" | ||||
| #define ALT_BITSTREAM_READER_LE | |||||
| #define BITSTREAM_READER_LE | |||||
| #include "get_bits.h" | #include "get_bits.h" | ||||
| #include "bytestream.h" | #include "bytestream.h" | ||||
| @@ -25,7 +25,7 @@ | |||||
| */ | */ | ||||
| #include "avcodec.h" | #include "avcodec.h" | ||||
| #define ALT_BITSTREAM_READER_LE | |||||
| #define BITSTREAM_READER_LE | |||||
| #include "get_bits.h" | #include "get_bits.h" | ||||
| @@ -179,6 +179,7 @@ static void truespeech_apply_twopoint_filter(TSContext *dec, int quart) | |||||
| for(i = 0; i < 146; i++) | for(i = 0; i < 146; i++) | ||||
| tmp[i] = dec->filtbuf[i]; | tmp[i] = dec->filtbuf[i]; | ||||
| off = (t / 25) + dec->offset1[quart >> 1] + 18; | off = (t / 25) + dec->offset1[quart >> 1] + 18; | ||||
| off = av_clip(off, 0, 145); | |||||
| ptr0 = tmp + 145 - off; | ptr0 = tmp + 145 - off; | ||||
| ptr1 = tmp + 146; | ptr1 = tmp + 146; | ||||
| filter = (const int16_t*)ts_order2_coeffs + (t % 25) * 2; | filter = (const int16_t*)ts_order2_coeffs + (t % 25) * 2; | ||||
| @@ -27,7 +27,7 @@ | |||||
| * @author Alex Beregszaszi | * @author Alex Beregszaszi | ||||
| */ | */ | ||||
| #define ALT_BITSTREAM_READER_LE | |||||
| #define BITSTREAM_READER_LE | |||||
| //#define DEBUG | //#define DEBUG | ||||
| #include <limits.h> | #include <limits.h> | ||||
| #include "avcodec.h" | #include "avcodec.h" | ||||
| @@ -20,8 +20,8 @@ | |||||
| * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | ||||
| */ | */ | ||||
| #include "libavutil/intreadwrite.h" | |||||
| #include "avcodec.h" | #include "avcodec.h" | ||||
| #include "get_bits.h" | |||||
| static av_cold int v410_decode_init(AVCodecContext *avctx) | static av_cold int v410_decode_init(AVCodecContext *avctx) | ||||
| { | { | ||||
| @@ -24,7 +24,7 @@ | |||||
| * VBLE Decoder | * VBLE Decoder | ||||
| */ | */ | ||||
| #define ALT_BITSTREAM_READER_LE | |||||
| #define BITSTREAM_READER_LE | |||||
| #include "avcodec.h" | #include "avcodec.h" | ||||
| #include "dsputil.h" | #include "dsputil.h" | ||||
| @@ -26,7 +26,7 @@ | |||||
| * @author Denes Balatoni ( dbalatoni programozo hu ) | * @author Denes Balatoni ( dbalatoni programozo hu ) | ||||
| */ | */ | ||||
| #define ALT_BITSTREAM_READER_LE | |||||
| #define BITSTREAM_READER_LE | |||||
| #include "avcodec.h" | #include "avcodec.h" | ||||
| #include "get_bits.h" | #include "get_bits.h" | ||||
| @@ -29,7 +29,7 @@ | |||||
| #include <inttypes.h> | #include <inttypes.h> | ||||
| #include <math.h> | #include <math.h> | ||||
| #define ALT_BITSTREAM_READER_LE | |||||
| #define BITSTREAM_READER_LE | |||||
| #include "avcodec.h" | #include "avcodec.h" | ||||
| #include "get_bits.h" | #include "get_bits.h" | ||||
| #include "dsputil.h" | #include "dsputil.h" | ||||
| @@ -18,7 +18,7 @@ | |||||
| * License along with FFmpeg; if not, write to the Free Software | * License along with FFmpeg; if not, write to the Free Software | ||||
| * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | ||||
| */ | */ | ||||
| #define ALT_BITSTREAM_READER_LE | |||||
| #define BITSTREAM_READER_LE | |||||
| #include "avcodec.h" | #include "avcodec.h" | ||||
| #include "get_bits.h" | #include "get_bits.h" | ||||
| #include "unary.h" | #include "unary.h" | ||||
| @@ -35,7 +35,7 @@ | |||||
| #include "libavutil/intreadwrite.h" | #include "libavutil/intreadwrite.h" | ||||
| #include "avcodec.h" | #include "avcodec.h" | ||||
| #include "bytestream.h" | #include "bytestream.h" | ||||
| #define ALT_BITSTREAM_READER_LE | |||||
| #define BITSTREAM_READER_LE | |||||
| #include "get_bits.h" | #include "get_bits.h" | ||||
| // for av_memcpy_backptr | // for av_memcpy_backptr | ||||
| #include "libavutil/lzo.h" | #include "libavutil/lzo.h" | ||||
| @@ -23,7 +23,7 @@ | |||||
| #include "avcodec.h" | #include "avcodec.h" | ||||
| #include "libavutil/intreadwrite.h" | #include "libavutil/intreadwrite.h" | ||||
| #include "bytestream.h" | #include "bytestream.h" | ||||
| #define ALT_BITSTREAM_READER_LE | |||||
| #define BITSTREAM_READER_LE | |||||
| #include "get_bits.h" | #include "get_bits.h" | ||||
| // for av_memcpy_backptr | // for av_memcpy_backptr | ||||
| #include "libavutil/lzo.h" | #include "libavutil/lzo.h" | ||||
| @@ -20,6 +20,7 @@ OBJS = allfilters.o \ | |||||
| formats.o \ | formats.o \ | ||||
| graphparser.o \ | graphparser.o \ | ||||
| transform.o \ | transform.o \ | ||||
| vsrc_buffer.o | |||||
| OBJS-$(CONFIG_AVCODEC) += avcodec.o | OBJS-$(CONFIG_AVCODEC) += avcodec.o | ||||
| @@ -83,7 +84,6 @@ OBJS-$(CONFIG_UNSHARP_FILTER) += vf_unsharp.o | |||||
| OBJS-$(CONFIG_VFLIP_FILTER) += vf_vflip.o | OBJS-$(CONFIG_VFLIP_FILTER) += vf_vflip.o | ||||
| OBJS-$(CONFIG_YADIF_FILTER) += vf_yadif.o | OBJS-$(CONFIG_YADIF_FILTER) += vf_yadif.o | ||||
| OBJS-$(CONFIG_BUFFER_FILTER) += vsrc_buffer.o | |||||
| OBJS-$(CONFIG_CELLAUTO_FILTER) += vsrc_cellauto.o | OBJS-$(CONFIG_CELLAUTO_FILTER) += vsrc_cellauto.o | ||||
| OBJS-$(CONFIG_COLOR_FILTER) += vsrc_color.o | OBJS-$(CONFIG_COLOR_FILTER) += vsrc_color.o | ||||
| OBJS-$(CONFIG_FREI0R_SRC_FILTER) += vf_frei0r.o | OBJS-$(CONFIG_FREI0R_SRC_FILTER) += vf_frei0r.o | ||||
| @@ -94,7 +94,6 @@ void avfilter_register_all(void) | |||||
| REGISTER_FILTER (VFLIP, vflip, vf); | REGISTER_FILTER (VFLIP, vflip, vf); | ||||
| REGISTER_FILTER (YADIF, yadif, vf); | REGISTER_FILTER (YADIF, yadif, vf); | ||||
| REGISTER_FILTER (BUFFER, buffer, vsrc); | |||||
| REGISTER_FILTER (CELLAUTO, cellauto, vsrc); | REGISTER_FILTER (CELLAUTO, cellauto, vsrc); | ||||
| REGISTER_FILTER (COLOR, color, vsrc); | REGISTER_FILTER (COLOR, color, vsrc); | ||||
| REGISTER_FILTER (FREI0R, frei0r_src, vsrc); | REGISTER_FILTER (FREI0R, frei0r_src, vsrc); | ||||
| @@ -108,4 +107,10 @@ void avfilter_register_all(void) | |||||
| REGISTER_FILTER (BUFFERSINK, buffersink, vsink); | REGISTER_FILTER (BUFFERSINK, buffersink, vsink); | ||||
| REGISTER_FILTER (NULLSINK, nullsink, vsink); | REGISTER_FILTER (NULLSINK, nullsink, vsink); | ||||
| /* vsrc_buffer is a part of public API => registered unconditionally */ | |||||
| { | |||||
| extern avfilter_vsrc_buffer; | |||||
| avfilter_register(&avfilter_vsrc_buffer); | |||||
| } | |||||
| } | } | ||||
| @@ -56,7 +56,8 @@ OBJS-$(CONFIG_BIT_DEMUXER) += bit.o | |||||
| OBJS-$(CONFIG_BIT_MUXER) += bit.o | OBJS-$(CONFIG_BIT_MUXER) += bit.o | ||||
| OBJS-$(CONFIG_BMV_DEMUXER) += bmv.o | OBJS-$(CONFIG_BMV_DEMUXER) += bmv.o | ||||
| OBJS-$(CONFIG_C93_DEMUXER) += c93.o vocdec.o voc.o | OBJS-$(CONFIG_C93_DEMUXER) += c93.o vocdec.o voc.o | ||||
| OBJS-$(CONFIG_CAF_DEMUXER) += cafdec.o caf.o mov.o riff.o isom.o | |||||
| OBJS-$(CONFIG_CAF_DEMUXER) += cafdec.o caf.o mov.o mov_chan.o \ | |||||
| riff.o isom.o | |||||
| OBJS-$(CONFIG_CAF_MUXER) += cafenc.o caf.o riff.o isom.o | OBJS-$(CONFIG_CAF_MUXER) += cafenc.o caf.o riff.o isom.o | ||||
| OBJS-$(CONFIG_CAVSVIDEO_DEMUXER) += cavsvideodec.o rawdec.o | OBJS-$(CONFIG_CAVSVIDEO_DEMUXER) += cavsvideodec.o rawdec.o | ||||
| OBJS-$(CONFIG_CAVSVIDEO_MUXER) += rawenc.o | OBJS-$(CONFIG_CAVSVIDEO_MUXER) += rawenc.o | ||||
| @@ -195,7 +196,7 @@ OBJS-$(CONFIG_OGG_DEMUXER) += oggdec.o \ | |||||
| OBJS-$(CONFIG_OGG_MUXER) += oggenc.o \ | OBJS-$(CONFIG_OGG_MUXER) += oggenc.o \ | ||||
| vorbiscomment.o | vorbiscomment.o | ||||
| OBJS-$(CONFIG_OMA_DEMUXER) += omadec.o pcm.o oma.o | OBJS-$(CONFIG_OMA_DEMUXER) += omadec.o pcm.o oma.o | ||||
| OBJS-$(CONFIG_OMA_MUXER) += omaenc.o rawenc.o oma.o | |||||
| OBJS-$(CONFIG_OMA_MUXER) += omaenc.o rawenc.o oma.o id3v2enc.o | |||||
| OBJS-$(CONFIG_PCM_ALAW_DEMUXER) += pcmdec.o pcm.o rawdec.o | OBJS-$(CONFIG_PCM_ALAW_DEMUXER) += pcmdec.o pcm.o rawdec.o | ||||
| OBJS-$(CONFIG_PCM_ALAW_MUXER) += pcmenc.o rawenc.o | OBJS-$(CONFIG_PCM_ALAW_MUXER) += pcmenc.o rawenc.o | ||||
| OBJS-$(CONFIG_PCM_F32BE_DEMUXER) += pcmdec.o pcm.o rawdec.o | OBJS-$(CONFIG_PCM_F32BE_DEMUXER) += pcmdec.o pcm.o rawdec.o | ||||
| @@ -331,7 +332,7 @@ OBJS-$(CONFIG_WTV_MUXER) += wtvenc.o wtv.o asf.o asfenc.o riff.o | |||||
| OBJS-$(CONFIG_WV_DEMUXER) += wv.o apetag.o | OBJS-$(CONFIG_WV_DEMUXER) += wv.o apetag.o | ||||
| OBJS-$(CONFIG_XA_DEMUXER) += xa.o | OBJS-$(CONFIG_XA_DEMUXER) += xa.o | ||||
| OBJS-$(CONFIG_XBIN_DEMUXER) += bintext.o sauce.o | OBJS-$(CONFIG_XBIN_DEMUXER) += bintext.o sauce.o | ||||
| OBJS-$(CONFIG_XMV_DEMUXER) += xmv.o | |||||
| OBJS-$(CONFIG_XMV_DEMUXER) += xmv.o riff.o | |||||
| OBJS-$(CONFIG_XWMA_DEMUXER) += xwma.o riff.o | OBJS-$(CONFIG_XWMA_DEMUXER) += xwma.o riff.o | ||||
| OBJS-$(CONFIG_YOP_DEMUXER) += yop.o | OBJS-$(CONFIG_YOP_DEMUXER) += yop.o | ||||
| OBJS-$(CONFIG_YUV4MPEGPIPE_MUXER) += yuv4mpeg.o | OBJS-$(CONFIG_YUV4MPEGPIPE_MUXER) += yuv4mpeg.o | ||||
| @@ -857,6 +857,40 @@ static int mov_read_enda(MOVContext *c, AVIOContext *pb, MOVAtom atom) | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| static int mov_read_fiel(MOVContext *c, AVIOContext *pb, MOVAtom atom) | |||||
| { | |||||
| AVStream *st; | |||||
| unsigned mov_field_order; | |||||
| enum AVFieldOrder decoded_field_order = AV_FIELD_UNKNOWN; | |||||
| if (c->fc->nb_streams < 1) // will happen with jp2 files | |||||
| return 0; | |||||
| st = c->fc->streams[c->fc->nb_streams-1]; | |||||
| if (atom.size < 2) | |||||
| return AVERROR_INVALIDDATA; | |||||
| mov_field_order = avio_rb16(pb); | |||||
| if ((mov_field_order & 0xFF00) == 0x0100) | |||||
| decoded_field_order = AV_FIELD_PROGRESSIVE; | |||||
| else if ((mov_field_order & 0xFF00) == 0x0200) { | |||||
| switch (mov_field_order & 0xFF) { | |||||
| case 0x01: decoded_field_order = AV_FIELD_TT; | |||||
| break; | |||||
| case 0x06: decoded_field_order = AV_FIELD_BB; | |||||
| break; | |||||
| case 0x09: decoded_field_order = AV_FIELD_TB; | |||||
| break; | |||||
| case 0x0E: decoded_field_order = AV_FIELD_BT; | |||||
| break; | |||||
| } | |||||
| } | |||||
| if (decoded_field_order == AV_FIELD_UNKNOWN && mov_field_order) { | |||||
| av_log(NULL, AV_LOG_ERROR, "Unknown MOV field order 0x%04x\n", mov_field_order); | |||||
| } | |||||
| st->codec->field_order = decoded_field_order; | |||||
| return 0; | |||||
| } | |||||
| /* FIXME modify qdm2/svq3/h264 decoders to take full atom as extradata */ | /* FIXME modify qdm2/svq3/h264 decoders to take full atom as extradata */ | ||||
| static int mov_read_extradata(MOVContext *c, AVIOContext *pb, MOVAtom atom, | static int mov_read_extradata(MOVContext *c, AVIOContext *pb, MOVAtom atom, | ||||
| enum CodecID codec_id) | enum CodecID codec_id) | ||||
| @@ -898,11 +932,6 @@ static int mov_read_avss(MOVContext *c, AVIOContext *pb, MOVAtom atom) | |||||
| return mov_read_extradata(c, pb, atom, CODEC_ID_AVS); | return mov_read_extradata(c, pb, atom, CODEC_ID_AVS); | ||||
| } | } | ||||
| static int mov_read_fiel(MOVContext *c, AVIOContext *pb, MOVAtom atom) | |||||
| { | |||||
| return mov_read_extradata(c, pb, atom, CODEC_ID_MJPEG); | |||||
| } | |||||
| static int mov_read_jp2h(MOVContext *c, AVIOContext *pb, MOVAtom atom) | static int mov_read_jp2h(MOVContext *c, AVIOContext *pb, MOVAtom atom) | ||||
| { | { | ||||
| return mov_read_extradata(c, pb, atom, CODEC_ID_JPEG2000); | return mov_read_extradata(c, pb, atom, CODEC_ID_JPEG2000); | ||||
| @@ -950,6 +979,15 @@ static int mov_read_glbl(MOVContext *c, AVIOContext *pb, MOVAtom atom) | |||||
| if ((uint64_t)atom.size > (1<<30)) | if ((uint64_t)atom.size > (1<<30)) | ||||
| return -1; | return -1; | ||||
| if (atom.size >= 10) { | |||||
| // Broken files created by legacy versions of Libav and FFmpeg will | |||||
| // wrap a whole fiel atom inside of a glbl atom. | |||||
| unsigned size = avio_rb32(pb); | |||||
| unsigned type = avio_rl32(pb); | |||||
| avio_seek(pb, -8, SEEK_CUR); | |||||
| if (type == MKTAG('f','i','e','l') && size == atom.size) | |||||
| return mov_read_default(c, pb, atom); | |||||
| } | |||||
| av_free(st->codec->extradata); | av_free(st->codec->extradata); | ||||
| st->codec->extradata = av_mallocz(atom.size + FF_INPUT_BUFFER_PADDING_SIZE); | st->codec->extradata = av_mallocz(atom.size + FF_INPUT_BUFFER_PADDING_SIZE); | ||||
| if (!st->codec->extradata) | if (!st->codec->extradata) | ||||
| @@ -799,6 +799,23 @@ static int mov_write_uuid_tag_ipod(AVIOContext *pb) | |||||
| return 28; | return 28; | ||||
| } | } | ||||
| static const uint16_t fiel_data[] = { | |||||
| 0x0000, 0x0100, 0x0201, 0x0206, 0x0209, 0x020e | |||||
| }; | |||||
| static int mov_write_fiel_tag(AVIOContext *pb, MOVTrack *track) | |||||
| { | |||||
| unsigned mov_field_order = 0; | |||||
| if (track->enc->field_order < FF_ARRAY_ELEMS(fiel_data)) | |||||
| mov_field_order = fiel_data[track->enc->field_order]; | |||||
| else | |||||
| return 0; | |||||
| avio_wb32(pb, 10); | |||||
| ffio_wfourcc(pb, "fiel"); | |||||
| avio_wb16(pb, mov_field_order); | |||||
| return 10; | |||||
| } | |||||
| static int mov_write_subtitle_tag(AVIOContext *pb, MOVTrack *track) | static int mov_write_subtitle_tag(AVIOContext *pb, MOVTrack *track) | ||||
| { | { | ||||
| int64_t pos = avio_tell(pb); | int64_t pos = avio_tell(pb); | ||||
| @@ -885,7 +902,9 @@ static int mov_write_video_tag(AVIOContext *pb, MOVTrack *track) | |||||
| mov_write_avcc_tag(pb, track); | mov_write_avcc_tag(pb, track); | ||||
| if(track->mode == MODE_IPOD) | if(track->mode == MODE_IPOD) | ||||
| mov_write_uuid_tag_ipod(pb); | mov_write_uuid_tag_ipod(pb); | ||||
| } else if(track->vosLen > 0) | |||||
| } else if (track->enc->field_order != AV_FIELD_UNKNOWN) | |||||
| mov_write_fiel_tag(pb, track); | |||||
| else if(track->vosLen > 0) | |||||
| mov_write_glbl_tag(pb, track); | mov_write_glbl_tag(pb, track); | ||||
| if (track->enc->sample_aspect_ratio.den && track->enc->sample_aspect_ratio.num && | if (track->enc->sample_aspect_ratio.den && track->enc->sample_aspect_ratio.num && | ||||
| @@ -655,9 +655,11 @@ const char *sws_format_name(enum PixelFormat format); | |||||
| || isBGRinInt(x) \ | || isBGRinInt(x) \ | ||||
| ) | ) | ||||
| #else | #else | ||||
| #define isPacked(x) \ | |||||
| #define isPacked(x) (\ | |||||
| (av_pix_fmt_descriptors[x].nb_components >= 2 && \ | (av_pix_fmt_descriptors[x].nb_components >= 2 && \ | ||||
| !(av_pix_fmt_descriptors[x].flags & PIX_FMT_PLANAR)) | |||||
| !(av_pix_fmt_descriptors[x].flags & PIX_FMT_PLANAR)) || \ | |||||
| (x) == PIX_FMT_PAL8\ | |||||
| ) | |||||
| #endif | #endif | ||||
| #define isPlanar(x) \ | #define isPlanar(x) \ | ||||