mediacontrol_util.c
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:7k
源码类别:

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * util.c: Utility functions and exceptions management
  3.  *****************************************************************************
  4.  * Copyright (C) 2005 the VideoLAN team
  5.  * $Id: 09e5b7423f2879f861e48373aaa46b4ae10c0bd7 $
  6.  *
  7.  * Authors: Olivier Aubert <olivier.aubert@liris.univ-lyon1.fr>
  8.  *
  9.  * This program is free software; you can redistribute it and/or modify
  10.  * it under the terms of the GNU General Public License as published by
  11.  * the Free Software Foundation; either version 2 of the License, or
  12.  * (at your option) any later version.
  13.  *
  14.  * This program is distributed in the hope that it will be useful,
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  * GNU General Public License for more details.
  18.  *
  19.  * You should have received a copy of the GNU General Public License
  20.  * along with this program; if not, write to the Free Software
  21.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  22.  *****************************************************************************/
  23. #ifdef HAVE_CONFIG_H
  24. # include "config.h"
  25. #endif
  26. #include "mediacontrol_internal.h"
  27. #include <vlc/mediacontrol.h>
  28. #include <vlc_common.h>
  29. #include <vlc_vout.h>
  30. #include <vlc_osd.h>
  31. #include <stdlib.h>                                      /* malloc(), free() */
  32. #include <string.h>
  33. #include <errno.h>                                                 /* ENOMEM */
  34. #include <stdio.h>
  35. #include <ctype.h>
  36. #ifdef HAVE_UNISTD_H
  37. #    include <unistd.h>
  38. #endif
  39. #ifdef HAVE_SYS_TIME_H
  40. #    include <sys/time.h>
  41. #endif
  42. #ifdef HAVE_SYS_TYPES_H
  43. #    include <sys/types.h>
  44. #endif
  45. libvlc_time_t private_mediacontrol_unit_convert( libvlc_media_player_t *p_media_player,
  46.                                                  mediacontrol_PositionKey from,
  47.                                                  mediacontrol_PositionKey to,
  48.                                                  int64_t value )
  49. {
  50.     if( to == from )
  51.         return value;
  52.     if( !p_media_player )
  53.         return 0;
  54.     switch( from )
  55.     {
  56.     case mediacontrol_MediaTime:
  57.         if( to == mediacontrol_ByteCount )
  58.         {
  59.             /* FIXME Unsupported */
  60.             /* vlc < 0.8 API */
  61.             /* return value * 50 * p_input->stream.i_mux_rate / 1000; */
  62.             return 0;
  63.         }
  64.         if( to == mediacontrol_SampleCount )
  65.         {
  66.             double f_fps;
  67.             libvlc_exception_t ex;
  68.             libvlc_exception_init( &ex );
  69.             f_fps = libvlc_media_player_get_rate( p_media_player, &ex );
  70.             if( f_fps < 0 )
  71.                 return 0;
  72.             else
  73.                 return( value * f_fps / 1000.0 );
  74.         }
  75.         /* Cannot happen */
  76.         /* See http://catb.org/~esr/jargon/html/entry/can-t-happen.html */
  77.         break;
  78.     case mediacontrol_SampleCount:
  79.     {
  80.         double f_fps;
  81.         libvlc_exception_t ex;
  82.         libvlc_exception_init( &ex );
  83.         f_fps = libvlc_media_player_get_rate( p_media_player, &ex );
  84.         if( f_fps < 0 )
  85.             return 0;
  86.         if( to == mediacontrol_ByteCount )
  87.         {
  88.             /* FIXME */
  89.             /* vlc < 0.8 API */
  90. /*             return ( int64_t )( value * 50 * p_input->stream.i_mux_rate / f_fps ); */
  91.             return 0;
  92.         }
  93.         if( to == mediacontrol_MediaTime )
  94.             return( int64_t )( value * 1000.0 / ( double )f_fps );
  95.         /* Cannot happen */
  96.         break;
  97.     }
  98.     case mediacontrol_ByteCount:
  99.         /* FIXME */
  100.         return 0;
  101.     }
  102.     /* Cannot happen */
  103.     return 0;
  104. }
  105. /* Converts a mediacontrol_Position into a time in microseconds in
  106.    movie clock time */
  107. libvlc_time_t
  108. private_mediacontrol_position2microsecond( libvlc_media_player_t * p_media_player,
  109.                                            const mediacontrol_Position * pos )
  110. {
  111.     switch( pos->origin )
  112.     {
  113.     case mediacontrol_AbsolutePosition:
  114.         return ( 1000 * private_mediacontrol_unit_convert( p_media_player,
  115.                                                    pos->key, /* from */
  116.                                                    mediacontrol_MediaTime,  /* to */
  117.                                                    pos->value ) );
  118.         break;
  119.     case mediacontrol_RelativePosition:
  120.     {
  121.         libvlc_time_t l_time = 0;
  122.         libvlc_time_t l_pos = 0;
  123.         libvlc_exception_t ex;
  124.         libvlc_exception_init( &ex );
  125.         l_time = libvlc_media_player_get_time( p_media_player, &ex );
  126.         /* Ignore exception, we will assume a 0 time value */
  127.         l_pos = private_mediacontrol_unit_convert( p_media_player,
  128.    pos->key,
  129.    mediacontrol_MediaTime,
  130.    pos->value );
  131.         return 1000 * ( l_time + l_pos );
  132.         break;
  133.     }
  134.     case mediacontrol_ModuloPosition:
  135.     {
  136.         libvlc_time_t l_time = 0;
  137.         libvlc_time_t l_length = 0;
  138.         libvlc_time_t l_pos = 0;
  139.         libvlc_exception_t ex;
  140.         libvlc_exception_init( &ex );
  141.         l_length = libvlc_media_player_get_length( p_media_player, &ex );
  142.         if( l_length <= 0 )
  143.             return 0;
  144.         l_time = libvlc_media_player_get_time( p_media_player, &ex );
  145.         /* Ignore exception, we will assume a 0 time value */
  146.         l_pos = private_mediacontrol_unit_convert( p_media_player,
  147.    pos->key,
  148.    mediacontrol_MediaTime,
  149.    pos->value );
  150.         return 1000 * ( ( l_time + l_pos ) % l_length );
  151.         break;
  152.     }
  153.     }
  154.     return 0;
  155. }
  156. void
  157. mediacontrol_RGBPicture__free( mediacontrol_RGBPicture* pic )
  158. {
  159.     if( pic )
  160.     {
  161.         free( pic->data );
  162.         free( pic );
  163.     }
  164. }
  165. void
  166. mediacontrol_StreamInformation__free( mediacontrol_StreamInformation* p_si )
  167. {
  168.   if( p_si )
  169.   {
  170.       free( p_si->url );
  171.       free( p_si );
  172.   }
  173. }
  174. mediacontrol_Exception*
  175. mediacontrol_exception_create( void )
  176. {
  177.     mediacontrol_Exception* exception;
  178.     exception = ( mediacontrol_Exception* )malloc( sizeof( mediacontrol_Exception ) );
  179.     mediacontrol_exception_init( exception );
  180.     return exception;
  181. }
  182. void
  183. mediacontrol_exception_init( mediacontrol_Exception *exception )
  184. {
  185.     if( exception )
  186.     {
  187.         exception->code = 0;
  188.         exception->message = NULL;
  189.     }
  190. }
  191. void
  192. mediacontrol_exception_cleanup( mediacontrol_Exception *exception )
  193. {
  194.     if( exception )
  195.         free( exception->message );
  196. }
  197. void
  198. mediacontrol_exception_free( mediacontrol_Exception *exception )
  199. {
  200.     mediacontrol_exception_cleanup( exception );
  201.     free( exception );
  202. }
  203. /**
  204.  * Allocates and initializes a mediacontrol_RGBPicture object.
  205.  *
  206.  * @param i_width: picture width
  207.  * @param i_height: picture width
  208.  * @param i_chroma: picture chroma
  209.  * @param l_date: picture timestamp
  210.  * @param p_data: pointer to the data. The data will be directly used, not copied.
  211.  * @param i_datasize: data size in bytes
  212.  *
  213.  * @return the new object, or NULL on error.
  214.  */
  215. mediacontrol_RGBPicture*
  216. private_mediacontrol_createRGBPicture( int i_width, int i_height, long i_chroma, int64_t l_date,
  217.        char* p_data, int i_datasize )
  218. {
  219.     mediacontrol_RGBPicture *retval;
  220.     retval = ( mediacontrol_RGBPicture * )malloc( sizeof( mediacontrol_RGBPicture ) );
  221.     if( retval )
  222.     {
  223.         retval->width  = i_width;
  224.         retval->height = i_height;
  225.         retval->type   = i_chroma;
  226.         retval->date   = l_date;
  227.         retval->size   = i_datasize;
  228.         retval->data   = p_data;
  229.     }
  230.     return retval;
  231. }