* qatar/master: rtpdec_jpeg: Add support for default quantizers x86: dsputil: Move specific optimization settings out of global init function avplay: get rid of ugly casts in the options table avplay: fix prototypes for option callbacks. flvdec: always set AVFMTCTX_NOHEADER. file: Use a normal private context for storing the file descriptor configure: Adjust the xgetbv instrinsic check configure: Add --disable-inline-asm command line option configure: Don't try to enable the log2 function on msvcrt Conflicts: configure ffplay.c libavcodec/x86/dsputil_mmx.c libavformat/file.c libavformat/flvdec.c Merged-by: Michael Niedermayer <michaelni@gmx.at>tags/n1.0
@@ -290,6 +290,7 @@ Optimization options (experts only): | |||||
--disable-mmi disable MMI optimizations | --disable-mmi disable MMI optimizations | ||||
--disable-neon disable NEON optimizations | --disable-neon disable NEON optimizations | ||||
--disable-vis disable VIS optimizations | --disable-vis disable VIS optimizations | ||||
--disable-inline-asm disable use of inline assembler | |||||
--disable-yasm disable use of yasm assembler | --disable-yasm disable use of yasm assembler | ||||
--disable-mips32r2 disable MIPS32R2 optimizations | --disable-mips32r2 disable MIPS32R2 optimizations | ||||
--disable-mipsdspr1 disable MIPS DSP ASE R1 optimizations | --disable-mipsdspr1 disable MIPS DSP ASE R1 optimizations | ||||
@@ -1429,6 +1430,7 @@ CMDLINE_SELECT=" | |||||
cross_compile | cross_compile | ||||
debug | debug | ||||
extra_warnings | extra_warnings | ||||
inline_asm | |||||
logging | logging | ||||
optimizations | optimizations | ||||
stripping | stripping | ||||
@@ -1549,6 +1551,8 @@ need_memalign="altivec neon sse" | |||||
symver_if_any="symver_asm_label symver_gnu_asm" | symver_if_any="symver_asm_label symver_gnu_asm" | ||||
log2_deps="!msvcrt" | |||||
# subsystems | # subsystems | ||||
dct_select="rdft" | dct_select="rdft" | ||||
mdct_select="fft" | mdct_select="fft" | ||||
@@ -3241,7 +3245,7 @@ EOF | |||||
sym=$($nm $nm_opts $TMPO | awk '/ff_extern/{ print substr($0, match($0, /[^ \t]*ff_extern/)) }') | sym=$($nm $nm_opts $TMPO | awk '/ff_extern/{ print substr($0, match($0, /[^ \t]*ff_extern/)) }') | ||||
extern_prefix=${sym%%ff_extern*} | extern_prefix=${sym%%ff_extern*} | ||||
check_cc <<EOF && enable inline_asm | |||||
check_cc <<EOF && enable_weak inline_asm | |||||
void foo(void) { __asm__ volatile ("" ::); } | void foo(void) { __asm__ volatile ("" ::); } | ||||
EOF | EOF | ||||
@@ -3350,7 +3354,7 @@ elif enabled sparc; then | |||||
elif enabled x86; then | elif enabled x86; then | ||||
check_code ld immintrin.h "__xgetbv(0)" "cc" && enable xgetbv | |||||
check_code ld immintrin.h "return __xgetbv(0)" "cc" && enable xgetbv | |||||
check_code ld intrin.h "int info[4]; __cpuid(info, 0)" "cc" && enable cpuid | check_code ld intrin.h "int info[4]; __cpuid(info, 0)" "cc" && enable cpuid | ||||
check_code ld intrin.h "__rdtsc()" "cc" && enable rdtsc | check_code ld intrin.h "__rdtsc()" "cc" && enable rdtsc | ||||
check_code ld intrin.h "unsigned int x = __readeflags()" "cc" && enable rweflags | check_code ld intrin.h "unsigned int x = __readeflags()" "cc" && enable rweflags | ||||
@@ -44,23 +44,28 @@ | |||||
/* standard file protocol */ | /* standard file protocol */ | ||||
typedef struct FileContext { | |||||
int fd; | |||||
} FileContext; | |||||
static int file_read(URLContext *h, unsigned char *buf, int size) | static int file_read(URLContext *h, unsigned char *buf, int size) | ||||
{ | { | ||||
int fd = (intptr_t) h->priv_data; | |||||
int r = read(fd, buf, size); | |||||
FileContext *c = h->priv_data; | |||||
int r = read(c->fd, buf, size); | |||||
return (-1 == r)?AVERROR(errno):r; | return (-1 == r)?AVERROR(errno):r; | ||||
} | } | ||||
static int file_write(URLContext *h, const unsigned char *buf, int size) | static int file_write(URLContext *h, const unsigned char *buf, int size) | ||||
{ | { | ||||
int fd = (intptr_t) h->priv_data; | |||||
int r = write(fd, buf, size); | |||||
FileContext *c = h->priv_data; | |||||
int r = write(c->fd, buf, size); | |||||
return (-1 == r)?AVERROR(errno):r; | return (-1 == r)?AVERROR(errno):r; | ||||
} | } | ||||
static int file_get_handle(URLContext *h) | static int file_get_handle(URLContext *h) | ||||
{ | { | ||||
return (intptr_t) h->priv_data; | |||||
FileContext *c = h->priv_data; | |||||
return c->fd; | |||||
} | } | ||||
static int file_check(URLContext *h, int mask) | static int file_check(URLContext *h, int mask) | ||||
@@ -80,6 +85,7 @@ static int file_check(URLContext *h, int mask) | |||||
static int file_open(URLContext *h, const char *filename, int flags) | static int file_open(URLContext *h, const char *filename, int flags) | ||||
{ | { | ||||
FileContext *c = h->priv_data; | |||||
int access; | int access; | ||||
int fd; | int fd; | ||||
struct stat st; | struct stat st; | ||||
@@ -99,7 +105,7 @@ static int file_open(URLContext *h, const char *filename, int flags) | |||||
fd = open(filename, access, 0666); | fd = open(filename, access, 0666); | ||||
if (fd == -1) | if (fd == -1) | ||||
return AVERROR(errno); | return AVERROR(errno); | ||||
h->priv_data = (void *) (intptr_t) fd; | |||||
c->fd = fd; | |||||
h->is_streamed = !fstat(fd, &st) && S_ISFIFO(st.st_mode); | h->is_streamed = !fstat(fd, &st) && S_ISFIFO(st.st_mode); | ||||
@@ -109,19 +115,19 @@ static int file_open(URLContext *h, const char *filename, int flags) | |||||
/* XXX: use llseek */ | /* XXX: use llseek */ | ||||
static int64_t file_seek(URLContext *h, int64_t pos, int whence) | static int64_t file_seek(URLContext *h, int64_t pos, int whence) | ||||
{ | { | ||||
int fd = (intptr_t) h->priv_data; | |||||
FileContext *c = h->priv_data; | |||||
if (whence == AVSEEK_SIZE) { | if (whence == AVSEEK_SIZE) { | ||||
struct stat st; | struct stat st; | ||||
int ret = fstat(fd, &st); | |||||
int ret = fstat(c->fd, &st); | |||||
return ret < 0 ? AVERROR(errno) : (S_ISFIFO(st.st_mode) ? 0 : st.st_size); | return ret < 0 ? AVERROR(errno) : (S_ISFIFO(st.st_mode) ? 0 : st.st_size); | ||||
} | } | ||||
return lseek(fd, pos, whence); | |||||
return lseek(c->fd, pos, whence); | |||||
} | } | ||||
static int file_close(URLContext *h) | static int file_close(URLContext *h) | ||||
{ | { | ||||
int fd = (intptr_t) h->priv_data; | |||||
return close(fd); | |||||
FileContext *c = h->priv_data; | |||||
return close(c->fd); | |||||
} | } | ||||
URLProtocol ff_file_protocol = { | URLProtocol ff_file_protocol = { | ||||
@@ -133,6 +139,7 @@ URLProtocol ff_file_protocol = { | |||||
.url_close = file_close, | .url_close = file_close, | ||||
.url_get_file_handle = file_get_handle, | .url_get_file_handle = file_get_handle, | ||||
.url_check = file_check, | .url_check = file_check, | ||||
.priv_data_size = sizeof(FileContext), | |||||
}; | }; | ||||
#endif /* CONFIG_FILE_PROTOCOL */ | #endif /* CONFIG_FILE_PROTOCOL */ | ||||
@@ -141,6 +148,7 @@ URLProtocol ff_file_protocol = { | |||||
static int pipe_open(URLContext *h, const char *filename, int flags) | static int pipe_open(URLContext *h, const char *filename, int flags) | ||||
{ | { | ||||
FileContext *c = h->priv_data; | |||||
int fd; | int fd; | ||||
char *final; | char *final; | ||||
av_strstart(filename, "pipe:", &filename); | av_strstart(filename, "pipe:", &filename); | ||||
@@ -156,7 +164,7 @@ static int pipe_open(URLContext *h, const char *filename, int flags) | |||||
#if HAVE_SETMODE | #if HAVE_SETMODE | ||||
setmode(fd, O_BINARY); | setmode(fd, O_BINARY); | ||||
#endif | #endif | ||||
h->priv_data = (void *) (intptr_t) fd; | |||||
c->fd = fd; | |||||
h->is_streamed = 1; | h->is_streamed = 1; | ||||
return 0; | return 0; | ||||
} | } | ||||
@@ -168,6 +176,7 @@ URLProtocol ff_pipe_protocol = { | |||||
.url_write = file_write, | .url_write = file_write, | ||||
.url_get_file_handle = file_get_handle, | .url_get_file_handle = file_get_handle, | ||||
.url_check = file_check, | .url_check = file_check, | ||||
.priv_data_size = sizeof(FileContext), | |||||
}; | }; | ||||
#endif /* CONFIG_PIPE_PROTOCOL */ | #endif /* CONFIG_PIPE_PROTOCOL */ |
@@ -503,7 +503,8 @@ static int flv_read_header(AVFormatContext *s) | |||||
flags = FLV_HEADER_FLAG_HASVIDEO | FLV_HEADER_FLAG_HASAUDIO; | flags = FLV_HEADER_FLAG_HASVIDEO | FLV_HEADER_FLAG_HASAUDIO; | ||||
av_log(s, AV_LOG_WARNING, "Broken FLV file, which says no streams present, this might fail\n"); | av_log(s, AV_LOG_WARNING, "Broken FLV file, which says no streams present, this might fail\n"); | ||||
} | } | ||||
s->ctx_flags |= AVFMTCTX_NOHEADER; | |||||
s->ctx_flags |= AVFMTCTX_NOHEADER; | |||||
if(flags & FLV_HEADER_FLAG_HASVIDEO){ | if(flags & FLV_HEADER_FLAG_HASVIDEO){ | ||||
if(!create_stream(s, AVMEDIA_TYPE_VIDEO)) | if(!create_stream(s, AVMEDIA_TYPE_VIDEO)) | ||||
@@ -729,6 +730,7 @@ static int flv_read_packet(AVFormatContext *s, AVPacket *pkt) | |||||
av_log(s, AV_LOG_WARNING, "Stream discovered after head already parsed\n"); | av_log(s, AV_LOG_WARNING, "Stream discovered after head already parsed\n"); | ||||
st = create_stream(s, | st = create_stream(s, | ||||
(int[]){AVMEDIA_TYPE_VIDEO, AVMEDIA_TYPE_AUDIO, AVMEDIA_TYPE_DATA}[stream_type]); | (int[]){AVMEDIA_TYPE_VIDEO, AVMEDIA_TYPE_AUDIO, AVMEDIA_TYPE_DATA}[stream_type]); | ||||
} | } | ||||
av_dlog(s, "%d %X %d \n", stream_type, flags, st->discard); | av_dlog(s, "%d %X %d \n", stream_type, flags, st->discard); | ||||
if( (st->discard >= AVDISCARD_NONKEY && !((flags & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_KEY || (stream_type == FLV_STREAM_TYPE_AUDIO))) | if( (st->discard >= AVDISCARD_NONKEY && !((flags & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_KEY || (stream_type == FLV_STREAM_TYPE_AUDIO))) | ||||
@@ -33,6 +33,28 @@ struct PayloadContext { | |||||
int hdr_size; ///< size of the current frame header | int hdr_size; ///< size of the current frame header | ||||
}; | }; | ||||
static const uint8_t default_quantizers[128] = { | |||||
/* luma table */ | |||||
16, 11, 12, 14, 12, 10, 16, 14, | |||||
13, 14, 18, 17, 16, 19, 24, 40, | |||||
26, 24, 22, 22, 24, 49, 35, 37, | |||||
29, 40, 58, 51, 61, 60, 57, 51, | |||||
56, 55, 64, 72, 92, 78, 64, 68, | |||||
87, 69, 55, 56, 80, 109, 81, 87, | |||||
95, 98, 103, 104, 103, 62, 77, 113, | |||||
121, 112, 100, 120, 92, 101, 103, 99, | |||||
/* chroma table */ | |||||
17, 18, 18, 24, 21, 24, 47, 26, | |||||
26, 47, 99, 66, 56, 66, 99, 99, | |||||
99, 99, 99, 99, 99, 99, 99, 99, | |||||
99, 99, 99, 99, 99, 99, 99, 99, | |||||
99, 99, 99, 99, 99, 99, 99, 99, | |||||
99, 99, 99, 99, 99, 99, 99, 99, | |||||
99, 99, 99, 99, 99, 99, 99, 99, | |||||
99, 99, 99, 99, 99, 99, 99, 99 | |||||
}; | |||||
static PayloadContext *jpeg_new_context(void) | static PayloadContext *jpeg_new_context(void) | ||||
{ | { | ||||
return av_mallocz(sizeof(PayloadContext)); | return av_mallocz(sizeof(PayloadContext)); | ||||
@@ -170,6 +192,27 @@ static int jpeg_create_header(uint8_t *buf, int size, uint32_t type, uint32_t w, | |||||
return put_bits_count(&pbc) / 8; | return put_bits_count(&pbc) / 8; | ||||
} | } | ||||
static void create_default_qtables(uint8_t *qtables, uint8_t q) | |||||
{ | |||||
int factor = q; | |||||
int i; | |||||
factor = av_clip(q, 1, 99); | |||||
if (q < 50) | |||||
q = 5000 / factor; | |||||
else | |||||
q = 200 - factor * 2; | |||||
for (i = 0; i < 128; i++) { | |||||
int val = (default_quantizers[i] * q + 50) / 100; | |||||
/* Limit the quantizers to 1 <= q <= 255. */ | |||||
val = av_clip(val, 1, 255); | |||||
qtables[i] = val; | |||||
} | |||||
} | |||||
static int jpeg_parse_packet(AVFormatContext *ctx, PayloadContext *jpeg, | static int jpeg_parse_packet(AVFormatContext *ctx, PayloadContext *jpeg, | ||||
AVStream *st, AVPacket *pkt, uint32_t *timestamp, | AVStream *st, AVPacket *pkt, uint32_t *timestamp, | ||||
const uint8_t *buf, int len, int flags) | const uint8_t *buf, int len, int flags) | ||||
@@ -238,6 +281,7 @@ static int jpeg_parse_packet(AVFormatContext *ctx, PayloadContext *jpeg, | |||||
if (off == 0) { | if (off == 0) { | ||||
/* Start of JPEG data packet. */ | /* Start of JPEG data packet. */ | ||||
uint8_t new_qtables[128]; | |||||
uint8_t hdr[1024]; | uint8_t hdr[1024]; | ||||
/* Skip the current frame in case of the end packet | /* Skip the current frame in case of the end packet | ||||
@@ -249,9 +293,9 @@ static int jpeg_parse_packet(AVFormatContext *ctx, PayloadContext *jpeg, | |||||
jpeg->timestamp = *timestamp; | jpeg->timestamp = *timestamp; | ||||
if (!qtables) { | if (!qtables) { | ||||
av_log(ctx, AV_LOG_ERROR, | |||||
"Unimplemented default quantization tables.\n"); | |||||
return AVERROR_PATCHWELCOME; | |||||
create_default_qtables(new_qtables, q); | |||||
qtables = new_qtables; | |||||
qtable_len = sizeof(new_qtables); | |||||
} | } | ||||
/* Generate a frame and scan headers that can be prepended to the | /* Generate a frame and scan headers that can be prepended to the | ||||