summaryrefslogtreecommitdiffstats
path: root/libaf/af_lavcac3enc.c
diff options
context:
space:
mode:
Diffstat (limited to 'libaf/af_lavcac3enc.c')
-rw-r--r--libaf/af_lavcac3enc.c31
1 files changed, 26 insertions, 5 deletions
diff --git a/libaf/af_lavcac3enc.c b/libaf/af_lavcac3enc.c
index ae557579d6..e2de58b26b 100644
--- a/libaf/af_lavcac3enc.c
+++ b/libaf/af_lavcac3enc.c
@@ -53,6 +53,7 @@ typedef struct af_ac3enc_s {
int pending_len;
int expect_len;
int min_channel_num;
+ int in_sampleformat;
} af_ac3enc_t;
// Initialization and runtime control
@@ -69,7 +70,8 @@ static int control(struct af_instance_s *af, int cmd, void *arg)
if (AF_FORMAT_IS_AC3(data->format) || data->nch < s->min_channel_num)
return AF_DETACH;
- af->data->format = AF_FORMAT_S16_NE;
+ af->data->format = s->in_sampleformat;
+ af->data->bps = af_fmt2bits(s->in_sampleformat) / 8;
if (data->rate == 48000 || data->rate == 44100 || data->rate == 32000)
af->data->rate = data->rate;
else
@@ -78,7 +80,6 @@ static int control(struct af_instance_s *af, int cmd, void *arg)
af->data->nch = AC3_MAX_CHANNELS;
else
af->data->nch = data->nch;
- af->data->bps = 2;
test_output_res = af_test_output(af, data);
s->pending_len = 0;
@@ -117,6 +118,7 @@ static int control(struct af_instance_s *af, int cmd, void *arg)
return AF_ERROR;
}
af->data->format = AF_FORMAT_AC3_BE;
+ af->data->bps = 2;
af->data->nch = 2;
return test_output_res;
case AF_CONTROL_COMMAND_LINE:
@@ -276,9 +278,6 @@ static af_data_t* play(struct af_instance_s* af, af_data_t* data)
static int af_open(af_instance_t* af){
af_ac3enc_t *s = calloc(1,sizeof(af_ac3enc_t));
- s->pending_data_size = 2 * AF_NCH * AC3_FRAME_SIZE;
- s->pending_data = malloc(s->pending_data_size);
-
af->control=control;
af->uninit=uninit;
af->play=play;
@@ -299,6 +298,28 @@ static int af_open(af_instance_t* af){
mp_tmsg(MSGT_AFILTER, MSGL_ERR, "Audio LAVC, couldn't allocate context!\n");
return AF_ERROR;
}
+ const enum AVSampleFormat *fmts = s->lavc_acodec->sample_fmts;
+ for (int i = 0; ; i++) {
+ if (fmts[i] == AV_SAMPLE_FMT_NONE) {
+ mp_msg(MSGT_AFILTER, MSGL_ERR, "Audio LAVC, encoder doesn't "
+ "support expected sample formats!\n");
+ return AF_ERROR;
+ } else if (fmts[i] == AV_SAMPLE_FMT_S16) {
+ s->in_sampleformat = AF_FORMAT_S16_NE;
+ s->lavc_actx->sample_fmt = fmts[i];
+ break;
+ } else if (fmts[i] == AV_SAMPLE_FMT_FLT) {
+ s->in_sampleformat = AF_FORMAT_FLOAT_NE;
+ s->lavc_actx->sample_fmt = fmts[i];
+ break;
+ }
+ }
+ char buf[100];
+ mp_msg(MSGT_AFILTER, MSGL_V, "[af_lavcac3enc]: in sample format: %s\n",
+ af_fmt2str(s->in_sampleformat, buf, 100));
+ s->pending_data_size = AF_NCH * AC3_FRAME_SIZE *
+ af_fmt2bits(s->in_sampleformat) / 8;
+ s->pending_data = malloc(s->pending_data_size);
return AF_OK;
}