9 #include "libmpdemux/aviheader.h"
10 #include "libaf/af_format.h"
11 #include "libmpdemux/ms_hdr.h"
12 #include "stream/stream.h"
13 #include "libmpdemux/muxer.h"
14 #include "ae_twolame.h"
15 #include "libmpdemux/mp3_hdr.h"
25 static float param_vbr
= 0;
26 static char *param_mode
= "stereo";
28 m_option_t twolameopts_conf
[] = {
29 {"br", ¶m_bitrate
, CONF_TYPE_INT
, 0, 0, 0, NULL
},
30 {"mode", ¶m_mode
, CONF_TYPE_STRING
, 0, 0, 0, NULL
},
31 {"psy", ¶m_psy
, CONF_TYPE_INT
, CONF_RANGE
, -1, 4, NULL
},
32 {"vbr", ¶m_vbr
, CONF_TYPE_FLOAT
, CONF_RANGE
, -50, 50, NULL
},
33 {"maxvbr", ¶m_maxvbr
, CONF_TYPE_INT
, 0, 0, 0, NULL
},
34 {"errprot", ¶m_errprot
, CONF_TYPE_INT
, CONF_RANGE
, 0, 1, NULL
},
35 {"debug", ¶m_debug
, CONF_TYPE_INT
, CONF_RANGE
, 0, 100000000, NULL
},
36 {NULL
, NULL
, 0, 0, 0, 0, NULL
}
40 static int bind_twolame(audio_encoder_t
*encoder
, muxer_stream_t
*mux_a
)
42 mpae_twolame_ctx
*ctx
= (mpae_twolame_ctx
*) encoder
->priv
;
44 mux_a
->wf
= malloc(sizeof(WAVEFORMATEX
)+256);
45 mux_a
->wf
->wFormatTag
= 0x50;
46 mux_a
->wf
->nChannels
= encoder
->params
.channels
;
47 mux_a
->wf
->nSamplesPerSec
= encoder
->params
.sample_rate
;
48 mux_a
->wf
->nAvgBytesPerSec
= encoder
->params
.bitrate
/ 8;
50 if(ctx
->vbr
|| ((mux_a
->wf
->nAvgBytesPerSec
* encoder
->params
.samples_per_frame
) % mux_a
->wf
->nSamplesPerSec
))
52 mux_a
->h
.dwScale
= encoder
->params
.samples_per_frame
;
53 mux_a
->h
.dwRate
= encoder
->params
.sample_rate
;
54 mux_a
->h
.dwSampleSize
= 0; // Blocksize not constant
58 mux_a
->h
.dwScale
= (mux_a
->wf
->nAvgBytesPerSec
* encoder
->params
.samples_per_frame
)/ mux_a
->wf
->nSamplesPerSec
; /* for cbr */
59 mux_a
->h
.dwRate
= mux_a
->wf
->nAvgBytesPerSec
;
60 mux_a
->h
.dwSampleSize
= mux_a
->h
.dwScale
;
62 mux_a
->wf
->nBlockAlign
= mux_a
->h
.dwScale
;
63 mux_a
->h
.dwSuggestedBufferSize
= (encoder
->params
.audio_preload
*mux_a
->wf
->nAvgBytesPerSec
)/1000;
64 mux_a
->h
.dwSuggestedBufferSize
-= mux_a
->h
.dwSuggestedBufferSize
% mux_a
->wf
->nBlockAlign
;
66 mux_a
->wf
->cbSize
= 0; //12;
67 mux_a
->wf
->wBitsPerSample
= 0; /* does not apply */
68 ((MPEGLAYER3WAVEFORMAT
*) (mux_a
->wf
))->wID
= 1;
69 ((MPEGLAYER3WAVEFORMAT
*) (mux_a
->wf
))->fdwFlags
= 2;
70 ((MPEGLAYER3WAVEFORMAT
*) (mux_a
->wf
))->nBlockSize
= mux_a
->wf
->nBlockAlign
;
71 ((MPEGLAYER3WAVEFORMAT
*) (mux_a
->wf
))->nFramesPerBlock
= 1;
72 ((MPEGLAYER3WAVEFORMAT
*) (mux_a
->wf
))->nCodecDelay
= 0;
75 mux_a
->wf
= realloc(mux_a
->wf
, sizeof(WAVEFORMATEX
)+mux_a
->wf
->cbSize
);
77 encoder
->input_format
= AF_FORMAT_S16_NE
;
78 encoder
->min_buffer_size
= mux_a
->h
.dwSuggestedBufferSize
;
79 encoder
->max_buffer_size
= mux_a
->h
.dwSuggestedBufferSize
*2;
84 static int encode_twolame(audio_encoder_t
*encoder
, uint8_t *dest
, void *src
, int len
, int max_size
)
86 mpae_twolame_ctx
*ctx
= (mpae_twolame_ctx
*)encoder
->priv
;
89 len
/= (2*encoder
->params
.channels
);
90 ret_size
= twolame_encode_buffer_interleaved(ctx
->twolame_ctx
, src
, len
, dest
, max_size
);
91 r2
= mp_decode_mp3_header(dest
);
92 mp_msg(MSGT_MENCODER
, MSGL_DBG2
, "\nSIZE: %d, max: %d, r2: %d\n", ret_size
, max_size
, r2
);
98 int close_twolame(audio_encoder_t
*encoder
)
104 static int get_frame_size(audio_encoder_t
*encoder
)
107 if(encoder
->stream
->buffer_len
< 4)
109 sz
= mp_decode_mp3_header(encoder
->stream
->buffer
);
116 int mpae_init_twolame(audio_encoder_t
*encoder
)
119 mpae_twolame_ctx
*ctx
= NULL
;
121 if(encoder
->params
.channels
== 1)
123 mp_msg(MSGT_MENCODER
, MSGL_INFO
, "ae_twolame, 1 audio channel, forcing mono mode\n");
126 else if(encoder
->params
.channels
== 2)
128 if(! strcasecmp(param_mode
, "dual"))
129 mode
= TWOLAME_DUAL_CHANNEL
;
130 else if(! strcasecmp(param_mode
, "jstereo"))
131 mode
= TWOLAME_JOINT_STEREO
;
132 else if(! strcasecmp(param_mode
, "stereo"))
133 mode
= TWOLAME_STEREO
;
136 mp_msg(MSGT_MENCODER
, MSGL_ERR
, "ae_twolame, unknown mode %s, exiting\n", param_mode
);
140 mp_msg(MSGT_MENCODER
, MSGL_ERR
, "ae_twolame, Twolame can't encode > 2 channels, exiting\n");
142 ctx
= (mpae_twolame_ctx
*) calloc(1, sizeof(mpae_twolame_ctx
));
145 mp_msg(MSGT_MENCODER
, MSGL_ERR
, "ae_twolame, couldn't alloc a %d bytes context, exiting\n", sizeof(mpae_twolame_ctx
));
149 ctx
->twolame_ctx
= twolame_init();
150 if(ctx
->twolame_ctx
== NULL
)
152 mp_msg(MSGT_MENCODER
, MSGL_ERR
, "ae_twolame, couldn't initial parameters from libtwolame, exiting\n");
158 if(twolame_set_num_channels(ctx
->twolame_ctx
, encoder
->params
.channels
) != 0)
160 if(twolame_set_mode(ctx
->twolame_ctx
, mode
) != 0)
163 if(twolame_set_in_samplerate(ctx
->twolame_ctx
, encoder
->params
.sample_rate
) != 0)
166 if(twolame_set_out_samplerate(ctx
->twolame_ctx
, encoder
->params
.sample_rate
) != 0)
169 if(encoder
->params
.sample_rate
< 32000)
170 twolame_set_version(ctx
->twolame_ctx
, TWOLAME_MPEG2
);
172 twolame_set_version(ctx
->twolame_ctx
, TWOLAME_MPEG1
);
174 if(twolame_set_psymodel(ctx
->twolame_ctx
, param_psy
) != 0)
177 if(twolame_set_bitrate(ctx
->twolame_ctx
, param_bitrate
) != 0)
181 if(twolame_set_error_protection(ctx
->twolame_ctx
, TRUE
) != 0)
186 if(twolame_set_VBR(ctx
->twolame_ctx
, TRUE
) != 0)
188 if(twolame_set_VBR_q(ctx
->twolame_ctx
, param_vbr
) != 0)
190 if(twolame_set_padding(ctx
->twolame_ctx
, FALSE
) != 0)
194 if(twolame_set_VBR_max_bitrate_kbps(ctx
->twolame_ctx
, param_maxvbr
) != 0)
200 if(twolame_set_verbosity(ctx
->twolame_ctx
, param_debug
) != 0)
203 if(twolame_init_params(ctx
->twolame_ctx
) != 0)
206 encoder
->params
.bitrate
= param_bitrate
* 1000;
207 encoder
->params
.samples_per_frame
= 1152;
209 encoder
->decode_buffer_size
= 1152 * 2 * encoder
->params
.channels
;
211 encoder
->bind
= bind_twolame
;
212 encoder
->get_frame_size
= get_frame_size
;
213 encoder
->encode
= encode_twolame
;
214 encoder
->close
= close_twolame
;