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

📄 mplayer_novideo_0.21.c

📁 自己移植的linux下的流媒体播放器原代码,支持mms协议,支持ftp和http协议.
💻 C
📖 第 1 页 / 共 4 页
字号:
if(!sh_audio){  mp_msg(MSGT_CPLAYER,MSGL_INFO,MSGTR_NoSound);  mp_msg(MSGT_CPLAYER,MSGL_V,"Freeing %d unused audio chunks.\n",d_audio->packs);  ds_free_packs(d_audio); // free buffered chunks  d_audio->id=-2;         // do not read audio chunks  goto goto_next_file;}//==================== 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 (audio_out && sh_audio)         audio_out->pause();	// pause audio, keep data if possible      while( (cmd = mp_input_get_cmd(20,1,1)) == NULL) {             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      (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;	rel_seek_secs = v;      }      else if(abs) { /* Absolute seek by percentage */	abs_seek_pos = 3;	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_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;      build_afilter_chain(sh_audio, &ao_data);    } break;    case MP_CMD_SPEED_MULT : {      float v = cmd->args[0].v.f;      playback_speed *= v;      build_afilter_chain(sh_audio, &ao_data);    } break;    case MP_CMD_SPEED_SET : {      float v = cmd->args[0].v.f;      playback_speed = v;      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_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);		}	      } 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_FRAMEDROPPING :  {      int v = cmd->args[0].v.i;      if(v < 0){	frame_dropping = (frame_dropping+1)%3;      }      else	frame_dropping = v > 2 ? 2 : v;    } break;    case MP_CMD_GET_TIME_LENGTH : {	mp_msg(MSGT_GLOBAL,MSGL_INFO,MSGTR_AnsLength, demuxer_get_time_length(demuxer));    } break;    case MP_CMD_SWITCH_AUDIO :        demuxer_switch_audio(demuxer);        break;    default : {      mp_msg(MSGT_CPLAYER, MSGL_V, "Received unknown cmd %s\n",cmd->name);    }    }    if (cmd->pausing)      osd_function = OSD_PAUSE;    mp_cmd_free(cmd);  }}  if (seek_to_sec) {    int a,b; float d;        if (sscanf(seek_to_sec, "%d:%d:%f", &a,&b,&d)==3)	rel_seek_secs += 3600*a +60*b +d ;    else if (sscanf(seek_to_sec, "%d:%f", &a, &d)==2)	rel_seek_secs += 60*a +d;    else if (sscanf(seek_to_sec, "%f", &d)==1)	rel_seek_secs += d;     seek_to_sec = NULL;  }    /* Looping. */  if(eof==1 && loop_times>=0) {    int l = loop_times;    play_tree_iter_step(playtree_iter,0,0);    loop_times = l;    mp_msg(MSGT_CPLAYER,MSGL_V,"loop_times = %d, eof = %d\n", loop_times,eof);    if(loop_times>1) loop_times--; else    if(loop_times==1) loop_times=-1;    play_n_frames=play_n_frames_mf;    eof=0;    abs_seek_pos=3; rel_seek_secs=0; // seek to start of movie (0%)    loop_seek = 1;  }if(rel_seek_secs || abs_seek_pos){  current_module="seek";  if(demux_seek(demuxer,rel_seek_secs,abs_seek_pos)){      // success:      /* FIXME there should be real seeking for vobsub */      fflush(stdout);      if(sh_audio){        current_module="seek_audio_reset";        audio_out->reset(); // stop audio, throwing away buffered data      }	  	  }  rel_seek_secs=0;  abs_seek_pos=0;  frame_time_remaining=0;  current_module=NULL;  loop_seek=0;}//================= Update OSD ====================} // while(!eof)mp_msg(MSGT_GLOBAL,MSGL_V,"EOF code: %d  \n",eof);}goto_next_file:  // don't jump here after ao/vo/getch initialization!mp_msg(MSGT_CPLAYER,MSGL_INFO,"\n");if(benchmark){  double tot=video_time_usage+vout_time_usage+audio_time_usage;  double total_time_usage;  total_time_usage_start=GetTimer()-total_time_usage_start;  total_time_usage = (float)total_time_usage_start*0.000001;  mp_msg(MSGT_CPLAYER,MSGL_INFO,"\nBENCHMARKs: VC:%8.3fs VO:%8.3fs A:%8.3fs Sys:%8.3fs = %8.3fs\n",	 video_time_usage,vout_time_usage,audio_time_usage,	 total_time_usage-tot,total_time_usage);  if(total_time_usage>0.0)    mp_msg(MSGT_CPLAYER,MSGL_INFO,"BENCHMARK%%: VC:%8.4f%% VO:%8.4f%% A:%8.4f%% Sys:%8.4f%% = %8.4f%%\n",	   100.0*video_time_usage/total_time_usage,	   100.0*vout_time_usage/total_time_usage,	   100.0*audio_time_usage/total_time_usage,	   100.0*(total_time_usage-tot)/total_time_usage,	   100.0);  if(total_frame_cnt && frame_dropping)    mp_msg(MSGT_CPLAYER,MSGL_INFO,"BENCHMARKn: disp: %d (%3.2f fps)  drop: %d (%d%%)  total: %d (%3.2f fps)\n",	total_frame_cnt-drop_frame_cnt,	(total_time_usage>0.5)?((total_frame_cnt-drop_frame_cnt)/total_time_usage):0,	drop_frame_cnt,	100*drop_frame_cnt/total_frame_cnt,	total_frame_cnt,	(total_time_usage>0.5)?(total_frame_cnt/total_time_usage):0);  }// time to uninit all, except global stuff:uninit_player(INITED_ALL-(INITED_GUI+INITED_INPUT+(fixed_vo?INITED_VO:0)));if(eof == PT_NEXT_ENTRY || eof == PT_PREV_ENTRY) {  eof = eof == PT_NEXT_ENTRY ? 1 : -1;  if(play_tree_iter_step(playtree_iter,play_tree_step,0) == PLAY_TREE_ITER_ENTRY) {    eof = 1;  } else {    play_tree_iter_free(playtree_iter);    playtree_iter = NULL;  }  play_tree_step = 1;} else if (eof == PT_UP_NEXT || eof == PT_UP_PREV) {  eof = eof == PT_UP_NEXT ? 1 : -1;  if ( playtree_iter ) {    if(play_tree_iter_up_step(playtree_iter,eof,0) == PLAY_TREE_ITER_ENTRY) {     eof = 1;    } else {      play_tree_iter_free(playtree_iter);      playtree_iter = NULL;    }   }} else { // NEXT PREV SRC     eof = eof == PT_PREV_SRC ? -1 : 1;}if(eof == 0) eof = 1;while(playtree_iter != NULL) {  filename = play_tree_iter_get_file(playtree_iter,eof);  if(filename == NULL) {    if( play_tree_iter_step(playtree_iter,eof,0) != PLAY_TREE_ITER_ENTRY) {      play_tree_iter_free(playtree_iter);      playtree_iter = NULL;    };  } else    break;} if(use_gui || playtree_iter != NULL){  eof = 0;  goto play_next_file;}exit_player_with_rc(MSGTR_Exit_eof, 0);return 1;}

⌨️ 快捷键说明

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