diff --git a/vp8/common/alloccommon.c b/vp8/common/alloccommon.c index 9dce8c8f6..ceb9e525f 100644 --- a/vp8/common/alloccommon.c +++ b/vp8/common/alloccommon.c @@ -16,7 +16,6 @@ #include "findnearmv.h" #include "entropymode.h" #include "systemdependent.h" -#include "vpxerrors.h" extern void vp8_init_scan_order_mask(); @@ -71,7 +70,7 @@ int vp8_alloc_frame_buffers(VP8_COMMON *oci, int width, int height) if (vp8_yv12_alloc_frame_buffer(&oci->yv12_fb[i], width, height, VP8BORDERINPIXELS) < 0) { vp8_de_alloc_frame_buffers(oci); - return ALLOC_FAILURE; + return 1; } } @@ -88,13 +87,13 @@ int vp8_alloc_frame_buffers(VP8_COMMON *oci, int width, int height) if (vp8_yv12_alloc_frame_buffer(&oci->temp_scale_frame, width, 16, VP8BORDERINPIXELS) < 0) { vp8_de_alloc_frame_buffers(oci); - return ALLOC_FAILURE; + return 1; } if (vp8_yv12_alloc_frame_buffer(&oci->post_proc_buffer, width, height, VP8BORDERINPIXELS) < 0) { vp8_de_alloc_frame_buffers(oci); - return ALLOC_FAILURE; + return 1; } oci->mb_rows = height >> 4; @@ -106,7 +105,7 @@ int vp8_alloc_frame_buffers(VP8_COMMON *oci, int width, int height) if (!oci->mip) { vp8_de_alloc_frame_buffers(oci); - return ALLOC_FAILURE; + return 1; } oci->mi = oci->mip + oci->mode_info_stride + 1; @@ -117,7 +116,7 @@ int vp8_alloc_frame_buffers(VP8_COMMON *oci, int width, int height) if (!oci->above_context) { vp8_de_alloc_frame_buffers(oci); - return ALLOC_FAILURE; + return 1; } vp8_update_mode_info_border(oci->mi, oci->mb_rows, oci->mb_cols); diff --git a/vp8/common/boolcoder.h b/vp8/common/boolcoder.h deleted file mode 100644 index 5658868a6..000000000 --- a/vp8/common/boolcoder.h +++ /dev/null @@ -1,570 +0,0 @@ -/* - * Copyright (c) 2010 The WebM project authors. All Rights Reserved. - * - * Use of this source code is governed by a BSD-style license - * that can be found in the LICENSE file in the root of the source - * tree. An additional intellectual property rights grant can be found - * in the file PATENTS. All contributing project authors may - * be found in the AUTHORS file in the root of the source tree. - */ - - -#ifndef bool_coder_h -#define bool_coder_h 1 - -/* Arithmetic bool coder with largish probability range. - Timothy S Murphy 6 August 2004 */ - -/* So as not to force users to drag in too much of my idiosyncratic C++ world, - I avoid fancy storage management. */ - -#include - -#include -#include - -typedef unsigned char vp8bc_index_t; // probability index - -/* There are a couple of slight variants in the details of finite-precision - arithmetic coding. May be safely ignored by most users. */ - -enum vp8bc_rounding -{ - vp8bc_down = 0, // just like VP8 - vp8bc_down_full = 1, // handles minimum probability correctly - vp8bc_up = 2 -}; - -#if _MSC_VER - -/* Note that msvc by default does not inline _anything_ (regardless of the - setting of inline_depth) and that a command-line option (-Ob1 or -Ob2) - is required to inline even the smallest functions. */ - -# pragma inline_depth( 255) // I mean it when I inline something -# pragma warning( disable : 4099) // No class vs. struct harassment -# pragma warning( disable : 4250) // dominance complaints -# pragma warning( disable : 4284) // operator-> in templates -# pragma warning( disable : 4800) // bool conversion - -// don't let prefix ++,-- stand in for postfix, disaster would ensue - -# pragma warning( error : 4620 4621) - -#endif // _MSC_VER - - -#if __cplusplus - -// Sometimes one wishes to be definite about integer lengths. - -struct int_types -{ - typedef const bool cbool; - typedef const signed char cchar; - typedef const short cshort; - typedef const int cint; - typedef const int clong; - - typedef const double cdouble; - typedef const size_t csize_t; - - typedef unsigned char uchar; // 8 bits - typedef const uchar cuchar; - - typedef short int16; - typedef unsigned short uint16; - typedef const int16 cint16; - typedef const uint16 cuint16; - - typedef int int32; - typedef unsigned int uint32; - typedef const int32 cint32; - typedef const uint32 cuint32; - - typedef unsigned int uint; - typedef unsigned int ulong; - typedef const uint cuint; - typedef const ulong culong; - - - // All structs consume space, may as well have a vptr. - - virtual ~int_types(); -}; - - -struct bool_coder_spec; -struct bool_coder; -struct bool_writer; -struct bool_reader; - - -struct bool_coder_namespace : int_types -{ - typedef vp8bc_index_t Index; - typedef bool_coder_spec Spec; - typedef const Spec c_spec; - - enum Rounding - { - Down = vp8bc_down, - down_full = vp8bc_down_full, - Up = vp8bc_up - }; -}; - - -// Archivable specification of a bool coder includes rounding spec -// and probability mapping table. The latter replaces a uchar j -// (0 <= j < 256) with an arbitrary uint16 tbl[j] = p. -// p/65536 is then the probability of a zero. - -struct bool_coder_spec : bool_coder_namespace -{ - friend struct bool_coder; - friend struct bool_writer; - friend struct bool_reader; - friend struct bool_coder_spec_float; - friend struct bool_coder_spec_explicit_table; - friend struct bool_coder_spec_exponential_table; - friend struct BPsrc; -private: - uint w; // precision - Rounding r; - - uint ebits, mbits, ebias; - uint32 mmask; - - Index max_index, half_index; - - uint32 mantissa(Index i) const - { - assert(i < half_index); - return (1 << mbits) + (i & mmask); - } - uint exponent(Index i) const - { - assert(i < half_index); - return ebias - (i >> mbits); - } - - uint16 Ptbl[256]; // kinda clunky, but so is storage management. - - /* Cost in bits of encoding a zero at every probability, scaled by 2^20. - Assumes that index is at most 8 bits wide. */ - - uint32 Ctbl[256]; - - uint32 split(Index i, uint32 R) const // 1 <= split <= max( 1, R-1) - { - if (!ebias) - return 1 + (((R - 1) * Ptbl[i]) >> 16); - - if (i >= half_index) - return R - split(max_index - i, R); - - return 1 + (((R - 1) * mantissa(i)) >> exponent(i)); - } - - uint32 max_range() const - { - return (1 << w) - (r == down_full ? 0 : 1); - } - uint32 min_range() const - { - return (1 << (w - 1)) + (r == down_full ? 1 : 0); - } - uint32 Rinc() const - { - return r == Up ? 1 : 0; - } - - void check_prec() const; - - bool float_init(uint Ebits, uint Mbits); - - void cost_init(); - - bool_coder_spec( - uint prec, Rounding rr, uint Ebits = 0, uint Mbits = 0 - ) - : w(prec), r(rr) - { - float_init(Ebits, Mbits); - } -public: - // Read complete spec from file. - bool_coder_spec(FILE *); - - // Write spec to file. - void dump(FILE *) const; - - // return probability index best approximating prob. - Index operator()(double prob) const; - - // probability corresponding to index - double operator()(Index i) const; - - Index complement(Index i) const - { - return max_index - i; - } - - Index max_index() const - { - return max_index; - } - Index half_index() const - { - return half_index; - } - - uint32 cost_zero(Index i) const - { - return Ctbl[i]; - } - uint32 cost_one(Index i) const - { - return Ctbl[ max_index - i]; - } - uint32 cost_bit(Index i, bool b) const - { - return Ctbl[b? max_index-i:i]; - } -}; - - -/* Pseudo floating-point probability specification. - - At least one of Ebits and Mbits must be nonzero. - - Since all arithmetic is done at 32 bits, Ebits is at most 5. - - Total significant bits in index is Ebits + Mbits + 1. - - Below the halfway point (i.e. when the top significant bit is 0), - the index is (e << Mbits) + m. - - The exponent e is between 0 and (2**Ebits) - 1, - the mantissa m is between 0 and (2**Mbits) - 1. - - Prepending an implicit 1 to the mantissa, the probability is then - - (2**Mbits + m) >> (e - 2**Ebits - 1 - Mbits), - - which has (1/2)**(2**Ebits + 1) as a minimum - and (1/2) * [1 - 2**(Mbits + 1)] as a maximum. - - When the index is above the halfway point, the probability is the - complement of the probability associated to the complement of the index. - - Note that the probability increases with the index and that, because of - the symmetry, we cannot encode probability exactly 1/2; though we - can get as close to 1/2 as we like, provided we have enough Mbits. - - The latter is of course not a problem in practice, one never has - exact probabilities and entropy errors are second order, that is, the - "overcoding" of a zero will be largely compensated for by the - "undercoding" of a one (or vice-versa). - - Compared to arithmetic probability specs (a la VP8), this will do better - at very high and low probabilities and worse at probabilities near 1/2, - as well as facilitating the usage of wider or narrower probability indices. -*/ - -struct bool_coder_spec_float : bool_coder_spec -{ - bool_coder_spec_float( - uint Ebits = 3, uint Mbits = 4, Rounding rr = down_full, uint prec = 12 - ) - : bool_coder_spec(prec, rr, Ebits, Mbits) - { - cost_init(); - } -}; - - -struct bool_coder_spec_explicit_table : bool_coder_spec -{ - bool_coder_spec_explicit_table( - cuint16 probability_table[256] = 0, // default is tbl[i] = i << 8. - Rounding = down_full, - uint precision = 16 - ); -}; - -// Contruct table via multiplicative interpolation between -// p[128] = 1/2 and p[0] = (1/2)^x. -// Since we are working with 16-bit precision, x is at most 16. -// For probabilities to increase with i, we must have x > 1. -// For 0 <= i <= 128, p[i] = (1/2)^{ 1 + [1 - (i/128)]*[x-1] }. -// Finally, p[128+i] = 1 - p[128 - i]. - -struct bool_coder_spec_exponential_table : bool_coder_spec -{ - bool_coder_spec_exponential_table(uint x, Rounding = down_full, uint prec = 16); -}; - - -// Commonalities between writer and reader. - -struct bool_coder : bool_coder_namespace -{ - friend struct bool_writer; - friend struct bool_reader; - friend struct BPsrc; -private: - uint32 Low, Range; - cuint32 min_range; - cuint32 rinc; - c_spec spec; - - void _reset() - { - Low = 0; - Range = spec.max_range(); - } - - bool_coder(c_spec &s) - : min_range(s.min_range()), - rinc(s.Rinc()), - spec(s) - { - _reset(); - } - - uint32 half() const - { - return 1 + ((Range - 1) >> 1); - } -public: - c_spec &Spec() const - { - return spec; - } -}; - - -struct bool_writer : bool_coder -{ - friend struct BPsrc; -private: - uchar *Bstart, *Bend, *B; - int bit_lag; - bool is_toast; - void carry(); - void reset() - { - _reset(); - bit_lag = 32 - spec.w; - is_toast = 0; - } - void raw(bool value, uint32 split); -public: - bool_writer(c_spec &, uchar *Dest, size_t Len); - virtual ~bool_writer(); - - void operator()(Index p, bool v) - { - raw(v, spec.split(p, Range)); - } - - uchar *buf() const - { - return Bstart; - } - size_t bytes_written() const - { - return B - Bstart; - } - - // Call when done with input, flushes internal state. - // DO NOT write any more data after calling this. - - bool_writer &flush(); - - void write_bits(int n, uint val) - { - if (n) - { - uint m = 1 << (n - 1); - - do - { - raw((bool)(val & m), half()); - } - while (m >>= 1); - } - } - -# if 0 - // We are agnostic about storage management. - // By default, overflows throw an assert but user can - // override to provide an expanding buffer using ... - - virtual void overflow(uint Len) const; - - // ... this function copies already-written data into new buffer - // and retains new buffer location. - - void new_buffer(uchar *dest, uint Len); - - // Note that storage management is the user's responsibility. -# endif -}; - - -// This could be adjusted to use a little less lookahead. - -struct bool_reader : bool_coder -{ - friend struct BPsrc; -private: - cuchar *const Bstart; // for debugging - cuchar *B; - cuchar *const Bend; - cuint shf; - uint bct; - bool raw(uint32 split); -public: - bool_reader(c_spec &s, cuchar *src, size_t Len); - - bool operator()(Index p) - { - return raw(spec.split(p, Range)); - } - - uint read_bits(int num_bits) - { - uint v = 0; - - while (--num_bits >= 0) - v += v + (raw(half()) ? 1 : 0); - - return v; - } -}; - -extern "C" { - -#endif /* __cplusplus */ - - - /* C interface */ - - typedef struct bool_coder_spec bool_coder_spec; - typedef struct bool_writer bool_writer; - typedef struct bool_reader bool_reader; - - typedef const bool_coder_spec c_bool_coder_spec; - typedef const bool_writer c_bool_writer; - typedef const bool_reader c_bool_reader; - - - /* Optionally override default precision when constructing coder_specs. - Just pass a zero pointer if you don't care. - Precision is at most 16 bits for table specs, at most 23 otherwise. */ - - struct vp8bc_prec - { - enum vp8bc_rounding r; /* see top header file for def */ - unsigned int prec; /* range precision in bits */ - }; - - typedef const struct vp8bc_prec vp8bc_c_prec; - - /* bool_coder_spec contains mapping of uchars to actual probabilities - (16 bit uints) as well as (usually immaterial) selection of - exact finite-precision algorithm used (for now, the latter can only - be overridden using the C++ interface). - See comments above the corresponding C++ constructors for discussion, - especially of exponential probability table generation. */ - - bool_coder_spec *vp8bc_vp8spec(); // just like vp8 - - bool_coder_spec *vp8bc_literal_spec( - const unsigned short prob_map[256], // 0 is like vp8 w/more precision - vp8bc_c_prec* - ); - - bool_coder_spec *vp8bc_float_spec( - unsigned int exponent_bits, unsigned int mantissa_bits, vp8bc_c_prec* - ); - - bool_coder_spec *vp8bc_exponential_spec(unsigned int min_exp, vp8bc_c_prec *); - - bool_coder_spec *vp8bc_spec_from_file(FILE *); - - - void vp8bc_destroy_spec(c_bool_coder_spec *); - - void vp8bc_spec_to_file(c_bool_coder_spec *, FILE *); - - - /* Nearest index to supplied probability of zero, 0 <= prob <= 1. */ - - vp8bc_index_t vp8bc_index(c_bool_coder_spec *, double prob); - - vp8bc_index_t vp8bc_index_from_counts( - c_bool_coder_spec *p, unsigned int zero_ct, unsigned int one_ct - ); - - /* In case you want to look */ - - double vp8bc_probability(c_bool_coder_spec *, vp8bc_index_t); - - /* Opposite index */ - - vp8bc_index_t vp8bc_complement(c_bool_coder_spec *, vp8bc_index_t); - - /* Cost in bits of encoding a zero at given probability, scaled by 2^20. - (assumes that an int holds at least 32 bits). */ - - unsigned int vp8bc_cost_zero(c_bool_coder_spec *, vp8bc_index_t); - - unsigned int vp8bc_cost_one(c_bool_coder_spec *, vp8bc_index_t); - unsigned int vp8bc_cost_bit(c_bool_coder_spec *, vp8bc_index_t, int); - - - /* bool_writer interface */ - - /* Length = 0 disables checking for writes beyond buffer end. */ - - bool_writer *vp8bc_create_writer( - c_bool_coder_spec *, unsigned char *Destination, size_t Length - ); - - /* Flushes out any buffered data and returns total # of bytes written. */ - - size_t vp8bc_destroy_writer(bool_writer *); - - void vp8bc_write_bool(bool_writer *, int boolean_val, vp8bc_index_t false_prob); - - void vp8bc_write_bits( - bool_writer *, unsigned int integer_value, int number_of_bits - ); - - c_bool_coder_spec *vp8bc_writer_spec(c_bool_writer *); - - - /* bool_reader interface */ - - /* Length = 0 disables checking for reads beyond buffer end. */ - - bool_reader *vp8bc_create_reader( - c_bool_coder_spec *, const unsigned char *Source, size_t Length - ); - void vp8bc_destroy_reader(bool_reader *); - - int vp8bc_read_bool(bool_reader *, vp8bc_index_t false_prob); - - unsigned int vp8bc_read_bits(bool_reader *, int number_of_bits); - - c_bool_coder_spec *vp8bc_reader_spec(c_bool_reader *); - -#if __cplusplus -} -#endif - -#endif /* bool_coder_h */ diff --git a/vp8/common/codec_common_interface.h b/vp8/common/codec_common_interface.h deleted file mode 100644 index 7a7db3847..000000000 --- a/vp8/common/codec_common_interface.h +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright (c) 2010 The WebM project authors. All Rights Reserved. - * - * Use of this source code is governed by a BSD-style license - * that can be found in the LICENSE file in the root of the source - * tree. An additional intellectual property rights grant can be found - * in the file PATENTS. All contributing project authors may - * be found in the AUTHORS file in the root of the source tree. - */ - -#ifndef CODEC_COMMON_INTERFACE_H -#define CODEC_COMMON_INTERFACE_H - -#define __export -#define _export -#define dll_export __declspec( dllexport ) -#define dll_import __declspec( dllimport ) - -// Playback ERROR Codes. -#define NO_DECODER_ERROR 0 -#define REMOTE_DECODER_ERROR -1 - -#define DFR_BAD_DCT_COEFF -100 -#define DFR_ZERO_LENGTH_FRAME -101 -#define DFR_FRAME_SIZE_INVALID -102 -#define DFR_OUTPUT_BUFFER_OVERFLOW -103 -#define DFR_INVALID_FRAME_HEADER -104 -#define FR_INVALID_MODE_TOKEN -110 -#define ETR_ALLOCATION_ERROR -200 -#define ETR_INVALID_ROOT_PTR -201 -#define SYNCH_ERROR -400 -#define BUFFER_UNDERFLOW_ERROR -500 -#define PB_IB_OVERFLOW_ERROR -501 - -// External error triggers -#define PB_HEADER_CHECKSUM_ERROR -601 -#define PB_DATA_CHECKSUM_ERROR -602 - -// DCT Error Codes -#define DDCT_EXPANSION_ERROR -700 -#define DDCT_INVALID_TOKEN_ERROR -701 - -// exception_errors -#define GEN_EXCEPTIONS -800 -#define EX_UNQUAL_ERROR -801 - -// Unrecoverable error codes -#define FATAL_PLAYBACK_ERROR -1000 -#define GEN_ERROR_CREATING_CDC -1001 -#define GEN_THREAD_CREATION_ERROR -1002 -#define DFR_CREATE_BMP_FAILED -1003 - -// YUV buffer configuration structure -typedef struct -{ - int y_width; - int y_height; - int y_stride; - - int uv_width; - int uv_height; - int uv_stride; - - unsigned char *y_buffer; - unsigned char *u_buffer; - unsigned char *v_buffer; - -} YUV_BUFFER_CONFIG; -typedef enum -{ - C_SET_KEY_FRAME, - C_SET_FIXED_Q, - C_SET_FIRSTPASS_FILE, - C_SET_EXPERIMENTAL_MIN, - C_SET_EXPERIMENTAL_MAX = C_SET_EXPERIMENTAL_MIN + 255, - C_SET_CHECKPROTECT, - C_SET_TESTMODE, - C_SET_INTERNAL_SIZE, - C_SET_RECOVERY_FRAME, - C_SET_REFERENCEFRAME, - C_SET_GOLDENFRAME - -#ifndef VP50_COMP_INTERFACE - // Specialist test facilities. -// C_VCAP_PARAMS, // DO NOT USE FOR NOW WITH VFW CODEC -#endif - -} C_SETTING; - -typedef unsigned long C_SET_VALUE; - - -#endif diff --git a/vp8/common/fourcc.hpp b/vp8/common/fourcc.hpp deleted file mode 100644 index c5826285e..000000000 --- a/vp8/common/fourcc.hpp +++ /dev/null @@ -1,121 +0,0 @@ -/* - * Copyright (c) 2010 The WebM project authors. All Rights Reserved. - * - * Use of this source code is governed by a BSD-style license - * that can be found in the LICENSE file in the root of the source - * tree. An additional intellectual property rights grant can be found - * in the file PATENTS. All contributing project authors may - * be found in the AUTHORS file in the root of the source tree. - */ - - -#ifndef FOURCC_HPP -#define FOURCC_HPP - -#include -#include - - -#if defined(__POWERPC__) || defined(__APPLE__) || defined(__MERKS__) -using namespace std; -#endif - -class four_cc -{ -public: - - four_cc(); - four_cc(const char*); - explicit four_cc(unsigned long); - - bool operator==(const four_cc&) const; - bool operator!=(const four_cc&) const; - - bool operator==(const char*) const; - bool operator!=(const char*) const; - - operator unsigned long() const; - unsigned long as_long() const; - - four_cc& operator=(unsigned long); - - char operator[](int) const; - - std::ostream& put(std::ostream&) const; - - bool printable() const; - -private: - - union - { - char code[4]; - unsigned long code_as_long; - }; - -}; - - -inline four_cc::four_cc() -{ -} - -inline four_cc::four_cc(unsigned long x) - : code_as_long(x) -{ -} - -inline four_cc::four_cc(const char* str) -{ - memcpy(code, str, 4); -} - - -inline bool four_cc::operator==(const four_cc& rhs) const -{ - return code_as_long == rhs.code_as_long; -} - -inline bool four_cc::operator!=(const four_cc& rhs) const -{ - return !operator==(rhs); -} - -inline bool four_cc::operator==(const char* rhs) const -{ - return (memcmp(code, rhs, 4) == 0); -} - -inline bool four_cc::operator!=(const char* rhs) const -{ - return !operator==(rhs); -} - - -inline four_cc::operator unsigned long() const -{ - return code_as_long; -} - -inline unsigned long four_cc::as_long() const -{ - return code_as_long; -} - -inline char four_cc::operator[](int i) const -{ - return code[i]; -} - -inline four_cc& four_cc::operator=(unsigned long val) -{ - code_as_long = val; - return *this; -} - -inline std::ostream& operator<<(std::ostream& os, const four_cc& rhs) -{ - return rhs.put(os); -} - -#endif diff --git a/vp8/common/mac_specs.h b/vp8/common/mac_specs.h deleted file mode 100644 index 4b8ee5877..000000000 --- a/vp8/common/mac_specs.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (c) 2010 The WebM project authors. All Rights Reserved. - * - * Use of this source code is governed by a BSD-style license - * that can be found in the LICENSE file in the root of the source - * tree. An additional intellectual property rights grant can be found - * in the file PATENTS. All contributing project authors may - * be found in the AUTHORS file in the root of the source tree. - */ - - -#if !defined(_mac_specs_h) -#define _mac_specs_h - - -#if defined(__cplusplus) -extern "C" { -#endif - - extern unsigned int vp8_read_tsc(); - - extern unsigned int vp8_get_processor_freq(); - - extern unsigned int vpx_has_altivec(); - -#if defined(__cplusplus) -} -#endif - - -#endif diff --git a/vp8/common/partialgfupdate.h b/vp8/common/partialgfupdate.h deleted file mode 100644 index 115134a53..000000000 --- a/vp8/common/partialgfupdate.h +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright (c) 2010 The WebM project authors. All Rights Reserved. - * - * Use of this source code is governed by a BSD-style license - * that can be found in the LICENSE file in the root of the source - * tree. An additional intellectual property rights grant can be found - * in the file PATENTS. All contributing project authors may - * be found in the AUTHORS file in the root of the source tree. - */ - - -#ifndef __INC_PARTIALGFUPDATE_H -#define __INC_PARTIALGFUPDATE_H - -#include "onyxc_int.h" - -extern void update_gf_selective(ONYX_COMMON *cm, MACROBLOCKD *x); - -#endif diff --git a/vp8/common/proposed.h b/vp8/common/proposed.h deleted file mode 100644 index c9659902b..000000000 --- a/vp8/common/proposed.h +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright (c) 2010 The WebM project authors. All Rights Reserved. - * - * Use of this source code is governed by a BSD-style license - * that can be found in the LICENSE file in the root of the source - * tree. An additional intellectual property rights grant can be found - * in the file PATENTS. All contributing project authors may - * be found in the AUTHORS file in the root of the source tree. - */ - - -typedef struct core_codec *codec_ptr; -typedef struct interface_table *interface_ptr; - -typedef struct -{ - void (*Initialize)(); - void (*Shutdown)(); - codec_ptr(*Create)(); - int (*compress_frame)(codec_ptr, unsigned int *frame_flags, YV12_BUFFER_CONFIG *sd, unsigned long *size, char *dest, INT64 time_stamp); - int (*show_frame)(codec_ptr , YV12_BUFFER_CONFIG *dest, int deblock_level, int noise_level, int flags); - void (*Remove)(codec_ptr *comp); - interface_ptr(*get_interface)(unsigned int id); - -} core_codec; - -typedef struct -{ - int (*set_bitrate)(codec_ptr, END_USAGE usage, int Datarate); - int (*get_bitrate)(codec_ptr, END_USAGE *usage, int *Datarate); - int (*set_mode)(codec_ptr, MODE mode, int Speed, char *File); - int (*get_mode)(codec_ptr, MODE *mode, int *Speed, char **File); -} codec_settings_basic; - -typedef struct -{ - int (*set_bitrate)(codec_ptr, END_USAGE usage, int Datarate); - int (*get_bitrate)(codec_ptr, END_USAGE *usage, int *Datarate); - int (*set_mode)(codec_ptr, MODE mode, int Speed, char *File); - int (*get_mode)(codec_ptr, MODE *mode, int *Speed, char **File); - int (*set_denoise)(codec_ptr, int Level); - int (*get_denoise)(codec_ptr, int *Level); - int (*set_sharpness)(codec_ptr, int sharpness); - int (*get_sharpness)(codec_ptr, int *sharpness); - int (*set_keyframing)(codec_ptr, int Auto, int max_distance); - int (*get_keyframing)(codec_ptr, int *Auto, int *max_distance); - int (*set_buffering)(codec_ptr, int buffer_level, int max_buffer_level); - int (*get_buffering)(codec_ptr, int *buffer_level, int *max_buffer_level); - int (*set_adjust_frame_rate)(codec_ptr, int Allowed, int at_buffer_level_pct); - int (*get_adjust_frame_rate)(codec_ptr, int *Allowed, int *at_buffer_level_pct); - int (*set_adjust_frame_size)(codec_ptr, int Allowed, int down_at_buffer_level_pct, int up_at_buffer_level_pct); - int (*get_adjust_frame_size)(codec_ptr, int *Allowed, int *down_at_buffer_level_pct, int *up_at_buffer_level_pct); - int (*set_adjust_quality)(codec_ptr, int Allowed, int min_quantizer, int max_quantizer); - int (*get_adjust_quality)(codec_ptr, int *Allowed, int *min_quantizer, int *max_quantizer); - int (*set_vbrparms)(codec_ptr, int Bias, int Min, int Max); - int (*get_vbrparms)(codec_ptr, int *Bias, int *Min, int *Max); - -} codec_settings_v1; - -typedef struct -{ - int (*request_recovery)(codec_ptr); - int (*request_droppable)(codec_ptr); - int (*internal_size)(codec_ptr, VPX_SCALING Vertical, VPX_SCALING Horizontal); - int (*update_last)(codec_ptr); - int (*update_gold)(codec_ptr); - int (*use_only_last)(codec_ptr); - int (*use_only_gold)(codec_ptr); - int (*update_entropy)(codec_ptr); - -} codec_realtime_requests; diff --git a/vp8/common/vfwsetting.hpp b/vp8/common/vfwsetting.hpp deleted file mode 100644 index 44869ecc7..000000000 --- a/vp8/common/vfwsetting.hpp +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright (c) 2010 The WebM project authors. All Rights Reserved. - * - * Use of this source code is governed by a BSD-style license - * that can be found in the LICENSE file in the root of the source - * tree. An additional intellectual property rights grant can be found - * in the file PATENTS. All contributing project authors may - * be found in the AUTHORS file in the root of the source tree. - */ - - -#if !defined(VFWSETTING_HPP) -#define VFWSETTING_HPP -//______________________________________________________________________________ -// -// VFWSetting.hpp -// - -#include "four_cc.hpp" -#include - -namespace vpxvp -{ - - //-------------------------------------- - class VFWSetting - { - friend std::ostream& operator<<(std::ostream& os, const VFWSetting& vfws); - - public: - - enum Mode - { - m_setting, - m_config - }; - - enum - { - header_size = 8, - Size = 16 - }; - - VFWSetting(four_cc fcc); - ~VFWSetting(); - - four_cc fcc() const; - Mode mode() const; - - int setting() const; - int value() const; - void setting_value(int i_setting, int i_value); // Sets mode to m_setting - - long size() const; - const void* data() const; - int data(const void* p_data, unsigned long ul_size); - - private: - - VFWSetting(const VFWSetting& vfws); // Not implemented - VFWSetting& operator=(const VFWSetting& vfws); // Not implemented - - int extract_(const void* p_data, unsigned long ul_size); - void update_() const; - - four_cc m_fcc; - Mode m_mode; - int m_i_setting; - int m_i_value; - - mutable unsigned char m_p_data[Size]; - }; - -} // namespace vpxvp - -#endif // VFWSETTING_HPP diff --git a/vp8/common/vpx_ref_build_prefix.h b/vp8/common/vpx_ref_build_prefix.h deleted file mode 100644 index a2fce65dc..000000000 --- a/vp8/common/vpx_ref_build_prefix.h +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (c) 2010 The WebM project authors. All Rights Reserved. - * - * Use of this source code is governed by a BSD-style license - * that can be found in the LICENSE file in the root of the source - * tree. An additional intellectual property rights grant can be found - * in the file PATENTS. All contributing project authors may - * be found in the AUTHORS file in the root of the source tree. - */ - - -#ifndef _VPX_REF_BUILD_PREFIX_h -#define _VPX_REF_BUILD_PREFIX_h - -#if defined(__cplusplus) -extern "C" { -#endif - - -#if defined(__cplusplus) -} -#endif - -#endif /* include guards */ diff --git a/vp8/common/vpxblit.h b/vp8/common/vpxblit.h deleted file mode 100644 index a95d90574..000000000 --- a/vp8/common/vpxblit.h +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Copyright (c) 2010 The WebM project authors. All Rights Reserved. - * - * Use of this source code is governed by a BSD-style license - * that can be found in the LICENSE file in the root of the source - * tree. An additional intellectual property rights grant can be found - * in the file PATENTS. All contributing project authors may - * be found in the AUTHORS file in the root of the source tree. - */ - - -#ifndef VPXBLIT_H_INCL -#define VPXBLIT_H_INCL -/*============================================================================== - Includes -==============================================================================*/ - -/*============================================================================== - Defines -==============================================================================*/ - - -#ifdef VPX_BIG_ENDIAN -#define BYTE_ZERO(X) ((X & 0xFF000000) >> (24 - 2) ) -#define BYTE_ONE(X) ((X & 0x00FF0000) >> (16 - 2) ) -#define BYTE_TWO(X) ((X & 0x0000FF00) >> (8 - 2) ) -#define BYTE_THREE(X) ((X & 0x000000FF) << (0 + 2) ) - -#define BYTE_ZERO_UV(X) ((X & 0x0000FF00) >> (8 - 2) ) -#define BYTE_ONE_UV(X) ((X & 0x000000FF) << (0 + 2) ) - -#define REREFERENCE(X) (*((int *) &(X))) - -#else - -#define BYTE_THREE(X) ((X & 0xFF000000) >> (24 - 2) ) -#define BYTE_TWO(X) ((X & 0x00FF0000) >> (16 - 2) ) -#define BYTE_ONE(X) ((X & 0x0000FF00) >> (8 - 2) ) -#define BYTE_ZERO(X) ((X & 0x000000FF) << (0 + 2) ) - -#define BYTE_ONE_UV(X) ((X & 0x0000FF00) >> (8 - 2) ) -#define BYTE_ZERO_UV(X) ((X & 0x000000FF) << (0 + 2) ) - -#define REREFERENCE(X) (*((int *) &(X))) - -#endif - - -/*============================================================================== - Type Definitions -==============================================================================*/ -typedef struct // YUV buffer configuration structure -{ - int y_width; - int y_height; - int y_stride; - - int uv_width; - int uv_height; - int uv_stride; - - char *y_buffer; - char *u_buffer; - char *v_buffer; - - char *uv_start; - int uv_dst_area; - int uv_used_area; - -} VPX_BLIT_CONFIG; - -typedef struct tx86_params -{ - unsigned int pushed_registers[6]; - unsigned int return_address; - unsigned int dst; - unsigned int scrn_pitch; - VPX_BLIT_CONFIG *buff_config; -} x86_params; - -/*============================================================================= - Enums -==============================================================================*/ - - -/*============================================================================== - Structures -==============================================================================*/ - -/*============================================================================== - Constants -==============================================================================*/ - - -/*============================================================================== - Variables -==============================================================================*/ - - - - -/*============================================================================== - Function Protoypes/MICROS -==============================================================================*/ -int vpx_get_size_of_pixel(unsigned int bd); -void *vpx_get_blitter(unsigned int bd); -void vpx_set_blit(void); -void vpx_destroy_blit(void); - - - -#endif //VPXBLIT_H_INCL diff --git a/vp8/common/vpxblit_c64.h b/vp8/common/vpxblit_c64.h deleted file mode 100644 index 4ee617f6c..000000000 --- a/vp8/common/vpxblit_c64.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (c) 2010 The WebM project authors. All Rights Reserved. - * - * Use of this source code is governed by a BSD-style license - * that can be found in the LICENSE file in the root of the source - * tree. An additional intellectual property rights grant can be found - * in the file PATENTS. All contributing project authors may - * be found in the AUTHORS file in the root of the source tree. - */ - - -#ifndef _VPX_BLIT_C64_h -#define _VPX_BLIT_C64_h - -/**************************************************************************** -* Typedefs -****************************************************************************/ - -typedef struct // YUV buffer configuration structure -{ - int y_width; - int y_height; - int y_stride; - - int uv_width; - int uv_height; - int uv_stride; - - unsigned char *y_buffer; - unsigned char *u_buffer; - unsigned char *v_buffer; - - unsigned char *y_ptr_scrn; - unsigned char *u_ptr_scrn; - unsigned char *v_ptr_scrn; - -} DXV_YUV_BUFFER_CONFIG; - -typedef struct -{ - unsigned char *rgbptr_scrn; - unsigned char *y_ptr_scrn; - unsigned char *u_ptr_scrn; - unsigned char *v_ptr_scrn; - unsigned char *rgbptr_scrn2; -} DXV_FINAL_VIDEO; - -#endif /* include guards */ diff --git a/vp8/common/vpxerrors.h b/vp8/common/vpxerrors.h deleted file mode 100644 index b70f29673..000000000 --- a/vp8/common/vpxerrors.h +++ /dev/null @@ -1,13 +0,0 @@ -/* - * Copyright (c) 2010 The WebM project authors. All Rights Reserved. - * - * Use of this source code is governed by a BSD-style license - * that can be found in the LICENSE file in the root of the source - * tree. An additional intellectual property rights grant can be found - * in the file PATENTS. All contributing project authors may - * be found in the AUTHORS file in the root of the source tree. - */ - - - -#define ALLOC_FAILURE -2 diff --git a/vp8/decoder/x86/onyxdxv.c b/vp8/decoder/x86/onyxdxv.c deleted file mode 100644 index ed38e2b9a..000000000 --- a/vp8/decoder/x86/onyxdxv.c +++ /dev/null @@ -1,1080 +0,0 @@ -/* - * Copyright (c) 2010 The WebM project authors. All Rights Reserved. - * - * Use of this source code is governed by a BSD-style license - * that can be found in the LICENSE file in the root of the source - * tree. An additional intellectual property rights grant can be found - * in the file PATENTS. All contributing project authors may - * be found in the AUTHORS file in the root of the source tree. - */ - - -/**************************************************************************** -* -* Module Title : onyxdxv.c -* -* Description : VP80 interface to DXV. -* -***************************************************************************** -*/ -/**************************************************************************** -* Header Files -****************************************************************************/ -#include // For Abs() -#include "vp8/common/pragmas.h" - -#include "vpxdxv.h" -#include "vpxdxv_plugin.h" - -#include "vp8/decoder/onyxd_int.h" -#include "vp8/common/onyx.h" -#include "vp8/common/codec_common_interface.h" -#include "vpx_scale/vpxscale.h" -#include "vpx_mem/vpx_mem.h" -#include "vp8/common/postproc.h" -#include "vp8/common/vpxblit.h" -#include "vp8/common/g_common.h" -#include "vpx_scale/yv12extend.h" - -#include -#include -#include "scale_mode.h" -#include "onyx_pb_interface.h" - -/**************************************************************************** -* Macros -****************************************************************************/ - -#define VP8_FOURCC DXL_MKFOURCC( 'V', 'P', '8', '0') - -extern void vp8_blit_text(const char *msg, unsigned char *address, const int pitch); - - -/**************************************************************************** -* Typedefs -****************************************************************************/ - -typedef struct // YUV buffer configuration structure -{ - int y_width; - int y_height; - int y_stride; - - int uv_width; - int uv_height; - int uv_stride; - - char *y_buffer; - char *u_buffer; - char *v_buffer; - - char *uv_start; - int uv_dst_area; - int uv_used_area; - - unsigned char *y_ptr_scrn; - unsigned char *u_ptr_scrn; - unsigned char *v_ptr_scrn; - - -} DXV_YUV_BUFFER_CONFIG; - - -typedef void ((*vp8blit_func)(unsigned char *, int, YUV_BUFFER_CONFIG *)); - -/* define an x_image structure based on the core x_image struct */ -typedef struct t_ximage_codec -{ - DXV_YUV_BUFFER_CONFIG frame_buffer; - VP8D_COMP *my_pbi; - VP8_COMMON *common; - int owned; - int decompressed_once; - - int sizeof_pixel; - vp8blit_func blitter; - - unsigned int ppl_tag; - unsigned int bd_tag; - unsigned int *supported_output_format_list; - - int cpu_free; - int postproc; - int add_noise; - int deinterlace; - - int post_proc2time; - int post_proc4time; - - int hs; - int hr; - int vs; - int vr; - YV12_BUFFER_CONFIG this_buffer; - YV12_BUFFER_CONFIG scaled_buffer; - YV12_BUFFER_CONFIG *passed_in_buffer; - - int avgq; - int ppcount; - - -} VP8_XIMAGE, *VP8_XIMAGE_HANDLE; - - -/**************************************************************************** -* Modul Statics -****************************************************************************/ -static unsigned int g_vp8_preferred_output_format_list[] = -{ - VPXDXV_YUY2, - VPXDXV_UYVY, - VPXDXV_RGB8888, - VPXDXV_RGB888, - VPXDXV_RGB555, - VPXDXV_RGB565, - VPXDXV_YV12, - VPXDXV_I420, - -// VPXDXV_YV12, -// VPXDXV_YUY2, -// VPXDXV_RGB565, -// VPXDXV_UYVY, - 0 -}; - -/**************************************************************************** -* Forward declarationss -****************************************************************************/ -void onyx_set_parameter(XIMAGE_HANDLE src, int Command, unsigned int Parameter); - -static int onyx_get_output_format(XIMAGE_HANDLE src, unsigned int *bd_tag); -static int onyx_set_output_format(XIMAGE_HANDLE src, unsigned int bd_tag); - -static int vpx_get_size_of_pixel(unsigned int bd); - -/**************************************************************************** -* Imports -****************************************************************************/ - -#define __Clamp255(x) (unsigned char) ( (x) < 0 ? 0 : ( (x) <= 255 ? (x) : 255 ) ) - -/* -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -*/ -/* -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -*/ -void -convert_yv12_buffer_types(YV12_BUFFER_CONFIG *source, DXV_YUV_BUFFER_CONFIG *dest) -{ - dest->y_buffer = (char *)source->y_buffer; - dest->u_buffer = (char *)source->u_buffer; - dest->v_buffer = (char *)source->v_buffer; - dest->y_width = source->y_width; - dest->y_height = source->y_height; - dest->y_stride = source->y_stride; - dest->uv_width = source->uv_width; - dest->uv_height = source->uv_height; - dest->uv_stride = source->uv_stride; -} - -/* -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -*/ - - -int onyx_blit -( - XIMAGE_HANDLE src, - VSCREEN_HANDLE v_screen, - DXV_YUV_BUFFER_CONFIG *frame_buffer, - int x, - int y -) -{ - VP8_XIMAGE_HANDLE tab = (VP8_XIMAGE_HANDLE)vpxdxv_get_algorithm_base_ptr(src); - VP8D_COMP *pbi; - VP8_COMMON *common = tab->common; - pbi = tab->my_pbi; - - if (v_screen) /* if there is a v_screen, blit to it */ - { - unsigned char *ptr_scrn; - int this_pitch, vs_height, vs_width; - unsigned int start_tick, stop_tick; - - vpxdxv_get_vscreen_attributes(v_screen, (void **)&ptr_scrn, &vs_width, &vs_height, &this_pitch); - - if (ptr_scrn) - { - int w, h; - - int p_size; - int view_x, view_y, view_w; - int hs, hr, vs, vr; - int neww, newh; - int cw, ch; - int microseconds_available = (int)(1000000 / 30); - - microseconds_available = microseconds_available * tab->cpu_free / 100; - - if (pbi) - { - microseconds_available -= pbi->decode_microseconds; - - if (tab->cpu_free == 0) - microseconds_available = INT_MAX; - - if (tab->post_proc2time == 0) - tab->post_proc2time = pbi->decode_microseconds * 1 / 2; - - if (tab->post_proc4time == 0) - tab->post_proc4time = pbi->decode_microseconds; - } - - - if (tab->ppcount == 0) - { - tab->post_proc2time = 0; - tab->post_proc4time = 0; - tab->ppcount = 64; - } - else - { - tab->ppcount --; - } - - vpxdxv_get_vscreen_view(v_screen, &view_x, &view_y, &view_w, NULL); - - Scale2Ratio(common->horiz_scale, &hr, &hs); - Scale2Ratio(common->vert_scale, &vr, &vs); - - if (tab->postproc && tab->passed_in_buffer == 0) - { - int show_text = 0; - - unsigned char message[512]; - - int pp = tab->postproc; - int q = (tab->avgq + 4) / 8; - int noise = 0; - - vp8_clear_system_state(); - - if (pp >= 1000) - { - pp -= 1000; - noise = pp / 100; - pp = pp - noise * 100; - } - - if (pp >= 300) - { - pp -= 300; - show_text = 3; - } - else if (pp >= 200) - { - pp -= 200; - show_text = 2; - } - else if (pp >= 100) - { - pp -= 100; - show_text = 1; - } - - if (pbi && (pbi->mb.segmentation_enabled & SEGMENT_PF) && tab->deinterlace) - { - de_interlace(common->frame_to_show->y_buffer, common->post_proc_buffer.y_buffer, - common->post_proc_buffer.y_width, common->post_proc_buffer.y_height, - common->post_proc_buffer.y_stride); - - de_interlace(common->frame_to_show->u_buffer, common->post_proc_buffer.u_buffer, - common->post_proc_buffer.uv_width, common->post_proc_buffer.uv_height, - common->post_proc_buffer.uv_stride); - de_interlace(common->frame_to_show->v_buffer, common->post_proc_buffer.v_buffer, - common->post_proc_buffer.uv_width, common->post_proc_buffer.uv_height, - common->post_proc_buffer.uv_stride); - } - else - { - if (pp >= 10 && pp <= 20) - { - q = q + (pp - 15) * 10; - - if (q < 0) - q = 0; - } - - start_tick = vp8_get_high_res_timer_tick(); - - if (pp > 3 && tab->post_proc4time < microseconds_available) - { - vp8_deblock_and_de_macro_block(common->frame_to_show, &common->post_proc_buffer, q, 1, 0); - - stop_tick = vp8_get_high_res_timer_tick(); - - if (pbi) - tab->post_proc4time = vp8_get_time_in_micro_sec(start_tick, stop_tick); - } - - else if (pp > 0 && tab->post_proc2time < microseconds_available) - { - vp8_deblock(common->frame_to_show, &common->post_proc_buffer, q , 1, 0); - stop_tick = vp8_get_high_res_timer_tick(); - - if (pbi) - tab->post_proc2time = vp8_get_time_in_micro_sec(start_tick, stop_tick); - } - else - { - vp8_yv12_copy_frame(common->frame_to_show, &common->post_proc_buffer); - } - - } - - vp8_clear_system_state(); - - if (tab->add_noise == 1) - { - - vp8_plane_add_noise(common->post_proc_buffer.y_buffer, - common->post_proc_buffer.y_width, common->post_proc_buffer.y_height, - common->post_proc_buffer.y_stride, 63 - q, noise); - } - - - if (show_text == 1) - { -#ifdef PACKET_TESTING - { - VP8_HEADER *oh2 = (VP8_HEADER *) pbi->Source; - sprintf(message, "%8d %d%d%d%d%d size:%d\n", - oh2->frame_number , - oh2->update_gold , - oh2->update_last , - oh2->uses_gold , - oh2->uses_last , - oh2->type, - vpxdxv_get_ximage_csize(src)); - } -#else - sprintf(message, "F:%1ldG:%1ldQ:%3ldF:%3ld,%3ldP:%d_s:%6ld,N:%d,", - (common->frame_type == KEY_FRAME), - common->refresh_golden_frame, - common->base_qindex, - common->filter_level, - q, - tab->postproc, - vpxdxv_get_ximage_csize(src), noise); -#endif - - vp8_blit_text(message, common->post_proc_buffer.y_buffer, common->post_proc_buffer.y_stride); - - } - else if (show_text == 2) - { - int i, j; - unsigned char *y_ptr; - YV12_BUFFER_CONFIG *post = &common->post_proc_buffer; - int mb_rows = post->y_height >> 4; - int mb_cols = post->y_width >> 4; - int mb_index = 0; - MODE_INFO *mi = common->mi; - - y_ptr = post->y_buffer + 4 * post->y_stride + 4; - - // vp8_filter each macro block - for (i = 0; i < mb_rows; i++) - { - for (j = 0; j < mb_cols; j++) - { - char zz[4]; - - if (pp == 4) - sprintf(zz, "%c", mi[mb_index].mbmi.mode + 'a'); - else - sprintf(zz, "%c", mi[mb_index].mbmi.ref_frame + 'a'); - - vp8_blit_text(zz, y_ptr, post->y_stride); - mb_index ++; - y_ptr += 16; - } - - mb_index ++; //border - y_ptr += post->y_stride * 16 - post->y_width; - - } - } - else if (show_text == 3) - { - int i, j; - unsigned char *y_ptr; - YV12_BUFFER_CONFIG *post = &common->post_proc_buffer; - int mb_rows = post->y_height >> 4; - int mb_cols = post->y_width >> 4; - int mb_index = 0; - MODE_INFO *mi = common->mi; - - y_ptr = post->y_buffer + 4 * post->y_stride + 4; - - // vp8_filter each macro block - for (i = 0; i < mb_rows; i++) - { - for (j = 0; j < mb_cols; j++) - { - char zz[4]; - - if (j == 0) - sprintf(zz, "%c", '0' + i % 10); - else - sprintf(zz, "%c", '0' + j % 10); - - vp8_blit_text(zz, y_ptr, post->y_stride); - mb_index ++; - y_ptr += 16; - } - - y_ptr += post->y_stride * 16 - post->y_width; - - } - } - - vpx_memcpy(&tab->this_buffer, &common->post_proc_buffer, sizeof(YV12_BUFFER_CONFIG)); - } - else - { - vpx_memcpy(&tab->this_buffer, common->frame_to_show, sizeof(YV12_BUFFER_CONFIG)); - } - - - /* get a frame pointer to the scaled and postprocessed reconstructed buffer */ - if (tab->passed_in_buffer == 0) - { - if (common->horiz_scale != NORMAL || common->vert_scale != NORMAL) - { - neww = hs * tab->this_buffer.y_width / hr; - newh = vs * tab->this_buffer.y_height / vr; - - neww += neww & 1; - - if (tab->hs != hs || tab->hr != hr || tab->vs != vs || tab->vr != vr) - { - vp8_yv12_alloc_frame_buffer(&tab->scaled_buffer, neww, newh , 8); - } - - vp8_yv12_scale_or_center(&tab->this_buffer, - &tab->scaled_buffer, - neww, newh, SCALE_TO_FIT, hs, hr, vs, vr); - - convert_yv12_buffer_types(&tab->scaled_buffer, frame_buffer); - - cw = hs * common->Width / hr; - ch = vs * common->Height / vr; - - } - else - { - convert_yv12_buffer_types(&tab->this_buffer, frame_buffer); - - cw = common->Width; - ch = common->Height; - } - } - else - { - convert_yv12_buffer_types(tab->passed_in_buffer, frame_buffer); - cw = common->Width; - ch = common->Height; - tab->passed_in_buffer = 0; - } - - frame_buffer->y_width = cw; - frame_buffer->y_height = ch; - frame_buffer->uv_width = cw / 2; - frame_buffer->uv_height = ch / 2; - - p_size = vpx_get_size_of_pixel(tab->bd_tag); - - /* remember to offset if requested */ - y += view_y; - x += view_x ; - - /* for planar destinations */ - w = view_w; - h = vs_height; - - if (w < frame_buffer->y_width) - { - frame_buffer->y_width = w; - frame_buffer->uv_width = (w + 1) / 2; - } - - if (h < frame_buffer->y_height) - { - frame_buffer->y_height = h; - frame_buffer->uv_height = (h + 1) / 2; - } - - if (frame_buffer->y_width < view_w) - x += (view_w - frame_buffer->y_width) / 2; - - if (x & 1) - x -= 1; - - if (frame_buffer->y_height < vs_height) - y += (vs_height - frame_buffer->y_height) / 2; - - - ptr_scrn += (x * p_size) + (y * this_pitch); - - frame_buffer->y_stride *= -1; - frame_buffer->uv_stride *= -1; - - if (tab->bd_tag == VPXDXV_YV12 || tab->bd_tag == VPXDXV_I420) - { - if (this_pitch < 0) - { - frame_buffer->uv_start = (char *)(ptr_scrn + abs(this_pitch) + abs(this_pitch) * h / 4 + this_pitch / 2); - frame_buffer->uv_dst_area = abs((this_pitch * h) / 4); - frame_buffer->uv_used_area = 0; - } - else - { - frame_buffer->uv_start = (char *)(ptr_scrn + (this_pitch * h)); - frame_buffer->uv_dst_area = (((this_pitch + 1) / 2) * ((h + 1) / 2)); - frame_buffer->uv_used_area = (((this_pitch + 1) / 2) * frame_buffer->uv_height); - } - } - - if ((pbi->mb.segmentation_enabled & SEGMENT_PF) && (tab->bd_tag != VPXDXV_YV12 && tab->bd_tag != VPXDXV_I420)) - { - int ypitch = frame_buffer->y_stride; - int uvpitch = frame_buffer->uv_stride; - - frame_buffer->y_stride <<= 1; - frame_buffer->y_height >>= 1; - frame_buffer->uv_stride <<= 1; - frame_buffer->uv_height >>= 1; - - ptr_scrn += this_pitch; - frame_buffer->y_buffer -= ypitch; - frame_buffer->u_buffer -= uvpitch; - frame_buffer->v_buffer -= uvpitch; - tab->blitter(ptr_scrn, 2 * this_pitch, (YUV_BUFFER_CONFIG *)(&tab->frame_buffer)); - - ptr_scrn -= this_pitch; - frame_buffer->y_buffer += ypitch; - frame_buffer->u_buffer += uvpitch; - frame_buffer->v_buffer += uvpitch; - tab->blitter(ptr_scrn, 2 * this_pitch, (YUV_BUFFER_CONFIG *)(&tab->frame_buffer)); - - } - else - { - /* blit the screen */ - tab->blitter(ptr_scrn, this_pitch, (YUV_BUFFER_CONFIG *)(&tab->frame_buffer)); - vpx_log("Decoder: Frame shown \n"); - } - - } - else - vpx_log("Decoder: Frame not shown scrn pointer 0\n"); - } - else - vpx_log("Decoder: Frame not shown vscreen 0\n"); - - return DXV_OK; -} -/**************************************************************************** - * - * ROUTINE : onyx_decompress - * - * INPUTS : None - * - * OUTPUTS : None - * - * RETURNS : None. - * - * FUNCTION : - * - * SPECIAL NOTES : - * - ****************************************************************************/ -static -int onyx_decompress(XIMAGE_HANDLE src, VSCREEN_HANDLE v_screen) -{ - VP8_XIMAGE_HANDLE this_algorithm_base = (VP8_XIMAGE_HANDLE)vpxdxv_get_algorithm_base_ptr(src); - unsigned char *c_addr; - unsigned int c_size; - int w, h, x, y; - int vp8_rv; - - c_addr = vpxdxv_get_ximage_cdata_addr(src); - c_size = vpxdxv_get_ximage_csize(src); - vpxdxv_get_ximage_xywh(src, &x, &y, &w, &h); - - // if we have a compressed frame decompress it ( otherwise we'll just redo - // the scaling and postprocessing from the last frame ) - if (c_addr) - { - if (c_size != 0) - { - int flags; - int ret_val; - - int f; - - // decode the frame - ret_val = vp8d_decompress_frame((VP8D_PTR) this_algorithm_base->my_pbi, - c_size, - (char *) c_addr, - &this_algorithm_base->this_buffer, - &flags); - - - f = this_algorithm_base->my_pbi->common.filter_level * 10 / 6; - - if (this_algorithm_base->my_pbi->common.frame_type == KEY_FRAME) - this_algorithm_base->avgq = 8 * f; - else - this_algorithm_base->avgq = this_algorithm_base->avgq * 7 / 8 + f; - - - - if (ret_val != 0) - { - if (ret_val == -1) - return DXV_VERSION_CONFLICT; - else - return DXV_BAD_DATA; - } - - } - } - - - vp8_rv = onyx_blit(src, v_screen, &this_algorithm_base->frame_buffer, x, y); - - - return vp8_rv; -} -/* -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -*/ -static -int vp8_ximagedestroy(XIMAGE_HANDLE src) -{ - VP8_XIMAGE_HANDLE this_algorithm_base = (VP8_XIMAGE_HANDLE)vpxdxv_get_algorithm_base_ptr(src); - - if (this_algorithm_base) - { - - vp8_yv12_de_alloc_frame_buffer(&this_algorithm_base->scaled_buffer); - - /* safety check in case stopdecode was not called */ - if (this_algorithm_base->owned) - vp8dx_remove_decompressor((VP8D_PTR)(this_algorithm_base->my_pbi)); - - duck_free(this_algorithm_base); - } - - return DXV_OK; -} -/* -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -*/ -static int -onyx_get_post_proc(XIMAGE_HANDLE src, unsigned int *ppl) -{ - VP8_XIMAGE_HANDLE this_algorithm_base = (VP8_XIMAGE_HANDLE)vpxdxv_get_algorithm_base_ptr(src); - - if (this_algorithm_base) - { - *ppl = this_algorithm_base->ppl_tag; - - return DXV_OK; - } - - return DXV_NULL_BASE; -} -/* -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -*/ -static int -onyx_set_post_proc(XIMAGE_HANDLE src, unsigned int ppl) -{ - VP8_XIMAGE_HANDLE this_algorithm_base = (VP8_XIMAGE_HANDLE)vpxdxv_get_algorithm_base_ptr(src); - - if (this_algorithm_base) - { - this_algorithm_base->ppl_tag = ppl; - - return DXV_OK; - } - - return DXV_NULL_BASE; -} -/* -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -*/ -static -int vp8_ximagestop_decode(XIMAGE_HANDLE src) -{ - VP8_XIMAGE_HANDLE this_algorithm_base = (VP8_XIMAGE_HANDLE)vpxdxv_get_algorithm_base_ptr(src); - - if (this_algorithm_base) - { - - vp8_yv12_de_alloc_frame_buffer(&this_algorithm_base->scaled_buffer); - - if (this_algorithm_base->owned) - vp8dx_remove_decompressor((VP8D_PTR)(this_algorithm_base->my_pbi)); - - this_algorithm_base->owned = 0; - } - - return DXV_OK; -} - - -/* -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -*/ -static -int vp8_ximagestart_decode -( - XIMAGE_HANDLE src -) -{ - VP8_XIMAGE_HANDLE this_algorithm_base = (VP8_XIMAGE_HANDLE)vpxdxv_get_algorithm_base_ptr(src); - XIMAGE_INFO_PTR xinfo = vpxdxv_get_ximage_info(src); - VP8D_CONFIG ocf; - - if (xinfo) - { - ocf.Width = xinfo->width; - ocf.Height = xinfo->height; - } - - if (this_algorithm_base->common == 0) - { - this_algorithm_base->my_pbi = (VP8D_COMP *) vp8dx_create_decompressor(&ocf); - this_algorithm_base->owned = 1; - this_algorithm_base->common = &this_algorithm_base->my_pbi->common; - this_algorithm_base->avgq = 0; - - } - - this_algorithm_base->passed_in_buffer = 0; - this_algorithm_base->post_proc2time = 0; - this_algorithm_base->post_proc4time = 0; - this_algorithm_base->ppcount = 64; - - return DXV_OK; -} -/* -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -*/ -static -DXV_HANDLE vp8_ximagecreate(XIMAGE_HANDLE src) -{ - VP8_XIMAGE_HANDLE this_algorithm_base; - - /* create a new algorithm base container */ - this_algorithm_base = (VP8_XIMAGE_HANDLE)duck_calloc(1, sizeof(VP8_XIMAGE), DMEM_GENERAL); - - if (this_algorithm_base == NULL) - return NULL; - - vp8_scale_machine_specific_config(); - - vpxdxv_register_ximage_start_decode(src, vp8_ximagestart_decode); - - vpxdxv_register_ximage_stop_decode(src, vp8_ximagestop_decode); - - vpxdxv_register_ximage_destroy(src, vp8_ximagedestroy); - - vpxdxv_register_ximage_dx(src, onyx_decompress); - - vpxdxv_register_ximage_set_parameter(src, onyx_set_parameter); - - vpxdxv_register_ximage_output_format_func(src, - onyx_get_output_format, - onyx_set_output_format); - - vpxdxv_register_ximage_post_proc_level_func(src, - onyx_get_post_proc, - onyx_set_post_proc); - - return (DXV_HANDLE)this_algorithm_base; -} - -/* -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -*/ - -static int store_output_list(unsigned int supported, int count, - unsigned int *outlist) -{ - int i = 0, j = 0, - ret = DXV_OK; - - while (i < count) - { - while (supported && !(supported & 0x01)) - { - supported >>= 1; - ++j; - } - - *(outlist + i) = g_vp8_preferred_output_format_list[j]; - ++i; - ++j; - supported >>= 1; - } - - - return ret; -} - -/* -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -*/ -static int onyx_get_output_list(XIMAGE_INFO_PTR xinfo, unsigned int *outlist, - unsigned int *size) -{ - int i, - ret = DXV_INVALID_REQUEST; - unsigned int supported = 0, - count = 0; - (void)xinfo; - - if (size) - { - for (i = 0; i < sizeof(g_vp8_preferred_output_format_list) / sizeof(unsigned int) && i < 32; ++i) - { - if (vpx_get_blitter(g_vp8_preferred_output_format_list[i]) != (void *)0xffffffff) - { - supported |= (1 << i); - ++count; - } - } - - if (outlist) - { - if (count && ((count + 1) == (*size / sizeof(int)))) - ret = store_output_list(supported, count, outlist); - else - *outlist = 0; - } - else - { - *size = (count + 1) * sizeof(int); - ret = DXV_OK; - } - } - - return ret; -} - -/* -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -*/ -int onyx_init(void) -{ - int vp8_rv; - - /* register VPX blitters based on cpu */ - vpx_set_blit(); - - vp8_rv = vpxdxv_register_ximage(vp8_ximagecreate, onyx_get_output_list, VP8_FOURCC); - return vp8_rv; - - return DXV_OK; -} -/* -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -*/ -int onyx_exit(void) -{ - - vpxdxv_un_register_ximage(VP8_FOURCC); - - return DXV_OK; -} -/**************************************************************************** - * - * ROUTINE : onyx_set_parameter - * - * INPUTS : XIMAGE_HANDLE src : - * int Command : - * unsigned long Parameter : - * - * OUTPUTS : None. - * - * RETURNS : void - * - * FUNCTION : - * - * - * SPECIAL NOTES : None. - * - ****************************************************************************/ -void onyx_set_parameter(XIMAGE_HANDLE src, int Command, unsigned int Parameter) -{ - VP8_XIMAGE_HANDLE this_algorithm_base = (VP8_XIMAGE_HANDLE)vpxdxv_get_algorithm_base_ptr(src); - - switch (Command) - { - case PBC_SET_CPUFREE: - this_algorithm_base->cpu_free = Parameter; - break; - case PBC_SET_POSTPROC: - this_algorithm_base->postproc = Parameter; - break; - - case PBC_SET_BLITBUFF: - this_algorithm_base->passed_in_buffer = (YV12_BUFFER_CONFIG *) Parameter; - break; - - case PBC_SET_REFERENCEFRAME: - { - VP8_XIMAGE_HANDLE tab = (VP8_XIMAGE_HANDLE)vpxdxv_get_algorithm_base_ptr(src); - VP8D_COMP *pbi; - pbi = tab->my_pbi; - vp8_yv12_copy_frame((YV12_BUFFER_CONFIG *) Parameter, &pbi->common.last_frame); - } - break; - - case PBC_SET_COMMON: - - if (Parameter) - { - this_algorithm_base->common = (VP8_COMMON *)Parameter; - } - - break; - case PBC_SET_ADDNOISE: - this_algorithm_base->add_noise = Parameter; - break; - case PBC_SET_DEINTERLACEMODE: - this_algorithm_base->deinterlace = Parameter; - break; - - } -} -/* -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -*/ -static int -onyx_get_output_format(XIMAGE_HANDLE src, unsigned int *format_tag) -{ - VP8_XIMAGE_HANDLE this_algorithm_base = (VP8_XIMAGE_HANDLE)vpxdxv_get_algorithm_base_ptr(src); - - if (this_algorithm_base) - { - *format_tag = this_algorithm_base->bd_tag; - return DXV_OK; - } - - return DXV_NULL_BASE; -} - -/* -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -*/ -static int -onyx_set_output_format(XIMAGE_HANDLE src, unsigned int bd_tag) -{ - VP8_XIMAGE_HANDLE this_algorithm_base = (VP8_XIMAGE_HANDLE)vpxdxv_get_algorithm_base_ptr(src); - int i; - unsigned int bd_tag_found; - - if (this_algorithm_base) - { - i = 0; - bd_tag_found = 0; - - while (g_vp8_preferred_output_format_list[i] != 0) - { - if (g_vp8_preferred_output_format_list[i] == bd_tag) - { - bd_tag_found = 1; - break; - } - - i++; - } - - if (bd_tag_found) - { - this_algorithm_base->blitter = (vp8blit_func)vpx_get_blitter(bd_tag); - this_algorithm_base->bd_tag = bd_tag; - return DXV_OK; - } - - return DXV_INVALID_BLIT; - } - - return DXV_NULL_BASE; -} - -/* -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -*/ -int -vpx_get_size_of_pixel(unsigned int bd) -{ - int vp8_rv; - - switch (bd) - { - case VPXDXV_YV12: - case VPXDXV_I420: - vp8_rv = 1; - break; - -#ifdef _ENABLE_SPLIT_PIXEL_ - case VPXDXV_SPLIT565: -#endif - case VPXDXV_RGB555: - case VPXDXV_RGB565: - case VPXDXV_YUY2: - case VPXDXV_UYVY: - case VPXDXV_YVYU: - vp8_rv = 2; - break; - - case VPXDXV_RGB888: - vp8_rv = 3; - break; - - case VPXDXV_RGB8888: - vp8_rv = 4; - break; - - default: - vp8_rv = -1; - break; - } - - return vp8_rv; -} diff --git a/vp8/encoder/onyx_if.c b/vp8/encoder/onyx_if.c index f47258d8c..f7c2c4aea 100644 --- a/vp8/encoder/onyx_if.c +++ b/vp8/encoder/onyx_if.c @@ -29,7 +29,6 @@ #include "vp8/common/swapyv12buffer.h" #include "vp8/common/threading.h" #include "vpx_ports/vpx_timer.h" -#include "vp8/common/vpxerrors.h" #include "temporal_filter.h" #if ARCH_ARM #include "vpx_ports/arm.h" @@ -1305,7 +1304,7 @@ static int vp8_alloc_partition_data(VP8_COMP *cpi) (cpi->common.mb_rows + 1), sizeof(PARTITION_INFO)); if(!cpi->mb.pip) - return ALLOC_FAILURE; + return 1; cpi->mb.pi = cpi->mb.pip + cpi->common.mode_info_stride + 1; diff --git a/vp8/encoder/temporal_filter.c b/vp8/encoder/temporal_filter.c index 9ff8887e5..0f8e654a0 100644 --- a/vp8/encoder/temporal_filter.c +++ b/vp8/encoder/temporal_filter.c @@ -29,7 +29,6 @@ #include "vp8/common/swapyv12buffer.h" #include "vp8/common/threading.h" #include "vpx_ports/vpx_timer.h" -#include "vp8/common/vpxerrors.h" #include #include diff --git a/vp8/vp8_common.mk b/vp8/vp8_common.mk index 56e266087..4daadee32 100644 --- a/vp8/vp8_common.mk +++ b/vp8/vp8_common.mk @@ -11,7 +11,6 @@ VP8_COMMON_SRCS-yes += vp8_common.mk VP8_COMMON_SRCS-yes += common/type_aliases.h VP8_COMMON_SRCS-yes += common/pragmas.h -VP8_COMMON_SRCS-yes += common/vpxerrors.h VP8_COMMON_SRCS-yes += common/ppflags.h VP8_COMMON_SRCS-yes += common/onyx.h VP8_COMMON_SRCS-yes += common/onyxd.h diff --git a/vpx_mem/intel_linux/vpx_mem.c b/vpx_mem/intel_linux/vpx_mem.c deleted file mode 100644 index 00150acd5..000000000 --- a/vpx_mem/intel_linux/vpx_mem.c +++ /dev/null @@ -1,951 +0,0 @@ -/* - * Copyright (c) 2010 The WebM project authors. All Rights Reserved. - * - * Use of this source code is governed by a BSD-style license - * that can be found in the LICENSE file in the root of the source - * tree. An additional intellectual property rights grant can be found - * in the file PATENTS. All contributing project authors may - * be found in the AUTHORS file in the root of the source tree. - */ - - -#define __VPX_MEM_C__ - -#include "vpx_mem.h" -#include -#include -#include - -#ifndef CONFIG_MEM_MANAGER -# if defined(VXWORKS) -# define CONFIG_MEM_MANAGER 1 //include heap manager functionality, -//default: enabled on vxworks -# else -# define CONFIG_MEM_MANAGER 0 //include heap manager functionality -# endif -#endif - -#ifndef CONFIG_MEM_TRACKER -# define CONFIG_MEM_TRACKER 1 //include xvpx_* calls in the lib -#endif - -#ifndef CONFIG_MEM_CHECKS -# define CONFIG_MEM_CHECKS 0 //include some basic safety checks in -//vpx_memcpy, _memset, and _memmove -#endif - -#ifndef USE_GLOBAL_FUNCTION_POINTERS -# define USE_GLOBAL_FUNCTION_POINTERS 0 //use function pointers instead of compiled functions. -#endif - -#if CONFIG_MEM_TRACKER -# include "vpx_mem_tracker.h" -# if VPX_MEM_TRACKER_VERSION_CHIEF != 2 || VPX_MEM_TRACKER_VERSION_MAJOR != 5 -# error "vpx_mem requires memory tracker version 2.5 to track memory usage" -# endif -#endif - -#define ADDRESS_STORAGE_SIZE sizeof(size_t) - -#ifndef DEFAULT_ALIGNMENT -# if defined(VXWORKS) -# define DEFAULT_ALIGNMENT 32 //default addr alignment to use in -//calls to vpx_* functions other -//than vpx_memalign -# else -# define DEFAULT_ALIGNMENT 1 -# endif -#endif - -#if DEFAULT_ALIGNMENT < 1 -# error "DEFAULT_ALIGNMENT must be >= 1!" -#endif - -#if CONFIG_MEM_TRACKER -# define TRY_BOUNDS_CHECK 1 //when set to 1 pads each allocation, -//integrity can be checked using -//vpx_memory_tracker_check_integrity -//or on free by defining -//TRY_BOUNDS_CHECK_ON_FREE -static unsigned long g_alloc_count = 0; - -#else -# define TRY_BOUNDS_CHECK 0 -#endif - -#if TRY_BOUNDS_CHECK -# define TRY_BOUNDS_CHECK_ON_FREE 0 //checks mem integrity on every -//free, very expensive -# define BOUNDS_CHECK_VALUE 0xdeadbeef //value stored before/after ea. -//mem addr for bounds checking -# define BOUNDS_CHECK_PAD_SIZE 32 //size of the padding before and -//after ea allocation to be filled -//with BOUNDS_CHECK_VALUE. -//this should be a multiple of 4 -#else -# define BOUNDS_CHECK_VALUE 0 -# define BOUNDS_CHECK_PAD_SIZE 0 -#endif - -#if CONFIG_MEM_MANAGER -# include "heapmm.h" -# include "hmm_intrnl.h" - -# define SHIFT_HMM_ADDR_ALIGN_UNIT 5 -# define TOTAL_MEMORY_TO_ALLOCATE 20971520 // 20 * 1024 * 1024 - -# define MM_DYNAMIC_MEMORY 1 -# if MM_DYNAMIC_MEMORY -static unsigned char *g_p_mng_memory_raw = NULL; -static unsigned char *g_p_mng_memory = NULL; -# else -static unsigned char g_p_mng_memory[TOTAL_MEMORY_TO_ALLOCATE]; -# endif - -static size_t g_mm_memory_size = TOTAL_MEMORY_TO_ALLOCATE; - -static hmm_descriptor hmm_d; -static int g_mng_memory_allocated = 0; - -static int vpx_mm_create_heap_memory(); -static void *vpx_mm_realloc(void *memblk, size_t size); -#endif //CONFIG_MEM_MANAGER - -#if USE_GLOBAL_FUNCTION_POINTERS - -struct GLOBAL_FUNC_POINTERS -{ - g_malloc_func g_malloc; - g_calloc_func g_calloc; - g_realloc_func g_realloc; - g_free_func g_free; - g_memcpy_func g_memcpy; - g_memset_func g_memset; - g_memmove_func g_memmove; -}; -struct GLOBAL_FUNC_POINTERS *g_func = 0; - -# define VPX_MALLOC_L g_func->g_malloc -# define VPX_REALLOC_L g_func->g_realloc -# define VPX_FREE_L g_func->g_free -# define VPX_MEMCPY_L g_func->g_memcpy -# define VPX_MEMSET_L g_func->g_memset -# define VPX_MEMMOVE_L g_func->g_memmove - -#else -# define VPX_MALLOC_L malloc -# define VPX_REALLOC_L realloc -# define VPX_FREE_L free -# define VPX_MEMCPY_L memcpy -# define VPX_MEMSET_L memset -# define VPX_MEMMOVE_L memmove -#endif // USE_GLOBAL_FUNCTION_POINTERS - -/* Should probably use a vpx_mem logger function. */ -#define __REMOVE_PRINTFS -#ifdef __REMOVE_PRINTFS -#define _P(x) -#else -#define _P(x) x -#endif - -/*returns an addr aligned to the byte boundary specified by align*/ -#define align_addr(addr,align) \ - (void*)(((size_t)(addr) + ((align) - 1)) & (size_t)-(align)) - -unsigned int vpx_mem_get_version() -{ - unsigned int ver = ((unsigned int)(unsigned char)VPX_MEM_VERSION_CHIEF << 24 | - (unsigned int)(unsigned char)VPX_MEM_VERSION_MAJOR << 16 | - (unsigned int)(unsigned char)VPX_MEM_VERSION_MINOR << 8 | - (unsigned int)(unsigned char)VPX_MEM_VERSION_PATCH); - return ver; -} - -int vpx_mem_set_heap_size(size_t size) -{ - int ret = -1; - -#if CONFIG_MEM_MANAGER -#if MM_DYNAMIC_MEMORY - - if (!g_mng_memory_allocated && size) - { - g_mm_memory_size = size; - ret = 0; - } - else - ret = -3; - -#else - ret = -2; -#endif -#else - (void)size; -#endif - - return ret; -} - -void *vpx_memalign(size_t align, size_t size) -{ - void *addr, - * x = NULL; - -#if CONFIG_MEM_MANAGER - int number_aau; - - if (vpx_mm_create_heap_memory() < 0) - { - _P(printf("[vpx][mm] ERROR vpx_memalign() Couldn't create memory for Heap.\n");) - } - - number_aau = ((size + align - 1 + ADDRESS_STORAGE_SIZE) >> - SHIFT_HMM_ADDR_ALIGN_UNIT) + 1; - - addr = hmm_alloc(&hmm_d, number_aau); -#else - addr = VPX_MALLOC_L(size + align - 1 + ADDRESS_STORAGE_SIZE); -#endif //CONFIG_MEM_MANAGER - - if (addr) - { - x = align_addr((unsigned char *)addr + ADDRESS_STORAGE_SIZE, (int)align); - /* save the actual malloc address */ - ((size_t *)x)[-1] = (size_t)addr; - } - - return x; -} - -void *vpx_malloc(size_t size) -{ - return vpx_memalign(DEFAULT_ALIGNMENT, size); -} - -void *vpx_calloc(size_t num, size_t size) -{ - void *x; - - x = vpx_memalign(DEFAULT_ALIGNMENT, num * size); - - if (x) - VPX_MEMSET_L(x, 0, num * size); - - return x; -} - -void *vpx_realloc(void *memblk, size_t size) -{ - void *addr, - * new_addr = NULL; - int align = DEFAULT_ALIGNMENT; - - /* - The realloc() function changes the size of the object pointed to by - ptr to the size specified by size, and returns a pointer to the - possibly moved block. The contents are unchanged up to the lesser - of the new and old sizes. If ptr is null, realloc() behaves like - malloc() for the specified size. If size is zero (0) and ptr is - not a null pointer, the object pointed to is freed. - */ - if (!memblk) - new_addr = vpx_malloc(size); - else if (!size) - vpx_free(memblk); - else - { - addr = (void *)(((size_t *)memblk)[-1]); - memblk = NULL; - -#if CONFIG_MEM_MANAGER - new_addr = vpx_mm_realloc(addr, size + align + ADDRESS_STORAGE_SIZE); -#else - new_addr = VPX_REALLOC_L(addr, size + align + ADDRESS_STORAGE_SIZE); -#endif - - if (new_addr) - { - addr = new_addr; - new_addr = (void *)(((size_t) - ((unsigned char *)new_addr + ADDRESS_STORAGE_SIZE) + (align - 1)) & - (size_t) - align); - /* save the actual malloc address */ - ((size_t *)new_addr)[-1] = (size_t)addr; - } - } - - return new_addr; -} - -void vpx_free(void *memblk) -{ - if (memblk) - { - void *addr = (void *)(((size_t *)memblk)[-1]); -#if CONFIG_MEM_MANAGER - hmm_free(&hmm_d, addr); -#else - VPX_FREE_L(addr); -#endif - } -} - -void *vpx_mem_alloc(int id, size_t size, size_t align) -{ -#if defined CHIP_DM642 || defined __uClinux__ - void *mem = (void *)mem_alloc(id, size, align); - - if (!mem) - { - _P(fprintf(stderr, - "\n" - "*********************************************************\n" - "WARNING: mem_alloc returned 0 for id=%p size=%u align=%u.\n" - "*********************************************************\n", - mem, size, align)); - // should no longer need this. Softier says it's fixed. 2005-01-21 tjf - //#if defined __uClinux__ - //while(1)usleep(1000000); - //#endif - } - -#if defined __uClinux__ - else if (mem == (void *)0xFFFFFFFF) - { - // out of memory/error - mem = (void *)0; - - _P(fprintf(stderr, - "\n" - "******************************************************\n" - "ERROR: mem_alloc id=%p size=%u align=%u OUT OF MEMORY.\n" - "******************************************************\n", - mem, size, align)); - } - -#endif // __uClinux__ - - return mem; -#else - (void)id; - (void)size; - (void)align; - return (void *)0; -#endif -} - -void vpx_mem_free(int id, void *mem, size_t size) -{ -#if defined CHIP_DM642 || defined __uClinux__ - - if (!mem) - { - _P(fprintf(stderr, - "\n" - "**************************************\n" - "WARNING: 0 being free'd id=%p size=%u.\n" - "**************************************\n", - id, size)); - - // should no longer need this. Softier says it's fixed. 2005-01-21 tjf - //#if defined __uClinux__ - //while(1)usleep(1000000); - //#endif - } - - mem_free(id, mem, size); -#else - (void)id; - (void)mem; - (void)size; -#endif -} - - -#if CONFIG_MEM_TRACKER - -void *xvpx_mem_alloc(int id, size_t size, size_t align, char *file, int line) -{ - void *mem = vpx_mem_alloc(id, size, align); - - vpx_memory_tracker_add((size_t)mem, size, file, line, 0); - - return mem; -} - -void xvpx_mem_free(int id, void *mem, size_t size, char *file, int line) -{ - if (vpx_memory_tracker_remove((size_t)mem) == -2) - { -#if REMOVE_PRINTFS - (void)file; - (void)line; -#endif - _P(fprintf(stderr, "[vpx_mem][xvpx_mem_free] addr: %p (id=%p size=%u) " - "not found in list; freed from file:%s" - " line:%d\n", mem, id, size, file, line)); - } - - vpx_mem_free(id, mem, size); -} - -void *xvpx_memalign(size_t align, size_t size, char *file, int line) -{ -#if TRY_BOUNDS_CHECK - unsigned char *x_bounds; -#endif - - void *x; - - if (g_alloc_count == 0) - { -#if TRY_BOUNDS_CHECK - int i_rv = vpx_memory_tracker_init(BOUNDS_CHECK_PAD_SIZE, BOUNDS_CHECK_VALUE); -#else - int i_rv = vpx_memory_tracker_init(0, 0); -#endif - - if (i_rv < 0) - { - _P(printf("ERROR xvpx_malloc MEM_TRACK_USAGE error vpx_memory_tracker_init().\n");) - } - } - -#if TRY_BOUNDS_CHECK - { - int i; - unsigned int tempme = BOUNDS_CHECK_VALUE; - - x_bounds = vpx_memalign(align, size + (BOUNDS_CHECK_PAD_SIZE * 2)); - - if (x_bounds) - { - /*we're aligning the address twice here but to keep things - consistent we want to have the padding come before the stored - address so no matter what free function gets called we will - attempt to free the correct address*/ - x_bounds = (unsigned char *)(((size_t *)x_bounds)[-1]); - x = align_addr(x_bounds + BOUNDS_CHECK_PAD_SIZE + ADDRESS_STORAGE_SIZE, - (int)align); - /* save the actual malloc address */ - ((size_t *)x)[-1] = (size_t)x_bounds; - - for (i = 0; i < BOUNDS_CHECK_PAD_SIZE; i += sizeof(unsigned int)) - { - VPX_MEMCPY_L(x_bounds + i, &tempme, sizeof(unsigned int)); - VPX_MEMCPY_L((unsigned char *)x + size + i, - &tempme, sizeof(unsigned int)); - } - } - else - x = NULL; - } -#else - x = vpx_memalign(align, size); -#endif //TRY_BOUNDS_CHECK - - g_alloc_count++; - - vpx_memory_tracker_add((size_t)x, size, file, line, 1); - - return x; -} - -void *xvpx_malloc(size_t size, char *file, int line) -{ - return xvpx_memalign(DEFAULT_ALIGNMENT, size, file, line); -} - -void *xvpx_calloc(size_t num, size_t size, char *file, int line) -{ - void *x = xvpx_memalign(DEFAULT_ALIGNMENT, num * size, file, line); - - if (x) - VPX_MEMSET_L(x, 0, num * size); - - return x; -} - -void *xvpx_realloc(void *memblk, size_t size, char *file, int line) -{ - struct mem_block *p = NULL; - int orig_size = 0, - orig_line = 0; - char *orig_file = NULL; - -#if TRY_BOUNDS_CHECK - unsigned char *x_bounds = memblk ? - (unsigned char *)(((size_t *)memblk)[-1]) : - NULL; -#endif - - void *x; - - if (g_alloc_count == 0) - { -#if TRY_BOUNDS_CHECK - - if (!vpx_memory_tracker_init(BOUNDS_CHECK_PAD_SIZE, BOUNDS_CHECK_VALUE)) -#else - if (!vpx_memory_tracker_init(0, 0)) -#endif - { - _P(printf("ERROR xvpx_malloc MEM_TRACK_USAGE error vpx_memory_tracker_init().\n");) - } - } - - if (p = vpx_memory_tracker_find((size_t)memblk)) - { - orig_size = p->size; - orig_file = p->file; - orig_line = p->line; - } - -#if TRY_BOUNDS_CHECK_ON_FREE - vpx_memory_tracker_check_integrity(file, line); -#endif - - //have to do this regardless of success, because - //the memory that does get realloc'd may change - //the bounds values of this block - vpx_memory_tracker_remove((size_t)memblk); - -#if TRY_BOUNDS_CHECK - { - int i; - unsigned int tempme = BOUNDS_CHECK_VALUE; - - x_bounds = vpx_realloc(memblk, size + (BOUNDS_CHECK_PAD_SIZE * 2)); - - if (x_bounds) - { - x_bounds = (unsigned char *)(((size_t *)x_bounds)[-1]); - x = align_addr(x_bounds + BOUNDS_CHECK_PAD_SIZE + ADDRESS_STORAGE_SIZE, - (int)DEFAULT_ALIGNMENT); - /* save the actual malloc address */ - ((size_t *)x)[-1] = (size_t)x_bounds; - - for (i = 0; i < BOUNDS_CHECK_PAD_SIZE; i += sizeof(unsigned int)) - { - VPX_MEMCPY_L(x_bounds + i, &tempme, sizeof(unsigned int)); - VPX_MEMCPY_L((unsigned char *)x + size + i, - &tempme, sizeof(unsigned int)); - } - } - else - x = NULL; - } -#else - x = vpx_realloc(memblk, size); -#endif //TRY_BOUNDS_CHECK - - if (x) - vpx_memory_tracker_add((size_t)x, size, file, line, 1); - else - vpx_memory_tracker_add((size_t)memblk, orig_size, orig_file, orig_line, 1); - - return x; -} - -void xvpx_free(void *p_address, char *file, int line) -{ -#if TRY_BOUNDS_CHECK - unsigned char *p_bounds_address = (unsigned char *)p_address; - //p_bounds_address -= BOUNDS_CHECK_PAD_SIZE; -#endif - -#if !TRY_BOUNDS_CHECK_ON_FREE - (void)file; - (void)line; -#endif - - if (p_address) - { -#if TRY_BOUNDS_CHECK_ON_FREE - vpx_memory_tracker_check_integrity(file, line); -#endif - - //if the addr isn't found in the list, assume it was allocated via - //vpx_ calls not xvpx_, therefore it does not contain any padding - if (vpx_memory_tracker_remove((size_t)p_address) == -2) - { - p_bounds_address = p_address; - _P(fprintf(stderr, "[vpx_mem][xvpx_free] addr: %p not found in" - " list; freed from file:%s" - " line:%d\n", p_address, file, line)); - } - else - --g_alloc_count; - -#if TRY_BOUNDS_CHECK - vpx_free(p_bounds_address); -#else - vpx_free(p_address); -#endif - - if (!g_alloc_count) - vpx_memory_tracker_destroy(); - } -} - -#endif /*CONFIG_MEM_TRACKER*/ - -#if CONFIG_MEM_CHECKS -#if defined(VXWORKS) -#include //for task_delay() -/* This function is only used to get a stack trace of the player -object so we can se where we are having a problem. */ -static int get_my_tt(int task) -{ - tt(task); - - return 0; -} - -static void vx_sleep(int msec) -{ - int ticks_to_sleep = 0; - - if (msec) - { - int msec_per_tick = 1000 / sys_clk_rate_get(); - - if (msec < msec_per_tick) - ticks_to_sleep++; - else - ticks_to_sleep = msec / msec_per_tick; - } - - task_delay(ticks_to_sleep); -} -#endif -#endif - -void *vpx_memcpy(void *dest, const void *source, size_t length) -{ -#if CONFIG_MEM_CHECKS - - if (((int)dest < 0x4000) || ((int)source < 0x4000)) - { - _P(printf("WARNING: vpx_memcpy dest:0x%x source:0x%x len:%d\n", (int)dest, (int)source, length);) - -#if defined(VXWORKS) - sp(get_my_tt, task_id_self(), 0, 0, 0, 0, 0, 0, 0, 0); - - vx_sleep(10000); -#endif - } - -#endif - - return VPX_MEMCPY_L(dest, source, length); -} - -void *vpx_memset(void *dest, int val, size_t length) -{ -#if CONFIG_MEM_CHECKS - - if ((int)dest < 0x4000) - { - _P(printf("WARNING: vpx_memset dest:0x%x val:%d len:%d\n", (int)dest, val, length);) - -#if defined(VXWORKS) - sp(get_my_tt, task_id_self(), 0, 0, 0, 0, 0, 0, 0, 0); - - vx_sleep(10000); -#endif - } - -#endif - - return VPX_MEMSET_L(dest, val, length); -} - -void *vpx_memmove(void *dest, const void *src, size_t count) -{ -#if CONFIG_MEM_CHECKS - - if (((int)dest < 0x4000) || ((int)src < 0x4000)) - { - _P(printf("WARNING: vpx_memmove dest:0x%x src:0x%x count:%d\n", (int)dest, (int)src, count);) - -#if defined(VXWORKS) - sp(get_my_tt, task_id_self(), 0, 0, 0, 0, 0, 0, 0, 0); - - vx_sleep(10000); -#endif - } - -#endif - - return VPX_MEMMOVE_L(dest, src, count); -} - -#if CONFIG_MEM_MANAGER - -static int vpx_mm_create_heap_memory() -{ - int i_rv = 0; - - if (!g_mng_memory_allocated) - { -#if MM_DYNAMIC_MEMORY - g_p_mng_memory_raw = - (unsigned char *)malloc(g_mm_memory_size + HMM_ADDR_ALIGN_UNIT); - - if (g_p_mng_memory_raw) - { - g_p_mng_memory = (unsigned char *)((((unsigned int)g_p_mng_memory_raw) + - HMM_ADDR_ALIGN_UNIT - 1) & - -(int)HMM_ADDR_ALIGN_UNIT); - - _P(printf("[vpx][mm] total memory size:%d g_p_mng_memory_raw:0x%x g_p_mng_memory:0x%x\n" - , g_mm_memory_size + HMM_ADDR_ALIGN_UNIT - , (unsigned int)g_p_mng_memory_raw - , (unsigned int)g_p_mng_memory);) - } - else - { - _P(printf("[vpx][mm] Couldn't allocate memory:%d for vpx memory manager.\n" - , g_mm_memory_size);) - - i_rv = -1; - } - - if (g_p_mng_memory) -#endif - { - int chunk_size = 0; - - g_mng_memory_allocated = 1; - - hmm_init(&hmm_d); - - chunk_size = g_mm_memory_size >> SHIFT_HMM_ADDR_ALIGN_UNIT; - - chunk_size -= DUMMY_END_BLOCK_BAUS; - - _P(printf("[vpx][mm] memory size:%d for vpx memory manager. g_p_mng_memory:0x%x chunk_size:%d\n" - , g_mm_memory_size - , (unsigned int)g_p_mng_memory - , chunk_size);) - - hmm_new_chunk(&hmm_d, (void *)g_p_mng_memory, chunk_size); - } - -#if MM_DYNAMIC_MEMORY - else - { - _P(printf("[vpx][mm] Couldn't allocate memory:%d for vpx memory manager.\n" - , g_mm_memory_size);) - - i_rv = -1; - } - -#endif - } - - return i_rv; -} - -static void *vpx_mm_realloc(void *memblk, size_t size) -{ - void *p_ret = NULL; - - if (vpx_mm_create_heap_memory() < 0) - { - _P(printf("[vpx][mm] ERROR vpx_mm_realloc() Couldn't create memory for Heap.\n");) - } - else - { - int i_rv = 0; - int old_num_aaus; - int new_num_aaus; - - old_num_aaus = hmm_true_size(memblk); - new_num_aaus = (size >> SHIFT_HMM_ADDR_ALIGN_UNIT) + 1; - - if (old_num_aaus == new_num_aaus) - { - p_ret = memblk; - } - else - { - i_rv = hmm_resize(&hmm_d, memblk, new_num_aaus); - - if (i_rv == 0) - { - p_ret = memblk; - } - else - { - /* Error. Try to malloc and then copy data. */ - void *p_from_malloc; - - new_num_aaus = (size >> SHIFT_HMM_ADDR_ALIGN_UNIT) + 1; - p_from_malloc = hmm_alloc(&hmm_d, new_num_aaus); - - if (p_from_malloc) - { - vpx_memcpy(p_from_malloc, memblk, size); - hmm_free(&hmm_d, memblk); - - p_ret = p_from_malloc; - } - } - } - } - - return p_ret; -} -#endif //CONFIG_MEM_MANAGER - -#if USE_GLOBAL_FUNCTION_POINTERS -# if CONFIG_MEM_TRACKER -extern int vpx_memory_tracker_set_functions(g_malloc_func g_malloc_l - , g_calloc_func g_calloc_l - , g_realloc_func g_realloc_l - , g_free_func g_free_l - , g_memcpy_func g_memcpy_l - , g_memset_func g_memset_l - , g_memmove_func g_memmove_l); -# endif -#endif -int vpx_mem_set_functions(g_malloc_func g_malloc_l - , g_calloc_func g_calloc_l - , g_realloc_func g_realloc_l - , g_free_func g_free_l - , g_memcpy_func g_memcpy_l - , g_memset_func g_memset_l - , g_memmove_func g_memmove_l) -{ -#if USE_GLOBAL_FUNCTION_POINTERS - - /* If use global functions is turned on then the - application must set the global functions before - it does anything else or vpx_mem will have - unpredictable results. */ - if (!g_func) - { - g_func = (struct GLOBAL_FUNC_POINTERS *)g_malloc_l(sizeof(struct GLOBAL_FUNC_POINTERS)); - - if (!g_func) - { - return -1; - } - } - -#if CONFIG_MEM_TRACKER - { - int rv = 0; - rv = vpx_memory_tracker_set_functions(g_malloc_l - , g_calloc_l - , g_realloc_l - , g_free_l - , g_memcpy_l - , g_memset_l - , g_memmove_l); - - if (rv < 0) - { - return rv; - } - } -#endif - - if (g_malloc_l) - g_func->g_malloc = g_malloc_l; - else - g_func->g_malloc = 0; - - if (g_calloc_l) - g_func->g_calloc = g_calloc_l; - else - g_func->g_calloc = 0; - - if (g_realloc_l) - g_func->g_realloc = g_realloc_l; - else - g_func->g_realloc = 0; - - if (g_free_l) - g_func->g_free = g_free_l; - else - g_func->g_free = 0; - - if (g_memcpy_l) - g_func->g_memcpy = g_memcpy_l; - else - g_func->g_memcpy = 0; - - if (g_memset_l) - g_func->g_memset = g_memset_l; - else - g_func->g_memset = 0; - - if (g_memmove_l) - g_func->g_memmove = g_memmove_l; - else - g_func->g_memmove = 0; - - return 0; -#else - (void)g_malloc_l; - (void)g_calloc_l; - (void)g_realloc_l; - (void)g_free_l; - (void)g_memcpy_l; - (void)g_memset_l; - (void)g_memmove_l; - return -1; -#endif -} - -int vpx_mem_unset_functions() -{ -#if USE_GLOBAL_FUNCTION_POINTERS - - if (g_func) - { - g_free_func temp_free; - - temp_free = g_func->g_free; - - temp_free(g_func); - g_func = 0; - } - -#endif - return 0; -} - -#ifdef _INTEL_LINUX -void *_intel_fast_memcpy(void *dest, const void *src, size_t count) -{ - - //memcpy(dest, src, count); - char *dst8 = (char *)dest; - char *src8 = (char *)src; - - while (count--) - { - *dst8++ = *src8++; - } - - return dest; -} - -void *_intel_fast_memset(void *dest, int c, size_t count) -{ - memset(dest, c, count); - return dest; -} - -void *_VEC_memzero(void *dest, int c, size_t count) -{ - memset(dest, 0, count); - return dest; -} - -#endif //_ICC diff --git a/vpx_mem/intel_linux/vpx_mem_tracker.c b/vpx_mem/intel_linux/vpx_mem_tracker.c deleted file mode 100644 index 5bed4b50d..000000000 --- a/vpx_mem/intel_linux/vpx_mem_tracker.c +++ /dev/null @@ -1,812 +0,0 @@ -/* - * Copyright (c) 2010 The WebM project authors. All Rights Reserved. - * - * Use of this source code is governed by a BSD-style license - * that can be found in the LICENSE file in the root of the source - * tree. An additional intellectual property rights grant can be found - * in the file PATENTS. All contributing project authors may - * be found in the AUTHORS file in the root of the source tree. - */ - - -/* - vpx_mem_tracker.c - - jwz 2003-09-30: - Stores a list of addreses, their size, and file and line they came from. - All exposed lib functions are prefaced by vpx_ and allow the global list - to be thread safe. - Current supported platforms are: - Linux, Win32, win_ce and vx_works - Further support can be added by defining the platform specific mutex - in the memory_tracker struct as well as calls to create/destroy/lock/unlock - the mutex in vpx_memory_tracker_init/Destroy and memory_tracker_lock_mutex/unlock_mutex -*/ - -#define NO_MUTEX - -#if defined(__uClinux__) -# include -#endif - -#if defined(LINUX) || defined(__uClinux__) -# include -#elif defined(WIN32) || defined(_WIN32_WCE) -# define WIN32_LEAN_AND_MEAN -# include -# include -#elif defined(VXWORKS) -# include -#elif defined(NDS_NITRO) -# include -# include -#endif - -#include -#include -#include //VXWORKS doesn't have a malloc/memory.h file, -//this should pull in malloc,free,etc. -#include - -#include "vpx_mem_tracker.h" - -#undef vpx_malloc //undefine any vpx_mem macros that may affect calls to -#undef vpx_free //memory functions in this file -#undef vpx_memcpy -#undef vpx_memset - - -#ifndef USE_GLOBAL_FUNCTION_POINTERS -# define USE_GLOBAL_FUNCTION_POINTERS 0 //use function pointers instead of compiled functions. -#endif - -#if USE_GLOBAL_FUNCTION_POINTERS -static mem_track_malloc_func g_malloc = malloc; -static mem_track_calloc_func g_calloc = calloc; -static mem_track_realloc_func g_realloc = realloc; -static mem_track_free_func g_free = free; -static mem_track_memcpy_func g_memcpy = memcpy; -static mem_track_memset_func g_memset = memset; -static mem_track_memmove_func g_memmove = memmove; -# define MEM_TRACK_MALLOC g_malloc -# define MEM_TRACK_FREE g_free -# define MEM_TRACK_MEMCPY g_memcpy -# define MEM_TRACK_MEMSET g_memset -#else -# define MEM_TRACK_MALLOC vpx_malloc -# define MEM_TRACK_FREE vpx_free -# define MEM_TRACK_MEMCPY vpx_memcpy -# define MEM_TRACK_MEMSET vpx_memset -#endif // USE_GLOBAL_FUNCTION_POINTERS - - -struct memory_tracker -{ - struct mem_block *head, - * tail; - int len, - totalsize; - unsigned int current_allocated, - max_allocated; - -#if defined(LINUX) || defined(__uClinux__) - pthread_mutex_t mutex; -#elif defined(WIN32) || defined(_WIN32_WCE) - HANDLE mutex; -#elif defined(VXWORKS) - SEM_ID mutex; -#elif defined(NDS_NITRO) - OSMutex mutex; -#elif defined(NO_MUTEX) -#else -#error "No mutex type defined for this platform!" -#endif - - int padding_size, - pad_value; -}; - -/* prototypes for internal library functions */ -static void memtrack_log(const char *fmt, ...); -static void memory_tracker_dump(); -static void memory_tracker_check_integrity(char *file, unsigned int line); -static void memory_tracker_add(size_t addr, unsigned int size, - char *file, unsigned int line, - int padded); -static int memory_tracker_remove(size_t addr); -static struct mem_block *memory_tracker_find(size_t addr); - -#if defined(NO_MUTEX) -# define memory_tracker_lock_mutex() (!g_b_mem_tracker_inited) -# define memory_tracker_unlock_mutex() -#else -static int memory_tracker_lock_mutex(); -static int memory_tracker_unlock_mutex(); -#endif - -static struct memory_tracker memtrack; //our global memory allocation list -static int g_b_mem_tracker_inited = 0; //indicates whether the global list has -//been initialized (1:yes/0:no) -static struct -{ - FILE *file; - int type; - void (*func)(void *userdata, const char *fmt, va_list args); - void *userdata; -} g_logging = {0}; - -extern void *vpx_malloc(size_t size); -extern void vpx_free(void *memblk); -extern void *vpx_memcpy(void *dest, const void *src, size_t length); -extern void *vpx_memset(void *dest, int val, size_t length); - -/* - * - * Exposed library functions - * -*/ - -/* - vpx_memory_tracker_init(int padding_size, int pad_value) - padding_size - the size of the padding before and after each mem addr. - Values > 0 indicate that integrity checks can be performed - by inspecting these areas. - pad_value - the initial value within the padding area before and after - each mem addr. - - Initializes global memory tracker structure - Allocates the head of the list -*/ -int vpx_memory_tracker_init(int padding_size, int pad_value) -{ - if (!g_b_mem_tracker_inited) - { - if (memtrack.head = (struct mem_block *)MEM_TRACK_MALLOC(sizeof(struct mem_block))) - { - int ret; - - MEM_TRACK_MEMSET(memtrack.head, 0, sizeof(struct mem_block)); - - memtrack.tail = memtrack.head; - - memtrack.current_allocated = 0; - memtrack.max_allocated = 0; - - memtrack.padding_size = padding_size; - memtrack.pad_value = pad_value; - -#if defined(LINUX) || defined(__uClinux__) - ret = pthread_mutex_init(&memtrack.mutex, - NULL); /*mutex attributes (NULL=default)*/ -#elif defined(WIN32) || defined(_WIN32_WCE) - memtrack.mutex = create_mutex(NULL, /*security attributes*/ - FALSE, /*we don't want initial ownership*/ - NULL); /*mutex name*/ - ret = !memtrack.mutex; -#elif defined(VXWORKS) - memtrack.mutex = sem_bcreate(SEM_Q_FIFO, /*SEM_Q_FIFO non-priority based mutex*/ - SEM_FULL); /*SEM_FULL initial state is unlocked*/ - ret = !memtrack.mutex; -#elif defined(NDS_NITRO) - os_init_mutex(&memtrack.mutex); - ret = 0; -#elif defined(NO_MUTEX) - ret = 0; -#endif - - if (ret) - { - memtrack_log("vpx_memory_tracker_init: Error creating mutex!\n"); - - MEM_TRACK_FREE(memtrack.head); - memtrack.head = NULL; - } - else - { - memtrack_log("Memory Tracker init'd, v."vpx_mem_tracker_version" pad_size:%d pad_val:0x%x %d\n" - , padding_size - , pad_value - , pad_value); - g_b_mem_tracker_inited = 1; - } - } - } - - return g_b_mem_tracker_inited; -} - -/* - vpx_memory_tracker_destroy() - If our global struct was initialized zeros out all its members, - frees memory and destroys it's mutex -*/ -void vpx_memory_tracker_destroy() -{ - - if (!memory_tracker_lock_mutex()) - { - struct mem_block *p = memtrack.head, - * p2 = memtrack.head; - - memory_tracker_dump(); - - while (p) - { - p2 = p; - p = p->next; - - MEM_TRACK_FREE(p2); - } - - memtrack.head = NULL; - memtrack.tail = NULL; - memtrack.len = 0; - memtrack.current_allocated = 0; - memtrack.max_allocated = 0; - - if ((g_logging.type == 0) && (g_logging.file != 0)) //&& (g_logging.file != stderr) ) - { -#if !defined(NDS_NITRO) - fclose(g_logging.file); -#endif - g_logging.file = NULL; - } - - memory_tracker_unlock_mutex(); - - g_b_mem_tracker_inited = 0; - - } - -} - -/* - vpx_memory_tracker_add(size_t addr, unsigned int size, - char * file, unsigned int line) - addr - memory address to be added to list - size - size of addr - file - the file addr was referenced from - line - the line in file addr was referenced from - Adds memory address addr, it's size, file and line it came from - to the global list via the thread safe internal library function -*/ -void vpx_memory_tracker_add(size_t addr, unsigned int size, - char *file, unsigned int line, - int padded) -{ - memory_tracker_add(addr, size, file, line, padded); -} - -/* - vpx_memory_tracker_remove(size_t addr) - addr - memory address to be removed from list - Removes addr from the global list via the thread safe - internal remove function - Return: - Same as described for memory_tracker_remove -*/ -int vpx_memory_tracker_remove(size_t addr) -{ - return memory_tracker_remove(addr); -} - -/* - vpx_memory_tracker_find(size_t addr) - addr - address to be found in list - Return: - If found, pointer to the memory block that matches addr - NULL otherwise -*/ -struct mem_block *vpx_memory_tracker_find(size_t addr) -{ - struct mem_block *p = NULL; - - if (!memory_tracker_lock_mutex()) - { - p = memory_tracker_find(addr); - memory_tracker_unlock_mutex(); - } - - return p; -} - -/* - vpx_memory_tracker_dump() - Locks the memory tracker's mutex and calls the internal - library function to dump the current contents of the - global memory allocation list -*/ -void vpx_memory_tracker_dump() -{ - if (!memory_tracker_lock_mutex()) - { - memory_tracker_dump(); - memory_tracker_unlock_mutex(); - } -} - -/* - vpx_memory_tracker_check_integrity(char* file, unsigned int line) - file - The file name where the check was placed - line - The line in file where the check was placed - Locks the memory tracker's mutex and calls the internal - integrity check function to inspect every address in the global - memory allocation list -*/ -void vpx_memory_tracker_check_integrity(char *file, unsigned int line) -{ - if (!memory_tracker_lock_mutex()) - { - memory_tracker_check_integrity(file, line); - memory_tracker_unlock_mutex(); - } -} - -/* - vpx_memory_tracker_set_log_type - Sets the logging type for the memory tracker. Based on the value it will - direct its output to the appropriate place. - Return: - 0: on success - -1: if the logging type could not be set, because the value was invalid - or because a file could not be opened -*/ -int vpx_memory_tracker_set_log_type(int type, char *option) -{ - int ret = -1; - - - switch (type) - { - case 0: - g_logging.type = 0; - - if (!option) - { - // g_logging.file = stderr; - ret = 0; - } - -#if !defined(NDS_NITRO) - else - { - if (g_logging.file = fopen((char *)option, "w")) - ret = 0; - } - -#endif - break; -#if defined(WIN32) && !defined(_WIN32_WCE) - case 1: - g_logging.type = type; - ret = 0; - break; -#endif - default: - break; - } - - //output the version to the new logging destination - if (!ret) - memtrack_log("Memory Tracker logging initialized, " - "Memory Tracker v."vpx_mem_tracker_version"\n"); - - return ret; -} - -/* - vpx_memory_tracker_set_log_func - Sets a logging function to be used by the memory tracker. - Return: - 0: on success - -1: if the logging type could not be set because logfunc was NULL -*/ -int vpx_memory_tracker_set_log_func(void *userdata, - void(*logfunc)(void *userdata, - const char *fmt, va_list args)) -{ - int ret = -1; - - if (logfunc) - { - g_logging.type = -1; - g_logging.userdata = userdata; - g_logging.func = logfunc; - ret = 0; - } - - //output the version to the new logging destination - if (!ret) - memtrack_log("Memory Tracker logging initialized, " - "Memory Tracker v."vpx_mem_tracker_version"\n"); - - return ret; -} - -/* - * - * END - Exposed library functions - * -*/ - - -/* - * - * Internal library functions - * -*/ - -static void memtrack_log(const char *fmt, ...) -{ - va_list list; - - va_start(list, fmt); - - switch (g_logging.type) - { - case -1: - - if (g_logging.func) - g_logging.func(g_logging.userdata, fmt, list); - - break; - case 0: - - if (g_logging.file) - { - vfprintf(g_logging.file, fmt, list); - fflush(g_logging.file); - } - - break; -#if defined(WIN32) && !defined(_WIN32_WCE) - case 1: - { - char temp[1024]; - _vsnprintf(temp, sizeof(temp) / sizeof(char) - 1, fmt, list); - output_debug_string(temp); - } - break; -#endif - default: - break; - } - - va_end(list); -} - -/* - memory_tracker_dump() - Dumps the current contents of the global memory allocation list -*/ -static void memory_tracker_dump() -{ - int i = 0; - struct mem_block *p = (memtrack.head ? memtrack.head->next : NULL); - - memtrack_log("\n_currently Allocated= %d; Max allocated= %d\n", - memtrack.current_allocated, memtrack.max_allocated); - - while (p) - { -#if defined(WIN32) && !defined(_WIN32_WCE) - - /*when using outputdebugstring, output filenames so they - can be clicked to be opened in visual studio*/ - if (g_logging.type == 1) - memtrack_log("memblocks[%d].addr= 0x%.8x, memblocks[%d].size= %d, file:\n" - " %s(%d):\n", i, - p->addr, i, p->size, - p->file, p->line); - else -#endif - memtrack_log("memblocks[%d].addr= 0x%.8x, memblocks[%d].size= %d, file: %s, line: %d\n", i, - p->addr, i, p->size, - p->file, p->line); - - p = p->next; - ++i; - } - - memtrack_log("\n"); -} - -/* - memory_tracker_check_integrity(char* file, unsigned int file) - file - the file name where the check was placed - line - the line in file where the check was placed - If a padding_size was supplied to vpx_memory_tracker_init() - this function will check ea. addr in the list verifying that - addr-padding_size and addr+padding_size is filled with pad_value -*/ -static void memory_tracker_check_integrity(char *file, unsigned int line) -{ - if (memtrack.padding_size) - { - int i, - index = 0; - unsigned char *p_show_me, - * p_show_me2; - unsigned int tempme = memtrack.pad_value, - dead1, - dead2; - unsigned char *x_bounds; - struct mem_block *p = memtrack.head->next; - - while (p) - { - //x_bounds = (unsigned char*)p->addr; - //back up VPX_BYTE_ALIGNMENT - //x_bounds -= memtrack.padding_size; - - if (p->padded) // can the bounds be checked? - { - /*yes, move to the address that was actually allocated - by the vpx_* calls*/ - x_bounds = (unsigned char *)(((size_t *)p->addr)[-1]); - - for (i = 0; i < memtrack.padding_size; i += sizeof(unsigned int)) - { - p_show_me = (x_bounds + i); - p_show_me2 = (unsigned char *)(p->addr + p->size + i); - - MEM_TRACK_MEMCPY(&dead1, p_show_me, sizeof(unsigned int)); - MEM_TRACK_MEMCPY(&dead2, p_show_me2, sizeof(unsigned int)); - - if ((dead1 != tempme) || (dead2 != tempme)) - { - memtrack_log("\n[vpx_mem integrity check failed]:\n" - " index[%d] {%s:%d} addr=0x%x, size=%d," - " file: %s, line: %d c0:0x%x c1:0x%x\n", - index, file, line, p->addr, p->size, p->file, - p->line, dead1, dead2); - } - } - } - - ++index; - p = p->next; - } - } -} - -/* - memory_tracker_add(size_t addr, unsigned int size, - char * file, unsigned int line) - Adds an address (addr), it's size, file and line number to our list. - Adjusts the total bytes allocated and max bytes allocated if necessary. - If memory cannot be allocated the list will be destroyed. -*/ -void memory_tracker_add(size_t addr, unsigned int size, - char *file, unsigned int line, - int padded) -{ - if (!memory_tracker_lock_mutex()) - { - struct mem_block *p; - - p = MEM_TRACK_MALLOC(sizeof(struct mem_block)); - - if (p) - { - p->prev = memtrack.tail; - p->prev->next = p; - p->addr = addr; - p->size = size; - p->line = line; - p->file = file; - p->padded = padded; - p->next = NULL; - - memtrack.tail = p; - - memtrack.current_allocated += size; - - if (memtrack.current_allocated > memtrack.max_allocated) - memtrack.max_allocated = memtrack.current_allocated; - - //memtrack_log("memory_tracker_add: added addr=0x%.8x\n", addr); - - memory_tracker_unlock_mutex(); - } - else - { - memtrack_log("memory_tracker_add: error allocating memory!\n"); - memory_tracker_unlock_mutex(); - vpx_memory_tracker_destroy(); - } - } -} - -/* - memory_tracker_remove(size_t addr) - Removes an address and its corresponding size (if they exist) - from the memory tracker list and adjusts the current number - of bytes allocated. - Return: - 0: on success - -1: if the mutex could not be locked - -2: if the addr was not found in the list -*/ -int memory_tracker_remove(size_t addr) -{ - int ret = -1; - - if (!memory_tracker_lock_mutex()) - { - struct mem_block *p; - - if (p = memory_tracker_find(addr)) - { - memtrack.current_allocated -= p->size; - - p->prev->next = p->next; - - if (p->next) - p->next->prev = p->prev; - else - memtrack.tail = p->prev; - - ret = 0; - MEM_TRACK_FREE(p); - } - else - { - memtrack_log("memory_tracker_remove(): addr not found in list, 0x%.8x\n", addr); - ret = -2; - } - - memory_tracker_unlock_mutex(); - } - - return ret; -} - -/* - memory_tracker_find(size_t addr) - Finds an address in our addrs list - NOTE: the mutex MUST be locked in the other internal - functions before calling this one. This avoids - the need for repeated locking and unlocking as in Remove - Returns: pointer to the mem block if found, NULL otherwise -*/ -static struct mem_block *memory_tracker_find(size_t addr) -{ - struct mem_block *p = NULL; - - if (memtrack.head) - { - p = memtrack.head->next; - - while (p && (p->addr != addr)) - p = p->next; - } - - return p; -} - - -#if !defined(NO_MUTEX) -/* - memory_tracker_lock_mutex() - Locks the memory tracker mutex with a platform specific call - Returns: - 0: Success - <0: Failure, either the mutex was not initialized - or the call to lock the mutex failed -*/ -static int memory_tracker_lock_mutex() -{ - int ret = -1; - - if (g_b_mem_tracker_inited) - { - -#if defined(LINUX) || defined(__uClinux__) - ret = pthread_mutex_lock(&memtrack.mutex); -#elif defined(WIN32) || defined(_WIN32_WCE) - ret = WaitForSingleObject(memtrack.mutex, INFINITE); -#elif defined(VXWORKS) - ret = sem_take(memtrack.mutex, WAIT_FOREVER); -#elif defined(NDS_NITRO) - os_lock_mutex(&memtrack.mutex); - ret = 0; -#endif - - if (ret) - { - memtrack_log("memory_tracker_lock_mutex: mutex lock failed\n"); - } - } - - return ret; -} - -/* - memory_tracker_unlock_mutex() - Unlocks the memory tracker mutex with a platform specific call - Returns: - 0: Success - <0: Failure, either the mutex was not initialized - or the call to unlock the mutex failed -*/ -static int memory_tracker_unlock_mutex() -{ - int ret = -1; - - if (g_b_mem_tracker_inited) - { - -#if defined(LINUX) || defined(__uClinux__) - ret = pthread_mutex_unlock(&memtrack.mutex); -#elif defined(WIN32) || defined(_WIN32_WCE) - ret = !release_mutex(memtrack.mutex); -#elif defined(VXWORKS) - ret = sem_give(memtrack.mutex); -#elif defined(NDS_NITRO) - os_unlock_mutex(&memtrack.mutex); - ret = 0; -#endif - - if (ret) - { - memtrack_log("memory_tracker_unlock_mutex: mutex unlock failed\n"); - } - } - - return ret; -} -#endif - -/* - vpx_memory_tracker_set_functions - - Sets the function pointers for the standard library functions. - - Return: - 0: on success - -1: if the use global function pointers is not set. -*/ -int vpx_memory_tracker_set_functions(mem_track_malloc_func g_malloc_l - , mem_track_calloc_func g_calloc_l - , mem_track_realloc_func g_realloc_l - , mem_track_free_func g_free_l - , mem_track_memcpy_func g_memcpy_l - , mem_track_memset_func g_memset_l - , mem_track_memmove_func g_memmove_l) -{ -#if USE_GLOBAL_FUNCTION_POINTERS - - if (g_malloc_l) - g_malloc = g_malloc_l; - - if (g_calloc_l) - g_calloc = g_calloc_l; - - if (g_realloc_l) - g_realloc = g_realloc_l; - - if (g_free_l) - g_free = g_free_l; - - if (g_memcpy_l) - g_memcpy = g_memcpy_l; - - if (g_memset_l) - g_memset = g_memset_l; - - if (g_memmove_l) - g_memmove = g_memmove_l; - - return 0; -#else - (void)g_malloc_l; - (void)g_calloc_l; - (void)g_realloc_l; - (void)g_free_l; - (void)g_memcpy_l; - (void)g_memset_l; - (void)g_memmove_l; - return -1; -#endif -} diff --git a/vpx_mem/nds/vpx_mem_nds.c b/vpx_mem/nds/vpx_mem_nds.c deleted file mode 100644 index 11ac95cba..000000000 --- a/vpx_mem/nds/vpx_mem_nds.c +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright (c) 2010 The WebM project authors. All Rights Reserved. - * - * Use of this source code is governed by a BSD-style license - * that can be found in the LICENSE file in the root of the source - * tree. An additional intellectual property rights grant can be found - * in the file PATENTS. All contributing project authors may - * be found in the AUTHORS file in the root of the source tree. - */ - - -#define __VPX_MEM_C__ -#include "vpx_mem.h" -#include -#include "vpx_mem_intrnl.h" - -// Allocate memory from the Arena specified by id. Align it to -// the value specified by align. -void *vpx_mem_nds_alloc(osarena_id id, osheap_handle handle, size_t size, size_t align) -{ - void *addr, - * x = NULL; - - addr = os_alloc_from_heap((osarena_id) id, handle, - size + align - 1 + ADDRESS_STORAGE_SIZE); - - if (addr) - { - x = align_addr((unsigned char *)addr + ADDRESS_STORAGE_SIZE, (int)align); - - // save the actual malloc address - ((size_t *)x)[-1] = (size_t)addr; - } - - return x; -} - -// Free them memory allocated by vpx_mem_nds_alloc -void vpx_mem_nds_free(osarena_id id, osheap_handle handle, void *mem) -{ - if (mem) - { - void *addr = (void *)(((size_t *)mem)[-1]); - os_free_to_heap(id, handle, addr); - } -} - -int vpx_nds_alloc_heap(osarena_id id, u32 size) -{ - osheap_handle arena_handle; - void *nstart; - void *heap_start; - - nstart = os_init_alloc(id, os_get_arena_lo(id), os_get_arena_hi(id), 1); - os_set_arena_lo(id, nstart); - - heap_start = os_alloc_from_arena_lo(id, size, 32); - arena_handle = os_create_heap(id, heap_start, (void *)((u32)heap_start + size)); - - if (os_check_heap(id, arena_handle) == -1) - return -1; //ERROR: DTCM heap is not consistent - - (void)os_set_current_heap(id, arena_handle); - - return arena_handle; -} diff --git a/vpx_mem/ti_c6x/vpx_mem_ti_6cx.c b/vpx_mem/ti_c6x/vpx_mem_ti_6cx.c deleted file mode 100644 index d55b7d92c..000000000 --- a/vpx_mem/ti_c6x/vpx_mem_ti_6cx.c +++ /dev/null @@ -1,116 +0,0 @@ -/* - * Copyright (c) 2010 The WebM project authors. All Rights Reserved. - * - * Use of this source code is governed by a BSD-style license - * that can be found in the LICENSE file in the root of the source - * tree. An additional intellectual property rights grant can be found - * in the file PATENTS. All contributing project authors may - * be found in the AUTHORS file in the root of the source tree. - */ - - -#define __VPX_MEM_C__ - -#include "..\include\vpx_mem.h" -#include -#include -#include -#include "..\include\vpx_mem_intrnl.h" - -void *vpx_mem_alloc(int id, size_t size, size_t align) -{ -#if defined CHIP_DM642 || defined __uClinux__ - void *mem = (void *)mem_alloc(id, size, align); - - if (!mem) - { - _P(fprintf(stderr, - "\n" - "*********************************************************\n" - "WARNING: mem_alloc returned 0 for id=%p size=%u align=%u.\n" - "*********************************************************\n", - mem, size, align)); - // should no longer need this. Softier says it's fixed. 2005-01-21 tjf - //#if defined __uClinux__ - //while(1)usleep(1000000); - //#endif - } - -#if defined __uClinux__ - else if (mem == (void *)0xFFFFFFFF) - { - // out of memory/error - mem = (void *)0; - - _P(fprintf(stderr, - "\n" - "******************************************************\n" - "ERROR: mem_alloc id=%p size=%u align=%u OUT OF MEMORY.\n" - "******************************************************\n", - mem, size, align)); - } - -#endif // __uClinux__ - - return mem; -#else - (void)id; - (void)size; - (void)align; - return (void *)0; -#endif -} - -void vpx_mem_free(int id, void *mem, size_t size) -{ -#if defined CHIP_DM642 || defined __uClinux__ - - if (!mem) - { - _P(fprintf(stderr, - "\n" - "**************************************\n" - "WARNING: 0 being free'd id=%p size=%u.\n" - "**************************************\n", - id, size)); - - // should no longer need this. Softier says it's fixed. 2005-01-21 tjf - //#if defined __uClinux__ - //while(1)usleep(1000000); - //#endif - } - - mem_free(id, mem, size); -#else - (void)id; - (void)mem; - (void)size; -#endif -} - -#if CONFIG_MEM_TRACKER -void *xvpx_mem_alloc(int id, size_t size, size_t align, char *file, int line) -{ - void *mem = vpx_mem_alloc(id, size, align); - - vpx_memory_tracker_add((size_t)mem, size, file, line, 0); - - return mem; -} - -void xvpx_mem_free(int id, void *mem, size_t size, char *file, int line) -{ - if (vpx_memory_tracker_remove((size_t)mem) == -2) - { -#if REMOVE_PRINTFS - (void)file; - (void)line; -#endif - _P(fprintf(stderr, "[vpx_mem][xvpx_mem_free] addr: %p (id=%p size=%u) " - "not found in list; freed from file:%s" - " line:%d\n", mem, id, size, file, line)); - } - - vpx_mem_free(id, mem, size); -} -#endif /*CONFIG_MEM_TRACKER*/ diff --git a/vpx_scale/blackfin/yv12config.c b/vpx_scale/blackfin/yv12config.c deleted file mode 100644 index c40420296..000000000 --- a/vpx_scale/blackfin/yv12config.c +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright (c) 2010 The WebM project authors. All Rights Reserved. - * - * Use of this source code is governed by a BSD-style license - * that can be found in the LICENSE file in the root of the source - * tree. An additional intellectual property rights grant can be found - * in the file PATENTS. All contributing project authors may - * be found in the AUTHORS file in the root of the source tree. - */ - - -/**************************************************************************** - * - * Module Title : yv12config.c - * - * Description : - * - ***************************************************************************/ - -/**************************************************************************** -* Header Files -****************************************************************************/ -#include "vpx_scale/yv12config.h" -#include "vpx_mem/vpx_mem.h" - -#include - -/**************************************************************************** -* Imports -****************************************************************************/ -void -extend_memset(void *dst, unsigned char value, unsigned int size); - -/**************************************************************************** - * - ****************************************************************************/ -int -vp8_yv12_de_alloc_frame_buffer(YV12_BUFFER_CONFIG *ybf) -{ - if (ybf) - { - duck_free(ybf->buffer_alloc); - - ybf->buffer_alloc = 0; - } - else - { - return -1; - } - - return 0; -} - -/**************************************************************************** - * - ****************************************************************************/ -int -vp8_yv12_alloc_frame_buffer(YV12_BUFFER_CONFIG *ybf, int width, int height, int border) -{ -//NOTE: - - int yplane_size = (height + 2 * border) * (width + 2 * border); - int uvplane_size = (height / 2 + border) * (width / 2 + border); - - if (ybf) - { - vp8_yv12_de_alloc_frame_buffer(ybf); - - ybf->y_width = width; - ybf->y_height = height; - ybf->y_stride = width + 2 * border; - - ybf->uv_width = width / 2; - ybf->uv_height = height / 2; - ybf->uv_stride = ybf->uv_width + border; - - ybf->border = border; - - // Added 2 extra lines to framebuffer so that copy12x12 doesn't fail - // when we have a large motion vector in V on the last v block. - // Note : We never use these pixels anyway so this doesn't hurt. - ybf->buffer_alloc = (unsigned char *) duck_memalign(32, (yplane_size * 3 / 2) + ybf->y_stride , 0); - - if (ybf->buffer_alloc == NULL) - return -1; - - ybf->y_buffer = ybf->buffer_alloc + border * ybf->y_stride + border; - ybf->u_buffer = ybf->buffer_alloc + yplane_size + border / 2 * ybf->uv_stride + border / 2; - ybf->v_buffer = ybf->buffer_alloc + yplane_size + uvplane_size + border / 2 * ybf->uv_stride + border / 2; - } - else - { - return -2; - } - - return 0; -} -/**************************************************************************** - * - ****************************************************************************/ -int -vp8_yv12_black_frame_buffer(YV12_BUFFER_CONFIG *ybf) -{ - if (ybf) - { - if (ybf->buffer_alloc) - { - extend_memset(ybf->y_buffer, 0x0, ybf->y_stride *(ybf->y_height + 2 * ybf->border)); - extend_memset(ybf->u_buffer, 0x80, ybf->uv_stride *(ybf->uv_height + ybf->border)); - extend_memset(ybf->v_buffer, 0x80, ybf->uv_stride *(ybf->uv_height + ybf->border)); - } - - return 0; - } - - return -1; -} diff --git a/vpx_scale/blackfin/yv12extend.c b/vpx_scale/blackfin/yv12extend.c deleted file mode 100644 index cfd3de050..000000000 --- a/vpx_scale/blackfin/yv12extend.c +++ /dev/null @@ -1,350 +0,0 @@ -/* - * Copyright (c) 2010 The WebM project authors. All Rights Reserved. - * - * Use of this source code is governed by a BSD-style license - * that can be found in the LICENSE file in the root of the source - * tree. An additional intellectual property rights grant can be found - * in the file PATENTS. All contributing project authors may - * be found in the AUTHORS file in the root of the source tree. - */ - - -/**************************************************************************** - * - * Module Title : yv12extend.c - * - * Description : - * - ***************************************************************************/ - -/**************************************************************************** -* Header Files -****************************************************************************/ -#include - -#include "vpx_scale/yv12config.h" -#include "vpx_mem/vpx_mem.h" - -/**************************************************************************** -* -****************************************************************************/ - - -/**************************************************************************** -* -****************************************************************************/ -void -extend_memset(void *dst, unsigned char value, unsigned int size) -{ -#if 0 - unsigned int quad_value; - - quad_value = (unsigned int) value; - quad_value |= (unsigned int) value << 8; - quad_value |= (unsigned int) value << 16; - quad_value |= (unsigned int) value << 24; -#else - unsigned short quad_value; - - quad_value = (unsigned int) value; - quad_value |= (unsigned int) value << 8; -#endif - - - if (size / 2 >= 64 * 1024) - printf("_Extend_memset__________ dma memset is broken\n"); - - *p_mdma_s1_start_addr = &quad_value; - *p_mdma_s1_x_count = size / 2; - *p_mdma_s1_x_modify = 0x0; - *p_mdma_d1_start_addr = dst; - *p_mdma_d1_x_count = size / 2; - *p_mdma_d1_x_modify = 2; - - *p_mdma_s1_config = DMAEN | WDSIZE_16; - asm("ssync;"); - - *p_mdma_d1_config = DI_EN | DMAEN | WNR | WDSIZE_16; - asm("ssync;"); - - while ((*p_mdma_d1_irq_status & DMA_DONE) == 0); - - *p_mdma_d1_irq_status |= DMA_DONE; -} - -/**************************************************************************** -* -****************************************************************************/ -void -extend_memcpy(void *dst, void *src, unsigned int size) -{ - if (size / 2 >= 64 * 1024) - printf("_Extend_memcpy__________ dma memcpy is broken\n"); - - - if ((size & 0x3)) - printf("_)__________ size not a multiple of 4\n"); - -//32 bit dma here caused some data to be corrupted --- WHY ?????? - - *p_mdma_s1_start_addr = src; - *p_mdma_s1_x_count = size / 2; - *p_mdma_s1_x_modify = 2; - *p_mdma_d1_start_addr = dst; - *p_mdma_d1_x_count = size / 2; - *p_mdma_d1_x_modify = 2; - - *p_mdma_s1_config = DMAEN | WDSIZE_16; - asm("ssync;"); - - *p_mdma_d1_config = DI_EN | DMAEN | WNR | WDSIZE_16; - asm("ssync;"); - - while ((*p_mdma_d1_irq_status & DMA_DONE) == 0); - - *p_mdma_d1_irq_status |= DMA_DONE; -} - -/**************************************************************************** - * - ****************************************************************************/ -void -vp8_yv12_extend_frame_borders(YV12_BUFFER_CONFIG *ybf) -{ -#if 1 - int i; - unsigned char *src_ptr1, *src_ptr2; - unsigned char *dest_ptr1, *dest_ptr2; - - unsigned int Border; - int plane_stride; - int plane_height; - int plane_width; - - unsigned int quad_sample; - unsigned int sample; - - /***********/ - /* Y Plane */ - /***********/ - Border = ybf->border; - plane_stride = ybf->y_stride; - plane_height = ybf->y_height; - plane_width = ybf->y_width; - - // copy the left and right most columns out - src_ptr1 = ybf->y_buffer; - src_ptr2 = src_ptr1 + plane_width - 1; - dest_ptr1 = src_ptr1 - Border; - dest_ptr2 = src_ptr2 + 1; - - for (i = 0; i < plane_height; i++) - { - extend_memset(dest_ptr1, src_ptr1[0], Border); - extend_memset(dest_ptr2, src_ptr2[0], Border); - src_ptr1 += plane_stride; - src_ptr2 += plane_stride; - dest_ptr1 += plane_stride; - dest_ptr2 += plane_stride; - } - - // Now copy the top and bottom source lines into each line of the respective borders - src_ptr1 = ybf->y_buffer - Border; - src_ptr2 = src_ptr1 + (plane_height * plane_stride) - plane_stride; - dest_ptr1 = src_ptr1 - (Border * plane_stride); - dest_ptr2 = src_ptr2 + plane_stride; - - for (i = 0; i < (int)Border; i++) - { - extend_memcpy(dest_ptr1, src_ptr1, plane_stride); - dest_ptr1 += plane_stride; - } - - for (i = 0; i < (int)Border; i++) - { - extend_memcpy(dest_ptr2, src_ptr2, plane_stride); - dest_ptr2 += plane_stride; - } - - plane_stride /= 2; - plane_height /= 2; - plane_width /= 2; - Border /= 2; - - /***********/ - /* U Plane */ - /***********/ - - // copy the left and right most columns out - src_ptr1 = ybf->u_buffer; - src_ptr2 = src_ptr1 + plane_width - 1; - dest_ptr1 = src_ptr1 - Border; - dest_ptr2 = src_ptr2 + 1; - - for (i = 0; i < plane_height; i++) - { - extend_memset(dest_ptr1, src_ptr1[0], Border); - extend_memset(dest_ptr2, src_ptr2[0], Border); - src_ptr1 += plane_stride; - src_ptr2 += plane_stride; - dest_ptr1 += plane_stride; - dest_ptr2 += plane_stride; - } - - // Now copy the top and bottom source lines into each line of the respective borders - src_ptr1 = ybf->u_buffer - Border; - src_ptr2 = src_ptr1 + (plane_height * plane_stride) - plane_stride; - dest_ptr1 = src_ptr1 - (Border * plane_stride); - dest_ptr2 = src_ptr2 + plane_stride; - - for (i = 0; i < (int)(Border); i++) - { - extend_memcpy(dest_ptr1, src_ptr1, plane_stride); - dest_ptr1 += plane_stride; - } - - for (i = 0; i < (int)(Border); i++) - { - extend_memcpy(dest_ptr2, src_ptr2, plane_stride); - dest_ptr2 += plane_stride; - } - - /***********/ - /* V Plane */ - /***********/ - - // copy the left and right most columns out - src_ptr1 = ybf->v_buffer; - src_ptr2 = src_ptr1 + plane_width - 1; - dest_ptr1 = src_ptr1 - Border; - dest_ptr2 = src_ptr2 + 1; - - for (i = 0; i < plane_height; i++) - { - extend_memset(dest_ptr1, src_ptr1[0], Border); - extend_memset(dest_ptr2, src_ptr2[0], Border); - src_ptr1 += plane_stride; - src_ptr2 += plane_stride; - dest_ptr1 += plane_stride; - dest_ptr2 += plane_stride; - } - - // Now copy the top and bottom source lines into each line of the respective borders - src_ptr1 = ybf->v_buffer - Border; - src_ptr2 = src_ptr1 + (plane_height * plane_stride) - plane_stride; - dest_ptr1 = src_ptr1 - (Border * plane_stride); - dest_ptr2 = src_ptr2 + plane_stride; - - for (i = 0; i < (int)(Border); i++) - { - extend_memcpy(dest_ptr1, src_ptr1, plane_stride); - dest_ptr1 += plane_stride; - } - - for (i = 0; i < (int)(Border); i++) - { - extend_memcpy(dest_ptr2, src_ptr2, plane_stride); - dest_ptr2 += plane_stride; - } - -#endif -} -/**************************************************************************** - * - * ROUTINE : vp8_yv12_copy_frame - * - * INPUTS : - * - * OUTPUTS : None. - * - * RETURNS : void - * - * FUNCTION : Copies the source image into the destination image and - * updates the destination's UMV borders. - * - * SPECIAL NOTES : The frames are assumed to be identical in size. - * - ****************************************************************************/ -void -vp8_yv12_copy_frame(YV12_BUFFER_CONFIG *src_ybc, YV12_BUFFER_CONFIG *dst_ybc) -{ -#if 1 - int row; - unsigned char *source, *dest; - - source = src_ybc->y_buffer; - dest = dst_ybc->y_buffer; - - for (row = 0; row < src_ybc->y_height; row++) - { - extend_memcpy(dest, source, src_ybc->y_width); - source += src_ybc->y_stride; - dest += dst_ybc->y_stride; - } - - source = src_ybc->u_buffer; - dest = dst_ybc->u_buffer; - - for (row = 0; row < src_ybc->uv_height; row++) - { - extend_memcpy(dest, source, src_ybc->uv_width); - source += src_ybc->uv_stride; - dest += dst_ybc->uv_stride; - } - - source = src_ybc->v_buffer; - dest = dst_ybc->v_buffer; - - for (row = 0; row < src_ybc->uv_height; row++) - { - extend_memcpy(dest, source, src_ybc->uv_width); - source += src_ybc->uv_stride; - dest += dst_ybc->uv_stride; - } - - vp8_yv12_extend_frame_borders(dst_ybc); - -#else - int row; - char *source, *dest; - int height; - int width; - - height = src_ybc->y_height + (src_ybc->border * 2); - width = src_ybc->y_width + (src_ybc->border * 2); - source = src_ybc->y_buffer; - dest = dst_ybc->y_buffer; - - for (row = 0; row < height; row++) - { - extend_memcpy(dest, source, width); - source += src_ybc->y_stride; - dest += dst_ybc->y_stride; - } - - height = src_ybc->uv_height + (src_ybc->border); - width = src_ybc->uv_width + (src_ybc->border); - - source = src_ybc->u_buffer; - dest = dst_ybc->u_buffer; - - for (row = 0; row < height; row++) - { - extend_memcpy(dest, source, width); - source += src_ybc->uv_stride; - dest += dst_ybc->uv_stride; - } - - source = src_ybc->v_buffer; - dest = dst_ybc->v_buffer; - - for (row = 0; row < height; row++) - { - extend_memcpy(dest, source, width); - source += src_ybc->uv_stride; - dest += dst_ybc->uv_stride; - } - -#endif - -} diff --git a/vpx_scale/dm642/bicubic_scaler_c64.c b/vpx_scale/dm642/bicubic_scaler_c64.c deleted file mode 100644 index 5166ace85..000000000 --- a/vpx_scale/dm642/bicubic_scaler_c64.c +++ /dev/null @@ -1,194 +0,0 @@ -/* - * Copyright (c) 2010 The WebM project authors. All Rights Reserved. - * - * Use of this source code is governed by a BSD-style license - * that can be found in the LICENSE file in the root of the source - * tree. An additional intellectual property rights grant can be found - * in the file PATENTS. All contributing project authors may - * be found in the AUTHORS file in the root of the source tree. - */ - - -#include -#include -#include -#include "vpx_mem/vpx_mem.h" -#include "vpxscale_arbitrary.h" - -extern BICUBIC_SCALER_STRUCT g_b_scaler; - -int bicubic_scale_c64(int in_width, int in_height, int in_stride, - int out_width, int out_height, int out_stride, - unsigned char *input_image, unsigned char *output_image) -{ - short *restrict l_w, * restrict l_h; - short *restrict c_w, * restrict c_h; - unsigned char *restrict ip, * restrict op, *restrict op_w; - unsigned char *restrict hbuf; - int h, w, lw, lh; - int phase_offset_w, phase_offset_h; - double coeff; - int max_phase; - - c_w = g_b_scaler.c_w; - c_h = g_b_scaler.c_h; - - op = output_image; - - l_w = g_b_scaler.l_w; - l_h = g_b_scaler.l_h; - - phase_offset_h = 0; - - for (h = 0; h < out_height; h++) - { - // select the row to work on - lh = l_h[h]; - ip = input_image + (in_stride * lh); - - coeff = _memd8_const(&c_h[phase_offset_h*4]); - - // vp8_filter the row vertically into an temporary buffer. - // If the phase offset == 0 then all the multiplication - // is going to result in the output equalling the input. - // So instead point the temporary buffer to the input. - // Also handle the boundry condition of not being able to - // filter that last lines. - if (phase_offset_h && (lh < in_height - 2)) - { - hbuf = g_b_scaler.hbuf; - - for (w = 0; w < in_width; w += 4) - { - int ip1, ip2, ip3, ip4; - int y13_12, y11_10, y23_22, y21_20, y33_32, y31_30, y43_42, y41_40; - int y10_20, y11_21, y12_22, y13_23, y30_40, y31_41, y32_42, y33_43; - int s1, s2, s3, s4; - - ip1 = _mem4_const(&ip[w - in_stride]); - ip2 = _mem4_const(&ip[w]); - ip3 = _mem4_const(&ip[w + in_stride]); - ip4 = _mem4_const(&ip[w + 2*in_stride]); - - // realignment of data. Unpack the data so that it is in short - // format instead of bytes. - y13_12 = _unpkhu4(ip1); - y11_10 = _unpklu4(ip1); - y23_22 = _unpkhu4(ip2); - y21_20 = _unpklu4(ip2); - y33_32 = _unpkhu4(ip3); - y31_30 = _unpklu4(ip3); - y43_42 = _unpkhu4(ip4); - y41_40 = _unpklu4(ip4); - - // repack the data so that elements 1 and 2 are together. this - // lines up so that a dot product with the coefficients can be - // done. - y10_20 = _pack2(y11_10, y21_20); - y11_21 = _packh2(y11_10, y21_20); - y12_22 = _pack2(y13_12, y23_22); - y13_23 = _packh2(y13_12, y23_22); - - s1 = _dotp2(_hi(coeff), y10_20); - s2 = _dotp2(_hi(coeff), y11_21); - s3 = _dotp2(_hi(coeff), y12_22); - s4 = _dotp2(_hi(coeff), y13_23); - - y30_40 = _pack2(y31_30, y41_40); - y31_41 = _packh2(y31_30, y41_40); - y32_42 = _pack2(y33_32, y43_42); - y33_43 = _packh2(y33_32, y43_42); - - // now repack elements 3 and 4 together. - s1 += _dotp2(_lo(coeff), y30_40); - s2 += _dotp2(_lo(coeff), y31_41); - s3 += _dotp2(_lo(coeff), y32_42); - s4 += _dotp2(_lo(coeff), y33_43); - - s1 = s1 >> 12; - s2 = s2 >> 12; - s3 = s3 >> 12; - s4 = s4 >> 12; - - s1 = _pack2(s2, s1); - s2 = _pack2(s4, s3); - - _amem4(&hbuf[w]) = _spacku4(s2, s1); - } - } - else - hbuf = ip; - - // increase the phase offset for the next time around. - if (++phase_offset_h >= g_b_scaler.nh) - phase_offset_h = 0; - - op_w = op; - - // will never be able to interpolate first pixel, so just copy it - // over here. - phase_offset_w = 1; - *op_w++ = hbuf[0]; - - if (1 >= g_b_scaler.nw) phase_offset_w = 0; - - max_phase = g_b_scaler.nw; - - for (w = 1; w < out_width; w++) - { - double coefficients; - int hbuf_high, hbuf_low, hbuf_both; - int sum_high, sum_low, sum; - - // get the index to use to expand the image - lw = l_w[w]; - coefficients = _amemd8_const(&c_w[phase_offset_w*4]); - hbuf_both = _mem4_const(&hbuf[lw-1]); - - hbuf_high = _unpkhu4(hbuf_both); - hbuf_low = _unpklu4(hbuf_both); - - sum_high = _dotp2(_hi(coefficients), hbuf_high); - sum_low = _dotp2(_lo(coefficients), hbuf_low); - - sum = (sum_high + sum_low) >> 12; - - if (++phase_offset_w >= max_phase) - phase_offset_w = 0; - - if ((lw + 2) >= in_width) - sum = hbuf[lw]; - - *op_w++ = sum; - } - - op += out_stride; - } - - return 0; -} - -void bicubic_scale_frame_c64(YV12_BUFFER_CONFIG *src, YV12_BUFFER_CONFIG *dst, - int new_width, int new_height) -{ - - dst->y_width = new_width; - dst->y_height = new_height; - dst->uv_width = new_width / 2; - dst->uv_height = new_height / 2; - - dst->y_stride = dst->y_width; - dst->uv_stride = dst->uv_width; - - bicubic_scale_c64(src->y_width, src->y_height, src->y_stride, - new_width, new_height, dst->y_stride, - src->y_buffer, dst->y_buffer); - - bicubic_scale_c64(src->uv_width, src->uv_height, src->uv_stride, - new_width / 2, new_height / 2, dst->uv_stride, - src->u_buffer, dst->u_buffer); - - bicubic_scale_c64(src->uv_width, src->uv_height, src->uv_stride, - new_width / 2, new_height / 2, dst->uv_stride, - src->v_buffer, dst->v_buffer); -} diff --git a/vpx_scale/dm642/gen_scalers_c64.c b/vpx_scale/dm642/gen_scalers_c64.c deleted file mode 100644 index 87ff998d3..000000000 --- a/vpx_scale/dm642/gen_scalers_c64.c +++ /dev/null @@ -1,608 +0,0 @@ -/* - * Copyright (c) 2010 The WebM project authors. All Rights Reserved. - * - * Use of this source code is governed by a BSD-style license - * that can be found in the LICENSE file in the root of the source - * tree. An additional intellectual property rights grant can be found - * in the file PATENTS. All contributing project authors may - * be found in the AUTHORS file in the root of the source tree. - */ - - -/**************************************************************************** - * - * Module Title : gen_scalers.c - * - * Description : Generic image scaling functions. - * - ***************************************************************************/ - -/**************************************************************************** -* Header Files -****************************************************************************/ -#include "vpx_scale/vpxscale.h" - -/**************************************************************************** -* Imports -****************************************************************************/ - -/**************************************************************************** - * - * ROUTINE : horizontal_line_4_5_scale_c4 - * - * INPUTS : const unsigned char *source : Pointer to source data. - * unsigned int source_width : Stride of source. - * unsigned char *dest : Pointer to destination data. - * unsigned int dest_width : Stride of destination (NOT USED). - * - * OUTPUTS : None. - * - * RETURNS : void - * - * FUNCTION : Copies horizontal line of pixels from source to - * destination scaling up by 4 to 5. - * - * SPECIAL NOTES : None. - * - ****************************************************************************/ -static -void horizontal_line_4_5_scale_c64 -( - const unsigned char *source, - unsigned int source_width, - unsigned char *dest, - unsigned int dest_width -) -{ - unsigned i; - unsigned int ba, cb, dc, ed; - unsigned char *restrict des = dest; - unsigned int *restrict src = (unsigned int *)source; - unsigned int const_51_205, const_102_154, - const_205_51, const_154_102; - - unsigned int src_current, src_next; - - (void) dest_width; - - // Constants that are to be used for the filtering. For - // best speed we are going to want to right shift by 16. - // In the generic version they were shift by 8, so put - // an extra 8 in now so that 16 will come out later. - const_51_205 = 0x3300CD00; //_pack2 (51 << 8, 205 << 8); - const_205_51 = 0xCD003300; //_pack2 (205 << 8, 51 << 8); - const_102_154 = 0x66009A00; //_pack2 (102 << 8, 154 << 8); - const_154_102 = 0x9A006600; //_pack2 (154 << 8, 102 << 8); - - // 5 points are needed to filter to give 5 output points. - // A load can pull up 4 at a time, and one needs to be - // "borrowed" from the next set of data. So instead of - // loading those 5 points each time, "steal" a point from - // the next set and only load up 4 each time through. - src_current = _mem4(src); - - for (i = 0; i < source_width - 4; i += 4) - { - src_next = _mem4(src++); - - // Reorder the data so that it is ready for the - // dot product. - ba = _unpklu4(src_current); - cb = _unpkhu4(_rotl(src_current, 8)); - dc = _unpkhu4(src_current); - ed = _unpkhu4(_shrmb(src_next, src_current)); - - // Use the dot product with round and shift. - des [0] = src_current & 0xff; - des [1] = _dotprsu2(ba, const_205_51); - des [2] = _dotprsu2(cb, const_154_102); - des [3] = _dotprsu2(dc, const_102_154); - des [4] = _dotprsu2(ed, const_51_205); - - des += 5; - - // reuse loaded vales next time around. - src_current = src_next; - } - - // vp8_filter the last set of points. Normally a point from the next set - // would be used, but there is no next set, so just fill. - ba = _unpklu4(src_current); - cb = _unpkhu4(_rotl(src_current, 8)); - dc = _unpkhu4(src_current); - - des [0] = src_current & 0xff; - des [1] = _dotprsu2(ba, const_205_51); - des [2] = _dotprsu2(cb, const_154_102); - des [3] = _dotprsu2(dc, const_102_154); - des [4] = src_current & 0xff; - -} -/**************************************************************************** - * - * ROUTINE : vertical_band_4_5_scale_c64 - * - * INPUTS : unsigned char *dest : Pointer to destination data. - * unsigned int dest_pitch : Stride of destination data. - * unsigned int dest_width : Width of destination data. - * - * OUTPUTS : None. - * - * RETURNS : void - * - * FUNCTION : Scales vertical band of pixels by scale 4 to 5. The - * height of the band scaled is 4-pixels. - * - * SPECIAL NOTES : The routine uses the first line of the band below - * the current band. - * - ****************************************************************************/ -static -void vertical_band_4_5_scale_c64(unsigned char *dest, unsigned int dest_pitch, unsigned int dest_width) -{ - unsigned int i; - unsigned int a, b, c, d, e; - unsigned int ba, cb, dc, ed; - unsigned char *restrict src = dest; - unsigned char *restrict des = dest; - unsigned int const_51_205, const_102_154, - const_205_51, const_154_102; - - const_51_205 = 0x3300CD00; //_pack2 (51 << 8, 205 << 8); - const_205_51 = 0xCD003300; //_pack2 (205 << 8, 51 << 8); - const_102_154 = 0x66009A00; //_pack2 (102 << 8, 154 << 8); - const_154_102 = 0x9A006600; //_pack2 (154 << 8, 102 << 8); - - // Force a loop unroll here so that there is not such a - // dependancy. - a = src [0]; - b = src [dest_pitch]; - c = src [dest_pitch*2]; - d = src [dest_pitch*3]; - e = src [dest_pitch*5]; - src ++; - - for (i = 0; i < dest_width; i++) - { - ba = _pack2(b, a); - cb = _pack2(c, b); - dc = _pack2(d, c); - ed = _pack2(e, d); - - a = src [0]; - b = src [dest_pitch]; - c = src [dest_pitch*2]; - d = src [dest_pitch*3]; - e = src [dest_pitch*5]; - src ++; - - des [dest_pitch] = _dotprsu2(ba, const_205_51); - des [dest_pitch*2] = _dotprsu2(cb, const_154_102); - des [dest_pitch*3] = _dotprsu2(dc, const_102_154); - des [dest_pitch*4] = _dotprsu2(ed, const_51_205); - - des ++; - } -} - -/**************************************************************************** - * - * ROUTINE : last_vertical_band_4_5_scale_c64 - * - * INPUTS : unsigned char *dest : Pointer to destination data. - * unsigned int dest_pitch : Stride of destination data. - * unsigned int dest_width : Width of destination data. - * - * OUTPUTS : None. - * - * RETURNS : void - * - * FUNCTION : Scales last vertical band of pixels by scale 4 to 5. The - * height of the band scaled is 4-pixels. - * - * SPECIAL NOTES : The routine does not have available the first line of - * the band below the current band, since this is the - * last band. - * - ****************************************************************************/ -static -void last_vertical_band_4_5_scale_c64(unsigned char *dest, unsigned int dest_pitch, unsigned int dest_width) -{ - unsigned int i; - unsigned int a, b, c, d; - unsigned int ba, cb, dc; - unsigned char *restrict src = dest; - unsigned char *restrict des = dest; - unsigned int const_102_154, const_205_51, const_154_102; - - const_205_51 = 0xCD003300; //_pack2 (205 << 8, 51 << 8); - const_102_154 = 0x66009A00; //_pack2 (102 << 8, 154 << 8); - const_154_102 = 0x9A006600; //_pack2 (154 << 8, 102 << 8); - - a = src [0]; - b = src [dest_pitch]; - c = src [dest_pitch*2]; - d = src [dest_pitch*3]; - src ++; - - for (i = 0; i < dest_width; ++i) - { - ba = _pack2(b, a); - cb = _pack2(c, b); - dc = _pack2(d, c); - - a = src [0]; - b = src [dest_pitch]; - c = src [dest_pitch*2]; - d = src [dest_pitch*3]; - src ++; - - des [dest_pitch] = _dotprsu2(ba, const_205_51); - des [dest_pitch*2] = _dotprsu2(cb, const_154_102); - des [dest_pitch*3] = _dotprsu2(dc, const_102_154); - des [dest_pitch*4] = (unsigned char) d; - - des++; - } -} - -/**************************************************************************** - * - * ROUTINE : horizontal_line_3_5_scale_c64 - * - * INPUTS : const unsigned char *source : Pointer to source data. - * unsigned int source_width : Stride of source. - * unsigned char *dest : Pointer to destination data. - * unsigned int dest_width : Stride of destination (NOT USED). - * - * OUTPUTS : None. - * - * RETURNS : void - * - * FUNCTION : Copies horizontal line of pixels from source to - * destination scaling up by 3 to 5. - * - * SPECIAL NOTES : None. - * - * - ****************************************************************************/ -static -void horizontal_line_3_5_scale_c64 -( - const unsigned char *source, - unsigned int source_width, - unsigned char *dest, - unsigned int dest_width -) -{ - unsigned int i; - unsigned int ba, cb, dc; - unsigned int src_current; - unsigned char *restrict des = dest; - unsigned char *restrict src = (unsigned char *)source; - unsigned int const_51_205, const_102_154, - const_205_51, const_154_102; - - (void) dest_width; - - const_51_205 = 0x3300CD00; //_pack2 (51 << 8, 205 << 8); - const_205_51 = 0xCD003300; //_pack2 (205 << 8, 51 << 8); - const_102_154 = 0x66009A00; //_pack2 (102 << 8, 154 << 8); - const_154_102 = 0x9A006600; //_pack2 (154 << 8, 102 << 8); - - for (i = 0; i < source_width - 3; i += 3) - { - src_current = _mem4(src); - - // Reorder the data so that it is ready for the - // dot product. - ba = _unpklu4(src_current); - cb = _unpkhu4(_rotl(src_current, 8)); - dc = _unpkhu4(src_current); - - des [0] = src_current & 0xff; - des [1] = _dotprsu2(ba, const_154_102); - des [2] = _dotprsu2(cb, const_51_205); - des [3] = _dotprsu2(cb, const_205_51); - des [4] = _dotprsu2(dc, const_102_154); - - src += 3; - des += 5; - } - - src_current = _mem4(src); - - ba = _unpklu4(src_current); - cb = _unpkhu4(_rotl(src_current, 8)); - dc = _unpkhu4(src_current); - - - des [0] = src_current & 0xff; - des [1] = _dotprsu2(ba, const_154_102); - des [2] = _dotprsu2(cb, const_51_205); - des [3] = _dotprsu2(cb, const_205_51); - des [4] = dc & 0xff; - -} - -/**************************************************************************** - * - * ROUTINE : vertical_band_3_5_scale_c64 - * - * INPUTS : unsigned char *dest : Pointer to destination data. - * unsigned int dest_pitch : Stride of destination data. - * unsigned int dest_width : Width of destination data. - * - * OUTPUTS : None. - * - * RETURNS : void - * - * FUNCTION : Scales vertical band of pixels by scale 3 to 5. The - * height of the band scaled is 3-pixels. - * - * SPECIAL NOTES : The routine uses the first line of the band below - * the current band. - * - ****************************************************************************/ -static -void vertical_band_3_5_scale_c64(unsigned char *dest, unsigned int dest_pitch, unsigned int dest_width) -{ - unsigned int i; - unsigned int a, b, c, d; - unsigned int ba, cb, dc; - unsigned char *restrict src = dest; - unsigned char *restrict des = dest; - unsigned int const_51_205, const_102_154, - const_205_51, const_154_102; - - const_51_205 = 0x3300CD00; //_pack2 (51 << 8, 205 << 8); - const_205_51 = 0xCD003300; //_pack2 (205 << 8, 51 << 8); - const_102_154 = 0x66009A00; //_pack2 (102 << 8, 154 << 8); - const_154_102 = 0x9A006600; //_pack2 (154 << 8, 102 << 8); - - a = src [0]; - b = src [dest_pitch]; - c = src [dest_pitch*2]; - d = src [dest_pitch*5]; - src ++; - - for (i = 0; i < dest_width; i++) - { - ba = _pack2(b, a); - cb = _pack2(c, b); - dc = _pack2(d, c); - - a = src [0]; - b = src [dest_pitch]; - c = src [dest_pitch*2]; - d = src [dest_pitch*5]; - src ++; - - des [dest_pitch] = _dotprsu2(ba, const_154_102); - des [dest_pitch*2] = _dotprsu2(cb, const_51_205); - des [dest_pitch*3] = _dotprsu2(cb, const_205_51); - des [dest_pitch*4] = _dotprsu2(dc, const_102_154); - - des++; - } -} - -/**************************************************************************** - * - * ROUTINE : last_vertical_band_3_5_scale_c64 - * - * INPUTS : unsigned char *dest : Pointer to destination data. - * unsigned int dest_pitch : Stride of destination data. - * unsigned int dest_width : Width of destination data. - * - * OUTPUTS : None. - * - * RETURNS : void - * - * FUNCTION : Scales last vertical band of pixels by scale 3 to 5. The - * height of the band scaled is 3-pixels. - * - * SPECIAL NOTES : The routine does not have available the first line of - * the band below the current band, since this is the - * last band. - * - ****************************************************************************/ -static -void last_vertical_band_3_5_scale_c64(unsigned char *dest, unsigned int dest_pitch, unsigned int dest_width) -{ - unsigned int i; - unsigned int a, b, c; - unsigned int ba, cb; - unsigned char *restrict src = dest; - unsigned char *restrict des = dest; - unsigned int const_51_205, const_205_51, const_154_102; - - const_51_205 = 0x3300CD00; //_pack2 (51 << 8, 205 << 8); - const_205_51 = 0xCD003300; //_pack2 (205 << 8, 51 << 8); - const_154_102 = 0x9A006600; //_pack2 (154 << 8, 102 << 8); - - a = src [0]; - b = src [dest_pitch]; - c = src [dest_pitch*2]; - src ++; - - for (i = 0; i < dest_width; ++i) - { - ba = _pack2(b, a); - cb = _pack2(c, b); - - a = src [0]; - b = src [dest_pitch]; - c = src [dest_pitch*2]; - src ++; - - des [dest_pitch] = _dotprsu2(ba, const_154_102); - des [dest_pitch*2] = _dotprsu2(cb, const_51_205); - des [dest_pitch*3] = _dotprsu2(cb, const_205_51); - des [dest_pitch*4] = (unsigned char)(c) ; - - des++; - } -} - -/**************************************************************************** - * - * ROUTINE : horizontal_line_1_2_scale_c64 - * - * INPUTS : const unsigned char *source : Pointer to source data. - * unsigned int source_width : Stride of source. - * unsigned char *dest : Pointer to destination data. - * unsigned int dest_width : Stride of destination (NOT USED). - * - * OUTPUTS : None. - * - * RETURNS : void - * - * FUNCTION : Copies horizontal line of pixels from source to - * destination scaling up by 1 to 2. - * - * SPECIAL NOTES : source width must be a multiple of 4. - * - ****************************************************************************/ -void horizontal_line_1_2_scale_c64 -( - const unsigned char *source, - unsigned int source_width, - unsigned char *dest, - unsigned int dest_width -) -{ - unsigned int i; - unsigned char *restrict des = dest; - unsigned char *restrict src = (unsigned char *)source; - unsigned int src7_4i, src4_1i, src3_0i; - unsigned int a4_0i, ahi, alo; - double src7_0d, src3_0d; - const unsigned int k01 = 0x01010101; - - for (i = 0; i < source_width / 4; i += 1) - { - // Load up the data from src. Here a wide load is - // used to get 8 bytes at once, only 5 will be used - // for the actual computation. - src7_0d = _memd8(src); - src3_0i = _lo(src7_0d); - src7_4i = _hi(src7_0d); - - // Need to average between points. Shift byte 5 into - // the lower word. This will result in bytes 5-1 - // averaged with 4-0. - src4_1i = _shrmb(src7_4i, src3_0i); - a4_0i = _avgu4(src4_1i, src3_0i); - - // Expand the data out. Could do an unpack, however - // all but the multiply units are getting pretty hard - // here the multiply unit can take some of the computations. - src3_0d = _mpyu4(src3_0i, k01); - - // The averages need to be unpacked so that they are in 16 - // bit form and will be able to be interleaved with the - // original data - ahi = _unpkhu4(a4_0i); - alo = _unpklu4(a4_0i); - - ahi = _swap4(ahi); - alo = _swap4(alo); - - // Mix the average result in with the orginal data. - ahi = _hi(src3_0d) | ahi; - alo = _lo(src3_0d) | alo; - - _memd8(des) = _itod(ahi, alo); - - des += 8; - src += 4; - } -} - - -/**************************************************************************** - * - * ROUTINE : vertical_band_1_2_scale_c64 - * - * INPUTS : unsigned char *dest : Pointer to destination data. - * unsigned int dest_pitch : Stride of destination data. - * unsigned int dest_width : Width of destination data. - * - * OUTPUTS : None. - * - * RETURNS : void - * - * FUNCTION : Scales vertical band of pixels by scale 1 to 2. The - * height of the band scaled is 1-pixel. - * - * SPECIAL NOTES : The routine uses the first line of the band below - * the current band. - * Destination width must be a multiple of 4. Because the - * intput must be, therefore the output must be. - * - ****************************************************************************/ -static -void vertical_band_1_2_scale_c64(unsigned char *dest, unsigned int dest_pitch, unsigned int dest_width) -{ - unsigned int i; - unsigned int a, b; - unsigned int *restrict line_a = (unsigned int *)dest; - unsigned int *restrict line_b = (unsigned int *)(dest + (dest_pitch * 2)); - unsigned int *restrict des = (unsigned int *)(dest + dest_pitch); - - for (i = 0; i < dest_width / 4; i++) - { - a = _mem4(line_a++); - b = _mem4(line_b++); - - _mem4(des++) = _avgu4(a, b); - } -} - -/**************************************************************************** - * - * ROUTINE : last_vertical_band_1_2_scale_c64 - * - * INPUTS : unsigned char *dest : Pointer to destination data. - * unsigned int dest_pitch : Stride of destination data. - * unsigned int dest_width : Width of destination data. - * - * OUTPUTS : None. - * - * RETURNS : void - * - * FUNCTION : Scales last vertical band of pixels by scale 1 to 2. The - * height of the band scaled is 1-pixel. - * - * SPECIAL NOTES : The routine does not have available the first line of - * the band below the current band, since this is the - * last band. Again, width must be a multiple of 4. - * - ****************************************************************************/ -static -void last_vertical_band_1_2_scale_c64(unsigned char *dest, unsigned int dest_pitch, unsigned int dest_width) -{ - unsigned int i; - unsigned int *restrict src = (unsigned int *)dest; - unsigned int *restrict des = (unsigned int *)(dest + dest_pitch); - - for (i = 0; i < dest_width / 4; ++i) - { - _mem4(des++) = _mem4(src++); - } -} - -void -register_generic_scalers(void) -{ - vp8_horizontal_line_1_2_scale = horizontal_line_1_2_scale_c64; - vp8_vertical_band_1_2_scale = vertical_band_1_2_scale_c64; - vp8_last_vertical_band_1_2_scale = last_vertical_band_1_2_scale_c64; - vp8_horizontal_line_3_5_scale = horizontal_line_3_5_scale_c64; - vp8_vertical_band_3_5_scale = vertical_band_3_5_scale_c64; - vp8_last_vertical_band_3_5_scale = last_vertical_band_3_5_scale_c64; - vp8_horizontal_line_4_5_scale = horizontal_line_4_5_scale_c64; - vp8_vertical_band_4_5_scale = vertical_band_4_5_scale_c64; - vp8_last_vertical_band_4_5_scale = last_vertical_band_4_5_scale_c64; -} diff --git a/vpx_scale/dm642/yv12extend.c b/vpx_scale/dm642/yv12extend.c deleted file mode 100644 index 646e69a7f..000000000 --- a/vpx_scale/dm642/yv12extend.c +++ /dev/null @@ -1,446 +0,0 @@ -/* - * Copyright (c) 2010 The WebM project authors. All Rights Reserved. - * - * Use of this source code is governed by a BSD-style license - * that can be found in the LICENSE file in the root of the source - * tree. An additional intellectual property rights grant can be found - * in the file PATENTS. All contributing project authors may - * be found in the AUTHORS file in the root of the source tree. - */ - - -/**************************************************************************** - * - * Module Title : yv12extend.c - * - * Description : - * - ***************************************************************************/ - -/**************************************************************************** -* Header Files -****************************************************************************/ -//#include -#include "csl_dat.h" -#include "vpx_scale/yv12config.h" -#include "vpx_mem/vpx_mem.h" - -/**************************************************************************** -* Exports -****************************************************************************/ -#define UINT8 unsigned char -#define UINT32 unsigned int - - -static inline -void copy_yleft_right_border( - UINT8 *restrict src_ptr1, - UINT8 *restrict src_ptr2, - UINT8 *restrict dest_ptr1, - UINT8 *restrict dest_ptr2, - UINT32 plane_height, - UINT32 plane_stride -) -{ - UINT32 left, right, left2, left4, right2, right4; - double dl, dr; - int i; - -#pragma MUST_ITERATE(16,16,16) - - for (i = 0; i < plane_height; i++) - { - left = src_ptr1[0]; - right = src_ptr2[0]; - - left2 = _pack2(left, left); - left4 = _packl4(left2, left2); - - right2 = _pack2(right, right); - right4 = _packl4(right2, right2); - - dl = _itod(left4, left4); - dr = _itod(right4, right4); - - _amemd8(&dest_ptr1[ 0]) = dl; - _amemd8(&dest_ptr2[ 0]) = dr; - - _amemd8(&dest_ptr1[ 8]) = dl; - _amemd8(&dest_ptr2[ 8]) = dr; - - _amemd8(&dest_ptr1[16]) = dl; - _amemd8(&dest_ptr2[16]) = dr; - - _amemd8(&dest_ptr1[24]) = dl; - _amemd8(&dest_ptr2[24]) = dr; - - _amemd8(&dest_ptr1[32]) = dl; - _amemd8(&dest_ptr2[32]) = dr; - - _amemd8(&dest_ptr1[40]) = dl; - _amemd8(&dest_ptr2[40]) = dr; - - - src_ptr1 += plane_stride; - src_ptr2 += plane_stride; - dest_ptr1 += plane_stride; - dest_ptr2 += plane_stride; - } -} -/**************************************************************************** - * - * - ****************************************************************************/ -static -void copy_uvleft_right_border( - UINT8 *restrict src_ptr1, - UINT8 *restrict src_ptr2, - UINT8 *restrict dest_ptr1, - UINT8 *restrict dest_ptr2, - UINT32 plane_height, - UINT32 plane_stride -) -{ - UINT32 left, right, left2, left4, right2, right4; - double dl, dr; - int i; - -#pragma MUST_ITERATE(8,8 ,8) - - for (i = 0; i < plane_height; i++) - { - left = src_ptr1[0]; - right = src_ptr2[0]; - - left2 = _pack2(left, left); - left4 = _packl4(left2, left2); - - right2 = _pack2(right, right); - right4 = _packl4(right2, right2); - - dl = _itod(left4, left4); - dr = _itod(right4, right4); - - _amemd8(&dest_ptr1[ 0]) = dl; - _amemd8(&dest_ptr2[ 0]) = dr; - - _amemd8(&dest_ptr1[ 8]) = dl; - _amemd8(&dest_ptr2[ 8]) = dr; - - _amemd8(&dest_ptr1[16]) = dl; - _amemd8(&dest_ptr2[16]) = dr; - - - src_ptr1 += plane_stride; - src_ptr2 += plane_stride; - dest_ptr1 += plane_stride; - dest_ptr2 += plane_stride; - } -} -/**************************************************************************** - * - ****************************************************************************/ -void -vp8_yv12_extend_frame_borders(YV12_BUFFER_CONFIG *ybf) -{ - int i; - unsigned char *src_ptr1, *src_ptr2; - unsigned char *dest_ptr1, *dest_ptr2; - - unsigned int Border; - int plane_stride; - int plane_height; - int plane_width; - - /***********/ - /* Y Plane */ - /***********/ - Border = ybf->border; - plane_stride = ybf->y_stride; - plane_height = ybf->y_height; - plane_width = ybf->y_width; - -#if 1 - // copy the left and right most columns out - src_ptr1 = ybf->y_buffer; - src_ptr2 = src_ptr1 + plane_width - 1; - dest_ptr1 = src_ptr1 - Border; - dest_ptr2 = src_ptr2 + 1; - copy_yleft_right_border(src_ptr1, src_ptr2, dest_ptr1, dest_ptr2, plane_height, plane_stride); -#endif - - // Now copy the top and bottom source lines into each line of the respective borders - src_ptr1 = ybf->y_buffer - Border; - src_ptr2 = src_ptr1 + (plane_height * plane_stride) - plane_stride; - dest_ptr1 = src_ptr1 - (Border * plane_stride); - dest_ptr2 = src_ptr2 + plane_stride; - - for (i = 0; i < (int)Border; i++) - { - vpx_memcpy(dest_ptr1, src_ptr1, plane_stride); - vpx_memcpy(dest_ptr2, src_ptr2, plane_stride); - dest_ptr1 += plane_stride; - dest_ptr2 += plane_stride; - } - - plane_stride /= 2; - plane_height /= 2; - plane_width /= 2; - Border /= 2; - - /***********/ - /* U Plane */ - /***********/ -#if 1 - // copy the left and right most columns out - src_ptr1 = ybf->u_buffer; - src_ptr2 = src_ptr1 + plane_width - 1; - dest_ptr1 = src_ptr1 - Border; - dest_ptr2 = src_ptr2 + 1; - - copy_uvleft_right_border(src_ptr1, src_ptr2, dest_ptr1, dest_ptr2, plane_height, plane_stride); - - -#endif - - // Now copy the top and bottom source lines into each line of the respective borders - src_ptr1 = ybf->u_buffer - Border; - src_ptr2 = src_ptr1 + (plane_height * plane_stride) - plane_stride; - dest_ptr1 = src_ptr1 - (Border * plane_stride); - dest_ptr2 = src_ptr2 + plane_stride; - - for (i = 0; i < (int)(Border); i++) - { - vpx_memcpy(dest_ptr1, src_ptr1, plane_stride); - vpx_memcpy(dest_ptr2, src_ptr2, plane_stride); - dest_ptr1 += plane_stride; - dest_ptr2 += plane_stride; - } - - /***********/ - /* V Plane */ - /***********/ -#if 1 - // copy the left and right most columns out - src_ptr1 = ybf->v_buffer; - src_ptr2 = src_ptr1 + plane_width - 1; - dest_ptr1 = src_ptr1 - Border; - dest_ptr2 = src_ptr2 + 1; - - copy_uvleft_right_border(src_ptr1, src_ptr2, dest_ptr1, dest_ptr2, plane_height, plane_stride); - -#endif - - // Now copy the top and bottom source lines into each line of the respective borders - src_ptr1 = ybf->v_buffer - Border; - src_ptr2 = src_ptr1 + (plane_height * plane_stride) - plane_stride; - dest_ptr1 = src_ptr1 - (Border * plane_stride); - dest_ptr2 = src_ptr2 + plane_stride; - - for (i = 0; i < (int)(Border); i++) - { - vpx_memcpy(dest_ptr1, src_ptr1, plane_stride); - vpx_memcpy(dest_ptr2, src_ptr2, plane_stride); - dest_ptr1 += plane_stride; - dest_ptr2 += plane_stride; - } -} -/**************************************************************************** - * - ****************************************************************************/ -void -vpxyv12_extend_frame_tbborders(YV12_BUFFER_CONFIG *ybf) -{ - int i; - unsigned char *src_ptr1, *src_ptr2; - unsigned char *dest_ptr1, *dest_ptr2; - int tid1, tid2; - - unsigned int Border; - int plane_stride; - int plane_height; - int plane_width; - - /***********/ - /* Y Plane */ - /***********/ - Border = ybf->border; - plane_stride = ybf->y_stride; - plane_height = ybf->y_height; - plane_width = ybf->y_width; - - - // Now copy the top and bottom source lines into each line of the respective borders - src_ptr1 = ybf->y_buffer - Border; - src_ptr2 = src_ptr1 + (plane_height * plane_stride) - plane_stride; - dest_ptr1 = src_ptr1 - (Border * plane_stride); - dest_ptr2 = src_ptr2 + plane_stride; - - - for (i = 0; i < (int)Border; i++) - { - dat_copy(src_ptr1, dest_ptr1, plane_stride); - dat_copy(src_ptr2, dest_ptr2, plane_stride); - dest_ptr1 += plane_stride; - dest_ptr2 += plane_stride; - } - - plane_stride /= 2; - plane_height /= 2; - plane_width /= 2; - Border /= 2; - - /***********/ - /* U Plane */ - /***********/ - // Now copy the top and bottom source lines into each line of the respective borders - src_ptr1 = ybf->u_buffer - Border; - src_ptr2 = src_ptr1 + (plane_height * plane_stride) - plane_stride; - dest_ptr1 = src_ptr1 - (Border * plane_stride); - dest_ptr2 = src_ptr2 + plane_stride; - - for (i = 0; i < (int)(Border); i++) - { - dat_copy(src_ptr1, dest_ptr1, plane_stride); - dat_copy(src_ptr2, dest_ptr2, plane_stride); - dest_ptr1 += plane_stride; - dest_ptr2 += plane_stride; - } - - /***********/ - /* V Plane */ - /***********/ - // Now copy the top and bottom source lines into each line of the respective borders - src_ptr1 = ybf->v_buffer - Border; - src_ptr2 = src_ptr1 + (plane_height * plane_stride) - plane_stride; - dest_ptr1 = src_ptr1 - (Border * plane_stride); - dest_ptr2 = src_ptr2 + plane_stride; - - for (i = 0; i < (int)(Border); i++) - { - tid1 = dat_copy(src_ptr1, dest_ptr1, plane_stride); - tid2 = dat_copy(src_ptr2, dest_ptr2, plane_stride); - dest_ptr1 += plane_stride; - dest_ptr2 += plane_stride; - } - - dat_wait(tid1); - dat_wait(tid2); -} - -/**************************************************************************** - * - * ROUTINE : vp8_yv12_copy_frame - * - * INPUTS : - * - * OUTPUTS : None. - * - * RETURNS : void - * - * FUNCTION : Copies the source image into the destination image and - * updates the destination's UMV borders. Because the - * borders have been update prior to this so the whole frame - * is copied, borders and all. This is also to circumvent - * using copy_left_right Border functions when copying data - * between L2 and main memory. When that occurs a cache - * clean needs to be done, which would require invalidating - * an entire frame. - * - * SPECIAL NOTES : The frames are assumed to be identical in size. - * - ****************************************************************************/ -void -vpxyv12_copy_frame_dma(YV12_BUFFER_CONFIG *src_ybc, YV12_BUFFER_CONFIG *dst_ybc) -{ - int yheight, uv_height; - int ystride, uv_stride; - int border; - int yoffset, uvoffset; - - border = src_ybc->border; - yheight = src_ybc->y_height; - uv_height = src_ybc->uv_height; - - ystride = src_ybc->y_stride; - uv_stride = src_ybc->uv_stride; - - yoffset = border * (ystride + 1); - uvoffset = border / 2 * (uv_stride + 1); - - dat_copy2d(DAT_2D2D, - src_ybc->y_buffer - yoffset, - dst_ybc->y_buffer - yoffset, - ystride, - yheight + 2 * border, - ystride); - dat_copy2d(DAT_2D2D, - src_ybc->u_buffer - uvoffset, - dst_ybc->u_buffer - uvoffset, - uv_stride, - uv_height + border, - uv_stride); - dat_copy2d(DAT_2D2D, - src_ybc->v_buffer - uvoffset, - dst_ybc->v_buffer - uvoffset, - uv_stride, - uv_height + border, - uv_stride); - -} - - -/**************************************************************************** - * - * ROUTINE : vp8_yv12_copy_frame - * - * INPUTS : - * - * OUTPUTS : None. - * - * RETURNS : void - * - * FUNCTION : Copies the source image into the destination image and - * updates the destination's UMV borders. - * - * SPECIAL NOTES : The frames are assumed to be identical in size. - * - ****************************************************************************/ -void -vp8_yv12_copy_frame(YV12_BUFFER_CONFIG *src_ybc, YV12_BUFFER_CONFIG *dst_ybc) -{ - int row; - unsigned char *source, *dest; - - source = src_ybc->y_buffer; - dest = dst_ybc->y_buffer; - - for (row = 0; row < src_ybc->y_height; row++) - { - vpx_memcpy(dest, source, src_ybc->y_width); - source += src_ybc->y_stride; - dest += dst_ybc->y_stride; - } - - source = src_ybc->u_buffer; - dest = dst_ybc->u_buffer; - - for (row = 0; row < src_ybc->uv_height; row++) - { - vpx_memcpy(dest, source, src_ybc->uv_width); - source += src_ybc->uv_stride; - dest += dst_ybc->uv_stride; - } - - source = src_ybc->v_buffer; - dest = dst_ybc->v_buffer; - - for (row = 0; row < src_ybc->uv_height; row++) - { - vpx_memcpy(dest, source, src_ybc->uv_width); - source += src_ybc->uv_stride; - dest += dst_ybc->uv_stride; - } - - vp8_yv12_extend_frame_borders(dst_ybc); -} diff --git a/vpx_scale/include/leapster/vpxscale.h b/vpx_scale/include/leapster/vpxscale.h deleted file mode 100644 index 50218497d..000000000 --- a/vpx_scale/include/leapster/vpxscale.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (c) 2010 The WebM project authors. All Rights Reserved. - * - * Use of this source code is governed by a BSD-style license - * that can be found in the LICENSE file in the root of the source - * tree. An additional intellectual property rights grant can be found - * in the file PATENTS. All contributing project authors may - * be found in the AUTHORS file in the root of the source tree. - */ - - -/**************************************************************************** -* -* Module Title : postp.h -* -* Description : Post processor interface -* -****************************************************************************/ -#ifndef VPXSCALE_H -#define VPXSCALE_H - - -// fwg 2004-10-14 -typedef void (*vpxvertical_band_4_5_scale_lf)(unsigned char *dest, unsigned int dest_pitch, unsigned int dest_width); -typedef void (*vpxlast_vertical_band_4_5_scale_lf)(unsigned char *dest, unsigned int dest_pitch, unsigned int dest_width); -typedef void (*vpxvertical_band_3_5_scale_lf)(unsigned char *dest, unsigned int dest_pitch, unsigned int dest_width); -typedef void (*vpxlast_vertical_band_3_5_scale_lf)(unsigned char *dest, unsigned int dest_pitch, unsigned int dest_width); -typedef void (*vpxhorizontal_line_1_2_scale_lf)(const unsigned char *source, unsigned int source_width, unsigned char *dest, unsigned int dest_width); -typedef void (*vpxhorizontal_line_3_5_scale_lf)(const unsigned char *source, unsigned int source_width, unsigned char *dest, unsigned int dest_width); -typedef void (*vpxhorizontal_line_4_5_scale_lf)(const unsigned char *source, unsigned int source_width, unsigned char *dest, unsigned int dest_width); -typedef void (*vpxvertical_band_1_2_scale_lf)(unsigned char *dest, unsigned int dest_pitch, unsigned int dest_width); -typedef void (*vpxlast_vertical_band_1_2_scale_lf)(unsigned char *dest, unsigned int dest_pitch, unsigned int dest_width); - - -typedef struct vpxglobal_scalling_ptrs_t -{ - vpxvertical_band_4_5_scale_lf vpxvertical_band_4_5_scale_t; - vpxlast_vertical_band_4_5_scale_lf vpxlast_vertical_band_4_5_scale_t; - vpxvertical_band_3_5_scale_lf vpxvertical_band_3_5_scale_t; - vpxlast_vertical_band_3_5_scale_lf vpxlast_vertical_band_3_5_scale_t; - vpxhorizontal_line_1_2_scale_lf vpxhorizontal_line_1_2_scale_t; - vpxhorizontal_line_3_5_scale_lf vpxhorizontal_line_3_5_scale_t; - vpxhorizontal_line_4_5_scale_lf vpxhorizontal_line_4_5_scale_t; - vpxvertical_band_1_2_scale_lf vpxvertical_band_1_2_scale_t; - vpxlast_vertical_band_1_2_scale_lf vpxlast_vertical_band_1_2_scale_t; -} vpxglobal_scalling_ptrs; - -extern struct vpxglobal_scalling_ptrs_t *g_scaling_ptrs; - -/* -extern void (*vp8_vertical_band_4_5_scale)(unsigned char * dest,unsigned int dest_pitch,unsigned int dest_width); -extern void (*vp8_last_vertical_band_4_5_scale)(unsigned char * dest,unsigned int dest_pitch,unsigned int dest_width); -extern void (*vp8_vertical_band_3_5_scale)(unsigned char * dest,unsigned int dest_pitch,unsigned int dest_width); -extern void (*vp8_last_vertical_band_3_5_scale)(unsigned char * dest,unsigned int dest_pitch,unsigned int dest_width); -extern void (*vp8_horizontal_line_1_2_scale)(const unsigned char * source,unsigned int source_width,unsigned char * dest,unsigned int dest_width); -extern void (*vp8_horizontal_line_3_5_scale)(const unsigned char * source,unsigned int source_width,unsigned char * dest,unsigned int dest_width); -extern void (*vp8_horizontal_line_4_5_scale)(const unsigned char * source,unsigned int source_width,unsigned char * dest,unsigned int dest_width); -extern void (*vp8_vertical_band_1_2_scale)(unsigned char * dest,unsigned int dest_pitch,unsigned int dest_width); -extern void (*vp8_last_vertical_band_1_2_scale)(unsigned char * dest,unsigned int dest_pitch,unsigned int dest_width); -*/ - -#endif diff --git a/vpx_scale/intel_linux/scaleopt.c b/vpx_scale/intel_linux/scaleopt.c deleted file mode 100644 index 499f0ed61..000000000 --- a/vpx_scale/intel_linux/scaleopt.c +++ /dev/null @@ -1,1853 +0,0 @@ -/* - * Copyright (c) 2010 The WebM project authors. All Rights Reserved. - * - * Use of this source code is governed by a BSD-style license - * that can be found in the LICENSE file in the root of the source - * tree. An additional intellectual property rights grant can be found - * in the file PATENTS. All contributing project authors may - * be found in the AUTHORS file in the root of the source tree. - */ - - -/**************************************************************************** -* -* Module Title : scaleopt.cpp -* -* Description : Optimized scaling functions -* -****************************************************************************/ -#include "pragmas.h" - -/**************************************************************************** -* Module Statics -****************************************************************************/ -#if 0 -__declspec(align(16)) const static unsigned short one_fifth[] = { 51, 51, 51, 51 }; -__declspec(align(16)) const static unsigned short two_fifths[] = { 102, 102, 102, 102 }; -__declspec(align(16)) const static unsigned short three_fifths[] = { 154, 154, 154, 154 }; -__declspec(align(16)) const static unsigned short four_fifths[] = { 205, 205, 205, 205 }; -__declspec(align(16)) const static unsigned short round_values[] = { 128, 128, 128, 128 }; -__declspec(align(16)) const static unsigned short four_ones[] = { 1, 1, 1, 1}; -__declspec(align(16)) const static unsigned short const45_2[] = {205, 154, 102, 51 }; -__declspec(align(16)) const static unsigned short const45_1[] = { 51, 102, 154, 205 }; -__declspec(align(16)) const static unsigned char mask45[] = { 0, 0, 0, 0, 0, 0, 255, 0}; -__declspec(align(16)) const static unsigned short const35_2[] = { 154, 51, 205, 102 }; -__declspec(align(16)) const static unsigned short const35_1[] = { 102, 205, 51, 154 }; -#endif - -#include "vpx_scale/vpxscale.h" -#include "vpx_mem/vpx_mem.h" - -/**************************************************************************** - * - * ROUTINE : horizontal_line_3_5_scale_mmx - * - * INPUTS : const unsigned char *source : - * unsigned int source_width : - * unsigned char *dest : - * unsigned int dest_width : - * - * OUTPUTS : None. - * - * RETURNS : void - * - * FUNCTION : 3 to 5 up-scaling of a horizontal line of pixels. - * - * SPECIAL NOTES : None. - * - ****************************************************************************/ -static -void horizontal_line_3_5_scale_mmx -( - const unsigned char *source, - unsigned int source_width, - unsigned char *dest, - unsigned int dest_width -) -{ - __declspec(align(16)) unsigned short const35_2[] = { 154, 51, 205, 102 }; - __declspec(align(16)) unsigned short const35_1[] = { 102, 205, 51, 154 }; - __declspec(align(16)) unsigned short round_values[] = { 128, 128, 128, 128 }; - - (void) dest_width; - - __asm - { - - push ebx - - mov esi, source - mov edi, dest - - mov ecx, source_width - lea edx, [esi+ecx-3]; - - movq mm5, const35_1 // mm5 = 66 xx cd xx 33 xx 9a xx - movq mm6, const35_2 // mm6 = 9a xx 33 xx cd xx 66 xx - - movq mm4, round_values // mm4 = 80 xx 80 xx 80 xx 80 xx - pxor mm7, mm7 // clear mm7 - - horiz_line_3_5_loop: - - mov eax, DWORD PTR [esi] // eax = 00 01 02 03 - mov ebx, eax - - and ebx, 0xffff00 // ebx = xx 01 02 xx - mov ecx, eax // ecx = 00 01 02 03 - - and eax, 0xffff0000 // eax = xx xx 02 03 - xor ecx, eax // ecx = 00 01 xx xx - - shr ebx, 8 // ebx = 01 02 xx xx - or eax, ebx // eax = 01 02 02 03 - - shl ebx, 16 // ebx = xx xx 01 02 - movd mm1, eax // mm1 = 01 02 02 03 xx xx xx xx - - or ebx, ecx // ebx = 00 01 01 02 - punpcklbw mm1, mm7 // mm1 = 01 xx 02 xx 02 xx 03 xx - - movd mm0, ebx // mm0 = 00 01 01 02 - pmullw mm1, mm6 // - - punpcklbw mm0, mm7 // mm0 = 00 xx 01 xx 01 xx 02 xx - pmullw mm0, mm5 // - - mov [edi], ebx // writeoutput 00 xx xx xx - add esi, 3 - - add edi, 5 - paddw mm0, mm1 - - paddw mm0, mm4 - psrlw mm0, 8 - - cmp esi, edx - packuswb mm0, mm7 - - movd DWORD Ptr [edi-4], mm0 - jl horiz_line_3_5_loop - -//Exit: - mov eax, DWORD PTR [esi] // eax = 00 01 02 03 - mov ebx, eax - - and ebx, 0xffff00 // ebx = xx 01 02 xx - mov ecx, eax // ecx = 00 01 02 03 - - and eax, 0xffff0000 // eax = xx xx 02 03 - xor ecx, eax // ecx = 00 01 xx xx - - shr ebx, 8 // ebx = 01 02 xx xx - or eax, ebx // eax = 01 02 02 03 - - shl eax, 8 // eax = xx 01 02 02 - and eax, 0xffff0000 // eax = xx xx 02 02 - - or eax, ebx // eax = 01 02 02 02 - - shl ebx, 16 // ebx = xx xx 01 02 - movd mm1, eax // mm1 = 01 02 02 02 xx xx xx xx - - or ebx, ecx // ebx = 00 01 01 02 - punpcklbw mm1, mm7 // mm1 = 01 xx 02 xx 02 xx 02 xx - - movd mm0, ebx // mm0 = 00 01 01 02 - pmullw mm1, mm6 // - - punpcklbw mm0, mm7 // mm0 = 00 xx 01 xx 01 xx 02 xx - pmullw mm0, mm5 // - - mov [edi], ebx // writeoutput 00 xx xx xx - paddw mm0, mm1 - - paddw mm0, mm4 - psrlw mm0, 8 - - packuswb mm0, mm7 - movd DWORD Ptr [edi+1], mm0 - - pop ebx - - } - - /* - const unsigned char *src = source; - unsigned char *des = dest; - unsigned int a, b, c ; - unsigned int i; - (void) dest_width; - - for ( i=0; i> 8); - c = src[2] ; - // 4 * left + 1 * right /5 - des [2] = (UINT8) (( b * 205 + c * 51 + 128 ) >> 8); - // 1 * left + 4 * right /5 - des [3] = (UINT8) (( b * 51 + c * 205 + 128 ) >> 8); - - a = src[3]; - // 3 * left + 2 * right /5 - des [4] = (UINT8) (( c * 154 + a * 102 + 128 ) >> 8); - - src += 3; - des += 5; - } - - a = src[0]; - b = src[1]; - des [0] = (UINT8) (a); - // 2 * left + 3 * right /5 - des [1] = (UINT8) (( a * 102 + 154 * b + 128 ) >> 8); - c = src[2] ; - // 4 * left + 1 * right /5 - des [2] = (UINT8) (( b * 205 + c * 51 + 128 ) >> 8); - // 1 * left + 4 * right /5 - des [3] = (UINT8) (( b * 51 + c * 205 + 128 ) >> 8); - - des [4] = (UINT8) (c); - */ -} - - -/**************************************************************************** - * - * ROUTINE : horizontal_line_4_5_scale_mmx - * - * INPUTS : const unsigned char *source : - * unsigned int source_width : - * unsigned char *dest : - * unsigned int dest_width : - * - * OUTPUTS : None. - * - * RETURNS : void - * - * FUNCTION : 4 to 5 up-scaling of a horizontal line of pixels. - * - * SPECIAL NOTES : None. - * - ****************************************************************************/ -static -void horizontal_line_4_5_scale_mmx -( - const unsigned char *source, - unsigned int source_width, - unsigned char *dest, - unsigned int dest_width -) -{ - __declspec(align(16)) unsigned short round_values[] = { 128, 128, 128, 128 }; - __declspec(align(16)) unsigned short const45_2[] = {205, 154, 102, 51 }; - __declspec(align(16)) unsigned short const45_1[] = { 51, 102, 154, 205 }; - __declspec(align(16)) unsigned char mask45[] = { 0, 0, 0, 0, 0, 0, 255, 0}; - - (void)dest_width; - - __asm - { - - mov esi, source - mov edi, dest - - mov ecx, source_width - lea edx, [esi+ecx-8]; - - movq mm5, const45_1 // mm5 = 33 xx 66 xx 9a xx cd xx - movq mm6, const45_2 // mm6 = cd xx 9a xx 66 xx 33 xx - - movq mm4, round_values // mm4 = 80 xx 80 xx 80 xx 80 xx - pxor mm7, mm7 // clear mm7 - - horiz_line_4_5_loop: - - movq mm0, QWORD PTR [esi] // mm0 = 00 01 02 03 04 05 06 07 - movq mm1, QWORD PTR [esi+1]; // mm1 = 01 02 03 04 05 06 07 08 - - movq mm2, mm0 // mm2 = 00 01 02 03 04 05 06 07 - movq mm3, mm1 // mm3 = 01 02 03 04 05 06 07 08 - - movd DWORD PTR [edi], mm0 // write output 00 xx xx xx - punpcklbw mm0, mm7 // mm0 = 00 xx 01 xx 02 xx 03 xx - - punpcklbw mm1, mm7 // mm1 = 01 xx 02 xx 03 xx 04 xx - pmullw mm0, mm5 // 00* 51 01*102 02*154 03*205 - - pmullw mm1, mm6 // 01*205 02*154 03*102 04* 51 - punpckhbw mm2, mm7 // mm2 = 04 xx 05 xx 06 xx 07 xx - - movd DWORD PTR [edi+5], mm2 // write ouput 05 xx xx xx - pmullw mm2, mm5 // 04* 51 05*102 06*154 07*205 - - punpckhbw mm3, mm7 // mm3 = 05 xx 06 xx 07 xx 08 xx - pmullw mm3, mm6 // 05*205 06*154 07*102 08* 51 - - paddw mm0, mm1 // added round values - paddw mm0, mm4 - - psrlw mm0, 8 // output: 01 xx 02 xx 03 xx 04 xx - packuswb mm0, mm7 - - movd DWORD PTR [edi+1], mm0 // write output 01 02 03 04 - add edi, 10 - - add esi, 8 - paddw mm2, mm3 // - - paddw mm2, mm4 // added round values - cmp esi, edx - - psrlw mm2, 8 - packuswb mm2, mm7 - - movd DWORD PTR [edi-4], mm2 // writeoutput 06 07 08 09 - jl horiz_line_4_5_loop - -//Exit: - movq mm0, [esi] // mm0 = 00 01 02 03 04 05 06 07 - movq mm1, mm0 // mm1 = 00 01 02 03 04 05 06 07 - - movq mm2, mm0 // mm2 = 00 01 02 03 04 05 06 07 - psrlq mm1, 8 // mm1 = 01 02 03 04 05 06 07 00 - - movq mm3, mask45 // mm3 = 00 00 00 00 00 00 ff 00 - pand mm3, mm1 // mm3 = 00 00 00 00 00 00 07 00 - - psllq mm3, 8 // mm3 = 00 00 00 00 00 00 00 07 - por mm1, mm3 // mm1 = 01 02 03 04 05 06 07 07 - - movq mm3, mm1 - - movd DWORD PTR [edi], mm0 // write output 00 xx xx xx - punpcklbw mm0, mm7 // mm0 = 00 xx 01 xx 02 xx 03 xx - - punpcklbw mm1, mm7 // mm1 = 01 xx 02 xx 03 xx 04 xx - pmullw mm0, mm5 // 00* 51 01*102 02*154 03*205 - - pmullw mm1, mm6 // 01*205 02*154 03*102 04* 51 - punpckhbw mm2, mm7 // mm2 = 04 xx 05 xx 06 xx 07 xx - - movd DWORD PTR [edi+5], mm2 // write ouput 05 xx xx xx - pmullw mm2, mm5 // 04* 51 05*102 06*154 07*205 - - punpckhbw mm3, mm7 // mm3 = 05 xx 06 xx 07 xx 08 xx - pmullw mm3, mm6 // 05*205 06*154 07*102 07* 51 - - paddw mm0, mm1 // added round values - paddw mm0, mm4 - - psrlw mm0, 8 // output: 01 xx 02 xx 03 xx 04 xx - packuswb mm0, mm7 // 01 02 03 04 xx xx xx xx - - movd DWORD PTR [edi+1], mm0 // write output 01 02 03 04 - paddw mm2, mm3 // - - paddw mm2, mm4 // added round values - psrlw mm2, 8 - - packuswb mm2, mm7 - movd DWORD PTR [edi+6], mm2 // writeoutput 06 07 08 09 - - - } - /* - const unsigned char *src = source; - unsigned char *des = dest; - unsigned int a, b, c ; - unsigned i; - (void) dest_width; - - for ( i=0; i> 8); - c = src[2] * 154; - a = src[3]; - des [2] = (UINT8) (( b * 102 + c + 128) >> 8); - des [3] = (UINT8) (( c + 102 * a + 128) >> 8); - b = src[4]; - des [4] = (UINT8) (( a * 205 + 51 * b + 128) >> 8); - - src += 4; - des += 5; - } - - a = src[0]; - b = src[1]; - des [0] = (UINT8) (a); - des [1] = (UINT8) (( a * 51 + 205 * b + 128) >> 8); - c = src[2] * 154; - a = src[3]; - des [2] = (UINT8) (( b * 102 + c + 128) >> 8); - des [3] = (UINT8) (( c + 102 * a + 128) >> 8); - des [4] = (UINT8) (a); - */ -} - -/**************************************************************************** - * - * ROUTINE : vertical_band_4_5_scale_mmx - * - * INPUTS : unsigned char *dest : - * unsigned int dest_pitch : - * unsigned int dest_width : - * - * OUTPUTS : None. - * - * RETURNS : void - * - * FUNCTION : 4 to 5 up-scaling of a 4 pixel high band of pixels. - * - * SPECIAL NOTES : The routine uses the first line of the band below - * the current band. The function also has a "C" only - * version. - * - ****************************************************************************/ -static -void vertical_band_4_5_scale_mmx -( - unsigned char *dest, - unsigned int dest_pitch, - unsigned int dest_width -) -{ - - __declspec(align(16)) unsigned short one_fifth[] = { 51, 51, 51, 51 }; - __declspec(align(16)) unsigned short two_fifths[] = { 102, 102, 102, 102 }; - __declspec(align(16)) unsigned short three_fifths[] = { 154, 154, 154, 154 }; - __declspec(align(16)) unsigned short four_fifths[] = { 205, 205, 205, 205 }; - __declspec(align(16)) unsigned short round_values[] = { 128, 128, 128, 128 }; - - __asm - { - - mov esi, dest // Get the source and destination pointer - mov ecx, dest_pitch // Get the pitch size - - lea edi, [esi+ecx*2] // tow lines below - add edi, ecx // three lines below - - pxor mm7, mm7 // clear out mm7 - mov edx, dest_width // Loop counter - - vs_4_5_loop: - - movq mm0, QWORD ptr [esi] // src[0]; - movq mm1, QWORD ptr [esi+ecx] // src[1]; - - movq mm2, mm0 // Make a copy - punpcklbw mm0, mm7 // unpack low to word - - movq mm5, one_fifth - punpckhbw mm2, mm7 // unpack high to word - - pmullw mm0, mm5 // a * 1/5 - - movq mm3, mm1 // make a copy - punpcklbw mm1, mm7 // unpack low to word - - pmullw mm2, mm5 // a * 1/5 - movq mm6, four_fifths // constan - - movq mm4, mm1 // copy of low b - pmullw mm4, mm6 // b * 4/5 - - punpckhbw mm3, mm7 // unpack high to word - movq mm5, mm3 // copy of high b - - pmullw mm5, mm6 // b * 4/5 - paddw mm0, mm4 // a * 1/5 + b * 4/5 - - paddw mm2, mm5 // a * 1/5 + b * 4/5 - paddw mm0, round_values // + 128 - - paddw mm2, round_values // + 128 - psrlw mm0, 8 - - psrlw mm2, 8 - packuswb mm0, mm2 // des [1] - - movq QWORD ptr [esi+ecx], mm0 // write des[1] - movq mm0, [esi+ecx*2] // mm0 = src[2] - - // mm1, mm3 --- Src[1] - // mm0 --- Src[2] - // mm7 for unpacking - - movq mm5, two_fifths - movq mm2, mm0 // make a copy - - pmullw mm1, mm5 // b * 2/5 - movq mm6, three_fifths - - - punpcklbw mm0, mm7 // unpack low to word - pmullw mm3, mm5 // b * 2/5 - - movq mm4, mm0 // make copy of c - punpckhbw mm2, mm7 // unpack high to word - - pmullw mm4, mm6 // c * 3/5 - movq mm5, mm2 - - pmullw mm5, mm6 // c * 3/5 - paddw mm1, mm4 // b * 2/5 + c * 3/5 - - paddw mm3, mm5 // b * 2/5 + c * 3/5 - paddw mm1, round_values // + 128 - - paddw mm3, round_values // + 128 - psrlw mm1, 8 - - psrlw mm3, 8 - packuswb mm1, mm3 // des[2] - - movq QWORD ptr [esi+ecx*2], mm1 // write des[2] - movq mm1, [edi] // mm1=Src[3]; - - // mm0, mm2 --- Src[2] - // mm1 --- Src[3] - // mm6 --- 3/5 - // mm7 for unpacking - - pmullw mm0, mm6 // c * 3/5 - movq mm5, two_fifths // mm5 = 2/5 - - movq mm3, mm1 // make a copy - pmullw mm2, mm6 // c * 3/5 - - punpcklbw mm1, mm7 // unpack low - movq mm4, mm1 // make a copy - - punpckhbw mm3, mm7 // unpack high - pmullw mm4, mm5 // d * 2/5 - - movq mm6, mm3 // make a copy - pmullw mm6, mm5 // d * 2/5 - - paddw mm0, mm4 // c * 3/5 + d * 2/5 - paddw mm2, mm6 // c * 3/5 + d * 2/5 - - paddw mm0, round_values // + 128 - paddw mm2, round_values // + 128 - - psrlw mm0, 8 - psrlw mm2, 8 - - packuswb mm0, mm2 // des[3] - movq QWORD ptr [edi], mm0 // write des[3] - - // mm1, mm3 --- Src[3] - // mm7 -- cleared for unpacking - - movq mm0, [edi+ecx*2] // mm0, Src[0] of the next group - - movq mm5, four_fifths // mm5 = 4/5 - pmullw mm1, mm5 // d * 4/5 - - movq mm6, one_fifth // mm6 = 1/5 - movq mm2, mm0 // make a copy - - pmullw mm3, mm5 // d * 4/5 - punpcklbw mm0, mm7 // unpack low - - pmullw mm0, mm6 // an * 1/5 - punpckhbw mm2, mm7 // unpack high - - paddw mm1, mm0 // d * 4/5 + an * 1/5 - pmullw mm2, mm6 // an * 1/5 - - paddw mm3, mm2 // d * 4/5 + an * 1/5 - paddw mm1, round_values // + 128 - - paddw mm3, round_values // + 128 - psrlw mm1, 8 - - psrlw mm3, 8 - packuswb mm1, mm3 // des[4] - - movq QWORD ptr [edi+ecx], mm1 // write des[4] - - add edi, 8 - add esi, 8 - - sub edx, 8 - jg vs_4_5_loop - } -} - -/**************************************************************************** - * - * ROUTINE : last_vertical_band_4_5_scale_mmx - * - * INPUTS : unsigned char *dest : - * unsigned int dest_pitch : - * unsigned int dest_width : - * - * OUTPUTS : None. - * - * RETURNS : None - * - * FUNCTION : 4 to 5 up-scaling of the last 4-pixel high band in an image. - * - * SPECIAL NOTES : The routine uses the first line of the band below - * the current band. The function also has an "C" only - * version. - * - ****************************************************************************/ -static -void last_vertical_band_4_5_scale_mmx -( - unsigned char *dest, - unsigned int dest_pitch, - unsigned int dest_width -) -{ - __declspec(align(16)) unsigned short one_fifth[] = { 51, 51, 51, 51 }; - __declspec(align(16)) unsigned short two_fifths[] = { 102, 102, 102, 102 }; - __declspec(align(16)) unsigned short three_fifths[] = { 154, 154, 154, 154 }; - __declspec(align(16)) unsigned short four_fifths[] = { 205, 205, 205, 205 }; - __declspec(align(16)) unsigned short round_values[] = { 128, 128, 128, 128 }; - - __asm - { - mov esi, dest // Get the source and destination pointer - mov ecx, dest_pitch // Get the pitch size - - lea edi, [esi+ecx*2] // tow lines below - add edi, ecx // three lines below - - pxor mm7, mm7 // clear out mm7 - mov edx, dest_width // Loop counter - - last_vs_4_5_loop: - - movq mm0, QWORD ptr [esi] // src[0]; - movq mm1, QWORD ptr [esi+ecx] // src[1]; - - movq mm2, mm0 // Make a copy - punpcklbw mm0, mm7 // unpack low to word - - movq mm5, one_fifth - punpckhbw mm2, mm7 // unpack high to word - - pmullw mm0, mm5 // a * 1/5 - - movq mm3, mm1 // make a copy - punpcklbw mm1, mm7 // unpack low to word - - pmullw mm2, mm5 // a * 1/5 - movq mm6, four_fifths // constan - - movq mm4, mm1 // copy of low b - pmullw mm4, mm6 // b * 4/5 - - punpckhbw mm3, mm7 // unpack high to word - movq mm5, mm3 // copy of high b - - pmullw mm5, mm6 // b * 4/5 - paddw mm0, mm4 // a * 1/5 + b * 4/5 - - paddw mm2, mm5 // a * 1/5 + b * 4/5 - paddw mm0, round_values // + 128 - - paddw mm2, round_values // + 128 - psrlw mm0, 8 - - psrlw mm2, 8 - packuswb mm0, mm2 // des [1] - - movq QWORD ptr [esi+ecx], mm0 // write des[1] - movq mm0, [esi+ecx*2] // mm0 = src[2] - - // mm1, mm3 --- Src[1] - // mm0 --- Src[2] - // mm7 for unpacking - - movq mm5, two_fifths - movq mm2, mm0 // make a copy - - pmullw mm1, mm5 // b * 2/5 - movq mm6, three_fifths - - - punpcklbw mm0, mm7 // unpack low to word - pmullw mm3, mm5 // b * 2/5 - - movq mm4, mm0 // make copy of c - punpckhbw mm2, mm7 // unpack high to word - - pmullw mm4, mm6 // c * 3/5 - movq mm5, mm2 - - pmullw mm5, mm6 // c * 3/5 - paddw mm1, mm4 // b * 2/5 + c * 3/5 - - paddw mm3, mm5 // b * 2/5 + c * 3/5 - paddw mm1, round_values // + 128 - - paddw mm3, round_values // + 128 - psrlw mm1, 8 - - psrlw mm3, 8 - packuswb mm1, mm3 // des[2] - - movq QWORD ptr [esi+ecx*2], mm1 // write des[2] - movq mm1, [edi] // mm1=Src[3]; - - movq QWORD ptr [edi+ecx], mm1 // write des[4]; - - // mm0, mm2 --- Src[2] - // mm1 --- Src[3] - // mm6 --- 3/5 - // mm7 for unpacking - - pmullw mm0, mm6 // c * 3/5 - movq mm5, two_fifths // mm5 = 2/5 - - movq mm3, mm1 // make a copy - pmullw mm2, mm6 // c * 3/5 - - punpcklbw mm1, mm7 // unpack low - movq mm4, mm1 // make a copy - - punpckhbw mm3, mm7 // unpack high - pmullw mm4, mm5 // d * 2/5 - - movq mm6, mm3 // make a copy - pmullw mm6, mm5 // d * 2/5 - - paddw mm0, mm4 // c * 3/5 + d * 2/5 - paddw mm2, mm6 // c * 3/5 + d * 2/5 - - paddw mm0, round_values // + 128 - paddw mm2, round_values // + 128 - - psrlw mm0, 8 - psrlw mm2, 8 - - packuswb mm0, mm2 // des[3] - movq QWORD ptr [edi], mm0 // write des[3] - - // mm1, mm3 --- Src[3] - // mm7 -- cleared for unpacking - add edi, 8 - add esi, 8 - - sub edx, 8 - jg last_vs_4_5_loop - } -} - -/**************************************************************************** - * - * ROUTINE : vertical_band_3_5_scale_mmx - * - * INPUTS : unsigned char *dest : - * unsigned int dest_pitch : - * unsigned int dest_width : - * - * OUTPUTS : None. - * - * RETURNS : void - * - * FUNCTION : 3 to 5 up-scaling of a 3-pixel high band of pixels. - * - * SPECIAL NOTES : The routine uses the first line of the band below - * the current band. The function also has an "C" only - * version. - * - ****************************************************************************/ -static -void vertical_band_3_5_scale_mmx -( - unsigned char *dest, - unsigned int dest_pitch, - unsigned int dest_width -) -{ - __declspec(align(16)) unsigned short one_fifth[] = { 51, 51, 51, 51 }; - __declspec(align(16)) unsigned short two_fifths[] = { 102, 102, 102, 102 }; - __declspec(align(16)) unsigned short three_fifths[] = { 154, 154, 154, 154 }; - __declspec(align(16)) unsigned short four_fifths[] = { 205, 205, 205, 205 }; - __declspec(align(16)) unsigned short round_values[] = { 128, 128, 128, 128 }; - - __asm - { - mov esi, dest // Get the source and destination pointer - mov ecx, dest_pitch // Get the pitch size - - lea edi, [esi+ecx*2] // tow lines below - add edi, ecx // three lines below - - pxor mm7, mm7 // clear out mm7 - mov edx, dest_width // Loop counter - - vs_3_5_loop: - - movq mm0, QWORD ptr [esi] // src[0]; - movq mm1, QWORD ptr [esi+ecx] // src[1]; - - movq mm2, mm0 // Make a copy - punpcklbw mm0, mm7 // unpack low to word - - movq mm5, two_fifths // mm5 = 2/5 - punpckhbw mm2, mm7 // unpack high to word - - pmullw mm0, mm5 // a * 2/5 - - movq mm3, mm1 // make a copy - punpcklbw mm1, mm7 // unpack low to word - - pmullw mm2, mm5 // a * 2/5 - movq mm6, three_fifths // mm6 = 3/5 - - movq mm4, mm1 // copy of low b - pmullw mm4, mm6 // b * 3/5 - - punpckhbw mm3, mm7 // unpack high to word - movq mm5, mm3 // copy of high b - - pmullw mm5, mm6 // b * 3/5 - paddw mm0, mm4 // a * 2/5 + b * 3/5 - - paddw mm2, mm5 // a * 2/5 + b * 3/5 - paddw mm0, round_values // + 128 - - paddw mm2, round_values // + 128 - psrlw mm0, 8 - - psrlw mm2, 8 - packuswb mm0, mm2 // des [1] - - movq QWORD ptr [esi+ecx], mm0 // write des[1] - movq mm0, [esi+ecx*2] // mm0 = src[2] - - // mm1, mm3 --- Src[1] - // mm0 --- Src[2] - // mm7 for unpacking - - movq mm4, mm1 // b low - pmullw mm1, four_fifths // b * 4/5 low - - movq mm5, mm3 // b high - pmullw mm3, four_fifths // b * 4/5 high - - movq mm2, mm0 // c - pmullw mm4, one_fifth // b * 1/5 - - punpcklbw mm0, mm7 // c low - pmullw mm5, one_fifth // b * 1/5 - - movq mm6, mm0 // make copy of c low - punpckhbw mm2, mm7 // c high - - pmullw mm6, one_fifth // c * 1/5 low - movq mm7, mm2 // make copy of c high - - pmullw mm7, one_fifth // c * 1/5 high - paddw mm1, mm6 // b * 4/5 + c * 1/5 low - - paddw mm3, mm7 // b * 4/5 + c * 1/5 high - movq mm6, mm0 // make copy of c low - - pmullw mm6, four_fifths // c * 4/5 low - movq mm7, mm2 // make copy of c high - - pmullw mm7, four_fifths // c * 4/5 high - - paddw mm4, mm6 // b * 1/5 + c * 4/5 low - paddw mm5, mm7 // b * 1/5 + c * 4/5 high - - paddw mm1, round_values // + 128 - paddw mm3, round_values // + 128 - - psrlw mm1, 8 - psrlw mm3, 8 - - packuswb mm1, mm3 // des[2] - movq QWORD ptr [esi+ecx*2], mm1 // write des[2] - - paddw mm4, round_values // + 128 - paddw mm5, round_values // + 128 - - psrlw mm4, 8 - psrlw mm5, 8 - - packuswb mm4, mm5 // des[3] - movq QWORD ptr [edi], mm4 // write des[3] - - // mm0, mm2 --- Src[3] - - pxor mm7, mm7 // clear mm7 for unpacking - movq mm1, [edi+ecx*2] // mm1 = Src[0] of the next group - - movq mm5, three_fifths // mm5 = 3/5 - pmullw mm0, mm5 // d * 3/5 - - movq mm6, two_fifths // mm6 = 2/5 - movq mm3, mm1 // make a copy - - pmullw mm2, mm5 // d * 3/5 - punpcklbw mm1, mm7 // unpack low - - pmullw mm1, mm6 // an * 2/5 - punpckhbw mm3, mm7 // unpack high - - paddw mm0, mm1 // d * 3/5 + an * 2/5 - pmullw mm3, mm6 // an * 2/5 - - paddw mm2, mm3 // d * 3/5 + an * 2/5 - paddw mm0, round_values // + 128 - - paddw mm2, round_values // + 128 - psrlw mm0, 8 - - psrlw mm2, 8 - packuswb mm0, mm2 // des[4] - - movq QWORD ptr [edi+ecx], mm0 // write des[4] - - add edi, 8 - add esi, 8 - - sub edx, 8 - jg vs_3_5_loop - } -} - -/**************************************************************************** - * - * ROUTINE : last_vertical_band_3_5_scale_mmx - * - * INPUTS : unsigned char *dest : - * unsigned int dest_pitch : - * unsigned int dest_width : - * - * OUTPUTS : None. - * - * RETURNS : void - * - * FUNCTION : 3 to 5 up-scaling of a 3-pixel high band of pixels. - * - * SPECIAL NOTES : The routine uses the first line of the band below - * the current band. The function also has an "C" only - * version. - * - ****************************************************************************/ -static -void last_vertical_band_3_5_scale_mmx -( - unsigned char *dest, - unsigned int dest_pitch, - unsigned int dest_width -) -{ - __declspec(align(16)) unsigned short one_fifth[] = { 51, 51, 51, 51 }; - __declspec(align(16)) unsigned short two_fifths[] = { 102, 102, 102, 102 }; - __declspec(align(16)) unsigned short three_fifths[] = { 154, 154, 154, 154 }; - __declspec(align(16)) unsigned short four_fifths[] = { 205, 205, 205, 205 }; - __declspec(align(16)) unsigned short round_values[] = { 128, 128, 128, 128 }; - __asm - { - mov esi, dest // Get the source and destination pointer - mov ecx, dest_pitch // Get the pitch size - - lea edi, [esi+ecx*2] // tow lines below - add edi, ecx // three lines below - - pxor mm7, mm7 // clear out mm7 - mov edx, dest_width // Loop counter - - - last_vs_3_5_loop: - - movq mm0, QWORD ptr [esi] // src[0]; - movq mm1, QWORD ptr [esi+ecx] // src[1]; - - movq mm2, mm0 // Make a copy - punpcklbw mm0, mm7 // unpack low to word - - movq mm5, two_fifths // mm5 = 2/5 - punpckhbw mm2, mm7 // unpack high to word - - pmullw mm0, mm5 // a * 2/5 - - movq mm3, mm1 // make a copy - punpcklbw mm1, mm7 // unpack low to word - - pmullw mm2, mm5 // a * 2/5 - movq mm6, three_fifths // mm6 = 3/5 - - movq mm4, mm1 // copy of low b - pmullw mm4, mm6 // b * 3/5 - - punpckhbw mm3, mm7 // unpack high to word - movq mm5, mm3 // copy of high b - - pmullw mm5, mm6 // b * 3/5 - paddw mm0, mm4 // a * 2/5 + b * 3/5 - - paddw mm2, mm5 // a * 2/5 + b * 3/5 - paddw mm0, round_values // + 128 - - paddw mm2, round_values // + 128 - psrlw mm0, 8 - - psrlw mm2, 8 - packuswb mm0, mm2 // des [1] - - movq QWORD ptr [esi+ecx], mm0 // write des[1] - movq mm0, [esi+ecx*2] // mm0 = src[2] - - - - // mm1, mm3 --- Src[1] - // mm0 --- Src[2] - // mm7 for unpacking - - movq mm4, mm1 // b low - pmullw mm1, four_fifths // b * 4/5 low - - movq QWORD ptr [edi+ecx], mm0 // write des[4] - - movq mm5, mm3 // b high - pmullw mm3, four_fifths // b * 4/5 high - - movq mm2, mm0 // c - pmullw mm4, one_fifth // b * 1/5 - - punpcklbw mm0, mm7 // c low - pmullw mm5, one_fifth // b * 1/5 - - movq mm6, mm0 // make copy of c low - punpckhbw mm2, mm7 // c high - - pmullw mm6, one_fifth // c * 1/5 low - movq mm7, mm2 // make copy of c high - - pmullw mm7, one_fifth // c * 1/5 high - paddw mm1, mm6 // b * 4/5 + c * 1/5 low - - paddw mm3, mm7 // b * 4/5 + c * 1/5 high - movq mm6, mm0 // make copy of c low - - pmullw mm6, four_fifths // c * 4/5 low - movq mm7, mm2 // make copy of c high - - pmullw mm7, four_fifths // c * 4/5 high - - paddw mm4, mm6 // b * 1/5 + c * 4/5 low - paddw mm5, mm7 // b * 1/5 + c * 4/5 high - - paddw mm1, round_values // + 128 - paddw mm3, round_values // + 128 - - psrlw mm1, 8 - psrlw mm3, 8 - - packuswb mm1, mm3 // des[2] - movq QWORD ptr [esi+ecx*2], mm1 // write des[2] - - paddw mm4, round_values // + 128 - paddw mm5, round_values // + 128 - - psrlw mm4, 8 - psrlw mm5, 8 - - packuswb mm4, mm5 // des[3] - movq QWORD ptr [edi], mm4 // write des[3] - - // mm0, mm2 --- Src[3] - - add edi, 8 - add esi, 8 - - sub edx, 8 - jg last_vs_3_5_loop - } -} - -/**************************************************************************** - * - * ROUTINE : vertical_band_1_2_scale_mmx - * - * INPUTS : unsigned char *dest : - * unsigned int dest_pitch : - * unsigned int dest_width : - * - * OUTPUTS : None. - * - * RETURNS : void - * - * FUNCTION : 1 to 2 up-scaling of a band of pixels. - * - * SPECIAL NOTES : The routine uses the first line of the band below - * the current band. The function also has an "C" only - * version. - * - ****************************************************************************/ -static -void vertical_band_1_2_scale_mmx -( - unsigned char *dest, - unsigned int dest_pitch, - unsigned int dest_width -) -{ - __declspec(align(16))unsigned short four_ones[] = { 1, 1, 1, 1}; - - __asm - { - - mov esi, dest // Get the source and destination pointer - mov ecx, dest_pitch // Get the pitch size - - pxor mm7, mm7 // clear out mm7 - mov edx, dest_width // Loop counter - - vs_1_2_loop: - - movq mm0, [esi] // get Src[0] - movq mm1, [esi + ecx * 2] // get Src[1] - - movq mm2, mm0 // make copy before unpack - movq mm3, mm1 // make copy before unpack - - punpcklbw mm0, mm7 // low Src[0] - movq mm6, four_ones // mm6= 1, 1, 1, 1 - - punpcklbw mm1, mm7 // low Src[1] - paddw mm0, mm1 // low (a + b) - - punpckhbw mm2, mm7 // high Src[0] - paddw mm0, mm6 // low (a + b + 1) - - punpckhbw mm3, mm7 - paddw mm2, mm3 // high (a + b ) - - psraw mm0, 1 // low (a + b +1 )/2 - paddw mm2, mm6 // high (a + b + 1) - - psraw mm2, 1 // high (a + b + 1)/2 - packuswb mm0, mm2 // pack results - - movq [esi+ecx], mm0 // write out eight bytes - add esi, 8 - - sub edx, 8 - jg vs_1_2_loop - } - -} - -/**************************************************************************** - * - * ROUTINE : last_vertical_band_1_2_scale_mmx - * - * INPUTS : unsigned char *dest : - * unsigned int dest_pitch : - * unsigned int dest_width : - * - * OUTPUTS : None. - * - * RETURNS : void - * - * FUNCTION : 1 to 2 up-scaling of band of pixels. - * - * SPECIAL NOTES : The routine uses the first line of the band below - * the current band. The function also has an "C" only - * version. - * - ****************************************************************************/ -static -void last_vertical_band_1_2_scale_mmx -( - unsigned char *dest, - unsigned int dest_pitch, - unsigned int dest_width -) -{ - __asm - { - mov esi, dest // Get the source and destination pointer - mov ecx, dest_pitch // Get the pitch size - - mov edx, dest_width // Loop counter - - last_vs_1_2_loop: - - movq mm0, [esi] // get Src[0] - movq [esi+ecx], mm0 // write out eight bytes - - add esi, 8 - sub edx, 8 - - jg last_vs_1_2_loop - } -} - -/**************************************************************************** - * - * ROUTINE : horizontal_line_1_2_scale - * - * INPUTS : const unsigned char *source : - * unsigned int source_width : - * unsigned char *dest : - * unsigned int dest_width : - * - * OUTPUTS : None. - * - * RETURNS : void - * - * FUNCTION : 1 to 2 up-scaling of a horizontal line of pixels. - * - * SPECIAL NOTES : None. - * - ****************************************************************************/ -static -void horizontal_line_1_2_scale_mmx -( - const unsigned char *source, - unsigned int source_width, - unsigned char *dest, - unsigned int dest_width -) -{ - __declspec(align(16))unsigned short four_ones[] = { 1, 1, 1, 1}; - - (void) dest_width; - - __asm - { - mov esi, source - mov edi, dest - - pxor mm7, mm7 - movq mm6, four_ones - - mov ecx, source_width - - hs_1_2_loop: - - movq mm0, [esi] - movq mm1, [esi+1] - - movq mm2, mm0 - movq mm3, mm1 - - movq mm4, mm0 - punpcklbw mm0, mm7 - - punpcklbw mm1, mm7 - paddw mm0, mm1 - - paddw mm0, mm6 - punpckhbw mm2, mm7 - - punpckhbw mm3, mm7 - paddw mm2, mm3 - - paddw mm2, mm6 - psraw mm0, 1 - - psraw mm2, 1 - packuswb mm0, mm2 - - movq mm2, mm4 - punpcklbw mm2, mm0 - - movq [edi], mm2 - punpckhbw mm4, mm0 - - movq [edi+8], mm4 - add esi, 8 - - add edi, 16 - sub ecx, 8 - - cmp ecx, 8 - jg hs_1_2_loop - -// last eight pixel - - movq mm0, [esi] - movq mm1, mm0 - - movq mm2, mm0 - movq mm3, mm1 - - psrlq mm1, 8 - psrlq mm3, 56 - - psllq mm3, 56 - por mm1, mm3 - - movq mm3, mm1 - movq mm4, mm0 - - punpcklbw mm0, mm7 - punpcklbw mm1, mm7 - - paddw mm0, mm1 - paddw mm0, mm6 - - punpckhbw mm2, mm7 - punpckhbw mm3, mm7 - - paddw mm2, mm3 - paddw mm2, mm6 - - psraw mm0, 1 - psraw mm2, 1 - - packuswb mm0, mm2 - movq mm2, mm4 - - punpcklbw mm2, mm0 - movq [edi], mm2 - - punpckhbw mm4, mm0 - movq [edi+8], mm4 - } -} - - - - - - -/**************************************************************************** - * - * ROUTINE : horizontal_line_5_4_scale_mmx - * - * INPUTS : const unsigned char *source : Pointer to source data. - * unsigned int source_width : Stride of source. - * unsigned char *dest : Pointer to destination data. - * unsigned int dest_width : Stride of destination (NOT USED). - * - * OUTPUTS : None. - * - * RETURNS : void - * - * FUNCTION : Copies horizontal line of pixels from source to - * destination scaling up by 4 to 5. - * - * SPECIAL NOTES : None. - * - ****************************************************************************/ -static -void horizontal_line_5_4_scale_mmx -( - const unsigned char *source, - unsigned int source_width, - unsigned char *dest, - unsigned int dest_width -) -{ - - __declspec(align(16)) const unsigned short const54_2[] = { 0, 64, 128, 192 }; - __declspec(align(16)) const unsigned short const54_1[] = {256, 192, 128, 64 }; - __declspec(align(16)) unsigned short round_values[] = { 128, 128, 128, 128 }; - /* - unsigned i; - unsigned int a, b, c, d, e; - unsigned char *des = dest; - const unsigned char *src = source; - - (void) dest_width; - - for ( i=0; i>8); - des[2] = ((c*128 + d*128 + 128)>>8); - des[3] = ((d* 64 + e*192 + 128)>>8); - - src += 5; - des += 4; - } - */ - __asm - { - - mov esi, source ; - mov edi, dest ; - - mov ecx, source_width ; - movq mm5, const54_1 ; - - pxor mm7, mm7 ; - movq mm6, const54_2 ; - - movq mm4, round_values ; - lea edx, [esi+ecx] ; - horizontal_line_5_4_loop: - - movq mm0, QWORD PTR [esi] ; - 00 01 02 03 04 05 06 07 - movq mm1, mm0 ; - 00 01 02 03 04 05 06 07 - - psrlq mm0, 8 ; - 01 02 03 04 05 06 07 xx - punpcklbw mm1, mm7 ; - xx 00 xx 01 xx 02 xx 03 - - punpcklbw mm0, mm7 ; - xx 01 xx 02 xx 03 xx 04 - pmullw mm1, mm5 - - pmullw mm0, mm6 - add esi, 5 - - add edi, 4 - paddw mm1, mm0 - - paddw mm1, mm4 - psrlw mm1, 8 - - cmp esi, edx - packuswb mm1, mm7 - - movd DWORD PTR [edi-4], mm1 - - jl horizontal_line_5_4_loop - - } - -} - -static -void vertical_band_5_4_scale_mmx(unsigned char *source, unsigned int src_pitch, unsigned char *dest, unsigned int dest_pitch, unsigned int dest_width) -{ - - __declspec(align(16)) const unsigned short one_fourths[] = { 64, 64, 64, 64 }; - __declspec(align(16)) const unsigned short two_fourths[] = { 128, 128, 128, 128 }; - __declspec(align(16)) const unsigned short three_fourths[] = { 192, 192, 192, 192 }; - - __declspec(align(16)) unsigned short round_values[] = { 128, 128, 128, 128 }; - __asm - { - push ebx - - mov esi, source // Get the source and destination pointer - mov ecx, src_pitch // Get the pitch size - - mov edi, dest // tow lines below - pxor mm7, mm7 // clear out mm7 - - mov edx, dest_pitch // Loop counter - mov ebx, dest_width - - vs_5_4_loop: - - movd mm0, DWORD ptr [esi] // src[0]; - movd mm1, DWORD ptr [esi+ecx] // src[1]; - - movd mm2, DWORD ptr [esi+ecx*2] - lea eax, [esi+ecx*2] // - - punpcklbw mm1, mm7 - punpcklbw mm2, mm7 - - movq mm3, mm2 - pmullw mm1, three_fourths - - pmullw mm2, one_fourths - movd mm4, [eax+ecx] - - pmullw mm3, two_fourths - punpcklbw mm4, mm7 - - movq mm5, mm4 - pmullw mm4, two_fourths - - paddw mm1, mm2 - movd mm6, [eax+ecx*2] - - pmullw mm5, one_fourths - paddw mm1, round_values; - - paddw mm3, mm4 - psrlw mm1, 8 - - punpcklbw mm6, mm7 - paddw mm3, round_values - - pmullw mm6, three_fourths - psrlw mm3, 8 - - packuswb mm1, mm7 - packuswb mm3, mm7 - - movd DWORD PTR [edi], mm0 - movd DWORD PTR [edi+edx], mm1 - - - paddw mm5, mm6 - movd DWORD PTR [edi+edx*2], mm3 - - lea eax, [edi+edx*2] - paddw mm5, round_values - - psrlw mm5, 8 - add edi, 4 - - packuswb mm5, mm7 - movd DWORD PTR [eax+edx], mm5 - - add esi, 4 - sub ebx, 4 - - jg vs_5_4_loop - - pop ebx - } -} - - - -static -void horizontal_line_5_3_scale_mmx -( - const unsigned char *source, - unsigned int source_width, - unsigned char *dest, - unsigned int dest_width -) -{ - __declspec(align(16)) const unsigned short const53_1[] = { 0, 85, 171, 0 }; - __declspec(align(16)) const unsigned short const53_2[] = {256, 171, 85, 0 }; - __declspec(align(16)) unsigned short round_values[] = { 128, 128, 128, 128 }; - __asm - { - - mov esi, source ; - mov edi, dest ; - - mov ecx, source_width ; - movq mm5, const53_1 ; - - pxor mm7, mm7 ; - movq mm6, const53_2 ; - - movq mm4, round_values ; - lea edx, [esi+ecx-5] ; - horizontal_line_5_3_loop: - - movq mm0, QWORD PTR [esi] ; - 00 01 02 03 04 05 06 07 - movq mm1, mm0 ; - 00 01 02 03 04 05 06 07 - - psllw mm0, 8 ; - xx 00 xx 02 xx 04 xx 06 - psrlw mm1, 8 ; - 01 xx 03 xx 05 xx 07 xx - - psrlw mm0, 8 ; - 00 xx 02 xx 04 xx 06 xx - psllq mm1, 16 ; - xx xx 01 xx 03 xx 05 xx - - pmullw mm0, mm6 - - pmullw mm1, mm5 - add esi, 5 - - add edi, 3 - paddw mm1, mm0 - - paddw mm1, mm4 - psrlw mm1, 8 - - cmp esi, edx - packuswb mm1, mm7 - - movd DWORD PTR [edi-3], mm1 - jl horizontal_line_5_3_loop - -//exit condition - movq mm0, QWORD PTR [esi] ; - 00 01 02 03 04 05 06 07 - movq mm1, mm0 ; - 00 01 02 03 04 05 06 07 - - psllw mm0, 8 ; - xx 00 xx 02 xx 04 xx 06 - psrlw mm1, 8 ; - 01 xx 03 xx 05 xx 07 xx - - psrlw mm0, 8 ; - 00 xx 02 xx 04 xx 06 xx - psllq mm1, 16 ; - xx xx 01 xx 03 xx 05 xx - - pmullw mm0, mm6 - - pmullw mm1, mm5 - paddw mm1, mm0 - - paddw mm1, mm4 - psrlw mm1, 8 - - packuswb mm1, mm7 - movd eax, mm1 - - mov edx, eax - shr edx, 16 - - mov WORD PTR[edi], ax - mov BYTE PTR[edi+2], dl - - } - -} - - -static -void vertical_band_5_3_scale_mmx(unsigned char *source, unsigned int src_pitch, unsigned char *dest, unsigned int dest_pitch, unsigned int dest_width) -{ - __declspec(align(16)) unsigned short round_values[] = { 128, 128, 128, 128 }; - __declspec(align(16)) const unsigned short one_thirds[] = { 85, 85, 85, 85 }; - __declspec(align(16)) const unsigned short two_thirds[] = { 171, 171, 171, 171 }; - - __asm - { - push ebx - - mov esi, source // Get the source and destination pointer - mov ecx, src_pitch // Get the pitch size - - mov edi, dest // tow lines below - pxor mm7, mm7 // clear out mm7 - - mov edx, dest_pitch // Loop counter - movq mm5, one_thirds - - movq mm6, two_thirds - mov ebx, dest_width; - - vs_5_3_loop: - - movd mm0, DWORD ptr [esi] // src[0]; - movd mm1, DWORD ptr [esi+ecx] // src[1]; - - movd mm2, DWORD ptr [esi+ecx*2] - lea eax, [esi+ecx*2] // - - punpcklbw mm1, mm7 - punpcklbw mm2, mm7 - - pmullw mm1, mm5 - pmullw mm2, mm6 - - movd mm3, DWORD ptr [eax+ecx] - movd mm4, DWORD ptr [eax+ecx*2] - - punpcklbw mm3, mm7 - punpcklbw mm4, mm7 - - pmullw mm3, mm6 - pmullw mm4, mm5 - - - movd DWORD PTR [edi], mm0 - paddw mm1, mm2 - - paddw mm1, round_values - psrlw mm1, 8 - - packuswb mm1, mm7 - paddw mm3, mm4 - - paddw mm3, round_values - movd DWORD PTR [edi+edx], mm1 - - psrlw mm3, 8 - packuswb mm3, mm7 - - movd DWORD PTR [edi+edx*2], mm3 - - - add edi, 4 - add esi, 4 - - sub ebx, 4 - jg vs_5_3_loop - - pop ebx - } -} - - - - -/**************************************************************************** - * - * ROUTINE : horizontal_line_2_1_scale - * - * INPUTS : const unsigned char *source : - * unsigned int source_width : - * unsigned char *dest : - * unsigned int dest_width : - * - * OUTPUTS : None. - * - * RETURNS : void - * - * FUNCTION : 1 to 2 up-scaling of a horizontal line of pixels. - * - * SPECIAL NOTES : None. - * - ****************************************************************************/ -static -void horizontal_line_2_1_scale_mmx -( - const unsigned char *source, - unsigned int source_width, - unsigned char *dest, - unsigned int dest_width -) -{ - (void) dest_width; - - __asm - { - mov esi, source - mov edi, dest - - pxor mm7, mm7 - mov ecx, dest_width - - xor edx, edx - hs_2_1_loop: - - movq mm0, [esi+edx*2] - psllw mm0, 8 - - psrlw mm0, 8 - packuswb mm0, mm7 - - movd DWORD Ptr [edi+edx], mm0; - add edx, 4 - - cmp edx, ecx - jl hs_2_1_loop - - } -} - - - -static -void vertical_band_2_1_scale_mmx(unsigned char *source, unsigned int src_pitch, unsigned char *dest, unsigned int dest_pitch, unsigned int dest_width) -{ - vpx_memcpy(dest, source, dest_width); -} - - - -static -void vertical_band_2_1_scale_i_mmx(unsigned char *source, unsigned int src_pitch, unsigned char *dest, unsigned int dest_pitch, unsigned int dest_width) -{ - - __declspec(align(16)) const unsigned short three_sixteenths[] = { 48, 48, 48, 48 }; - __declspec(align(16)) const unsigned short ten_sixteenths[] = { 160, 160, 160, 160 }; - __declspec(align(16)) unsigned short round_values[] = { 128, 128, 128, 128 }; - __asm - { - mov esi, source - mov edi, dest - - mov eax, src_pitch - mov edx, dest_width - - pxor mm7, mm7 - sub esi, eax //back one line - - - lea ecx, [esi+edx]; - movq mm6, round_values; - - movq mm5, three_sixteenths; - movq mm4, ten_sixteenths; - - vs_2_1_i_loop: - movd mm0, [esi] // - movd mm1, [esi+eax] // - - movd mm2, [esi+eax*2] // - punpcklbw mm0, mm7 - - pmullw mm0, mm5 - punpcklbw mm1, mm7 - - pmullw mm1, mm4 - punpcklbw mm2, mm7 - - pmullw mm2, mm5 - paddw mm0, round_values - - paddw mm1, mm2 - paddw mm0, mm1 - - psrlw mm0, 8 - packuswb mm0, mm7 - - movd DWORD PTR [edi], mm0 - add esi, 4 - - add edi, 4; - cmp esi, ecx - jl vs_2_1_i_loop - - } -} - -void -register_mmxscalers(void) -{ - vp8_horizontal_line_1_2_scale = horizontal_line_1_2_scale_mmx; - vp8_vertical_band_1_2_scale = vertical_band_1_2_scale_mmx; - vp8_last_vertical_band_1_2_scale = last_vertical_band_1_2_scale_mmx; - vp8_horizontal_line_3_5_scale = horizontal_line_3_5_scale_mmx; - vp8_vertical_band_3_5_scale = vertical_band_3_5_scale_mmx; - vp8_last_vertical_band_3_5_scale = last_vertical_band_3_5_scale_mmx; - vp8_horizontal_line_4_5_scale = horizontal_line_4_5_scale_mmx; - vp8_vertical_band_4_5_scale = vertical_band_4_5_scale_mmx; - vp8_last_vertical_band_4_5_scale = last_vertical_band_4_5_scale_mmx; - - vp8_horizontal_line_3_4_scale = vp8cx_horizontal_line_3_4_scale_c; - vp8_vertical_band_3_4_scale = vp8cx_vertical_band_3_4_scale_c; - vp8_last_vertical_band_3_4_scale = vp8cx_last_vertical_band_3_4_scale_c; - vp8_horizontal_line_2_3_scale = vp8cx_horizontal_line_2_3_scale_c; - vp8_vertical_band_2_3_scale = vp8cx_vertical_band_2_3_scale_c; - vp8_last_vertical_band_2_3_scale = vp8cx_last_vertical_band_2_3_scale_c; - - - - vp8_vertical_band_5_4_scale = vertical_band_5_4_scale_mmx; - vp8_vertical_band_5_3_scale = vertical_band_5_3_scale_mmx; - vp8_vertical_band_2_1_scale = vertical_band_2_1_scale_mmx; - vp8_vertical_band_2_1_scale_i = vertical_band_2_1_scale_i_mmx; - vp8_horizontal_line_2_1_scale = horizontal_line_2_1_scale_mmx; - vp8_horizontal_line_5_3_scale = horizontal_line_5_3_scale_mmx; - vp8_horizontal_line_5_4_scale = horizontal_line_5_4_scale_mmx; - -} diff --git a/vpx_scale/intel_linux/scalesystemdependant.c b/vpx_scale/intel_linux/scalesystemdependant.c deleted file mode 100644 index eab741f83..000000000 --- a/vpx_scale/intel_linux/scalesystemdependant.c +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright (c) 2010 The WebM project authors. All Rights Reserved. - * - * Use of this source code is governed by a BSD-style license - * that can be found in the LICENSE file in the root of the source - * tree. An additional intellectual property rights grant can be found - * in the file PATENTS. All contributing project authors may - * be found in the AUTHORS file in the root of the source tree. - */ - - -/**************************************************************************** -* -* Module Title : system_dependant.c -* -* Description : Miscellaneous system dependant functions -* -****************************************************************************/ - -/**************************************************************************** -* Header Files -****************************************************************************/ -#include "vpx_scale/vpxscale.h" -#include "cpuidlib.h" - -/**************************************************************************** -* Imports -*****************************************************************************/ -extern void register_generic_scalers(void); -extern void register_mmxscalers(void); - -/**************************************************************************** - * - * ROUTINE : post_proc_machine_specific_config - * - * INPUTS : UINT32 Version : Codec version number. - * - * OUTPUTS : None. - * - * RETURNS : void - * - * FUNCTION : Checks for machine specifc features such as MMX support - * sets appropriate flags and function pointers. - * - * SPECIAL NOTES : None. - * - ****************************************************************************/ -void -vp8_scale_machine_specific_config(void) -{ - // If MMX supported then set to use MMX versions of functions else - // use original 'C' versions. - int mmx_enabled; - int xmm_enabled; - int wmt_enabled; - - vpx_get_processor_flags(&mmx_enabled, &xmm_enabled, &wmt_enabled); - - if (mmx_enabled || xmm_enabled || wmt_enabled) - { - register_mmxscalers(); - } - else - { - vp8_horizontal_line_1_2_scale = vp8cx_horizontal_line_1_2_scale_c; - vp8_vertical_band_1_2_scale = vp8cx_vertical_band_1_2_scale_c; - vp8_last_vertical_band_1_2_scale = vp8cx_last_vertical_band_1_2_scale_c; - vp8_horizontal_line_3_5_scale = vp8cx_horizontal_line_3_5_scale_c; - vp8_vertical_band_3_5_scale = vp8cx_vertical_band_3_5_scale_c; - vp8_last_vertical_band_3_5_scale = vp8cx_last_vertical_band_3_5_scale_c; - vp8_horizontal_line_3_4_scale = vp8cx_horizontal_line_3_4_scale_c; - vp8_vertical_band_3_4_scale = vp8cx_vertical_band_3_4_scale_c; - vp8_last_vertical_band_3_4_scale = vp8cx_last_vertical_band_3_4_scale_c; - vp8_horizontal_line_2_3_scale = vp8cx_horizontal_line_2_3_scale_c; - vp8_vertical_band_2_3_scale = vp8cx_vertical_band_2_3_scale_c; - vp8_last_vertical_band_2_3_scale = vp8cx_last_vertical_band_2_3_scale_c; - vp8_horizontal_line_4_5_scale = vp8cx_horizontal_line_4_5_scale_c; - vp8_vertical_band_4_5_scale = vp8cx_vertical_band_4_5_scale_c; - vp8_last_vertical_band_4_5_scale = vp8cx_last_vertical_band_4_5_scale_c; - - - vp8_vertical_band_5_4_scale = vp8cx_vertical_band_5_4_scale_c; - vp8_vertical_band_5_3_scale = vp8cx_vertical_band_5_3_scale_c; - vp8_vertical_band_2_1_scale = vp8cx_vertical_band_2_1_scale_c; - vp8_vertical_band_2_1_scale_i = vp8cx_vertical_band_2_1_scale_i_c; - vp8_horizontal_line_2_1_scale = vp8cx_horizontal_line_2_1_scale_c; - vp8_horizontal_line_5_3_scale = vp8cx_horizontal_line_5_3_scale_c; - vp8_horizontal_line_5_4_scale = vp8cx_horizontal_line_5_4_scale_c; - - } -} diff --git a/vpx_scale/leapster/doptsystemdependant_lf.c b/vpx_scale/leapster/doptsystemdependant_lf.c deleted file mode 100644 index 7cbb1c555..000000000 --- a/vpx_scale/leapster/doptsystemdependant_lf.c +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright (c) 2010 The WebM project authors. All Rights Reserved. - * - * Use of this source code is governed by a BSD-style license - * that can be found in the LICENSE file in the root of the source - * tree. An additional intellectual property rights grant can be found - * in the file PATENTS. All contributing project authors may - * be found in the AUTHORS file in the root of the source tree. - */ - - -/**************************************************************************** -* -* Module Title : system_dependant.c -* -* Description : Miscellaneous system dependant functions -* -****************************************************************************/ - -/**************************************************************************** -* Header Files -****************************************************************************/ -#include "vpx_scale/vpxscale.h" - -/**************************************************************************** -* Imports -*****************************************************************************/ -extern int register_generic_scalers(void); -extern int de_register_generic_scalers(void); - -/**************************************************************************** - * - * ROUTINE : vp8_scale_machine_specific_config - * - * INPUTS : UINT32 Version : Codec version number. - * - * OUTPUTS : None. - * - * RETURNS : int - * - * FUNCTION : Checks for machine specifc features such as MMX support - * sets appropriate flags and function pointers. - * - * SPECIAL NOTES : None. - * - ****************************************************************************/ -int -vp8_scale_machine_specific_config() -{ - return register_generic_scalers(); -} - -/**************************************************************************** - * - * ROUTINE : vp8_scale_machine_specific_config - * - * INPUTS : UINT32 Version : Codec version number. - * - * OUTPUTS : None. - * - * RETURNS : int - * - * FUNCTION : Resets the funtion pointers and deallocates memory. - * - * SPECIAL NOTES : None. - * - ****************************************************************************/ -int -scale_machine_specific_de_config() -{ - return de_register_generic_scalers(); -} diff --git a/vpx_scale/leapster/gen_scalers_lf.c b/vpx_scale/leapster/gen_scalers_lf.c deleted file mode 100644 index f1ee056ea..000000000 --- a/vpx_scale/leapster/gen_scalers_lf.c +++ /dev/null @@ -1,522 +0,0 @@ -/* - * Copyright (c) 2010 The WebM project authors. All Rights Reserved. - * - * Use of this source code is governed by a BSD-style license - * that can be found in the LICENSE file in the root of the source - * tree. An additional intellectual property rights grant can be found - * in the file PATENTS. All contributing project authors may - * be found in the AUTHORS file in the root of the source tree. - */ - - -/**************************************************************************** - * - * Module Title : gen_scalers.c - * - * Description : Generic image scaling functions. - * - ***************************************************************************/ - -/**************************************************************************** -* Header Files -****************************************************************************/ -#include "vpx_scale/vpxscale.h" - -/**************************************************************************** -* Imports -****************************************************************************/ - -/**************************************************************************** - * - * ROUTINE : vp8cx_horizontal_line_4_5_scale_c - * - * INPUTS : const unsigned char *source : Pointer to source data. - * unsigned int source_width : Stride of source. - * unsigned char *dest : Pointer to destination data. - * unsigned int dest_width : Stride of destination (NOT USED). - * - * OUTPUTS : None. - * - * RETURNS : void - * - * FUNCTION : Copies horizontal line of pixels from source to - * destination scaling up by 4 to 5. - * - * SPECIAL NOTES : None. - * - ****************************************************************************/ -static -void vp8cx_horizontal_line_4_5_scale_c -( - const unsigned char *source, - unsigned int source_width, - unsigned char *dest, - unsigned int dest_width -) -{ - unsigned i; - unsigned int a, b, c; - unsigned char *des = dest; - const unsigned char *src = source; - - (void) dest_width; - - for (i = 0; i < source_width - 4; i += 4) - { - a = src[0]; - b = src[1]; - des [0] = (unsigned char) a; - des [1] = (unsigned char)((a * 51 + 205 * b + 128) >> 8); - c = src[2] * 154; - a = src[3]; - des [2] = (unsigned char)((b * 102 + c + 128) >> 8); - des [3] = (unsigned char)((c + 102 * a + 128) >> 8); - b = src[4]; - des [4] = (unsigned char)((a * 205 + 51 * b + 128) >> 8); - - src += 4; - des += 5; - } - - a = src[0]; - b = src[1]; - des [0] = (unsigned char)(a); - des [1] = (unsigned char)((a * 51 + 205 * b + 128) >> 8); - c = src[2] * 154; - a = src[3]; - des [2] = (unsigned char)((b * 102 + c + 128) >> 8); - des [3] = (unsigned char)((c + 102 * a + 128) >> 8); - des [4] = (unsigned char)(a); - -} - -/**************************************************************************** - * - * ROUTINE : vp8cx_vertical_band_4_5_scale_c - * - * INPUTS : unsigned char *dest : Pointer to destination data. - * unsigned int dest_pitch : Stride of destination data. - * unsigned int dest_width : Width of destination data. - * - * OUTPUTS : None. - * - * RETURNS : void - * - * FUNCTION : Scales vertical band of pixels by scale 4 to 5. The - * height of the band scaled is 4-pixels. - * - * SPECIAL NOTES : The routine uses the first line of the band below - * the current band. - * - ****************************************************************************/ -static -void vp8cx_vertical_band_4_5_scale_c(unsigned char *dest, unsigned int dest_pitch, unsigned int dest_width) -{ - unsigned int i; - unsigned int a, b, c, d; - unsigned char *des = dest; - - for (i = 0; i < dest_width; i++) - { - a = des [0]; - b = des [dest_pitch]; - - des[dest_pitch] = (unsigned char)((a * 51 + 205 * b + 128) >> 8); - - c = des[dest_pitch*2] * 154; - d = des[dest_pitch*3]; - - des [dest_pitch*2] = (unsigned char)((b * 102 + c + 128) >> 8); - des [dest_pitch*3] = (unsigned char)((c + 102 * d + 128) >> 8); - - // First line in next band - a = des [dest_pitch * 5]; - des [dest_pitch * 4] = (unsigned char)((d * 205 + 51 * a + 128) >> 8); - - des ++; - } -} - -/**************************************************************************** - * - * ROUTINE : vp8cx_last_vertical_band_4_5_scale_c - * - * INPUTS : unsigned char *dest : Pointer to destination data. - * unsigned int dest_pitch : Stride of destination data. - * unsigned int dest_width : Width of destination data. - * - * OUTPUTS : None. - * - * RETURNS : void - * - * FUNCTION : Scales last vertical band of pixels by scale 4 to 5. The - * height of the band scaled is 4-pixels. - * - * SPECIAL NOTES : The routine does not have available the first line of - * the band below the current band, since this is the - * last band. - * - ****************************************************************************/ -static -void vp8cx_last_vertical_band_4_5_scale_c(unsigned char *dest, unsigned int dest_pitch, unsigned int dest_width) -{ - unsigned int i; - unsigned int a, b, c, d; - unsigned char *des = dest; - - for (i = 0; i < dest_width; ++i) - { - a = des[0]; - b = des[dest_pitch]; - - des[dest_pitch] = (unsigned char)((a * 51 + 205 * b + 128) >> 8); - - c = des[dest_pitch*2] * 154; - d = des[dest_pitch*3]; - - des [dest_pitch*2] = (unsigned char)((b * 102 + c + 128) >> 8); - des [dest_pitch*3] = (unsigned char)((c + 102 * d + 128) >> 8); - - // No other line for interplation of this line, so .. - des[dest_pitch*4] = (unsigned char) d; - - des++; - } -} - -/**************************************************************************** - * - * ROUTINE : vp8cx_horizontal_line_3_5_scale_c - * - * INPUTS : const unsigned char *source : Pointer to source data. - * unsigned int source_width : Stride of source. - * unsigned char *dest : Pointer to destination data. - * unsigned int dest_width : Stride of destination (NOT USED). - * - * OUTPUTS : None. - * - * RETURNS : void - * - * FUNCTION : Copies horizontal line of pixels from source to - * destination scaling up by 3 to 5. - * - * SPECIAL NOTES : None. - * - * - ****************************************************************************/ -static -void vp8cx_horizontal_line_3_5_scale_c -( - const unsigned char *source, - unsigned int source_width, - unsigned char *dest, - unsigned int dest_width -) -{ - unsigned int i; - unsigned int a, b, c; - unsigned char *des = dest; - const unsigned char *src = source; - - (void) dest_width; - - for (i = 0; i < source_width - 3; i += 3) - { - a = src[0]; - b = src[1]; - des [0] = (unsigned char)(a); - des [1] = (unsigned char)((a * 102 + 154 * b + 128) >> 8); - - c = src[2] ; - des [2] = (unsigned char)((b * 205 + c * 51 + 128) >> 8); - des [3] = (unsigned char)((b * 51 + c * 205 + 128) >> 8); - - a = src[3]; - des [4] = (unsigned char)((c * 154 + a * 102 + 128) >> 8); - - src += 3; - des += 5; - } - - a = src[0]; - b = src[1]; - des [0] = (unsigned char)(a); - - des [1] = (unsigned char)((a * 102 + 154 * b + 128) >> 8); - c = src[2] ; - des [2] = (unsigned char)((b * 205 + c * 51 + 128) >> 8); - des [3] = (unsigned char)((b * 51 + c * 205 + 128) >> 8); - - des [4] = (unsigned char)(c); -} - -/**************************************************************************** - * - * ROUTINE : vp8cx_vertical_band_3_5_scale_c - * - * INPUTS : unsigned char *dest : Pointer to destination data. - * unsigned int dest_pitch : Stride of destination data. - * unsigned int dest_width : Width of destination data. - * - * OUTPUTS : None. - * - * RETURNS : void - * - * FUNCTION : Scales vertical band of pixels by scale 3 to 5. The - * height of the band scaled is 3-pixels. - * - * SPECIAL NOTES : The routine uses the first line of the band below - * the current band. - * - ****************************************************************************/ -static -void vp8cx_vertical_band_3_5_scale_c(unsigned char *dest, unsigned int dest_pitch, unsigned int dest_width) -{ - unsigned int i; - unsigned int a, b, c; - unsigned char *des = dest; - - for (i = 0; i < dest_width; i++) - { - a = des [0]; - b = des [dest_pitch]; - des [dest_pitch] = (unsigned char)((a * 102 + 154 * b + 128) >> 8); - - c = des[dest_pitch*2]; - des [dest_pitch*2] = (unsigned char)((b * 205 + c * 51 + 128) >> 8); - des [dest_pitch*3] = (unsigned char)((b * 51 + c * 205 + 128) >> 8); - - // First line in next band... - a = des [dest_pitch * 5]; - des [dest_pitch * 4] = (unsigned char)((c * 154 + a * 102 + 128) >> 8); - - des++; - } -} - -/**************************************************************************** - * - * ROUTINE : vp8cx_last_vertical_band_3_5_scale_c - * - * INPUTS : unsigned char *dest : Pointer to destination data. - * unsigned int dest_pitch : Stride of destination data. - * unsigned int dest_width : Width of destination data. - * - * OUTPUTS : None. - * - * RETURNS : void - * - * FUNCTION : Scales last vertical band of pixels by scale 3 to 5. The - * height of the band scaled is 3-pixels. - * - * SPECIAL NOTES : The routine does not have available the first line of - * the band below the current band, since this is the - * last band. - * - ****************************************************************************/ -static -void vp8cx_last_vertical_band_3_5_scale_c(unsigned char *dest, unsigned int dest_pitch, unsigned int dest_width) -{ - unsigned int i; - unsigned int a, b, c; - unsigned char *des = dest; - - for (i = 0; i < dest_width; ++i) - { - a = des [0]; - b = des [dest_pitch]; - - des [ dest_pitch ] = (unsigned char)((a * 102 + 154 * b + 128) >> 8); - - c = des[dest_pitch*2]; - des [dest_pitch*2] = (unsigned char)((b * 205 + c * 51 + 128) >> 8); - des [dest_pitch*3] = (unsigned char)((b * 51 + c * 205 + 128) >> 8); - - // No other line for interplation of this line, so .. - des [ dest_pitch * 4 ] = (unsigned char)(c) ; - - des++; - } -} - -/**************************************************************************** - * - * ROUTINE : vp8cx_horizontal_line_1_2_scale_c - * - * INPUTS : const unsigned char *source : Pointer to source data. - * unsigned int source_width : Stride of source. - * unsigned char *dest : Pointer to destination data. - * unsigned int dest_width : Stride of destination (NOT USED). - * - * OUTPUTS : None. - * - * RETURNS : void - * - * FUNCTION : Copies horizontal line of pixels from source to - * destination scaling up by 1 to 2. - * - * SPECIAL NOTES : None. - * - ****************************************************************************/ -static -void vp8cx_horizontal_line_1_2_scale_c -( - const unsigned char *source, - unsigned int source_width, - unsigned char *dest, - unsigned int dest_width -) -{ - unsigned int i; - unsigned int a, b; - unsigned char *des = dest; - const unsigned char *src = source; - - (void) dest_width; - - for (i = 0; i < source_width - 1; i += 1) - { - a = src[0]; - b = src[1]; - des [0] = (unsigned char)(a); - des [1] = (unsigned char)((a + b + 1) >> 1); - src += 1; - des += 2; - } - - a = src[0]; - des [0] = (unsigned char)(a); - des [1] = (unsigned char)(a); -} - -/**************************************************************************** - * - * ROUTINE : vp8cx_vertical_band_1_2_scale_c - * - * INPUTS : unsigned char *dest : Pointer to destination data. - * unsigned int dest_pitch : Stride of destination data. - * unsigned int dest_width : Width of destination data. - * - * OUTPUTS : None. - * - * RETURNS : void - * - * FUNCTION : Scales vertical band of pixels by scale 1 to 2. The - * height of the band scaled is 1-pixel. - * - * SPECIAL NOTES : The routine uses the first line of the band below - * the current band. - * - ****************************************************************************/ -static -void vp8cx_vertical_band_1_2_scale_c(unsigned char *dest, unsigned int dest_pitch, unsigned int dest_width) -{ - unsigned int i; - unsigned int a, b; - unsigned char *des = dest; - - for (i = 0; i < dest_width; i++) - { - a = des [0]; - b = des [dest_pitch * 2]; - - des[dest_pitch] = (unsigned char)((a + b + 1) >> 1); - - des++; - } -} - -/**************************************************************************** - * - * ROUTINE : vp8cx_last_vertical_band_1_2_scale_c - * - * INPUTS : unsigned char *dest : Pointer to destination data. - * unsigned int dest_pitch : Stride of destination data. - * unsigned int dest_width : Width of destination data. - * - * OUTPUTS : None. - * - * RETURNS : void - * - * FUNCTION : Scales last vertical band of pixels by scale 1 to 2. The - * height of the band scaled is 1-pixel. - * - * SPECIAL NOTES : The routine does not have available the first line of - * the band below the current band, since this is the - * last band. - * - ****************************************************************************/ -static -void vp8cx_last_vertical_band_1_2_scale_c(unsigned char *dest, unsigned int dest_pitch, unsigned int dest_width) -{ - unsigned int i; - unsigned char *des = dest; - - for (i = 0; i < dest_width; ++i) - { - des[dest_pitch] = des[0]; - des++; - } -} - -#include "vpx_scale/vpxscale.h" -#include "vpx_mem/vpx_mem.h" - -struct vpxglobal_scalling_ptrs_t *g_scaling_ptrs = 0; - -int -register_generic_scalers(void) -{ - int rv = 0; - - g_scaling_ptrs = (struct vpxglobal_scalling_ptrs_t *)vpx_malloc(sizeof(struct vpxglobal_scalling_ptrs_t)); - - if (g_scaling_ptrs) - { - g_scaling_ptrs->vpxhorizontal_line_1_2_scale_t = vp8cx_horizontal_line_1_2_scale_c; - g_scaling_ptrs->vpxvertical_band_1_2_scale_t = vp8cx_vertical_band_1_2_scale_c; - g_scaling_ptrs->vpxlast_vertical_band_1_2_scale_t = vp8cx_last_vertical_band_1_2_scale_c; - g_scaling_ptrs->vpxhorizontal_line_3_5_scale_t = vp8cx_horizontal_line_3_5_scale_c; - g_scaling_ptrs->vpxvertical_band_3_5_scale_t = vp8cx_vertical_band_3_5_scale_c; - g_scaling_ptrs->vpxlast_vertical_band_3_5_scale_t = vp8cx_last_vertical_band_3_5_scale_c; - g_scaling_ptrs->vpxhorizontal_line_4_5_scale_t = vp8cx_horizontal_line_4_5_scale_c; - g_scaling_ptrs->vpxvertical_band_4_5_scale_t = vp8cx_vertical_band_4_5_scale_c; - g_scaling_ptrs->vpxlast_vertical_band_4_5_scale_t = vp8cx_last_vertical_band_4_5_scale_c; - } - else - { - rv = -1; - } - - /* - vp8_horizontal_line_1_2_scale = vp8cx_horizontal_line_1_2_scale_c; - vp8_vertical_band_1_2_scale = vp8cx_vertical_band_1_2_scale_c; - vp8_last_vertical_band_1_2_scale = vp8cx_last_vertical_band_1_2_scale_c; - vp8_horizontal_line_3_5_scale = vp8cx_horizontal_line_3_5_scale_c; - vp8_vertical_band_3_5_scale = vp8cx_vertical_band_3_5_scale_c; - vp8_last_vertical_band_3_5_scale = vp8cx_last_vertical_band_3_5_scale_c; - vp8_horizontal_line_4_5_scale = vp8cx_horizontal_line_4_5_scale_c; - vp8_vertical_band_4_5_scale = vp8cx_vertical_band_4_5_scale_c; - vp8_last_vertical_band_4_5_scale = vp8cx_last_vertical_band_4_5_scale_c; - */ - - return rv; -} - -int -de_register_generic_scalers(void) -{ - int rv = 0; - - if (g_scaling_ptrs) - { - vpx_free(g_scaling_ptrs); - g_scaling_ptrs = 0; - } - else - { - rv = -1; - } - - return rv; -} diff --git a/vpx_scale/leapster/vpxscale_lf.c b/vpx_scale/leapster/vpxscale_lf.c deleted file mode 100644 index 616ddf559..000000000 --- a/vpx_scale/leapster/vpxscale_lf.c +++ /dev/null @@ -1,891 +0,0 @@ -/* - * Copyright (c) 2010 The WebM project authors. All Rights Reserved. - * - * Use of this source code is governed by a BSD-style license - * that can be found in the LICENSE file in the root of the source - * tree. An additional intellectual property rights grant can be found - * in the file PATENTS. All contributing project authors may - * be found in the AUTHORS file in the root of the source tree. - */ - - -/**************************************************************************** - * - * Module Title : scale.c - * - * Description : Image scaling functions. - * - ***************************************************************************/ - -/**************************************************************************** -* Header Files -****************************************************************************/ -#include "stdlib.h" -#include "vpx_scale/vpxscale.h" -#include "vpx_mem/vpx_mem.h" -#include "vpx_scale/yv12config.h" -#include "codec_common_interface.h" - -/**************************************************************************** -* Exports -****************************************************************************/ -/* -void (*vp8_vertical_band_4_5_scale)(unsigned char * dest,unsigned int dest_pitch,unsigned int dest_width); -void (*vp8_last_vertical_band_4_5_scale)(unsigned char * dest,unsigned int dest_pitch,unsigned int dest_width); -void (*vp8_vertical_band_3_5_scale)(unsigned char * dest,unsigned int dest_pitch,unsigned int dest_width); -void (*vp8_last_vertical_band_3_5_scale)(unsigned char * dest,unsigned int dest_pitch,unsigned int dest_width); -void (*vp8_horizontal_line_1_2_scale)(const unsigned char * source,unsigned int source_width,unsigned char * dest,unsigned int dest_width); -void (*vp8_horizontal_line_3_5_scale)(const unsigned char * source,unsigned int source_width,unsigned char * dest,unsigned int dest_width); -void (*vp8_horizontal_line_4_5_scale)(const unsigned char * source,unsigned int source_width,unsigned char * dest,unsigned int dest_width); -void (*vp8_vertical_band_1_2_scale)(unsigned char * dest,unsigned int dest_pitch,unsigned int dest_width); -void (*vp8_last_vertical_band_1_2_scale)(unsigned char * dest,unsigned int dest_pitch,unsigned int dest_width); -*/ - - -typedef struct -{ - int expanded_frame_width; - int expanded_frame_height; - - int HScale; - int HRatio; - int VScale; - int VRatio; - - YV12_BUFFER_CONFIG *src_yuv_config; - YV12_BUFFER_CONFIG *dst_yuv_config; - -} SCALE_VARS; - - -/**************************************************************************** - * - * ROUTINE : horizontal_line_copy - * - * INPUTS : None - * - * - * OUTPUTS : None. - * - * RETURNS : None - * - * FUNCTION : 1 to 1 scaling up for a horizontal line of pixles - * - * SPECIAL NOTES : None. - * - * ERRORS : None. - * - ****************************************************************************/ -static -void horizontal_line_copy( - const unsigned char *source, - unsigned int source_width, - unsigned char *dest, - unsigned int dest_width -) -{ - duck_memcpy(dest, source, source_width); -} -/**************************************************************************** - * - * ROUTINE : null_scale - * - * INPUTS : None - * - * - * OUTPUTS : None. - * - * RETURNS : None - * - * FUNCTION : 1 to 1 scaling up for a vertical band - * - * SPECIAL NOTES : None. - * - * ERRORS : None. - * - ****************************************************************************/ -static -void null_scale( - unsigned char *dest, - unsigned int dest_pitch, - unsigned int dest_width -) -{ - return; -} - -/**************************************************************************** - * - * ROUTINE : scale1d_2t1_i - * - * INPUTS : const unsigned char *source : Pointer to data to be scaled. - * int source_step : Number of pixels to step on in source. - * unsigned int source_scale : Scale for source (UNUSED). - * unsigned int source_length : Length of source (UNUSED). - * unsigned char *dest : Pointer to output data array. - * int dest_step : Number of pixels to step on in destination. - * unsigned int dest_scale : Scale for destination (UNUSED). - * unsigned int dest_length : Length of destination. - * - * OUTPUTS : None. - * - * RETURNS : void - * - * FUNCTION : Performs 2-to-1 interpolated scaling. - * - * SPECIAL NOTES : None. - * - ****************************************************************************/ -static -void scale1d_2t1_i -( - const unsigned char *source, - int source_step, - unsigned int source_scale, - unsigned int source_length, - unsigned char *dest, - int dest_step, - unsigned int dest_scale, - unsigned int dest_length -) -{ - unsigned int i, j; - unsigned int temp; - - (void) source_length; - (void) source_scale; - (void) dest_scale; - - source_step *= 2; - dest[0] = source[0]; - - for (i = dest_step, j = source_step; i < dest_length * dest_step; i += dest_step, j += source_step) - { - temp = 8; - temp += 3 * source[j-source_step]; - temp += 10 * source[j]; - temp += 3 * source[j+source_step]; - temp >>= 4; - dest[i] = (char)(temp); - } -} - -/**************************************************************************** - * - * ROUTINE : scale1d_2t1_ps - * - * INPUTS : const unsigned char *source : Pointer to data to be scaled. - * int source_step : Number of pixels to step on in source. - * unsigned int source_scale : Scale for source (UNUSED). - * unsigned int source_length : Length of source (UNUSED). - * unsigned char *dest : Pointer to output data array. - * int dest_step : Number of pixels to step on in destination. - * unsigned int dest_scale : Scale for destination (UNUSED). - * unsigned int dest_length : Length of destination. - * - * OUTPUTS : None. - * - * RETURNS : void - * - * FUNCTION : Performs 2-to-1 point subsampled scaling. - * - * SPECIAL NOTES : None. - * - ****************************************************************************/ -static -void scale1d_2t1_ps -( - const unsigned char *source, - int source_step, - unsigned int source_scale, - unsigned int source_length, - unsigned char *dest, - int dest_step, - unsigned int dest_scale, - unsigned int dest_length -) -{ - unsigned int i, j; - - (void) source_length; - (void) source_scale; - (void) dest_scale; - - source_step *= 2; - j = 0; - - for (i = 0; i < dest_length * dest_step; i += dest_step, j += source_step) - dest[i] = source[j]; -} -/**************************************************************************** - * - * ROUTINE : scale1d_c - * - * INPUTS : const unsigned char *source : Pointer to data to be scaled. - * int source_step : Number of pixels to step on in source. - * unsigned int source_scale : Scale for source. - * unsigned int source_length : Length of source (UNUSED). - * unsigned char *dest : Pointer to output data array. - * int dest_step : Number of pixels to step on in destination. - * unsigned int dest_scale : Scale for destination. - * unsigned int dest_length : Length of destination. - * - * OUTPUTS : None. - * - * RETURNS : void - * - * FUNCTION : Performs linear interpolation in one dimension. - * - * SPECIAL NOTES : None. - * - ****************************************************************************/ -static -void scale1d_c -( - const unsigned char *source, - int source_step, - unsigned int source_scale, - unsigned int source_length, - unsigned char *dest, - int dest_step, - unsigned int dest_scale, - unsigned int dest_length -) -{ - unsigned int i; - unsigned int round_value = dest_scale / 2; - unsigned int left_modifier = dest_scale; - unsigned int right_modifier = 0; - unsigned char left_pixel = *source; - unsigned char right_pixel = *(source + source_step); - - (void) source_length; - - // These asserts are needed if there are boundary issues... - //assert ( dest_scale > source_scale ); - //assert ( (source_length-1) * dest_scale >= (dest_length-1) * source_scale ); - - for (i = 0; i < dest_length * dest_step; i += dest_step) - { - dest[i] = (char)((left_modifier * left_pixel + right_modifier * right_pixel + round_value) / dest_scale); - - right_modifier += source_scale; - - while (right_modifier > dest_scale) - { - right_modifier -= dest_scale; - source += source_step; - left_pixel = *source; - right_pixel = *(source + source_step); - } - - left_modifier = dest_scale - right_modifier; - } -} - -/**************************************************************************** - * - * ROUTINE : Scale2D - * - * INPUTS : const unsigned char *source : Pointer to data to be scaled. - * int source_pitch : Stride of source image. - * unsigned int source_width : Width of input image. - * unsigned int source_height : Height of input image. - * unsigned char *dest : Pointer to output data array. - * int dest_pitch : Stride of destination image. - * unsigned int dest_width : Width of destination image. - * unsigned int dest_height : Height of destination image. - * unsigned char *temp_area : Pointer to temp work area. - * unsigned char temp_area_height : Height of temp work area. - * unsigned int hscale : Horizontal scale factor numerator. - * unsigned int hratio : Horizontal scale factor denominator. - * unsigned int vscale : Vertical scale factor numerator. - * unsigned int vratio : Vertical scale factor denominator. - * unsigned int interlaced : Interlace flag. - * - * OUTPUTS : None. - * - * RETURNS : void - * - * FUNCTION : Performs 2-tap linear interpolation in two dimensions. - * - * SPECIAL NOTES : Expansion is performed one band at a time to help with - * caching. - * - ****************************************************************************/ -static -void Scale2D -( - const unsigned char *source, - int source_pitch, - unsigned int source_width, - unsigned int source_height, - unsigned char *dest, - int dest_pitch, - unsigned int dest_width, - unsigned int dest_height, - unsigned char *temp_area, - unsigned char temp_area_height, - unsigned int hscale, - unsigned int hratio, - unsigned int vscale, - unsigned int vratio, - unsigned int interlaced -) -{ - unsigned int i, j, k; - unsigned int bands; - unsigned int dest_band_height; - unsigned int source_band_height; - - typedef void (*Scale1D)(const unsigned char * source, int source_step, unsigned int source_scale, unsigned int source_length, - unsigned char * dest, int dest_step, unsigned int dest_scale, unsigned int dest_length); - - Scale1D Scale1Dv = scale1d_c; - Scale1D Scale1Dh = scale1d_c; - - if (hscale == 2 && hratio == 1) - Scale1Dh = scale1d_2t1_ps; - - if (vscale == 2 && vratio == 1) - { - if (interlaced) - Scale1Dv = scale1d_2t1_ps; - else - Scale1Dv = scale1d_2t1_i; - } - - if (source_height == dest_height) - { - // for each band of the image - for (k = 0; k < dest_height; k++) - { - Scale1Dh(source, 1, hscale, source_width + 1, dest, 1, hratio, dest_width); - source += source_pitch; - dest += dest_pitch; - } - - return; - } - - if (dest_height > source_height) - { - dest_band_height = temp_area_height - 1; - source_band_height = dest_band_height * source_height / dest_height; - } - else - { - source_band_height = temp_area_height - 1; - dest_band_height = source_band_height * vratio / vscale; - } - - // first row needs to be done so that we can stay one row ahead for vertical zoom - Scale1Dh(source, 1, hscale, source_width + 1, temp_area, 1, hratio, dest_width); - - // for each band of the image - bands = (dest_height + dest_band_height - 1) / dest_band_height; - - for (k = 0; k < bands; k++) - { - // scale one band horizontally - for (i = 1; i < source_band_height + 1; i++) - { - if (k * source_band_height + i < source_height) - { - Scale1Dh(source + i * source_pitch, 1, hscale, source_width + 1, - temp_area + i * dest_pitch, 1, hratio, dest_width); - } - else // Duplicate the last row - { - // copy temp_area row 0 over from last row in the past - duck_memcpy(temp_area + i * dest_pitch, temp_area + (i - 1)*dest_pitch, dest_pitch); - } - } - - // scale one band vertically - for (j = 0; j < dest_width; j++) - { - Scale1Dv(&temp_area[j], dest_pitch, vscale, source_band_height + 1, - &dest[j], dest_pitch, vratio, dest_band_height); - } - - // copy temp_area row 0 over from last row in the past - duck_memcpy(temp_area, temp_area + source_band_height * dest_pitch, dest_pitch); - - // move to the next band - source += source_band_height * source_pitch; - dest += dest_band_height * dest_pitch; - } -} - -/**************************************************************************** - * - * ROUTINE : vp8_scale_frame - * - * INPUTS : YV12_BUFFER_CONFIG *src : Pointer to frame to be scaled. - * YV12_BUFFER_CONFIG *dst : Pointer to buffer to hold scaled frame. - * unsigned char *temp_area : Pointer to temp work area. - * unsigned char temp_area_height : Height of temp work area. - * unsigned int hscale : Horizontal scale factor numerator. - * unsigned int hratio : Horizontal scale factor denominator. - * unsigned int vscale : Vertical scale factor numerator. - * unsigned int vratio : Vertical scale factor denominator. - * unsigned int interlaced : Interlace flag. - * - * OUTPUTS : None. - * - * RETURNS : void - * - * FUNCTION : Performs 2-tap linear interpolation in two dimensions. - * - * SPECIAL NOTES : Expansion is performed one band at a time to help with - * caching. - * - ****************************************************************************/ -void vp8_scale_frame -( - YV12_BUFFER_CONFIG *src, - YV12_BUFFER_CONFIG *dst, - unsigned char *temp_area, - unsigned char temp_height, - unsigned int hscale, - unsigned int hratio, - unsigned int vscale, - unsigned int vratio, - unsigned int interlaced -) -{ - int i; - int dw = (hscale - 1 + src->y_width * hratio) / hscale; - int dh = (vscale - 1 + src->y_height * vratio) / vscale; - - // call our internal scaling routines!! - Scale2D((unsigned char *) src->y_buffer, src->y_stride, src->y_width, src->y_height, - (unsigned char *) dst->y_buffer, dst->y_stride, dw, dh, - temp_area, temp_height, hscale, hratio, vscale, vratio, interlaced); - - if (dw < (int)dst->y_width) - for (i = 0; i < dh; i++) - duck_memset(dst->y_buffer + i * dst->y_stride + dw - 1, dst->y_buffer[i*dst->y_stride+dw-2], dst->y_width - dw + 1); - - if (dh < (int)dst->y_height) - for (i = dh - 1; i < (int)dst->y_height; i++) - duck_memcpy(dst->y_buffer + i * dst->y_stride, dst->y_buffer + (dh - 2) * dst->y_stride, dst->y_width + 1); - - Scale2D((unsigned char *) src->u_buffer, src->uv_stride, src->uv_width, src->uv_height, - (unsigned char *) dst->u_buffer, dst->uv_stride, dw / 2, dh / 2, - temp_area, temp_height, hscale, hratio, vscale, vratio, interlaced); - - if (dw / 2 < (int)dst->uv_width) - for (i = 0; i < dst->uv_height; i++) - duck_memset(dst->u_buffer + i * dst->uv_stride + dw / 2 - 1, dst->u_buffer[i*dst->uv_stride+dw/2-2], dst->uv_width - dw / 2 + 1); - - if (dh / 2 < (int)dst->uv_height) - for (i = dh / 2 - 1; i < (int)dst->y_height / 2; i++) - duck_memcpy(dst->u_buffer + i * dst->uv_stride, dst->u_buffer + (dh / 2 - 2)*dst->uv_stride, dst->uv_width); - - Scale2D((unsigned char *) src->v_buffer, src->uv_stride, src->uv_width, src->uv_height, - (unsigned char *) dst->v_buffer, dst->uv_stride, dw / 2, dh / 2, - temp_area, temp_height, hscale, hratio, vscale, vratio, interlaced); - - if (dw / 2 < (int)dst->uv_width) - for (i = 0; i < dst->uv_height; i++) - duck_memset(dst->v_buffer + i * dst->uv_stride + dw / 2 - 1, dst->v_buffer[i*dst->uv_stride+dw/2-2], dst->uv_width - dw / 2 + 1); - - if (dh / 2 < (int) dst->uv_height) - for (i = dh / 2 - 1; i < (int)dst->y_height / 2; i++) - duck_memcpy(dst->v_buffer + i * dst->uv_stride, dst->v_buffer + (dh / 2 - 2)*dst->uv_stride, dst->uv_width); -} -/**************************************************************************** - * - * ROUTINE : any_ratio_2d_scale - * - * INPUTS : SCALE_INSTANCE *si : Pointer to post-processor instance (NOT USED). - * const unsigned char *source : Pointer to source image. - * unsigned int source_pitch : Stride of source image. - * unsigned int source_width : Width of source image. - * unsigned int source_height : Height of source image (NOT USED). - * unsigned char *dest : Pointer to destination image. - * unsigned int dest_pitch : Stride of destination image. - * unsigned int dest_width : Width of destination image. - * unsigned int dest_height : Height of destination image. - * - * OUTPUTS : None. - * - * RETURNS : int: 1 if image scaled, 0 if image could not be scaled. - * - * FUNCTION : Scale the image with changing apect ratio. - * - * SPECIAL NOTES : This scaling is a bi-linear scaling. Need to re-work the - * whole function for new scaling algorithm. - * - ****************************************************************************/ -static -int any_ratio_2d_scale -( - SCALE_VARS *si, - const unsigned char *source, - unsigned int source_pitch, - unsigned int source_width, - unsigned int source_height, - unsigned char *dest, - unsigned int dest_pitch, - unsigned int dest_width, - unsigned int dest_height -) -{ - unsigned int i, k; - unsigned int src_band_height = 0; - unsigned int dest_band_height = 0; - - // suggested scale factors - int hs = si->HScale; - int hr = si->HRatio; - int vs = si->VScale; - int vr = si->VRatio; - - // assume the ratios are scalable instead of should be centered - int ratio_scalable = 1; - - void (*horiz_line_scale)(const unsigned char *, unsigned int, unsigned char *, unsigned int) = NULL; - void (*vert_band_scale)(unsigned char *, unsigned int, unsigned int) = NULL; - void (*last_vert_band_scale)(unsigned char *, unsigned int, unsigned int) = NULL; - - (void) si; - - // find out the ratio for each direction - switch (hr * 10 / hs) - { - case 8: - // 4-5 Scale in Width direction - horiz_line_scale = g_scaling_ptrs->vpxhorizontal_line_4_5_scale_t; - break; - case 6: - // 3-5 Scale in Width direction - horiz_line_scale = g_scaling_ptrs->vpxhorizontal_line_3_5_scale_t; - break; - case 5: - // 1-2 Scale in Width direction - horiz_line_scale = g_scaling_ptrs->vpxhorizontal_line_1_2_scale_t; - break; - case 10: - // no scale in Width direction - horiz_line_scale = horizontal_line_copy; - break; - default: - // The ratio is not acceptable now - // throw("The ratio is not acceptable for now!"); - ratio_scalable = 0; - break; - } - - switch (vr * 10 / vs) - { - case 8: - // 4-5 Scale in vertical direction - vert_band_scale = g_scaling_ptrs->vpxvertical_band_4_5_scale_t; - last_vert_band_scale = g_scaling_ptrs->vpxlast_vertical_band_4_5_scale_t; - src_band_height = 4; - dest_band_height = 5; - break; - case 6: - // 3-5 Scale in vertical direction - vert_band_scale = g_scaling_ptrs->vpxvertical_band_3_5_scale_t; - last_vert_band_scale = g_scaling_ptrs->vpxlast_vertical_band_3_5_scale_t; - src_band_height = 3; - dest_band_height = 5; - break; - case 5: - // 1-2 Scale in vertical direction - vert_band_scale = g_scaling_ptrs->vpxvertical_band_1_2_scale_t; - last_vert_band_scale = g_scaling_ptrs->vpxlast_vertical_band_1_2_scale_t; - src_band_height = 1; - dest_band_height = 2; - break; - case 10: - // no scale in Width direction - vert_band_scale = null_scale; - last_vert_band_scale = null_scale; - src_band_height = 4; - dest_band_height = 4; - break; - default: - // The ratio is not acceptable now - // throw("The ratio is not acceptable for now!"); - ratio_scalable = 0; - break; - } - - if (ratio_scalable == 0) - return ratio_scalable; - - horiz_line_scale(source, source_width, dest, dest_width); - - // except last band - for (k = 0; k < (dest_height + dest_band_height - 1) / dest_band_height - 1; k++) - { - // scale one band horizontally - for (i = 1; i < src_band_height; i++) - { - horiz_line_scale(source + i * source_pitch, - source_width, - dest + i * dest_pitch, - dest_width); - } - - // first line of next band - horiz_line_scale(source + src_band_height * source_pitch, - source_width, - dest + dest_band_height * dest_pitch, - dest_width); - - // Vertical scaling is in place - vert_band_scale(dest, dest_pitch, dest_width); - - // Next band... - source += src_band_height * source_pitch; - dest += dest_band_height * dest_pitch; - } - - // scale one band horizontally - for (i = 1; i < src_band_height; i++) - { - horiz_line_scale(source + i * source_pitch, - source_width, - dest + i * dest_pitch, - dest_width); - } - - // Vertical scaling is in place - last_vert_band_scale(dest, dest_pitch, dest_width); - - return ratio_scalable; -} - -/**************************************************************************** - * - * ROUTINE : any_ratio_frame_scale - * - * INPUTS : SCALE_INSTANCE *si : Pointer to post-processor instance (NOT USED). - * unsigned char *frame_buffer : Pointer to source image. - * int YOffset : Offset from start of buffer to Y samples. - * int UVOffset : Offset from start of buffer to UV samples. - * - * OUTPUTS : None. - * - * RETURNS : int: 1 if image scaled, 0 if image could not be scaled. - * - * FUNCTION : Scale the image with changing apect ratio. - * - * SPECIAL NOTES : None. - * - ****************************************************************************/ -static -int any_ratio_frame_scale(SCALE_VARS *scale_vars, int YOffset, int UVOffset) -{ - int i; - int ew; - int eh; - - // suggested scale factors - int hs = scale_vars->HScale; - int hr = scale_vars->HRatio; - int vs = scale_vars->VScale; - int vr = scale_vars->VRatio; - - int ratio_scalable = 1; - - int sw = (scale_vars->expanded_frame_width * hr + hs - 1) / hs; - int sh = (scale_vars->expanded_frame_height * vr + vs - 1) / vs; - int dw = scale_vars->expanded_frame_width; - int dh = scale_vars->expanded_frame_height; - YV12_BUFFER_CONFIG *src_yuv_config = scale_vars->src_yuv_config; - YV12_BUFFER_CONFIG *dst_yuv_config = scale_vars->dst_yuv_config; - - if (hr == 3) - ew = (sw + 2) / 3 * 3 * hs / hr; - else - ew = (sw + 7) / 8 * 8 * hs / hr; - - if (vr == 3) - eh = (sh + 2) / 3 * 3 * vs / vr; - else - eh = (sh + 7) / 8 * 8 * vs / vr; - - ratio_scalable = any_ratio_2d_scale(scale_vars, - (const unsigned char *)src_yuv_config->y_buffer, - src_yuv_config->y_stride, sw, sh, - (unsigned char *) dst_yuv_config->y_buffer + YOffset, - dst_yuv_config->y_stride, dw, dh); - - for (i = 0; i < eh; i++) - duck_memset(dst_yuv_config->y_buffer + YOffset + i * dst_yuv_config->y_stride + dw, 0, ew - dw); - - for (i = dh; i < eh; i++) - duck_memset(dst_yuv_config->y_buffer + YOffset + i * dst_yuv_config->y_stride, 0, ew); - - if (ratio_scalable == 0) - return ratio_scalable; - - sw = (sw + 1) >> 1; - sh = (sh + 1) >> 1; - dw = (dw + 1) >> 1; - dh = (dh + 1) >> 1; - - any_ratio_2d_scale(scale_vars, - (const unsigned char *)src_yuv_config->u_buffer, - src_yuv_config->y_stride / 2, sw, sh, - (unsigned char *)dst_yuv_config->u_buffer + UVOffset, - dst_yuv_config->uv_stride, dw, dh); - - any_ratio_2d_scale(scale_vars, - (const unsigned char *)src_yuv_config->v_buffer, - src_yuv_config->y_stride / 2, sw, sh, - (unsigned char *)dst_yuv_config->v_buffer + UVOffset, - dst_yuv_config->uv_stride, dw, dh); - - return ratio_scalable; -} - -/**************************************************************************** - * - * ROUTINE : center_image - * - * INPUTS : SCALE_INSTANCE *si : Pointer to post-processor instance. - * - * OUTPUTS : None. - * - * RETURNS : void - * - * FUNCTION : Centers the image without scaling in the output buffer. - * - * SPECIAL NOTES : None. - * - ****************************************************************************/ -static void -center_image(YV12_BUFFER_CONFIG *src_yuv_config, YV12_BUFFER_CONFIG *dst_yuv_config) -{ - int i; - int row_offset, col_offset; - char *src_data_pointer; - char *dst_data_pointer; - - // center values - row_offset = (dst_yuv_config->y_height - src_yuv_config->y_height) / 2; - col_offset = (dst_yuv_config->y_width - src_yuv_config->y_width) / 2; - - // Y's - src_data_pointer = src_yuv_config->y_buffer; - dst_data_pointer = (char *)dst_yuv_config->y_buffer + (row_offset * dst_yuv_config->y_stride) + col_offset; - - for (i = 0; i < src_yuv_config->y_height; i++) - { - duck_memcpy(dst_data_pointer, src_data_pointer, src_yuv_config->y_width); - dst_data_pointer += dst_yuv_config->y_stride; - src_data_pointer += src_yuv_config->y_stride; - } - - row_offset /= 2; - col_offset /= 2; - - // U's - src_data_pointer = src_yuv_config->u_buffer; - dst_data_pointer = (char *)dst_yuv_config->u_buffer + (row_offset * dst_yuv_config->uv_stride) + col_offset; - - for (i = 0; i < src_yuv_config->uv_height; i++) - { - duck_memcpy(dst_data_pointer, src_data_pointer, src_yuv_config->uv_width); - dst_data_pointer += dst_yuv_config->uv_stride; - src_data_pointer += src_yuv_config->uv_stride; - } - - // V's - src_data_pointer = src_yuv_config->v_buffer; - dst_data_pointer = (char *)dst_yuv_config->v_buffer + (row_offset * dst_yuv_config->uv_stride) + col_offset; - - for (i = 0; i < src_yuv_config->uv_height; i++) - { - duck_memcpy(dst_data_pointer, src_data_pointer, src_yuv_config->uv_width); - dst_data_pointer += dst_yuv_config->uv_stride; - src_data_pointer += src_yuv_config->uv_stride; - } -} - -/**************************************************************************** - * - * ROUTINE : scale_or_center - * - * INPUTS : SCALE_INSTANCE *si : Pointer to post-processor instance. - * - * - * - * OUTPUTS : None. - * - * RETURNS : void - * - * FUNCTION : Decides to scale or center image in scale buffer for blit - * - * SPECIAL NOTES : None. - * - ****************************************************************************/ -void -vp8_yv12_scale_or_center -( - YV12_BUFFER_CONFIG *src_yuv_config, - YV12_BUFFER_CONFIG *dst_yuv_config, - int expanded_frame_width, - int expanded_frame_height, - int scaling_mode, - int HScale, - int HRatio, - int VScale, - int VRatio -) -{ -// if ( ppi->post_processing_level ) - // update_umvborder ( ppi, frame_buffer ); - - - switch (scaling_mode) - { - case SCALE_TO_FIT: - case MAINTAIN_ASPECT_RATIO: - { - SCALE_VARS scale_vars; - // center values -#if 1 - int row = (dst_yuv_config->y_height - expanded_frame_height) / 2; - int col = (dst_yuv_config->y_width - expanded_frame_width) / 2; -// int YOffset = row * dst_yuv_config->y_width + col; -// int UVOffset = (row>>1) * dst_yuv_config->uv_width + (col>>1); - int YOffset = row * dst_yuv_config->y_stride + col; - int UVOffset = (row >> 1) * dst_yuv_config->uv_stride + (col >> 1); -#else - int row = (src_yuv_config->y_height - expanded_frame_height) / 2; - int col = (src_yuv_config->y_width - expanded_frame_width) / 2; - int YOffset = row * src_yuv_config->y_width + col; - int UVOffset = (row >> 1) * src_yuv_config->uv_width + (col >> 1); -#endif - - scale_vars.dst_yuv_config = dst_yuv_config; - scale_vars.src_yuv_config = src_yuv_config; - scale_vars.HScale = HScale; - scale_vars.HRatio = HRatio; - scale_vars.VScale = VScale; - scale_vars.VRatio = VRatio; - scale_vars.expanded_frame_width = expanded_frame_width; - scale_vars.expanded_frame_height = expanded_frame_height; - - // perform center and scale - any_ratio_frame_scale(&scale_vars, YOffset, UVOffset); - - break; - } - case CENTER: - center_image(src_yuv_config, dst_yuv_config); - break; - - default: - break; - } -} diff --git a/vpx_scale/leapster/yv12extend.c b/vpx_scale/leapster/yv12extend.c deleted file mode 100644 index 1cddd9540..000000000 --- a/vpx_scale/leapster/yv12extend.c +++ /dev/null @@ -1,232 +0,0 @@ -/* - * Copyright (c) 2010 The WebM project authors. All Rights Reserved. - * - * Use of this source code is governed by a BSD-style license - * that can be found in the LICENSE file in the root of the source - * tree. An additional intellectual property rights grant can be found - * in the file PATENTS. All contributing project authors may - * be found in the AUTHORS file in the root of the source tree. - */ - - -/**************************************************************************** - * - * Module Title : yv12extend.c - * - * Description : - * - ***************************************************************************/ - -/**************************************************************************** -* Header Files -****************************************************************************/ -//#include -#include "vpx_scale/yv12config.h" -#include "vpx_mem/vpx_mem.h" - -/**************************************************************************** -* Exports -****************************************************************************/ - -/**************************************************************************** - * - ****************************************************************************/ -void -vp8_yv12_extend_frame_borders(YV12_BUFFER_CONFIG *ybf) -{ - int i; - char *src_ptr1, *src_ptr2; - char *dest_ptr1, *dest_ptr2; - - unsigned int Border; - int plane_stride; - int plane_height; - int plane_width; - - /***********/ - /* Y Plane */ - /***********/ - Border = ybf->border; - plane_stride = ybf->y_stride; - plane_height = ybf->y_height; - plane_width = ybf->y_width; - - // copy the left and right most columns out - src_ptr1 = ybf->y_buffer; - src_ptr2 = src_ptr1 + plane_width - 1; - dest_ptr1 = src_ptr1 - Border; - dest_ptr2 = src_ptr2 + 1; - - for (i = 0; i < plane_height; i++) - { - memset(dest_ptr1, src_ptr1[0], Border); - memset(dest_ptr2, src_ptr2[0], Border); - src_ptr1 += plane_stride; - src_ptr2 += plane_stride; - dest_ptr1 += plane_stride; - dest_ptr2 += plane_stride; - } - - // Now copy the top and bottom source lines into each line of the respective borders - src_ptr1 = ybf->y_buffer - Border; - src_ptr2 = src_ptr1 + (plane_height * plane_stride) - plane_stride; - dest_ptr1 = src_ptr1 - (Border * plane_stride); - dest_ptr2 = src_ptr2 + plane_stride; - - for (i = 0; i < (int)Border; i++) - { - memcpy(dest_ptr1, src_ptr1, plane_stride); - memcpy(dest_ptr2, src_ptr2, plane_stride); - dest_ptr1 += plane_stride; - dest_ptr2 += plane_stride; - } - - plane_stride /= 2; - plane_height /= 2; - plane_width /= 2; - Border /= 2; - - /***********/ - /* U Plane */ - /***********/ - - // copy the left and right most columns out - src_ptr1 = ybf->u_buffer; - src_ptr2 = src_ptr1 + plane_width - 1; - dest_ptr1 = src_ptr1 - Border; - dest_ptr2 = src_ptr2 + 1; - - for (i = 0; i < plane_height; i++) - { - memset(dest_ptr1, src_ptr1[0], Border); - memset(dest_ptr2, src_ptr2[0], Border); - src_ptr1 += plane_stride; - src_ptr2 += plane_stride; - dest_ptr1 += plane_stride; - dest_ptr2 += plane_stride; - } - - // Now copy the top and bottom source lines into each line of the respective borders - src_ptr1 = ybf->u_buffer - Border; - src_ptr2 = src_ptr1 + (plane_height * plane_stride) - plane_stride; - dest_ptr1 = src_ptr1 - (Border * plane_stride); - dest_ptr2 = src_ptr2 + plane_stride; - - for (i = 0; i < (int)(Border); i++) - { - memcpy(dest_ptr1, src_ptr1, plane_stride); - memcpy(dest_ptr2, src_ptr2, plane_stride); - dest_ptr1 += plane_stride; - dest_ptr2 += plane_stride; - } - - /***********/ - /* V Plane */ - /***********/ - - // copy the left and right most columns out - src_ptr1 = ybf->v_buffer; - src_ptr2 = src_ptr1 + plane_width - 1; - dest_ptr1 = src_ptr1 - Border; - dest_ptr2 = src_ptr2 + 1; - - for (i = 0; i < plane_height; i++) - { - memset(dest_ptr1, src_ptr1[0], Border); - memset(dest_ptr2, src_ptr2[0], Border); - src_ptr1 += plane_stride; - src_ptr2 += plane_stride; - dest_ptr1 += plane_stride; - dest_ptr2 += plane_stride; - } - - // Now copy the top and bottom source lines into each line of the respective borders - src_ptr1 = ybf->v_buffer - Border; - src_ptr2 = src_ptr1 + (plane_height * plane_stride) - plane_stride; - dest_ptr1 = src_ptr1 - (Border * plane_stride); - dest_ptr2 = src_ptr2 + plane_stride; - - for (i = 0; i < (int)(Border); i++) - { - memcpy(dest_ptr1, src_ptr1, plane_stride); - memcpy(dest_ptr2, src_ptr2, plane_stride); - dest_ptr1 += plane_stride; - dest_ptr2 += plane_stride; - } -} -/**************************************************************************** - * - * ROUTINE : vp8_yv12_copy_frame - * - * INPUTS : - * - * OUTPUTS : None. - * - * RETURNS : void - * - * FUNCTION : Copies the source image into the destination image and - * updates the destination's UMV borders. - * - * SPECIAL NOTES : The frames are assumed to be identical in size. - * - ****************************************************************************/ -void -vp8_yv12_copy_frame(YV12_BUFFER_CONFIG *src_ybc, YV12_BUFFER_CONFIG *dst_ybc) -{ - int row; - int i; - unsigned int *source; - _Uncached unsigned int *dest; - int height; - int width; - - height = src_ybc->y_height + (src_ybc->border * 2); - width = src_ybc->y_width + (src_ybc->border * 2); - width /= 4; - source = (unsigned int *)(src_ybc->y_buffer - (src_ybc->border * src_ybc->y_stride) - src_ybc->border); - dest = (_Uncached unsigned int *)(dst_ybc->y_buffer - (dst_ybc->border * dst_ybc->y_stride) - dst_ybc->border); - - for (row = 0; row < height; row++) - { - for (i = 0; i < width; i++) - { - dest[i] = source[i]; - } - - source += width; - dest += width; - } - - height = src_ybc->uv_height + (src_ybc->border); - width = src_ybc->uv_width + (src_ybc->border); - width /= 4; - - source = (unsigned int *)(src_ybc->u_buffer - (src_ybc->border / 2 * src_ybc->uv_stride) - src_ybc->border / 2); - dest = (_Uncached unsigned int *)(dst_ybc->u_buffer - (dst_ybc->border / 2 * dst_ybc->uv_stride) - dst_ybc->border / 2); - - for (row = 0; row < height; row++) - { - for (i = 0; i < width; i++) - { - dest[i] = source[i]; - } - - source += width; - dest += width; - } - - source = (unsigned int *)(src_ybc->v_buffer - (src_ybc->border / 2 * src_ybc->uv_stride) - src_ybc->border / 2); - dest = (_Uncached unsigned int *)(dst_ybc->v_buffer - (dst_ybc->border / 2 * dst_ybc->uv_stride) - dst_ybc->border / 2); - - for (row = 0; row < height; row++) - { - for (i = 0; i < width; i++) - { - dest[i] = source[i]; - } - - source += width; - dest += width; - } - -} diff --git a/vpx_scale/symbian/gen_scalers_armv4.asm b/vpx_scale/symbian/gen_scalers_armv4.asm deleted file mode 100644 index e495184e7..000000000 --- a/vpx_scale/symbian/gen_scalers_armv4.asm +++ /dev/null @@ -1,774 +0,0 @@ -; -; Copyright (c) 2010 The WebM project authors. All Rights Reserved. -; -; Use of this source code is governed by a BSD-style license -; that can be found in the LICENSE file in the root of the source -; tree. An additional intellectual property rights grant can be found -; in the file PATENTS. All contributing project authors may -; be found in the AUTHORS file in the root of the source tree. -; - - - EXPORT |horizontal_line_4_5_scale_armv4| - EXPORT |vertical_band_4_5_scale_armv4| - EXPORT |horizontal_line_2_3_scale_armv4| - EXPORT |vertical_band_2_3_scale_armv4| - EXPORT |horizontal_line_3_5_scale_armv4| - EXPORT |vertical_band_3_5_scale_armv4| - EXPORT |horizontal_line_3_4_scale_armv4| - EXPORT |vertical_band_3_4_scale_armv4| - EXPORT |horizontal_line_1_2_scale_armv4| - EXPORT |vertical_band_1_2_scale_armv4| - - AREA |.text|, CODE, READONLY ; name this block of code - -src RN r0 -srcw RN r1 -dest RN r2 -mask RN r12 -c51_205 RN r10 -c102_154 RN r11 -;/**************************************************************************** -; * -; * ROUTINE : horizontal_line_4_5_scale_armv4 -; * -; * INPUTS : const unsigned char *source : Pointer to source data. -; * unsigned int source_width : Stride of source. -; * unsigned char *dest : Pointer to destination data. -; * unsigned int dest_width : Stride of destination (NOT USED). -; * -; * OUTPUTS : None. -; * -; * RETURNS : void -; * -; * FUNCTION : Copies horizontal line of pixels from source to -; * destination scaling up by 4 to 5. -; * -; * SPECIAL NOTES : None. -; * -; ****************************************************************************/ -;void horizontal_line_4_5_scale_armv4 -;( -; r0 = UINT8 *source -; r1 = UINT32 source_width -; r2 = UINT8 *dest -; r3 = UINT32 dest_width -;) -|horizontal_line_4_5_scale_armv4| PROC - stmdb sp!, {r4 - r11, lr} - - mov mask, #255 ; mask for selection - ldr c51_205, =0x3300cd - ldr c102_154, =0x66009a - - ldr r3, [src], #4 - -hl45_loop - - and r4, r3, mask ; a = src[0] - and r5, mask, r3, lsr #8 ; b = src[1] - strb r4, [dest], #1 - - orr r6, r4, r5, lsl #16 ; b | a - and r7, mask, r3, lsr #16 ; c = src[2] - mul r6, c51_205, r6 ; a * 51 + 205 * b - - orr r5, r5, r7, lsl #16 ; c | b - mul r5, c102_154, r5 ; b * 102 + 154 * c - add r6, r6, #0x8000 - and r8, mask, r3, lsr #24 ; d = src[3] - mov r6, r6, lsr #24 - strb r6, [dest], #1 - - orr r7, r8, r7, lsl #16 ; c | d - mul r7, c102_154, r7 ; c * 154 + 102 * d - add r5, r5, #0x8000 - ldr r3, [src], #4 - mov r5, r5, lsr #24 - strb r5, [dest], #1 - - add r7, r7, #0x8000 - and r9, mask, r3 ; e = src[4] - orr r9, r9, r8, lsl #16 ; d | e - mul r9, c51_205, r9 ; d * 205 + 51 * e - mov r7, r7, lsr #24 - strb r7, [dest], #1 - - add r9, r9, #0x8000 - subs srcw, srcw, #4 - mov r9, r9, lsr #24 - strb r9, [dest], #1 - - bne hl45_loop - - and r4, r3, mask - and r5, mask, r3, lsl #8 - strb r4, [dest], #1 - - orr r6, r4, r5, lsl #16 ; b | a - mul r6, c51_205, r6 - - and r7, mask, r3, lsl #16 - orr r5, r5, r7, lsl #16 ; c | b - mul r5, c102_154, r5 - add r6, r6, #0x8000 - and r8, mask, r3, lsl #24 - mov r6, r6, lsr #24 - strb r6, [dest], #1 - - orr r7, r8, r7, lsl #16 ; c | d - mul r7, c102_154, r7 - add r5, r5, #0x8000 - mov r5, r5, lsr #24 - strb r5, [dest], #1 - - add r7, r7, #0x8000 - mov r7, r7, lsr #24 - strb r7, [dest], #1 - - ldrb r3, [src] - strb r3, [dest], #1 - - ldmia sp!, {r4 - r11, pc} - ENDP ;|vp8cx_horizontal_line_4_5_scale_c| - -;/**************************************************************************** -; * -; * ROUTINE : vertical_band_4_5_scale_armv4 -; * -; * INPUTS : unsigned char *dest : Pointer to destination data. -; * unsigned int dest_pitch : Stride of destination data. -; * unsigned int dest_width : Width of destination data. -; * -; * OUTPUTS : None. -; * -; * RETURNS : void -; * -; * FUNCTION : Scales vertical band of pixels by scale 4 to 5. The -; * height of the band scaled is 4-pixels. -; * -; * SPECIAL NOTES : The routine uses the first line of the band below -; * the current band. -; * -; ****************************************************************************/ -;void vertical_band_4_5_scale_armv4 -;( -; r0 = UINT8 *dest -; r1 = UINT32 dest_pitch -; r2 = UINT32 dest_width -;) -|vertical_band_4_5_scale_armv4| PROC - stmdb sp!, {r4 - r11, lr} - - ldr c51_205, =0x3300cd - ldr c102_154, =0x66009a - -vl45_loop - mov r3, src - ldrb r4, [r3], r1 ; a = des [0] - ldrb r5, [r3], r1 ; b = des [dest_pitch] - ldrb r7, [r3], r1 ; c = des[dest_pitch*2] - add lr, src, r1 - - orr r6, r4, r5, lsl #16 ; b | a - mul r6, c51_205, r6 ; a * 51 + 205 * b - - ldrb r8, [r3], r1 ; d = des[dest_pitch*3] - orr r5, r5, r7, lsl #16 ; c | b - mul r5, c102_154, r5 ; b * 102 + 154 * c - add r6, r6, #0x8000 - orr r7, r8, r7, lsl #16 ; c | d - mov r6, r6, lsr #24 - strb r6, [lr], r1 - - ldrb r9, [r3, r1] ; e = des [dest_pitch * 5] - mul r7, c102_154, r7 ; c * 154 + 102 * d - add r5, r5, #0x8000 - orr r9, r9, r8, lsl #16 ; d | e - mov r5, r5, lsr #24 - strb r5, [lr], r1 - - mul r9, c51_205, r9 ; d * 205 + 51 * e - add r7, r7, #0x8000 - add src, src, #1 - mov r7, r7, lsr #24 - strb r7, [lr], r1 - - add r9, r9, #0x8000 - subs r2, r2, #1 - mov r9, r9, lsr #24 - strb r9, [lr], r1 - - bne vl45_loop - - ldmia sp!, {r4 - r11, pc} - ENDP ;|vertical_band_4_5_scale_armv4| - -;/**************************************************************************** -; * -; * ROUTINE : horizontal_line_2_3_scale_armv4 -; * -; * INPUTS : const unsigned char *source : Pointer to source data. -; * unsigned int source_width : Stride of source. -; * unsigned char *dest : Pointer to destination data. -; * unsigned int dest_width : Stride of destination (NOT USED). -; * -; * OUTPUTS : None. -; * -; * RETURNS : void -; * -; * FUNCTION : Copies horizontal line of pixels from source to -; * destination scaling up by 2 to 3. -; * -; * SPECIAL NOTES : None. -; * -; * -; ****************************************************************************/ -;void horizontal_line_2_3_scale_armv4 -;( -; const unsigned char *source, -; unsigned int source_width, -; unsigned char *dest, -; unsigned int dest_width -;) -|horizontal_line_2_3_scale_armv4| PROC - stmdb sp!, {r4 - r11, lr} - ldr lr, =85 - ldr r12, =171 - -hl23_loop - - ldrb r3, [src], #1 ; a - ldrb r4, [src], #1 ; b - ldrb r5, [src] ; c - - strb r3, [dest], #1 - mul r4, r12, r4 ; b * 171 - mla r6, lr, r3, r4 ; a * 85 - mla r7, lr, r5, r4 ; c * 85 - - add r6, r6, #128 - mov r6, r6, lsr #8 - strb r6, [dest], #1 - - add r7, r7, #128 - mov r7, r7, lsr #8 - strb r7, [dest], #1 - - subs srcw, srcw, #2 - bne hl23_loop - - ldrb r4, [src, #1] ; b - strb r5, [dest], #1 - strb r4, [dest, #1] - - mul r4, r12, r4 ; b * 171 - mla r6, lr, r5, r4 ; a * 85 + b *171 - - add r6, r6, #128 - mov r6, r6, lsr #8 - strb r6, [dest] - - ldmia sp!, {r4 - r11, pc} - ENDP ;|horizontal_line_2_3_scale_armv4| - -;/**************************************************************************** -; * -; * ROUTINE : vertical_band_2_3_scale_armv4 -; * -; * INPUTS : unsigned char *dest : Pointer to destination data. -; * unsigned int dest_pitch : Stride of destination data. -; * unsigned int dest_width : Width of destination data. -; * -; * OUTPUTS : None. -; * -; * RETURNS : void -; * -; * FUNCTION : Scales vertical band of pixels by scale 2 to 3. The -; * height of the band scaled is 2-pixels. -; * -; * SPECIAL NOTES : The routine uses the first line of the band below -; * the current band. -; * -; ****************************************************************************/ -;void vertical_band_2_3_scale_armv4 -;( -; r0 = UINT8 *dest -; r1 = UINT32 dest_pitch -; r2 = UINT32 dest_width -;) -|vertical_band_2_3_scale_armv4| PROC - stmdb sp!, {r4 - r8, lr} - ldr lr, =85 - ldr r12, =171 - add r3, r1, r1, lsl #1 ; 3 * dest_pitch - -vl23_loop - ldrb r4, [src] ; a = des [0] - ldrb r5, [src, r1] ; b = des [dest_pitch] - ldrb r7, [src, r3] ; c = des [dest_pitch*3] - subs r2, r2, #1 - - mul r5, r12, r5 ; b * 171 - mla r6, lr, r4, r5 ; a * 85 - mla r8, lr, r7, r5 ; c * 85 - - add r6, r6, #128 - mov r6, r6, lsr #8 - strb r6, [src, r1] - - add r8, r8, #128 - mov r8, r8, lsr #8 - strb r8, [src, r1, lsl #1] - - add src, src, #1 - - bne vl23_loop - - ldmia sp!, {r4 - r8, pc} - ENDP ;|vertical_band_2_3_scale_armv4| - -;/**************************************************************************** -; * -; * ROUTINE : vp8cx_horizontal_line_3_5_scale_c -; * -; * INPUTS : const unsigned char *source : Pointer to source data. -; * unsigned int source_width : Stride of source. -; * unsigned char *dest : Pointer to destination data. -; * unsigned int dest_width : Stride of destination (NOT USED). -; * -; * OUTPUTS : None. -; * -; * RETURNS : void -; * -; * FUNCTION : Copies horizontal line of pixels from source to -; * destination scaling up by 3 to 5. -; * -; * SPECIAL NOTES : None. -; * -; * -; ****************************************************************************/ -;void vp8cx_horizontal_line_3_5_scale_c -;( -; const unsigned char *source, -; unsigned int source_width, -; unsigned char *dest, -; unsigned int dest_width -;) -|horizontal_line_3_5_scale_armv4| PROC - stmdb sp!, {r4 - r11, lr} - - ldr c51_205, =0x3300cd - ldr c102_154, =0x66009a - - ldrb r4, [src], #1 ; a = src[0] - -hl35_loop - - ldrb r8, [src], #1 ; b = src[1] - strb r4, [dest], #1 - - orr r6, r4, r8, lsl #16 ; b | a - ldrb r9, [src], #1 ; c = src[2] - mul r6, c102_154, r6 ; a * 102 + 154 * b - - orr r5, r9, r8, lsl #16 ; b | c - mul r5, c51_205, r5 ; b * 205 + 51 * c - add r6, r6, #0x8000 - ldrb r4, [src], #1 ; d = src[3] - mov r6, r6, lsr #24 - strb r6, [dest], #1 - - orr r7, r8, r9, lsl #16 ; c | b - mul r7, c51_205, r7 ; c * 205 + 154 * b - add r5, r5, #0x8000 - mov r5, r5, lsr #24 - strb r5, [dest], #1 - - orr r9, r4, r9, lsl #16 ; c | d - mul r9, c102_154, r9 ; c * 154 + 102 * d - add r7, r7, #0x8000 - mov r7, r7, lsr #24 - strb r7, [dest], #1 - - add r9, r9, #0x8000 - subs srcw, srcw, #3 - mov r9, r9, lsr #24 - strb r9, [dest], #1 - - bpl hl35_loop - - ldrb r5, [src], #1 ; b = src[1] - strb r4, [dest], #1 - - orr r6, r4, r8, lsl #16 ; b | a - ldrb r9, [src], #1 ; c = src[2] - mul r6, c102_154, r6 ; a * 102 + 154 * b - - orr r5, r9, r8, lsl #16 ; b | c - mul r5, c51_205, r5 ; b * 205 + 51 * c - add r6, r6, #0x8000 - mov r6, r6, lsr #24 - strb r6, [dest], #1 - - orr r7, r8, r9, lsl #16 ; c | b - mul r7, c51_205, r7 ; c * 205 + 154 * b - add r5, r5, #0x8000 - mov r5, r5, lsr #24 - strb r5, [dest], #1 - - add r7, r7, #0x8000 - mov r7, r7, lsr #24 - strb r7, [dest], #1 - strb r9, [dest], #1 - - ldmia sp!, {r4 - r11, pc} - ENDP ;|vp8cx_horizontal_line_3_5_scale_c| - - -;/**************************************************************************** -; * -; * ROUTINE : vp8cx_vertical_band_3_5_scale_c -; * -; * INPUTS : unsigned char *dest : Pointer to destination data. -; * unsigned int dest_pitch : Stride of destination data. -; * unsigned int dest_width : Width of destination data. -; * -; * OUTPUTS : None. -; * -; * RETURNS : void -; * -; * FUNCTION : Scales vertical band of pixels by scale 3 to 5. The -; * height of the band scaled is 3-pixels. -; * -; * SPECIAL NOTES : The routine uses the first line of the band below -; * the current band. -; * -; ****************************************************************************/ -;void vertical_band_4_5_scale_armv4 -;( -; r0 = UINT8 *dest -; r1 = UINT32 dest_pitch -; r2 = UINT32 dest_width -;) -|vertical_band_3_5_scale_armv4| PROC - stmdb sp!, {r4 - r11, lr} - - ldr c51_205, =0x3300cd - ldr c102_154, =0x66009a - -vl35_loop - mov r3, src - ldrb r4, [r3], r1 ; a = des [0] - ldrb r5, [r3], r1 ; b = des [dest_pitch] - ldrb r7, [r3], r1 ; c = des[dest_pitch*2] - add lr, src, r1 - - orr r8, r4, r5, lsl #16 ; b | a - mul r6, c102_154, r8 ; a * 102 + 154 * b - - ldrb r8, [r3, r1, lsl #1] ; d = des[dest_pitch*5] - orr r3, r7, r5, lsl #16 ; b | c - mul r9, c51_205, r3 ; b * 205 + 51 * c - add r6, r6, #0x8000 - orr r3, r5, r7, lsl #16 ; c | b - mov r6, r6, lsr #24 - strb r6, [lr], r1 - - mul r5, c51_205, r3 ; c * 205 + 154 * b - add r9, r9, #0x8000 - orr r3, r8, r7, lsl #16 ; c | d - mov r9, r9, lsr #24 - strb r9, [lr], r1 - - mul r7, c102_154, r3 ; c * 154 + 102 * d - add r5, r5, #0x8000 - add src, src, #1 - mov r5, r5, lsr #24 - strb r5, [lr], r1 - - add r7, r7, #0x8000 - subs r2, r2, #1 - mov r7, r7, lsr #24 - strb r7, [lr], r1 - - - bne vl35_loop - - ldmia sp!, {r4 - r11, pc} - ENDP ;|vertical_band_3_5_scale_armv4| - -;/**************************************************************************** -; * -; * ROUTINE : horizontal_line_3_4_scale_armv4 -; * -; * INPUTS : const unsigned char *source : Pointer to source data. -; * unsigned int source_width : Stride of source. -; * unsigned char *dest : Pointer to destination data. -; * unsigned int dest_width : Stride of destination (NOT USED). -; * -; * OUTPUTS : None. -; * -; * RETURNS : void -; * -; * FUNCTION : Copies horizontal line of pixels from source to -; * destination scaling up by 3 to 4. -; * -; * SPECIAL NOTES : None. -; * -; * -; ****************************************************************************/ -;void horizontal_line_3_4_scale_armv4 -;( -; const unsigned char *source, -; unsigned int source_width, -; unsigned char *dest, -; unsigned int dest_width -;) -|horizontal_line_3_4_scale_armv4| PROC - stmdb sp!, {r4 - r11, lr} - - ldr r10, =64 - ldr r11, =192 - mov r9, #128 - - ldrb r4, [src], #1 ; a = src[0] - -hl34_loop - - ldrb r8, [src], #1 ; b = src[1] - ldrb r7, [src], #1 ; c = src[2] - strb r4, [dest], #1 - - mla r4, r10, r4, r9 ; a*64 + 128 - mla r4, r11, r8, r4 ; a*64 + b*192 + 1 - - add r8, r8, #1 ; b + 1 - add r8, r8, r7 ; b + c + 1 - mov r8, r8, asr #1 ; (b + c + 1) >> 1 - - mov r4, r4, asr #8 ; (a*64 + b*192 + 1) >> 8 - strb r4, [dest], #1 - - strb r8, [dest], #1 - - ldrb r4, [src], #1 ; [a+1] - - mla r7, r11, r7, r9 ; c*192 + 128 - mla r7, r4, r10, r7 ; a*64 + b*192 + 128 - - subs srcw, srcw, #3 - - mov r7, r7, asr #8 ; (a*64 + b*192 + 128) >> 8 - strb r7, [dest], #1 - - bpl hl34_loop - - ldrb r8, [src], #1 ; b = src[1] - ldrb r7, [src], #1 ; c = src[2] - strb r4, [dest], #1 - - mla r4, r10, r4, r9 ; a*64 + 128 - mla r4, r11, r8, r4 ; a*64 + b*192 + 1 - mov r4, r4, asr #8 ; (a*64 + b*192 + 1) >> 8 - strb r4, [dest], #1 - - add r8, r8, #1 ; b + 1 - add r8, r8, r7 ; b + c + 1 - mov r8, r8, asr #1 ; (b + c + 1) >> 1 - strb r8, [dest], #1 - strb r7, [dest], #1 - - ldmia sp!, {r4 - r11, pc} - ENDP ;|vp8cx_horizontal_line_3_4_scale_c| - - -;/**************************************************************************** -; * -; * ROUTINE : vertical_band_3_4_scale_armv4 -; * -; * INPUTS : unsigned char *dest : Pointer to destination data. -; * unsigned int dest_pitch : Stride of destination data. -; * unsigned int dest_width : Width of destination data. -; * -; * OUTPUTS : None. -; * -; * RETURNS : void -; * -; * FUNCTION : Scales vertical band of pixels by scale 3 to 4. The -; * height of the band scaled is 3-pixels. -; * -; * SPECIAL NOTES : The routine uses the first line of the band below -; * the current band. -; * -; ****************************************************************************/ -;void vertical_band_3_4_scale_armv4 -;( -; r0 = UINT8 *dest -; r1 = UINT32 dest_pitch -; r2 = UINT32 dest_width -;) -|vertical_band_3_4_scale_armv4| PROC - stmdb sp!, {r4 - r11, lr} - - ldr r10, =64 - ldr r11, =192 - mov r9, #128 - -; ldr r1,[r1] -vl34_loop - mov r3, src - ldrb r4, [r3], r1 ; a = des [0] - ldrb r5, [r3], r1 ; b = des [dest_pitch] - ldrb r7, [r3], r1 ; c = des [dest_pitch*2] - add lr, src, r1 - - mla r4, r10, r4, r9 ; a*64 + 128 - mla r4, r11, r5, r4 ; a*64 + b*192 + 1 - - add r5, r5, #1 ; b + 1 - add r5, r5, r7 ; b + c + 1 - mov r5, r5, asr #1 ; (b + c + 1) >> 1 - - mov r4, r4, asr #8 ; (a*64 + b*192 + 1) >> 8 - strb r4, [lr], r1 - - ldrb r4, [r3, r1] ; a = des [dest_pitch*4] - - strb r5, [lr], r1 - - mla r7, r11, r7, r9 ; c*192 + 128 - mla r7, r4, r10, r7 ; a*64 + b*192 + 128 - mov r7, r7, asr #8 ; (a*64 + b*192 + 128) >> 8 - - add src, src, #1 - subs r2, r2, #1 - - strb r7, [lr] - - bne vl34_loop - - ldmia sp!, {r4 - r11, pc} - ENDP ;|vertical_band_3_4_scale_armv4| - -;/**************************************************************************** -; * -; * ROUTINE : vp8cx_horizontal_line_1_2_scale_c -; * -; * INPUTS : const unsigned char *source : Pointer to source data. -; * unsigned int source_width : Stride of source. -; * unsigned char *dest : Pointer to destination data. -; * unsigned int dest_width : Stride of destination (NOT USED). -; * -; * OUTPUTS : None. -; * -; * RETURNS : void -; * -; * FUNCTION : Copies horizontal line of pixels from source to -; * destination scaling up by 1 to 2. -; * -; * SPECIAL NOTES : None. -; * -; ****************************************************************************/ -;void vp8cx_horizontal_line_1_2_scale_c -;( -; const unsigned char *source, -; unsigned int source_width, -; unsigned char *dest, -; unsigned int dest_width -;) -|horizontal_line_1_2_scale_armv4| PROC - stmdb sp!, {r4 - r5, lr} - - sub srcw, srcw, #1 - - ldrb r3, [src], #1 - ldrb r4, [src], #1 -hl12_loop - subs srcw, srcw, #1 - - add r5, r3, r4 - add r5, r5, #1 - mov r5, r5, lsr #1 - - orr r5, r3, r5, lsl #8 - strh r5, [dest], #2 - - mov r3, r4 - - ldrneb r4, [src], #1 - bne hl12_loop - - orr r5, r4, r4, lsl #8 - strh r5, [dest] - - ldmia sp!, {r4 - r5, pc} - ENDP ;|vertical_band_3_5_scale_armv4| - -;/**************************************************************************** -; * -; * ROUTINE : vp8cx_vertical_band_1_2_scale_c -; * -; * INPUTS : unsigned char *dest : Pointer to destination data. -; * unsigned int dest_pitch : Stride of destination data. -; * unsigned int dest_width : Width of destination data. -; * -; * OUTPUTS : None. -; * -; * RETURNS : void -; * -; * FUNCTION : Scales vertical band of pixels by scale 1 to 2. The -; * height of the band scaled is 1-pixel. -; * -; * SPECIAL NOTES : The routine uses the first line of the band below -; * the current band. -; * -; ****************************************************************************/ -;void vp8cx_vertical_band_1_2_scale_c -;( -; r0 = UINT8 *dest -; r1 = UINT32 dest_pitch -; r2 = UINT32 dest_width -;) -|vertical_band_1_2_scale_armv4| PROC - stmdb sp!, {r4 - r7, lr} - - ldr mask, =0xff00ff ; mask for selection - ldr lr, = 0x010001 - -vl12_loop - mov r3, src - ldr r4, [r3], r1 - ldr r5, [r3, r1] - - add src, src, #4 - subs r2, r2, #4 - - and r6, r4, mask - and r7, r5, mask - - add r6, r7, r6 - add r6, r6, lr - - and r4, mask, r4, lsr #8 - and r5, mask, r5, lsr #8 - - mov r6, r6, lsr #1 - and r6, r6, mask - - add r4, r5, r4 - add r4, r4, lr - - mov r4, r4, lsr #1 - and r4, r4, mask - - orr r5, r6, r4, lsl #8 - - str r5, [r3] - - bpl vl12_loop - - ldmia sp!, {r4 - r7, pc} - ENDP ;|vertical_band_3_5_scale_armv4| - - END diff --git a/vpx_scale/symbian/gen_scalers_armv4.s b/vpx_scale/symbian/gen_scalers_armv4.s deleted file mode 100644 index 3dfd0b9b9..000000000 --- a/vpx_scale/symbian/gen_scalers_armv4.s +++ /dev/null @@ -1,808 +0,0 @@ -@ This file was created from a .asm file -@ using the ads2gas.pl script. - - .equ WIDE_REFERENCE, 0 - .ifndef ARCHITECTURE - .equ ARCHITECTURE, 5 - .endif - .global horizontal_line_4_5_scale_armv4 - .ifndef NO_TYPE_PSEUDO_OP - .type horizontal_line_4_5_scale_armv4, function - .endif - .global vertical_band_4_5_scale_armv4 - .ifndef NO_TYPE_PSEUDO_OP - .type vertical_band_4_5_scale_armv4, function - .endif - .global horizontal_line_2_3_scale_armv4 - .ifndef NO_TYPE_PSEUDO_OP - .type horizontal_line_2_3_scale_armv4, function - .endif - .global vertical_band_2_3_scale_armv4 - .ifndef NO_TYPE_PSEUDO_OP - .type vertical_band_2_3_scale_armv4, function - .endif - .global horizontal_line_3_5_scale_armv4 - .ifndef NO_TYPE_PSEUDO_OP - .type horizontal_line_3_5_scale_armv4, function - .endif - .global vertical_band_3_5_scale_armv4 - .ifndef NO_TYPE_PSEUDO_OP - .type vertical_band_3_5_scale_armv4, function - .endif - .global horizontal_line_3_4_scale_armv4 - .ifndef NO_TYPE_PSEUDO_OP - .type horizontal_line_3_4_scale_armv4, function - .endif - .global vertical_band_3_4_scale_armv4 - .ifndef NO_TYPE_PSEUDO_OP - .type vertical_band_3_4_scale_armv4, function - .endif - .global horizontal_line_1_2_scale_armv4 - .ifndef NO_TYPE_PSEUDO_OP - .type horizontal_line_1_2_scale_armv4, function - .endif - .global vertical_band_1_2_scale_armv4 - .ifndef NO_TYPE_PSEUDO_OP - .type vertical_band_1_2_scale_armv4, function - .endif - -.text - -src .req r0 -srcw .req r1 -dest .req r2 -mask .req r12 -c51_205 .req r10 -c102_154 .req r11 -@/**************************************************************************** -@ * -@ * ROUTINE : horizontal_line_4_5_scale_armv4 -@ * -@ * INPUTS : const unsigned char *source : Pointer to source data. -@ * unsigned int source_width : Stride of source. -@ * unsigned char *dest : Pointer to destination data. -@ * unsigned int dest_width : Stride of destination (NOT USED). -@ * -@ * OUTPUTS : None. -@ * -@ * RETU.req_s : void -@ * -@ * FUNCTION : Copies horizontal line of pixels from source to -@ * destination scaling up by 4 to 5. -@ * -@ * SPECIAL NOTES : None. -@ * -@ ****************************************************************************/ -@void horizontal_line_4_5_scale_armv4 -@( -@ r0 = UINT8 *source -@ r1 = UINT32 source_width -@ r2 = UINT8 *dest -@ r3 = UINT32 dest_width -@) -_HorizontalLine_4_5_Scale_ARMv4: - horizontal_line_4_5_scale_armv4: @ - stmdb sp!, {r4 - r11, lr} - - mov mask, #255 @ mask for selection - ldr c51_205, =0x3300cd - ldr c102_154, =0x66009a - - ldr r3, [src], #4 - -hl45_loop: - - and r4, r3, mask @ a = src[0] - and r5, mask, r3, lsr #8 @ b = src[1] - strb r4, [dest], #1 - - orr r6, r4, r5, lsl #16 @ b | a - and r7, mask, r3, lsr #16 @ c = src[2] - mul r6, c51_205, r6 @ a * 51 + 205 * b - - orr r5, r5, r7, lsl #16 @ c | b - mul r5, c102_154, r5 @ b * 102 + 154 * c - add r6, r6, #0x8000 - and r8, mask, r3, lsr #24 @ d = src[3] - mov r6, r6, lsr #24 - strb r6, [dest], #1 - - orr r7, r8, r7, lsl #16 @ c | d - mul r7, c102_154, r7 @ c * 154 + 102 * d - add r5, r5, #0x8000 - ldr r3, [src], #4 - mov r5, r5, lsr #24 - strb r5, [dest], #1 - - add r7, r7, #0x8000 - and r9, mask, r3 @ e = src[4] - orr r9, r9, r8, lsl #16 @ d | e - mul r9, c51_205, r9 @ d * 205 + 51 * e - mov r7, r7, lsr #24 - strb r7, [dest], #1 - - add r9, r9, #0x8000 - subs srcw, srcw, #4 - mov r9, r9, lsr #24 - strb r9, [dest], #1 - - bne hl45_loop - - and r4, r3, mask - and r5, mask, r3, lsl #8 - strb r4, [dest], #1 - - orr r6, r4, r5, lsl #16 @ b | a - mul r6, c51_205, r6 - - and r7, mask, r3, lsl #16 - orr r5, r5, r7, lsl #16 @ c | b - mul r5, c102_154, r5 - add r6, r6, #0x8000 - and r8, mask, r3, lsl #24 - mov r6, r6, lsr #24 - strb r6, [dest], #1 - - orr r7, r8, r7, lsl #16 @ c | d - mul r7, c102_154, r7 - add r5, r5, #0x8000 - mov r5, r5, lsr #24 - strb r5, [dest], #1 - - add r7, r7, #0x8000 - mov r7, r7, lsr #24 - strb r7, [dest], #1 - - ldrb r3, [src] - strb r3, [dest], #1 - - ldmia sp!, {r4 - r11, pc} - @ @|vp8cx_horizontal_line_4_5_scale_c| - -@/**************************************************************************** -@ * -@ * ROUTINE : vertical_band_4_5_scale_armv4 -@ * -@ * INPUTS : unsigned char *dest : Pointer to destination data. -@ * unsigned int dest_pitch : Stride of destination data. -@ * unsigned int dest_width : Width of destination data. -@ * -@ * OUTPUTS : None. -@ * -@ * RETU.req_s : void -@ * -@ * FUNCTION : Scales vertical band of pixels by scale 4 to 5. The -@ * height of the band scaled is 4-pixels. -@ * -@ * SPECIAL NOTES : The routine uses the first line of the band below -@ * the current band. -@ * -@ ****************************************************************************/ -@void vertical_band_4_5_scale_armv4 -@( -@ r0 = UINT8 *dest -@ r1 = UINT32 dest_pitch -@ r2 = UINT32 dest_width -@) -_VerticalBand_4_5_Scale_ARMv4: - vertical_band_4_5_scale_armv4: @ - stmdb sp!, {r4 - r11, lr} - - ldr c51_205, =0x3300cd - ldr c102_154, =0x66009a - -vl45_loop: - mov r3, src - ldrb r4, [r3], r1 @ a = des [0] - ldrb r5, [r3], r1 @ b = des [dest_pitch] - ldrb r7, [r3], r1 @ c = des[dest_pitch*2] - add lr, src, r1 - - orr r6, r4, r5, lsl #16 @ b | a - mul r6, c51_205, r6 @ a * 51 + 205 * b - - ldrb r8, [r3], r1 @ d = des[dest_pitch*3] - orr r5, r5, r7, lsl #16 @ c | b - mul r5, c102_154, r5 @ b * 102 + 154 * c - add r6, r6, #0x8000 - orr r7, r8, r7, lsl #16 @ c | d - mov r6, r6, lsr #24 - strb r6, [lr], r1 - - ldrb r9, [r3, r1] @ e = des [dest_pitch * 5] - mul r7, c102_154, r7 @ c * 154 + 102 * d - add r5, r5, #0x8000 - orr r9, r9, r8, lsl #16 @ d | e - mov r5, r5, lsr #24 - strb r5, [lr], r1 - - mul r9, c51_205, r9 @ d * 205 + 51 * e - add r7, r7, #0x8000 - add src, src, #1 - mov r7, r7, lsr #24 - strb r7, [lr], r1 - - add r9, r9, #0x8000 - subs r2, r2, #1 - mov r9, r9, lsr #24 - strb r9, [lr], r1 - - bne vl45_loop - - ldmia sp!, {r4 - r11, pc} - @ @|vertical_band_4_5_scale_armv4| - -@/**************************************************************************** -@ * -@ * ROUTINE : horizontal_line_2_3_scale_armv4 -@ * -@ * INPUTS : const unsigned char *source : Pointer to source data. -@ * unsigned int source_width : Stride of source. -@ * unsigned char *dest : Pointer to destination data. -@ * unsigned int dest_width : Stride of destination (NOT USED). -@ * -@ * OUTPUTS : None. -@ * -@ * RETU.req_s : void -@ * -@ * FUNCTION : Copies horizontal line of pixels from source to -@ * destination scaling up by 2 to 3. -@ * -@ * SPECIAL NOTES : None. -@ * -@ * -@ ****************************************************************************/ -@void horizontal_line_2_3_scale_armv4 -@( -@ const unsigned char *source, -@ unsigned int source_width, -@ unsigned char *dest, -@ unsigned int dest_width -@) -_HorizontalLine_2_3_Scale_ARMv4: - horizontal_line_2_3_scale_armv4: @ - stmdb sp!, {r4 - r11, lr} - ldr lr, =85 - ldr r12, =171 - -hl23_loop: - - ldrb r3, [src], #1 @ a - ldrb r4, [src], #1 @ b - ldrb r5, [src] @ c - - strb r3, [dest], #1 - mul r4, r12, r4 @ b * 171 - mla r6, lr, r3, r4 @ a * 85 - mla r7, lr, r5, r4 @ c * 85 - - add r6, r6, #128 - mov r6, r6, lsr #8 - strb r6, [dest], #1 - - add r7, r7, #128 - mov r7, r7, lsr #8 - strb r7, [dest], #1 - - subs srcw, srcw, #2 - bne hl23_loop - - ldrb r4, [src, #1] @ b - strb r5, [dest], #1 - strb r4, [dest, #1] - - mul r4, r12, r4 @ b * 171 - mla r6, lr, r5, r4 @ a * 85 + b *171 - - add r6, r6, #128 - mov r6, r6, lsr #8 - strb r6, [dest] - - ldmia sp!, {r4 - r11, pc} - @ @|horizontal_line_2_3_scale_armv4| - -@/**************************************************************************** -@ * -@ * ROUTINE : vertical_band_2_3_scale_armv4 -@ * -@ * INPUTS : unsigned char *dest : Pointer to destination data. -@ * unsigned int dest_pitch : Stride of destination data. -@ * unsigned int dest_width : Width of destination data. -@ * -@ * OUTPUTS : None. -@ * -@ * RETU.req_s : void -@ * -@ * FUNCTION : Scales vertical band of pixels by scale 2 to 3. The -@ * height of the band scaled is 2-pixels. -@ * -@ * SPECIAL NOTES : The routine uses the first line of the band below -@ * the current band. -@ * -@ ****************************************************************************/ -@void vertical_band_2_3_scale_armv4 -@( -@ r0 = UINT8 *dest -@ r1 = UINT32 dest_pitch -@ r2 = UINT32 dest_width -@) -_VerticalBand_2_3_Scale_ARMv4: - vertical_band_2_3_scale_armv4: @ - stmdb sp!, {r4 - r8, lr} - ldr lr, =85 - ldr r12, =171 - add r3, r1, r1, lsl #1 @ 3 * dest_pitch - -vl23_loop: - ldrb r4, [src] @ a = des [0] - ldrb r5, [src, r1] @ b = des [dest_pitch] - ldrb r7, [src, r3] @ c = des [dest_pitch*3] - subs r2, r2, #1 - - mul r5, r12, r5 @ b * 171 - mla r6, lr, r4, r5 @ a * 85 - mla r8, lr, r7, r5 @ c * 85 - - add r6, r6, #128 - mov r6, r6, lsr #8 - strb r6, [src, r1] - - add r8, r8, #128 - mov r8, r8, lsr #8 - strb r8, [src, r1, lsl #1] - - add src, src, #1 - - bne vl23_loop - - ldmia sp!, {r4 - r8, pc} - @ @|vertical_band_2_3_scale_armv4| - -@/**************************************************************************** -@ * -@ * ROUTINE : vp8cx_horizontal_line_3_5_scale_c -@ * -@ * INPUTS : const unsigned char *source : Pointer to source data. -@ * unsigned int source_width : Stride of source. -@ * unsigned char *dest : Pointer to destination data. -@ * unsigned int dest_width : Stride of destination (NOT USED). -@ * -@ * OUTPUTS : None. -@ * -@ * RETU.req_s : void -@ * -@ * FUNCTION : Copies horizontal line of pixels from source to -@ * destination scaling up by 3 to 5. -@ * -@ * SPECIAL NOTES : None. -@ * -@ * -@ ****************************************************************************/ -@void vp8cx_horizontal_line_3_5_scale_c -@( -@ const unsigned char *source, -@ unsigned int source_width, -@ unsigned char *dest, -@ unsigned int dest_width -@) -_HorizontalLine_3_5_Scale_ARMv4: - horizontal_line_3_5_scale_armv4: @ - stmdb sp!, {r4 - r11, lr} - - ldr c51_205, =0x3300cd - ldr c102_154, =0x66009a - - ldrb r4, [src], #1 @ a = src[0] - -hl35_loop: - - ldrb r8, [src], #1 @ b = src[1] - strb r4, [dest], #1 - - orr r6, r4, r8, lsl #16 @ b | a - ldrb r9, [src], #1 @ c = src[2] - mul r6, c102_154, r6 @ a * 102 + 154 * b - - orr r5, r9, r8, lsl #16 @ b | c - mul r5, c51_205, r5 @ b * 205 + 51 * c - add r6, r6, #0x8000 - ldrb r4, [src], #1 @ d = src[3] - mov r6, r6, lsr #24 - strb r6, [dest], #1 - - orr r7, r8, r9, lsl #16 @ c | b - mul r7, c51_205, r7 @ c * 205 + 154 * b - add r5, r5, #0x8000 - mov r5, r5, lsr #24 - strb r5, [dest], #1 - - orr r9, r4, r9, lsl #16 @ c | d - mul r9, c102_154, r9 @ c * 154 + 102 * d - add r7, r7, #0x8000 - mov r7, r7, lsr #24 - strb r7, [dest], #1 - - add r9, r9, #0x8000 - subs srcw, srcw, #3 - mov r9, r9, lsr #24 - strb r9, [dest], #1 - - bpl hl35_loop - - ldrb r5, [src], #1 @ b = src[1] - strb r4, [dest], #1 - - orr r6, r4, r8, lsl #16 @ b | a - ldrb r9, [src], #1 @ c = src[2] - mul r6, c102_154, r6 @ a * 102 + 154 * b - - orr r5, r9, r8, lsl #16 @ b | c - mul r5, c51_205, r5 @ b * 205 + 51 * c - add r6, r6, #0x8000 - mov r6, r6, lsr #24 - strb r6, [dest], #1 - - orr r7, r8, r9, lsl #16 @ c | b - mul r7, c51_205, r7 @ c * 205 + 154 * b - add r5, r5, #0x8000 - mov r5, r5, lsr #24 - strb r5, [dest], #1 - - add r7, r7, #0x8000 - mov r7, r7, lsr #24 - strb r7, [dest], #1 - strb r9, [dest], #1 - - ldmia sp!, {r4 - r11, pc} - @ @|vp8cx_horizontal_line_3_5_scale_c| - - -@/**************************************************************************** -@ * -@ * ROUTINE : vp8cx_vertical_band_3_5_scale_c -@ * -@ * INPUTS : unsigned char *dest : Pointer to destination data. -@ * unsigned int dest_pitch : Stride of destination data. -@ * unsigned int dest_width : Width of destination data. -@ * -@ * OUTPUTS : None. -@ * -@ * RETU.req_s : void -@ * -@ * FUNCTION : Scales vertical band of pixels by scale 3 to 5. The -@ * height of the band scaled is 3-pixels. -@ * -@ * SPECIAL NOTES : The routine uses the first line of the band below -@ * the current band. -@ * -@ ****************************************************************************/ -@void vertical_band_4_5_scale_armv4 -@( -@ r0 = UINT8 *dest -@ r1 = UINT32 dest_pitch -@ r2 = UINT32 dest_width -@) -_VerticalBand_3_5_Scale_ARMv4: - vertical_band_3_5_scale_armv4: @ - stmdb sp!, {r4 - r11, lr} - - ldr c51_205, =0x3300cd - ldr c102_154, =0x66009a - -vl35_loop: - mov r3, src - ldrb r4, [r3], r1 @ a = des [0] - ldrb r5, [r3], r1 @ b = des [dest_pitch] - ldrb r7, [r3], r1 @ c = des[dest_pitch*2] - add lr, src, r1 - - orr r8, r4, r5, lsl #16 @ b | a - mul r6, c102_154, r8 @ a * 102 + 154 * b - - ldrb r8, [r3, r1, lsl #1] @ d = des[dest_pitch*5] - orr r3, r7, r5, lsl #16 @ b | c - mul r9, c51_205, r3 @ b * 205 + 51 * c - add r6, r6, #0x8000 - orr r3, r5, r7, lsl #16 @ c | b - mov r6, r6, lsr #24 - strb r6, [lr], r1 - - mul r5, c51_205, r3 @ c * 205 + 154 * b - add r9, r9, #0x8000 - orr r3, r8, r7, lsl #16 @ c | d - mov r9, r9, lsr #24 - strb r9, [lr], r1 - - mul r7, c102_154, r3 @ c * 154 + 102 * d - add r5, r5, #0x8000 - add src, src, #1 - mov r5, r5, lsr #24 - strb r5, [lr], r1 - - add r7, r7, #0x8000 - subs r2, r2, #1 - mov r7, r7, lsr #24 - strb r7, [lr], r1 - - - bne vl35_loop - - ldmia sp!, {r4 - r11, pc} - @ @|vertical_band_3_5_scale_armv4| - -@/**************************************************************************** -@ * -@ * ROUTINE : horizontal_line_3_4_scale_armv4 -@ * -@ * INPUTS : const unsigned char *source : Pointer to source data. -@ * unsigned int source_width : Stride of source. -@ * unsigned char *dest : Pointer to destination data. -@ * unsigned int dest_width : Stride of destination (NOT USED). -@ * -@ * OUTPUTS : None. -@ * -@ * RETU.req_s : void -@ * -@ * FUNCTION : Copies horizontal line of pixels from source to -@ * destination scaling up by 3 to 4. -@ * -@ * SPECIAL NOTES : None. -@ * -@ * -@ ****************************************************************************/ -@void horizontal_line_3_4_scale_armv4 -@( -@ const unsigned char *source, -@ unsigned int source_width, -@ unsigned char *dest, -@ unsigned int dest_width -@) -_HorizontalLine_3_4_Scale_ARMv4: - horizontal_line_3_4_scale_armv4: @ - stmdb sp!, {r4 - r11, lr} - - ldr r10, =64 - ldr r11, =192 - mov r9, #128 - - ldrb r4, [src], #1 @ a = src[0] - -hl34_loop: - - ldrb r8, [src], #1 @ b = src[1] - ldrb r7, [src], #1 @ c = src[2] - strb r4, [dest], #1 - - mla r4, r10, r4, r9 @ a*64 + 128 - mla r4, r11, r8, r4 @ a*64 + b*192 + 1 - - add r8, r8, #1 @ b + 1 - add r8, r8, r7 @ b + c + 1 - mov r8, r8, asr #1 @ (b + c + 1) >> 1 - - mov r4, r4, asr #8 @ (a*64 + b*192 + 1) >> 8 - strb r4, [dest], #1 - - strb r8, [dest], #1 - - ldrb r4, [src], #1 @ [a+1] - - mla r7, r11, r7, r9 @ c*192 + 128 - mla r7, r4, r10, r7 @ a*64 + b*192 + 128 - - subs srcw, srcw, #3 - - mov r7, r7, asr #8 @ (a*64 + b*192 + 128) >> 8 - strb r7, [dest], #1 - - bpl hl34_loop - - ldrb r8, [src], #1 @ b = src[1] - ldrb r7, [src], #1 @ c = src[2] - strb r4, [dest], #1 - - mla r4, r10, r4, r9 @ a*64 + 128 - mla r4, r11, r8, r4 @ a*64 + b*192 + 1 - mov r4, r4, asr #8 @ (a*64 + b*192 + 1) >> 8 - strb r4, [dest], #1 - - add r8, r8, #1 @ b + 1 - add r8, r8, r7 @ b + c + 1 - mov r8, r8, asr #1 @ (b + c + 1) >> 1 - strb r8, [dest], #1 - strb r7, [dest], #1 - - ldmia sp!, {r4 - r11, pc} - @ @|vp8cx_horizontal_line_3_4_scale_c| - - -@/**************************************************************************** -@ * -@ * ROUTINE : vertical_band_3_4_scale_armv4 -@ * -@ * INPUTS : unsigned char *dest : Pointer to destination data. -@ * unsigned int dest_pitch : Stride of destination data. -@ * unsigned int dest_width : Width of destination data. -@ * -@ * OUTPUTS : None. -@ * -@ * RETU.req_s : void -@ * -@ * FUNCTION : Scales vertical band of pixels by scale 3 to 4. The -@ * height of the band scaled is 3-pixels. -@ * -@ * SPECIAL NOTES : The routine uses the first line of the band below -@ * the current band. -@ * -@ ****************************************************************************/ -@void vertical_band_3_4_scale_armv4 -@( -@ r0 = UINT8 *dest -@ r1 = UINT32 dest_pitch -@ r2 = UINT32 dest_width -@) -_VerticalBand_3_4_Scale_ARMv4: - vertical_band_3_4_scale_armv4: @ - stmdb sp!, {r4 - r11, lr} - - ldr r10, =64 - ldr r11, =192 - mov r9, #128 - -@ ldr r1,[r1] -vl34_loop: - mov r3, src - ldrb r4, [r3], r1 @ a = des [0] - ldrb r5, [r3], r1 @ b = des [dest_pitch] - ldrb r7, [r3], r1 @ c = des [dest_pitch*2] - add lr, src, r1 - - mla r4, r10, r4, r9 @ a*64 + 128 - mla r4, r11, r5, r4 @ a*64 + b*192 + 1 - - add r5, r5, #1 @ b + 1 - add r5, r5, r7 @ b + c + 1 - mov r5, r5, asr #1 @ (b + c + 1) >> 1 - - mov r4, r4, asr #8 @ (a*64 + b*192 + 1) >> 8 - strb r4, [lr], r1 - - ldrb r4, [r3, r1] @ a = des [dest_pitch*4] - - strb r5, [lr], r1 - - mla r7, r11, r7, r9 @ c*192 + 128 - mla r7, r4, r10, r7 @ a*64 + b*192 + 128 - mov r7, r7, asr #8 @ (a*64 + b*192 + 128) >> 8 - - add src, src, #1 - subs r2, r2, #1 - - strb r7, [lr] - - bne vl34_loop - - ldmia sp!, {r4 - r11, pc} - @ @|vertical_band_3_4_scale_armv4| - -@/**************************************************************************** -@ * -@ * ROUTINE : vp8cx_horizontal_line_1_2_scale_c -@ * -@ * INPUTS : const unsigned char *source : Pointer to source data. -@ * unsigned int source_width : Stride of source. -@ * unsigned char *dest : Pointer to destination data. -@ * unsigned int dest_width : Stride of destination (NOT USED). -@ * -@ * OUTPUTS : None. -@ * -@ * RETU.req_s : void -@ * -@ * FUNCTION : Copies horizontal line of pixels from source to -@ * destination scaling up by 1 to 2. -@ * -@ * SPECIAL NOTES : None. -@ * -@ ****************************************************************************/ -@void vp8cx_horizontal_line_1_2_scale_c -@( -@ const unsigned char *source, -@ unsigned int source_width, -@ unsigned char *dest, -@ unsigned int dest_width -@) -_HorizontalLine_1_2_Scale_ARMv4: - horizontal_line_1_2_scale_armv4: @ - stmdb sp!, {r4 - r5, lr} - - sub srcw, srcw, #1 - - ldrb r3, [src], #1 - ldrb r4, [src], #1 -hl12_loop: - subs srcw, srcw, #1 - - add r5, r3, r4 - add r5, r5, #1 - mov r5, r5, lsr #1 - - orr r5, r3, r5, lsl #8 - strh r5, [dest], #2 - - mov r3, r4 - - ldrneb r4, [src], #1 - bne hl12_loop - - orr r5, r4, r4, lsl #8 - strh r5, [dest] - - ldmia sp!, {r4 - r5, pc} - @ @|vertical_band_3_5_scale_armv4| - -@/**************************************************************************** -@ * -@ * ROUTINE : vp8cx_vertical_band_1_2_scale_c -@ * -@ * INPUTS : unsigned char *dest : Pointer to destination data. -@ * unsigned int dest_pitch : Stride of destination data. -@ * unsigned int dest_width : Width of destination data. -@ * -@ * OUTPUTS : None. -@ * -@ * RETU.req_s : void -@ * -@ * FUNCTION : Scales vertical band of pixels by scale 1 to 2. The -@ * height of the band scaled is 1-pixel. -@ * -@ * SPECIAL NOTES : The routine uses the first line of the band below -@ * the current band. -@ * -@ ****************************************************************************/ -@void vp8cx_vertical_band_1_2_scale_c -@( -@ r0 = UINT8 *dest -@ r1 = UINT32 dest_pitch -@ r2 = UINT32 dest_width -@) -_VerticalBand_1_2_Scale_ARMv4: - vertical_band_1_2_scale_armv4: @ - stmdb sp!, {r4 - r7, lr} - - ldr mask, =0xff00ff @ mask for selection - ldr lr, = 0x010001 - -vl12_loop: - mov r3, src - ldr r4, [r3], r1 - ldr r5, [r3, r1] - - add src, src, #4 - subs r2, r2, #4 - - and r6, r4, mask - and r7, r5, mask - - add r6, r7, r6 - add r6, r6, lr - - and r4, mask, r4, lsr #8 - and r5, mask, r5, lsr #8 - - mov r6, r6, lsr #1 - and r6, r6, mask - - add r4, r5, r4 - add r4, r4, lr - - mov r4, r4, lsr #1 - and r4, r4, mask - - orr r5, r6, r4, lsl #8 - - str r5, [r3] - - bpl vl12_loop - - ldmia sp!, {r4 - r7, pc} - @ @|vertical_band_3_5_scale_armv4| diff --git a/vpx_scale/symbian/scalesystemdependant.c b/vpx_scale/symbian/scalesystemdependant.c deleted file mode 100644 index b0bffddb7..000000000 --- a/vpx_scale/symbian/scalesystemdependant.c +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (c) 2010 The WebM project authors. All Rights Reserved. - * - * Use of this source code is governed by a BSD-style license - * that can be found in the LICENSE file in the root of the source - * tree. An additional intellectual property rights grant can be found - * in the file PATENTS. All contributing project authors may - * be found in the AUTHORS file in the root of the source tree. - */ - - -#include "vpx_scale/vpxscale.h" - -/**************************************************************************** - * - * ROUTINE : vp8_scale_machine_specific_config - * - * INPUTS : UINT32 Version : Codec version number. - * - * OUTPUTS : None. - * - * RETURNS : void - * - * FUNCTION : Checks for machine specifc features such as MMX support - * sets appropriate flags and function pointers. - * - * SPECIAL NOTES : None. - * - ****************************************************************************/ -void vp8_scale_machine_specific_config() -{ -#ifndef VPX_NO_GLOBALS - vp8_horizontal_line_1_2_scale = horizontal_line_1_2_scale_armv4; - vp8_vertical_band_1_2_scale = vertical_band_1_2_scale_armv4; - vp8_last_vertical_band_1_2_scale = vp8cx_last_vertical_band_1_2_scale_c; - vp8_horizontal_line_3_5_scale = horizontal_line_3_5_scale_armv4; - vp8_vertical_band_3_5_scale = vertical_band_3_5_scale_armv4; - vp8_last_vertical_band_3_5_scale = vp8cx_last_vertical_band_3_5_scale_c; - vp8_horizontal_line_3_4_scale = horizontal_line_3_4_scale_armv4; - vp8_vertical_band_3_4_scale = vertical_band_3_4_scale_armv4; - vp8_last_vertical_band_3_4_scale = vp8cx_last_vertical_band_3_4_scale_c; - vp8_horizontal_line_2_3_scale = horizontal_line_2_3_scale_armv4; - vp8_vertical_band_2_3_scale = vertical_band_2_3_scale_armv4; - vp8_last_vertical_band_2_3_scale = vp8cx_last_vertical_band_2_3_scale_c; - vp8_horizontal_line_4_5_scale = horizontal_line_4_5_scale_armv4; - vp8_vertical_band_4_5_scale = vertical_band_4_5_scale_armv4; - vp8_last_vertical_band_4_5_scale = vp8cx_last_vertical_band_4_5_scale_c; - - - vp8_vertical_band_5_4_scale = vp8cx_vertical_band_5_4_scale_c; - vp8_vertical_band_5_3_scale = vp8cx_vertical_band_5_3_scale_c; - vp8_vertical_band_2_1_scale = vp8cx_vertical_band_2_1_scale_c; - vp8_vertical_band_2_1_scale_i = vp8cx_vertical_band_2_1_scale_i_c; - vp8_horizontal_line_2_1_scale = vp8cx_horizontal_line_2_1_scale_c; - vp8_horizontal_line_5_3_scale = vp8cx_horizontal_line_5_3_scale_c; - vp8_horizontal_line_5_4_scale = vp8cx_horizontal_line_5_4_scale_c; -#endif -} diff --git a/vpx_scale/wce/gen_scalers_armv4.asm b/vpx_scale/wce/gen_scalers_armv4.asm deleted file mode 100644 index e495184e7..000000000 --- a/vpx_scale/wce/gen_scalers_armv4.asm +++ /dev/null @@ -1,774 +0,0 @@ -; -; Copyright (c) 2010 The WebM project authors. All Rights Reserved. -; -; Use of this source code is governed by a BSD-style license -; that can be found in the LICENSE file in the root of the source -; tree. An additional intellectual property rights grant can be found -; in the file PATENTS. All contributing project authors may -; be found in the AUTHORS file in the root of the source tree. -; - - - EXPORT |horizontal_line_4_5_scale_armv4| - EXPORT |vertical_band_4_5_scale_armv4| - EXPORT |horizontal_line_2_3_scale_armv4| - EXPORT |vertical_band_2_3_scale_armv4| - EXPORT |horizontal_line_3_5_scale_armv4| - EXPORT |vertical_band_3_5_scale_armv4| - EXPORT |horizontal_line_3_4_scale_armv4| - EXPORT |vertical_band_3_4_scale_armv4| - EXPORT |horizontal_line_1_2_scale_armv4| - EXPORT |vertical_band_1_2_scale_armv4| - - AREA |.text|, CODE, READONLY ; name this block of code - -src RN r0 -srcw RN r1 -dest RN r2 -mask RN r12 -c51_205 RN r10 -c102_154 RN r11 -;/**************************************************************************** -; * -; * ROUTINE : horizontal_line_4_5_scale_armv4 -; * -; * INPUTS : const unsigned char *source : Pointer to source data. -; * unsigned int source_width : Stride of source. -; * unsigned char *dest : Pointer to destination data. -; * unsigned int dest_width : Stride of destination (NOT USED). -; * -; * OUTPUTS : None. -; * -; * RETURNS : void -; * -; * FUNCTION : Copies horizontal line of pixels from source to -; * destination scaling up by 4 to 5. -; * -; * SPECIAL NOTES : None. -; * -; ****************************************************************************/ -;void horizontal_line_4_5_scale_armv4 -;( -; r0 = UINT8 *source -; r1 = UINT32 source_width -; r2 = UINT8 *dest -; r3 = UINT32 dest_width -;) -|horizontal_line_4_5_scale_armv4| PROC - stmdb sp!, {r4 - r11, lr} - - mov mask, #255 ; mask for selection - ldr c51_205, =0x3300cd - ldr c102_154, =0x66009a - - ldr r3, [src], #4 - -hl45_loop - - and r4, r3, mask ; a = src[0] - and r5, mask, r3, lsr #8 ; b = src[1] - strb r4, [dest], #1 - - orr r6, r4, r5, lsl #16 ; b | a - and r7, mask, r3, lsr #16 ; c = src[2] - mul r6, c51_205, r6 ; a * 51 + 205 * b - - orr r5, r5, r7, lsl #16 ; c | b - mul r5, c102_154, r5 ; b * 102 + 154 * c - add r6, r6, #0x8000 - and r8, mask, r3, lsr #24 ; d = src[3] - mov r6, r6, lsr #24 - strb r6, [dest], #1 - - orr r7, r8, r7, lsl #16 ; c | d - mul r7, c102_154, r7 ; c * 154 + 102 * d - add r5, r5, #0x8000 - ldr r3, [src], #4 - mov r5, r5, lsr #24 - strb r5, [dest], #1 - - add r7, r7, #0x8000 - and r9, mask, r3 ; e = src[4] - orr r9, r9, r8, lsl #16 ; d | e - mul r9, c51_205, r9 ; d * 205 + 51 * e - mov r7, r7, lsr #24 - strb r7, [dest], #1 - - add r9, r9, #0x8000 - subs srcw, srcw, #4 - mov r9, r9, lsr #24 - strb r9, [dest], #1 - - bne hl45_loop - - and r4, r3, mask - and r5, mask, r3, lsl #8 - strb r4, [dest], #1 - - orr r6, r4, r5, lsl #16 ; b | a - mul r6, c51_205, r6 - - and r7, mask, r3, lsl #16 - orr r5, r5, r7, lsl #16 ; c | b - mul r5, c102_154, r5 - add r6, r6, #0x8000 - and r8, mask, r3, lsl #24 - mov r6, r6, lsr #24 - strb r6, [dest], #1 - - orr r7, r8, r7, lsl #16 ; c | d - mul r7, c102_154, r7 - add r5, r5, #0x8000 - mov r5, r5, lsr #24 - strb r5, [dest], #1 - - add r7, r7, #0x8000 - mov r7, r7, lsr #24 - strb r7, [dest], #1 - - ldrb r3, [src] - strb r3, [dest], #1 - - ldmia sp!, {r4 - r11, pc} - ENDP ;|vp8cx_horizontal_line_4_5_scale_c| - -;/**************************************************************************** -; * -; * ROUTINE : vertical_band_4_5_scale_armv4 -; * -; * INPUTS : unsigned char *dest : Pointer to destination data. -; * unsigned int dest_pitch : Stride of destination data. -; * unsigned int dest_width : Width of destination data. -; * -; * OUTPUTS : None. -; * -; * RETURNS : void -; * -; * FUNCTION : Scales vertical band of pixels by scale 4 to 5. The -; * height of the band scaled is 4-pixels. -; * -; * SPECIAL NOTES : The routine uses the first line of the band below -; * the current band. -; * -; ****************************************************************************/ -;void vertical_band_4_5_scale_armv4 -;( -; r0 = UINT8 *dest -; r1 = UINT32 dest_pitch -; r2 = UINT32 dest_width -;) -|vertical_band_4_5_scale_armv4| PROC - stmdb sp!, {r4 - r11, lr} - - ldr c51_205, =0x3300cd - ldr c102_154, =0x66009a - -vl45_loop - mov r3, src - ldrb r4, [r3], r1 ; a = des [0] - ldrb r5, [r3], r1 ; b = des [dest_pitch] - ldrb r7, [r3], r1 ; c = des[dest_pitch*2] - add lr, src, r1 - - orr r6, r4, r5, lsl #16 ; b | a - mul r6, c51_205, r6 ; a * 51 + 205 * b - - ldrb r8, [r3], r1 ; d = des[dest_pitch*3] - orr r5, r5, r7, lsl #16 ; c | b - mul r5, c102_154, r5 ; b * 102 + 154 * c - add r6, r6, #0x8000 - orr r7, r8, r7, lsl #16 ; c | d - mov r6, r6, lsr #24 - strb r6, [lr], r1 - - ldrb r9, [r3, r1] ; e = des [dest_pitch * 5] - mul r7, c102_154, r7 ; c * 154 + 102 * d - add r5, r5, #0x8000 - orr r9, r9, r8, lsl #16 ; d | e - mov r5, r5, lsr #24 - strb r5, [lr], r1 - - mul r9, c51_205, r9 ; d * 205 + 51 * e - add r7, r7, #0x8000 - add src, src, #1 - mov r7, r7, lsr #24 - strb r7, [lr], r1 - - add r9, r9, #0x8000 - subs r2, r2, #1 - mov r9, r9, lsr #24 - strb r9, [lr], r1 - - bne vl45_loop - - ldmia sp!, {r4 - r11, pc} - ENDP ;|vertical_band_4_5_scale_armv4| - -;/**************************************************************************** -; * -; * ROUTINE : horizontal_line_2_3_scale_armv4 -; * -; * INPUTS : const unsigned char *source : Pointer to source data. -; * unsigned int source_width : Stride of source. -; * unsigned char *dest : Pointer to destination data. -; * unsigned int dest_width : Stride of destination (NOT USED). -; * -; * OUTPUTS : None. -; * -; * RETURNS : void -; * -; * FUNCTION : Copies horizontal line of pixels from source to -; * destination scaling up by 2 to 3. -; * -; * SPECIAL NOTES : None. -; * -; * -; ****************************************************************************/ -;void horizontal_line_2_3_scale_armv4 -;( -; const unsigned char *source, -; unsigned int source_width, -; unsigned char *dest, -; unsigned int dest_width -;) -|horizontal_line_2_3_scale_armv4| PROC - stmdb sp!, {r4 - r11, lr} - ldr lr, =85 - ldr r12, =171 - -hl23_loop - - ldrb r3, [src], #1 ; a - ldrb r4, [src], #1 ; b - ldrb r5, [src] ; c - - strb r3, [dest], #1 - mul r4, r12, r4 ; b * 171 - mla r6, lr, r3, r4 ; a * 85 - mla r7, lr, r5, r4 ; c * 85 - - add r6, r6, #128 - mov r6, r6, lsr #8 - strb r6, [dest], #1 - - add r7, r7, #128 - mov r7, r7, lsr #8 - strb r7, [dest], #1 - - subs srcw, srcw, #2 - bne hl23_loop - - ldrb r4, [src, #1] ; b - strb r5, [dest], #1 - strb r4, [dest, #1] - - mul r4, r12, r4 ; b * 171 - mla r6, lr, r5, r4 ; a * 85 + b *171 - - add r6, r6, #128 - mov r6, r6, lsr #8 - strb r6, [dest] - - ldmia sp!, {r4 - r11, pc} - ENDP ;|horizontal_line_2_3_scale_armv4| - -;/**************************************************************************** -; * -; * ROUTINE : vertical_band_2_3_scale_armv4 -; * -; * INPUTS : unsigned char *dest : Pointer to destination data. -; * unsigned int dest_pitch : Stride of destination data. -; * unsigned int dest_width : Width of destination data. -; * -; * OUTPUTS : None. -; * -; * RETURNS : void -; * -; * FUNCTION : Scales vertical band of pixels by scale 2 to 3. The -; * height of the band scaled is 2-pixels. -; * -; * SPECIAL NOTES : The routine uses the first line of the band below -; * the current band. -; * -; ****************************************************************************/ -;void vertical_band_2_3_scale_armv4 -;( -; r0 = UINT8 *dest -; r1 = UINT32 dest_pitch -; r2 = UINT32 dest_width -;) -|vertical_band_2_3_scale_armv4| PROC - stmdb sp!, {r4 - r8, lr} - ldr lr, =85 - ldr r12, =171 - add r3, r1, r1, lsl #1 ; 3 * dest_pitch - -vl23_loop - ldrb r4, [src] ; a = des [0] - ldrb r5, [src, r1] ; b = des [dest_pitch] - ldrb r7, [src, r3] ; c = des [dest_pitch*3] - subs r2, r2, #1 - - mul r5, r12, r5 ; b * 171 - mla r6, lr, r4, r5 ; a * 85 - mla r8, lr, r7, r5 ; c * 85 - - add r6, r6, #128 - mov r6, r6, lsr #8 - strb r6, [src, r1] - - add r8, r8, #128 - mov r8, r8, lsr #8 - strb r8, [src, r1, lsl #1] - - add src, src, #1 - - bne vl23_loop - - ldmia sp!, {r4 - r8, pc} - ENDP ;|vertical_band_2_3_scale_armv4| - -;/**************************************************************************** -; * -; * ROUTINE : vp8cx_horizontal_line_3_5_scale_c -; * -; * INPUTS : const unsigned char *source : Pointer to source data. -; * unsigned int source_width : Stride of source. -; * unsigned char *dest : Pointer to destination data. -; * unsigned int dest_width : Stride of destination (NOT USED). -; * -; * OUTPUTS : None. -; * -; * RETURNS : void -; * -; * FUNCTION : Copies horizontal line of pixels from source to -; * destination scaling up by 3 to 5. -; * -; * SPECIAL NOTES : None. -; * -; * -; ****************************************************************************/ -;void vp8cx_horizontal_line_3_5_scale_c -;( -; const unsigned char *source, -; unsigned int source_width, -; unsigned char *dest, -; unsigned int dest_width -;) -|horizontal_line_3_5_scale_armv4| PROC - stmdb sp!, {r4 - r11, lr} - - ldr c51_205, =0x3300cd - ldr c102_154, =0x66009a - - ldrb r4, [src], #1 ; a = src[0] - -hl35_loop - - ldrb r8, [src], #1 ; b = src[1] - strb r4, [dest], #1 - - orr r6, r4, r8, lsl #16 ; b | a - ldrb r9, [src], #1 ; c = src[2] - mul r6, c102_154, r6 ; a * 102 + 154 * b - - orr r5, r9, r8, lsl #16 ; b | c - mul r5, c51_205, r5 ; b * 205 + 51 * c - add r6, r6, #0x8000 - ldrb r4, [src], #1 ; d = src[3] - mov r6, r6, lsr #24 - strb r6, [dest], #1 - - orr r7, r8, r9, lsl #16 ; c | b - mul r7, c51_205, r7 ; c * 205 + 154 * b - add r5, r5, #0x8000 - mov r5, r5, lsr #24 - strb r5, [dest], #1 - - orr r9, r4, r9, lsl #16 ; c | d - mul r9, c102_154, r9 ; c * 154 + 102 * d - add r7, r7, #0x8000 - mov r7, r7, lsr #24 - strb r7, [dest], #1 - - add r9, r9, #0x8000 - subs srcw, srcw, #3 - mov r9, r9, lsr #24 - strb r9, [dest], #1 - - bpl hl35_loop - - ldrb r5, [src], #1 ; b = src[1] - strb r4, [dest], #1 - - orr r6, r4, r8, lsl #16 ; b | a - ldrb r9, [src], #1 ; c = src[2] - mul r6, c102_154, r6 ; a * 102 + 154 * b - - orr r5, r9, r8, lsl #16 ; b | c - mul r5, c51_205, r5 ; b * 205 + 51 * c - add r6, r6, #0x8000 - mov r6, r6, lsr #24 - strb r6, [dest], #1 - - orr r7, r8, r9, lsl #16 ; c | b - mul r7, c51_205, r7 ; c * 205 + 154 * b - add r5, r5, #0x8000 - mov r5, r5, lsr #24 - strb r5, [dest], #1 - - add r7, r7, #0x8000 - mov r7, r7, lsr #24 - strb r7, [dest], #1 - strb r9, [dest], #1 - - ldmia sp!, {r4 - r11, pc} - ENDP ;|vp8cx_horizontal_line_3_5_scale_c| - - -;/**************************************************************************** -; * -; * ROUTINE : vp8cx_vertical_band_3_5_scale_c -; * -; * INPUTS : unsigned char *dest : Pointer to destination data. -; * unsigned int dest_pitch : Stride of destination data. -; * unsigned int dest_width : Width of destination data. -; * -; * OUTPUTS : None. -; * -; * RETURNS : void -; * -; * FUNCTION : Scales vertical band of pixels by scale 3 to 5. The -; * height of the band scaled is 3-pixels. -; * -; * SPECIAL NOTES : The routine uses the first line of the band below -; * the current band. -; * -; ****************************************************************************/ -;void vertical_band_4_5_scale_armv4 -;( -; r0 = UINT8 *dest -; r1 = UINT32 dest_pitch -; r2 = UINT32 dest_width -;) -|vertical_band_3_5_scale_armv4| PROC - stmdb sp!, {r4 - r11, lr} - - ldr c51_205, =0x3300cd - ldr c102_154, =0x66009a - -vl35_loop - mov r3, src - ldrb r4, [r3], r1 ; a = des [0] - ldrb r5, [r3], r1 ; b = des [dest_pitch] - ldrb r7, [r3], r1 ; c = des[dest_pitch*2] - add lr, src, r1 - - orr r8, r4, r5, lsl #16 ; b | a - mul r6, c102_154, r8 ; a * 102 + 154 * b - - ldrb r8, [r3, r1, lsl #1] ; d = des[dest_pitch*5] - orr r3, r7, r5, lsl #16 ; b | c - mul r9, c51_205, r3 ; b * 205 + 51 * c - add r6, r6, #0x8000 - orr r3, r5, r7, lsl #16 ; c | b - mov r6, r6, lsr #24 - strb r6, [lr], r1 - - mul r5, c51_205, r3 ; c * 205 + 154 * b - add r9, r9, #0x8000 - orr r3, r8, r7, lsl #16 ; c | d - mov r9, r9, lsr #24 - strb r9, [lr], r1 - - mul r7, c102_154, r3 ; c * 154 + 102 * d - add r5, r5, #0x8000 - add src, src, #1 - mov r5, r5, lsr #24 - strb r5, [lr], r1 - - add r7, r7, #0x8000 - subs r2, r2, #1 - mov r7, r7, lsr #24 - strb r7, [lr], r1 - - - bne vl35_loop - - ldmia sp!, {r4 - r11, pc} - ENDP ;|vertical_band_3_5_scale_armv4| - -;/**************************************************************************** -; * -; * ROUTINE : horizontal_line_3_4_scale_armv4 -; * -; * INPUTS : const unsigned char *source : Pointer to source data. -; * unsigned int source_width : Stride of source. -; * unsigned char *dest : Pointer to destination data. -; * unsigned int dest_width : Stride of destination (NOT USED). -; * -; * OUTPUTS : None. -; * -; * RETURNS : void -; * -; * FUNCTION : Copies horizontal line of pixels from source to -; * destination scaling up by 3 to 4. -; * -; * SPECIAL NOTES : None. -; * -; * -; ****************************************************************************/ -;void horizontal_line_3_4_scale_armv4 -;( -; const unsigned char *source, -; unsigned int source_width, -; unsigned char *dest, -; unsigned int dest_width -;) -|horizontal_line_3_4_scale_armv4| PROC - stmdb sp!, {r4 - r11, lr} - - ldr r10, =64 - ldr r11, =192 - mov r9, #128 - - ldrb r4, [src], #1 ; a = src[0] - -hl34_loop - - ldrb r8, [src], #1 ; b = src[1] - ldrb r7, [src], #1 ; c = src[2] - strb r4, [dest], #1 - - mla r4, r10, r4, r9 ; a*64 + 128 - mla r4, r11, r8, r4 ; a*64 + b*192 + 1 - - add r8, r8, #1 ; b + 1 - add r8, r8, r7 ; b + c + 1 - mov r8, r8, asr #1 ; (b + c + 1) >> 1 - - mov r4, r4, asr #8 ; (a*64 + b*192 + 1) >> 8 - strb r4, [dest], #1 - - strb r8, [dest], #1 - - ldrb r4, [src], #1 ; [a+1] - - mla r7, r11, r7, r9 ; c*192 + 128 - mla r7, r4, r10, r7 ; a*64 + b*192 + 128 - - subs srcw, srcw, #3 - - mov r7, r7, asr #8 ; (a*64 + b*192 + 128) >> 8 - strb r7, [dest], #1 - - bpl hl34_loop - - ldrb r8, [src], #1 ; b = src[1] - ldrb r7, [src], #1 ; c = src[2] - strb r4, [dest], #1 - - mla r4, r10, r4, r9 ; a*64 + 128 - mla r4, r11, r8, r4 ; a*64 + b*192 + 1 - mov r4, r4, asr #8 ; (a*64 + b*192 + 1) >> 8 - strb r4, [dest], #1 - - add r8, r8, #1 ; b + 1 - add r8, r8, r7 ; b + c + 1 - mov r8, r8, asr #1 ; (b + c + 1) >> 1 - strb r8, [dest], #1 - strb r7, [dest], #1 - - ldmia sp!, {r4 - r11, pc} - ENDP ;|vp8cx_horizontal_line_3_4_scale_c| - - -;/**************************************************************************** -; * -; * ROUTINE : vertical_band_3_4_scale_armv4 -; * -; * INPUTS : unsigned char *dest : Pointer to destination data. -; * unsigned int dest_pitch : Stride of destination data. -; * unsigned int dest_width : Width of destination data. -; * -; * OUTPUTS : None. -; * -; * RETURNS : void -; * -; * FUNCTION : Scales vertical band of pixels by scale 3 to 4. The -; * height of the band scaled is 3-pixels. -; * -; * SPECIAL NOTES : The routine uses the first line of the band below -; * the current band. -; * -; ****************************************************************************/ -;void vertical_band_3_4_scale_armv4 -;( -; r0 = UINT8 *dest -; r1 = UINT32 dest_pitch -; r2 = UINT32 dest_width -;) -|vertical_band_3_4_scale_armv4| PROC - stmdb sp!, {r4 - r11, lr} - - ldr r10, =64 - ldr r11, =192 - mov r9, #128 - -; ldr r1,[r1] -vl34_loop - mov r3, src - ldrb r4, [r3], r1 ; a = des [0] - ldrb r5, [r3], r1 ; b = des [dest_pitch] - ldrb r7, [r3], r1 ; c = des [dest_pitch*2] - add lr, src, r1 - - mla r4, r10, r4, r9 ; a*64 + 128 - mla r4, r11, r5, r4 ; a*64 + b*192 + 1 - - add r5, r5, #1 ; b + 1 - add r5, r5, r7 ; b + c + 1 - mov r5, r5, asr #1 ; (b + c + 1) >> 1 - - mov r4, r4, asr #8 ; (a*64 + b*192 + 1) >> 8 - strb r4, [lr], r1 - - ldrb r4, [r3, r1] ; a = des [dest_pitch*4] - - strb r5, [lr], r1 - - mla r7, r11, r7, r9 ; c*192 + 128 - mla r7, r4, r10, r7 ; a*64 + b*192 + 128 - mov r7, r7, asr #8 ; (a*64 + b*192 + 128) >> 8 - - add src, src, #1 - subs r2, r2, #1 - - strb r7, [lr] - - bne vl34_loop - - ldmia sp!, {r4 - r11, pc} - ENDP ;|vertical_band_3_4_scale_armv4| - -;/**************************************************************************** -; * -; * ROUTINE : vp8cx_horizontal_line_1_2_scale_c -; * -; * INPUTS : const unsigned char *source : Pointer to source data. -; * unsigned int source_width : Stride of source. -; * unsigned char *dest : Pointer to destination data. -; * unsigned int dest_width : Stride of destination (NOT USED). -; * -; * OUTPUTS : None. -; * -; * RETURNS : void -; * -; * FUNCTION : Copies horizontal line of pixels from source to -; * destination scaling up by 1 to 2. -; * -; * SPECIAL NOTES : None. -; * -; ****************************************************************************/ -;void vp8cx_horizontal_line_1_2_scale_c -;( -; const unsigned char *source, -; unsigned int source_width, -; unsigned char *dest, -; unsigned int dest_width -;) -|horizontal_line_1_2_scale_armv4| PROC - stmdb sp!, {r4 - r5, lr} - - sub srcw, srcw, #1 - - ldrb r3, [src], #1 - ldrb r4, [src], #1 -hl12_loop - subs srcw, srcw, #1 - - add r5, r3, r4 - add r5, r5, #1 - mov r5, r5, lsr #1 - - orr r5, r3, r5, lsl #8 - strh r5, [dest], #2 - - mov r3, r4 - - ldrneb r4, [src], #1 - bne hl12_loop - - orr r5, r4, r4, lsl #8 - strh r5, [dest] - - ldmia sp!, {r4 - r5, pc} - ENDP ;|vertical_band_3_5_scale_armv4| - -;/**************************************************************************** -; * -; * ROUTINE : vp8cx_vertical_band_1_2_scale_c -; * -; * INPUTS : unsigned char *dest : Pointer to destination data. -; * unsigned int dest_pitch : Stride of destination data. -; * unsigned int dest_width : Width of destination data. -; * -; * OUTPUTS : None. -; * -; * RETURNS : void -; * -; * FUNCTION : Scales vertical band of pixels by scale 1 to 2. The -; * height of the band scaled is 1-pixel. -; * -; * SPECIAL NOTES : The routine uses the first line of the band below -; * the current band. -; * -; ****************************************************************************/ -;void vp8cx_vertical_band_1_2_scale_c -;( -; r0 = UINT8 *dest -; r1 = UINT32 dest_pitch -; r2 = UINT32 dest_width -;) -|vertical_band_1_2_scale_armv4| PROC - stmdb sp!, {r4 - r7, lr} - - ldr mask, =0xff00ff ; mask for selection - ldr lr, = 0x010001 - -vl12_loop - mov r3, src - ldr r4, [r3], r1 - ldr r5, [r3, r1] - - add src, src, #4 - subs r2, r2, #4 - - and r6, r4, mask - and r7, r5, mask - - add r6, r7, r6 - add r6, r6, lr - - and r4, mask, r4, lsr #8 - and r5, mask, r5, lsr #8 - - mov r6, r6, lsr #1 - and r6, r6, mask - - add r4, r5, r4 - add r4, r4, lr - - mov r4, r4, lsr #1 - and r4, r4, mask - - orr r5, r6, r4, lsl #8 - - str r5, [r3] - - bpl vl12_loop - - ldmia sp!, {r4 - r7, pc} - ENDP ;|vertical_band_3_5_scale_armv4| - - END diff --git a/vpx_scale/wce/scalesystemdependant.c b/vpx_scale/wce/scalesystemdependant.c deleted file mode 100644 index e9f2c26a9..000000000 --- a/vpx_scale/wce/scalesystemdependant.c +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (c) 2010 The WebM project authors. All Rights Reserved. - * - * Use of this source code is governed by a BSD-style license - * that can be found in the LICENSE file in the root of the source - * tree. An additional intellectual property rights grant can be found - * in the file PATENTS. All contributing project authors may - * be found in the AUTHORS file in the root of the source tree. - */ - - -#include "vpx_scale/vpxscale.h" - -/**************************************************************************** -* Imports -*****************************************************************************/ - -/**************************************************************************** - * - * ROUTINE : vp8_scale_machine_specific_config - * - * INPUTS : UINT32 Version : Codec version number. - * - * OUTPUTS : None. - * - * RETURNS : void - * - * FUNCTION : Checks for machine specifc features such as MMX support - * sets appropriate flags and function pointers. - * - * SPECIAL NOTES : None. - * - ****************************************************************************/ -void vp8_scale_machine_specific_config() -{ - vp8_horizontal_line_1_2_scale = horizontal_line_1_2_scale_armv4; - vp8_vertical_band_1_2_scale = vertical_band_1_2_scale_armv4; - vp8_last_vertical_band_1_2_scale = vp8cx_last_vertical_band_1_2_scale_c; - vp8_horizontal_line_3_5_scale = horizontal_line_3_5_scale_armv4; - vp8_vertical_band_3_5_scale = vertical_band_3_5_scale_armv4; - vp8_last_vertical_band_3_5_scale = vp8cx_last_vertical_band_3_5_scale_c; - vp8_horizontal_line_3_4_scale = horizontal_line_3_4_scale_armv4; - vp8_vertical_band_3_4_scale = vertical_band_3_4_scale_armv4; - vp8_last_vertical_band_3_4_scale = vp8cx_last_vertical_band_3_4_scale_c; - vp8_horizontal_line_2_3_scale = horizontal_line_2_3_scale_armv4; - vp8_vertical_band_2_3_scale = vertical_band_2_3_scale_armv4; - vp8_last_vertical_band_2_3_scale = vp8cx_last_vertical_band_2_3_scale_c; - vp8_horizontal_line_4_5_scale = horizontal_line_4_5_scale_armv4; - vp8_vertical_band_4_5_scale = vertical_band_4_5_scale_armv4; - vp8_last_vertical_band_4_5_scale = vp8cx_last_vertical_band_4_5_scale_c; - - - vp8_vertical_band_5_4_scale = vp8cx_vertical_band_5_4_scale_c; - vp8_vertical_band_5_3_scale = vp8cx_vertical_band_5_3_scale_c; - vp8_vertical_band_2_1_scale = vp8cx_vertical_band_2_1_scale_c; - vp8_vertical_band_2_1_scale_i = vp8cx_vertical_band_2_1_scale_i_c; - vp8_horizontal_line_2_1_scale = vp8cx_horizontal_line_2_1_scale_c; - vp8_horizontal_line_5_3_scale = vp8cx_horizontal_line_5_3_scale_c; - vp8_horizontal_line_5_4_scale = vp8cx_horizontal_line_5_4_scale_c; -} diff --git a/vpx_scale/x86_64/scaleopt.c b/vpx_scale/x86_64/scaleopt.c deleted file mode 100644 index 101f5ff60..000000000 --- a/vpx_scale/x86_64/scaleopt.c +++ /dev/null @@ -1,1750 +0,0 @@ -/* - * Copyright (c) 2010 The WebM project authors. All Rights Reserved. - * - * Use of this source code is governed by a BSD-style license - * that can be found in the LICENSE file in the root of the source - * tree. An additional intellectual property rights grant can be found - * in the file PATENTS. All contributing project authors may - * be found in the AUTHORS file in the root of the source tree. - */ - - -/**************************************************************************** -* -* Module Title : scaleopt.cpp -* -* Description : Optimized scaling functions -* -****************************************************************************/ -#include "pragmas.h" - - - -/**************************************************************************** -* Module Statics -****************************************************************************/ -__declspec(align(16)) const static unsigned short one_fifth[] = { 51, 51, 51, 51 }; -__declspec(align(16)) const static unsigned short two_fifths[] = { 102, 102, 102, 102 }; -__declspec(align(16)) const static unsigned short three_fifths[] = { 154, 154, 154, 154 }; -__declspec(align(16)) const static unsigned short four_fifths[] = { 205, 205, 205, 205 }; -__declspec(align(16)) const static unsigned short round_values[] = { 128, 128, 128, 128 }; -__declspec(align(16)) const static unsigned short four_ones[] = { 1, 1, 1, 1}; -__declspec(align(16)) const static unsigned short const45_2[] = {205, 154, 102, 51 }; -__declspec(align(16)) const static unsigned short const45_1[] = { 51, 102, 154, 205 }; -__declspec(align(16)) const static unsigned char mask45[] = { 0, 0, 0, 0, 0, 0, 255, 0}; -__declspec(align(16)) const static unsigned short const35_2[] = { 154, 51, 205, 102 }; -__declspec(align(16)) const static unsigned short const35_1[] = { 102, 205, 51, 154 }; - - - -#include "vpx_scale/vpxscale.h" -#include "vpx_mem/vpx_mem.h" - -/**************************************************************************** -* -* ROUTINE : horizontal_line_3_5_scale_mmx -* -* INPUTS : const unsigned char *source : -* unsigned int source_width : -* unsigned char *dest : -* unsigned int dest_width : -* -* OUTPUTS : None. -* -* RETURNS : void -* -* FUNCTION : 3 to 5 up-scaling of a horizontal line of pixels. -* -* SPECIAL NOTES : None. -* -****************************************************************************/ -static -void horizontal_line_3_5_scale_mmx -( - const unsigned char *source, - unsigned int source_width, - unsigned char *dest, - unsigned int dest_width -) -{ - (void) dest_width; - - __asm - { - - push rbx - - mov rsi, source - mov rdi, dest - - mov ecx, source_width - lea rdx, [rsi+rcx-3]; - - movq mm5, const35_1 // mm5 = 66 xx cd xx 33 xx 9a xx - movq mm6, const35_2 // mm6 = 9a xx 33 xx cd xx 66 xx - - movq mm4, round_values // mm4 = 80 xx 80 xx 80 xx 80 xx - pxor mm7, mm7 // clear mm7 - - horiz_line_3_5_loop: - - mov eax, DWORD PTR [rsi] // eax = 00 01 02 03 - mov ebx, eax - - and ebx, 0xffff00 // ebx = xx 01 02 xx - mov ecx, eax // ecx = 00 01 02 03 - - and eax, 0xffff0000 // eax = xx xx 02 03 - xor ecx, eax // ecx = 00 01 xx xx - - shr ebx, 8 // ebx = 01 02 xx xx - or eax, ebx // eax = 01 02 02 03 - - shl ebx, 16 // ebx = xx xx 01 02 - movd mm1, eax // mm1 = 01 02 02 03 xx xx xx xx - - or ebx, ecx // ebx = 00 01 01 02 - punpcklbw mm1, mm7 // mm1 = 01 xx 02 xx 02 xx 03 xx - - movd mm0, ebx // mm0 = 00 01 01 02 - pmullw mm1, mm6 // - - punpcklbw mm0, mm7 // mm0 = 00 xx 01 xx 01 xx 02 xx - pmullw mm0, mm5 // - - mov [rdi], ebx // writeoutput 00 xx xx xx - add rsi, 3 - - add rdi, 5 - paddw mm0, mm1 - - paddw mm0, mm4 - psrlw mm0, 8 - - cmp rsi, rdx - packuswb mm0, mm7 - - movd DWORD Ptr [rdi-4], mm0 - jl horiz_line_3_5_loop - -//Exit: - mov eax, DWORD PTR [rsi] // eax = 00 01 02 03 - mov ebx, eax - - and ebx, 0xffff00 // ebx = xx 01 02 xx - mov ecx, eax // ecx = 00 01 02 03 - - and eax, 0xffff0000 // eax = xx xx 02 03 - xor ecx, eax // ecx = 00 01 xx xx - - shr ebx, 8 // ebx = 01 02 xx xx - or eax, ebx // eax = 01 02 02 03 - - shl eax, 8 // eax = xx 01 02 02 - and eax, 0xffff0000 // eax = xx xx 02 02 - - or eax, ebx // eax = 01 02 02 02 - - shl ebx, 16 // ebx = xx xx 01 02 - movd mm1, eax // mm1 = 01 02 02 02 xx xx xx xx - - or ebx, ecx // ebx = 00 01 01 02 - punpcklbw mm1, mm7 // mm1 = 01 xx 02 xx 02 xx 02 xx - - movd mm0, ebx // mm0 = 00 01 01 02 - pmullw mm1, mm6 // - - punpcklbw mm0, mm7 // mm0 = 00 xx 01 xx 01 xx 02 xx - pmullw mm0, mm5 // - - mov [rdi], ebx // writeoutput 00 xx xx xx - paddw mm0, mm1 - - paddw mm0, mm4 - psrlw mm0, 8 - - packuswb mm0, mm7 - movd DWORD Ptr [rdi+1], mm0 - - pop rbx - - } - -} - - -/**************************************************************************** -* -* ROUTINE : horizontal_line_4_5_scale_mmx -* -* INPUTS : const unsigned char *source : -* unsigned int source_width : -* unsigned char *dest : -* unsigned int dest_width : -* -* OUTPUTS : None. -* -* RETURNS : void -* -* FUNCTION : 4 to 5 up-scaling of a horizontal line of pixels. -* -* SPECIAL NOTES : None. -* -****************************************************************************/ -static -void horizontal_line_4_5_scale_mmx -( - const unsigned char *source, - unsigned int source_width, - unsigned char *dest, - unsigned int dest_width -) -{ - (void)dest_width; - - __asm - { - - mov rsi, source - mov rdi, dest - - mov ecx, source_width - lea rdx, [rsi+rcx-8]; - - movq mm5, const45_1 // mm5 = 33 xx 66 xx 9a xx cd xx - movq mm6, const45_2 // mm6 = cd xx 9a xx 66 xx 33 xx - - movq mm4, round_values // mm4 = 80 xx 80 xx 80 xx 80 xx - pxor mm7, mm7 // clear mm7 - - horiz_line_4_5_loop: - - movq mm0, QWORD PTR [rsi] // mm0 = 00 01 02 03 04 05 06 07 - movq mm1, QWORD PTR [rsi+1]; // mm1 = 01 02 03 04 05 06 07 08 - - movq mm2, mm0 // mm2 = 00 01 02 03 04 05 06 07 - movq mm3, mm1 // mm3 = 01 02 03 04 05 06 07 08 - - movd DWORD PTR [rdi], mm0 // write output 00 xx xx xx - punpcklbw mm0, mm7 // mm0 = 00 xx 01 xx 02 xx 03 xx - - punpcklbw mm1, mm7 // mm1 = 01 xx 02 xx 03 xx 04 xx - pmullw mm0, mm5 // 00* 51 01*102 02*154 03*205 - - pmullw mm1, mm6 // 01*205 02*154 03*102 04* 51 - punpckhbw mm2, mm7 // mm2 = 04 xx 05 xx 06 xx 07 xx - - movd DWORD PTR [rdi+5], mm2 // write ouput 05 xx xx xx - pmullw mm2, mm5 // 04* 51 05*102 06*154 07*205 - - punpckhbw mm3, mm7 // mm3 = 05 xx 06 xx 07 xx 08 xx - pmullw mm3, mm6 // 05*205 06*154 07*102 08* 51 - - paddw mm0, mm1 // added round values - paddw mm0, mm4 - - psrlw mm0, 8 // output: 01 xx 02 xx 03 xx 04 xx - packuswb mm0, mm7 - - movd DWORD PTR [rdi+1], mm0 // write output 01 02 03 04 - add rdi, 10 - - add rsi, 8 - paddw mm2, mm3 // - - paddw mm2, mm4 // added round values - cmp rsi, rdx - - psrlw mm2, 8 - packuswb mm2, mm7 - - movd DWORD PTR [rdi-4], mm2 // writeoutput 06 07 08 09 - jl horiz_line_4_5_loop - -//Exit: - movq mm0, [rsi] // mm0 = 00 01 02 03 04 05 06 07 - movq mm1, mm0 // mm1 = 00 01 02 03 04 05 06 07 - - movq mm2, mm0 // mm2 = 00 01 02 03 04 05 06 07 - psrlq mm1, 8 // mm1 = 01 02 03 04 05 06 07 00 - - movq mm3, mask45 // mm3 = 00 00 00 00 00 00 ff 00 - pand mm3, mm1 // mm3 = 00 00 00 00 00 00 07 00 - - psllq mm3, 8 // mm3 = 00 00 00 00 00 00 00 07 - por mm1, mm3 // mm1 = 01 02 03 04 05 06 07 07 - - movq mm3, mm1 - - movd DWORD PTR [rdi], mm0 // write output 00 xx xx xx - punpcklbw mm0, mm7 // mm0 = 00 xx 01 xx 02 xx 03 xx - - punpcklbw mm1, mm7 // mm1 = 01 xx 02 xx 03 xx 04 xx - pmullw mm0, mm5 // 00* 51 01*102 02*154 03*205 - - pmullw mm1, mm6 // 01*205 02*154 03*102 04* 51 - punpckhbw mm2, mm7 // mm2 = 04 xx 05 xx 06 xx 07 xx - - movd DWORD PTR [rdi+5], mm2 // write ouput 05 xx xx xx - pmullw mm2, mm5 // 04* 51 05*102 06*154 07*205 - - punpckhbw mm3, mm7 // mm3 = 05 xx 06 xx 07 xx 08 xx - pmullw mm3, mm6 // 05*205 06*154 07*102 07* 51 - - paddw mm0, mm1 // added round values - paddw mm0, mm4 - - psrlw mm0, 8 // output: 01 xx 02 xx 03 xx 04 xx - packuswb mm0, mm7 // 01 02 03 04 xx xx xx xx - - movd DWORD PTR [rdi+1], mm0 // write output 01 02 03 04 - paddw mm2, mm3 // - - paddw mm2, mm4 // added round values - psrlw mm2, 8 - - packuswb mm2, mm7 - movd DWORD PTR [rdi+6], mm2 // writeoutput 06 07 08 09 - - - } -} - -/**************************************************************************** -* -* ROUTINE : vertical_band_4_5_scale_mmx -* -* INPUTS : unsigned char *dest : -* unsigned int dest_pitch : -* unsigned int dest_width : -* -* OUTPUTS : None. -* -* RETURNS : void -* -* FUNCTION : 4 to 5 up-scaling of a 4 pixel high band of pixels. -* -* SPECIAL NOTES : The routine uses the first line of the band below -* the current band. The function also has a "C" only -* version. -* -****************************************************************************/ -static -void vertical_band_4_5_scale_mmx -( - unsigned char *dest, - unsigned int dest_pitch, - unsigned int dest_width -) -{ - __asm - { - - mov rsi, dest // Get the source and destination pointer - mov ecx, dest_pitch // Get the pitch size - - lea rdi, [rsi+rcx*2] // tow lines below - add rdi, rcx // three lines below - - pxor mm7, mm7 // clear out mm7 - mov edx, dest_width // Loop counter - - vs_4_5_loop: - - movq mm0, QWORD ptr [rsi] // src[0]; - movq mm1, QWORD ptr [rsi+rcx] // src[1]; - - movq mm2, mm0 // Make a copy - punpcklbw mm0, mm7 // unpack low to word - - movq mm5, one_fifth - punpckhbw mm2, mm7 // unpack high to word - - pmullw mm0, mm5 // a * 1/5 - - movq mm3, mm1 // make a copy - punpcklbw mm1, mm7 // unpack low to word - - pmullw mm2, mm5 // a * 1/5 - movq mm6, four_fifths // constan - - movq mm4, mm1 // copy of low b - pmullw mm4, mm6 // b * 4/5 - - punpckhbw mm3, mm7 // unpack high to word - movq mm5, mm3 // copy of high b - - pmullw mm5, mm6 // b * 4/5 - paddw mm0, mm4 // a * 1/5 + b * 4/5 - - paddw mm2, mm5 // a * 1/5 + b * 4/5 - paddw mm0, round_values // + 128 - - paddw mm2, round_values // + 128 - psrlw mm0, 8 - - psrlw mm2, 8 - packuswb mm0, mm2 // des [1] - - movq QWORD ptr [rsi+rcx], mm0 // write des[1] - movq mm0, [rsi+rcx*2] // mm0 = src[2] - - // mm1, mm3 --- Src[1] - // mm0 --- Src[2] - // mm7 for unpacking - - movq mm5, two_fifths - movq mm2, mm0 // make a copy - - pmullw mm1, mm5 // b * 2/5 - movq mm6, three_fifths - - - punpcklbw mm0, mm7 // unpack low to word - pmullw mm3, mm5 // b * 2/5 - - movq mm4, mm0 // make copy of c - punpckhbw mm2, mm7 // unpack high to word - - pmullw mm4, mm6 // c * 3/5 - movq mm5, mm2 - - pmullw mm5, mm6 // c * 3/5 - paddw mm1, mm4 // b * 2/5 + c * 3/5 - - paddw mm3, mm5 // b * 2/5 + c * 3/5 - paddw mm1, round_values // + 128 - - paddw mm3, round_values // + 128 - psrlw mm1, 8 - - psrlw mm3, 8 - packuswb mm1, mm3 // des[2] - - movq QWORD ptr [rsi+rcx*2], mm1 // write des[2] - movq mm1, [rdi] // mm1=Src[3]; - - // mm0, mm2 --- Src[2] - // mm1 --- Src[3] - // mm6 --- 3/5 - // mm7 for unpacking - - pmullw mm0, mm6 // c * 3/5 - movq mm5, two_fifths // mm5 = 2/5 - - movq mm3, mm1 // make a copy - pmullw mm2, mm6 // c * 3/5 - - punpcklbw mm1, mm7 // unpack low - movq mm4, mm1 // make a copy - - punpckhbw mm3, mm7 // unpack high - pmullw mm4, mm5 // d * 2/5 - - movq mm6, mm3 // make a copy - pmullw mm6, mm5 // d * 2/5 - - paddw mm0, mm4 // c * 3/5 + d * 2/5 - paddw mm2, mm6 // c * 3/5 + d * 2/5 - - paddw mm0, round_values // + 128 - paddw mm2, round_values // + 128 - - psrlw mm0, 8 - psrlw mm2, 8 - - packuswb mm0, mm2 // des[3] - movq QWORD ptr [rdi], mm0 // write des[3] - - // mm1, mm3 --- Src[3] - // mm7 -- cleared for unpacking - - movq mm0, [rdi+rcx*2] // mm0, Src[0] of the next group - - movq mm5, four_fifths // mm5 = 4/5 - pmullw mm1, mm5 // d * 4/5 - - movq mm6, one_fifth // mm6 = 1/5 - movq mm2, mm0 // make a copy - - pmullw mm3, mm5 // d * 4/5 - punpcklbw mm0, mm7 // unpack low - - pmullw mm0, mm6 // an * 1/5 - punpckhbw mm2, mm7 // unpack high - - paddw mm1, mm0 // d * 4/5 + an * 1/5 - pmullw mm2, mm6 // an * 1/5 - - paddw mm3, mm2 // d * 4/5 + an * 1/5 - paddw mm1, round_values // + 128 - - paddw mm3, round_values // + 128 - psrlw mm1, 8 - - psrlw mm3, 8 - packuswb mm1, mm3 // des[4] - - movq QWORD ptr [rdi+rcx], mm1 // write des[4] - - add rdi, 8 - add rsi, 8 - - sub rdx, 8 - jg vs_4_5_loop - } -} - -/**************************************************************************** -* -* ROUTINE : last_vertical_band_4_5_scale_mmx -* -* INPUTS : unsigned char *dest : -* unsigned int dest_pitch : -* unsigned int dest_width : -* -* OUTPUTS : None. -* -* RETURNS : None -* -* FUNCTION : 4 to 5 up-scaling of the last 4-pixel high band in an image. -* -* SPECIAL NOTES : The routine uses the first line of the band below -* the current band. The function also has an "C" only -* version. -* -****************************************************************************/ -static -void last_vertical_band_4_5_scale_mmx -( - unsigned char *dest, - unsigned int dest_pitch, - unsigned int dest_width -) -{ - __asm - { - mov rsi, dest // Get the source and destination pointer - mov ecx, dest_pitch // Get the pitch size - - lea rdi, [rsi+rcx*2] // tow lines below - add rdi, rcx // three lines below - - pxor mm7, mm7 // clear out mm7 - mov edx, dest_width // Loop counter - - last_vs_4_5_loop: - - movq mm0, QWORD ptr [rsi] // src[0]; - movq mm1, QWORD ptr [rsi+rcx] // src[1]; - - movq mm2, mm0 // Make a copy - punpcklbw mm0, mm7 // unpack low to word - - movq mm5, one_fifth - punpckhbw mm2, mm7 // unpack high to word - - pmullw mm0, mm5 // a * 1/5 - - movq mm3, mm1 // make a copy - punpcklbw mm1, mm7 // unpack low to word - - pmullw mm2, mm5 // a * 1/5 - movq mm6, four_fifths // constan - - movq mm4, mm1 // copy of low b - pmullw mm4, mm6 // b * 4/5 - - punpckhbw mm3, mm7 // unpack high to word - movq mm5, mm3 // copy of high b - - pmullw mm5, mm6 // b * 4/5 - paddw mm0, mm4 // a * 1/5 + b * 4/5 - - paddw mm2, mm5 // a * 1/5 + b * 4/5 - paddw mm0, round_values // + 128 - - paddw mm2, round_values // + 128 - psrlw mm0, 8 - - psrlw mm2, 8 - packuswb mm0, mm2 // des [1] - - movq QWORD ptr [rsi+rcx], mm0 // write des[1] - movq mm0, [rsi+rcx*2] // mm0 = src[2] - - // mm1, mm3 --- Src[1] - // mm0 --- Src[2] - // mm7 for unpacking - - movq mm5, two_fifths - movq mm2, mm0 // make a copy - - pmullw mm1, mm5 // b * 2/5 - movq mm6, three_fifths - - - punpcklbw mm0, mm7 // unpack low to word - pmullw mm3, mm5 // b * 2/5 - - movq mm4, mm0 // make copy of c - punpckhbw mm2, mm7 // unpack high to word - - pmullw mm4, mm6 // c * 3/5 - movq mm5, mm2 - - pmullw mm5, mm6 // c * 3/5 - paddw mm1, mm4 // b * 2/5 + c * 3/5 - - paddw mm3, mm5 // b * 2/5 + c * 3/5 - paddw mm1, round_values // + 128 - - paddw mm3, round_values // + 128 - psrlw mm1, 8 - - psrlw mm3, 8 - packuswb mm1, mm3 // des[2] - - movq QWORD ptr [rsi+rcx*2], mm1 // write des[2] - movq mm1, [rdi] // mm1=Src[3]; - - movq QWORD ptr [rdi+rcx], mm1 // write des[4]; - - // mm0, mm2 --- Src[2] - // mm1 --- Src[3] - // mm6 --- 3/5 - // mm7 for unpacking - - pmullw mm0, mm6 // c * 3/5 - movq mm5, two_fifths // mm5 = 2/5 - - movq mm3, mm1 // make a copy - pmullw mm2, mm6 // c * 3/5 - - punpcklbw mm1, mm7 // unpack low - movq mm4, mm1 // make a copy - - punpckhbw mm3, mm7 // unpack high - pmullw mm4, mm5 // d * 2/5 - - movq mm6, mm3 // make a copy - pmullw mm6, mm5 // d * 2/5 - - paddw mm0, mm4 // c * 3/5 + d * 2/5 - paddw mm2, mm6 // c * 3/5 + d * 2/5 - - paddw mm0, round_values // + 128 - paddw mm2, round_values // + 128 - - psrlw mm0, 8 - psrlw mm2, 8 - - packuswb mm0, mm2 // des[3] - movq QWORD ptr [rdi], mm0 // write des[3] - - // mm1, mm3 --- Src[3] - // mm7 -- cleared for unpacking - add rdi, 8 - add rsi, 8 - - sub rdx, 8 - jg last_vs_4_5_loop - } -} - -/**************************************************************************** -* -* ROUTINE : vertical_band_3_5_scale_mmx -* -* INPUTS : unsigned char *dest : -* unsigned int dest_pitch : -* unsigned int dest_width : -* -* OUTPUTS : None. -* -* RETURNS : void -* -* FUNCTION : 3 to 5 up-scaling of a 3-pixel high band of pixels. -* -* SPECIAL NOTES : The routine uses the first line of the band below -* the current band. The function also has an "C" only -* version. -* -****************************************************************************/ -static -void vertical_band_3_5_scale_mmx -( - unsigned char *dest, - unsigned int dest_pitch, - unsigned int dest_width -) -{ - __asm - { - mov rsi, dest // Get the source and destination pointer - mov ecx, dest_pitch // Get the pitch size - - lea rdi, [rsi+rcx*2] // two lines below - add rdi, rcx // three lines below - - pxor mm7, mm7 // clear out mm7 - mov edx, dest_width // Loop counter - - vs_3_5_loop: - - movq mm0, QWORD ptr [rsi] // src[0]; - movq mm1, QWORD ptr [rsi+rcx] // src[1]; - - movq mm2, mm0 // Make a copy - punpcklbw mm0, mm7 // unpack low to word - - movq mm5, two_fifths // mm5 = 2/5 - punpckhbw mm2, mm7 // unpack high to word - - pmullw mm0, mm5 // a * 2/5 - - movq mm3, mm1 // make a copy - punpcklbw mm1, mm7 // unpack low to word - - pmullw mm2, mm5 // a * 2/5 - movq mm6, three_fifths // mm6 = 3/5 - - movq mm4, mm1 // copy of low b - pmullw mm4, mm6 // b * 3/5 - - punpckhbw mm3, mm7 // unpack high to word - movq mm5, mm3 // copy of high b - - pmullw mm5, mm6 // b * 3/5 - paddw mm0, mm4 // a * 2/5 + b * 3/5 - - paddw mm2, mm5 // a * 2/5 + b * 3/5 - paddw mm0, round_values // + 128 - - paddw mm2, round_values // + 128 - psrlw mm0, 8 - - psrlw mm2, 8 - packuswb mm0, mm2 // des [1] - - movq QWORD ptr [rsi+rcx], mm0 // write des[1] - movq mm0, [rsi+rcx*2] // mm0 = src[2] - - // mm1, mm3 --- Src[1] - // mm0 --- Src[2] - // mm7 for unpacking - - movq mm4, mm1 // b low - pmullw mm1, four_fifths // b * 4/5 low - - movq mm5, mm3 // b high - pmullw mm3, four_fifths // b * 4/5 high - - movq mm2, mm0 // c - pmullw mm4, one_fifth // b * 1/5 - - punpcklbw mm0, mm7 // c low - pmullw mm5, one_fifth // b * 1/5 - - movq mm6, mm0 // make copy of c low - punpckhbw mm2, mm7 // c high - - pmullw mm6, one_fifth // c * 1/5 low - movq mm7, mm2 // make copy of c high - - pmullw mm7, one_fifth // c * 1/5 high - paddw mm1, mm6 // b * 4/5 + c * 1/5 low - - paddw mm3, mm7 // b * 4/5 + c * 1/5 high - movq mm6, mm0 // make copy of c low - - pmullw mm6, four_fifths // c * 4/5 low - movq mm7, mm2 // make copy of c high - - pmullw mm7, four_fifths // c * 4/5 high - - paddw mm4, mm6 // b * 1/5 + c * 4/5 low - paddw mm5, mm7 // b * 1/5 + c * 4/5 high - - paddw mm1, round_values // + 128 - paddw mm3, round_values // + 128 - - psrlw mm1, 8 - psrlw mm3, 8 - - packuswb mm1, mm3 // des[2] - movq QWORD ptr [rsi+rcx*2], mm1 // write des[2] - - paddw mm4, round_values // + 128 - paddw mm5, round_values // + 128 - - psrlw mm4, 8 - psrlw mm5, 8 - - packuswb mm4, mm5 // des[3] - movq QWORD ptr [rdi], mm4 // write des[3] - - // mm0, mm2 --- Src[3] - - pxor mm7, mm7 // clear mm7 for unpacking - movq mm1, [rdi+rcx*2] // mm1 = Src[0] of the next group - - movq mm5, three_fifths // mm5 = 3/5 - pmullw mm0, mm5 // d * 3/5 - - movq mm6, two_fifths // mm6 = 2/5 - movq mm3, mm1 // make a copy - - pmullw mm2, mm5 // d * 3/5 - punpcklbw mm1, mm7 // unpack low - - pmullw mm1, mm6 // an * 2/5 - punpckhbw mm3, mm7 // unpack high - - paddw mm0, mm1 // d * 3/5 + an * 2/5 - pmullw mm3, mm6 // an * 2/5 - - paddw mm2, mm3 // d * 3/5 + an * 2/5 - paddw mm0, round_values // + 128 - - paddw mm2, round_values // + 128 - psrlw mm0, 8 - - psrlw mm2, 8 - packuswb mm0, mm2 // des[4] - - movq QWORD ptr [rdi+rcx], mm0 // write des[4] - - add rdi, 8 - add rsi, 8 - - sub rdx, 8 - jg vs_3_5_loop - } -} - -/**************************************************************************** -* -* ROUTINE : last_vertical_band_3_5_scale_mmx -* -* INPUTS : unsigned char *dest : -* unsigned int dest_pitch : -* unsigned int dest_width : -* -* OUTPUTS : None. -* -* RETURNS : void -* -* FUNCTION : 3 to 5 up-scaling of a 3-pixel high band of pixels. -* -* SPECIAL NOTES : The routine uses the first line of the band below -* the current band. The function also has an "C" only -* version. -* -****************************************************************************/ -static -void last_vertical_band_3_5_scale_mmx -( - unsigned char *dest, - unsigned int dest_pitch, - unsigned int dest_width -) -{ - __asm - { - mov rsi, dest // Get the source and destination pointer - mov ecx, dest_pitch // Get the pitch size - - lea rdi, [rsi+rcx*2] // tow lines below - add rdi, rcx // three lines below - - pxor mm7, mm7 // clear out mm7 - mov edx, dest_width // Loop counter - - - last_vs_3_5_loop: - - movq mm0, QWORD ptr [rsi] // src[0]; - movq mm1, QWORD ptr [rsi+rcx] // src[1]; - - movq mm2, mm0 // Make a copy - punpcklbw mm0, mm7 // unpack low to word - - movq mm5, two_fifths // mm5 = 2/5 - punpckhbw mm2, mm7 // unpack high to word - - pmullw mm0, mm5 // a * 2/5 - - movq mm3, mm1 // make a copy - punpcklbw mm1, mm7 // unpack low to word - - pmullw mm2, mm5 // a * 2/5 - movq mm6, three_fifths // mm6 = 3/5 - - movq mm4, mm1 // copy of low b - pmullw mm4, mm6 // b * 3/5 - - punpckhbw mm3, mm7 // unpack high to word - movq mm5, mm3 // copy of high b - - pmullw mm5, mm6 // b * 3/5 - paddw mm0, mm4 // a * 2/5 + b * 3/5 - - paddw mm2, mm5 // a * 2/5 + b * 3/5 - paddw mm0, round_values // + 128 - - paddw mm2, round_values // + 128 - psrlw mm0, 8 - - psrlw mm2, 8 - packuswb mm0, mm2 // des [1] - - movq QWORD ptr [rsi+rcx], mm0 // write des[1] - movq mm0, [rsi+rcx*2] // mm0 = src[2] - - - - // mm1, mm3 --- Src[1] - // mm0 --- Src[2] - // mm7 for unpacking - - movq mm4, mm1 // b low - pmullw mm1, four_fifths // b * 4/5 low - - movq QWORD ptr [rdi+rcx], mm0 // write des[4] - - movq mm5, mm3 // b high - pmullw mm3, four_fifths // b * 4/5 high - - movq mm2, mm0 // c - pmullw mm4, one_fifth // b * 1/5 - - punpcklbw mm0, mm7 // c low - pmullw mm5, one_fifth // b * 1/5 - - movq mm6, mm0 // make copy of c low - punpckhbw mm2, mm7 // c high - - pmullw mm6, one_fifth // c * 1/5 low - movq mm7, mm2 // make copy of c high - - pmullw mm7, one_fifth // c * 1/5 high - paddw mm1, mm6 // b * 4/5 + c * 1/5 low - - paddw mm3, mm7 // b * 4/5 + c * 1/5 high - movq mm6, mm0 // make copy of c low - - pmullw mm6, four_fifths // c * 4/5 low - movq mm7, mm2 // make copy of c high - - pmullw mm7, four_fifths // c * 4/5 high - - paddw mm4, mm6 // b * 1/5 + c * 4/5 low - paddw mm5, mm7 // b * 1/5 + c * 4/5 high - - paddw mm1, round_values // + 128 - paddw mm3, round_values // + 128 - - psrlw mm1, 8 - psrlw mm3, 8 - - packuswb mm1, mm3 // des[2] - movq QWORD ptr [rsi+rcx*2], mm1 // write des[2] - - paddw mm4, round_values // + 128 - paddw mm5, round_values // + 128 - - psrlw mm4, 8 - psrlw mm5, 8 - - packuswb mm4, mm5 // des[3] - movq QWORD ptr [rdi], mm4 // write des[3] - - // mm0, mm2 --- Src[3] - - add rdi, 8 - add rsi, 8 - - sub rdx, 8 - jg last_vs_3_5_loop - } -} - -/**************************************************************************** -* -* ROUTINE : vertical_band_1_2_scale_mmx -* -* INPUTS : unsigned char *dest : -* unsigned int dest_pitch : -* unsigned int dest_width : -* -* OUTPUTS : None. -* -* RETURNS : void -* -* FUNCTION : 1 to 2 up-scaling of a band of pixels. -* -* SPECIAL NOTES : The routine uses the first line of the band below -* the current band. The function also has an "C" only -* version. -* -****************************************************************************/ -static -void vertical_band_1_2_scale_mmx -( - unsigned char *dest, - unsigned int dest_pitch, - unsigned int dest_width -) -{ - __asm - { - - mov rsi, dest // Get the source and destination pointer - mov ecx, dest_pitch // Get the pitch size - - pxor mm7, mm7 // clear out mm7 - mov edx, dest_width // Loop counter - - vs_1_2_loop: - - movq mm0, [rsi] // get Src[0] - movq mm1, [rsi + rcx * 2] // get Src[1] - - movq mm2, mm0 // make copy before unpack - movq mm3, mm1 // make copy before unpack - - punpcklbw mm0, mm7 // low Src[0] - movq mm6, four_ones // mm6= 1, 1, 1, 1 - - punpcklbw mm1, mm7 // low Src[1] - paddw mm0, mm1 // low (a + b) - - punpckhbw mm2, mm7 // high Src[0] - paddw mm0, mm6 // low (a + b + 1) - - punpckhbw mm3, mm7 - paddw mm2, mm3 // high (a + b ) - - psraw mm0, 1 // low (a + b +1 )/2 - paddw mm2, mm6 // high (a + b + 1) - - psraw mm2, 1 // high (a + b + 1)/2 - packuswb mm0, mm2 // pack results - - movq [rsi+rcx], mm0 // write out eight bytes - add rsi, 8 - - sub rdx, 8 - jg vs_1_2_loop - } - -} - -/**************************************************************************** -* -* ROUTINE : last_vertical_band_1_2_scale_mmx -* -* INPUTS : unsigned char *dest : -* unsigned int dest_pitch : -* unsigned int dest_width : -* -* OUTPUTS : None. -* -* RETURNS : void -* -* FUNCTION : 1 to 2 up-scaling of band of pixels. -* -* SPECIAL NOTES : The routine uses the first line of the band below -* the current band. The function also has an "C" only -* version. -* -****************************************************************************/ -static -void last_vertical_band_1_2_scale_mmx -( - unsigned char *dest, - unsigned int dest_pitch, - unsigned int dest_width -) -{ - __asm - { - mov rsi, dest // Get the source and destination pointer - mov ecx, dest_pitch // Get the pitch size - - mov edx, dest_width // Loop counter - - last_vs_1_2_loop: - - movq mm0, [rsi] // get Src[0] - movq [rsi+rcx], mm0 // write out eight bytes - - add rsi, 8 - sub rdx, 8 - - jg last_vs_1_2_loop - } -} - -/**************************************************************************** -* -* ROUTINE : horizontal_line_1_2_scale -* -* INPUTS : const unsigned char *source : -* unsigned int source_width : -* unsigned char *dest : -* unsigned int dest_width : -* -* OUTPUTS : None. -* -* RETURNS : void -* -* FUNCTION : 1 to 2 up-scaling of a horizontal line of pixels. -* -* SPECIAL NOTES : None. -* -****************************************************************************/ -static -void horizontal_line_1_2_scale_mmx -( - const unsigned char *source, - unsigned int source_width, - unsigned char *dest, - unsigned int dest_width -) -{ - (void) dest_width; - - __asm - { - mov rsi, source - mov rdi, dest - - pxor mm7, mm7 - movq mm6, four_ones - - mov ecx, source_width - - hs_1_2_loop: - - movq mm0, [rsi] - movq mm1, [rsi+1] - - movq mm2, mm0 - movq mm3, mm1 - - movq mm4, mm0 - punpcklbw mm0, mm7 - - punpcklbw mm1, mm7 - paddw mm0, mm1 - - paddw mm0, mm6 - punpckhbw mm2, mm7 - - punpckhbw mm3, mm7 - paddw mm2, mm3 - - paddw mm2, mm6 - psraw mm0, 1 - - psraw mm2, 1 - packuswb mm0, mm2 - - movq mm2, mm4 - punpcklbw mm2, mm0 - - movq [rdi], mm2 - punpckhbw mm4, mm0 - - movq [rdi+8], mm4 - add rsi, 8 - - add rdi, 16 - sub rcx, 8 - - cmp rcx, 8 - jg hs_1_2_loop - -// last eight pixel - - movq mm0, [rsi] - movq mm1, mm0 - - movq mm2, mm0 - movq mm3, mm1 - - psrlq mm1, 8 - psrlq mm3, 56 - - psllq mm3, 56 - por mm1, mm3 - - movq mm3, mm1 - movq mm4, mm0 - - punpcklbw mm0, mm7 - punpcklbw mm1, mm7 - - paddw mm0, mm1 - paddw mm0, mm6 - - punpckhbw mm2, mm7 - punpckhbw mm3, mm7 - - paddw mm2, mm3 - paddw mm2, mm6 - - psraw mm0, 1 - psraw mm2, 1 - - packuswb mm0, mm2 - movq mm2, mm4 - - punpcklbw mm2, mm0 - movq [rdi], mm2 - - punpckhbw mm4, mm0 - movq [rdi+8], mm4 - } -} - - - - - -__declspec(align(16)) const static unsigned short const54_2[] = { 0, 64, 128, 192 }; -__declspec(align(16)) const static unsigned short const54_1[] = {256, 192, 128, 64 }; - - -/**************************************************************************** -* -* ROUTINE : horizontal_line_5_4_scale_mmx -* -* INPUTS : const unsigned char *source : Pointer to source data. -* unsigned int source_width : Stride of source. -* unsigned char *dest : Pointer to destination data. -* unsigned int dest_width : Stride of destination (NOT USED). -* -* OUTPUTS : None. -* -* RETURNS : void -* -* FUNCTION : Copies horizontal line of pixels from source to -* destination scaling up by 4 to 5. -* -* SPECIAL NOTES : None. -* -****************************************************************************/ -static -void horizontal_line_5_4_scale_mmx -( - const unsigned char *source, - unsigned int source_width, - unsigned char *dest, - unsigned int dest_width -) -{ - /* - unsigned i; - unsigned int a, b, c, d, e; - unsigned char *des = dest; - const unsigned char *src = source; - - (void) dest_width; - - for ( i=0; i>8); - des[2] = ((c*128 + d*128 + 128)>>8); - des[3] = ((d* 64 + e*192 + 128)>>8); - - src += 5; - des += 4; - } - */ - __asm - { - - mov rsi, source ; - mov rdi, dest ; - - mov ecx, source_width ; - movq mm5, const54_1 ; - - pxor mm7, mm7 ; - movq mm6, const54_2 ; - - movq mm4, round_values ; - lea rdx, [rsi+rcx] ; - horizontal_line_5_4_loop: - - movq mm0, QWORD PTR [rsi] ; - 00 01 02 03 04 05 06 07 - movq mm1, mm0 ; - 00 01 02 03 04 05 06 07 - - psrlq mm0, 8 ; - 01 02 03 04 05 06 07 xx - punpcklbw mm1, mm7 ; - xx 00 xx 01 xx 02 xx 03 - - punpcklbw mm0, mm7 ; - xx 01 xx 02 xx 03 xx 04 - pmullw mm1, mm5 - - pmullw mm0, mm6 - add rsi, 5 - - add rdi, 4 - paddw mm1, mm0 - - paddw mm1, mm4 - psrlw mm1, 8 - - cmp rsi, rdx - packuswb mm1, mm7 - - movd DWORD PTR [rdi-4], mm1 - - jl horizontal_line_5_4_loop - - } - -} -__declspec(align(16)) const static unsigned short one_fourths[] = { 64, 64, 64, 64 }; -__declspec(align(16)) const static unsigned short two_fourths[] = { 128, 128, 128, 128 }; -__declspec(align(16)) const static unsigned short three_fourths[] = { 192, 192, 192, 192 }; - -static -void vertical_band_5_4_scale_mmx -( - unsigned char *source, - unsigned int src_pitch, - unsigned char *dest, - unsigned int dest_pitch, - unsigned int dest_width -) -{ - - __asm - { - - mov rsi, source // Get the source and destination pointer - mov ecx, src_pitch // Get the pitch size - - mov rdi, dest // tow lines below - pxor mm7, mm7 // clear out mm7 - - mov edx, dest_pitch // Loop counter - mov ebx, dest_width - - vs_5_4_loop: - - movd mm0, DWORD ptr [rsi] // src[0]; - movd mm1, DWORD ptr [rsi+rcx] // src[1]; - - movd mm2, DWORD ptr [rsi+rcx*2] - lea rax, [rsi+rcx*2] // - - punpcklbw mm1, mm7 - punpcklbw mm2, mm7 - - movq mm3, mm2 - pmullw mm1, three_fourths - - pmullw mm2, one_fourths - movd mm4, [rax+rcx] - - pmullw mm3, two_fourths - punpcklbw mm4, mm7 - - movq mm5, mm4 - pmullw mm4, two_fourths - - paddw mm1, mm2 - movd mm6, [rax+rcx*2] - - pmullw mm5, one_fourths - paddw mm1, round_values; - - paddw mm3, mm4 - psrlw mm1, 8 - - punpcklbw mm6, mm7 - paddw mm3, round_values - - pmullw mm6, three_fourths - psrlw mm3, 8 - - packuswb mm1, mm7 - packuswb mm3, mm7 - - movd DWORD PTR [rdi], mm0 - movd DWORD PTR [rdi+rdx], mm1 - - - paddw mm5, mm6 - movd DWORD PTR [rdi+rdx*2], mm3 - - lea rax, [rdi+rdx*2] - paddw mm5, round_values - - psrlw mm5, 8 - add rdi, 4 - - packuswb mm5, mm7 - movd DWORD PTR [rax+rdx], mm5 - - add rsi, 4 - sub rbx, 4 - - jg vs_5_4_loop - } -} - - -__declspec(align(16)) const static unsigned short const53_1[] = { 0, 85, 171, 0 }; -__declspec(align(16)) const static unsigned short const53_2[] = {256, 171, 85, 0 }; - - -static -void horizontal_line_5_3_scale_mmx -( - const unsigned char *source, - unsigned int source_width, - unsigned char *dest, - unsigned int dest_width -) -{ - __asm - { - - mov rsi, source ; - mov rdi, dest ; - - mov ecx, source_width ; - movq mm5, const53_1 ; - - pxor mm7, mm7 ; - movq mm6, const53_2 ; - - movq mm4, round_values ; - lea rdx, [rsi+rcx-5] ; - horizontal_line_5_3_loop: - - movq mm0, QWORD PTR [rsi] ; - 00 01 02 03 04 05 06 07 - movq mm1, mm0 ; - 00 01 02 03 04 05 06 07 - - psllw mm0, 8 ; - xx 00 xx 02 xx 04 xx 06 - psrlw mm1, 8 ; - 01 xx 03 xx 05 xx 07 xx - - psrlw mm0, 8 ; - 00 xx 02 xx 04 xx 06 xx - psllq mm1, 16 ; - xx xx 01 xx 03 xx 05 xx - - pmullw mm0, mm6 - - pmullw mm1, mm5 - add rsi, 5 - - add rdi, 3 - paddw mm1, mm0 - - paddw mm1, mm4 - psrlw mm1, 8 - - cmp rsi, rdx - packuswb mm1, mm7 - - movd DWORD PTR [rdi-3], mm1 - jl horizontal_line_5_3_loop - -//exit condition - movq mm0, QWORD PTR [rsi] ; - 00 01 02 03 04 05 06 07 - movq mm1, mm0 ; - 00 01 02 03 04 05 06 07 - - psllw mm0, 8 ; - xx 00 xx 02 xx 04 xx 06 - psrlw mm1, 8 ; - 01 xx 03 xx 05 xx 07 xx - - psrlw mm0, 8 ; - 00 xx 02 xx 04 xx 06 xx - psllq mm1, 16 ; - xx xx 01 xx 03 xx 05 xx - - pmullw mm0, mm6 - - pmullw mm1, mm5 - paddw mm1, mm0 - - paddw mm1, mm4 - psrlw mm1, 8 - - packuswb mm1, mm7 - movd rax, mm1 - - mov rdx, rax - shr rdx, 16 - - mov WORD PTR[rdi], ax - mov BYTE PTR[rdi+2], dl - - } - -} - -__declspec(align(16)) const static unsigned short one_thirds[] = { 85, 85, 85, 85 }; -__declspec(align(16)) const static unsigned short two_thirds[] = { 171, 171, 171, 171 }; - -static -void vertical_band_5_3_scale_mmx -( - unsigned char *source, - unsigned int src_pitch, - unsigned char *dest, - unsigned int dest_pitch, - unsigned int dest_width -) -{ - - __asm - { - - mov rsi, source // Get the source and destination pointer - mov ecx, src_pitch // Get the pitch size - - mov rdi, dest // tow lines below - pxor mm7, mm7 // clear out mm7 - - mov edx, dest_pitch // Loop counter - movq mm5, one_thirds - - movq mm6, two_thirds - mov ebx, dest_width; - - vs_5_3_loop: - - movd mm0, DWORD ptr [rsi] // src[0]; - movd mm1, DWORD ptr [rsi+rcx] // src[1]; - - movd mm2, DWORD ptr [rsi+rcx*2] - lea rax, [rsi+rcx*2] // - - punpcklbw mm1, mm7 - punpcklbw mm2, mm7 - - pmullw mm1, mm5 - pmullw mm2, mm6 - - movd mm3, DWORD ptr [rax+rcx] - movd mm4, DWORD ptr [rax+rcx*2] - - punpcklbw mm3, mm7 - punpcklbw mm4, mm7 - - pmullw mm3, mm6 - pmullw mm4, mm5 - - - movd DWORD PTR [rdi], mm0 - paddw mm1, mm2 - - paddw mm1, round_values - psrlw mm1, 8 - - packuswb mm1, mm7 - paddw mm3, mm4 - - paddw mm3, round_values - movd DWORD PTR [rdi+rdx], mm1 - - psrlw mm3, 8 - packuswb mm3, mm7 - - movd DWORD PTR [rdi+rdx*2], mm3 - - - add rdi, 4 - add rsi, 4 - - sub rbx, 4 - jg vs_5_3_loop - } -} - - - - -/**************************************************************************** -* -* ROUTINE : horizontal_line_2_1_scale -* -* INPUTS : const unsigned char *source : -* unsigned int source_width : -* unsigned char *dest : -* unsigned int dest_width : -* -* OUTPUTS : None. -* -* RETURNS : void -* -* FUNCTION : 1 to 2 up-scaling of a horizontal line of pixels. -* -* SPECIAL NOTES : None. -* -****************************************************************************/ -static -void horizontal_line_2_1_scale_mmx -( - const unsigned char *source, - unsigned int source_width, - unsigned char *dest, - unsigned int dest_width -) -{ - (void) dest_width; - - __asm - { - mov rsi, source - mov rdi, dest - - pxor mm7, mm7 - mov ecx, dest_width - - xor rdx, rdx - hs_2_1_loop: - - movq mm0, [rsi+rdx*2] - psllw mm0, 8 - - psrlw mm0, 8 - packuswb mm0, mm7 - - movd DWORD Ptr [rdi+rdx], mm0; - add rdx, 4 - - cmp rdx, rcx - jl hs_2_1_loop - - } -} - - - -static -void vertical_band_2_1_scale_mmx -( - unsigned char *source, - unsigned int src_pitch, - unsigned char *dest, - unsigned int dest_pitch, - unsigned int dest_width) -{ - vpx_memcpy(dest, source, dest_width); -} - - -__declspec(align(16)) const static unsigned short three_sixteenths[] = { 48, 48, 48, 48 }; -__declspec(align(16)) const static unsigned short ten_sixteenths[] = { 160, 160, 160, 160 }; - -static -void vertical_band_2_1_scale_i_mmx -( - unsigned char *source, - unsigned int src_pitch, - unsigned char *dest, - unsigned int dest_pitch, - unsigned int dest_width -) -{ - __asm - { - mov rsi, source - mov rdi, dest - - mov eax, src_pitch - mov edx, dest_width - - pxor mm7, mm7 - sub rsi, rax //back one line - - - lea rcx, [rsi+rdx]; - movq mm6, round_values; - - movq mm5, three_sixteenths; - movq mm4, ten_sixteenths; - - vs_2_1_i_loop: - movd mm0, [rsi] // - movd mm1, [rsi+rax] // - - movd mm2, [rsi+rax*2] // - punpcklbw mm0, mm7 - - pmullw mm0, mm5 - punpcklbw mm1, mm7 - - pmullw mm1, mm4 - punpcklbw mm2, mm7 - - pmullw mm2, mm5 - paddw mm0, round_values - - paddw mm1, mm2 - paddw mm0, mm1 - - psrlw mm0, 8 - packuswb mm0, mm7 - - movd DWORD PTR [rdi], mm0 - add rsi, 4 - - add rdi, 4; - cmp rsi, rcx - jl vs_2_1_i_loop - - } -} - - - -void -register_mmxscalers(void) -{ - vp8_horizontal_line_1_2_scale = horizontal_line_1_2_scale_mmx; - vp8_horizontal_line_3_5_scale = horizontal_line_3_5_scale_mmx; - vp8_horizontal_line_4_5_scale = horizontal_line_4_5_scale_mmx; - vp8_vertical_band_1_2_scale = vertical_band_1_2_scale_mmx; - vp8_last_vertical_band_1_2_scale = last_vertical_band_1_2_scale_mmx; - vp8_vertical_band_3_5_scale = vertical_band_3_5_scale_mmx; - vp8_last_vertical_band_3_5_scale = last_vertical_band_3_5_scale_mmx; - vp8_vertical_band_4_5_scale = vertical_band_4_5_scale_mmx; - vp8_last_vertical_band_4_5_scale = last_vertical_band_4_5_scale_mmx; - - vp8_vertical_band_5_4_scale = vertical_band_5_4_scale_mmx; - vp8_vertical_band_5_3_scale = vertical_band_5_3_scale_mmx; - vp8_vertical_band_2_1_scale = vertical_band_2_1_scale_mmx; - vp8_vertical_band_2_1_scale_i = vertical_band_2_1_scale_i_mmx; - vp8_horizontal_line_2_1_scale = horizontal_line_2_1_scale_mmx; - vp8_horizontal_line_5_3_scale = horizontal_line_5_3_scale_mmx; - vp8_horizontal_line_5_4_scale = horizontal_line_5_4_scale_mmx; -} diff --git a/vpx_scale/x86_64/scalesystemdependant.c b/vpx_scale/x86_64/scalesystemdependant.c deleted file mode 100644 index 89ae86e00..000000000 --- a/vpx_scale/x86_64/scalesystemdependant.c +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (c) 2010 The WebM project authors. All Rights Reserved. - * - * Use of this source code is governed by a BSD-style license - * that can be found in the LICENSE file in the root of the source - * tree. An additional intellectual property rights grant can be found - * in the file PATENTS. All contributing project authors may - * be found in the AUTHORS file in the root of the source tree. - */ - - -/**************************************************************************** -* -* Module Title : system_dependant.c -* -* Description : Miscellaneous system dependant functions -* -****************************************************************************/ - -/**************************************************************************** -* Header Files -****************************************************************************/ -#include "vpx_scale/vpxscale.h" -#include "cpuidlib.h" - -/**************************************************************************** -* Imports -*****************************************************************************/ -extern void register_generic_scalers(void); -extern void register_mmxscalers(void); - -/**************************************************************************** - * - * ROUTINE : post_proc_machine_specific_config - * - * INPUTS : UINT32 Version : Codec version number. - * - * OUTPUTS : None. - * - * RETURNS : void - * - * FUNCTION : Checks for machine specifc features such as MMX support - * sets appropriate flags and function pointers. - * - * SPECIAL NOTES : None. - * - ****************************************************************************/ -void -vp8_scale_machine_specific_config(void) -{ - int wmt_enabled = 1; - - if (wmt_enabled) - { - register_mmxscalers(); - } - else - { - register_generic_scalers(); - } -}