⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mplayer_novideo_0.20.c

📁 自己移植的linux下的流媒体播放器原代码,支持mms协议,支持ftp和http协议.
💻 C
📖 第 1 页 / 共 5 页
字号:
//==================== START PLAYING =======================if(loop_times>1) loop_times--; elseif(loop_times==1) loop_times = -1;mp_msg(MSGT_CPLAYER,MSGL_INFO,MSGTR_StartPlaying);fflush(stdout); //"starting  playback..."InitTimer();total_time_usage_start=GetTimer();audio_time_usage=0; video_time_usage=0; vout_time_usage=0;total_frame_cnt=0; drop_frame_cnt=0; // fix for multifile fps benchmarkplay_n_frames=play_n_frames_mf;if(play_n_frames==0){  eof=PT_NEXT_ENTRY; goto goto_next_file;}while(!eof){    float aq_sleep_time=0;    if(play_n_frames>=0){      --play_n_frames;      if(play_n_frames<0) eof = PT_NEXT_ENTRY;    }/*========================== PLAY AUDIO ============================*/while(sh_audio){  unsigned int t;  double tt;  int playsize;  current_module="play_audio";    ao_data.pts=((sh_video?sh_video->timer:0)+sh_audio->delay)*90000.0;  playsize=audio_out->get_space();    // handle audio-only case:  if(playsize < ao_data.outburst &&      !sh_video) {  // buffer is full, do not block here!!!    usec_sleep(10000); // Wait a tick before retry    continue;  }    if(playsize>MAX_OUTBURST) playsize=MAX_OUTBURST; // we shouldn't exceed it!  // Fill buffer if needed:  current_module="decode_audio";   // Enter AUDIO decoder module  t=GetTimer();  while(sh_audio->a_out_buffer_len<playsize && !d_audio->eof){    int ret=decode_audio(sh_audio,&sh_audio->a_out_buffer[sh_audio->a_out_buffer_len],        playsize-sh_audio->a_out_buffer_len,sh_audio->a_out_buffer_size-sh_audio->a_out_buffer_len);    if(ret<=0) break; // EOF?    sh_audio->a_out_buffer_len+=ret;  }  t=GetTimer()-t;  tt = t*0.000001f; audio_time_usage+=tt;  if(playsize>sh_audio->a_out_buffer_len) playsize=sh_audio->a_out_buffer_len;  // play audio:    current_module="play_audio";  playsize=audio_out->play(sh_audio->a_out_buffer,playsize,0);  if(playsize>0){      sh_audio->a_out_buffer_len-=playsize;      memmove(sh_audio->a_out_buffer,&sh_audio->a_out_buffer[playsize],sh_audio->a_out_buffer_len);      sh_audio->delay+=playback_speed*playsize/((float)((ao_data.bps && sh_audio->afilter) ?          ao_data.bps : sh_audio->o_bps));  }  break;} // while(sh_audio)  if(!quiet) {    float a_pos = sh_audio->delay - audio_out->get_delay() * playback_speed;    print_status(a_pos, 0, 0);  }  if(d_audio->eof) eof = PT_NEXT_ENTRY;/*========================== PLAY VIDEO ============================*///============================ Handle PAUSE ===============================  current_module="pause";#ifdef USE_OSD  if(osd_visible){    if (!--osd_visible){       vo_osd_progbar_type=-1; // disable       vo_osd_changed(OSDTYPE_PROGBAR);       if (osd_function != OSD_PAUSE)	   osd_function = OSD_PLAY;    }  }#endif  if(osd_function==OSD_PAUSE){    mp_cmd_t* cmd;      if(!quiet) {	mp_msg(MSGT_CPLAYER,MSGL_STATUS,MSGTR_Paused);	fflush(stdout);      }      if (video_out && sh_video && vo_config_count)	 video_out->control(VOCTRL_PAUSE, NULL);      if (audio_out && sh_audio)         audio_out->pause();	// pause audio, keep data if possible      while( (cmd = mp_input_get_cmd(20,1,1)) == NULL) {	     if(sh_video && video_out && vo_config_count) video_out->check_events();             usec_sleep(20000);         }      if (cmd && cmd->id == MP_CMD_PAUSE) {      cmd = mp_input_get_cmd(0,1,0);      mp_cmd_free(cmd);      }         osd_function=OSD_PLAY;      if (audio_out && sh_audio)        audio_out->resume();	// resume audio      if (video_out && sh_video && vo_config_count)        video_out->control(VOCTRL_RESUME, NULL);	// resume video      (void)GetRelativeTime();	// keep TF around FT in next cycle  }// handle -sstepif(step_sec>0) {	osd_function=OSD_FFW;	rel_seek_secs+=step_sec;}//================= EDL =========================================//================= Keyboard events, SEEKing ====================  current_module="key_events";{  mp_cmd_t* cmd;  int brk_cmd = 0;  while( !brk_cmd && (cmd = mp_input_get_cmd(0,0,0)) != NULL) {    switch(cmd->id) {    case MP_CMD_SEEK : {      float v;      int abs;      osd_show_percentage = 25;      v = cmd->args[0].v.f;      abs = (cmd->nargs > 1) ? cmd->args[1].v.i : 0;      if(abs==2) { /* Absolute seek to a specific timestamp in seconds */        abs_seek_pos = 1;	if(sh_video)	  osd_function= (v > sh_video->timer) ? OSD_FFW : OSD_REW;	rel_seek_secs = v;      }      else if(abs) { /* Absolute seek by percentage */	abs_seek_pos = 3;	if(sh_video)	  osd_function= (v > sh_video->timer) ? OSD_FFW : OSD_REW;	rel_seek_secs = v/100.0;      }      else {	rel_seek_secs+= v;	osd_function= (v > 0) ? OSD_FFW : OSD_REW;      }      brk_cmd = 1;    } break;    case MP_CMD_SWITCH_RATIO : {      if (cmd->nargs == 0)	movie_aspect = (float) sh_video->disp_w / sh_video->disp_h;      else	movie_aspect = cmd->args[0].v.f;      mpcodecs_config_vo (sh_video, sh_video->disp_w, sh_video->disp_h, 0);    } break;    case MP_CMD_AUDIO_DELAY : {      float v = cmd->args[0].v.f;      audio_delay += v;      osd_show_av_delay = 9;      if(sh_audio) sh_audio->delay+= v;    } break;    case MP_CMD_SPEED_INCR : {      float v = cmd->args[0].v.f;      playback_speed += v;      if (sh_video)      osd_show_speed = sh_video->fps;      build_afilter_chain(sh_audio, &ao_data);    } break;    case MP_CMD_SPEED_MULT : {      float v = cmd->args[0].v.f;      playback_speed *= v;      if (sh_video)      osd_show_speed = sh_video->fps;      build_afilter_chain(sh_audio, &ao_data);    } break;    case MP_CMD_SPEED_SET : {      float v = cmd->args[0].v.f;      playback_speed = v;      if (sh_video)      osd_show_speed = sh_video->fps;      build_afilter_chain(sh_audio, &ao_data);    } break;    case MP_CMD_FRAME_STEP :    case MP_CMD_PAUSE : {      cmd->pausing = 1;      brk_cmd = 1;    } break;    case MP_CMD_QUIT : {      exit_player_with_rc(MSGTR_Exit_quit, (cmd->nargs > 0)? cmd->args[0].v.i : 0);    }    case MP_CMD_GRAB_FRAMES : {      grab_frames=2;    } break;    case MP_CMD_PLAY_TREE_STEP : {      int n = cmd->args[0].v.i == 0 ? 1 : cmd->args[0].v.i;      int force = cmd->args[1].v.i;      if(!force && playtree_iter) {	play_tree_iter_t* i = play_tree_iter_new_copy(playtree_iter);		if(play_tree_iter_step(i,n,0) == PLAY_TREE_ITER_ENTRY)	  eof = (n > 0) ? PT_NEXT_ENTRY : PT_PREV_ENTRY;	play_tree_iter_free(i);      } else	eof = (n > 0) ? PT_NEXT_ENTRY : PT_PREV_ENTRY;      if(eof)	play_tree_step = n;      brk_cmd = 1;    } break;    case MP_CMD_PLAY_TREE_UP_STEP : {      int n = cmd->args[0].v.i > 0 ? 1 : -1;      int force = cmd->args[1].v.i;      if(!force && playtree_iter) {	play_tree_iter_t* i = play_tree_iter_new_copy(playtree_iter);	if(play_tree_iter_up_step(i,n,0) == PLAY_TREE_ITER_ENTRY)	  eof = (n > 0) ? PT_UP_NEXT : PT_UP_PREV;	play_tree_iter_free(i);      } else	eof = (n > 0) ? PT_UP_NEXT : PT_UP_PREV;      brk_cmd = 1;    } break;    case MP_CMD_PLAY_ALT_SRC_STEP : {      if(playtree_iter && playtree_iter->num_files > 1) {	int v = cmd->args[0].v.i;	if(v > 0 && playtree_iter->file < playtree_iter->num_files)	  eof = PT_NEXT_SRC;	else if(v < 0 && playtree_iter->file > 1)	  eof = PT_PREV_SRC;      }      brk_cmd = 1;    } break;    case MP_CMD_SUB_DELAY : {#ifdef USE_SUB    if (sh_video) {      int abs= cmd->args[1].v.i;      float v = cmd->args[0].v.f;      if(abs)	sub_delay = v;      else	sub_delay += v;      osd_show_sub_delay = 9; // show the subdelay in OSD    }#endif    } break;    case MP_CMD_SUB_STEP : {#ifdef USE_SUB    if (sh_video) {      int movement = cmd->args[0].v.i;      step_sub(subdata, sh_video->pts, movement);      osd_show_sub_delay = 9; // show the subdelay in OSD    }#endif    } break;    case MP_CMD_SUB_LOG : {#ifdef USE_SUB	log_sub();#endif    } break;    case MP_CMD_OSD :  {#ifdef USE_OSD      if(sh_video) {	int v = cmd->args[0].v.i;	if(v < 0)	  osd_level=(osd_level+1)%(MAX_OSD_LEVEL+1);	else	  osd_level= v > MAX_OSD_LEVEL ? MAX_OSD_LEVEL : v;      }#endif    } break;    case MP_CMD_OSD_SHOW_TEXT :  {#ifdef USE_OSD      if(osd_level && sh_video){	osd_show_text=sh_video->fps; // 1 sec        strncpy(osd_show_text_buffer, cmd->args[0].v.s, 64);      }#endif    } break;    case MP_CMD_VOLUME :  {      int v = cmd->args[0].v.i;		// start change for absolute volume value		int abs = (cmd->nargs > 1) ? cmd->args[1].v.i : 0;				if( abs )		{			mixer_setvolume(&mixer, (float)v, (float)v );		} else {      if(v > 0)	mixer_incvolume(&mixer);      else	mixer_decvolume(&mixer);		}	  #ifdef USE_OSD      if(osd_level && sh_video){        float vol;	osd_visible=sh_video->fps; // 1 sec	vo_osd_progbar_type=OSD_VOLUME;	mixer_getbothvolume(&mixer, &vol);	vo_osd_progbar_value=(vol*256.0)/100.0;	vo_osd_changed(OSDTYPE_PROGBAR);      }#endif    } break;    case MP_CMD_MUTE:      mixer_mute(&mixer);      break;    case MP_CMD_LOADFILE : {      play_tree_t* e = play_tree_new();      play_tree_add_file(e,cmd->args[0].v.s);      // Go back to the start point      while(play_tree_iter_up_step(playtree_iter,0,1) != PLAY_TREE_ITER_END)	/* NOP */;      play_tree_free_list(playtree->child,1);      play_tree_set_child(playtree,e);      play_tree_iter_step(playtree_iter,0,0);      eof = PT_NEXT_SRC;      brk_cmd = 1;    } break;    case MP_CMD_LOADLIST : {      play_tree_t* e = parse_playlist_file(cmd->args[0].v.s);      if(!e)	mp_msg(MSGT_CPLAYER,MSGL_ERR,MSGTR_PlaylistLoadUnable,cmd->args[0].v.s);      else {	// Go back to the start point	while(play_tree_iter_up_step(playtree_iter,0,1) != PLAY_TREE_ITER_END)	  /* NOP */;	play_tree_free_list(playtree->child,1);	play_tree_set_child(playtree,e);	play_tree_iter_step(playtree_iter,0,0);	eof = PT_NEXT_SRC;	      }      brk_cmd = 1;    } break;    case MP_CMD_GAMMA :  {      int v = cmd->args[0].v.i, abs = cmd->args[1].v.i;      if (!sh_video)	break;      if (vo_gamma_gamma == 1000)      {	vo_gamma_gamma = 0;	get_video_colors (sh_video, "gamma", &vo_gamma_gamma);      }      if (abs)        vo_gamma_gamma = v;      else        vo_gamma_gamma += v;      if (vo_gamma_gamma > 100)        vo_gamma_gamma = 100;      else if (vo_gamma_gamma < -100)        vo_gamma_gamma = -100;      set_video_colors(sh_video, "gamma", vo_gamma_gamma);#ifdef USE_OSD       if(osd_level){	 osd_visible=sh_video->fps; // 1 sec	 vo_osd_progbar_type=OSD_BRIGHTNESS;	 vo_osd_progbar_value=(vo_gamma_gamma<<7)/100 + 128;	 vo_osd_changed(OSDTYPE_PROGBAR);       }#endif // USE_OSD    } break;    case MP_CMD_BRIGHTNESS :  {      int v = cmd->args[0].v.i, abs = cmd->args[1].v.i;            if (!sh_video)	break;            if (vo_gamma_brightness == 1000)      {	vo_gamma_brightness = 0;	get_video_colors(sh_video, "brightness", &vo_gamma_brightness);      }      if (abs)        vo_gamma_brightness = v;      else        vo_gamma_brightness += v;      if (vo_gamma_brightness > 100)        vo_gamma_brightness = 100;      else if (vo_gamma_brightness < -100)        vo_gamma_brightness = -100;      if(set_video_colors(sh_video, "brightness", vo_gamma_brightness)){#ifdef USE_OSD       if(osd_level){	 osd_visible=sh_video->fps; // 1 sec	 vo_osd_progbar_type=OSD_BRIGHTNESS;	 vo_osd_progbar_value=(vo_gamma_brightness<<7)/100 + 128;	 vo_osd_changed(OSDTYPE_PROGBAR);       }#endif // USE_OSD      }    } break;    case MP_CMD_CONTRAST :  {      int v = cmd->args[0].v.i, abs = cmd->args[1].v.i;      if (!sh_video)	break;            if (vo_gamma_contrast == 1000)      {	vo_gamma_contrast = 0;	get_video_colors(sh_video, "contrast", &vo_gamma_contrast);      }           if (abs)        vo_gamma_contrast = v;      else        vo_gamma_contrast += v;      if (vo_gamma_contrast > 100)        vo_gamma_contrast = 100;      else if (vo_gamma_contrast < -100)        vo_gamma_contrast = -100;      if(set_video_colors(sh_video, "contrast", vo_gamma_contrast)){#ifdef USE_OSD       if(osd_level){	 osd_visible=sh_video->fps; // 1 sec	 vo_osd_progbar_type=OSD_CONTRAST;	 vo_osd_progbar_value=(vo_gamma_contrast<<7)/100 + 128;	 vo_osd_changed(OSDTYPE_PROGBAR);       }#endif // USE_OSD      }    } break;    case MP_CMD_SATURATION :  {      int v = cmd->args[0].v.i, abs = cmd->args[1].v.i;      if (!sh_video)	break;            if (vo_gamma_saturation == 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -