summaryrefslogtreecommitdiffstats
path: root/audio/filter/af_lavcac3enc.c
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2013-11-15 00:13:04 +0100
committerwm4 <wm4@nowhere>2013-11-15 00:24:03 +0100
commit7f7e9a9fff8a13cd55d25290102e029892431854 (patch)
treed2cef2a221d2d873ee7d178652916a6897370b5b /audio/filter/af_lavcac3enc.c
parent8512a08046adf0bcea501ecbf48d0e9f1b8ba6da (diff)
downloadmpv-7f7e9a9fff8a13cd55d25290102e029892431854.tar.bz2
mpv-7f7e9a9fff8a13cd55d25290102e029892431854.tar.xz
af_lavcac3enc: use option parser
This changes option parsing as well as filter defaults slightly. The default is now to encode to spdif (this is way more useful than writing raw AC3 - what was this even useful for, other than writing broken ac3 -in-wav files?). The bitrate parameter is now always in kbps.
Diffstat (limited to 'audio/filter/af_lavcac3enc.c')
-rw-r--r--audio/filter/af_lavcac3enc.c72
1 files changed, 37 insertions, 35 deletions
diff --git a/audio/filter/af_lavcac3enc.c b/audio/filter/af_lavcac3enc.c
index dc2aeb5045..ae652e12e9 100644
--- a/audio/filter/af_lavcac3enc.c
+++ b/audio/filter/af_lavcac3enc.c
@@ -51,21 +51,21 @@ typedef struct af_ac3enc_s {
struct AVCodec *lavc_acodec;
struct AVCodecContext *lavc_actx;
AVPacket pkt;
- bool planarize;
- int add_iec61937_header;
int bit_rate;
struct mp_audio_buffer *pending;
int in_samples; // samples of input per AC3 frame
int out_samples; // upper bound on encoded output per AC3 frame
- int min_channel_num;
int in_sampleformat;
+
+ int cfg_add_iec61937_header;
+ int cfg_bit_rate;
+ int cfg_min_channel_num;
} af_ac3enc_t;
// Initialization and runtime control
static int control(struct af_instance *af, int cmd, void *arg)
{
af_ac3enc_t *s = af->setup;
- int i, bit_rate;
static const int default_bit_rate[AC3_MAX_CHANNELS+1] = \
{0, 96000, 192000, 256000, 384000, 448000, 448000};
@@ -74,7 +74,7 @@ static int control(struct af_instance *af, int cmd, void *arg)
struct mp_audio *in = arg;
struct mp_audio orig_in = *in;
- if (AF_FORMAT_IS_AC3(in->format) || in->nch < s->min_channel_num)
+ if (AF_FORMAT_IS_AC3(in->format) || in->nch < s->cfg_min_channel_num)
return AF_DETACH;
mp_audio_set_format(in, s->in_sampleformat);
@@ -94,7 +94,7 @@ static int control(struct af_instance *af, int cmd, void *arg)
return AF_FALSE;
s->in_samples = AC3_FRAME_SIZE;
- if (s->add_iec61937_header) {
+ if (s->cfg_add_iec61937_header) {
s->out_samples = AC3_FRAME_SIZE;
} else {
s->out_samples = AC3_MAX_CODED_FRAME_SIZE / af->data->sstride;
@@ -106,7 +106,7 @@ static int control(struct af_instance *af, int cmd, void *arg)
mp_msg(MSGT_AFILTER, MSGL_DBG2, "af_lavcac3enc reinit: %d, %d, %f, %d.\n",
in->nch, in->rate, af->mul, s->in_samples);
- bit_rate = s->bit_rate ? s->bit_rate : default_bit_rate[in->nch];
+ int bit_rate = s->bit_rate ? s->bit_rate : default_bit_rate[in->nch];
if (s->lavc_actx->channels != in->nch ||
s->lavc_actx->sample_rate != in->rate ||
@@ -132,32 +132,6 @@ static int control(struct af_instance *af, int cmd, void *arg)
}
return AF_OK;
}
- case AF_CONTROL_COMMAND_LINE:
- mp_msg(MSGT_AFILTER, MSGL_DBG2, "af_lavcac3enc cmdline: %s.\n", (char*)arg);
- s->bit_rate = 0;
- s->min_channel_num = 0;
- s->add_iec61937_header = 0;
- sscanf(arg,"%d:%d:%d", &s->add_iec61937_header, &s->bit_rate,
- &s->min_channel_num);
- if (s->bit_rate < 1000)
- s->bit_rate *= 1000;
- if (s->bit_rate) {
- for (i = 0; i < 19; ++i)
- if (ac3_bitrate_tab[i] * 1000 == s->bit_rate)
- break;
- if (i >= 19) {
- mp_msg(MSGT_AFILTER, MSGL_WARN, "af_lavcac3enc unable set unsupported "
- "bitrate %d, use default bitrate (check manpage to see "
- "supported bitrates).\n", s->bit_rate);
- s->bit_rate = 0;
- }
- }
- if (s->min_channel_num == 0)
- s->min_channel_num = 5;
- mp_msg(MSGT_AFILTER, MSGL_V, "af_lavcac3enc config spdif:%d, bitrate:%d, "
- "minchnum:%d.\n", s->add_iec61937_header, s->bit_rate,
- s->min_channel_num);
- return AF_OK;
}
return AF_UNKNOWN;
}
@@ -242,7 +216,7 @@ static struct mp_audio* play(struct af_instance* af, struct mp_audio* audio)
int header_len = 0;
char hdr[8];
- if (s->add_iec61937_header && s->pkt.size > 5) {
+ if (s->cfg_add_iec61937_header && s->pkt.size > 5) {
int bsmod = s->pkt.data[5] & 0x7;
int len = frame_size;
@@ -276,7 +250,7 @@ static struct mp_audio* play(struct af_instance* af, struct mp_audio* audio)
static int af_open(struct af_instance* af){
- af_ac3enc_t *s = talloc_zero(af, af_ac3enc_t);
+ af_ac3enc_t *s = af->priv;
af->control=control;
af->uninit=uninit;
af->play=play;
@@ -313,11 +287,39 @@ static int af_open(struct af_instance* af){
s->pending = mp_audio_buffer_create(af);
+ if (s->cfg_bit_rate) {
+ int i;
+ for (i = 0; i < 19; i++) {
+ if (ac3_bitrate_tab[i] == s->cfg_bit_rate)
+ break;
+ }
+ if (i >= 19) {
+ mp_msg(MSGT_AFILTER, MSGL_WARN, "af_lavcac3enc unable set unsupported "
+ "bitrate %d, use default bitrate (check manpage to see "
+ "supported bitrates).\n", s->cfg_bit_rate);
+ s->cfg_bit_rate = 0;
+ }
+ }
+
return AF_OK;
}
+#define OPT_BASE_STRUCT struct af_ac3enc_s
+
struct af_info af_info_lavcac3enc = {
.info = "runtime encode to ac3 using libavcodec",
.name = "lavcac3enc",
.open = af_open,
+ .priv_size = sizeof(struct af_ac3enc_s),
+ .priv_defaults = &(const struct af_ac3enc_s){
+ .cfg_add_iec61937_header = 1,
+ .cfg_min_channel_num = 5,
+ },
+ .options = (const struct m_option[]) {
+ OPT_FLAG("tospdif", cfg_add_iec61937_header, 0),
+ OPT_CHOICE_OR_INT("bitrate", cfg_bit_rate, 0, 32, 640,
+ ({"default", 0})),
+ OPT_INTRANGE("minch", cfg_min_channel_num, 0, 2, 6),
+ {0}
+ },
};