diff --git a/Common/Common.vcxproj b/Common/Common.vcxproj
index 05b041e8ff..17e2d3ab13 100644
--- a/Common/Common.vcxproj
+++ b/Common/Common.vcxproj
@@ -390,7 +390,6 @@
-
@@ -609,7 +608,6 @@
-
diff --git a/Common/Common.vcxproj.filters b/Common/Common.vcxproj.filters
index 96f1f70258..2940bc7f88 100644
--- a/Common/Common.vcxproj.filters
+++ b/Common/Common.vcxproj.filters
@@ -551,9 +551,6 @@
ext\at3_standalone
-
- ext\at3_standalone
-
ext\at3_standalone
@@ -1044,9 +1041,6 @@
ext\at3_standalone
-
- ext\at3_standalone
-
ext\at3_standalone
diff --git a/Core/HW/Atrac3Standalone.cpp b/Core/HW/Atrac3Standalone.cpp
index 6a7c742c58..558d29d635 100644
--- a/Core/HW/Atrac3Standalone.cpp
+++ b/Core/HW/Atrac3Standalone.cpp
@@ -1,7 +1,6 @@
#include "SimpleAudioDec.h"
#include "ext/at3_standalone/at3_decoders.h"
-#include "ext/at3_standalone/avcodec.h"
inline int16_t clamp16(float f) {
if (f >= 1.0f)
@@ -17,32 +16,23 @@ inline int16_t clamp16(float f) {
class Atrac3Audio : public AudioDecoder {
public:
Atrac3Audio(PSPAudioType audioType, int channels, size_t blockAlign, const uint8_t *extraData, size_t extraDataSize) : audioType_(audioType) {
+ blockAlign_ = blockAlign;
if (audioType == PSP_CODEC_AT3PLUS) {
- at3pCtx_ = atrac3p_alloc(blockAlign, channels);
- codecOpen_ = true;
- } else {
- ctx_ = avcodec_alloc_context3(&ff_atrac3_decoder);
- }
- if (audioType_ == PSP_CODEC_AT3) {
- _dbg_assert_(ctx_);
- _dbg_assert_(!codecOpen_);
- ctx_->extradata = (uint8_t *)av_mallocz(extraDataSize);
- ctx_->extradata_size = (int)extraDataSize;
- ctx_->block_align = (int)blockAlign;
- codecOpen_ = false;
- if (extraData != nullptr) {
- memcpy(ctx_->extradata, extraData, extraDataSize);
- }
+ at3pCtx_ = atrac3p_alloc(channels, blockAlign);
+ if (at3pCtx_)
+ codecOpen_ = true;
+ } else if (audioType_ == PSP_CODEC_AT3) {
+ at3Ctx_ = atrac3_alloc(channels, blockAlign, extraData, extraDataSize);
+ if (at3Ctx_)
+ codecOpen_ = true;
}
for (int i = 0; i < 2; i++) {
buffers_[i] = new float[4096];
}
}
~Atrac3Audio() {
- if (ctx_) {
- avcodec_close(ctx_);
- av_freep(&ctx_->extradata);
- av_freep(&ctx_);
+ if (at3Ctx_) {
+ atrac3_free(at3Ctx_);
}
if (at3pCtx_) {
atrac3p_free(at3pCtx_);
@@ -54,21 +44,11 @@ public:
bool Decode(const uint8_t *inbuf, int inbytes, uint8_t *outbuf, int *outbytes) override {
if (!codecOpen_) {
- int retval;
- if (audioType_ == PSP_CODEC_AT3PLUS) {
- _dbg_assert_(false);
- } else {
- ctx_->block_align = inbytes;
- ctx_->channels = 2;
- retval = avcodec_open2(ctx_, &ff_atrac3_decoder, nullptr);
- }
- _dbg_assert_(retval >= 0);
- if (retval < 0) {
- return false;
- }
- codecOpen_ = true;
+ _dbg_assert_(false);
+ }
+ if (inbytes != blockAlign_) {
+ WARN_LOG(ME, "Atrac3Audio::Decode: Unexpected block align %d (expected %d)", inbytes, blockAlign_);
}
-
// We just call the decode function directly without going through the whole packet machinery.
int got_frame = 0;
int result;
@@ -76,10 +56,8 @@ public:
if (audioType_ == PSP_CODEC_AT3PLUS) {
result = atrac3p_decode_frame(at3pCtx_, buffers_, &nb_samples, &got_frame, inbuf, inbytes);
} else {
- if (inbytes != ctx_->block_align) {
- WARN_LOG(ME, "Atrac3Audio::Decode: Unexpected block align %d (expected %d)", inbytes, ctx_->block_align);
- }
- result = atrac3_decode_frame(ctx_, buffers_, &nb_samples, &got_frame, inbuf, inbytes);
+
+ result = atrac3_decode_frame(at3Ctx_, buffers_, &nb_samples, &got_frame, inbuf, inbytes);
}
if (result < 0) {
*outbytes = 0;
@@ -120,7 +98,9 @@ public:
private:
ATRAC3PContext *at3pCtx_ = nullptr;
- AVCodecContext* ctx_ = nullptr;
+ ATRAC3Context *at3Ctx_ = nullptr;
+
+ int blockAlign_ = 0;
int outSamples_ = 0;
int srcPos_ = 0;
diff --git a/ext/at3_standalone/CMakeLists.txt b/ext/at3_standalone/CMakeLists.txt
index a62c4a514a..8c5ab175e2 100644
--- a/ext/at3_standalone/CMakeLists.txt
+++ b/ext/at3_standalone/CMakeLists.txt
@@ -11,7 +11,6 @@ set(ALL_SOURCE_FILES
${SRC_DIR}/atrac3plus.cpp
${SRC_DIR}/atrac3plusdec.cpp
${SRC_DIR}/atrac3plusdsp.cpp
- ${SRC_DIR}/avcodec.cpp
${SRC_DIR}/get_bits.cpp
${SRC_DIR}/compat.cpp
${SRC_DIR}/fft.cpp
diff --git a/ext/at3_standalone/at3_decoders.h b/ext/at3_standalone/at3_decoders.h
index 69df17bb41..df7f0f42da 100644
--- a/ext/at3_standalone/at3_decoders.h
+++ b/ext/at3_standalone/at3_decoders.h
@@ -2,17 +2,15 @@
#include
+// The full external API for the standalone Atrac3/3+ decoder.
+
+struct ATRAC3Context;
struct ATRAC3PContext;
-struct AVCodecContext;
-struct AVFrame;
+ATRAC3Context *atrac3_alloc(int channels, int block_align, const uint8_t *extra_data, int extra_data_size);
+void atrac3_free(ATRAC3Context *ctx);
+int atrac3_decode_frame(ATRAC3Context *ctx, float *out_data[2], int *nb_samples, int *got_frame_ptr, const uint8_t *buf, int buf_size);
-#include "avcodec.h"
-
-int atrac3_decode_frame(AVCodecContext *avctx, float *out_data[2], int *nb_samples, int *got_frame_ptr, const uint8_t *buf, int buf_size);
-
-ATRAC3PContext *atrac3p_alloc(int block_align, int channels);
+ATRAC3PContext *atrac3p_alloc(int channels, int block_align);
void atrac3p_free(ATRAC3PContext *ctx);
-
int atrac3p_decode_frame(ATRAC3PContext *ctx, float *out_data[2], int *nb_samples, int *got_frame_ptr, const uint8_t *buf, int buf_size);
-extern AVCodec ff_atrac3_decoder;
diff --git a/ext/at3_standalone/atrac.cpp b/ext/at3_standalone/atrac.cpp
index 8c6a3f0f89..53b082883c 100644
--- a/ext/at3_standalone/atrac.cpp
+++ b/ext/at3_standalone/atrac.cpp
@@ -30,7 +30,6 @@
#include
#include
-#include "avcodec.h"
#include "atrac.h"
float ff_atrac_sf_table[64];
diff --git a/ext/at3_standalone/atrac3.cpp b/ext/at3_standalone/atrac3.cpp
index af666b52d0..51e4b74300 100644
--- a/ext/at3_standalone/atrac3.cpp
+++ b/ext/at3_standalone/atrac3.cpp
@@ -40,10 +40,10 @@
#include "float_dsp.h"
#include "fft.h"
+#include "mem.h"
#include "compat.h"
#include "get_bits.h"
-#include "avcodec.h"
#include "atrac.h"
#include "atrac3data.h"
@@ -108,6 +108,9 @@ typedef struct ATRAC3Context {
AtracGCContext gainc_ctx;
FFTContext mdct_ctx;
+
+ int block_align;
+ int channels;
} ATRAC3Context;
static DECLARE_ALIGNED(32, float, mdct_window)[MDCT_SIZE];
@@ -184,16 +187,13 @@ static void init_imdct_window(void)
}
}
-static int atrac3_decode_close(AVCodecContext *avctx)
+void atrac3_free(ATRAC3Context *ctx)
{
- ATRAC3Context *q = (ATRAC3Context * )avctx->priv_data;
+ av_freep(&ctx->units);
+ av_freep(&ctx->decoded_bytes_buffer);
- av_freep(&q->units);
- av_freep(&q->decoded_bytes_buffer);
-
- ff_mdct_end(&q->mdct_ctx);
-
- return 0;
+ ff_mdct_end(&ctx->mdct_ctx);
+ av_freep(&ctx);
}
/**
@@ -729,14 +729,13 @@ static int decode_frame(ATRAC3Context *q, int block_align, int channels, const u
return 0;
}
-int atrac3_decode_frame(AVCodecContext *avctx, float *out_data[2], int *nb_samples, int *got_frame_ptr, const uint8_t *buf, int buf_size)
+int atrac3_decode_frame(ATRAC3Context *ctx, float *out_data[2], int *nb_samples, int *got_frame_ptr, const uint8_t *buf, int buf_size)
{
- ATRAC3Context *q = (ATRAC3Context *)avctx->priv_data;
int ret;
const uint8_t *databuf;
- const int block_align = avctx->block_align;
- const int channels = avctx->channels;
+ const int block_align = ctx->block_align;
+ const int channels = ctx->channels;
if (buf_size < block_align) {
av_log(AV_LOG_ERROR,
@@ -748,14 +747,14 @@ int atrac3_decode_frame(AVCodecContext *avctx, float *out_data[2], int *nb_sampl
*nb_samples = SAMPLES_PER_FRAME;
/* Check if we need to descramble and what buffer to pass on. */
- if (q->scrambled_stream) {
- decode_bytes(buf, q->decoded_bytes_buffer, block_align);
- databuf = q->decoded_bytes_buffer;
+ if (ctx->scrambled_stream) {
+ decode_bytes(buf, ctx->decoded_bytes_buffer, block_align);
+ databuf = ctx->decoded_bytes_buffer;
} else {
databuf = buf;
}
- ret = decode_frame(q, block_align, channels, databuf, out_data);
+ ret = decode_frame(ctx, block_align, channels, databuf, out_data);
if (ret) {
av_log( AV_LOG_ERROR, "Frame decoding error!\n");
return ret;
@@ -786,24 +785,27 @@ static void atrac3_init_static_data(void)
static int static_init_done;
-static int atrac3_decode_init(AVCodecContext *avctx)
-{
+ATRAC3Context *atrac3_alloc(int channels, int block_align, const uint8_t *extra_data, int extra_data_size) {
int i, ret;
int version, delay, samples_per_frame, frame_factor;
- const uint8_t *edata_ptr = avctx->extradata;
- ATRAC3Context *q = (ATRAC3Context * )avctx->priv_data;
- if (avctx->channels <= 0 || avctx->channels > 2) {
+ const uint8_t *edata_ptr = extra_data;
+
+ if (channels <= 0 || channels > 2) {
av_log(AV_LOG_ERROR, "Channel configuration error!\n");
- return AVERROR(EINVAL);
+ return nullptr;
}
+ ATRAC3Context *q = (ATRAC3Context *)av_mallocz(sizeof(ATRAC3Context));
+ q->channels = channels;
+ q->block_align = block_align;
+
if (!static_init_done)
atrac3_init_static_data();
static_init_done = 1;
/* Take care of the codec-specific extradata. */
- if (avctx->extradata_size == 14) {
+ if (extra_data_size == 14) {
/* Parse the extradata, WAV format */
av_log(AV_LOG_DEBUG, "[0-1] %d\n",
bytestream_get_le16(&edata_ptr)); // Unknown value always 1
@@ -816,21 +818,22 @@ static int atrac3_decode_init(AVCodecContext *avctx)
bytestream_get_le16(&edata_ptr)); // Unknown always 0
/* setup */
- samples_per_frame = SAMPLES_PER_FRAME * avctx->channels;
+ samples_per_frame = SAMPLES_PER_FRAME * channels;
version = 4;
delay = 0x88E;
q->coding_mode = q->coding_mode ? JOINT_STEREO : STEREO;
q->scrambled_stream = 0;
- if (avctx->block_align != 96 * avctx->channels * frame_factor &&
- avctx->block_align != 152 * avctx->channels * frame_factor &&
- avctx->block_align != 192 * avctx->channels * frame_factor) {
+ if (block_align != 96 * channels * frame_factor &&
+ block_align != 152 * channels * frame_factor &&
+ block_align != 192 * channels * frame_factor) {
av_log(AV_LOG_ERROR, "Unknown frame/channel/frame_factor "
- "configuration %d/%d/%d\n", avctx->block_align,
- avctx->channels, frame_factor);
- return AVERROR_INVALIDDATA;
+ "configuration %d/%d/%d\n", block_align,
+ channels, frame_factor);
+ atrac3_free(q);
+ return nullptr;
}
- } else if (avctx->extradata_size == 12 || avctx->extradata_size == 10) {
+ } else if (extra_data_size == 12 || extra_data_size == 10) {
/* Parse the extradata, RM format. */
version = bytestream_get_be32(&edata_ptr);
samples_per_frame = bytestream_get_be16(&edata_ptr);
@@ -840,56 +843,58 @@ static int atrac3_decode_init(AVCodecContext *avctx)
} else {
av_log(AV_LOG_ERROR, "Unknown extradata size %d.\n",
- avctx->extradata_size);
- return AVERROR(EINVAL);
+ extra_data_size);
+ atrac3_free(q);
+ return nullptr;
}
/* Check the extradata */
if (version != 4) {
av_log(AV_LOG_ERROR, "Version %d != 4.\n", version);
- return AVERROR_INVALIDDATA;
+ atrac3_free(q);
+ return nullptr;
}
if (samples_per_frame != SAMPLES_PER_FRAME &&
samples_per_frame != SAMPLES_PER_FRAME * 2) {
av_log(AV_LOG_ERROR, "Unknown amount of samples per frame %d.\n",
samples_per_frame);
- return AVERROR_INVALIDDATA;
- }
+ atrac3_free(q);
+ return nullptr;
+ }
if (delay != 0x88E) {
av_log(AV_LOG_ERROR, "Unknown amount of delay %x != 0x88E.\n",
delay);
- return AVERROR_INVALIDDATA;
- }
+ atrac3_free(q);
+ return nullptr;
+ }
if (q->coding_mode == STEREO)
av_log(AV_LOG_DEBUG, "Normal stereo detected.\n");
else if (q->coding_mode == JOINT_STEREO) {
- if (avctx->channels != 2) {
+ if (channels != 2) {
av_log(AV_LOG_ERROR, "Invalid coding mode\n");
- return AVERROR_INVALIDDATA;
- }
+ atrac3_free(q);
+ return nullptr;
+ }
av_log(AV_LOG_DEBUG, "Joint stereo detected.\n");
} else {
av_log(AV_LOG_ERROR, "Unknown channel coding mode %x!\n",
q->coding_mode);
- return AVERROR_INVALIDDATA;
- }
+ atrac3_free(q);
+ return nullptr;
+ }
- if (avctx->block_align >= UINT_MAX / 2)
- return AVERROR(EINVAL);
-
- q->decoded_bytes_buffer = (uint8_t *)av_mallocz(FFALIGN(avctx->block_align, 4) + AV_INPUT_BUFFER_PADDING_SIZE);
- if (!q->decoded_bytes_buffer)
- return AVERROR(ENOMEM);
+ q->decoded_bytes_buffer = (uint8_t *)av_mallocz(FFALIGN(block_align, 4) + AV_INPUT_BUFFER_PADDING_SIZE);
/* initialize the MDCT transform */
if ((ret = ff_mdct_init(&q->mdct_ctx, 9, 1, 1.0 / 32768)) < 0) {
av_log(AV_LOG_ERROR, "Error initializing MDCT\n");
av_freep(&q->decoded_bytes_buffer);
- return ret;
+
+ return nullptr;
}
/* init the joint-stereo decoding data */
@@ -908,19 +913,6 @@ static int atrac3_decode_init(AVCodecContext *avctx)
ff_atrac_init_gain_compensation(&q->gainc_ctx, 4, 3);
- q->units = (ChannelUnit *)av_mallocz_array(avctx->channels, sizeof(*q->units));
- if (!q->units) {
- atrac3_decode_close(avctx);
- return AVERROR(ENOMEM);
- }
-
- return 0;
+ q->units = (ChannelUnit *)av_mallocz_array(channels, sizeof(*q->units));
+ return q;
}
-
-AVCodec ff_atrac3_decoder = {
- "atrac3",
- AV_CODEC_ID_ATRAC3,
- sizeof(ATRAC3Context),
- &atrac3_decode_init,
- &atrac3_decode_close,
-};
diff --git a/ext/at3_standalone/atrac3plusdec.cpp b/ext/at3_standalone/atrac3plusdec.cpp
index 14cfb812e5..db923bba90 100644
--- a/ext/at3_standalone/atrac3plusdec.cpp
+++ b/ext/at3_standalone/atrac3plusdec.cpp
@@ -125,7 +125,7 @@ static int set_channel_params(ATRAC3PContext *ctx, int channels) {
return 0;
}
-ATRAC3PContext *atrac3p_alloc(int block_align, int channels) {
+ATRAC3PContext *atrac3p_alloc(int channels, int block_align) {
int i, ch, ret;
if (!block_align) {
av_log(AV_LOG_ERROR, "block_align is not set\n");
diff --git a/ext/at3_standalone/atrac3plusdsp.cpp b/ext/at3_standalone/atrac3plusdsp.cpp
index 0fbcb11e11..ab0dbc299b 100644
--- a/ext/at3_standalone/atrac3plusdsp.cpp
+++ b/ext/at3_standalone/atrac3plusdsp.cpp
@@ -29,7 +29,6 @@
#include
#include "float_dsp.h"
-#include "avcodec.h"
#include "sinewin.h"
#include "fft.h"
#include "atrac3plus.h"
diff --git a/ext/at3_standalone/avcodec.cpp b/ext/at3_standalone/avcodec.cpp
deleted file mode 100644
index e3a189d792..0000000000
--- a/ext/at3_standalone/avcodec.cpp
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * Copyright (c) 2001 Fabrice Bellard
- * Copyright (c) 2002-2004 Michael Niedermayer
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with FFmpeg; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-/**
- * @file
- * Options definition for AVCodecContext.
- */
-
-#include "avcodec.h"
-#include "compat.h"
-#include "mem.h"
-
-#include
-#include
-#include
-#include
-#include
-
-AVCodecContext *avcodec_alloc_context3(const AVCodec *codec)
-{
- AVCodecContext *avctx = (AVCodecContext *)av_mallocz(sizeof(AVCodecContext));
- if (!avctx)
- return NULL;
- int flags = 0;
- memset(avctx, 0, sizeof(AVCodecContext));
-
- if (codec) {
- avctx->codec = codec;
- }
-
- if (codec && codec->priv_data_size) {
- if (!avctx->priv_data) {
- avctx->priv_data = av_mallocz(codec->priv_data_size);
- if (!avctx->priv_data) {
- return NULL;
- }
- }
- }
- return avctx;
-}
-
-void avcodec_free_context(AVCodecContext **pavctx)
-{
- AVCodecContext *avctx = *pavctx;
-
- if (!avctx)
- return;
-
- avcodec_close(avctx);
- av_freep(&avctx->extradata);
- av_freep(pavctx);
-}
-
-int avcodec_open2(AVCodecContext *avctx, const AVCodec *codec, void *options)
-{
- int ret = 0;
-
- if (codec->priv_data_size > 0) {
- if (!avctx->priv_data) {
- avctx->priv_data = av_mallocz(codec->priv_data_size);
- if (!avctx->priv_data) {
- ret = AVERROR(ENOMEM);
- goto end;
- }
- }
- } else {
- avctx->priv_data = NULL;
- }
-
- avctx->codec = codec;
-
- if (avctx->codec->init) {
- ret = avctx->codec->init(avctx);
- if (ret < 0) {
- goto free_and_end;
- }
- }
-
- ret = 0;
-end:
-
- return ret;
-free_and_end:
- if (avctx->codec)
- avctx->codec->close(avctx);
-
- av_freep(&avctx->priv_data);
- avctx->codec = NULL;
- goto end;
-}
-
-int avcodec_close(AVCodecContext *avctx)
-{
- int i;
-
- if (!avctx)
- return 0;
-
- if (avctx->codec && avctx->codec->close)
- avctx->codec->close(avctx);
- av_freep(&avctx->priv_data);
- avctx->codec = NULL;
- return 0;
-}
-
-void avcodec_flush_buffers(AVCodecContext *avctx)
-{
- if (avctx->codec->flush)
- avctx->codec->flush(avctx);
-}
diff --git a/ext/at3_standalone/avcodec.h b/ext/at3_standalone/avcodec.h
deleted file mode 100644
index 5a4ec7818b..0000000000
--- a/ext/at3_standalone/avcodec.h
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- * copyright (c) 2001 Fabrice Bellard
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with FFmpeg; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-#ifndef AVCODEC_AVCODEC_H
-#define AVCODEC_AVCODEC_H
-
-#include
-#include "compat.h"
-#include "mem.h"
-
-enum AVCodecID {
- AV_CODEC_ID_ATRAC3,
- AV_CODEC_ID_ATRAC3P,
-};
-
-/**
- * @ingroup lavc_decoding
- * Required number of additionally allocated bytes at the end of the input bitstream for decoding.
- * This is mainly needed because some optimized bitstream readers read
- * 32 or 64 bit at once and could read over the end.
- * Note: If the first 23 bits of the additional bytes are not 0, then damaged
- * MPEG bitstreams could cause overread and segfault.
- */
-#define AV_INPUT_BUFFER_PADDING_SIZE 32
-
-/**
- * main external API structure.
- * New fields can be added to the end with minor version bumps.
- * Removal, reordering and changes to existing fields require a major
- * version bump.
- * Please use AVOptions (av_opt* / av_set/get*()) to access these fields from user
- * applications.
- * sizeof(AVCodecContext) must not be used outside libav*.
- */
-typedef struct AVCodecContext {
- /**
- * information on struct for av_log
- * - set by avcodec_alloc_context3
- */
- const struct AVCodec *codec;
-
- void *priv_data;
-
- /**
- * some codecs need / can use extradata like Huffman tables.
- * mjpeg: Huffman tables
- * rv10: additional flags
- * mpeg4: global headers (they can be in the bitstream or here)
- * The allocated memory should be AV_INPUT_BUFFER_PADDING_SIZE bytes larger
- * than extradata_size to avoid problems if it is read with the bitstream reader.
- * The bytewise contents of extradata must not depend on the architecture or CPU endianness.
- * - encoding: Set/allocated/freed by libavcodec.
- * - decoding: Set/allocated/freed by user.
- */
- uint8_t *extradata;
- int extradata_size;
-
- /**
- * Codec delay.
- *
- * Encoding: Number of frames delay there will be from the encoder input to
- * the decoder output. (we assume the decoder matches the spec)
- * Decoding: Number of frames delay in addition to what a standard decoder
- * as specified in the spec would produce.
- *
- * Video:
- * Number of frames the decoded output will be delayed relative to the
- * encoded input.
- *
- * Audio:
- * For encoding, this field is unused (see initial_padding).
- *
- * For decoding, this is the number of samples the decoder needs to
- * output before the decoder's output is valid. When seeking, you should
- * start decoding this many samples prior to your desired seek point.
- *
- * - encoding: Set by libavcodec.
- * - decoding: Set by libavcodec.
- */
- int delay;
- int channels; ///< number of audio channels
-
- /**
- * number of bytes per packet if constant and known or 0
- * Used by some WAV based audio codecs.
- */
- int block_align;
-} AVCodecContext;
-
-/**
- * AVCodec.
- */
-typedef struct AVCodec {
- /**
- * Name of the codec implementation.
- * The name is globally unique among encoders and among decoders (but an
- * encoder and a decoder can share the same name).
- * This is the primary way to find a codec from the user perspective.
- */
- const char *name;
- enum AVCodecID id;
-
- /*****************************************************************
- * No fields below this line are part of the public API. They
- * may not be used outside of libavcodec and can be changed and
- * removed at will.
- * New public fields should be added right above.
- *****************************************************************
- */
- int priv_data_size;
-
- int (*init)(AVCodecContext *);
- /**
- * Encode data to an AVPacket.
- *
- * @param avctx codec context
- * @param avpkt output AVPacket (may contain a user-provided buffer)
- * @param[in] frame AVFrame containing the raw data to be encoded
- * @param[out] got_packet_ptr encoder sets to 0 or 1 to indicate that a
- * non-empty packet was returned in avpkt.
- * @return 0 on success, negative error code on failure
- */
- int (*close)(AVCodecContext *);
- /**
- * Flush buffers.
- * Will be called when seeking
- */
- void (*flush)(AVCodecContext *);
-} AVCodec;
-
-AVCodecContext *avcodec_alloc_context3(const AVCodec *codec);
-void avcodec_free_context(AVCodecContext **avctx);
-
-int avcodec_open2(AVCodecContext *avctx, const AVCodec *codec, void *options);
-int avcodec_close(AVCodecContext *avctx);
-
-/**
- * Reset the internal decoder state / flush internal buffers. Should be called
- * e.g. when seeking or when switching to a different stream.
- *
- * @note when refcounted frames are not used (i.e. avctx->refcounted_frames is 0),
- * this invalidates the frames previously returned from the decoder. When
- * refcounted frames are used, the decoder just releases any references it might
- * keep internally, but the caller's reference remains valid.
- */
-void avcodec_flush_buffers(AVCodecContext *avctx);
-
-#endif /* AVCODEC_AVCODEC_H */
diff --git a/ext/at3_standalone/compat.h b/ext/at3_standalone/compat.h
index 4e85bb35b6..7e236bb9cb 100644
--- a/ext/at3_standalone/compat.h
+++ b/ext/at3_standalone/compat.h
@@ -16,6 +16,7 @@
#endif
#define AV_HAVE_FAST_UNALIGNED 0
+#define AV_INPUT_BUFFER_PADDING_SIZE 32
#define LOCAL_ALIGNED(bits, type, name, subscript) type name subscript
#define av_restrict
diff --git a/ext/at3_standalone/get_bits.cpp b/ext/at3_standalone/get_bits.cpp
index 0930975a4d..08e606cd2e 100644
--- a/ext/at3_standalone/get_bits.cpp
+++ b/ext/at3_standalone/get_bits.cpp
@@ -31,8 +31,8 @@
#include
#include
-#include "avcodec.h"
#include "compat.h"
+#include "mem.h"
#include "mathematics.h"
#include "get_bits.h"
diff --git a/ext/at3_standalone/sinewin.h b/ext/at3_standalone/sinewin.h
index 2aec7727f2..5965a56fe8 100644
--- a/ext/at3_standalone/sinewin.h
+++ b/ext/at3_standalone/sinewin.h
@@ -20,6 +20,8 @@
#pragma once
+#include "compat.h"
+
#define SINETABLE(size) \
DECLARE_ALIGNED(32, float, ff_sine_##size)[size]
diff --git a/libretro/Makefile.common b/libretro/Makefile.common
index d698f90632..4b3794fc48 100644
--- a/libretro/Makefile.common
+++ b/libretro/Makefile.common
@@ -259,6 +259,22 @@ SOURCES_C += \
$(EXTDIR)/libchdr/src/libchdr_flac.c \
$(EXTDIR)/libchdr/src/libchdr_huffman.c
+INCFLAGS += -I$(EXTDIR)/at3_standalone
+
+SOURCES_C += \
+ ${EXTDIR}/at3_standalone/atrac.cpp \
+ ${EXTDIR}/at3_standalone/atrac3.cpp \
+ ${EXTDIR}/at3_standalone/atrac3plus.cpp \
+ ${EXTDIR}/at3_standalone/atrac3plusdec.cpp \
+ ${EXTDIR}/at3_standalone/atrac3plusdsp.cpp \
+ ${EXTDIR}/at3_standalone/get_bits.cpp \
+ ${EXTDIR}/at3_standalone/compat.cpp \
+ ${EXTDIR}/at3_standalone/fft.cpp \
+ ${EXTDIR}/at3_standalone/float_dsp.cpp \
+ ${EXTDIR}/at3_standalone/mathematics.cpp \
+ ${EXTDIR}/at3_standalone/mem.cpp \
+ ${EXTDIR}/at3_standalone/sinewin.cpp
+
ifeq ($(PLATFORM_EXT), android)
COREFLAGS += -DHAVE_DLFCN_H
else ifneq ($(PLATFORM_EXT), win32)