* qatar/master: avutil: Make LZO decoder code configure-time selectable avutil: Move memcpy_backptr() to mem.c configure: detect parisc64 automatically configure: detect ppc64 automatically configure: detect mips64 automatically configure: generalise 64-bit test smoothstreamingenc: Don't assume streams start from timestamp 0 Conflicts: configure libavutil/Makefile libavutil/lzo.c libavutil/lzo.h libavutil/mem.c libavutil/mem.h Merged-by: Michael Niedermayer <michaelni@gmx.at>tags/n1.1
@@ -129,6 +129,7 @@ Component options: | |||||
--disable-dct disable DCT code | --disable-dct disable DCT code | ||||
--disable-dwt disable DWT code | --disable-dwt disable DWT code | ||||
--disable-lsp disable LSP code | --disable-lsp disable LSP code | ||||
--disable-lzo disable LZO decoder code | |||||
--disable-mdct disable MDCT code | --disable-mdct disable MDCT code | ||||
--disable-rdft disable RDFT code | --disable-rdft disable RDFT code | ||||
--disable-fft disable FFT code | --disable-fft disable FFT code | ||||
@@ -1170,6 +1171,7 @@ CONFIG_LIST=" | |||||
libxavs | libxavs | ||||
libxvid | libxvid | ||||
lsp | lsp | ||||
lzo | |||||
mdct | mdct | ||||
memalign_hack | memalign_hack | ||||
memory_poisoning | memory_poisoning | ||||
@@ -1620,6 +1622,7 @@ binkaudio_dct_decoder_select="mdct rdft dct sinewin" | |||||
binkaudio_rdft_decoder_select="mdct rdft sinewin" | binkaudio_rdft_decoder_select="mdct rdft sinewin" | ||||
cavs_decoder_select="golomb mpegvideo" | cavs_decoder_select="golomb mpegvideo" | ||||
cook_decoder_select="mdct sinewin" | cook_decoder_select="mdct sinewin" | ||||
cscd_decoder_select="lzo" | |||||
cscd_decoder_suggest="zlib" | cscd_decoder_suggest="zlib" | ||||
dca_decoder_select="mdct" | dca_decoder_select="mdct" | ||||
dirac_decoder_select="dwt golomb" | dirac_decoder_select="dwt golomb" | ||||
@@ -1710,6 +1713,7 @@ msmpeg4v3_encoder_select="h263_encoder" | |||||
mss2_decoder_select="vc1_decoder" | mss2_decoder_select="vc1_decoder" | ||||
nellymoser_decoder_select="mdct sinewin" | nellymoser_decoder_select="mdct sinewin" | ||||
nellymoser_encoder_select="mdct sinewin" | nellymoser_encoder_select="mdct sinewin" | ||||
nuv_decoder_select="lzo" | |||||
png_decoder_select="zlib" | png_decoder_select="zlib" | ||||
png_encoder_select="zlib" | png_encoder_select="zlib" | ||||
qcelp_decoder_select="lsp" | qcelp_decoder_select="lsp" | ||||
@@ -1842,7 +1846,7 @@ ipod_muxer_select="mov_muxer" | |||||
libnut_demuxer_deps="libnut" | libnut_demuxer_deps="libnut" | ||||
libnut_muxer_deps="libnut" | libnut_muxer_deps="libnut" | ||||
matroska_audio_muxer_select="matroska_muxer" | matroska_audio_muxer_select="matroska_muxer" | ||||
matroska_demuxer_suggest="zlib bzlib" | |||||
matroska_demuxer_suggest="bzlib lzo zlib" | |||||
mov_demuxer_suggest="zlib" | mov_demuxer_suggest="zlib" | ||||
mp3_demuxer_select="mpegaudio_parser" | mp3_demuxer_select="mpegaudio_parser" | ||||
mp4_muxer_select="mov_muxer" | mp4_muxer_select="mov_muxer" | ||||
@@ -2740,21 +2744,13 @@ case "$arch" in | |||||
arm*|iPad*) | arm*|iPad*) | ||||
arch="arm" | arch="arm" | ||||
;; | ;; | ||||
mips|mipsel|IP*) | |||||
mips*|IP*) | |||||
arch="mips" | arch="mips" | ||||
;; | ;; | ||||
mips64*) | |||||
arch="mips" | |||||
subarch="mips64" | |||||
;; | |||||
parisc|hppa) | |||||
arch="parisc" | |||||
;; | |||||
parisc64|hppa64) | |||||
parisc*|hppa*) | |||||
arch="parisc" | arch="parisc" | ||||
subarch="parisc64" | |||||
;; | ;; | ||||
"Power Macintosh"|ppc|powerpc|ppc64|powerpc64) | |||||
"Power Macintosh"|ppc*|powerpc*) | |||||
arch="ppc" | arch="ppc" | ||||
;; | ;; | ||||
s390|s390x) | s390|s390x) | ||||
@@ -2974,13 +2970,31 @@ EOF | |||||
check_host_cflags -std=c99 | check_host_cflags -std=c99 | ||||
check_host_cflags -Wall | check_host_cflags -Wall | ||||
check_64bit(){ | |||||
arch32=$1 | |||||
arch64=$2 | |||||
expr=$3 | |||||
check_code cc "" "int test[2*($expr) - 1]" && | |||||
subarch=$arch64 || subarch=$arch32 | |||||
} | |||||
case "$arch" in | case "$arch" in | ||||
alpha|ia64|mips|parisc|sparc) | |||||
alpha|ia64|sparc) | |||||
spic=$shared | spic=$shared | ||||
;; | ;; | ||||
mips) | |||||
check_64bit mips mips64 '_MIPS_SIM > 1' | |||||
spic=$shared | |||||
;; | |||||
parisc) | |||||
check_64bit parisc parisc64 'sizeof(void *) > 4' | |||||
spic=$shared | |||||
;; | |||||
ppc) | |||||
check_64bit ppc ppc64 'sizeof(void *) > 4' | |||||
;; | |||||
x86) | x86) | ||||
subarch="x86_32" | |||||
check_code cc "" "int test[(int)sizeof(char*) - 7]" && subarch="x86_64" | |||||
check_64bit x86_32 x86_64 'sizeof(void *) > 4' | |||||
if test "$subarch" = "x86_64"; then | if test "$subarch" = "x86_64"; then | ||||
spic=$shared | spic=$shared | ||||
fi | fi | ||||
@@ -25,7 +25,7 @@ | |||||
#include "bytestream.h" | #include "bytestream.h" | ||||
#include "libavutil/imgutils.h" | #include "libavutil/imgutils.h" | ||||
#include "libavutil/lzo.h" // for av_memcpy_backptr | |||||
#include "libavutil/mem.h" | |||||
typedef struct DfaContext { | typedef struct DfaContext { | ||||
AVFrame pic; | AVFrame pic; | ||||
@@ -31,8 +31,8 @@ | |||||
#include "avcodec.h" | #include "avcodec.h" | ||||
#define BITSTREAM_READER_LE | #define BITSTREAM_READER_LE | ||||
#include "get_bits.h" | #include "get_bits.h" | ||||
#include "libavutil/lzo.h" | |||||
#include "libavutil/imgutils.h" | #include "libavutil/imgutils.h" | ||||
#include "libavutil/mem.h" | |||||
#define EA_PREAMBLE_SIZE 8 | #define EA_PREAMBLE_SIZE 8 | ||||
#define kVGT_TAG MKTAG('k', 'V', 'G', 'T') | #define kVGT_TAG MKTAG('k', 'V', 'G', 'T') | ||||
@@ -27,7 +27,7 @@ | |||||
#define BITSTREAM_READER_LE | #define BITSTREAM_READER_LE | ||||
#include "libavutil/audioconvert.h" | #include "libavutil/audioconvert.h" | ||||
#include "libavutil/lzo.h" | |||||
#include "libavutil/mem.h" | |||||
#include "libavutil/opt.h" | #include "libavutil/opt.h" | ||||
#include "avcodec.h" | #include "avcodec.h" | ||||
#include "internal.h" | #include "internal.h" | ||||
@@ -41,10 +41,10 @@ | |||||
#include <stdio.h> | #include <stdio.h> | ||||
#include <stdlib.h> | #include <stdlib.h> | ||||
#include "libavutil/mem.h" | |||||
#include "avcodec.h" | #include "avcodec.h" | ||||
#include "bytestream.h" | #include "bytestream.h" | ||||
#include "lcl.h" | #include "lcl.h" | ||||
#include "libavutil/lzo.h" | |||||
#if CONFIG_ZLIB_DECODER | #if CONFIG_ZLIB_DECODER | ||||
#include <zlib.h> | #include <zlib.h> | ||||
@@ -29,6 +29,7 @@ | |||||
#include <math.h> | #include <math.h> | ||||
#include "libavutil/mem.h" | |||||
#include "dsputil.h" | #include "dsputil.h" | ||||
#include "avcodec.h" | #include "avcodec.h" | ||||
#include "get_bits.h" | #include "get_bits.h" | ||||
@@ -38,7 +39,6 @@ | |||||
#include "acelp_vectors.h" | #include "acelp_vectors.h" | ||||
#include "acelp_filters.h" | #include "acelp_filters.h" | ||||
#include "lsp.h" | #include "lsp.h" | ||||
#include "libavutil/lzo.h" | |||||
#include "dct.h" | #include "dct.h" | ||||
#include "rdft.h" | #include "rdft.h" | ||||
#include "sinewin.h" | #include "sinewin.h" | ||||
@@ -33,12 +33,11 @@ | |||||
#include <string.h> | #include <string.h> | ||||
#include "libavutil/intreadwrite.h" | #include "libavutil/intreadwrite.h" | ||||
#include "libavutil/mem.h" | |||||
#include "avcodec.h" | #include "avcodec.h" | ||||
#include "bytestream.h" | #include "bytestream.h" | ||||
#define BITSTREAM_READER_LE | #define BITSTREAM_READER_LE | ||||
#include "get_bits.h" | #include "get_bits.h" | ||||
// for av_memcpy_backptr | |||||
#include "libavutil/lzo.h" | |||||
#define RUNTIME_GAMMA 0 | #define RUNTIME_GAMMA 0 | ||||
@@ -22,11 +22,10 @@ | |||||
#include "avcodec.h" | #include "avcodec.h" | ||||
#include "libavutil/intreadwrite.h" | #include "libavutil/intreadwrite.h" | ||||
#include "libavutil/mem.h" | |||||
#include "bytestream.h" | #include "bytestream.h" | ||||
#define BITSTREAM_READER_LE | #define BITSTREAM_READER_LE | ||||
#include "get_bits.h" | #include "get_bits.h" | ||||
// for av_memcpy_backptr | |||||
#include "libavutil/lzo.h" | |||||
typedef struct XanContext { | typedef struct XanContext { | ||||
AVCodecContext *avctx; | AVCodecContext *avctx; | ||||
@@ -1078,6 +1078,7 @@ static int matroska_decode_buffer(uint8_t** buf, int* buf_size, | |||||
memcpy(pkt_data + header_size, data, isize); | memcpy(pkt_data + header_size, data, isize); | ||||
break; | break; | ||||
} | } | ||||
#if CONFIG_LZO | |||||
case MATROSKA_TRACK_ENCODING_COMP_LZO: | case MATROSKA_TRACK_ENCODING_COMP_LZO: | ||||
do { | do { | ||||
olen = pkt_size *= 3; | olen = pkt_size *= 3; | ||||
@@ -1095,6 +1096,7 @@ static int matroska_decode_buffer(uint8_t** buf, int* buf_size, | |||||
} | } | ||||
pkt_size -= olen; | pkt_size -= olen; | ||||
break; | break; | ||||
#endif | |||||
#if CONFIG_ZLIB | #if CONFIG_ZLIB | ||||
case MATROSKA_TRACK_ENCODING_COMP_ZLIB: { | case MATROSKA_TRACK_ENCODING_COMP_ZLIB: { | ||||
z_stream zstream = {0}; | z_stream zstream = {0}; | ||||
@@ -1548,14 +1550,17 @@ static int matroska_read_header(AVFormatContext *s) | |||||
"Multiple combined encodings not supported"); | "Multiple combined encodings not supported"); | ||||
} else if (encodings_list->nb_elem == 1) { | } else if (encodings_list->nb_elem == 1) { | ||||
if (encodings[0].type || | if (encodings[0].type || | ||||
(encodings[0].compression.algo != MATROSKA_TRACK_ENCODING_COMP_HEADERSTRIP && | |||||
( | |||||
#if CONFIG_ZLIB | #if CONFIG_ZLIB | ||||
encodings[0].compression.algo != MATROSKA_TRACK_ENCODING_COMP_ZLIB && | encodings[0].compression.algo != MATROSKA_TRACK_ENCODING_COMP_ZLIB && | ||||
#endif | #endif | ||||
#if CONFIG_BZLIB | #if CONFIG_BZLIB | ||||
encodings[0].compression.algo != MATROSKA_TRACK_ENCODING_COMP_BZLIB && | encodings[0].compression.algo != MATROSKA_TRACK_ENCODING_COMP_BZLIB && | ||||
#endif | #endif | ||||
encodings[0].compression.algo != MATROSKA_TRACK_ENCODING_COMP_LZO)) { | |||||
#if CONFIG_LZO | |||||
encodings[0].compression.algo != MATROSKA_TRACK_ENCODING_COMP_LZO && | |||||
#endif | |||||
encodings[0].compression.algo != MATROSKA_TRACK_ENCODING_COMP_HEADERSTRIP)) { | |||||
encodings[0].scope = 0; | encodings[0].scope = 0; | ||||
av_log(matroska->ctx, AV_LOG_ERROR, | av_log(matroska->ctx, AV_LOG_ERROR, | ||||
"Unsupported encoding type"); | "Unsupported encoding type"); | ||||
@@ -559,12 +559,15 @@ static int ism_write_packet(AVFormatContext *s, AVPacket *pkt) | |||||
SmoothStreamingContext *c = s->priv_data; | SmoothStreamingContext *c = s->priv_data; | ||||
AVStream *st = s->streams[pkt->stream_index]; | AVStream *st = s->streams[pkt->stream_index]; | ||||
OutputStream *os = &c->streams[pkt->stream_index]; | OutputStream *os = &c->streams[pkt->stream_index]; | ||||
int64_t end_pts = (c->nb_fragments + 1) * c->min_frag_duration; | |||||
int64_t end_dts = (c->nb_fragments + 1) * c->min_frag_duration; | |||||
int ret; | int ret; | ||||
if (st->first_dts == AV_NOPTS_VALUE) | |||||
st->first_dts = pkt->dts; | |||||
if ((!c->has_video || st->codec->codec_type == AVMEDIA_TYPE_VIDEO) && | if ((!c->has_video || st->codec->codec_type == AVMEDIA_TYPE_VIDEO) && | ||||
av_compare_ts(pkt->pts, st->time_base, | |||||
end_pts, AV_TIME_BASE_Q) >= 0 && | |||||
av_compare_ts(pkt->dts - st->first_dts, st->time_base, | |||||
end_dts, AV_TIME_BASE_Q) >= 0 && | |||||
pkt->flags & AV_PKT_FLAG_KEY && os->packets_written) { | pkt->flags & AV_PKT_FLAG_KEY && os->packets_written) { | ||||
if ((ret = ism_flush(s, 0)) < 0) | if ((ret = ism_flush(s, 0)) < 0) | ||||
@@ -27,7 +27,6 @@ HEADERS = adler32.h \ | |||||
intreadwrite.h \ | intreadwrite.h \ | ||||
lfg.h \ | lfg.h \ | ||||
log.h \ | log.h \ | ||||
lzo.h \ | |||||
mathematics.h \ | mathematics.h \ | ||||
md5.h \ | md5.h \ | ||||
mem.h \ | mem.h \ | ||||
@@ -47,6 +46,8 @@ HEADERS = adler32.h \ | |||||
version.h \ | version.h \ | ||||
xtea.h \ | xtea.h \ | ||||
HEADERS-$(CONFIG_LZO) += lzo.h | |||||
ARCH_HEADERS = bswap.h \ | ARCH_HEADERS = bswap.h \ | ||||
intmath.h \ | intmath.h \ | ||||
intreadwrite.h \ | intreadwrite.h \ | ||||
@@ -77,7 +78,6 @@ OBJS = adler32.o \ | |||||
log.o \ | log.o \ | ||||
log2.o \ | log2.o \ | ||||
log2_tab.o \ | log2_tab.o \ | ||||
lzo.o \ | |||||
mathematics.o \ | mathematics.o \ | ||||
md5.o \ | md5.o \ | ||||
mem.o \ | mem.o \ | ||||
@@ -97,6 +97,7 @@ OBJS = adler32.o \ | |||||
xga_font_data.o \ | xga_font_data.o \ | ||||
xtea.o \ | xtea.o \ | ||||
OBJS-$(CONFIG_LZO) += lzo.o | |||||
OBJS += $(COMPAT_OBJS:%=../compat/%) | OBJS += $(COMPAT_OBJS:%=../compat/%) | ||||
@@ -100,8 +100,6 @@ static inline void copy(LZOContext *c, int cnt) | |||||
c->out = dst + cnt; | c->out = dst + cnt; | ||||
} | } | ||||
static inline void memcpy_backptr(uint8_t *dst, int back, int cnt); | |||||
/** | /** | ||||
* @brief Copies previously decoded bytes to current position. | * @brief Copies previously decoded bytes to current position. | ||||
* @param back how many bytes back we start, must be > 0 | * @param back how many bytes back we start, must be > 0 | ||||
@@ -122,50 +120,10 @@ static inline void copy_backptr(LZOContext *c, int back, int cnt) | |||||
cnt = FFMAX(c->out_end - dst, 0); | cnt = FFMAX(c->out_end - dst, 0); | ||||
c->error |= AV_LZO_OUTPUT_FULL; | c->error |= AV_LZO_OUTPUT_FULL; | ||||
} | } | ||||
memcpy_backptr(dst, back, cnt); | |||||
av_memcpy_backptr(dst, back, cnt); | |||||
c->out = dst + cnt; | c->out = dst + cnt; | ||||
} | } | ||||
static inline void memcpy_backptr(uint8_t *dst, int back, int cnt) | |||||
{ | |||||
const uint8_t *src = &dst[-back]; | |||||
if (back <= 1) { | |||||
memset(dst, *src, cnt); | |||||
} else { | |||||
if (cnt >= 4) { | |||||
AV_COPY16U(dst, src); | |||||
AV_COPY16U(dst + 2, src + 2); | |||||
src += 4; | |||||
dst += 4; | |||||
cnt -= 4; | |||||
} | |||||
if (cnt >= 8) { | |||||
AV_COPY16U(dst, src); | |||||
AV_COPY16U(dst + 2, src + 2); | |||||
AV_COPY16U(dst + 4, src + 4); | |||||
AV_COPY16U(dst + 6, src + 6); | |||||
src += 8; | |||||
dst += 8; | |||||
cnt -= 8; | |||||
} | |||||
if (cnt > 0) { | |||||
int blocklen = back; | |||||
while (cnt > blocklen) { | |||||
memcpy(dst, src, blocklen); | |||||
dst += blocklen; | |||||
cnt -= blocklen; | |||||
blocklen <<= 1; | |||||
} | |||||
memcpy(dst, src, cnt); | |||||
} | |||||
} | |||||
} | |||||
void av_memcpy_backptr(uint8_t *dst, int back, int cnt) | |||||
{ | |||||
memcpy_backptr(dst, back, cnt); | |||||
} | |||||
int av_lzo1x_decode(void *out, int *outlen, const void *in, int *inlen) | int av_lzo1x_decode(void *out, int *outlen, const void *in, int *inlen) | ||||
{ | { | ||||
int state = 0; | int state = 0; | ||||
@@ -59,17 +59,6 @@ | |||||
*/ | */ | ||||
int av_lzo1x_decode(void *out, int *outlen, const void *in, int *inlen); | int av_lzo1x_decode(void *out, int *outlen, const void *in, int *inlen); | ||||
/** | |||||
* @brief deliberately overlapping memcpy implementation | |||||
* @param dst destination buffer | |||||
* @param back how many bytes back we start (the initial size of the overlapping window), must be > 0 | |||||
* @param cnt number of bytes to copy, must be >= 0 | |||||
* | |||||
* cnt > back is valid, this will copy the bytes we just copied, | |||||
* thus creating a repeating pattern with a period length of back. | |||||
*/ | |||||
void av_memcpy_backptr(uint8_t *dst, int back, int cnt); | |||||
/** | /** | ||||
* @} | * @} | ||||
*/ | */ | ||||
@@ -29,6 +29,7 @@ | |||||
#include "config.h" | #include "config.h" | ||||
#include <limits.h> | #include <limits.h> | ||||
#include <stdint.h> | |||||
#include <stdlib.h> | #include <stdlib.h> | ||||
#include <string.h> | #include <string.h> | ||||
#if HAVE_MALLOC_H | #if HAVE_MALLOC_H | ||||
@@ -36,6 +37,7 @@ | |||||
#endif | #endif | ||||
#include "avutil.h" | #include "avutil.h" | ||||
#include "intreadwrite.h" | |||||
#include "mem.h" | #include "mem.h" | ||||
/* here we can use OS-dependent allocation functions */ | /* here we can use OS-dependent allocation functions */ | ||||
@@ -244,3 +246,38 @@ void av_dynarray_add(void *tab_ptr, int *nb_ptr, void *elem) | |||||
*nb_ptr = nb; | *nb_ptr = nb; | ||||
} | } | ||||
void av_memcpy_backptr(uint8_t *dst, int back, int cnt) | |||||
{ | |||||
const uint8_t *src = &dst[-back]; | |||||
if (back <= 1) { | |||||
memset(dst, *src, cnt); | |||||
} else { | |||||
if (cnt >= 4) { | |||||
AV_COPY16U(dst, src); | |||||
AV_COPY16U(dst + 2, src + 2); | |||||
src += 4; | |||||
dst += 4; | |||||
cnt -= 4; | |||||
} | |||||
if (cnt >= 8) { | |||||
AV_COPY16U(dst, src); | |||||
AV_COPY16U(dst + 2, src + 2); | |||||
AV_COPY16U(dst + 4, src + 4); | |||||
AV_COPY16U(dst + 6, src + 6); | |||||
src += 8; | |||||
dst += 8; | |||||
cnt -= 8; | |||||
} | |||||
if (cnt > 0) { | |||||
int blocklen = back; | |||||
while (cnt > blocklen) { | |||||
memcpy(dst, src, blocklen); | |||||
dst += blocklen; | |||||
cnt -= blocklen; | |||||
blocklen <<= 1; | |||||
} | |||||
memcpy(dst, src, cnt); | |||||
} | |||||
} | |||||
} | |||||
@@ -27,6 +27,7 @@ | |||||
#define AVUTIL_MEM_H | #define AVUTIL_MEM_H | ||||
#include <limits.h> | #include <limits.h> | ||||
#include <stdint.h> | |||||
#include "attributes.h" | #include "attributes.h" | ||||
#include "error.h" | #include "error.h" | ||||
@@ -216,6 +217,17 @@ static inline int av_size_mult(size_t a, size_t b, size_t *r) | |||||
*/ | */ | ||||
void av_max_alloc(size_t max); | void av_max_alloc(size_t max); | ||||
/** | |||||
* @brief deliberately overlapping memcpy implementation | |||||
* @param dst destination buffer | |||||
* @param back how many bytes back we start (the initial size of the overlapping window), must be > 0 | |||||
* @param cnt number of bytes to copy, must be >= 0 | |||||
* | |||||
* cnt > back is valid, this will copy the bytes we just copied, | |||||
* thus creating a repeating pattern with a period length of back. | |||||
*/ | |||||
void av_memcpy_backptr(uint8_t *dst, int back, int cnt); | |||||
/** | /** | ||||
* @} | * @} | ||||
*/ | */ | ||||