10 #include "libaf/af_format.h"
13 #include "ae_toolame.h"
14 #include "libmpdemux/mp3_hdr.h"
24 static float param_vbr
= 0;
25 static char *param_mode
= "stereo";
27 m_option_t toolameopts_conf
[] = {
28 {"br", ¶m_bitrate
, CONF_TYPE_INT
, 0, 0, 0, NULL
},
29 {"mode", ¶m_mode
, CONF_TYPE_STRING
, 0, 0, 0, NULL
},
30 {"psy", ¶m_psy
, CONF_TYPE_INT
, CONF_RANGE
, -1, 4, NULL
},
31 {"vbr", ¶m_vbr
, CONF_TYPE_FLOAT
, CONF_RANGE
, -50, 50, NULL
},
32 {"maxvbr", ¶m_maxvbr
, CONF_TYPE_INT
, 0, 0, 0, NULL
},
33 {"errprot", ¶m_errprot
, CONF_TYPE_INT
, CONF_RANGE
, 0, 1, NULL
},
34 {"debug", ¶m_debug
, CONF_TYPE_INT
, CONF_RANGE
, 0, 100000000, NULL
},
35 {NULL
, NULL
, 0, 0, 0, 0, NULL
}
39 static int bind_toolame(audio_encoder_t
*encoder
, muxer_stream_t
*mux_a
)
41 mpae_toolame_ctx
*ctx
= (mpae_toolame_ctx
*) encoder
->priv
;
43 mux_a
->wf
= malloc(sizeof(WAVEFORMATEX
)+256);
44 mux_a
->wf
->wFormatTag
= 0x50;
45 mux_a
->wf
->nChannels
= encoder
->params
.channels
;
46 mux_a
->wf
->nSamplesPerSec
= encoder
->params
.sample_rate
;
47 mux_a
->wf
->nAvgBytesPerSec
= 125 * encoder
->params
.bitrate
;
49 if(ctx
->vbr
|| ((mux_a
->wf
->nAvgBytesPerSec
* encoder
->params
.samples_per_frame
) % mux_a
->wf
->nSamplesPerSec
))
51 mux_a
->h
.dwScale
= encoder
->params
.samples_per_frame
;
52 mux_a
->h
.dwRate
= encoder
->params
.sample_rate
;
53 mux_a
->h
.dwSampleSize
= 0; // Blocksize not constant
57 mux_a
->h
.dwScale
= (mux_a
->wf
->nAvgBytesPerSec
* encoder
->params
.samples_per_frame
)/ mux_a
->wf
->nSamplesPerSec
; /* for cbr */
58 mux_a
->h
.dwRate
= mux_a
->wf
->nAvgBytesPerSec
;
59 mux_a
->h
.dwSampleSize
= mux_a
->h
.dwScale
;
61 mux_a
->wf
->nBlockAlign
= mux_a
->h
.dwScale
;
62 mux_a
->h
.dwSuggestedBufferSize
= (encoder
->params
.audio_preload
*mux_a
->wf
->nAvgBytesPerSec
)/1000;
63 mux_a
->h
.dwSuggestedBufferSize
-= mux_a
->h
.dwSuggestedBufferSize
% mux_a
->wf
->nBlockAlign
;
65 mux_a
->wf
->cbSize
= 0; //12;
66 mux_a
->wf
->wBitsPerSample
= 0; /* does not apply */
67 ((MPEGLAYER3WAVEFORMAT
*) (mux_a
->wf
))->wID
= 1;
68 ((MPEGLAYER3WAVEFORMAT
*) (mux_a
->wf
))->fdwFlags
= 2;
69 ((MPEGLAYER3WAVEFORMAT
*) (mux_a
->wf
))->nBlockSize
= mux_a
->wf
->nBlockAlign
;
70 ((MPEGLAYER3WAVEFORMAT
*) (mux_a
->wf
))->nFramesPerBlock
= 1;
71 ((MPEGLAYER3WAVEFORMAT
*) (mux_a
->wf
))->nCodecDelay
= 0;
74 mux_a
->wf
= realloc(mux_a
->wf
, sizeof(WAVEFORMATEX
)+mux_a
->wf
->cbSize
);
76 encoder
->input_format
= AF_FORMAT_S16_NE
;
77 encoder
->min_buffer_size
= mux_a
->h
.dwSuggestedBufferSize
;
78 encoder
->max_buffer_size
= mux_a
->h
.dwSuggestedBufferSize
*2;
83 static int encode_toolame(audio_encoder_t
*encoder
, uint8_t *dest
, void *src
, int len
, int max_size
)
85 mpae_toolame_ctx
*ctx
= (mpae_toolame_ctx
*)encoder
->priv
;
86 int ret_size
= 0, r2
, i
, nsamples
;
89 nsamples
= len
/ (2*encoder
->params
.channels
);
90 buffer
= (uint16_t *) src
;
91 for(i
= 0; i
< nsamples
; i
++)
93 ctx
->left_pcm
[i
] = buffer
[ctx
->channels
* i
];
94 ctx
->right_pcm
[i
] = buffer
[(ctx
->channels
* i
) + (ctx
->channels
- 1)];
97 toolame_encode_buffer(ctx
->toolame_ctx
, ctx
->left_pcm
, ctx
->right_pcm
, nsamples
, dest
, max_size
, &ret_size
);
98 r2
= mp_decode_mp3_header(dest
);
99 mp_msg(MSGT_MENCODER
, MSGL_DBG2
, "\nSIZE: %d, max: %d, r2: %d\n", ret_size
, max_size
, r2
);
105 int close_toolame(audio_encoder_t
*encoder
)
111 static int get_frame_size(audio_encoder_t
*encoder
)
114 if(encoder
->stream
->buffer_len
< 4)
116 sz
= mp_decode_mp3_header(encoder
->stream
->buffer
);
123 int mpae_init_toolame(audio_encoder_t
*encoder
)
126 mpae_toolame_ctx
*ctx
= NULL
;
128 if(encoder
->params
.channels
== 1)
130 mp_msg(MSGT_MENCODER
, MSGL_INFO
, "ae_toolame, 1 audio channel, forcing mono mode\n");
133 else if(encoder
->params
.channels
== 2)
135 if(! strcasecmp(param_mode
, "dual"))
136 mode
= MPG_MD_DUAL_CHANNEL
;
137 else if(! strcasecmp(param_mode
, "jstereo"))
138 mode
= MPG_MD_JOINT_STEREO
;
139 else if(! strcasecmp(param_mode
, "stereo"))
140 mode
= MPG_MD_STEREO
;
143 mp_msg(MSGT_MENCODER
, MSGL_ERR
, "ae_toolame, unknown mode %s, exiting\n", param_mode
);
147 mp_msg(MSGT_MENCODER
, MSGL_ERR
, "ae_toolame, Toolame can't encode > 2 channels, exiting\n");
149 ctx
= (mpae_toolame_ctx
*) calloc(1, sizeof(mpae_toolame_ctx
));
152 mp_msg(MSGT_MENCODER
, MSGL_ERR
, "ae_toolame, couldn't alloc a %d bytes context, exiting\n", sizeof(mpae_toolame_ctx
));
156 ctx
->toolame_ctx
= toolame_init();
157 if(ctx
->toolame_ctx
== NULL
)
159 mp_msg(MSGT_MENCODER
, MSGL_ERR
, "ae_toolame, couldn't initial parameters from libtoolame, exiting\n");
164 ctx
->channels
= encoder
->params
.channels
;
165 ctx
->srate
= encoder
->params
.sample_rate
;
167 if(toolame_setMode(ctx
->toolame_ctx
, mode
) != 0)
170 if(toolame_setPsymodel(ctx
->toolame_ctx
, param_psy
) != 0)
173 if(toolame_setSampleFreq(ctx
->toolame_ctx
, encoder
->params
.sample_rate
) != 0)
176 if(toolame_setBitrate(ctx
->toolame_ctx
, param_bitrate
) != 0)
180 if(toolame_setErrorProtection(ctx
->toolame_ctx
, TRUE
) != 0)
185 if(toolame_setVBR(ctx
->toolame_ctx
, TRUE
) != 0)
187 if(toolame_setVBRLevel(ctx
->toolame_ctx
, param_vbr
) != 0)
189 if(toolame_setPadding(ctx
->toolame_ctx
, FALSE
) != 0)
193 if(toolame_setVBRUpperBitrate(ctx
->toolame_ctx
, param_maxvbr
) != 0)
199 if(toolame_setVerbosity(ctx
->toolame_ctx
, param_debug
) != 0)
202 if(toolame_init_params(ctx
->toolame_ctx
) != 0)
205 ctx
->bitrate
= param_bitrate
;
206 encoder
->params
.bitrate
= ctx
->bitrate
;
207 encoder
->params
.samples_per_frame
= 1152;
209 encoder
->decode_buffer_size
= 1152 * 2 * encoder
->params
.channels
;
211 encoder
->bind
= bind_toolame
;
212 encoder
->get_frame_size
= get_frame_size
;
213 encoder
->encode
= encode_toolame
;
214 encoder
->close
= close_toolame
;