diff options
author | XhmikosR <xhmikosr@users.sourceforge.net> | 2013-01-24 20:38:22 +0400 |
---|---|---|
committer | XhmikosR <xhmikosr@users.sourceforge.net> | 2013-01-24 20:38:22 +0400 |
commit | 75782254417ccb62ba94c58755c6701833ac079d (patch) | |
tree | fd52b96def1a234f116919f8fb6fad88b340d10c /src | |
parent | e0d954769b6b098482bb65b44df353b01d04667c (diff) |
ffmpeg: remove unneeded custom code and update config.h
Diffstat (limited to 'src')
-rw-r--r-- | src/filters/transform/MPCVideoDec/FfmpegContext.cpp | 6 | ||||
-rw-r--r-- | src/filters/transform/MpaDecFilter/MpaDecFilter.cpp | 4 | ||||
-rw-r--r-- | src/thirdparty/ffmpeg/Makefile | 18 | ||||
-rw-r--r-- | src/thirdparty/ffmpeg/config.h | 3 | ||||
-rw-r--r-- | src/thirdparty/ffmpeg/custom_code.txt | 5 | ||||
-rw-r--r-- | src/thirdparty/ffmpeg/libavcodec/amrwbdec.c | 2 | ||||
-rw-r--r-- | src/thirdparty/ffmpeg/libavcodec/h263dec.c | 6 | ||||
-rw-r--r-- | src/thirdparty/ffmpeg/libavcodec/h264_dxva.c | 2 | ||||
-rw-r--r-- | src/thirdparty/ffmpeg/libavcodec/lsp.c | 2 | ||||
-rw-r--r-- | src/thirdparty/ffmpeg/libavcodec/mips/amrwbdec_mips.h | 62 | ||||
-rw-r--r-- | src/thirdparty/ffmpeg/libavcodec/mips/lsp_mips.h | 108 | ||||
-rw-r--r-- | src/thirdparty/ffmpeg/libavcodec/mpeg12.h | 2 | ||||
-rw-r--r-- | src/thirdparty/ffmpeg/libavutil/common.h | 8 | ||||
-rw-r--r-- | src/thirdparty/ffmpeg/libavutil/log.h | 12 | ||||
-rw-r--r-- | src/thirdparty/ffmpeg/libavutil/mem.h | 12 |
15 files changed, 195 insertions, 57 deletions
diff --git a/src/filters/transform/MPCVideoDec/FfmpegContext.cpp b/src/filters/transform/MPCVideoDec/FfmpegContext.cpp index df8261d03..965e47b81 100644 --- a/src/filters/transform/MPCVideoDec/FfmpegContext.cpp +++ b/src/filters/transform/MPCVideoDec/FfmpegContext.cpp @@ -1,5 +1,5 @@ /*
- * (C) 2007-2012 see Authors.txt
+ * (C) 2007-2013 see Authors.txt
*
* This file is part of MPC-HC.
*
@@ -22,7 +22,9 @@ #include <WinNT.h>
#include <vfwmsgs.h>
#include <sys/timeb.h>
+#if defined(STANDALONE_FILTER) && defined(_WIN64)
#include <time.h> // for the _time64 workaround
+#endif
#include "FfmpegContext.h"
#include "../../../DSUtil/SysVersion.h"
@@ -54,8 +56,10 @@ extern "C" { #if defined(STANDALONE_FILTER)
void* __imp_toupper = toupper;
+#if defined(_WIN64)
void* __imp_time64 = _time64;
#endif
+#endif
#define CHECK_AVC_L52_SIZE(w, h) ((w) <= 4096 && (h) <= 4096 && (w) * (h) <= 36864 * 16 * 16)
diff --git a/src/filters/transform/MpaDecFilter/MpaDecFilter.cpp b/src/filters/transform/MpaDecFilter/MpaDecFilter.cpp index 1acbba1dc..583181ffd 100644 --- a/src/filters/transform/MpaDecFilter/MpaDecFilter.cpp +++ b/src/filters/transform/MpaDecFilter/MpaDecFilter.cpp @@ -1,6 +1,6 @@ /*
* (C) 2003-2006 Gabest
- * (C) 2006-2012 see Authors.txt
+ * (C) 2006-2013 see Authors.txt
*
* This file is part of MPC-HC.
*
@@ -33,7 +33,9 @@ #ifdef STANDALONE_FILTER
void* __imp_toupper = toupper;
+#if defined(_WIN64)
void* __imp_time64 = _time64;
+#endif
#include <InitGuid.h>
diff --git a/src/thirdparty/ffmpeg/Makefile b/src/thirdparty/ffmpeg/Makefile index b1e809bc1..c8d5d6f45 100644 --- a/src/thirdparty/ffmpeg/Makefile +++ b/src/thirdparty/ffmpeg/Makefile @@ -16,6 +16,7 @@ # along with this program. If not, see <http://www.gnu.org/licenses/>. CC = gcc.exe + ifeq ($(VS2012),yes) BIN_DIR = ../../../bin12 else @@ -23,17 +24,18 @@ else endif ZLIB_DIR = ../zlib +ifeq ($(DEBUG),yes) + OUT_DIR_PREFIX = Debug +else + OUT_DIR_PREFIX = Release +endif + ifeq ($(64BIT),yes) MY_ARCH = x64 else MY_ARCH = Win32 endif -ifeq ($(DEBUG),yes) - OUT_DIR_PREFIX = Debug -else - OUT_DIR_PREFIX = Release -endif OBJ_DIR = $(BIN_DIR)/obj/$(OUT_DIR_PREFIX)_$(MY_ARCH)/ffmpeg/ OUT_LIB_DIR = $(BIN_DIR)/lib/$(OUT_DIR_PREFIX)_$(MY_ARCH) @@ -41,9 +43,9 @@ OUT_LIB = $(OUT_LIB_DIR)/ffmpeg.lib # Compiler and yasm flags -CFLAGS = -I. -I.. -Ilibavcodec -I$(ZLIB_DIR) -DHAVE_AV_CONFIG_H \ - -D_ISOC99_SOURCE -D_XOPEN_SOURCE=600 -D_LARGEFILE_SOURCE \ - -D_FILE_OFFSET_BITS=64 -std=gnu99 -pipe -mthreads +CFLAGS = -I. -I.. -I$(ZLIB_DIR) -DHAVE_AV_CONFIG_H -D_ISOC99_SOURCE \ + -D_XOPEN_SOURCE=600 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 \ + -std=gnu99 -pipe -mthreads OPTFLAGS = -O2 -fno-common -fno-tree-vectorize -fomit-frame-pointer YASMFLAGS = -I. -Pconfig.asm diff --git a/src/thirdparty/ffmpeg/config.h b/src/thirdparty/ffmpeg/config.h index a27eb30ff..e2d53b883 100644 --- a/src/thirdparty/ffmpeg/config.h +++ b/src/thirdparty/ffmpeg/config.h @@ -300,6 +300,8 @@ #define CONFIG_LIBXVID 0
#define CONFIG_LPC 0
#define CONFIG_MDCT 1
+#define CONFIG_MEMALIGN_HACK 0
+#define CONFIG_MEMORY_POISONING 0
#define CONFIG_MPEGAUDIODSP 1
#define CONFIG_RDFT 1
#define CONFIG_RUNTIME_CPUDETECT 1
@@ -344,6 +346,7 @@ Note: when adding a new codec, you have to: #define CONFIG_H261_DECODER 0
#define CONFIG_H263_DECODER INTERNAL_DECODER_H263
#define CONFIG_H263I_DECODER INTERNAL_DECODER_H263
+#define CONFIG_H263P_DECODER INTERNAL_DECODER_H263
#define CONFIG_H264_DECODER (INTERNAL_DECODER_H264 || INTERNAL_DECODER_H264_DXVA)
#define CONFIG_HUFFYUV_DECODER 0
#define CONFIG_INDEO2_DECODER 0
diff --git a/src/thirdparty/ffmpeg/custom_code.txt b/src/thirdparty/ffmpeg/custom_code.txt index 8cede39c8..5198d4995 100644 --- a/src/thirdparty/ffmpeg/custom_code.txt +++ b/src/thirdparty/ffmpeg/custom_code.txt @@ -6,10 +6,8 @@ The following files have MPC-HC specific custom code (compared to FFmpeg): * libavcodec/allcodecs.c * libavcodec/avcodec.h -* libavcodec/h263dec.c * libavcodec/h264.c * libavcodec/h264.h -* libavcodec/lsp.c * libavcodec/mpeg12.c * libavcodec/mpeg12.h * libavcodec/mpegvideo.c @@ -18,10 +16,7 @@ The following files have MPC-HC specific custom code (compared to FFmpeg): * libavcodec/utils.c * libavcodec/vc1dec.c -* libavutil/common.h -* libavutil/log.h * libavutil/mem.c -* libavutil/mem.h The following files are available only in MPC-HC (compared to FFmpeg): diff --git a/src/thirdparty/ffmpeg/libavcodec/amrwbdec.c b/src/thirdparty/ffmpeg/libavcodec/amrwbdec.c index dc13a7e0a..47aad75ad 100644 --- a/src/thirdparty/ffmpeg/libavcodec/amrwbdec.c +++ b/src/thirdparty/ffmpeg/libavcodec/amrwbdec.c @@ -42,9 +42,7 @@ #include "amr.h"
#include "amrwbdata.h"
-#if HAVE_MIPSFPU // MPC-HC patch
#include "mips/amrwbdec_mips.h"
-#endif
typedef struct {
AVFrame avframe; ///< AVFrame for decoded samples
diff --git a/src/thirdparty/ffmpeg/libavcodec/h263dec.c b/src/thirdparty/ffmpeg/libavcodec/h263dec.c index 3586d4ff7..70c5918e5 100644 --- a/src/thirdparty/ffmpeg/libavcodec/h263dec.c +++ b/src/thirdparty/ffmpeg/libavcodec/h263dec.c @@ -381,10 +381,8 @@ uint64_t time= rdtsc(); next= ff_mpeg4_find_frame_end(&s->parse_context, buf, buf_size);
}else if(CONFIG_H263_DECODER && s->codec_id==AV_CODEC_ID_H263){
next= ff_h263_find_frame_end(&s->parse_context, buf, buf_size);
-// ==> Start patch MPC
-/* }else if(CONFIG_H263P_DECODER && s->codec_id==AV_CODEC_ID_H263P){
- next= ff_h263_find_frame_end(&s->parse_context, buf, buf_size);*/
-// <== End patch MPC
+ }else if(CONFIG_H263P_DECODER && s->codec_id==AV_CODEC_ID_H263P){
+ next= ff_h263_find_frame_end(&s->parse_context, buf, buf_size);
}else{
av_log(s->avctx, AV_LOG_ERROR, "this codec does not support truncated bitstreams\n");
return AVERROR(EINVAL);
diff --git a/src/thirdparty/ffmpeg/libavcodec/h264_dxva.c b/src/thirdparty/ffmpeg/libavcodec/h264_dxva.c index c8a10500e..f04bba457 100644 --- a/src/thirdparty/ffmpeg/libavcodec/h264_dxva.c +++ b/src/thirdparty/ffmpeg/libavcodec/h264_dxva.c @@ -19,7 +19,7 @@ */
#include <Windows.h>
-#include "dxva.h"
+#include "libavcodec/dxva.h"
static void fill_dxva_slice_long(H264Context *h)
diff --git a/src/thirdparty/ffmpeg/libavcodec/lsp.c b/src/thirdparty/ffmpeg/libavcodec/lsp.c index 612415374..527805e56 100644 --- a/src/thirdparty/ffmpeg/libavcodec/lsp.c +++ b/src/thirdparty/ffmpeg/libavcodec/lsp.c @@ -27,9 +27,7 @@ #define FRAC_BITS 14
#include "mathops.h"
#include "lsp.h"
-#if HAVE_MIPSFPU // MPC-HC patch
#include "libavcodec/mips/lsp_mips.h"
-#endif
#include "libavutil/avassert.h"
void ff_acelp_reorder_lsf(int16_t* lsfq, int lsfq_min_distance, int lsfq_min, int lsfq_max, int lp_order)
diff --git a/src/thirdparty/ffmpeg/libavcodec/mips/amrwbdec_mips.h b/src/thirdparty/ffmpeg/libavcodec/mips/amrwbdec_mips.h new file mode 100644 index 000000000..a469918d2 --- /dev/null +++ b/src/thirdparty/ffmpeg/libavcodec/mips/amrwbdec_mips.h @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2012 + * MIPS Technologies, Inc., California. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the MIPS Technologies, Inc., nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE MIPS TECHNOLOGIES, INC. ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE MIPS TECHNOLOGIES, INC. BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * Author: Nedeljko Babic (nbabic@mips.com) + * + * 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 + */ + +/** + * @file + * Reference: libavcodec/amrwbdec.c + */ +#ifndef AVCODEC_AMRWBDEC_MIPS_H +#define AVCODEC_AMRWBDEC_MIPS_H +#include "config.h" + +#if HAVE_MIPSFPU && HAVE_INLINE_ASM +void hb_fir_filter_mips(float *out, const float fir_coef[], + float mem[], const float *in); +#define hb_fir_filter hb_fir_filter_mips +#endif + +#endif /* AVCODEC_AMRWBDEC_MIPS_H */ diff --git a/src/thirdparty/ffmpeg/libavcodec/mips/lsp_mips.h b/src/thirdparty/ffmpeg/libavcodec/mips/lsp_mips.h new file mode 100644 index 000000000..749770625 --- /dev/null +++ b/src/thirdparty/ffmpeg/libavcodec/mips/lsp_mips.h @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2012 + * MIPS Technologies, Inc., California. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the MIPS Technologies, Inc., nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE MIPS TECHNOLOGIES, INC. ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE MIPS TECHNOLOGIES, INC. BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * Author: Nedeljko Babic (nbabic@mips.com) + * + * LSP routines for ACELP-based codecs optimized for MIPS + * + * 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 + */ + +/** + * @file + * Reference: libavcodec/lsp.c + */ +#ifndef AVCODEC_LSP_MIPS_H +#define AVCODEC_LSP_MIPS_H + +#if HAVE_MIPSFPU && HAVE_INLINE_ASM +static av_always_inline void ff_lsp2polyf_mips(const double *lsp, double *f, int lp_half_order) +{ + int i, j = 0; + double * p_fi = f; + double * p_f = 0; + + f[0] = 1.0; + f[1] = -2 * lsp[0]; + lsp -= 2; + + for(i=2; i<=lp_half_order; i++) + { + double tmp, f_j_2, f_j_1, f_j; + double val = lsp[2*i]; + + __asm__ volatile( + "move %[p_f], %[p_fi] \n\t" + "add.d %[val], %[val], %[val] \n\t" + "addiu %[p_fi], 8 \n\t" + "ldc1 %[f_j_1], 0(%[p_f]) \n\t" + "ldc1 %[f_j], 8(%[p_f]) \n\t" + "neg.d %[val], %[val] \n\t" + "add.d %[tmp], %[f_j_1], %[f_j_1] \n\t" + "madd.d %[tmp], %[tmp], %[f_j], %[val] \n\t" + "addiu %[j], %[i], -2 \n\t" + "ldc1 %[f_j_2], -8(%[p_f]) \n\t" + "sdc1 %[tmp], 16(%[p_f]) \n\t" + "beqz %[j], ff_lsp2polyf_lp_j_end%= \n\t" + "ff_lsp2polyf_lp_j%=: \n\t" + "add.d %[tmp], %[f_j], %[f_j_2] \n\t" + "madd.d %[tmp], %[tmp], %[f_j_1], %[val] \n\t" + "mov.d %[f_j], %[f_j_1] \n\t" + "addiu %[j], -1 \n\t" + "mov.d %[f_j_1], %[f_j_2] \n\t" + "ldc1 %[f_j_2], -16(%[p_f]) \n\t" + "sdc1 %[tmp], 8(%[p_f]) \n\t" + "addiu %[p_f], -8 \n\t" + "bgtz %[j], ff_lsp2polyf_lp_j%= \n\t" + "ff_lsp2polyf_lp_j_end%=: \n\t" + + : [f_j_2]"=&f"(f_j_2), [f_j_1]"=&f"(f_j_1), [val]"+f"(val), + [tmp]"=&f"(tmp), [f_j]"=&f"(f_j), [p_f]"+r"(p_f), + [j]"+r"(j), [p_fi]"+r"(p_fi) + : [i]"r"(i) + ); + f[1] += val; + } +} +#define ff_lsp2polyf ff_lsp2polyf_mips +#endif /* HAVE_MIPSFPU && HAVE_INLINE_ASM */ +#endif /* AVCODEC_LSP_MIPS_H */ diff --git a/src/thirdparty/ffmpeg/libavcodec/mpeg12.h b/src/thirdparty/ffmpeg/libavcodec/mpeg12.h index 0b49979b8..1e2c432a4 100644 --- a/src/thirdparty/ffmpeg/libavcodec/mpeg12.h +++ b/src/thirdparty/ffmpeg/libavcodec/mpeg12.h @@ -26,7 +26,7 @@ // ==> Start patch MPC
#include <windows.h>
-#include "dxva.h"
+#include "libavcodec/dxva.h"
// <== End patch MPC
#define DC_VLC_BITS 9
diff --git a/src/thirdparty/ffmpeg/libavutil/common.h b/src/thirdparty/ffmpeg/libavutil/common.h index 8668e04ce..0983af4ba 100644 --- a/src/thirdparty/ffmpeg/libavutil/common.h +++ b/src/thirdparty/ffmpeg/libavutil/common.h @@ -63,14 +63,6 @@ #define FF_ARRAY_ELEMS(a) (sizeof(a) / sizeof((a)[0]))
#define FFALIGN(x, a) (((x)+(a)-1)&~((a)-1))
-// ==> Start patch MPC
-#ifdef __cplusplus
- #ifndef UINT64_C
- #define UINT64_C(x) (x ## ULL)
- #endif
-#endif
-// <== End patch MPC
-
/* misc math functions */
/**
diff --git a/src/thirdparty/ffmpeg/libavutil/log.h b/src/thirdparty/ffmpeg/libavutil/log.h index d865e63bc..c534da441 100644 --- a/src/thirdparty/ffmpeg/libavutil/log.h +++ b/src/thirdparty/ffmpeg/libavutil/log.h @@ -179,12 +179,6 @@ typedef struct AVClass { */
void av_log(void *avcl, int level, const char *fmt, ...) av_printf_format(3, 4);
-// ==> Start patch MPC
-#ifdef __cplusplus
-extern "C" {
-#endif
-// <== End patch MPC
-
void av_vlog(void *avcl, int level, const char *fmt, va_list);
int av_log_get_level(void);
void av_log_set_level(int);
@@ -193,12 +187,6 @@ void av_log_default_callback(void* ptr, int level, const char* fmt, va_list vl); const char* av_default_item_name(void* ctx);
AVClassCategory av_default_get_category(void *ptr);
-// ==> Start patch MPC
-#ifdef __cplusplus
-}
-#endif
-// <== End patch MPC
-
/**
* Format a line of log the same way as the default callback.
* @param line buffer to receive the formated line
diff --git a/src/thirdparty/ffmpeg/libavutil/mem.h b/src/thirdparty/ffmpeg/libavutil/mem.h index 64da81402..3f235b62f 100644 --- a/src/thirdparty/ffmpeg/libavutil/mem.h +++ b/src/thirdparty/ffmpeg/libavutil/mem.h @@ -72,12 +72,6 @@ #define av_alloc_size(...)
#endif
-// ==> Start patch MPC
-#ifdef __cplusplus
-extern "C" {
-#endif
-// <== End patch MPC
-
/**
* Allocate a block of size bytes with alignment suitable for all
* memory accesses (including vectors if available on the CPU).
@@ -194,12 +188,6 @@ char *av_strdup(const char *s) av_malloc_attrib; */
void av_freep(void *ptr);
-// ==> Start patch MPC
-#ifdef __cplusplus
-}
-#endif
-// <== End patch MPC
-
/**
* Add an element to a dynamic array.
*
|