main.cpp
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:7k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2.  * The contents of this file are subject to the Mozilla Public
  3.  * License Version 1.1 (the "License"); you may not use this file
  4.  * except in compliance with the License. You may obtain a copy of
  5.  * the License at http://www.mozilla.org/MPL/
  6.  * 
  7.  * Software distributed under the License is distributed on an "AS
  8.  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  9.  * implied. See the License for the specific language governing
  10.  * rights and limitations under the License.
  11.  * 
  12.  * The Original Code is MPEG4IP.
  13.  * 
  14.  * The Initial Developer of the Original Code is Cisco Systems Inc.
  15.  * Portions created by Cisco Systems Inc. are
  16.  * Copyright (C) Cisco Systems Inc. 2000, 2001.  All Rights Reserved.
  17.  * 
  18.  * Contributor(s): 
  19.  *              Bill May        wmay@cisco.com
  20.  */
  21. /*
  22.  * This is a command line based player for testing the library
  23.  */
  24. #include "systems.h"
  25. #include "codec_plugin_private.h"
  26. #include <rtsp/rtsp_client.h>
  27. #include "player_session.h"
  28. #include "player_media.h"
  29. #include "player_util.h"
  30. #include "our_msg_queue.h"
  31. #include "ip_port.h"
  32. #include "media_utils.h"
  33. #include "playlist.h"
  34. #include "our_config_file.h"
  35. #include <rtp/debug.h>
  36. #include <libhttp/http.h>
  37. static int session_paused;
  38. static int screen_size = 2;
  39. static int fullscreen = 0;
  40. int process_sdl_key_events (CPlayerSession *psptr,
  41.      sdl_event_msg_t *msg)
  42. {
  43.   int volume;
  44.   uint64_t play_time;
  45.   switch (msg->sym) {
  46.   case SDLK_c:
  47.     if ((msg->sym & (KMOD_LCTRL | KMOD_RCTRL)) != 0) {
  48.       return 0;
  49.     }
  50.     break;
  51.   case SDLK_x:
  52.     if ((msg->sym & (KMOD_LCTRL | KMOD_RCTRL)) != 0) {
  53.       return -1;
  54.     }
  55.   case SDLK_UP:
  56.     volume = psptr->get_audio_volume();
  57.     volume += 10;
  58.     if (volume > 100) volume = 100;
  59.     psptr->set_audio_volume(volume);
  60.     config.set_config_value(CONFIG_VOLUME, volume);
  61.     break;
  62.   case SDLK_DOWN:
  63.     volume = psptr->get_audio_volume();
  64.     volume -= 10;
  65.     if (volume < 0) volume = 0;
  66.     psptr->set_audio_volume(volume);
  67.     config.set_config_value(CONFIG_VOLUME, volume);
  68.     break;
  69.   case SDLK_SPACE:
  70.     if (session_paused == 0) {
  71.       psptr->pause_all_media();
  72.       session_paused = 1;
  73.     } else {
  74.       psptr->play_all_media(FALSE);
  75.       session_paused = 0;
  76.     }
  77.     break;
  78.   case SDLK_END:
  79.     // They want the end - just close, or go on to the next playlist.
  80.     return 0;
  81.   case SDLK_HOME:
  82.     psptr->pause_all_media();
  83.     psptr->play_all_media(TRUE, 0.0);
  84.     break;
  85.   case SDLK_RIGHT:
  86.     if (psptr->session_is_seekable()) {
  87.       play_time = psptr->get_playing_time();
  88.       double ptime, maxtime;
  89.       play_time += 10 * M_LLU;
  90.       ptime = (double)
  91. #ifdef _WIN32
  92.   (int64_t)
  93. #endif
  94.   play_time;
  95.       ptime /= 1000.0;
  96.       maxtime = psptr->get_max_time();
  97.       if (ptime < maxtime) {
  98. psptr->pause_all_media();
  99. psptr->play_all_media(FALSE, ptime);
  100.       }
  101.     }
  102.     break;
  103.   case SDLK_LEFT:
  104.     if (psptr->session_is_seekable()) {
  105.       play_time = psptr->get_playing_time();
  106.       double ptime;
  107.       if (play_time >= 10 * M_LLU) {
  108. play_time -= 10 * M_LLU;
  109. ptime = (double)
  110. #ifdef _WIN32
  111. (int64_t)
  112. #endif
  113. play_time;
  114. ptime /= 1000.0;
  115. psptr->pause_all_media();
  116. psptr->play_all_media(FALSE, ptime);
  117.       }
  118.     }
  119.     break;
  120.   case SDLK_PAGEUP:
  121.     if (screen_size < 4 && fullscreen == 0) {
  122.       screen_size *= 2;
  123.       psptr->set_screen_size(screen_size);
  124.     }
  125.     break;
  126.   case SDLK_PAGEDOWN:
  127.     if (screen_size > 1 && fullscreen == 0) {
  128.       screen_size /= 2;
  129.       psptr->set_screen_size(screen_size);
  130.     }
  131.     break;
  132.   case SDLK_RETURN:
  133.     if ((msg->sym & (KMOD_LALT | KMOD_RALT)) != 0) {
  134. fullscreen = 1;
  135. }
  136. break;
  137.   case SDLK_ESCAPE:
  138.   fullscreen = 0;
  139.   break;
  140.   default:
  141.     break;
  142.   }
  143.   return 1;
  144. }
  145. static int start_session (const char *name, int max_loop)
  146. {
  147.   char buffer[80];
  148.   int loopcount = 0;
  149.   CPlayerSession *psptr;
  150.   CMsgQueue master_queue;
  151.   SDL_sem *master_sem;
  152.   master_sem = SDL_CreateSemaphore(0);
  153.   snprintf(buffer, sizeof(buffer), "%s %s - %s", PACKAGE, VERSION, name);
  154.   psptr = new CPlayerSession(&master_queue, master_sem,
  155.      // this should probably be name...
  156.      buffer);
  157.   if (psptr == NULL) {
  158.     return (-1);
  159.   }
  160.   
  161.   char errmsg[512];
  162.   int ret = parse_name_for_session(psptr, name, errmsg, sizeof(errmsg), NULL);
  163.   if (ret < 0) {
  164.     player_debug_message("%s %s", errmsg, name);
  165.     delete psptr;
  166.     return (1);
  167.   }
  168.   if (ret > 0) {
  169.     player_debug_message(errmsg);
  170.   }
  171.   psptr->set_up_sync_thread();
  172.   psptr->set_screen_location(100, 100);
  173.   psptr->set_screen_size(screen_size);
  174.   psptr->set_audio_volume(config.get_config_value(CONFIG_VOLUME));
  175.   while (loopcount < max_loop) {
  176.     loopcount++;
  177.     if (psptr->play_all_media(TRUE) != 0) {
  178.       delete psptr;
  179.       return (1);
  180.     }
  181.     session_paused = 0;
  182.     int keep_going = 0;
  183.     int paused = 0;
  184. #ifdef _WIN32
  185.     int state = 0;
  186. #endif
  187.     do {
  188.       CMsg *msg;
  189. #ifdef _WIN32
  190.       state = psptr->sync_thread(state);
  191. #else
  192.       SDL_SemWaitTimeout(master_sem, 10000);
  193. #endif
  194.       while ((msg = master_queue.get_message()) != NULL) {
  195. switch (msg->get_value()) {
  196. case MSG_SESSION_FINISHED:
  197.   if (paused == 0)
  198.     keep_going = 1;
  199.   break;
  200. case MSG_RECEIVED_QUIT:
  201.   keep_going = 1;
  202.   break;
  203. case MSG_SDL_KEY_EVENT:
  204.   sdl_event_msg_t *smsg;
  205.   uint32_t len;
  206.   int ret;
  207.   smsg = (sdl_event_msg_t *)msg->get_message(len);
  208.   ret = process_sdl_key_events(psptr, smsg);
  209.   if (ret < 0) {
  210.     loopcount = max_loop;
  211.     keep_going = 1;
  212.   } else if (ret == 0) {
  213.     keep_going = 1;
  214.   }
  215.   break;
  216. }
  217. delete msg;
  218.       }
  219.     } while (keep_going == 0);
  220.     if (loopcount != max_loop) {
  221.       psptr->pause_all_media();
  222.     }
  223.   }
  224.   delete psptr;
  225.   SDL_DestroySemaphore(master_sem);
  226.   return (0);
  227. }
  228. int main (int argc, char **argv)
  229. {
  230.   int max_loop = 1;
  231.   char *name;
  232.   
  233.   initialize_plugins();
  234.   config.read_config_file();
  235.   rtsp_set_error_func(player_library_message);
  236.   rtsp_set_loglevel(config.get_config_value(CONFIG_RTSP_DEBUG));
  237.   rtp_set_error_msg_func(player_library_message);
  238.   rtp_set_loglevel(config.get_config_value(CONFIG_RTP_DEBUG));
  239.   sdp_set_error_func(player_library_message);
  240.   sdp_set_loglevel(config.get_config_value(CONFIG_SDP_DEBUG));
  241.   http_set_error_func(player_library_message);
  242.   http_set_loglevel(config.get_config_value(CONFIG_HTTP_DEBUG));
  243.   argv++;
  244.   argc--;
  245.   if (argc && strcmp(*argv, "-l") == 0) {
  246.     argv++;
  247.     argc--;
  248.     max_loop = atoi(*argv);
  249.     argc--;
  250.     argv++;
  251.   }
  252.   if (*argv == NULL) {
  253.     //name = "rtsp://171.71.233.210/bond_new.mov";
  254.     //name = "rtsp://171.71.233.210/batman_a.mov";
  255.     name = "/home/wmay/content/bond.mov";
  256.   } else {
  257.     name = *argv;
  258.   }
  259.   const char *suffix = strrchr(name, '.');
  260.   if ((suffix != NULL) && 
  261.   ((strcasecmp(suffix, ".mp4plist") == 0) ||
  262.    (strcasecmp(suffix, ".mxu") == 0) ||
  263.        (strcasecmp(suffix, ".gmp4_playlist") == 0))) {
  264.     const char *errmsg = NULL;
  265.     CPlaylist *list = new CPlaylist(name, &errmsg);
  266.     if (errmsg != NULL) {
  267.       player_error_message(errmsg);
  268.       return (-1);
  269.     }
  270.     for (int loopcount = 0; loopcount < max_loop; loopcount++) {
  271.       const char *start = list->get_first();
  272.       do {
  273. if (start != NULL) {
  274.   start_session(start, 1);
  275. }
  276. start = list->get_next();
  277.       } while (start != NULL);
  278.     }
  279.   } else {
  280.     start_session(name, max_loop);
  281.   }
  282.   // remove invalid global ports
  283.   close_plugins();
  284.   return(0); 
  285. }  
  286.