demux.c

来自「VLC媒体播放程序」· C语言 代码 · 共 147 行

C
147
字号
/* demux.c: DVD demux functions. ***************************************************************************** * Copyright (C) 1998-2001 VideoLAN * $Id: demux.c,v 1.3 2003/09/07 22:49:05 fenrir Exp $ * * Author: St閜hane Borel <stef@via.ecp.fr> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. *  * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA. *****************************************************************************//***************************************************************************** * Preamble *****************************************************************************/#include <stdio.h>#include <stdlib.h>#include <string.h>#include <vlc/vlc.h>#include <vlc/input.h>#include "../../demux/mpeg/system.h"#ifdef HAVE_UNISTD_H#   include <unistd.h>#endif#include <fcntl.h>#include <sys/types.h>#include <sys/stat.h>#include <string.h>#include <errno.h>#ifdef STRNCASECMP_IN_STRINGS_H#   include <strings.h>#endif/* how many packets DVDDemux will read in each loop */#define DVD_READ_ONCE 64/***************************************************************************** * Private structure *****************************************************************************/struct demux_sys_t{    module_t *   p_module;    mpeg_demux_t mpeg;};/***************************************************************************** * Local prototypes *****************************************************************************/static int  DVDDemux   ( input_thread_t * );void DVDLaunchDecoders( input_thread_t * );/***************************************************************************** * DVDInit: initialize DVD structures *****************************************************************************/int E_(DVDInit) ( vlc_object_t *p_this ){    input_thread_t *p_input = (input_thread_t *)p_this;    demux_sys_t *   p_demux;    if( p_input->stream.i_method != INPUT_METHOD_DVD )    {        return -1;    }    p_demux = p_input->p_demux_data = malloc( sizeof(demux_sys_t ) );    if( p_demux == NULL )    {        return -1;    }    p_input->p_private = (void*)&p_demux->mpeg;    p_demux->p_module = module_Need( p_input, "mpeg-system", NULL );    if( p_demux->p_module == NULL )    {        free( p_input->p_demux_data );        return -1;    }    p_input->pf_demux = DVDDemux;    p_input->pf_demux_control = demux_vaControlDefault;    p_input->pf_rewind = NULL;    vlc_mutex_lock( &p_input->stream.stream_lock );        DVDLaunchDecoders( p_input );        vlc_mutex_unlock( &p_input->stream.stream_lock );    return 0;}/***************************************************************************** * DVDEnd: free DVD structures *****************************************************************************/void E_(DVDEnd) ( vlc_object_t *p_this ){    input_thread_t *p_input = (input_thread_t *)p_this;    module_Unneed( p_input, p_input->p_demux_data->p_module );    free( p_input->p_demux_data );}/***************************************************************************** * DVDDemux *****************************************************************************/static int DVDDemux( input_thread_t * p_input ){    data_packet_t *     p_data;    ssize_t             i_result;    int                 i;    /* Read headers to compute payload length */    for( i = 0 ; i < DVD_READ_ONCE ; i++ )    {        i_result = p_input->p_demux_data->mpeg.pf_read_ps( p_input, &p_data );        if( i_result < 0 )        {            return i_result;        }        else if( i_result == 0 )        {            return i;        }        p_input->p_demux_data->mpeg.pf_demux_ps( p_input, p_data );    }        return i;}

⌨️ 快捷键说明

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