* qatar/master: avformat: Avoid a warning about mixed declarations and code BMV demuxer and decoder matroskaenc: Make sure the seekhead struct is freed even on seek failure mpeg12enc: Remove write-only variables. mpeg12enc: Don't set up run-level info for level 0. msmpeg4: Don't set up run-level info for level 0. avformat: Warn about using network functions without calling avformat_network_init avformat: Revise wording rdt: Set AVFMT_NOFILE on ff_rdt_demuxer rdt: Check the return value of avformat_open rtsp: Discard the dynamic handler, if it has an alloc function which failed dsputil: use cpuflags in x86 versions of vector_clip_int32() Conflicts: libavcodec/avcodec.h libavcodec/version.h libavformat/Makefile libavformat/allformats.c libavformat/version.h Merged-by: Michael Niedermayer <michaelni@gmx.at>tags/n0.9
| @@ -118,6 +118,7 @@ easier to use. The changes are: | |||
| AVCodecContext deprecated. Codec private options should be used instead. | |||
| - Properly working defaults in libx264 wrapper, support for native presets. | |||
| - Encrypted OMA files support | |||
| - Discworld II BMV decoding support | |||
| version 0.8: | |||
| @@ -71,6 +71,7 @@ library: | |||
| @item Brute Force & Ignorance @tab @tab X | |||
| @tab Used in the game Flash Traffic: City of Angels. | |||
| @item BWF @tab X @tab X | |||
| @item Discworld II BMV @tab @tab X | |||
| @item Interplay C93 @tab @tab X | |||
| @tab Used in the game Cyberia from Interplay. | |||
| @item Delphine Software International CIN @tab @tab X | |||
| @@ -386,6 +387,7 @@ following image formats are supported: | |||
| @tab AVS1-P2, JiZhun profile, encoding through external library libxavs | |||
| @item Delphine Software International CIN video @tab @tab X | |||
| @tab Codec used in Delphine Software International games. | |||
| @item Discworld II BMV Video @tab @tab X | |||
| @item Cinepak @tab @tab X | |||
| @item Cirrus Logic AccuPak @tab @tab X | |||
| @tab fourcc: CLJR | |||
| @@ -624,6 +626,7 @@ following image formats are supported: | |||
| @tab decoding supported through external library libcelt | |||
| @item Delphine Software International CIN audio @tab @tab X | |||
| @tab Codec used in Delphine Software International games. | |||
| @item Discworld II BMV Audio @tab @tab X | |||
| @item COOK @tab @tab X | |||
| @tab All versions except 5.1 are supported. | |||
| @item DCA (DTS Coherent Acoustics) @tab X @tab X | |||
| @@ -100,6 +100,8 @@ OBJS-$(CONFIG_BINKAUDIO_RDFT_DECODER) += binkaudio.o wma.o | |||
| OBJS-$(CONFIG_BINTEXT_DECODER) += bintext.o cga_data.o | |||
| OBJS-$(CONFIG_BMP_DECODER) += bmp.o msrledec.o | |||
| OBJS-$(CONFIG_BMP_ENCODER) += bmpenc.o | |||
| OBJS-$(CONFIG_BMV_VIDEO_DECODER) += bmv.o | |||
| OBJS-$(CONFIG_BMV_AUDIO_DECODER) += bmv.o | |||
| OBJS-$(CONFIG_C93_DECODER) += c93.o | |||
| OBJS-$(CONFIG_CAVS_DECODER) += cavs.o cavsdec.o cavsdsp.o \ | |||
| mpeg12data.o mpegvideo.o | |||
| @@ -84,6 +84,7 @@ void avcodec_register_all(void) | |||
| REGISTER_DECODER (BFI, bfi); | |||
| REGISTER_DECODER (BINK, bink); | |||
| REGISTER_ENCDEC (BMP, bmp); | |||
| REGISTER_DECODER (BMV_VIDEO, bmv_video); | |||
| REGISTER_DECODER (C93, c93); | |||
| REGISTER_DECODER (CAVS, cavs); | |||
| REGISTER_DECODER (CDGRAPHICS, cdgraphics); | |||
| @@ -256,6 +257,7 @@ void avcodec_register_all(void) | |||
| REGISTER_DECODER (ATRAC3, atrac3); | |||
| REGISTER_DECODER (BINKAUDIO_DCT, binkaudio_dct); | |||
| REGISTER_DECODER (BINKAUDIO_RDFT, binkaudio_rdft); | |||
| REGISTER_DECODER (BMV_AUDIO, bmv_audio); | |||
| REGISTER_DECODER (COOK, cook); | |||
| REGISTER_ENCDEC (DCA, dca); | |||
| REGISTER_DECODER (DSICINAUDIO, dsicinaudio); | |||
| @@ -220,6 +220,7 @@ enum CodecID { | |||
| CODEC_ID_G729_DEPRECATED, | |||
| #endif | |||
| CODEC_ID_UTVIDEO_DEPRECATED, | |||
| CODEC_ID_BMV_VIDEO, | |||
| CODEC_ID_UTVIDEO = 0x800, | |||
| CODEC_ID_G2M = MKBETAG( 0 ,'G','2','M'), | |||
| @@ -363,6 +364,7 @@ enum CodecID { | |||
| CODEC_ID_8SVX_EXP, | |||
| CODEC_ID_8SVX_FIB, | |||
| #endif | |||
| CODEC_ID_BMV_AUDIO, | |||
| CODEC_ID_G729 = 0x15800, | |||
| CODEC_ID_G723_1= 0x15801, | |||
| CODEC_ID_8SVX_RAW = MKBETAG('8','S','V','X'), | |||
| @@ -0,0 +1,360 @@ | |||
| /* | |||
| * Discworld II BMV video and audio decoder | |||
| * Copyright (c) 2011 Konstantin Shishkov | |||
| * | |||
| * 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 "avcodec.h" | |||
| #include "bytestream.h" | |||
| enum BMVFlags{ | |||
| BMV_NOP = 0, | |||
| BMV_END, | |||
| BMV_DELTA, | |||
| BMV_INTRA, | |||
| BMV_SCROLL = 0x04, | |||
| BMV_PALETTE = 0x08, | |||
| BMV_COMMAND = 0x10, | |||
| BMV_AUDIO = 0x20, | |||
| BMV_EXT = 0x40, | |||
| BMV_PRINT = 0x80 | |||
| }; | |||
| #define SCREEN_WIDE 640 | |||
| #define SCREEN_HIGH 429 | |||
| typedef struct BMVDecContext { | |||
| AVCodecContext *avctx; | |||
| AVFrame pic; | |||
| uint8_t *frame, frame_base[SCREEN_WIDE * (SCREEN_HIGH + 1)]; | |||
| uint32_t pal[256]; | |||
| const uint8_t *stream; | |||
| } BMVDecContext; | |||
| #define NEXT_BYTE(v) v = forward ? v + 1 : v - 1; | |||
| static int decode_bmv_frame(const uint8_t *source, int src_len, uint8_t *frame, int frame_off) | |||
| { | |||
| int val, saved_val = 0; | |||
| int tmplen = src_len; | |||
| const uint8_t *src, *source_end = source + src_len; | |||
| uint8_t *frame_end = frame + SCREEN_WIDE * SCREEN_HIGH; | |||
| uint8_t *dst, *dst_end; | |||
| int len, mask; | |||
| int forward = (frame_off <= -SCREEN_WIDE) || (frame_off >= 0); | |||
| int read_two_nibbles, flag; | |||
| int advance_mode; | |||
| int mode = 0; | |||
| int i; | |||
| if (src_len <= 0) | |||
| return -1; | |||
| if (forward) { | |||
| src = source; | |||
| dst = frame; | |||
| dst_end = frame_end; | |||
| } else { | |||
| src = source + src_len - 1; | |||
| dst = frame_end - 1; | |||
| dst_end = frame - 1; | |||
| } | |||
| for (;;) { | |||
| int shift = 0; | |||
| flag = 0; | |||
| /* The mode/len decoding is a bit strange: | |||
| * values are coded as variable-length codes with nibble units, | |||
| * code end is signalled by two top bits in the nibble being nonzero. | |||
| * And since data is bytepacked and we read two nibbles at a time, | |||
| * we may get a nibble belonging to the next code. | |||
| * Hence this convoluted loop. | |||
| */ | |||
| if (!mode || (tmplen == 4)) { | |||
| if (src < source || src >= source_end) | |||
| return -1; | |||
| val = *src; | |||
| read_two_nibbles = 1; | |||
| } else { | |||
| val = saved_val; | |||
| read_two_nibbles = 0; | |||
| } | |||
| if (!(val & 0xC)) { | |||
| for (;;) { | |||
| if (!read_two_nibbles) { | |||
| if (src < source || src >= source_end) | |||
| return -1; | |||
| shift += 2; | |||
| val |= *src << shift; | |||
| if (*src & 0xC) | |||
| break; | |||
| } | |||
| // two upper bits of the nibble is zero, | |||
| // so shift top nibble value down into their place | |||
| read_two_nibbles = 0; | |||
| shift += 2; | |||
| mask = (1 << shift) - 1; | |||
| val = ((val >> 2) & ~mask) | (val & mask); | |||
| NEXT_BYTE(src); | |||
| if ((val & (0xC << shift))) { | |||
| flag = 1; | |||
| break; | |||
| } | |||
| } | |||
| } else if (mode) { | |||
| flag = tmplen != 4; | |||
| } | |||
| if (flag) { | |||
| tmplen = 4; | |||
| } else { | |||
| saved_val = val >> (4 + shift); | |||
| tmplen = 0; | |||
| val &= (1 << (shift + 4)) - 1; | |||
| NEXT_BYTE(src); | |||
| } | |||
| advance_mode = val & 1; | |||
| len = (val >> 1) - 1; | |||
| mode += 1 + advance_mode; | |||
| if (mode >= 4) | |||
| mode -= 3; | |||
| if (FFABS(dst_end - dst) < len) | |||
| return -1; | |||
| switch (mode) { | |||
| case 1: | |||
| if (forward) { | |||
| if (dst - frame + SCREEN_WIDE < frame_off || | |||
| frame_end - dst < frame_off + len) | |||
| return -1; | |||
| for (i = 0; i < len; i++) | |||
| dst[i] = dst[frame_off + i]; | |||
| dst += len; | |||
| } else { | |||
| dst -= len; | |||
| if (dst - frame + SCREEN_WIDE < frame_off || | |||
| frame_end - dst < frame_off + len) | |||
| return -1; | |||
| for (i = len - 1; i >= 0; i--) | |||
| dst[i] = dst[frame_off + i]; | |||
| } | |||
| break; | |||
| case 2: | |||
| if (forward) { | |||
| if (source + src_len - src < len) | |||
| return -1; | |||
| memcpy(dst, src, len); | |||
| dst += len; | |||
| src += len; | |||
| } else { | |||
| if (src - source < len) | |||
| return -1; | |||
| dst -= len; | |||
| src -= len; | |||
| memcpy(dst, src, len); | |||
| } | |||
| break; | |||
| case 3: | |||
| val = forward ? dst[-1] : dst[1]; | |||
| if (forward) { | |||
| memset(dst, val, len); | |||
| dst += len; | |||
| } else { | |||
| dst -= len; | |||
| memset(dst, val, len); | |||
| } | |||
| break; | |||
| default: | |||
| break; | |||
| } | |||
| if (dst == dst_end) | |||
| return 0; | |||
| } | |||
| return 0; | |||
| } | |||
| static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPacket *pkt) | |||
| { | |||
| BMVDecContext * const c = avctx->priv_data; | |||
| int type, scr_off; | |||
| int i; | |||
| uint8_t *srcptr, *outptr; | |||
| c->stream = pkt->data; | |||
| type = bytestream_get_byte(&c->stream); | |||
| if (type & BMV_AUDIO) { | |||
| int blobs = bytestream_get_byte(&c->stream); | |||
| if (pkt->size < blobs * 65 + 2) { | |||
| av_log(avctx, AV_LOG_ERROR, "Audio data doesn't fit in frame\n"); | |||
| return AVERROR_INVALIDDATA; | |||
| } | |||
| c->stream += blobs * 65; | |||
| } | |||
| if (type & BMV_COMMAND) { | |||
| int command_size = (type & BMV_PRINT) ? 8 : 10; | |||
| if (c->stream - pkt->data + command_size > pkt->size) { | |||
| av_log(avctx, AV_LOG_ERROR, "Command data doesn't fit in frame\n"); | |||
| return AVERROR_INVALIDDATA; | |||
| } | |||
| c->stream += command_size; | |||
| } | |||
| if (type & BMV_PALETTE) { | |||
| if (c->stream - pkt->data > pkt->size - 768) { | |||
| av_log(avctx, AV_LOG_ERROR, "Palette data doesn't fit in frame\n"); | |||
| return AVERROR_INVALIDDATA; | |||
| } | |||
| for (i = 0; i < 256; i++) | |||
| c->pal[i] = bytestream_get_be24(&c->stream); | |||
| } | |||
| if (type & BMV_SCROLL) { | |||
| if (c->stream - pkt->data > pkt->size - 2) { | |||
| av_log(avctx, AV_LOG_ERROR, "Screen offset data doesn't fit in frame\n"); | |||
| return AVERROR_INVALIDDATA; | |||
| } | |||
| scr_off = (int16_t)bytestream_get_le16(&c->stream); | |||
| } else if ((type & BMV_INTRA) == BMV_INTRA) { | |||
| scr_off = -640; | |||
| } else { | |||
| scr_off = 0; | |||
| } | |||
| if (decode_bmv_frame(c->stream, pkt->size - (c->stream - pkt->data), c->frame, scr_off)) { | |||
| av_log(avctx, AV_LOG_ERROR, "Error decoding frame data\n"); | |||
| return AVERROR_INVALIDDATA; | |||
| } | |||
| memcpy(c->pic.data[1], c->pal, AVPALETTE_SIZE); | |||
| c->pic.palette_has_changed = type & BMV_PALETTE; | |||
| outptr = c->pic.data[0]; | |||
| srcptr = c->frame; | |||
| for (i = 0; i < avctx->height; i++) { | |||
| memcpy(outptr, srcptr, avctx->width); | |||
| srcptr += avctx->width; | |||
| outptr += c->pic.linesize[0]; | |||
| } | |||
| *data_size = sizeof(AVFrame); | |||
| *(AVFrame*)data = c->pic; | |||
| /* always report that the buffer was completely consumed */ | |||
| return pkt->size; | |||
| } | |||
| static av_cold int decode_init(AVCodecContext *avctx) | |||
| { | |||
| BMVDecContext * const c = avctx->priv_data; | |||
| c->avctx = avctx; | |||
| avctx->pix_fmt = PIX_FMT_PAL8; | |||
| c->pic.reference = 1; | |||
| if (avctx->get_buffer(avctx, &c->pic) < 0) { | |||
| av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); | |||
| return -1; | |||
| } | |||
| c->frame = c->frame_base + 640; | |||
| return 0; | |||
| } | |||
| static av_cold int decode_end(AVCodecContext *avctx) | |||
| { | |||
| BMVDecContext *c = avctx->priv_data; | |||
| if (c->pic.data[0]) | |||
| avctx->release_buffer(avctx, &c->pic); | |||
| return 0; | |||
| } | |||
| static const int bmv_aud_mults[16] = { | |||
| 16512, 8256, 4128, 2064, 1032, 516, 258, 192, 129, 88, 64, 56, 48, 40, 36, 32 | |||
| }; | |||
| static av_cold int bmv_aud_decode_init(AVCodecContext *avctx) | |||
| { | |||
| if (avctx->channels != 2) { | |||
| av_log(avctx, AV_LOG_INFO, "invalid number of channels\n"); | |||
| return AVERROR(EINVAL); | |||
| } | |||
| avctx->sample_fmt = AV_SAMPLE_FMT_S16; | |||
| return 0; | |||
| } | |||
| static int bmv_aud_decode_frame(AVCodecContext *avctx, void *data, int *data_size, | |||
| AVPacket *avpkt) | |||
| { | |||
| const uint8_t *buf = avpkt->data; | |||
| int buf_size = avpkt->size; | |||
| int blocks = 0, total_blocks, i; | |||
| int out_size; | |||
| int16_t *output_samples = data; | |||
| int scale[2]; | |||
| total_blocks = *buf++; | |||
| if (buf_size < total_blocks * 65 + 1) { | |||
| av_log(avctx, AV_LOG_ERROR, "expected %d bytes, got %d\n", | |||
| total_blocks * 65 + 1, buf_size); | |||
| return AVERROR_INVALIDDATA; | |||
| } | |||
| out_size = total_blocks * 64 * sizeof(*output_samples); | |||
| if (*data_size < out_size) { | |||
| av_log(avctx, AV_LOG_ERROR, "Output buffer is too small\n"); | |||
| return AVERROR(EINVAL); | |||
| } | |||
| for (blocks = 0; blocks < total_blocks; blocks++) { | |||
| uint8_t code = *buf++; | |||
| code = (code >> 1) | (code << 7); | |||
| scale[0] = bmv_aud_mults[code & 0xF]; | |||
| scale[1] = bmv_aud_mults[code >> 4]; | |||
| for (i = 0; i < 32; i++) { | |||
| *output_samples++ = av_clip_int16((scale[0] * (int8_t)*buf++) >> 5); | |||
| *output_samples++ = av_clip_int16((scale[1] * (int8_t)*buf++) >> 5); | |||
| } | |||
| } | |||
| *data_size = out_size; | |||
| return buf_size; | |||
| } | |||
| AVCodec ff_bmv_video_decoder = { | |||
| .name = "bmv_video", | |||
| .type = AVMEDIA_TYPE_VIDEO, | |||
| .id = CODEC_ID_BMV_VIDEO, | |||
| .priv_data_size = sizeof(BMVDecContext), | |||
| .init = decode_init, | |||
| .close = decode_end, | |||
| .decode = decode_frame, | |||
| .long_name = NULL_IF_CONFIG_SMALL("Discworld II BMV video"), | |||
| }; | |||
| AVCodec ff_bmv_audio_decoder = { | |||
| .name = "bmv_audio", | |||
| .type = AVMEDIA_TYPE_AUDIO, | |||
| .id = CODEC_ID_BMV_AUDIO, | |||
| .init = bmv_aud_decode_init, | |||
| .decode = bmv_aud_decode_frame, | |||
| .long_name = NULL_IF_CONFIG_SMALL("Discworld II BMV audio"), | |||
| }; | |||
| @@ -75,11 +75,12 @@ static void init_uni_ac_vlc(RLTable *rl, uint8_t *uni_ac_vlc_len){ | |||
| for(i=0; i<128; i++){ | |||
| int level= i-64; | |||
| int run; | |||
| if (!level) | |||
| continue; | |||
| for(run=0; run<64; run++){ | |||
| int len, bits, code; | |||
| int len, code; | |||
| int alevel= FFABS(level); | |||
| int sign= (level>>31)&1; | |||
| if (alevel > rl->max_level[0][run]) | |||
| code= 111; /*rl->n*/ | |||
| @@ -87,25 +88,15 @@ static void init_uni_ac_vlc(RLTable *rl, uint8_t *uni_ac_vlc_len){ | |||
| code= rl->index_run[0][run] + alevel - 1; | |||
| if (code < 111 /* rl->n */) { | |||
| /* store the vlc & sign at once */ | |||
| /* length of vlc and sign */ | |||
| len= rl->table_vlc[code][1]+1; | |||
| bits= (rl->table_vlc[code][0]<<1) + sign; | |||
| } else { | |||
| len= rl->table_vlc[111/*rl->n*/][1]+6; | |||
| bits= rl->table_vlc[111/*rl->n*/][0]<<6; | |||
| bits|= run; | |||
| if (alevel < 128) { | |||
| bits<<=8; len+=8; | |||
| bits|= level & 0xff; | |||
| len += 8; | |||
| } else { | |||
| bits<<=16; len+=16; | |||
| bits|= level & 0xff; | |||
| if (level < 0) { | |||
| bits|= 0x8001 + level + 255; | |||
| } else { | |||
| bits|= level & 0xffff; | |||
| } | |||
| len += 16; | |||
| } | |||
| } | |||
| @@ -266,7 +266,7 @@ av_cold void ff_msmpeg4_encode_init(MpegEncContext *s) | |||
| for(i=0; i<NB_RL_TABLES; i++){ | |||
| int level; | |||
| for(level=0; level<=MAX_LEVEL; level++){ | |||
| for (level = 1; level <= MAX_LEVEL; level++) { | |||
| int run; | |||
| for(run=0; run<=MAX_RUN; run++){ | |||
| int last; | |||
| @@ -21,7 +21,7 @@ | |||
| #define AVCODEC_VERSION_H | |||
| #define LIBAVCODEC_VERSION_MAJOR 53 | |||
| #define LIBAVCODEC_VERSION_MINOR 28 | |||
| #define LIBAVCODEC_VERSION_MINOR 29 | |||
| #define LIBAVCODEC_VERSION_MICRO 0 | |||
| #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ | |||
| @@ -2402,9 +2402,9 @@ void ff_vector_clip_int32_mmx (int32_t *dst, const int32_t *src, int32_t min | |||
| int32_t max, unsigned int len); | |||
| void ff_vector_clip_int32_sse2 (int32_t *dst, const int32_t *src, int32_t min, | |||
| int32_t max, unsigned int len); | |||
| void ff_vector_clip_int32_sse2_int(int32_t *dst, const int32_t *src, int32_t min, | |||
| void ff_vector_clip_int32_int_sse2(int32_t *dst, const int32_t *src, int32_t min, | |||
| int32_t max, unsigned int len); | |||
| void ff_vector_clip_int32_sse41 (int32_t *dst, const int32_t *src, int32_t min, | |||
| void ff_vector_clip_int32_sse4 (int32_t *dst, const int32_t *src, int32_t min, | |||
| int32_t max, unsigned int len); | |||
| void dsputil_init_mmx(DSPContext* c, AVCodecContext *avctx) | |||
| @@ -2858,7 +2858,7 @@ void dsputil_init_mmx(DSPContext* c, AVCodecContext *avctx) | |||
| c->scalarproduct_int16 = ff_scalarproduct_int16_sse2; | |||
| c->scalarproduct_and_madd_int16 = ff_scalarproduct_and_madd_int16_sse2; | |||
| if (mm_flags & AV_CPU_FLAG_ATOM) { | |||
| c->vector_clip_int32 = ff_vector_clip_int32_sse2_int; | |||
| c->vector_clip_int32 = ff_vector_clip_int32_int_sse2; | |||
| } else { | |||
| c->vector_clip_int32 = ff_vector_clip_int32_sse2; | |||
| } | |||
| @@ -2890,7 +2890,7 @@ void dsputil_init_mmx(DSPContext* c, AVCodecContext *avctx) | |||
| if (mm_flags & AV_CPU_FLAG_SSE4 && HAVE_SSE) { | |||
| #if HAVE_YASM | |||
| c->vector_clip_int32 = ff_vector_clip_int32_sse41; | |||
| c->vector_clip_int32 = ff_vector_clip_int32_sse4; | |||
| #endif | |||
| } | |||
| @@ -1055,9 +1055,14 @@ emu_edge mmx | |||
| ; int32_t max, unsigned int len) | |||
| ;----------------------------------------------------------------------------- | |||
| %macro VECTOR_CLIP_INT32 4 | |||
| cglobal vector_clip_int32_%1, 5,5,%2, dst, src, min, max, len | |||
| %ifidn %1, sse2 | |||
| ; %1 = number of xmm registers used | |||
| ; %2 = number of inline load/process/store loops per asm loop | |||
| ; %3 = process 4*mmsize (%3=0) or 8*mmsize (%3=1) bytes per loop | |||
| ; %4 = CLIPD function takes min/max as float instead of int (CLIPD_SSE2) | |||
| ; %5 = suffix | |||
| %macro VECTOR_CLIP_INT32 4-5 | |||
| cglobal vector_clip_int32%5, 5,5,%2, dst, src, min, max, len | |||
| %if %4 | |||
| cvtsi2ss m4, minm | |||
| cvtsi2ss m5, maxm | |||
| %else | |||
| @@ -1068,12 +1073,12 @@ cglobal vector_clip_int32_%1, 5,5,%2, dst, src, min, max, len | |||
| SPLATD m5 | |||
| .loop: | |||
| %assign %%i 1 | |||
| %rep %3 | |||
| %rep %2 | |||
| mova m0, [srcq+mmsize*0*%%i] | |||
| mova m1, [srcq+mmsize*1*%%i] | |||
| mova m2, [srcq+mmsize*2*%%i] | |||
| mova m3, [srcq+mmsize*3*%%i] | |||
| %if %4 | |||
| %if %3 | |||
| mova m7, [srcq+mmsize*4*%%i] | |||
| mova m8, [srcq+mmsize*5*%%i] | |||
| mova m9, [srcq+mmsize*6*%%i] | |||
| @@ -1083,7 +1088,7 @@ cglobal vector_clip_int32_%1, 5,5,%2, dst, src, min, max, len | |||
| CLIPD m1, m4, m5, m6 | |||
| CLIPD m2, m4, m5, m6 | |||
| CLIPD m3, m4, m5, m6 | |||
| %if %4 | |||
| %if %3 | |||
| CLIPD m7, m4, m5, m6 | |||
| CLIPD m8, m4, m5, m6 | |||
| CLIPD m9, m4, m5, m6 | |||
| @@ -1093,7 +1098,7 @@ cglobal vector_clip_int32_%1, 5,5,%2, dst, src, min, max, len | |||
| mova [dstq+mmsize*1*%%i], m1 | |||
| mova [dstq+mmsize*2*%%i], m2 | |||
| mova [dstq+mmsize*3*%%i], m3 | |||
| %if %4 | |||
| %if %3 | |||
| mova [dstq+mmsize*4*%%i], m7 | |||
| mova [dstq+mmsize*5*%%i], m8 | |||
| mova [dstq+mmsize*6*%%i], m9 | |||
| @@ -1101,25 +1106,26 @@ cglobal vector_clip_int32_%1, 5,5,%2, dst, src, min, max, len | |||
| %endif | |||
| %assign %%i %%i+1 | |||
| %endrep | |||
| add srcq, mmsize*4*(%3+%4) | |||
| add dstq, mmsize*4*(%3+%4) | |||
| sub lend, mmsize*(%3+%4) | |||
| add srcq, mmsize*4*(%2+%3) | |||
| add dstq, mmsize*4*(%2+%3) | |||
| sub lend, mmsize*(%2+%3) | |||
| jg .loop | |||
| REP_RET | |||
| %endmacro | |||
| INIT_MMX | |||
| INIT_MMX mmx | |||
| %define SPLATD SPLATD_MMX | |||
| %define CLIPD CLIPD_MMX | |||
| VECTOR_CLIP_INT32 mmx, 0, 1, 0 | |||
| INIT_XMM | |||
| VECTOR_CLIP_INT32 0, 1, 0, 0 | |||
| INIT_XMM sse2 | |||
| %define SPLATD SPLATD_SSE2 | |||
| VECTOR_CLIP_INT32 sse2_int, 6, 1, 0 | |||
| VECTOR_CLIP_INT32 6, 1, 0, 0, _int | |||
| %define CLIPD CLIPD_SSE2 | |||
| VECTOR_CLIP_INT32 sse2, 6, 2, 0 | |||
| VECTOR_CLIP_INT32 6, 2, 0, 1 | |||
| INIT_XMM sse4 | |||
| %define CLIPD CLIPD_SSE41 | |||
| %ifdef m8 | |||
| VECTOR_CLIP_INT32 sse41, 11, 1, 1 | |||
| VECTOR_CLIP_INT32 11, 1, 1, 0 | |||
| %else | |||
| VECTOR_CLIP_INT32 sse41, 6, 1, 0 | |||
| VECTOR_CLIP_INT32 6, 1, 0, 0 | |||
| %endif | |||
| @@ -53,6 +53,7 @@ OBJS-$(CONFIG_BINK_DEMUXER) += bink.o | |||
| OBJS-$(CONFIG_BINTEXT_DEMUXER) += bintext.o sauce.o | |||
| OBJS-$(CONFIG_BIT_DEMUXER) += bit.o | |||
| OBJS-$(CONFIG_BIT_MUXER) += bit.o | |||
| OBJS-$(CONFIG_BMV_DEMUXER) += bmv.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_MUXER) += cafenc.o caf.o riff.o isom.o | |||
| @@ -74,6 +74,7 @@ void av_register_all(void) | |||
| REGISTER_DEMUXER (BINTEXT, bintext); | |||
| REGISTER_DEMUXER (BINK, bink); | |||
| REGISTER_MUXDEMUX (BIT, bit); | |||
| REGISTER_DEMUXER (BMV, bmv); | |||
| REGISTER_DEMUXER (C93, c93); | |||
| REGISTER_MUXDEMUX (CAF, caf); | |||
| REGISTER_MUXDEMUX (CAVSVIDEO, cavsvideo); | |||
| @@ -1860,8 +1860,8 @@ const AVClass *avformat_get_class(void); | |||
| * but recommended, since it avoids the overhead of implicitly | |||
| * doing the setup for each session. | |||
| * | |||
| * Since the next major version bump, calling this function will become | |||
| * mandatory if using network protocols. | |||
| * Calling this function will become mandatory if using network | |||
| * protocols at some major version bump. | |||
| */ | |||
| int avformat_network_init(void); | |||
| @@ -0,0 +1,136 @@ | |||
| /* | |||
| * Discworld II BMV demuxer | |||
| * Copyright (c) 2011 Konstantin Shishkov. | |||
| * | |||
| * 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 "avformat.h" | |||
| enum BMVFlags { | |||
| BMV_NOP = 0, | |||
| BMV_END, | |||
| BMV_DELTA, | |||
| BMV_INTRA, | |||
| BMV_AUDIO = 0x20, | |||
| }; | |||
| typedef struct BMVContext { | |||
| uint8_t *packet; | |||
| int size; | |||
| int get_next; | |||
| int64_t audio_pos; | |||
| } BMVContext; | |||
| static int bmv_read_header(AVFormatContext *s, AVFormatParameters *ap) | |||
| { | |||
| AVStream *st, *ast; | |||
| BMVContext *c = s->priv_data; | |||
| st = avformat_new_stream(s, 0); | |||
| if (!st) | |||
| return AVERROR(ENOMEM); | |||
| st->codec->codec_type = AVMEDIA_TYPE_VIDEO; | |||
| st->codec->codec_id = CODEC_ID_BMV_VIDEO; | |||
| st->codec->width = 640; | |||
| st->codec->height = 429; | |||
| st->codec->pix_fmt = PIX_FMT_PAL8; | |||
| av_set_pts_info(st, 16, 1, 12); | |||
| ast = avformat_new_stream(s, 0); | |||
| if (!ast) | |||
| return AVERROR(ENOMEM); | |||
| ast->codec->codec_type = AVMEDIA_TYPE_AUDIO; | |||
| ast->codec->codec_id = CODEC_ID_BMV_AUDIO; | |||
| ast->codec->channels = 2; | |||
| ast->codec->sample_rate = 22050; | |||
| av_set_pts_info(ast, 16, 1, 22050); | |||
| c->get_next = 1; | |||
| c->audio_pos = 0; | |||
| return 0; | |||
| } | |||
| static int bmv_read_packet(AVFormatContext *s, AVPacket *pkt) | |||
| { | |||
| BMVContext *c = s->priv_data; | |||
| int type; | |||
| void *tmp; | |||
| while (c->get_next) { | |||
| if (s->pb->eof_reached) | |||
| return AVERROR_EOF; | |||
| type = avio_r8(s->pb); | |||
| if (type == BMV_NOP) | |||
| continue; | |||
| if (type == BMV_END) | |||
| return AVERROR_EOF; | |||
| c->size = avio_rl24(s->pb); | |||
| if (!c->size) | |||
| return AVERROR_INVALIDDATA; | |||
| tmp = av_realloc(c->packet, c->size + 1); | |||
| if (!tmp) | |||
| return AVERROR(ENOMEM); | |||
| c->packet = tmp; | |||
| c->packet[0] = type; | |||
| if (avio_read(s->pb, c->packet + 1, c->size) != c->size) | |||
| return AVERROR(EIO); | |||
| if (type & BMV_AUDIO) { | |||
| int audio_size = c->packet[1] * 65 + 1; | |||
| if (audio_size >= c->size) { | |||
| av_log(s, AV_LOG_ERROR, "Reported audio size %d is bigger than packet size (%d)\n", | |||
| audio_size, c->size); | |||
| return AVERROR_INVALIDDATA; | |||
| } | |||
| if (av_new_packet(pkt, audio_size) < 0) | |||
| return AVERROR(ENOMEM); | |||
| memcpy(pkt->data, c->packet + 1, pkt->size); | |||
| pkt->stream_index = 1; | |||
| pkt->pts = c->audio_pos; | |||
| pkt->duration = c->packet[1] * 32; | |||
| c->audio_pos += pkt->duration; | |||
| c->get_next = 0; | |||
| return pkt->size; | |||
| } else | |||
| break; | |||
| } | |||
| if (av_new_packet(pkt, c->size + 1) < 0) | |||
| return AVERROR(ENOMEM); | |||
| pkt->stream_index = 0; | |||
| c->get_next = 1; | |||
| memcpy(pkt->data, c->packet, pkt->size); | |||
| return pkt->size; | |||
| } | |||
| static int bmv_read_close(AVFormatContext *s) | |||
| { | |||
| BMVContext *c = s->priv_data; | |||
| av_freep(&c->packet); | |||
| return 0; | |||
| } | |||
| AVInputFormat ff_bmv_demuxer = { | |||
| .name = "bmv", | |||
| .long_name = NULL_IF_CONFIG_SMALL("Discworld II BMV"), | |||
| .priv_data_size = sizeof(BMVContext), | |||
| .read_header = bmv_read_header, | |||
| .read_packet = bmv_read_packet, | |||
| .read_close = bmv_read_close, | |||
| .extensions = "bmv" | |||
| }; | |||
| @@ -317,9 +317,12 @@ static int64_t mkv_write_seekhead(AVIOContext *pb, mkv_seekhead *seekhead) | |||
| currentpos = avio_tell(pb); | |||
| if (seekhead->reserved_size > 0) | |||
| if (avio_seek(pb, seekhead->filepos, SEEK_SET) < 0) | |||
| return -1; | |||
| if (seekhead->reserved_size > 0) { | |||
| if (avio_seek(pb, seekhead->filepos, SEEK_SET) < 0) { | |||
| currentpos = -1; | |||
| goto fail; | |||
| } | |||
| } | |||
| metaseek = start_ebml_master(pb, MATROSKA_ID_SEEKHEAD, seekhead->reserved_size); | |||
| for (i = 0; i < seekhead->num_entries; i++) { | |||
| @@ -343,6 +346,7 @@ static int64_t mkv_write_seekhead(AVIOContext *pb, mkv_seekhead *seekhead) | |||
| currentpos = seekhead->filepos; | |||
| } | |||
| fail: | |||
| av_free(seekhead->entries); | |||
| av_free(seekhead); | |||
| @@ -120,8 +120,15 @@ void ff_tls_deinit(void) | |||
| avpriv_unlock_avformat(); | |||
| } | |||
| int ff_network_inited_globally; | |||
| int ff_network_init(void) | |||
| { | |||
| if (!ff_network_inited_globally) | |||
| av_log(NULL, AV_LOG_WARNING, "Using network protocols without global " | |||
| "network initialization. Please use " | |||
| "avformat_network_init(), this will " | |||
| "become mandatory later.\n"); | |||
| #if HAVE_WINSOCK2_H | |||
| WSADATA wsaData; | |||
| if (WSAStartup(MAKEWORD(1,1), &wsaData)) | |||
| @@ -56,6 +56,7 @@ int ff_neterrno(void); | |||
| int ff_socket_nonblock(int socket, int enable); | |||
| extern int ff_network_inited_globally; | |||
| int ff_network_init(void); | |||
| void ff_network_close(void); | |||
| @@ -524,7 +524,11 @@ rdt_new_context (void) | |||
| { | |||
| PayloadContext *rdt = av_mallocz(sizeof(PayloadContext)); | |||
| avformat_open_input(&rdt->rmctx, "", &ff_rdt_demuxer, NULL); | |||
| int ret = avformat_open_input(&rdt->rmctx, "", &ff_rdt_demuxer, NULL); | |||
| if (ret < 0) { | |||
| av_free(rdt); | |||
| return NULL; | |||
| } | |||
| return rdt; | |||
| } | |||
| @@ -975,4 +975,5 @@ AVInputFormat ff_rdt_demuxer = { | |||
| .long_name = NULL_IF_CONFIG_SMALL("RDT demuxer"), | |||
| .priv_data_size = sizeof(RMDemuxContext), | |||
| .read_close = rm_read_close, | |||
| .flags = AVFMT_NOFILE, | |||
| }; | |||
| @@ -172,8 +172,11 @@ static void init_rtp_handler(RTPDynamicProtocolHandler *handler, | |||
| return; | |||
| codec->codec_id = handler->codec_id; | |||
| rtsp_st->dynamic_handler = handler; | |||
| if (handler->alloc) | |||
| if (handler->alloc) { | |||
| rtsp_st->dynamic_protocol_context = handler->alloc(); | |||
| if (!rtsp_st->dynamic_protocol_context) | |||
| rtsp_st->dynamic_handler = NULL; | |||
| } | |||
| } | |||
| /* parse the rtpmap description: <codec_name>/<clock_rate>[/<other params>] */ | |||
| @@ -4188,6 +4188,7 @@ int avformat_network_init(void) | |||
| { | |||
| #if CONFIG_NETWORK | |||
| int ret; | |||
| ff_network_inited_globally = 1; | |||
| if ((ret = ff_network_init()) < 0) | |||
| return ret; | |||
| ff_tls_init(); | |||
| @@ -24,7 +24,7 @@ | |||
| #include "libavutil/avutil.h" | |||
| #define LIBAVFORMAT_VERSION_MAJOR 53 | |||
| #define LIBAVFORMAT_VERSION_MINOR 19 | |||
| #define LIBAVFORMAT_VERSION_MINOR 20 | |||
| #define LIBAVFORMAT_VERSION_MICRO 0 | |||
| #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ | |||