mirror of https://github.com/FFmpeg/FFmpeg.git
User applications should by now be able to support float encoders. Signed-off-by: Michael Niedermayer <michaelni@gmx.at>pull/2/head
parent
d912e449b6
commit
9f4d37f450
6 changed files with 9 additions and 168 deletions
@ -1,118 +0,0 @@ |
|||||||
|
|
||||||
#include "libavutil/opt.h" |
|
||||||
#include "libavutil/samplefmt.h" |
|
||||||
#include "avcodec.h" |
|
||||||
#include "ac3.h" |
|
||||||
|
|
||||||
typedef struct CombineContext{ |
|
||||||
AVClass *av_class; ///< AVClass used for AVOption
|
|
||||||
AC3EncOptions options; ///< encoding options
|
|
||||||
void *ctx; |
|
||||||
AVCodec *codec; |
|
||||||
}CombineContext; |
|
||||||
|
|
||||||
#define OFFSET(param) offsetof(CombineContext, options.param) |
|
||||||
#define AC3ENC_PARAM (AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM) |
|
||||||
|
|
||||||
#define AC3ENC_TYPE_AC3_FIXED 0 |
|
||||||
#define AC3ENC_TYPE_AC3 1 |
|
||||||
#define AC3ENC_TYPE_EAC3 2 |
|
||||||
|
|
||||||
#define AC3ENC_TYPE 12354 |
|
||||||
|
|
||||||
/* common option values */ |
|
||||||
#define AC3ENC_OPT_NONE -1 |
|
||||||
#define AC3ENC_OPT_AUTO -1 |
|
||||||
#define AC3ENC_OPT_OFF 0 |
|
||||||
#define AC3ENC_OPT_ON 1 |
|
||||||
#define AC3ENC_OPT_NOT_INDICATED 0 |
|
||||||
#define AC3ENC_OPT_MODE_ON 1 |
|
||||||
#define AC3ENC_OPT_MODE_OFF 2 |
|
||||||
|
|
||||||
/* specific option values */ |
|
||||||
#define AC3ENC_OPT_LARGE_ROOM 1 |
|
||||||
#define AC3ENC_OPT_SMALL_ROOM 2 |
|
||||||
#define AC3ENC_OPT_DOWNMIX_LTRT 1 |
|
||||||
#define AC3ENC_OPT_DOWNMIX_LORO 2 |
|
||||||
#define AC3ENC_OPT_ADCONV_STANDARD 0 |
|
||||||
#define AC3ENC_OPT_ADCONV_HDCD 1 |
|
||||||
|
|
||||||
#include "ac3enc_opts_template.c" |
|
||||||
|
|
||||||
static AVClass ac3enc_class = { "AC-3 Encoder", av_default_item_name, |
|
||||||
eac3_options, LIBAVUTIL_VERSION_INT }; |
|
||||||
|
|
||||||
static av_cold AVCodec *get_codec(enum AVSampleFormat s){ |
|
||||||
#if CONFIG_AC3_FIXED_ENCODER |
|
||||||
if(s==AV_SAMPLE_FMT_S16) return &ff_ac3_fixed_encoder; |
|
||||||
#endif |
|
||||||
#if CONFIG_AC3_FLOAT_ENCODER |
|
||||||
if(s==AV_SAMPLE_FMT_FLT) return &ff_ac3_float_encoder; |
|
||||||
#endif |
|
||||||
return NULL; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
static av_cold int encode_init(AVCodecContext *avctx) |
|
||||||
{ |
|
||||||
CombineContext *c= avctx->priv_data; |
|
||||||
int ret; |
|
||||||
int offset= (uint8_t*)&c->options - (uint8_t*)c; |
|
||||||
|
|
||||||
c->codec= get_codec(avctx->sample_fmt); |
|
||||||
if(!c->codec){ |
|
||||||
av_log(avctx, AV_LOG_ERROR, "Unsupported sample format\n"); |
|
||||||
return -1; |
|
||||||
} |
|
||||||
c->ctx= av_mallocz(c->codec->priv_data_size); |
|
||||||
memcpy((uint8_t*)c->ctx + offset, &c->options, (uint8_t*)&c->ctx - (uint8_t*)&c->options); |
|
||||||
FFSWAP(void *,avctx->priv_data, c->ctx); |
|
||||||
ret= c->codec->init(avctx); |
|
||||||
FFSWAP(void *,avctx->priv_data, c->ctx); |
|
||||||
return ret; |
|
||||||
} |
|
||||||
|
|
||||||
static int encode_frame(AVCodecContext *avctx, unsigned char *frame, |
|
||||||
int buf_size, void *data) |
|
||||||
{ |
|
||||||
CombineContext *c= avctx->priv_data; |
|
||||||
int ret; |
|
||||||
|
|
||||||
FFSWAP(void *,avctx->priv_data, c->ctx); |
|
||||||
ret= c->codec->encode(avctx, frame, buf_size, data); |
|
||||||
FFSWAP(void *,avctx->priv_data, c->ctx); |
|
||||||
return ret; |
|
||||||
} |
|
||||||
|
|
||||||
static av_cold int encode_close(AVCodecContext *avctx) |
|
||||||
{ |
|
||||||
CombineContext *c= avctx->priv_data; |
|
||||||
int ret; |
|
||||||
|
|
||||||
FFSWAP(void *,avctx->priv_data, c->ctx); |
|
||||||
ret= c->codec->close(avctx); |
|
||||||
FFSWAP(void *,avctx->priv_data, c->ctx); |
|
||||||
return ret; |
|
||||||
} |
|
||||||
|
|
||||||
AVCodec ff_ac3_encoder = { |
|
||||||
"ac3", |
|
||||||
AVMEDIA_TYPE_AUDIO, |
|
||||||
CODEC_ID_AC3, |
|
||||||
sizeof(CombineContext), |
|
||||||
encode_init, |
|
||||||
encode_frame, |
|
||||||
encode_close, |
|
||||||
NULL, |
|
||||||
.sample_fmts = (const enum AVSampleFormat[]){ |
|
||||||
#if CONFIG_AC3_FLOAT_ENCODER |
|
||||||
AV_SAMPLE_FMT_FLT, |
|
||||||
#endif |
|
||||||
#if CONFIG_AC3_FIXED_ENCODER |
|
||||||
AV_SAMPLE_FMT_S16, |
|
||||||
#endif |
|
||||||
AV_SAMPLE_FMT_NONE}, |
|
||||||
.long_name = NULL_IF_CONFIG_SMALL("ATSC A/52A (AC-3)"), |
|
||||||
.priv_class = &ac3enc_class, |
|
||||||
.channel_layouts = ff_ac3_channel_layouts, |
|
||||||
}; |
|
Loading…
Reference in new issue