summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xconfigure2
-rw-r--r--doc/platform.texi15
-rw-r--r--libavcodec/g723_1.c10
-rw-r--r--libavcodec/vp8.c2
-rw-r--r--libavfilter/buffersink.h6
-rw-r--r--libavformat/Makefile6
-rw-r--r--libavformat/ffmenc.c5
-rw-r--r--libavformat/rtmpproto.c214
-rw-r--r--libavformat/swf.c29
-rw-r--r--libavformat/swf.h15
-rw-r--r--libavformat/swfdec.c11
-rw-r--r--libavformat/swfenc.c2
-rw-r--r--libavresample/audio_convert.h2
-rw-r--r--libavresample/audio_mix.h2
-rw-r--r--libavutil/arm/intmath.h2
-rw-r--r--libavutil/internal.h40
-rw-r--r--libavutil/xtea.h4
-rw-r--r--tests/fate/voice.mak21
-rw-r--r--tests/ref/fate/g723_1-dec-13
-rw-r--r--tests/ref/fate/g723_1-dec-227
-rw-r--r--tests/ref/fate/g723_1-dec-334
-rw-r--r--tests/ref/fate/g723_1-dec-45
-rw-r--r--tests/ref/fate/g723_1-dec-5101
-rw-r--r--tests/ref/fate/g723_1-dec-6101
24 files changed, 474 insertions, 185 deletions
diff --git a/configure b/configure
index c7e5385ba3..7754da9784 100755
--- a/configure
+++ b/configure
@@ -2442,7 +2442,7 @@ probe_cc(){
_type=suncc
_ident=$($_cc -V 2>&1 | head -n1 | cut -d' ' -f 2-)
_DEPCMD='$(DEP$(1)) $(DEP$(1)FLAGS) $($(1)DEP_FLAGS) $< | sed -e "1s,^.*: ,$@: ," -e "\$$!s,\$$, \\\," -e "1!s,^.*: , ," > $(@:.o=.d)'
- _DEPFLAGS='-xM1'
+ _DEPFLAGS='-xM1 -xc99'
_ldflags='-std=c99'
_cflags_speed='-O5'
_cflags_size='-O5 -xspace'
diff --git a/doc/platform.texi b/doc/platform.texi
index 332b6b1448..3813d313e0 100644
--- a/doc/platform.texi
+++ b/doc/platform.texi
@@ -323,21 +323,6 @@ In order to run FATE you will also need the following "Utils" packages:
bc, diffutils
@end example
-Then run
-
-@example
-./configure
-@end example
-
-to make a static build.
-
-To build shared libraries add a special compiler flag to work around current
-@code{gcc4-core} package bugs in addition to the normal configure flags:
-
-@example
-./configure --enable-shared --disable-static --extra-cflags=-fno-reorder-functions
-@end example
-
If you want to build FFmpeg with additional libraries, download Cygwin
"Devel" packages for Ogg and Vorbis from any Cygwin packages repository:
@example
diff --git a/libavcodec/g723_1.c b/libavcodec/g723_1.c
index dcf285db1e..c4016f8112 100644
--- a/libavcodec/g723_1.c
+++ b/libavcodec/g723_1.c
@@ -35,7 +35,6 @@
#include "acelp_vectors.h"
#include "celp_filters.h"
#include "celp_math.h"
-#include "lsp.h"
#include "g723_1_data.h"
typedef struct g723_1_context {
@@ -924,7 +923,7 @@ static void formant_postfilter(G723_1_Context *p, int16_t *lpc, int16_t *buf)
signal_ptr = filter_signal + LPC_ORDER;
for (i = 0; i < SUBFRAMES; i++) {
int16_t temp_vector[SUBFRAME_LEN];
- int16_t temp;
+ int temp;
int auto_corr[2];
int scale, energy;
@@ -943,13 +942,12 @@ static void formant_postfilter(G723_1_Context *p, int16_t *lpc, int16_t *buf)
if (temp) {
temp = (auto_corr[0] >> 2) / temp;
}
- p->reflection_coef = ((p->reflection_coef << 2) - p->reflection_coef +
- temp + 2) >> 2;
- temp = (p->reflection_coef * 0xffffc >> 3) & 0xfffc;
+ p->reflection_coef = (3 * p->reflection_coef + temp + 2) >> 2;
+ temp = -p->reflection_coef >> 1 & ~3;
/* Compensation filter */
for (j = 0; j < SUBFRAME_LEN; j++) {
- buf_ptr[j] = av_clipl_int32(signal_ptr[j] +
+ buf_ptr[j] = av_clipl_int32((int64_t)signal_ptr[j] +
((signal_ptr[j - 1] >> 16) *
temp << 1)) >> 16;
}
diff --git a/libavcodec/vp8.c b/libavcodec/vp8.c
index c0587a5c18..fb541bc6ba 100644
--- a/libavcodec/vp8.c
+++ b/libavcodec/vp8.c
@@ -752,7 +752,7 @@ void decode_mb_mode(VP8Context *s, VP8Macroblock *mb, int mb_x, int mb_y,
#ifndef decode_block_coeffs_internal
/**
- * @param c arithmetic bitstream reader context
+ * @param r arithmetic bitstream reader context
* @param block destination for block coefficients
* @param probs probabilities to use when reading trees from the bitstream
* @param i initial coeff index, 0 unless a separate DC block is coded
diff --git a/libavfilter/buffersink.h b/libavfilter/buffersink.h
index 808c0c7aad..acafa76d6e 100644
--- a/libavfilter/buffersink.h
+++ b/libavfilter/buffersink.h
@@ -110,7 +110,7 @@ AVRational av_buffersink_get_frame_rate(AVFilterContext *ctx);
/**
* Get a buffer with filtered data from sink and put it in buf.
*
- * @param sink pointer to a context of a buffersink or abuffersink AVFilter.
+ * @param ctx pointer to a context of a buffersink or abuffersink AVFilter.
* @param buf pointer to the buffer will be written here if buf is non-NULL. buf
* must be freed by the caller using avfilter_unref_buffer().
* Buf may also be NULL to query whether a buffer is ready to be
@@ -119,14 +119,14 @@ AVRational av_buffersink_get_frame_rate(AVFilterContext *ctx);
* @return >= 0 in case of success, a negative AVERROR code in case of
* failure.
*/
-int av_buffersink_read(AVFilterContext *sink, AVFilterBufferRef **buf);
+int av_buffersink_read(AVFilterContext *ctx, AVFilterBufferRef **buf);
/**
* Same as av_buffersink_read, but with the ability to specify the number of
* samples read. This function is less efficient than av_buffersink_read(),
* because it copies the data around.
*
- * @param sink pointer to a context of the abuffersink AVFilter.
+ * @param ctx pointer to a context of the abuffersink AVFilter.
* @param buf pointer to the buffer will be written here if buf is non-NULL. buf
* must be freed by the caller using avfilter_unref_buffer(). buf
* will contain exactly nb_samples audio samples, except at the end
diff --git a/libavformat/Makefile b/libavformat/Makefile
index d77c9ea5eb..2994eef191 100644
--- a/libavformat/Makefile
+++ b/libavformat/Makefile
@@ -53,7 +53,7 @@ OBJS-$(CONFIG_AU_MUXER) += au.o
OBJS-$(CONFIG_AVI_DEMUXER) += avidec.o
OBJS-$(CONFIG_AVI_MUXER) += avienc.o
OBJS-$(CONFIG_AVISYNTH) += avisynth.o
-OBJS-$(CONFIG_AVM2_MUXER) += swfenc.o
+OBJS-$(CONFIG_AVM2_MUXER) += swfenc.o swf.o
OBJS-$(CONFIG_AVS_DEMUXER) += avs.o vocdec.o voc.o
OBJS-$(CONFIG_BETHSOFTVID_DEMUXER) += bethsoftvid.o
OBJS-$(CONFIG_BFI_DEMUXER) += bfi.o
@@ -326,8 +326,8 @@ OBJS-$(CONFIG_SRT_DEMUXER) += srtdec.o
OBJS-$(CONFIG_SRT_MUXER) += srtenc.o
OBJS-$(CONFIG_STR_DEMUXER) += psxstr.o
OBJS-$(CONFIG_SUBVIEWER_DEMUXER) += subviewerdec.o
-OBJS-$(CONFIG_SWF_DEMUXER) += swfdec.o
-OBJS-$(CONFIG_SWF_MUXER) += swfenc.o
+OBJS-$(CONFIG_SWF_DEMUXER) += swfdec.o swf.o
+OBJS-$(CONFIG_SWF_MUXER) += swfenc.o swf.o
OBJS-$(CONFIG_THP_DEMUXER) += thp.o
OBJS-$(CONFIG_TIERTEXSEQ_DEMUXER) += tiertexseq.o
OBJS-$(CONFIG_MKVTIMESTAMP_V2_MUXER) += mkvtimestamp_v2.o
diff --git a/libavformat/ffmenc.c b/libavformat/ffmenc.c
index ca252dee08..6ce69cf8a9 100644
--- a/libavformat/ffmenc.c
+++ b/libavformat/ffmenc.c
@@ -19,6 +19,8 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
+#include <assert.h>
+
#include "libavutil/intreadwrite.h"
#include "libavutil/intfloat.h"
#include "libavutil/avassert.h"
@@ -35,8 +37,7 @@ static void flush_packet(AVFormatContext *s)
fill_size = ffm->packet_end - ffm->packet_ptr;
memset(ffm->packet_ptr, 0, fill_size);
- if (avio_tell(pb) % ffm->packet_size)
- av_abort();
+ assert(avio_tell(pb) % ffm->packet_size == 0);
/* put header */
avio_wb16(pb, PACKET_ID);
diff --git a/libavformat/rtmpproto.c b/libavformat/rtmpproto.c
index e48c740a2e..5dae64118b 100644
--- a/libavformat/rtmpproto.c
+++ b/libavformat/rtmpproto.c
@@ -1021,121 +1021,149 @@ static int handle_server_bw(URLContext *s, RTMPPacket *pkt)
return 0;
}
-static int handle_invoke(URLContext *s, RTMPPacket *pkt)
+static int handle_invoke_error(URLContext *s, RTMPPacket *pkt)
{
- RTMPContext *rt = s->priv_data;
- int i, t;
const uint8_t *data_end = pkt->data + pkt->data_size;
+ uint8_t tmpstr[256];
+
+ if (!ff_amf_get_field_value(pkt->data + 9, data_end,
+ "description", tmpstr, sizeof(tmpstr))) {
+ av_log(s, AV_LOG_ERROR, "Server error: %s\n", tmpstr);
+ return -1;
+ }
+
+ return 0;
+}
+
+static int handle_invoke_result(URLContext *s, RTMPPacket *pkt)
+{
+ RTMPContext *rt = s->priv_data;
char *tracked_method = NULL;
+ GetByteContext gbc;
+ double pkt_id;
int ret = 0;
+ int i;
- //TODO: check for the messages sent for wrong state?
- if (!memcmp(pkt->data, "\002\000\006_error", 9)) {
- uint8_t tmpstr[256];
+ bytestream2_init(&gbc, pkt->data + 10, pkt->data_size);
+ if ((ret = ff_amf_read_number(&gbc, &pkt_id)) < 0)
+ return ret;
- if (!ff_amf_get_field_value(pkt->data + 9, data_end,
- "description", tmpstr, sizeof(tmpstr)))
- av_log(s, AV_LOG_ERROR, "Server error: %s\n",tmpstr);
- return -1;
- } else if (!memcmp(pkt->data, "\002\000\007_result", 10)) {
- GetByteContext gbc;
- double pkt_id;
+ for (i = 0; i < rt->nb_tracked_methods; i++) {
+ if (rt->tracked_methods[i].id != pkt_id)
+ continue;
- bytestream2_init(&gbc, pkt->data + 10, pkt->data_size);
- if ((ret = ff_amf_read_number(&gbc, &pkt_id)) < 0)
- return ret;
+ tracked_method = rt->tracked_methods[i].name;
+ del_tracked_method(rt, i);
+ break;
+ }
- for (i = 0; i < rt->nb_tracked_methods; i++) {
- if (rt->tracked_methods[i].id != pkt_id)
- continue;
+ if (!tracked_method) {
+ /* Ignore this reply when the current method is not tracked. */
+ return ret;
+ }
- tracked_method = rt->tracked_methods[i].name;
- del_tracked_method(rt, i);
- break;
- }
+ if (!memcmp(tracked_method, "connect", 7)) {
+ if (!rt->is_input) {
+ if ((ret = gen_release_stream(s, rt)) < 0)
+ goto fail;
- if (!tracked_method) {
- /* Ignore this reply when the current method is not tracked. */
- return 0;
+ if ((ret = gen_fcpublish_stream(s, rt)) < 0)
+ goto fail;
+ } else {
+ if ((ret = gen_server_bw(s, rt)) < 0)
+ goto fail;
}
- if (!memcmp(tracked_method, "connect", 7)) {
- if (!rt->is_input) {
- if ((ret = gen_release_stream(s, rt)) < 0)
- goto invoke_fail;
-
- if ((ret = gen_fcpublish_stream(s, rt)) < 0)
- goto invoke_fail;
- } else {
- if ((ret = gen_server_bw(s, rt)) < 0)
- goto invoke_fail;
- }
-
- if ((ret = gen_create_stream(s, rt)) < 0)
- goto invoke_fail;
-
- if (rt->is_input) {
- /* Send the FCSubscribe command when the name of live
- * stream is defined by the user or if it's a live stream. */
- if (rt->subscribe) {
- if ((ret = gen_fcsubscribe_stream(s, rt,
- rt->subscribe)) < 0)
- goto invoke_fail;
- } else if (rt->live == -1) {
- if ((ret = gen_fcsubscribe_stream(s, rt,
- rt->playpath)) < 0)
- goto invoke_fail;
- }
- }
- } else if (!memcmp(tracked_method, "createStream", 12)) {
- //extract a number from the result
- if (pkt->data[10] || pkt->data[19] != 5 || pkt->data[20]) {
- av_log(s, AV_LOG_WARNING, "Unexpected reply on connect()\n");
- } else {
- rt->main_channel_id = av_int2double(AV_RB64(pkt->data + 21));
- }
+ if ((ret = gen_create_stream(s, rt)) < 0)
+ goto fail;
- if (!rt->is_input) {
- if ((ret = gen_publish(s, rt)) < 0)
- goto invoke_fail;
- } else {
- if ((ret = gen_play(s, rt)) < 0)
- goto invoke_fail;
- if ((ret = gen_buffer_time(s, rt)) < 0)
- goto invoke_fail;
+ if (rt->is_input) {
+ /* Send the FCSubscribe command when the name of live
+ * stream is defined by the user or if it's a live stream. */
+ if (rt->subscribe) {
+ if ((ret = gen_fcsubscribe_stream(s, rt, rt->subscribe)) < 0)
+ goto fail;
+ } else if (rt->live == -1) {
+ if ((ret = gen_fcsubscribe_stream(s, rt, rt->playpath)) < 0)
+ goto fail;
}
}
- } else if (!memcmp(pkt->data, "\002\000\010onStatus", 11)) {
- const uint8_t* ptr = pkt->data + 11;
- uint8_t tmpstr[256];
-
- for (i = 0; i < 2; i++) {
- t = ff_amf_tag_size(ptr, data_end);
- if (t < 0)
- return 1;
- ptr += t;
+ } else if (!memcmp(tracked_method, "createStream", 12)) {
+ //extract a number from the result
+ if (pkt->data[10] || pkt->data[19] != 5 || pkt->data[20]) {
+ av_log(s, AV_LOG_WARNING, "Unexpected reply on connect()\n");
+ } else {
+ rt->main_channel_id = av_int2double(AV_RB64(pkt->data + 21));
}
- t = ff_amf_get_field_value(ptr, data_end,
- "level", tmpstr, sizeof(tmpstr));
- if (!t && !strcmp(tmpstr, "error")) {
- if (!ff_amf_get_field_value(ptr, data_end,
- "description", tmpstr, sizeof(tmpstr)))
- av_log(s, AV_LOG_ERROR, "Server error: %s\n",tmpstr);
- return -1;
+
+ if (!rt->is_input) {
+ if ((ret = gen_publish(s, rt)) < 0)
+ goto fail;
+ } else {
+ if ((ret = gen_play(s, rt)) < 0)
+ goto fail;
+ if ((ret = gen_buffer_time(s, rt)) < 0)
+ goto fail;
}
- t = ff_amf_get_field_value(ptr, data_end,
- "code", tmpstr, sizeof(tmpstr));
- if (!t && !strcmp(tmpstr, "NetStream.Play.Start")) rt->state = STATE_PLAYING;
- if (!t && !strcmp(tmpstr, "NetStream.Play.Stop")) rt->state = STATE_STOPPED;
- if (!t && !strcmp(tmpstr, "NetStream.Play.UnpublishNotify")) rt->state = STATE_STOPPED;
- if (!t && !strcmp(tmpstr, "NetStream.Publish.Start")) rt->state = STATE_PUBLISHING;
+ }
+
+fail:
+ av_free(tracked_method);
+ return ret;
+}
+
+static int handle_invoke_status(URLContext *s, RTMPPacket *pkt)
+{
+ RTMPContext *rt = s->priv_data;
+ const uint8_t *data_end = pkt->data + pkt->data_size;
+ const uint8_t *ptr = pkt->data + 11;
+ uint8_t tmpstr[256];
+ int i, t;
+
+ for (i = 0; i < 2; i++) {
+ t = ff_amf_tag_size(ptr, data_end);
+ if (t < 0)
+ return 1;
+ ptr += t;
+ }
+
+ t = ff_amf_get_field_value(ptr, data_end, "level", tmpstr, sizeof(tmpstr));
+ if (!t && !strcmp(tmpstr, "error")) {
+ if (!ff_amf_get_field_value(ptr, data_end,
+ "description", tmpstr, sizeof(tmpstr)))
+ av_log(s, AV_LOG_ERROR, "Server error: %s\n", tmpstr);
+ return -1;
+ }
+
+ t = ff_amf_get_field_value(ptr, data_end, "code", tmpstr, sizeof(tmpstr));
+ if (!t && !strcmp(tmpstr, "NetStream.Play.Start")) rt->state = STATE_PLAYING;
+ if (!t && !strcmp(tmpstr, "NetStream.Play.Stop")) rt->state = STATE_STOPPED;
+ if (!t && !strcmp(tmpstr, "NetStream.Play.UnpublishNotify")) rt->state = STATE_STOPPED;
+ if (!t && !strcmp(tmpstr, "NetStream.Publish.Start")) rt->state = STATE_PUBLISHING;
+
+ return 0;
+}
+
+static int handle_invoke(URLContext *s, RTMPPacket *pkt)
+{
+ RTMPContext *rt = s->priv_data;
+ int ret = 0;
+
+ //TODO: check for the messages sent for wrong state?
+ if (!memcmp(pkt->data, "\002\000\006_error", 9)) {
+ if ((ret = handle_invoke_error(s, pkt)) < 0)
+ return ret;
+ } else if (!memcmp(pkt->data, "\002\000\007_result", 10)) {
+ if ((ret = handle_invoke_result(s, pkt)) < 0)
+ return ret;
+ } else if (!memcmp(pkt->data, "\002\000\010onStatus", 11)) {
+ if ((ret = handle_invoke_status(s, pkt)) < 0)
+ return ret;
} else if (!memcmp(pkt->data, "\002\000\010onBWDone", 11)) {
if ((ret = gen_check_bw(s, rt)) < 0)
return ret;
}
-invoke_fail:
- av_free(tracked_method);
return ret;
}
diff --git a/libavformat/swf.c b/libavformat/swf.c
new file mode 100644
index 0000000000..d0095077e5
--- /dev/null
+++ b/libavformat/swf.c
@@ -0,0 +1,29 @@
+/*
+ * Flash Compatible Streaming Format
+ * Copyright (c) 2000 Fabrice Bellard
+ * Copyright (c) 2003 Tinic Uro
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg 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.
+ *
+ * FFmpeg 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 FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "internal.h"
+
+const AVCodecTag ff_swf_codec_tags[] = {
+ { CODEC_ID_FLV1, 0x02 },
+ { CODEC_ID_VP6F, 0x04 },
+ { CODEC_ID_NONE, 0 },
+};
diff --git a/libavformat/swf.h b/libavformat/swf.h
index 2f920f7dd3..3c0c6076f2 100644
--- a/libavformat/swf.h
+++ b/libavformat/swf.h
@@ -91,19 +91,6 @@ typedef struct {
#endif
} SWFContext;
-static const AVCodecTag swf_codec_tags[] = {
- { AV_CODEC_ID_FLV1, 0x02},
- { AV_CODEC_ID_VP6F, 0x04},
- { AV_CODEC_ID_NONE, 0},
-};
-
-static const AVCodecTag swf_audio_codec_tags[] = {
- { AV_CODEC_ID_PCM_S16LE, 0x00},
- { AV_CODEC_ID_ADPCM_SWF, 0x01},
- { AV_CODEC_ID_MP3, 0x02},
- { AV_CODEC_ID_PCM_S16LE, 0x03},
- //{ AV_CODEC_ID_NELLYMOSER, 0x06},
- { AV_CODEC_ID_NONE, 0},
-};
+extern const AVCodecTag ff_swf_codec_tags[];
#endif /* AVFORMAT_SWF_H */
diff --git a/libavformat/swfdec.c b/libavformat/swfdec.c
index 1e974fef69..069457f9fd 100644
--- a/libavformat/swfdec.c
+++ b/libavformat/swfdec.c
@@ -23,6 +23,15 @@
#include "libavutil/intreadwrite.h"
#include "swf.h"
+static const AVCodecTag swf_audio_codec_tags[] = {
+ { CODEC_ID_PCM_S16LE, 0x00 },
+ { CODEC_ID_ADPCM_SWF, 0x01 },
+ { CODEC_ID_MP3, 0x02 },
+ { CODEC_ID_PCM_S16LE, 0x03 },
+// { CODEC_ID_NELLYMOSER, 0x06 },
+ { CODEC_ID_NONE, 0 },
+};
+
static int get_swf_tag(AVIOContext *pb, int *len_ptr)
{
int tag, len;
@@ -164,7 +173,7 @@ static int swf_read_packet(AVFormatContext *s, AVPacket *pkt)
return -1;
vst->id = ch_id;
vst->codec->codec_type = AVMEDIA_TYPE_VIDEO;
- vst->codec->codec_id = ff_codec_get_id(swf_codec_tags, avio_r8(pb));
+ vst->codec->codec_id = ff_codec_get_id(ff_swf_codec_tags, avio_r8(pb));
avpriv_set_pts_info(vst, 16, 256, swf->frame_rate);
len -= 8;
} else if (tag == TAG_STREAMHEAD || tag == TAG_STREAMHEAD2) {
diff --git a/libavformat/swfenc.c b/libavformat/swfenc.c
index 3443da0ed2..862176953c 100644
--- a/libavformat/swfenc.c
+++ b/libavformat/swfenc.c
@@ -348,7 +348,7 @@ static int swf_write_video(AVFormatContext *s,
avio_wl16(pb, enc->width);
avio_wl16(pb, enc->height);
avio_w8(pb, 0);
- avio_w8(pb,ff_codec_get_tag(swf_codec_tags,enc->codec_id));
+ avio_w8(pb,ff_codec_get_tag(ff_swf_codec_tags, enc->codec_id));
put_swf_end_tag(s);
/* place the video object for the first time */
diff --git a/libavresample/audio_convert.h b/libavresample/audio_convert.h
index 9227763628..eefffbb12c 100644
--- a/libavresample/audio_convert.h
+++ b/libavresample/audio_convert.h
@@ -42,7 +42,7 @@ typedef struct AudioConvert AudioConvert;
* @param in_fmt input sample format
* @param channels number of channels, or 0 for any number of channels
* @param ptr_align buffer pointer alignment, in bytes
- * @param sample_align buffer size alignment, in samples
+ * @param samples_align buffer size alignment, in samples
* @param descr function type description (e.g. "C" or "SSE")
* @param conv conversion function pointer
*/
diff --git a/libavresample/audio_mix.h b/libavresample/audio_mix.h
index 61db33047d..2199fffe0e 100644
--- a/libavresample/audio_mix.h
+++ b/libavresample/audio_mix.h
@@ -69,7 +69,7 @@ typedef struct AudioMix {
* @param in_channels number of input channels, or 0 for any number of channels
* @param out_channels number of output channels, or 0 for any number of channels
* @param ptr_align buffer pointer alignment, in bytes
- * @param sample_align buffer size alignment, in samples
+ * @param samples_align buffer size alignment, in samples
* @param descr function type description (e.g. "C" or "SSE")
* @param mix_func mixing function pointer
*/
diff --git a/libavutil/arm/intmath.h b/libavutil/arm/intmath.h
index ebcb538cc5..4af4bf32d1 100644
--- a/libavutil/arm/intmath.h
+++ b/libavutil/arm/intmath.h
@@ -108,7 +108,7 @@ static av_always_inline av_const int32_t av_clipl_int32_arm(int64_t a)
"mvnne %1, #1<<31 \n\t"
"moveq %0, %Q2 \n\t"
"eorne %0, %1, %R2, asr #31 \n\t"
- : "=r"(x), "=&r"(y) : "r"(a):"cc");
+ : "=r"(x), "=&r"(y) : "r"(a) : "cc");
return x;
}
diff --git a/libavutil/internal.h b/libavutil/internal.h
index 502effe0b7..c56aca6d07 100644
--- a/libavutil/internal.h
+++ b/libavutil/internal.h
@@ -53,50 +53,10 @@ struct AVDictionary {
#endif
#endif
-#ifndef INT16_MIN
-#define INT16_MIN (-0x7fff - 1)
-#endif
-
-#ifndef INT16_MAX
-#define INT16_MAX 0x7fff
-#endif
-
-#ifndef INT32_MIN
-#define INT32_MIN (-0x7fffffff - 1)
-#endif
-
-#ifndef INT32_MAX
-#define INT32_MAX 0x7fffffff
-#endif
-
-#ifndef UINT32_MAX
-#define UINT32_MAX 0xffffffff
-#endif
-
-#ifndef INT64_MIN
-#define INT64_MIN (-0x7fffffffffffffffLL - 1)
-#endif
-
-#ifndef INT64_MAX
-#define INT64_MAX INT64_C(9223372036854775807)
-#endif
-
-#ifndef UINT64_MAX
-#define UINT64_MAX UINT64_C(0xFFFFFFFFFFFFFFFF)
-#endif
-
#ifndef INT_BIT
# define INT_BIT (CHAR_BIT * sizeof(int))
#endif
-#ifndef offsetof
-# define offsetof(T, F) ((unsigned int)((char *)&((T *)0)->F))
-#endif
-
-/* debug stuff */
-
-#define av_abort() do { av_log(NULL, AV_LOG_ERROR, "Abort at %s:%d\n", __FILE__, __LINE__); abort(); } while (0)
-
/* avoid usage of dangerous/inappropriate system functions */
#undef malloc
#define malloc please_use_av_malloc
diff --git a/libavutil/xtea.h b/libavutil/xtea.h
index 17fb47ac05..0899c92bc8 100644
--- a/libavutil/xtea.h
+++ b/libavutil/xtea.h
@@ -37,7 +37,7 @@ typedef struct AVXTEA {
/**
* Initialize an AVXTEA context.
*
- * @param x an AVXTEA context
+ * @param ctx an AVXTEA context
* @param key a key of 16 bytes used for encryption/decryption
*/
void av_xtea_init(struct AVXTEA *ctx, const uint8_t key[16]);
@@ -45,7 +45,7 @@ void av_xtea_init(struct AVXTEA *ctx, const uint8_t key[16]);
/**
* Encrypt or decrypt a buffer using a previously initialized context.
*
- * @param x an AVXTEA context
+ * @param ctx an AVXTEA context
* @param dst destination array, can be equal to src
* @param src source array, can be equal to dst
* @param count number of 8 byte blocks
diff --git a/tests/fate/voice.mak b/tests/fate/voice.mak
index 4082405dbb..d24ec0f9a2 100644
--- a/tests/fate/voice.mak
+++ b/tests/fate/voice.mak
@@ -9,6 +9,27 @@ fate-g722-encode: CMD = enc_dec_pcm wav md5 s16le $(SRC) -c:a g722
FATE_VOICE += $(FATE_G722)
fate-g722: $(FATE_G722)
+FATE_G723_1 += fate-g723_1-dec-1
+fate-g723_1-dec-1: CMD = framecrc -postfilter 0 -i $(SAMPLES)/g723_1/ineqd53.tco
+
+FATE_G723_1 += fate-g723_1-dec-2
+fate-g723_1-dec-2: CMD = framecrc -postfilter 0 -i $(SAMPLES)/g723_1/overd53.tco
+
+FATE_G723_1 += fate-g723_1-dec-3
+fate-g723_1-dec-3: CMD = framecrc -postfilter 1 -i $(SAMPLES)/g723_1/overd63p.tco
+
+FATE_G723_1 += fate-g723_1-dec-4
+fate-g723_1-dec-4: CMD = framecrc -postfilter 0 -i $(SAMPLES)/g723_1/pathd53.tco
+
+FATE_G723_1 += fate-g723_1-dec-5
+fate-g723_1-dec-5: CMD = framecrc -postfilter 1 -i $(SAMPLES)/g723_1/pathd63p.tco
+
+FATE_G723_1 += fate-g723_1-dec-6
+fate-g723_1-dec-6: CMD = framecrc -postfilter 1 -i $(SAMPLES)/g723_1/tamed63p.tco
+
+FATE_SAMPLES_AVCONV += $(FATE_G723_1)
+fate-g723_1: $(FATE_G723_1)
+
FATE_G726 += fate-g726-encode-2bit
fate-g726-encode-2bit: tests/data/asynth-8000-1.wav
fate-g726-encode-2bit: SRC = tests/data/asynth-8000-1.wav
diff --git a/tests/ref/fate/g723_1-dec-1 b/tests/ref/fate/g723_1-dec-1
new file mode 100644
index 0000000000..a3a7f67b44
--- /dev/null
+++ b/tests/ref/fate/g723_1-dec-1
@@ -0,0 +1,3 @@
+#tb 0: 1/8000
+0, 0, 0, 240, 480, 0x7f6f3970
+0, 240, 240, 240, 480, 0x1105a0d3
diff --git a/tests/ref/fate/g723_1-dec-2 b/tests/ref/fate/g723_1-dec-2
new file mode 100644
index 0000000000..e7fc9b2059
--- /dev/null
+++ b/tests/ref/fate/g723_1-dec-2
@@ -0,0 +1,27 @@
+#tb 0: 1/8000
+0, 0, 0, 240, 480, 0x5d9d9091
+0, 240, 240, 240, 480, 0x425095b7
+0, 480, 480, 240, 480, 0xe7b6a1a7
+0, 720, 720, 240, 480, 0x9397af19
+0, 960, 960, 240, 480, 0xe671adf7
+0, 1200, 1200, 240, 480, 0x77deb313
+0, 1440, 1440, 240, 480, 0x64abbb5f
+0, 1680, 1680, 240, 480, 0x000bc879
+0, 1920, 1920, 240, 480, 0x5a88c7aa
+0, 2160, 2160, 240, 480, 0xb041cbad
+0, 2400, 2400, 240, 480, 0x3257cd54
+0, 2640, 2640, 240, 480, 0xd6e7d4b3
+0, 2880, 2880, 240, 480, 0x0054d6b6
+0, 3120, 3120, 240, 480, 0x10bcd58e
+0, 3360, 3360, 240, 480, 0x702ed981
+0, 3600, 3600, 240, 480, 0x9870d4e3
+0, 3840, 3840, 240, 480, 0x9c12d6d1
+0, 4080, 4080, 240, 480, 0xc41be449
+0, 4320, 4320, 240, 480, 0xf4bddc5a
+0, 4560, 4560, 240, 480, 0x1c03e0d4
+0, 4800, 4800, 240, 480, 0xc287e4f8
+0, 5040, 5040, 240, 480, 0xf705ec20
+0, 5280, 5280, 240, 480, 0x7835f458
+0, 5520, 5520, 240, 480, 0xa8b3e632
+0, 5760, 5760, 240, 480, 0xd358df57
+0, 6000, 6000, 240, 480, 0x934dab80
diff --git a/tests/ref/fate/g723_1-dec-3 b/tests/ref/fate/g723_1-dec-3
new file mode 100644
index 0000000000..d1a29464e9
--- /dev/null
+++ b/tests/ref/fate/g723_1-dec-3
@@ -0,0 +1,34 @@
+#tb 0: 1/8000
+0, 0, 0, 240, 480, 0xce908869
+0, 240, 240, 240, 480, 0xfa63588e
+0, 480, 480, 240, 480, 0x11ce850c
+0, 720, 720, 240, 480, 0x76c459cf
+0, 960, 960, 240, 480, 0x13ed8bf0
+0, 1200, 1200, 240, 480, 0x33d10b77
+0, 1440, 1440, 240, 480, 0xdf41e03c
+0, 1680, 1680, 240, 480, 0xa31aad71
+0, 1920, 1920, 240, 480, 0x83c2b48d
+0, 2160, 2160, 240, 480, 0xaf41ba01
+0, 2400, 2400, 240, 480, 0xeeecbadc
+0, 2640, 2640, 240, 480, 0xe253c7e1
+0, 2880, 2880, 240, 480, 0x672cbf0a
+0, 3120, 3120, 240, 480, 0x5f32aa27
+0, 3360, 3360, 240, 480, 0x0b3da147
+0, 3600, 3600, 240, 480, 0x4819e5bc
+0, 3840, 3840, 240, 480, 0x423dec60
+0, 4080, 4080, 240, 480, 0xafefe289
+0, 4320, 4320, 240, 480, 0x8dc5f136
+0, 4560, 4560, 240, 480, 0x549cee78
+0, 4800, 4800, 240, 480, 0xe589ebdc
+0, 5040, 5040, 240, 480, 0x786cef17
+0, 5280, 5280, 240, 480, 0xdafded31
+0, 5520, 5520, 240, 480, 0xe58bedf8
+0, 5760, 5760, 240, 480, 0x44daf26c
+0, 6000, 6000, 240, 480, 0x03fcf149
+0, 6240, 6240, 240, 480, 0x97a5f4ae
+0, 6480, 6480, 240, 480, 0x2114f4f6
+0, 6720, 6720, 240, 480, 0x9a44f234
+0, 6960, 6960, 240, 480, 0x5b47f339
+0, 7200, 7200, 240, 480, 0x9248edcb
+0, 7440, 7440, 240, 480, 0x47caf226
+0, 7680, 7680, 240, 480, 0x73d4ef48
diff --git a/tests/ref/fate/g723_1-dec-4 b/tests/ref/fate/g723_1-dec-4
new file mode 100644
index 0000000000..792899d38c
--- /dev/null
+++ b/tests/ref/fate/g723_1-dec-4
@@ -0,0 +1,5 @@
+#tb 0: 1/8000
+0, 0, 0, 240, 480, 0xa697b314
+0, 240, 240, 240, 480, 0x43c5dc5a
+0, 480, 480, 240, 480, 0xd2438147
+0, 720, 720, 240, 480, 0x3b1ead64
diff --git a/tests/ref/fate/g723_1-dec-5 b/tests/ref/fate/g723_1-dec-5
new file mode 100644
index 0000000000..bdc2982740
--- /dev/null
+++ b/tests/ref/fate/g723_1-dec-5
@@ -0,0 +1,101 @@
+#tb 0: 1/8000
+0, 0, 0, 240, 480, 0x4dce9773
+0, 240, 240, 240, 480, 0xe6367ab8
+0, 480, 480, 240, 480, 0xf36a589d
+0, 720, 720, 240, 480, 0xf94efd31
+0, 960, 960, 240, 480, 0x984e6d33
+0, 1200, 1200, 240, 480, 0x84eaa191
+0, 1440, 1440, 240, 480, 0xed6e0c10
+0, 1680, 1680, 240, 480, 0x3627e7a0
+0, 1920, 1920, 240, 480, 0x2421b42d
+0, 2160, 2160, 240, 480, 0x71e00d6f
+0, 2400, 2400, 240, 480, 0xd49cdb95
+0, 2640, 2640, 240, 480, 0xa167e890
+0, 2880, 2880, 240, 480, 0xbb3fd7c0
+0, 3120, 3120, 240, 480, 0xa3d5bc27
+0, 3360, 3360, 240, 480, 0x8107ca9c
+0, 3600, 3600, 240, 480, 0xcd4ce998
+0, 3840, 3840, 240, 480, 0x14e3ee73
+0, 4080, 4080, 240, 480, 0x5fc3eaf0
+0, 4320, 4320, 240, 480, 0xf166f33d
+0, 4560, 4560, 240, 480, 0xe8b3f701
+0, 4800, 4800, 240, 480, 0x50aaeafd
+0, 5040, 5040, 240, 480, 0xc7f2daec
+0, 5280, 5280, 240, 480, 0x3960e5d0
+0, 5520, 5520, 240, 480, 0xadc8ec32
+0, 5760, 5760, 240, 480, 0x8741e7b0
+0, 6000, 6000, 240, 480, 0x1a1bd910
+0, 6240, 6240, 240, 480, 0x76a4ef7f
+0, 6480, 6480, 240, 480, 0x19e6e5f5
+0, 6720, 6720, 240, 480, 0x6365e871
+0, 6960, 6960, 240, 480, 0xb2bee161
+0, 7200, 7200, 240, 480, 0x5098cba4
+0, 7440, 7440, 240, 480, 0x1009c4c5
+0, 7680, 7680, 240, 480, 0xbf20cfe3
+0, 7920, 7920, 240, 480, 0x91ddd028
+0, 8160, 8160, 240, 480, 0x4fedce37
+0, 8400, 8400, 240, 480, 0x43bcd4d8
+0, 8640, 8640, 240, 480, 0x41b3e782
+0, 8880, 8880, 240, 480, 0xa272f4a6
+0, 9120, 9120, 240, 480, 0x46b2f2cb
+0, 9360, 9360, 240, 480, 0xc47dee7d
+0, 9600, 9600, 240, 480, 0x699fe668
+0, 9840, 9840, 240, 480, 0x72b5daf8
+0, 10080, 10080, 240, 480, 0x0c0cf25e
+0, 10320, 10320, 240, 480, 0xdafff519
+0, 10560, 10560, 240, 480, 0xf1f2e42f
+0, 10800, 10800, 240, 480, 0xe04fe7f4
+0, 11040, 11040, 240, 480, 0x1157d789
+0, 11280, 11280, 240, 480, 0xe598ede6
+0, 11520, 11520, 240, 480, 0xbd06dc2f
+0, 11760, 11760, 240, 480, 0x2aa6d2d9
+0, 12000, 12000, 240, 480, 0xa61ff1a3
+0, 12240, 12240, 240, 480, 0x6f57eb35
+0, 12480, 12480, 240, 480, 0x68c1f4a9
+0, 12720, 12720, 240, 480, 0x5c0ae6f2
+0, 12960, 12960, 240, 480, 0xdffbef45
+0, 13200, 13200, 240, 480, 0xf0daf893
+0, 13440, 13440, 240, 480, 0x680cf0c4
+0, 13680, 13680, 240, 480, 0xbbc1d42f
+0, 13920, 13920, 240, 480, 0x9b66eddd
+0, 14160, 14160, 240, 480, 0xc18be7a3
+0, 14400, 14400, 240, 480, 0x1deae025
+0, 14640, 14640, 240, 480, 0x6c12e002
+0, 14880, 14880, 240, 480, 0x004bf27e
+0, 15120, 15120, 240, 480, 0xc97de444
+0, 15360, 15360, 240, 480, 0xc650de6b
+0, 15600, 15600, 240, 480, 0xe614ecd6
+0, 15840, 15840, 240, 480, 0x2c20d111
+0, 16080, 16080, 240, 480, 0x8562c091
+0, 16320, 16320, 240, 480, 0x4fcddd08
+0, 16560, 16560, 240, 480, 0xc1b2c3cb
+0, 16800, 16800, 240, 480, 0x5dcfdf24
+0, 17040, 17040, 240, 480, 0xf348d7be
+0, 17280, 17280, 240, 480, 0x31b3ead7
+0, 17520, 17520, 240, 480, 0xb30dee68
+0, 17760, 17760, 240, 480, 0x1f44e9ac
+0, 18000, 18000, 240, 480, 0x3cafe61e
+0, 18240, 18240, 240, 480, 0x5800ea95
+0, 18480, 18480, 240, 480, 0xeaeeec19
+0, 18720, 18720, 240, 480, 0x47f9eff3
+0, 18960, 18960, 240, 480, 0xdc10edf1
+0, 19200, 19200, 240, 480, 0x5b1bd3ff
+0, 19440, 19440, 240, 480, 0x039bea64
+0, 19680, 19680, 240, 480, 0xa93ac953
+0, 19920, 19920, 240, 480, 0x1b55f01c
+0, 20160, 20160, 240, 480, 0x32b7db90
+0, 20400, 20400, 240, 480, 0x2f8ce0a8
+0, 20640, 20640, 240, 480, 0x53f4f7d5
+0, 20880, 20880, 240, 480, 0x880ee517
+0, 21120, 21120, 240, 480, 0xe793f2fd
+0, 21360, 21360, 240, 480, 0x498beaf5
+0, 21600, 21600, 240, 480, 0x8c25f623
+0, 21840, 21840, 240, 480, 0xdc0df527
+0, 22080, 22080, 240, 480, 0x9d21e9b4
+0, 22320, 22320, 240, 480, 0x6d51d9e6
+0, 22560, 22560, 240, 480, 0xaf3ee6ba
+0, 22800, 22800, 240, 480, 0xbef0ea44
+0, 23040, 23040, 240, 480, 0x50c6e9ab
+0, 23280, 23280, 240, 480, 0x76a7d80c
+0, 23520, 23520, 240, 480, 0x8d68ef94
+0, 23760, 23760, 240, 480, 0x213ce600
diff --git a/tests/ref/fate/g723_1-dec-6 b/tests/ref/fate/g723_1-dec-6
new file mode 100644
index 0000000000..eb0e4fa12c
--- /dev/null
+++ b/tests/ref/fate/g723_1-dec-6
@@ -0,0 +1,101 @@
+#tb 0: 1/8000
+0, 0, 0, 240, 480, 0x4fa1aed9
+0, 240, 240, 240, 480, 0x6d7ef391
+0, 480, 480, 240, 480, 0xaecaf2c1
+0, 720, 720, 240, 480, 0xd3b2ed0a
+0, 960, 960, 240, 480, 0x33dceb4e
+0, 1200, 1200, 240, 480, 0xc10eeb64
+0, 1440, 1440, 240, 480, 0x7c0febff
+0, 1680, 1680, 240, 480, 0x0c09eecd
+0, 1920, 1920, 240, 480, 0xa5efdcf8
+0, 2160, 2160, 240, 480, 0xb643edd2
+0, 2400, 2400, 240, 480, 0x46bef26d
+0, 2640, 2640, 240, 480, 0x4310f101
+0, 2880, 2880, 240, 480, 0x3664ec16
+0, 3120, 3120, 240, 480, 0xcc17e5e8
+0, 3360, 3360, 240, 480, 0xff4cf35b
+0, 3600, 3600, 240, 480, 0xdf4cf2e5
+0, 3840, 3840, 240, 480, 0x093bf570
+0, 4080, 4080, 240, 480, 0xd950ec75
+0, 4320, 4320, 240, 480, 0xa469f2f8
+0, 4560, 4560, 240, 480, 0x3558ee9d
+0, 4800, 4800, 240, 480, 0x4102f252
+0, 5040, 5040, 240, 480, 0xf9dff318
+0, 5280, 5280, 240, 480, 0xd7cbef4d
+0, 5520, 5520, 240, 480, 0x76c4eed3
+0, 5760, 5760, 240, 480, 0xe3d6e9d1
+0, 6000, 6000, 240, 480, 0x63baf340
+0, 6240, 6240, 240, 480, 0xd2dff2ff
+0, 6480, 6480, 240, 480, 0x3355ebc4
+0, 6720, 6720, 240, 480, 0x7183ed76
+0, 6960, 6960, 240, 480, 0x9806eff7
+0, 7200, 7200, 240, 480, 0xc090ec04
+0, 7440, 7440, 240, 480, 0xe76ff174
+0, 7680, 7680, 240, 480, 0x2cdfe8f1
+0, 7920, 7920, 240, 480, 0xbb69ee8a
+0, 8160, 8160, 240, 480, 0x3e03f522
+0, 8400, 8400, 240, 480, 0xe7e6e659
+0, 8640, 8640, 240, 480, 0x4dbaf063
+0, 8880, 8880, 240, 480, 0xc9b9f381
+0, 9120, 9120, 240, 480, 0x3866edc9
+0, 9360, 9360, 240, 480, 0x7e0defca
+0, 9600, 9600, 240, 480, 0xa88bf700
+0, 9840, 9840, 240, 480, 0x65a7f029
+0, 10080, 10080, 240, 480, 0xaf8cf09d
+0, 10320, 10320, 240, 480, 0x679bee1e
+0, 10560, 10560, 240, 480, 0x8dc1e9a4
+0, 10800, 10800, 240, 480, 0xe3c2f0ac
+0, 11040, 11040, 240, 480, 0x35d0eb14
+0, 11280, 11280, 240, 480, 0xfeb3ed00
+0, 11520, 11520, 240, 480, 0x9da3ecb4
+0, 11760, 11760, 240, 480, 0xa0e3f3c2
+0, 12000, 12000, 240, 480, 0x05ffe9de
+0, 12240, 12240, 240, 480, 0xf7adef05
+0, 12480, 12480, 240, 480, 0x71bef669
+0, 12720, 12720, 240, 480, 0x4b9feca8
+0, 12960, 12960, 240, 480, 0x85e5ecd8
+0, 13200, 13200, 240, 480, 0xa4cbe90e
+0, 13440, 13440, 240, 480, 0xe689f958
+0, 13680, 13680, 240, 480, 0xa936f168
+0, 13920, 13920, 240, 480, 0x496ff059
+0, 14160, 14160, 240, 480, 0x0bb6eb82
+0, 14400, 14400, 240, 480, 0x7727ef53
+0, 14640, 14640, 240, 480, 0xede3eaab
+0, 14880, 14880, 240, 480, 0xe961ef58
+0, 15120, 15120, 240, 480, 0x454fef58
+0, 15360, 15360, 240, 480, 0x9305e76d
+0, 15600, 15600, 240, 480, 0xfe5ce6ed
+0, 15840, 15840, 240, 480, 0x84d1efdc
+0, 16080, 16080, 240, 480, 0x4b23ed7a
+0, 16320, 16320, 240, 480, 0x1380eb91
+0, 16560, 16560, 240, 480, 0xf705eca3
+0, 16800, 16800, 240, 480, 0x26f7e707
+0, 17040, 17040, 240, 480, 0x3fe3f27f
+0, 17280, 17280, 240, 480, 0xa030f177
+0, 17520, 17520, 240, 480, 0xaf72ed92
+0, 17760, 17760, 240, 480, 0x00b8f1e7
+0, 18000, 18000, 240, 480, 0x681fecca
+0, 18240, 18240, 240, 480, 0x3ca1ef63
+0, 18480, 18480, 240, 480, 0xd6fcedac
+0, 18720, 18720, 240, 480, 0x6928ed04
+0, 18960, 18960, 240, 480, 0x8bdeeebe
+0, 19200, 19200, 240, 480, 0x24b6f59d
+0, 19440, 19440, 240, 480, 0xd49deebf
+0, 19680, 19680, 240, 480, 0xe798f2c8
+0, 19920, 19920, 240, 480, 0x280fefb8
+0, 20160, 20160, 240, 480, 0xe0a8f40d
+0, 20400, 20400, 240, 480, 0x4d48f511
+0, 20640, 20640, 240, 480, 0x6bf3eef0
+0, 20880, 20880, 240, 480, 0x1573f1cd
+0, 21120, 21120, 240, 480, 0x6245e961
+0, 21360, 21360, 240, 480, 0xe05af091
+0, 21600, 21600, 240, 480, 0xfcc3e9e3
+0, 21840, 21840, 240, 480, 0x6d5febae
+0, 22080, 22080, 240, 480, 0x4a96ef58
+0, 22320, 22320, 240, 480, 0x1586f156
+0, 22560, 22560, 240, 480, 0x50b0e99e
+0, 22800, 22800, 240, 480, 0xf25dfa9b
+0, 23040, 23040, 240, 480, 0x49b5f932
+0, 23280, 23280, 240, 480, 0xe1ddef32
+0, 23520, 23520, 240, 480, 0x2307ed94
+0, 23760, 23760, 240, 480, 0x6a2beb17