mirror of https://github.com/FFmpeg/FFmpeg.git
TODO: bump minor It's inferior in quality to fdk-aac and has an arguably more problematic license. As early as 2012, a HydrogenAudio user reported: > It has however one huge advantage: much better quality at low bitrates than > faac and libaacplus. (https://hydrogenaud.io/index.php?PHPSESSID=ckiq394pdglka0kj2fin6ij8t7&topic=95989.msg804633#msg804633) I myself have made a few spectrograms for a comparison of the two encoders as well. The FDK output is consistently better than the libaacplus one, in all bitrates I tested. libaacplus license is 3GPP + LGPLv2. 3GPP copyright notice is completely proprietory, as follows: > No part may be reproduced except as authorized by written permission. > > The copyright and the foregoing restriction extend to reproduction in > all media. > > © 2008, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC). > > All rights reserved. (The latest 26410-d00 zip from 3GPP has the same notice, but the copyright year is changed to 2015) The copyright part of the FDK AAC license (section 2) is a copyleft license that permits redistribution under certain conditions (and therefore the LGPL + libfdk-aac combination is not prohibited by configure): > Redistribution and use in source and binary forms, with or without > modification, are permitted without payment of copyright license fees > provided that you satisfy the following conditions: > > You must retain the complete text of this software license in > redistributions of the FDK AAC Codec or your modifications thereto in > source code form. > > You must retain the complete text of this software license in the > documentation and/or other materials provided with redistributions of > the FDK AAC Codec or your modifications thereto in binary form. > > You must make available free of charge copies of the complete source > code of the FDK AAC Codec and your modifications thereto to recipients > of copies in binary form. > > The name of Fraunhofer may not be used to endorse or promote products > derived from this library without prior written permission. > > You may not charge copyright license fees for anyone to use, copy or > distribute the FDK AAC Codec software or your modifications thereto. > > Your modified versions of the FDK AAC Codec must carry prominent > notices stating that you changed the software and the date of any > change. For modified versions of the FDK AAC Codec, the term > "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the > term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec > Library for Android."pull/172/merge
parent
5893e87537
commit
9ba54c1b82
8 changed files with 6 additions and 162 deletions
@ -1,150 +0,0 @@ |
||||
/*
|
||||
* Interface to libaacplus for aac+ (sbr+ps) encoding |
||||
* Copyright (c) 2010 tipok <piratfm@gmail.com> |
||||
* |
||||
* This file is part of FFmpeg. |
||||
* |
||||
* FFmpeg is free software; you can redistribute it and/or |
||||
* modify it under the terms of the GNU Lesser General Public |
||||
* License as published by the Free Software Foundation; either |
||||
* version 2.1 of the License, or (at your option) any later version. |
||||
* |
||||
* FFmpeg is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
||||
* Lesser General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU Lesser General Public |
||||
* License along with FFmpeg; if not, write to the Free Software |
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
||||
*/ |
||||
|
||||
/**
|
||||
* @file |
||||
* Interface to libaacplus for aac+ (sbr+ps) encoding. |
||||
*/ |
||||
|
||||
#include <aacplus.h> |
||||
|
||||
#include "avcodec.h" |
||||
#include "internal.h" |
||||
|
||||
typedef struct aacPlusAudioContext { |
||||
aacplusEncHandle aacplus_handle; |
||||
unsigned long max_output_bytes; |
||||
unsigned long samples_input; |
||||
} aacPlusAudioContext; |
||||
|
||||
static int aacPlus_encode_close(AVCodecContext *avctx); |
||||
|
||||
static av_cold int aacPlus_encode_init(AVCodecContext *avctx) |
||||
{ |
||||
aacPlusAudioContext *s = avctx->priv_data; |
||||
aacplusEncConfiguration *aacplus_cfg; |
||||
|
||||
/* number of channels */ |
||||
if (avctx->channels < 1 || avctx->channels > 2) { |
||||
av_log(avctx, AV_LOG_ERROR, "encoding %d channel(s) is not allowed\n", avctx->channels); |
||||
return AVERROR(EINVAL); |
||||
} |
||||
|
||||
if (avctx->profile != FF_PROFILE_AAC_LOW && avctx->profile != FF_PROFILE_UNKNOWN) { |
||||
av_log(avctx, AV_LOG_ERROR, "invalid AAC profile: %d, only LC supported\n", avctx->profile); |
||||
return AVERROR(EINVAL); |
||||
} |
||||
|
||||
s->aacplus_handle = aacplusEncOpen(avctx->sample_rate, avctx->channels, |
||||
&s->samples_input, &s->max_output_bytes); |
||||
if (!s->aacplus_handle) { |
||||
av_log(avctx, AV_LOG_ERROR, "can't open encoder\n"); |
||||
return AVERROR(EINVAL); |
||||
} |
||||
|
||||
/* check aacplus version */ |
||||
aacplus_cfg = aacplusEncGetCurrentConfiguration(s->aacplus_handle); |
||||
|
||||
aacplus_cfg->bitRate = avctx->bit_rate; |
||||
aacplus_cfg->bandWidth = avctx->cutoff; |
||||
aacplus_cfg->outputFormat = !(avctx->flags & AV_CODEC_FLAG_GLOBAL_HEADER); |
||||
aacplus_cfg->inputFormat = avctx->sample_fmt == AV_SAMPLE_FMT_FLT ? AACPLUS_INPUT_FLOAT : AACPLUS_INPUT_16BIT; |
||||
if (!aacplusEncSetConfiguration(s->aacplus_handle, aacplus_cfg)) { |
||||
av_log(avctx, AV_LOG_ERROR, "libaacplus doesn't support this output format!\n"); |
||||
aacPlus_encode_close(avctx); |
||||
return AVERROR(EINVAL); |
||||
} |
||||
|
||||
avctx->frame_size = s->samples_input / avctx->channels; |
||||
|
||||
/* Set decoder specific info */ |
||||
avctx->extradata_size = 0; |
||||
if (avctx->flags & AV_CODEC_FLAG_GLOBAL_HEADER) { |
||||
|
||||
unsigned char *buffer = NULL; |
||||
unsigned long decoder_specific_info_size; |
||||
|
||||
if (aacplusEncGetDecoderSpecificInfo(s->aacplus_handle, &buffer, |
||||
&decoder_specific_info_size) == 1) { |
||||
avctx->extradata = av_malloc(decoder_specific_info_size + AV_INPUT_BUFFER_PADDING_SIZE); |
||||
if (!avctx->extradata) { |
||||
free(buffer); |
||||
aacPlus_encode_close(avctx); |
||||
return AVERROR(ENOMEM); |
||||
} |
||||
avctx->extradata_size = decoder_specific_info_size; |
||||
memcpy(avctx->extradata, buffer, avctx->extradata_size); |
||||
} |
||||
free(buffer); |
||||
} |
||||
return 0; |
||||
} |
||||
|
||||
static int aacPlus_encode_frame(AVCodecContext *avctx, AVPacket *pkt, |
||||
const AVFrame *frame, int *got_packet) |
||||
{ |
||||
aacPlusAudioContext *s = avctx->priv_data; |
||||
int32_t *input_buffer = (int32_t *)frame->data[0]; |
||||
int ret; |
||||
|
||||
if ((ret = ff_alloc_packet2(avctx, pkt, s->max_output_bytes, 0)) < 0) |
||||
return ret; |
||||
|
||||
pkt->size = aacplusEncEncode(s->aacplus_handle, input_buffer, |
||||
s->samples_input, pkt->data, pkt->size); |
||||
*got_packet = 1; |
||||
pkt->pts = frame->pts; |
||||
return 0; |
||||
} |
||||
|
||||
static av_cold int aacPlus_encode_close(AVCodecContext *avctx) |
||||
{ |
||||
aacPlusAudioContext *s = avctx->priv_data; |
||||
|
||||
av_freep(&avctx->extradata); |
||||
aacplusEncClose(s->aacplus_handle); |
||||
s->aacplus_handle = NULL; |
||||
|
||||
return 0; |
||||
} |
||||
|
||||
static const AVProfile profiles[] = { |
||||
{ FF_PROFILE_AAC_LOW, "LC" }, |
||||
{ FF_PROFILE_UNKNOWN }, |
||||
}; |
||||
|
||||
AVCodec ff_libaacplus_encoder = { |
||||
.name = "libaacplus", |
||||
.long_name = NULL_IF_CONFIG_SMALL("libaacplus AAC+ (Advanced Audio Codec with SBR+PS)"), |
||||
.type = AVMEDIA_TYPE_AUDIO, |
||||
.id = AV_CODEC_ID_AAC, |
||||
.priv_data_size = sizeof(aacPlusAudioContext), |
||||
.init = aacPlus_encode_init, |
||||
.encode2 = aacPlus_encode_frame, |
||||
.close = aacPlus_encode_close, |
||||
.sample_fmts = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_S16, |
||||
AV_SAMPLE_FMT_FLT, |
||||
AV_SAMPLE_FMT_NONE }, |
||||
.profiles = profiles, |
||||
.channel_layouts = (const uint64_t[]) { AV_CH_LAYOUT_MONO, |
||||
AV_CH_LAYOUT_STEREO, |
||||
0 }, |
||||
}; |
Loading…
Reference in new issue