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

📄 mediacontrol_util.c

📁 uclinux 下的vlc播放器源代码
💻 C
字号:
/***************************************************************************** * util.c: Utility functions and exceptions management ***************************************************************************** * Copyright (C) 2005 the VideoLAN team * $Id: mediacontrol_util.c 14953 2006-03-28 20:29:28Z zorglub $ * * Authors: Olivier Aubert <olivier.aubert@liris.univ-lyon1.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., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/#include <mediacontrol_internal.h>#include <vlc/mediacontrol.h>#include <vlc/intf.h>#include <vlc/vout.h>#include <vlc/aout.h>#include <vlc_demux.h>#include <vlc_osd.h>#define HAS_SNAPSHOT 1#ifdef HAS_SNAPSHOT#include <snapshot.h>#endif#include <stdlib.h>                                      /* malloc(), free() */#include <string.h>#include <errno.h>                                                 /* ENOMEM */#include <stdio.h>#include <ctype.h>#ifdef HAVE_UNISTD_H#    include <unistd.h>#endif#ifdef HAVE_SYS_TIME_H#    include <sys/time.h>#endif#ifdef HAVE_SYS_TYPES_H#    include <sys/types.h>#endif#define RAISE( c, m )  exception->code = c; \                       exception->message = strdup(m);vlc_int64_t mediacontrol_unit_convert( input_thread_t *p_input,                                       mediacontrol_PositionKey from,                                       mediacontrol_PositionKey to,                                       vlc_int64_t value ){    if( to == from )        return value;    /* For all conversions, we need data from p_input */    if( !p_input )        return 0;    switch( from )    {    case mediacontrol_MediaTime:        if( to == mediacontrol_ByteCount )        {            /* FIXME */            /* vlc < 0.8 API */            /* return value * 50 * p_input->stream.i_mux_rate / 1000; */            return 0;        }        if( to == mediacontrol_SampleCount )        {            double f_fps;            if( demux2_Control( p_input->input.p_demux, DEMUX_GET_FPS, &f_fps ) || f_fps < 0.1 )                return 0;            else                return( value * f_fps / 1000.0 );        }        /* Cannot happen */        /* See http://catb.org/~esr/jargon/html/entry/can't-happen.html */        break;    case mediacontrol_SampleCount:    {        double f_fps;        if( demux2_Control( p_input->input.p_demux, DEMUX_GET_FPS, &f_fps ) ||                                f_fps < 0.1 )            return 0;        if( to == mediacontrol_ByteCount )        {            /* FIXME */            /* vlc < 0.8 API *//*             return ( vlc_int64_t )( value * 50 * p_input->stream.i_mux_rate / f_fps ); */            return 0;        }        if( to == mediacontrol_MediaTime )            return( vlc_int64_t )( value * 1000.0 / ( double )f_fps );        /* Cannot happen */        break;    }    case mediacontrol_ByteCount:        /* FIXME */        return 0;/* vlc < 0.8 API: *///         if( p_input->stream.i_mux_rate == 0 )//             return 0;// //         /* Convert an offset into milliseconds. Taken from input_ext-intf.c.//            The 50 hardcoded constant comes from the definition of i_mux_rate ://            i_mux_rate : the rate we read the stream (in units of 50 bytes/s) ;//            0 if undef *///         if( to == mediacontrol_MediaTime )//             return ( vlc_int64_t )( 1000 * value / 50 / p_input->stream.i_mux_rate );// //         if( to == mediacontrol_SampleCount )//         {//             double f_fps;//             if( demux2_Control( p_input->input.p_demux, DEMUX_GET_FPS, &f_fps ) || f_fps < 0.1 )//                 return 0;//             else//                 return ( vlc_int64_t )( value * f_fps / 50 / p_input->stream.i_mux_rate );//         }        /* Cannot happen */        break;    }    /* Cannot happen */    return 0;}/* Converts a mediacontrol_Position into a time in microseconds in   movie clock time */vlc_int64_tmediacontrol_position2microsecond( input_thread_t* p_input, const mediacontrol_Position * pos ){    switch( pos->origin )    {    case mediacontrol_AbsolutePosition:        return ( 1000 * mediacontrol_unit_convert( p_input,                                                   pos->key, /* from */                                                   mediacontrol_MediaTime,  /* to */                                                   pos->value ) );        break;    case mediacontrol_RelativePosition:    {        vlc_int64_t l_pos;        vlc_value_t val;        val.i_time = 0;        if( p_input )        {            var_Get( p_input, "time", &val );        }        l_pos = 1000 * mediacontrol_unit_convert( p_input,                                                  pos->key,                                                  mediacontrol_MediaTime,                                                  pos->value );        return val.i_time + l_pos;        break;    }    case mediacontrol_ModuloPosition:    {        vlc_int64_t l_pos;        vlc_value_t val;        val.i_time = 0;        if( p_input )        {            var_Get( p_input, "length", &val );        }        if( val.i_time > 0)        {            l_pos = ( 1000 * mediacontrol_unit_convert( p_input,                                                        pos->key,                                                        mediacontrol_MediaTime,                                                        pos->value ) );        }        else            l_pos = 0;        return l_pos % val.i_time;        break;    }    }    return 0;}mediacontrol_RGBPicture*mediacontrol_RGBPicture__alloc( int datasize ){    mediacontrol_RGBPicture* pic;    pic = ( mediacontrol_RGBPicture * )malloc( sizeof( mediacontrol_RGBPicture ) );    if( ! pic )        return NULL;    pic->size = datasize;    pic->data = ( char* )malloc( datasize * sizeof( char ) );    return pic;}voidmediacontrol_RGBPicture__free( mediacontrol_RGBPicture* pic ){    if( pic )        free( pic->data );    free( pic );}mediacontrol_PlaylistSeq*mediacontrol_PlaylistSeq__alloc( int size ){    mediacontrol_PlaylistSeq* ps;    ps =( mediacontrol_PlaylistSeq* )malloc( sizeof( mediacontrol_PlaylistSeq ) );    if( ! ps )        return NULL;    ps->size = size;    ps->data = ( char** )malloc( size * sizeof( char* ) );    return ps;}voidmediacontrol_PlaylistSeq__free( mediacontrol_PlaylistSeq* ps ){    if( ps )    {        int i;        for( i = 0 ; i < ps->size ; i++ )            free( ps->data[i] );    }    free( ps->data );    free( ps );}mediacontrol_Exception*mediacontrol_exception_init( mediacontrol_Exception *exception ){    if( exception == NULL )    {        exception = ( mediacontrol_Exception* )malloc( sizeof( mediacontrol_Exception ) );    }    exception->code = 0;    exception->message = NULL;    return exception;}voidmediacontrol_exception_free( mediacontrol_Exception *exception ){    if( ! exception )        return;    free( exception->message );    free( exception );}mediacontrol_RGBPicture*_mediacontrol_createRGBPicture( int i_width, int i_height, long i_chroma, vlc_int64_t l_date,                                char* p_data, int i_datasize ){    mediacontrol_RGBPicture *retval;    retval = mediacontrol_RGBPicture__alloc( i_datasize );    if( retval )    {        retval->width  = i_width;        retval->height = i_height;        retval->type   = i_chroma;        retval->date   = l_date;        retval->size   = i_datasize;        memcpy( retval->data, p_data, i_datasize );    }    return retval;}

⌨️ 快捷键说明

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