1 /* $Id: muxcommon.c,v 1.23 2005/03/30 17:27:19 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. */
24 hb_mux_data_t * mux_data;
30 static hb_track_t * GetTrack( hb_list_t * list )
33 hb_track_t * track = NULL, * track2;
37 for( i = 0; i < hb_list_count( list ); i++ )
39 track2 = hb_list_item( list, i );
40 buf = hb_fifo_see( track2->fifo );
45 if( !track || buf->start < pts )
49 //hb_log("track: #%d, frame count %ld, fifo size %d", i, track->frames, hb_fifo_size( track->fifo));
55 static void MuxerFunc( void * _mux )
57 hb_mux_t * mux = _mux;
58 hb_job_t * job = mux->job;
59 hb_title_t * title = job->title;
66 hb_mux_object_t * m = NULL;
68 /* Get a real muxer */
76 m = hb_mux_mp4_init( job );
79 m = hb_mux_avi_init( job );
82 m = hb_mux_ogm_init( job );
87 /* Wait for one buffer for each track */
88 while( !*job->die && !job->done )
93 if( !hb_fifo_size( job->fifo_mpeg4 ) )
97 for( i = 0; i < hb_list_count( title->list_audio ); i++ )
99 audio = hb_list_item( title->list_audio, i );
100 if( !hb_fifo_size( audio->fifo_out ) )
115 /* Create file, write headers */
121 /* Build list of fifos we're interested in */
122 list = hb_list_init();
123 hb_log( "mux: audio list count %d", hb_list_count( title->list_audio ));
125 track = calloc( sizeof( hb_track_t ), 1 );
126 track->fifo = job->fifo_mpeg4;
127 track->mux_data = job->mux_data;
128 hb_list_add( list, track );
131 for( i = 0; i < hb_list_count( title->list_audio ); i++ )
133 audio = hb_list_item( title->list_audio, i );
134 track = calloc( sizeof( hb_track_t ), 1 );
135 track->fifo = audio->fifo_out;
136 track->mux_data = audio->mux_data;
137 hb_list_add( list, track );
141 while( !*job->die && !job->done )
143 if( !( track = GetTrack( list ) ) )
149 buf = hb_fifo_get( track->fifo );
152 m->mux( m, track->mux_data, buf );
154 track->bytes += buf->size;
155 mux->pts = buf->stop;
157 hb_buffer_close( &buf );
164 uint64_t bytes_total, frames_total;
169 if( !stat( job->file, &sb ) )
171 hb_log( "mux: file size, %lld bytes", (uint64_t) sb.st_size );
175 for( i = 0; i < hb_list_count( list ); i++ )
177 track = hb_list_item( list, i );
178 hb_log( "mux: track %d, %lld bytes, %.2f kbps",
180 90000.0 * track->bytes / mux->pts / 125 );
181 if( !i && ( job->vquality < 0.0 || job->vquality > 1.0 ) )
184 hb_log( "mux: video bitrate error, %+lld bytes",
185 track->bytes - mux->pts * job->vbitrate *
188 bytes_total += track->bytes;
189 frames_total += track->frames;
192 if( bytes_total && frames_total )
194 hb_log( "mux: overhead, %.2f bytes per frame",
195 (float) ( sb.st_size - bytes_total ) /
203 for( i = 0; i < hb_list_count( list ); i++ )
205 track = hb_list_item( list, i );
206 if( track->mux_data )
208 free( track->mux_data );
212 hb_list_close( &list );
217 hb_thread_t * hb_muxer_init( hb_job_t * job )
219 hb_mux_t * mux = calloc( sizeof( hb_mux_t ), 1 );
221 return hb_thread_init( "muxer", MuxerFunc, mux,
222 HB_NORMAL_PRIORITY );