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

流媒体/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.  * qtime_file.cpp - provides generic class for quicktime file access control.
  23.  * file access is then used by quicktime audio and video bytestreams.
  24.  */
  25. #include "systems.h"
  26. #include "player_session.h"
  27. #include "player_media.h"
  28. #include "player_util.h"
  29. #include "media_utils.h"
  30. #include "libmpeg3.h"
  31. #include "mpeg3_file.h"
  32. #include "mpeg3_bytestream.h"
  33. #include "codec_plugin_private.h"
  34. static int create_mpeg3_video (mpeg3_t *vfile, 
  35.        CPlayerSession *psptr,
  36.        char *errmsg, 
  37.        uint32_t errlen)
  38. {
  39.   CPlayerMedia *mptr;
  40.   codec_plugin_t *plugin;
  41.   int ret;
  42. #ifdef ARCH_X86
  43.   //  mpeg3_set_mmx(vfile, 1);
  44. #endif
  45.   plugin = check_for_video_codec("MPEG FILE",
  46.  NULL,
  47.  -1,
  48.  -1,
  49.  NULL,
  50.  0);
  51.   if (plugin == NULL) {
  52.     snprintf(errmsg, errlen, "Can't find plugin for mpeg video");
  53.     return 0;
  54.   } 
  55.   mptr = new CPlayerMedia(psptr);
  56.   if (mptr == NULL) {
  57.     snprintf(errmsg, errlen, "Could not create video media");
  58.     return -1;
  59.   }
  60.   video_info_t *vinfo;
  61.   vinfo = MALLOC_STRUCTURE(video_info_t);
  62.   vinfo->height = mpeg3_video_height(vfile, 0);
  63.   vinfo->width = mpeg3_video_width(vfile, 0);
  64.   ret = mptr->create_video_plugin(plugin, NULL, vinfo, NULL, 0);
  65.   if (ret < 0) {
  66.     mpeg3f_message(LOG_ERR, "Failed to create video plugin");
  67.     snprintf(errmsg, errlen, "Failed to create video plugin");
  68.     free(vinfo);
  69.     return -1;
  70.   }
  71.   CMpeg3VideoByteStream *vbyte;
  72.   vbyte = new CMpeg3VideoByteStream(vfile, 0);
  73.   if (vbyte == NULL) {
  74.     snprintf(errmsg, errlen, "Failed to create video bytestream");
  75.     return -1;
  76.   }
  77.   ret = mptr->create_from_file(vbyte, TRUE);
  78.   if (ret != 0) {
  79.     snprintf(errmsg, errlen, "Couldn't create video media");
  80.     return -1;
  81.   }
  82.   return 1;
  83. }
  84. static int create_mpeg3_audio (mpeg3_t *afile, 
  85.        CPlayerSession *psptr,
  86.        char *errmsg, 
  87.        uint32_t errlen)
  88. {
  89.   CPlayerMedia *mptr;
  90.   codec_plugin_t *plugin;
  91.   int ret;
  92.   plugin = check_for_audio_codec("MPEG FILE",
  93.  NULL,
  94.  mpeg3_get_audio_format(afile, 0),
  95.  -1,
  96.  NULL,
  97.  0);
  98.   if (plugin == NULL) {
  99.     snprintf(errmsg, errlen, "Can't find plugin for mpeg audio format %s",
  100.      mpeg3_audio_format(afile, 0));
  101.     return 0;
  102.   } 
  103.   mptr = new CPlayerMedia(psptr);
  104.   if (mptr == NULL) {
  105.     snprintf(errmsg, errlen, "Could not create video media");
  106.     return -1;
  107.   }
  108.   audio_info_t *ainfo;
  109.   ainfo = MALLOC_STRUCTURE(audio_info_t);
  110.   ainfo->freq = mpeg3_sample_rate(afile, 0);
  111.   ainfo->chans = mpeg3_audio_channels(afile, 0);
  112.   ainfo->bitspersample = 16;
  113.   ret = mptr->create_audio_plugin(plugin, NULL, ainfo, NULL, 0);
  114.   if (ret < 0) {
  115.     mpeg3f_message(LOG_ERR, "Failed to create audio plugin");
  116.     snprintf(errmsg, errlen, "Failed to create audio plugin");
  117.     free(ainfo);
  118.     delete mptr;
  119.     return -1;
  120.   }
  121.   CMpeg3AudioByteStream *abyte;
  122.   abyte = new CMpeg3AudioByteStream(afile, 0);
  123.   if (abyte == NULL) {
  124.     snprintf(errmsg, errlen, "Failed to create audio bytestream");
  125.     return -1;
  126.   }
  127.   ret = mptr->create_from_file(abyte, FALSE);
  128.   if (ret != 0) {
  129.     snprintf(errmsg, errlen, "Couldn't create audio media");
  130.     return -1;
  131.   }
  132.   return 1;
  133. }
  134. int create_media_for_mpeg_file (CPlayerSession *psptr,
  135. const char *name,
  136. char *errmsg, 
  137. uint32_t errlen,
  138. int has_audio_driver)
  139. {
  140.   mpeg3_t *file, *vfile, *afile;
  141.   int has_video, has_audio;
  142.   if (mpeg3_check_sig(name) != 1) {
  143.     snprintf(errmsg, errlen, "file %s is not a valid .mpg file",
  144.      name);
  145.     return -1;
  146.   }
  147.   file = mpeg3_open(name);
  148.   has_video = mpeg3_has_video(file);
  149.   has_audio = mpeg3_has_audio(file);
  150.   if (has_video != 0 && 
  151.       (has_audio != 0 && has_audio_driver)) {
  152.     // need to open both audio and video
  153.     vfile = file;
  154.     afile = mpeg3_open_copy(name, vfile);
  155.   } else if (has_video != 0) {
  156.     vfile = file;
  157.     afile = NULL;
  158.   } else if (has_audio != 0) {
  159.     vfile = NULL;
  160.     afile = file;
  161.   } else {
  162.     snprintf(errmsg, errlen, "Weird error - neither audio nor video");
  163.     return -1;
  164.   }
  165.   if (vfile != NULL) {
  166.     has_video = create_mpeg3_video(vfile, psptr, errmsg, errlen);
  167.     if (has_video <= 0) {
  168.       mpeg3_close(vfile);
  169.     }
  170.     if (has_video < 0) return -1;
  171.   }
  172.   if (afile != NULL) {
  173.     has_audio = create_mpeg3_audio(afile, psptr, errmsg, errlen);
  174.     if (has_audio <= 0) {
  175.       mpeg3_close(afile);
  176.     }
  177.     if (has_audio < 0) return -1;
  178.   }
  179.   psptr->session_set_seekable(1);
  180.   return 0;
  181. }