织梦CMS - 轻松建站从此开始!

罗索

encode YUV420 to ogg, theora codec(2)

jackyhwei 发布于 2011-07-06 09:28 点击:次 
/* create the remaining theora headers */ for(;;) { ret=th_encode_flushheader(td,tc,op); if(ret0) { fprintf(stderr,Internal Theora library error.\n); exit(1); } else if(!ret) break; ogg_stream_packeti
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)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201107/14668.html]
本文出处:hi.baidu.com/carlsonlee_freec 作者:carlsonlee_freec
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容