TAG:
/* create the remaining theora headers */ for(;;) { ret=th_encode_flushheader(td,&tc,&op); if(ret<0) { fprintf(stderr,"Internal Theora library error.\n"); exit(1); } else if(!ret) break; ogg_stream_packetin(&to,&op); } if(audio) { ogg_packet header; ogg_packet header_comm; ogg_packet header_code; vorbis_analysis_headerout(&vd,&vc,&header,&header_comm,&header_code); ogg_stream_packetin(&vo,&header); /* automatically placed in its own page */ if(ogg_stream_pageout(&vo,&og)!=1) { fprintf(stderr,"Internal Ogg library error.\n"); exit(1); } fwrite(og.header,1,og.header_len,outfile); fwrite(og.body,1,og.body_len,outfile); /* remaining vorbis header packets */ ogg_stream_packetin(&vo,&header_comm); ogg_stream_packetin(&vo,&header_code); } for(;;) { int result = ogg_stream_flush(&to,&og); if(result<0) { /* can't get here */ fprintf(stderr,"Internal Ogg library error.\n"); exit(1); } if(result==0) break; fwrite(og.header,1,og.header_len,outfile); fwrite(og.body,1,og.body_len,outfile); } if(audio) { for(;;) { int result=ogg_stream_flush(&vo,&og); if(result<0) { /* can't get here */ fprintf(stderr,"Internal Ogg library error.\n"); exit(1); } if(result==0)break; fwrite(og.header,1,og.header_len,outfile); fwrite(og.body,1,og.body_len,outfile); } } cur_time = GetTickCount(); fprintf(stderr, "encoder start\n"); for(;;) { int audio_or_video=-1; double audiotime; double videotime; ogg_page audiopage; ogg_page videopage; audioflag=fetch_and_process_audio(audio,&audiopage,&vo,&vd,&vb,audioflag); videoflag=fetch_and_process_video(video,&videopage,&to,td,videoflag); if(!audioflag && !videoflag) break; audiotime= audioflag?vorbis_granule_time(&vd,ogg_page_granulepos(&audiopage)):-1; videotime= videoflag?th_granule_time(td,ogg_page_granulepos(&videopage)):-1; if(!audioflag) { audio_or_video=1; } else if(!videoflag) { audio_or_video=0; } else { if(audiotime<videotime) audio_or_video=0; else audio_or_video=1; } if(audio_or_video==1){ /* flush a video page */ video_bytesout+=fwrite(videopage.header,1,videopage.header_len,outfile); video_bytesout+=fwrite(videopage.body,1,videopage.body_len,outfile); videoflag=0; timebase=videotime; } else { /* flush an audio page */ audio_bytesout+=fwrite(audiopage.header,1,audiopage.header_len,outfile); audio_bytesout+=fwrite(audiopage.body,1,audiopage.body_len,outfile); audioflag=0; timebase=audiotime; } if(timebase > 0) { int hundredths=(int)(timebase*100-(long)timebase*100); int seconds=(long)timebase%60; int minutes=((long)timebase/60)%60; int hours=(long)timebase/3600; if(audio_or_video)vkbps=(int)rint(video_bytesout*8./timebase*.001); else akbps=(int)rint(audio_bytesout*8./timebase*.001); fprintf(stderr, "\r %d:%02d:%02d.%02d audio: %dkbps video: %dkbps\n", hours,minutes,seconds,hundredths,akbps,vkbps); } } if(video)th_encode_free(td); fprintf(stderr, "\nencoder last time = %ld\n", GetTickCount()- cur_time); /* clear out state */ if(audio) { ogg_stream_clear(&vo); vorbis_block_clear(&vb); vorbis_dsp_clear(&vd); vorbis_comment_clear(&vc); vorbis_info_clear(&vi); fclose(audio); } if(video) { ogg_stream_clear(&to); th_comment_clear(&tc); fclose(video); } if(outfile) fclose(outfile); return(0); } (carlsonlee_freec) |