#include "encoder.h" #include static gboolean lame_encoder_init(gpointer *data) { lame_global_flags *gfp; gfp = lame_init(); int ret = lame_init_params(gfp); *data = gfp; return (ret >= 0 ? TRUE : FALSE); } static gssize lame_encoder_encode(gpointer data, GInputStream *input, GOutputStream *output, GError **error) { lame_global_flags *gfp = data; const int inbuf_size = 0x400*8; const int outbuf_size = 0x400*8; unsigned char inbuf[inbuf_size]; unsigned char outbuf[inbuf_size]; int inbuf_read = g_input_stream_read(input, inbuf, inbuf_size, NULL, NULL); int ret = lame_encode_buffer_interleaved(gfp, (short*)inbuf, inbuf_read / 4, outbuf, outbuf_size); ret = g_output_stream_write(output, outbuf, ret, NULL, error); if(ret == 0) { *error = g_error_new(encoder_quark(), ENCODER_CODE_DONE, "encoding done"); } return ret; } static void lame_encoder_flush(gpointer data, GOutputStream *output, GError **error) { lame_global_flags *gfp = data; const int outbuf_size = 7200; unsigned char outbuf[outbuf_size]; int size = lame_encode_flush(gfp, outbuf, outbuf_size); g_output_stream_write(output, outbuf, size, NULL, error); } static void lame_encoder_close(gpointer data) { lame_global_flags *gfp = data; lame_close(gfp); } const struct encoder_plugin encoder_lame_encoder = { .name = "lame", .init = lame_encoder_init, .encode = lame_encoder_encode, .flush = lame_encoder_flush, .close = lame_encoder_close, };