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

📄 avi_file.cpp

📁 网络MPEG4IP流媒体开发源代码
💻 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 *//* * avi_file.cpp - provides generic class for avi file access control. * file access is then used by avi audio and video bytestreams. */#include "systems.h"#include "player_session.h"#include "player_media.h"#include "player_util.h"#include "media_utils.h"#include "avi_bytestream.h"#include "avi_file.h"#include "codec_plugin_private.h"static void close_avi_file (void *data){  CAviFile *Avifile1 = (CAviFile *)data;  if (Avifile1 != NULL) {    delete Avifile1;    Avifile1 = NULL;  }}/* * Create the media for the quicktime file, and set up some session stuff. */int create_media_for_avi_file (CPlayerSession *psptr, 			       const char *name,			       char *errmsg,			       uint32_t errlen,			       int have_audio_driver,			       control_callback_vft_t *cc_vft){  CAviFile *Avifile1 = NULL;  avi_t *avi;  CPlayerMedia *mptr;  avi = AVI_open_input_file(name, 1);  if (avi == NULL) {    snprintf(errmsg, errlen, AVI_strerror());    player_error_message(errmsg);    return (-1);  }  int video_count = 1;  codec_plugin_t *plugin;  video_query_t vq;  const char *codec_name = AVI_video_compressor(avi);  player_debug_message("Trying avi video codec %s", codec_name);  plugin = check_for_video_codec(codec_name, 				 NULL,				 -1,				 -1,				 NULL,				 0);  if (plugin == NULL) {    video_count = 0;    return -1;  } else {    vq.track_id = 1;    vq.compressor = codec_name;    vq.type = -1;    vq.profile = -1;    vq.fptr = NULL;    vq.h = AVI_video_height(avi);    vq.w = AVI_video_width(avi);    vq.frame_rate = AVI_video_frame_rate(avi);    vq.config = NULL;    vq.config_len = 0;    vq.enabled = 0;    vq.reference = NULL;  }  int have_audio = 0;  int audio_count = 0;  audio_query_t aq;  if (AVI_audio_bytes(avi) != 0) {    have_audio = 1;    plugin = check_for_audio_codec("AVI FILE",				   NULL,				   AVI_audio_format(avi), 				   -1, 				   NULL, 				   0);    if (plugin != NULL) {      audio_count = 1;      aq.track_id = 1;      aq.compressor = "AVI_FILE";      aq.type = AVI_audio_format(avi);      aq.profile = -1;      aq.fptr = NULL;      aq.sampling_freq = AVI_audio_rate(avi);      aq.chans = AVI_audio_channels(avi);      aq.config = NULL;      aq.config_len = 0;      aq.enabled = 0;      aq.reference = NULL;    }  }  if (cc_vft != NULL && cc_vft->media_list_query != NULL) {    (cc_vft->media_list_query)(psptr, video_count, &vq, audio_count, &aq);  } else {    if (video_count != 0) vq.enabled = 1;    if (audio_count != 0) aq.enabled = 1;  }  if ((video_count == 0 || vq.enabled == 0) &&       (audio_count == 0 || aq.enabled == 0)) {    snprintf(errmsg, errlen, "No audio or video tracks enabled or playable");    AVI_close(avi);    return -1;  }    Avifile1 = new CAviFile(name, avi, vq.enabled, audio_count);  psptr->set_media_close_callback(close_avi_file, Avifile1);  if (video_count != 0 && vq.enabled) {    mptr = new CPlayerMedia(psptr);    if (mptr == NULL) {      return (-1);    }      video_info_t *vinfo = MALLOC_STRUCTURE(video_info_t);    if (vinfo == NULL)       return (-1);    vinfo->height = vq.h;    vinfo->width = vq.w;    player_debug_message("avi file h %d w %d frame rate %g", 			 vinfo->height,			 vinfo->width,			 vq.frame_rate);    plugin = check_for_video_codec(codec_name, 				   NULL,				   -1,				   -1,				   NULL,				   0);    int ret;    ret = mptr->create_video_plugin(plugin,				    codec_name,				    -1,				    -1,				    NULL,				    vinfo,				    NULL,				    0);    if (ret < 0) {      snprintf(errmsg, errlen, "Failed to create video plugin %s", 	       codec_name);      player_error_message("Failed to create plugin data");      delete mptr;      return -1;    }    CAviVideoByteStream *vbyte = new CAviVideoByteStream(Avifile1);    if (vbyte == NULL) {      delete mptr;      return (-1);    }    vbyte->config(AVI_video_frames(avi), vq.frame_rate);    ret = mptr->create(vbyte, TRUE, errmsg, errlen);    if (ret != 0) {      return (-1);    }  }      int seekable = 1;  if (have_audio_driver > 0 && audio_count > 0 && aq.enabled != 0) {    plugin = check_for_audio_codec("AVI FILE",				   NULL,				   aq.type,				   -1, 				   NULL, 				   0);    CAviAudioByteStream *abyte;    mptr = new CPlayerMedia(psptr);    if (mptr == NULL) {      return (-1);    }    audio_info_t *ainfo;    ainfo = MALLOC_STRUCTURE(audio_info_t);    ainfo->freq = aq.sampling_freq;    ainfo->chans = aq.chans;    ainfo->bitspersample = AVI_audio_bits(avi);       int ret;    ret = mptr->create_audio_plugin(plugin, 				    aq.compressor,				    aq.type,				    aq.profile,				    NULL, 				    ainfo,				    NULL, 				    0);    if (ret < 0) {      delete mptr;      player_error_message("Couldn't create audio from plugin %s", 			   plugin->c_name);      return -1;    }    abyte = new CAviAudioByteStream(Avifile1);    ret = mptr->create(abyte, FALSE, errmsg, errlen);    if (ret != 0) {      return (-1);    }    seekable = 0;  }   psptr->session_set_seekable(seekable);  if (audio_count == 0 && have_audio != 0) {    snprintf(errmsg, errlen, "Unknown Audio Codec in avi file ");    return (1);  }  if (video_count != 1) {    snprintf(errmsg, errlen, "Unknown Video Codec %s in avi file",	     codec_name);    return (1);  }  return (0);}CAviFile::CAviFile (const char *name, avi_t *avi,		    int at, int vt){  m_name = strdup(name);  m_file = avi;  m_file_mutex = SDL_CreateMutex();  m_video_tracks = vt;  m_audio_tracks = at;}CAviFile::~CAviFile (void){  free(m_name);  m_name = NULL;  AVI_close(m_file);  if (m_file_mutex) {    SDL_DestroyMutex(m_file_mutex);    m_file_mutex = NULL;  }}/* end file avi_file.cpp */

⌨️ 快捷键说明

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