1 /* $Id: enclame.c,v 1.9 2005/03/05 14:27:05 titer Exp $
3 This file is part of the HandBrake source code.
4 Homepage: <http://handbrake.m0k.org/>.
5 It may be used under the terms of the GNU General Public License. */
11 int enclameInit( hb_work_object_t
*, hb_job_t
* );
12 int enclameWork( hb_work_object_t
*, hb_buffer_t
**, hb_buffer_t
** );
13 void enclameClose( hb_work_object_t
* );
15 hb_work_object_t hb_enclame
=
18 "MP3 encoder (libmp3lame)",
24 struct hb_work_private_s
29 lame_global_flags
* lame
;
31 unsigned long input_samples
;
32 unsigned long output_bytes
;
39 int enclameInit( hb_work_object_t
* w
, hb_job_t
* job
)
41 hb_work_private_t
* pv
= calloc( 1, sizeof( hb_work_private_t
) );
46 hb_log( "enclame: opening libmp3lame" );
48 pv
->lame
= lame_init();
49 lame_set_brate( pv
->lame
, job
->abitrate
);
50 lame_set_in_samplerate( pv
->lame
, job
->arate
);
51 lame_set_out_samplerate( pv
->lame
, job
->arate
);
52 lame_init_params( pv
->lame
);
54 pv
->input_samples
= 1152 * 2;
55 pv
->output_bytes
= LAME_MAXMP3BUFFER
;
56 pv
->buf
= malloc( pv
->input_samples
* sizeof( float ) );
58 pv
->list
= hb_list_init();
64 /***********************************************************************
66 ***********************************************************************
68 **********************************************************************/
69 void enclameClose( hb_work_object_t
* w
)
71 hb_work_private_t
* pv
= w
->private_data
;
73 lame_close( pv
->lame
);
74 hb_list_empty( &pv
->list
);
77 w
->private_data
= NULL
;
80 /***********************************************************************
82 ***********************************************************************
84 **********************************************************************/
85 static hb_buffer_t
* Encode( hb_work_object_t
* w
)
87 hb_work_private_t
* pv
= w
->private_data
;
89 int16_t samples_s16
[1152 * 2];
93 if( hb_list_bytes( pv
->list
) < pv
->input_samples
* sizeof( float ) )
98 hb_list_getbytes( pv
->list
, pv
->buf
, pv
->input_samples
* sizeof( float ),
101 for( i
= 0; i
< 1152 * 2; i
++ )
103 samples_s16
[i
] = ((float*) pv
->buf
)[i
];
106 buf
= hb_buffer_init( pv
->output_bytes
);
107 buf
->start
= pts
+ 90000 * pos
/ 2 / sizeof( float ) / pv
->job
->arate
;
108 buf
->stop
= buf
->start
+ 90000 * 1152 / pv
->job
->arate
;
109 buf
->size
= lame_encode_buffer_interleaved( pv
->lame
, samples_s16
,
110 1152, buf
->data
, LAME_MAXMP3BUFFER
);
111 buf
->frametype
= HB_FRAME_AUDIO
;
115 /* Encoding was successful but we got no data. Try to encode
117 hb_buffer_close( &buf
);
120 else if( buf
->size
< 0 )
122 hb_log( "enclame: lame_encode_buffer failed" );
123 hb_buffer_close( &buf
);
130 /***********************************************************************
132 ***********************************************************************
134 **********************************************************************/
135 int enclameWork( hb_work_object_t
* w
, hb_buffer_t
** buf_in
,
136 hb_buffer_t
** buf_out
)
138 hb_work_private_t
* pv
= w
->private_data
;
141 hb_list_add( pv
->list
, *buf_in
);
144 *buf_out
= buf
= Encode( w
);
148 buf
->next
= Encode( w
);