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
)
54 static void MuxerFunc( void * _mux
)
56 hb_mux_t
* mux
= _mux
;
57 hb_job_t
* job
= mux
->job
;
58 hb_title_t
* title
= job
->title
;
65 hb_mux_object_t
* m
= NULL
;
67 /* Get a real muxer */
75 m
= hb_mux_mp4_init( job
);
78 m
= hb_mux_avi_init( job
);
81 m
= hb_mux_ogm_init( job
);
84 m
= hb_mux_mkv_init( job
);
88 /* Wait for one buffer for each track */
89 while( !*job
->die
&& !job
->done
)
94 if( !hb_fifo_size( job
->fifo_mpeg4
) )
98 for( i
= 0; i
< hb_list_count( title
->list_audio
); i
++ )
100 audio
= hb_list_item( title
->list_audio
, i
);
101 if( !hb_fifo_size( audio
->fifo_out
) )
116 /* Create file, write headers */
122 /* Build list of fifos we're interested in */
123 list
= hb_list_init();
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
);
130 for( i
= 0; i
< hb_list_count( title
->list_audio
); i
++ )
132 audio
= hb_list_item( title
->list_audio
, i
);
133 track
= calloc( sizeof( hb_track_t
), 1 );
134 track
->fifo
= audio
->fifo_out
;
135 track
->mux_data
= audio
->mux_data
;
136 hb_list_add( list
, track
);
139 int thread_sleep_interval
= 50;
140 while( !*job
->die
&& !job
->done
)
142 if( !( track
= GetTrack( list
) ) )
144 hb_snooze( thread_sleep_interval
);
145 // thread_sleep_interval += 1;
148 // thread_sleep_interval = MAX(1, (thread_sleep_interval - 1));
150 buf
= hb_fifo_get( track
->fifo
);
153 m
->mux( m
, track
->mux_data
, buf
);
155 track
->bytes
+= buf
->size
;
156 mux
->pts
= buf
->stop
;
158 hb_buffer_close( &buf
);
164 uint64_t bytes_total
, frames_total
;
166 #define p state.param.muxing
169 state
.state
= HB_STATE_MUXING
;
171 hb_set_state( job
->h
, &state
);
175 if( !stat( job
->file
, &sb
) )
177 hb_log( "mux: file size, %lld bytes", (uint64_t) sb
.st_size
);
181 for( i
= 0; i
< hb_list_count( list
); i
++ )
183 track
= hb_list_item( list
, i
);
184 hb_log( "mux: track %d, %lld bytes, %.2f kbps",
186 90000.0 * track
->bytes
/ mux
->pts
/ 125 );
187 if( !i
&& ( job
->vquality
< 0.0 || job
->vquality
> 1.0 ) )
190 hb_log( "mux: video bitrate error, %+lld bytes",
191 track
->bytes
- mux
->pts
* job
->vbitrate
*
194 bytes_total
+= track
->bytes
;
195 frames_total
+= track
->frames
;
198 if( bytes_total
&& frames_total
)
200 hb_log( "mux: overhead, %.2f bytes per frame",
201 (float) ( sb
.st_size
- bytes_total
) /
209 for( i
= 0; i
< hb_list_count( list
); i
++ )
211 track
= hb_list_item( list
, i
);
212 if( track
->mux_data
)
214 free( track
->mux_data
);
218 hb_list_close( &list
);
223 hb_thread_t
* hb_muxer_init( hb_job_t
* job
)
225 hb_mux_t
* mux
= calloc( sizeof( hb_mux_t
), 1 );
227 return hb_thread_init( "muxer", MuxerFunc
, mux
,
228 HB_NORMAL_PRIORITY
);