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

📄 mpeg3_file.cpp

📁 jpeg and mpeg 编解码技术源代码
💻 CPP
字号:
/*
 * The contents of this file are subject to the Mozilla Public
 * License Version 1.1 (the "License"); you may not use this file
 * except in compliance with the License. You may obtain a copy of
 * the License at http://www.mozilla.org/MPL/
 * 
 * Software distributed under the License is distributed on an "AS
 * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
 * implied. See the License for the specific language governing
 * rights and limitations under the License.
 * 
 * The Original Code is MPEG4IP.
 * 
 * The Initial Developer of the Original Code is Cisco Systems Inc.
 * Portions created by Cisco Systems Inc. are
 * Copyright (C) Cisco Systems Inc. 2000, 2001.  All Rights Reserved.
 * 
 * Contributor(s): 
 *              Bill May        wmay@cisco.com
 */
/*
 * qtime_file.cpp - provides generic class for quicktime file access control.
 * file access is then used by quicktime audio and video bytestreams.
 */
#include "systems.h"
#include "player_session.h"
#include "player_media.h"
#include "player_util.h"
#include "media_utils.h"
#include "libmpeg3.h"
#include "mpeg3_file.h"
#include "mpeg3_bytestream.h"
#include "codec_plugin_private.h"

static int create_mpeg3_video (mpeg3_t *vfile, 
			       CPlayerSession *psptr,
			       char *errmsg, 
			       uint32_t errlen)
{
  CPlayerMedia *mptr;
  codec_plugin_t *plugin;
  int ret;
#ifdef ARCH_X86
  //  mpeg3_set_mmx(vfile, 1);
#endif
  plugin = check_for_video_codec("MPEG FILE",
				 NULL,
				 -1,
				 -1,
				 NULL,
				 0);
  if (plugin == NULL) {
    snprintf(errmsg, errlen, "Can't find plugin for mpeg video");
    return 0;
  } 
  mptr = new CPlayerMedia(psptr);
  if (mptr == NULL) {
    snprintf(errmsg, errlen, "Could not create video media");
    return -1;
  }
  video_info_t *vinfo;
  vinfo = MALLOC_STRUCTURE(video_info_t);
  vinfo->height = mpeg3_video_height(vfile, 0);
  vinfo->width = mpeg3_video_width(vfile, 0);

  ret = mptr->create_video_plugin(plugin, NULL, vinfo, NULL, 0);
  if (ret < 0) {
    mpeg3f_message(LOG_ERR, "Failed to create video plugin");
    snprintf(errmsg, errlen, "Failed to create video plugin");
    free(vinfo);
    return -1;
  }
  CMpeg3VideoByteStream *vbyte;
  vbyte = new CMpeg3VideoByteStream(vfile, 0);
  if (vbyte == NULL) {
    snprintf(errmsg, errlen, "Failed to create video bytestream");
    return -1;
  }
  ret = mptr->create_from_file(vbyte, TRUE);
  if (ret != 0) {
    snprintf(errmsg, errlen, "Couldn't create video media");
    return -1;
  }
  return 1;
}

static int create_mpeg3_audio (mpeg3_t *afile, 
			       CPlayerSession *psptr,
			       char *errmsg, 
			       uint32_t errlen)
{
  CPlayerMedia *mptr;
  codec_plugin_t *plugin;
  int ret;

  plugin = check_for_audio_codec("MPEG FILE",
				 NULL,
				 mpeg3_get_audio_format(afile, 0),
				 -1,
				 NULL,
				 0);
  if (plugin == NULL) {
    snprintf(errmsg, errlen, "Can't find plugin for mpeg audio format %s",
	     mpeg3_audio_format(afile, 0));
    return 0;
  } 
  mptr = new CPlayerMedia(psptr);
  if (mptr == NULL) {
    snprintf(errmsg, errlen, "Could not create video media");
    return -1;
  }
  audio_info_t *ainfo;
  ainfo = MALLOC_STRUCTURE(audio_info_t);
  ainfo->freq = mpeg3_sample_rate(afile, 0);
  ainfo->chans = mpeg3_audio_channels(afile, 0);
  ainfo->bitspersample = 16;

  ret = mptr->create_audio_plugin(plugin, NULL, ainfo, NULL, 0);
  if (ret < 0) {
    mpeg3f_message(LOG_ERR, "Failed to create audio plugin");
    snprintf(errmsg, errlen, "Failed to create audio plugin");
    free(ainfo);
    delete mptr;
    return -1;
  }
  CMpeg3AudioByteStream *abyte;
  abyte = new CMpeg3AudioByteStream(afile, 0);
  if (abyte == NULL) {
    snprintf(errmsg, errlen, "Failed to create audio bytestream");
    return -1;
  }
  ret = mptr->create_from_file(abyte, FALSE);
  if (ret != 0) {
    snprintf(errmsg, errlen, "Couldn't create audio media");
    return -1;
  }
  return 1;
}

int create_media_for_mpeg_file (CPlayerSession *psptr,
				const char *name,
				char *errmsg, 
				uint32_t errlen,
				int has_audio_driver)
{
  mpeg3_t *file, *vfile, *afile;
  int has_video, has_audio;

  if (mpeg3_check_sig(name) != 1) {
    snprintf(errmsg, errlen, "file %s is not a valid .mpg file",
	     name);
    return -1;
  }

  file = mpeg3_open(name);
  has_video = mpeg3_has_video(file);
  has_audio = mpeg3_has_audio(file);
  if (has_video != 0 && 
      (has_audio != 0 && has_audio_driver)) {
    // need to open both audio and video
    vfile = file;
    afile = mpeg3_open_copy(name, vfile);
  } else if (has_video != 0) {
    vfile = file;
    afile = NULL;
  } else if (has_audio != 0) {
    vfile = NULL;
    afile = file;
  } else {
    snprintf(errmsg, errlen, "Weird error - neither audio nor video");
    return -1;
  }
  if (vfile != NULL) {
    has_video = create_mpeg3_video(vfile, psptr, errmsg, errlen);
    if (has_video <= 0) {
      mpeg3_close(vfile);
    }
    if (has_video < 0) return -1;
  }
  if (afile != NULL) {
    has_audio = create_mpeg3_audio(afile, psptr, errmsg, errlen);
    if (has_audio <= 0) {
      mpeg3_close(afile);
    }
    if (has_audio < 0) return -1;
  }
  psptr->session_set_seekable(1);
  return 0;
}

⌨️ 快捷键说明

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