summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xconfigure39
-rw-r--r--libavcodec/flacdec.c34
-rw-r--r--libavcodec/flacdsp.c35
-rw-r--r--libavcodec/flacdsp.h2
-rw-r--r--libavcodec/flacdsp_template.c47
-rw-r--r--libavcodec/mss3.c2
-rw-r--r--libavcodec/options_table.h5
-rw-r--r--libavfilter/af_amix.c10
-rw-r--r--libavformat/flvdec.c4
9 files changed, 121 insertions, 57 deletions
diff --git a/configure b/configure
index 6d96f32de1..8a318da6db 100755
--- a/configure
+++ b/configure
@@ -716,6 +716,20 @@ check_ld(){
check_cmd $ld $LDFLAGS $flags -o $TMPE $TMPO $libs $extralibs
}
+check_code(){
+ log check_code "$@"
+ check=$1
+ headers=$2
+ code=$3
+ shift 3
+ {
+ for hdr in $headers; do
+ echo "#include <$hdr>"
+ done
+ echo "int main(void) { $code; return 0; }"
+ } | check_$check "$@"
+}
+
check_cppflags(){
log check_cppflags "$@"
set -- $($filter_cppflags "$@")
@@ -912,15 +926,7 @@ check_type(){
type=$2
shift 2
disable_safe "$type"
- incs=""
- for hdr in $headers; do
- incs="$incs
-#include <$hdr>"
- done
- check_cc "$@" <<EOF && enable_safe "$type"
-$incs
-$type v;
-EOF
+ check_code cc "$headers" "$type v" "$@" && enable_safe "$type"
}
check_struct(){
@@ -930,15 +936,8 @@ check_struct(){
member=$3
shift 3
disable_safe "${struct}_${member}"
- incs=""
- for hdr in $headers; do
- incs="$incs
-#include <$hdr>"
- done
- check_cc "$@" <<EOF && enable_safe "${struct}_${member}"
-$incs
-const void *p = &(($struct *)0)->$member;
-EOF
+ check_code cc "$headers" "const void *p = &(($struct *)0)->$member" "$@" &&
+ enable_safe "${struct}_${member}"
}
require(){
@@ -2689,9 +2688,7 @@ case "$arch" in
;;
x86)
subarch="x86_32"
- check_cc <<EOF && subarch="x86_64"
- int test[(int)sizeof(char*) - 7];
-EOF
+ check_code cc "" "int test[(int)sizeof(char*) - 7]" && subarch="x86_64"
if test "$subarch" = "x86_64"; then
spic=$shared
fi
diff --git a/libavcodec/flacdec.c b/libavcodec/flacdec.c
index 13ce95d86c..fc68f75e22 100644
--- a/libavcodec/flacdec.c
+++ b/libavcodec/flacdec.c
@@ -104,11 +104,22 @@ int avpriv_flac_is_extradata_valid(AVCodecContext *avctx,
static void flac_set_bps(FLACContext *s)
{
- if (s->bps > 16) {
- s->avctx->sample_fmt = AV_SAMPLE_FMT_S32;
+ enum AVSampleFormat req = s->avctx->request_sample_fmt;
+ int need32 = s->bps > 16;
+ int want32 = av_get_bytes_per_sample(req) > 2;
+ int planar = av_sample_fmt_is_planar(req);
+
+ if (need32 || want32) {
+ if (planar)
+ s->avctx->sample_fmt = AV_SAMPLE_FMT_S32P;
+ else
+ s->avctx->sample_fmt = AV_SAMPLE_FMT_S32;
s->sample_shift = 32 - s->bps;
} else {
- s->avctx->sample_fmt = AV_SAMPLE_FMT_S16;
+ if (planar)
+ s->avctx->sample_fmt = AV_SAMPLE_FMT_S16P;
+ else
+ s->avctx->sample_fmt = AV_SAMPLE_FMT_S16;
s->sample_shift = 16 - s->bps;
}
}
@@ -132,7 +143,7 @@ static av_cold int flac_decode_init(AVCodecContext *avctx)
avpriv_flac_parse_streaminfo(avctx, (FLACStreaminfo *)s, streaminfo);
allocate_buffers(s);
flac_set_bps(s);
- ff_flacdsp_init(&s->dsp, avctx->sample_fmt);
+ ff_flacdsp_init(&s->dsp, avctx->sample_fmt, s->bps);
s->got_streaminfo = 1;
avcodec_get_frame_defaults(&s->frame);
@@ -233,7 +244,7 @@ static int parse_streaminfo(FLACContext *s, const uint8_t *buf, int buf_size)
avpriv_flac_parse_streaminfo(s->avctx, (FLACStreaminfo *)s, &buf[8]);
allocate_buffers(s);
flac_set_bps(s);
- ff_flacdsp_init(&s->dsp, s->avctx->sample_fmt);
+ ff_flacdsp_init(&s->dsp, s->avctx->sample_fmt, s->bps);
s->got_streaminfo = 1;
return 0;
@@ -492,9 +503,11 @@ static int decode_frame(FLACContext *s)
"supported\n");
return -1;
}
- s->bps = s->avctx->bits_per_raw_sample = fi.bps;
- flac_set_bps(s);
+ if (!s->bps) {
+ s->bps = s->avctx->bits_per_raw_sample = fi.bps;
+ flac_set_bps(s);
+ }
if (!s->max_blocksize)
s->max_blocksize = FLAC_MAX_BLOCKSIZE;
@@ -520,7 +533,7 @@ static int decode_frame(FLACContext *s)
if (!s->got_streaminfo) {
allocate_buffers(s);
- ff_flacdsp_init(&s->dsp, s->avctx->sample_fmt);
+ ff_flacdsp_init(&s->dsp, s->avctx->sample_fmt, s->bps);
s->got_streaminfo = 1;
dump_headers(s->avctx, (FLACStreaminfo *)s);
}
@@ -628,4 +641,9 @@ AVCodec ff_flac_decoder = {
.decode = flac_decode_frame,
.capabilities = CODEC_CAP_DR1,
.long_name = NULL_IF_CONFIG_SMALL("FLAC (Free Lossless Audio Codec)"),
+ .sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_S16,
+ AV_SAMPLE_FMT_S16P,
+ AV_SAMPLE_FMT_S32,
+ AV_SAMPLE_FMT_S32P,
+ -1 },
};
diff --git a/libavcodec/flacdsp.c b/libavcodec/flacdsp.c
index 6c90e89d9b..bb2a920a72 100644
--- a/libavcodec/flacdsp.c
+++ b/libavcodec/flacdsp.c
@@ -23,10 +23,21 @@
#include "flacdsp.h"
#define SAMPLE_SIZE 16
+#define PLANAR 0
+#include "flacdsp_template.c"
+
+#undef PLANAR
+#define PLANAR 1
#include "flacdsp_template.c"
#undef SAMPLE_SIZE
+#undef PLANAR
#define SAMPLE_SIZE 32
+#define PLANAR 0
+#include "flacdsp_template.c"
+
+#undef PLANAR
+#define PLANAR 1
#include "flacdsp_template.c"
static void flac_lpc_16_c(int32_t *decoded, const int coeffs[32],
@@ -72,15 +83,27 @@ static void flac_lpc_32_c(int32_t *decoded, const int coeffs[32],
}
-av_cold void ff_flacdsp_init(FLACDSPContext *c, enum AVSampleFormat fmt)
+av_cold void ff_flacdsp_init(FLACDSPContext *c, enum AVSampleFormat fmt,
+ int bps)
{
+ if (bps > 16)
+ c->lpc = flac_lpc_32_c;
+ else
+ c->lpc = flac_lpc_16_c;
+
switch (fmt) {
case AV_SAMPLE_FMT_S32:
c->decorrelate[0] = flac_decorrelate_indep_c_32;
c->decorrelate[1] = flac_decorrelate_ls_c_32;
c->decorrelate[2] = flac_decorrelate_rs_c_32;
c->decorrelate[3] = flac_decorrelate_ms_c_32;
- c->lpc = flac_lpc_32_c;
+ break;
+
+ case AV_SAMPLE_FMT_S32P:
+ c->decorrelate[0] = flac_decorrelate_indep_c_32p;
+ c->decorrelate[1] = flac_decorrelate_ls_c_32p;
+ c->decorrelate[2] = flac_decorrelate_rs_c_32p;
+ c->decorrelate[3] = flac_decorrelate_ms_c_32p;
break;
case AV_SAMPLE_FMT_S16:
@@ -88,7 +111,13 @@ av_cold void ff_flacdsp_init(FLACDSPContext *c, enum AVSampleFormat fmt)
c->decorrelate[1] = flac_decorrelate_ls_c_16;
c->decorrelate[2] = flac_decorrelate_rs_c_16;
c->decorrelate[3] = flac_decorrelate_ms_c_16;
- c->lpc = flac_lpc_16_c;
+ break;
+
+ case AV_SAMPLE_FMT_S16P:
+ c->decorrelate[0] = flac_decorrelate_indep_c_16p;
+ c->decorrelate[1] = flac_decorrelate_ls_c_16p;
+ c->decorrelate[2] = flac_decorrelate_rs_c_16p;
+ c->decorrelate[3] = flac_decorrelate_ms_c_16p;
break;
}
}
diff --git a/libavcodec/flacdsp.h b/libavcodec/flacdsp.h
index e2abefb7f5..efb5e02ef4 100644
--- a/libavcodec/flacdsp.h
+++ b/libavcodec/flacdsp.h
@@ -29,6 +29,6 @@ typedef struct FLACDSPContext {
int qlevel, int len);
} FLACDSPContext;
-void ff_flacdsp_init(FLACDSPContext *c, enum AVSampleFormat fmt);
+void ff_flacdsp_init(FLACDSPContext *c, enum AVSampleFormat fmt, int bps);
#endif /* AVCODEC_FLACDSP_H */
diff --git a/libavcodec/flacdsp_template.c b/libavcodec/flacdsp_template.c
index 808b20d41d..62c0a15ff6 100644
--- a/libavcodec/flacdsp_template.c
+++ b/libavcodec/flacdsp_template.c
@@ -19,68 +19,85 @@
*/
#include <stdint.h>
+#include "libavutil/avutil.h"
#undef FUNC
+#undef FSUF
#undef sample
+#undef sample_type
+#undef OUT
+#undef S
#if SAMPLE_SIZE == 32
-# define FUNC(n) n ## _32
-# define sample int32_t
+# define sample_type int32_t
#else
-# define FUNC(n) n ## _16
-# define sample int16_t
+# define sample_type int16_t
#endif
+#if PLANAR
+# define FSUF AV_JOIN(SAMPLE_SIZE, p)
+# define sample sample_type *
+# define OUT(n) n
+# define S(s, c, i) (s[c][i])
+#else
+# define FSUF SAMPLE_SIZE
+# define sample sample_type
+# define OUT(n) n[0]
+# define S(s, c, i) (*s++)
+#endif
+
+#define FUNC(n) AV_JOIN(n ## _, FSUF)
+
static void FUNC(flac_decorrelate_indep_c)(uint8_t **out, int32_t **in,
int channels, int len, int shift)
{
- sample *samples = (sample *) out[0];
+ sample *samples = (sample *) OUT(out);
int i, j;
for (j = 0; j < len; j++)
for (i = 0; i < channels; i++)
- *samples++ = in[i][j] << shift;
+ S(samples, i, j) = in[i][j] << shift;
}
static void FUNC(flac_decorrelate_ls_c)(uint8_t **out, int32_t **in,
int channels, int len, int shift)
{
- sample *samples = (sample *) out[0];
+ sample *samples = (sample *) OUT(out);
int i;
for (i = 0; i < len; i++) {
int a = in[0][i];
int b = in[1][i];
- *samples++ = a << shift;
- *samples++ = (a - b) << shift;
+ S(samples, 0, i) = a << shift;
+ S(samples, 1, i) = (a - b) << shift;
}
}
static void FUNC(flac_decorrelate_rs_c)(uint8_t **out, int32_t **in,
int channels, int len, int shift)
{
- sample *samples = (sample *) out[0];
+ sample *samples = (sample *) OUT(out);
int i;
for (i = 0; i < len; i++) {
int a = in[0][i];
int b = in[1][i];
- *samples++ = (a + b) << shift;
- *samples++ = b << shift;
+ S(samples, 0, i) = (a + b) << shift;
+ S(samples, 1, i) = b << shift;
}
}
static void FUNC(flac_decorrelate_ms_c)(uint8_t **out, int32_t **in,
int channels, int len, int shift)
{
- sample *samples = (sample *) out[0];
+ sample *samples = (sample *) OUT(out);
int i;
for (i = 0; i < len; i++) {
int a = in[0][i];
int b = in[1][i];
a -= b >> 1;
- *samples++ = (a + b) << shift;
- *samples++ = a << shift;
+ S(samples, 0, i) = (a + b) << shift;
+ S(samples, 1, i) = a << shift;
}
}
diff --git a/libavcodec/mss3.c b/libavcodec/mss3.c
index 4f33984e06..649b7ca918 100644
--- a/libavcodec/mss3.c
+++ b/libavcodec/mss3.c
@@ -141,7 +141,7 @@ static const uint8_t mss3_chroma_quant[64] = {
99, 99, 99, 99, 99, 99, 99, 99
};
-const uint8_t zigzag_scan[64] = {
+static const uint8_t zigzag_scan[64] = {
0, 1, 8, 16, 9, 2, 3, 10,
17, 24, 32, 25, 18, 11, 4, 5,
12, 19, 26, 33, 40, 48, 41, 34,
diff --git a/libavcodec/options_table.h b/libavcodec/options_table.h
index 44eaa773a6..a4742d0e55 100644
--- a/libavcodec/options_table.h
+++ b/libavcodec/options_table.h
@@ -400,6 +400,11 @@ static const AVOption options[]={
{"s32", "32-bit signed integer", 0, AV_OPT_TYPE_CONST, {.dbl = AV_SAMPLE_FMT_S32 }, INT_MIN, INT_MAX, A|D, "request_sample_fmt"},
{"flt", "32-bit float", 0, AV_OPT_TYPE_CONST, {.dbl = AV_SAMPLE_FMT_FLT }, INT_MIN, INT_MAX, A|D, "request_sample_fmt"},
{"dbl", "64-bit double", 0, AV_OPT_TYPE_CONST, {.dbl = AV_SAMPLE_FMT_DBL }, INT_MIN, INT_MAX, A|D, "request_sample_fmt"},
+{"u8p" , "8-bit unsigned integer planar", 0, AV_OPT_TYPE_CONST, {.dbl = AV_SAMPLE_FMT_U8P }, INT_MIN, INT_MAX, A|D, "request_sample_fmt"},
+{"s16p", "16-bit signed integer planar", 0, AV_OPT_TYPE_CONST, {.dbl = AV_SAMPLE_FMT_S16P }, INT_MIN, INT_MAX, A|D, "request_sample_fmt"},
+{"s32p", "32-bit signed integer planar", 0, AV_OPT_TYPE_CONST, {.dbl = AV_SAMPLE_FMT_S32P }, INT_MIN, INT_MAX, A|D, "request_sample_fmt"},
+{"fltp", "32-bit float planar", 0, AV_OPT_TYPE_CONST, {.dbl = AV_SAMPLE_FMT_FLTP }, INT_MIN, INT_MAX, A|D, "request_sample_fmt"},
+{"dblp", "64-bit double planar", 0, AV_OPT_TYPE_CONST, {.dbl = AV_SAMPLE_FMT_DBLP }, INT_MIN, INT_MAX, A|D, "request_sample_fmt"},
{NULL},
};
diff --git a/libavfilter/af_amix.c b/libavfilter/af_amix.c
index e70c6b6f08..6dad3db0d0 100644
--- a/libavfilter/af_amix.c
+++ b/libavfilter/af_amix.c
@@ -354,7 +354,7 @@ static int request_samples(AVFilterContext *ctx, int min_samples)
s->input_state[i] = INPUT_OFF;
continue;
}
- } else if (ret)
+ } else if (ret < 0)
return ret;
}
return 0;
@@ -403,7 +403,7 @@ static int request_frame(AVFilterLink *outlink)
available_samples = get_available_samples(s);
if (!available_samples)
- return 0;
+ return AVERROR(EAGAIN);
return output_frame(outlink, available_samples);
}
@@ -416,7 +416,7 @@ static int request_frame(AVFilterLink *outlink)
return AVERROR_EOF;
else
return AVERROR(EAGAIN);
- } else if (ret)
+ } else if (ret < 0)
return ret;
}
av_assert0(s->frame_list->nb_frames > 0);
@@ -431,10 +431,12 @@ static int request_frame(AVFilterLink *outlink)
ret = calc_active_inputs(s);
if (ret < 0)
return ret;
+ }
+ if (s->active_inputs > 1) {
available_samples = get_available_samples(s);
if (!available_samples)
- return 0;
+ return AVERROR(EAGAIN);
available_samples = FFMIN(available_samples, wanted_samples);
} else {
available_samples = wanted_samples;
diff --git a/libavformat/flvdec.c b/libavformat/flvdec.c
index b65af892fb..997824dcec 100644
--- a/libavformat/flvdec.c
+++ b/libavformat/flvdec.c
@@ -113,11 +113,7 @@ static int flv_same_audio_codec(AVCodecContext *acodec, int flags)
case FLV_CODECID_MP3:
return acodec->codec_id == CODEC_ID_MP3;
case FLV_CODECID_NELLYMOSER_8KHZ_MONO:
- return acodec->sample_rate == 8000 &&
- acodec->codec_id == CODEC_ID_NELLYMOSER;
case FLV_CODECID_NELLYMOSER_16KHZ_MONO:
- return acodec->sample_rate == 16000 &&
- acodec->codec_id == CODEC_ID_NELLYMOSER;
case FLV_CODECID_NELLYMOSER:
return acodec->codec_id == CODEC_ID_NELLYMOSER;
case FLV_CODECID_PCM_MULAW: