* 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-neon disable NEON optimizations | |||
--disable-vis disable VIS optimizations | |||
--disable-inline-asm disable use of inline assembler | |||
--disable-yasm disable use of yasm assembler | |||
--disable-mips32r2 disable MIPS32R2 optimizations | |||
--disable-mipsdspr1 disable MIPS DSP ASE R1 optimizations | |||
@@ -1429,6 +1430,7 @@ CMDLINE_SELECT=" | |||
cross_compile | |||
debug | |||
extra_warnings | |||
inline_asm | |||
logging | |||
optimizations | |||
stripping | |||
@@ -1549,6 +1551,8 @@ need_memalign="altivec neon sse" | |||
symver_if_any="symver_asm_label symver_gnu_asm" | |||
log2_deps="!msvcrt" | |||
# subsystems | |||
dct_select="rdft" | |||
mdct_select="fft" | |||
@@ -3241,7 +3245,7 @@ EOF | |||
sym=$($nm $nm_opts $TMPO | awk '/ff_extern/{ print substr($0, match($0, /[^ \t]*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 ("" ::); } | |||
EOF | |||
@@ -3350,7 +3354,7 @@ elif enabled sparc; 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 "__rdtsc()" "cc" && enable rdtsc | |||
check_code ld intrin.h "unsigned int x = __readeflags()" "cc" && enable rweflags | |||
@@ -44,23 +44,28 @@ | |||
/* standard file protocol */ | |||
typedef struct FileContext { | |||
int fd; | |||
} FileContext; | |||
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; | |||
} | |||
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; | |||
} | |||
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) | |||
@@ -80,6 +85,7 @@ static int file_check(URLContext *h, int mask) | |||
static int file_open(URLContext *h, const char *filename, int flags) | |||
{ | |||
FileContext *c = h->priv_data; | |||
int access; | |||
int fd; | |||
struct stat st; | |||
@@ -99,7 +105,7 @@ static int file_open(URLContext *h, const char *filename, int flags) | |||
fd = open(filename, access, 0666); | |||
if (fd == -1) | |||
return AVERROR(errno); | |||
h->priv_data = (void *) (intptr_t) fd; | |||
c->fd = fd; | |||
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 */ | |||
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) { | |||
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 lseek(fd, pos, whence); | |||
return lseek(c->fd, pos, whence); | |||
} | |||
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 = { | |||
@@ -133,6 +139,7 @@ URLProtocol ff_file_protocol = { | |||
.url_close = file_close, | |||
.url_get_file_handle = file_get_handle, | |||
.url_check = file_check, | |||
.priv_data_size = sizeof(FileContext), | |||
}; | |||
#endif /* CONFIG_FILE_PROTOCOL */ | |||
@@ -141,6 +148,7 @@ URLProtocol ff_file_protocol = { | |||
static int pipe_open(URLContext *h, const char *filename, int flags) | |||
{ | |||
FileContext *c = h->priv_data; | |||
int fd; | |||
char *final; | |||
av_strstart(filename, "pipe:", &filename); | |||
@@ -156,7 +164,7 @@ static int pipe_open(URLContext *h, const char *filename, int flags) | |||
#if HAVE_SETMODE | |||
setmode(fd, O_BINARY); | |||
#endif | |||
h->priv_data = (void *) (intptr_t) fd; | |||
c->fd = fd; | |||
h->is_streamed = 1; | |||
return 0; | |||
} | |||
@@ -168,6 +176,7 @@ URLProtocol ff_pipe_protocol = { | |||
.url_write = file_write, | |||
.url_get_file_handle = file_get_handle, | |||
.url_check = file_check, | |||
.priv_data_size = sizeof(FileContext), | |||
}; | |||
#endif /* CONFIG_PIPE_PROTOCOL */ |
@@ -503,7 +503,8 @@ static int flv_read_header(AVFormatContext *s) | |||
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"); | |||
} | |||
s->ctx_flags |= AVFMTCTX_NOHEADER; | |||
s->ctx_flags |= AVFMTCTX_NOHEADER; | |||
if(flags & FLV_HEADER_FLAG_HASVIDEO){ | |||
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"); | |||
st = create_stream(s, | |||
(int[]){AVMEDIA_TYPE_VIDEO, AVMEDIA_TYPE_AUDIO, AVMEDIA_TYPE_DATA}[stream_type]); | |||
} | |||
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))) | |||
@@ -33,6 +33,28 @@ struct PayloadContext { | |||
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) | |||
{ | |||
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; | |||
} | |||
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, | |||
AVStream *st, AVPacket *pkt, uint32_t *timestamp, | |||
const uint8_t *buf, int len, int flags) | |||
@@ -238,6 +281,7 @@ static int jpeg_parse_packet(AVFormatContext *ctx, PayloadContext *jpeg, | |||
if (off == 0) { | |||
/* Start of JPEG data packet. */ | |||
uint8_t new_qtables[128]; | |||
uint8_t hdr[1024]; | |||
/* 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; | |||
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 | |||