Commit a4b48614 authored by Gildas Bazin's avatar Gildas Bazin

* modules/video_output/directx/directx.c: fixed the "refresh" button for the --directx-device option.
* modules/demux/dts.c: implemented DEMUX_GET_TIME and DEMUX_GET_LENGTH.
* modules/access/cdda.c: got rid of the cdda demux and add a wav header at the beginning of the data.
   This allows to correctly support DTS audio cd (demux will detect what kind of CD it is).
* modules/demux/wav.c: code cleanup and fixed seeking.
parent 93f3c135
dnl Autoconf settings for vlc
dnl $Id: configure.ac,v 1.169 2004/02/03 12:49:53 sigmunau Exp $
dnl $Id: configure.ac,v 1.170 2004/02/05 22:56:12 gbazin Exp $
AC_INIT(vlc,0.7.1-cvs)
......@@ -377,7 +377,7 @@ AM_CONDITIONAL(BUILD_GETOPT, ${need_getopt})
if test "${SYS}" != "mingw32"; then
AC_TYPE_SIGNAL
AC_CHECK_LIB(m,cos,[
AX_ADD_LDFLAGS([adjust distort a52tofloat32],[-lm])
AX_ADD_LDFLAGS([adjust distort a52tofloat32 dtstofloat32],[-lm])
])
AC_CHECK_LIB(m,pow,[
AX_ADD_LDFLAGS([ffmpeg stream_out_transcode stream_out_transrate i420_rgb faad vlc],[-lm])
......@@ -1993,7 +1993,7 @@ AC_CHECK_HEADERS(libtar.h, [
dnl
dnl a52 AC3 decoder plugin
dnl A52/AC3 decoder plugin
dnl
AC_ARG_ENABLE(a52,
[ --enable-a52 A/52 support with liba52 (default enabled)])
......@@ -2062,6 +2062,62 @@ then
fi
fi
dnl
dnl DTS Coherent Acoustics decoder plugin
dnl
AC_ARG_ENABLE(dts,
[ --enable-dts DTS Coherent Acoustics support with libdts (default enabled)])
if test "${enable_dts}" != "no"; then
AC_ARG_WITH(dts-tree,
[ --with-dts-tree=PATH dtsdec tree for static linking ],[],[])
if test "${with_dts_tree}" != "no" -a -n "${with_dts_tree}"
then
real_dts_tree="`cd ${with_dts_tree} 2>/dev/null && pwd`"
if test -z "${real_dts_tree}"
then
dnl The given directory can't be found
AC_MSG_RESULT(no)
AC_MSG_ERROR([${with_dts_tree} directory doesn't exist])
fi
dnl Use a custom dtsdec
AC_MSG_CHECKING(for dts.h in ${real_dts_tree}/include)
if test -f ${real_dts_tree}/include/dts.h
then
AC_MSG_RESULT(yes)
AX_ADD_CPPFLAGS([dtstofloat32],[-I${real_dts_tree}])
AX_ADD_LDFLAGS([dtstofloat32],[-L${real_dts_tree}/libdts/.libs])
LDFLAGS="${LDFLAGS_save} ${LDFLAGS_dtstofloat32}"
AC_CHECK_LIB(dts, dts_free, [
AX_ADD_BUILTINS([dtstofloat32])
AX_ADD_CPPFLAGS([dtstofloat32],[-DUSE_DTSDEC_TREE])
AX_ADD_LDFLAGS([dtstofloat32],[-ldts])
],[
if test -f ${real_dts_tree}/libdts/.libs/libdts.a
then
AC_MSG_ERROR([make sure you have at least dtsdec-0.1.0])
else
AC_MSG_ERROR([the specified tree hasn't been compiled])
fi
])
LDFLAGS="${LDFLAGS_save}"
else
AC_MSG_RESULT(no)
AC_MSG_ERROR([the specified tree doesn't have dts.h])
fi
else
AC_CHECK_HEADERS(dtsdec/dts.h, [
AC_CHECK_LIB(dts, dts_free, [
AX_ADD_PLUGINS([dtstofloat32])
AX_ADD_LDFLAGS([dtstofloat32],[-ldts])
],[
if test "${enable_dts}" = "yes"; then
AC_MSG_ERROR([Could not find libdts on your system: you may get it from http://www.videolan.org/dtsdec.])
fi
])
])
fi
fi
dnl dnl
dnl dnl DV plugin
dnl dnl
......
......@@ -2,7 +2,7 @@
* cdda.c : CD digital audio input module for vlc
*****************************************************************************
* Copyright (C) 2000, 2003 VideoLAN
* $Id: cdda.c,v 1.12 2004/01/25 17:31:22 gbazin Exp $
* $Id: cdda.c,v 1.13 2004/02/05 22:56:12 gbazin Exp $
*
* Authors: Laurent Aimar <fenrir@via.ecp.fr>
* Gildas Bazin <gbazin@netcourrier.com>
......@@ -32,15 +32,29 @@
#include "vcd/cdrom.h"
typedef struct WAVEHEADER
{
uint32_t MainChunkID; // it will be 'RIFF'
uint32_t Length;
uint32_t ChunkTypeID; // it will be 'WAVE'
uint32_t SubChunkID; // it will be 'fmt '
uint32_t SubChunkLength;
uint16_t Format;
uint16_t Modus;
uint32_t SampleFreq;
uint32_t BytesPerSec;
uint16_t BytesPerSample;
uint16_t BitsPerSample;
uint32_t DataChunkID; // it will be 'data'
uint32_t DataLength;
} WAVEHEADER;
/*****************************************************************************
* Module descriptior
*****************************************************************************/
static int AccessOpen ( vlc_object_t * );
static void AccessClose( vlc_object_t * );
static int DemuxOpen ( vlc_object_t * );
static void DemuxClose ( vlc_object_t * );
#define CACHING_TEXT N_("Caching value in ms")
#define CACHING_LONGTEXT N_( \
"Allows you to modify the default caching value for cdda streams. This " \
......@@ -55,12 +69,6 @@ vlc_module_begin();
set_capability( "access", 70 );
set_callbacks( AccessOpen, AccessClose );
add_shortcut( "cdda" );
add_submodule();
set_description( _("Audio CD demux") );
set_capability( "demux", 0 );
set_callbacks( DemuxOpen, DemuxClose );
add_shortcut( "cdda" );
vlc_module_end();
......@@ -80,6 +88,8 @@ struct access_sys_t
int * p_sectors; /* Track sectors */
vlc_bool_t b_end_of_track; /* If the end of track was reached */
WAVEHEADER waveheader; /* Wave header for the output data */
int i_header_pos;
};
static int Read ( input_thread_t *, byte_t *, size_t );
......@@ -171,7 +181,7 @@ static int AccessOpen( vlc_object_t *p_this )
msg_Err( p_input, "no audio tracks found" );
}
if( p_sys->i_nb_tracks <= 1)
if( p_sys->i_nb_tracks <= 0 )
{
ioctl_Close( p_this, p_sys->vcddev );
free( p_sys );
......@@ -216,11 +226,6 @@ static int AccessOpen( vlc_object_t *p_this )
vlc_mutex_unlock( &p_input->stream.stream_lock );
if( !p_input->psz_demux || !*p_input->psz_demux )
{
p_input->psz_demux = "cdda";
}
p_input->pf_read = Read;
p_input->pf_seek = Seek;
p_input->pf_set_area = SetArea;
......@@ -229,6 +234,25 @@ static int AccessOpen( vlc_object_t *p_this )
/* Update default_pts to a suitable value for cdda access */
p_input->i_pts_delay = config_GetInt( p_input, "cdda-caching" ) * 1000;
/* Build a WAV header for the output data */
memset( &p_sys->waveheader, 0, sizeof(WAVEHEADER) );
p_sys->waveheader.Format = 1 /*WAVE_FORMAT_PCM*/;
p_sys->waveheader.BitsPerSample = 16;
p_sys->waveheader.MainChunkID = VLC_FOURCC('R', 'I', 'F', 'F');
p_sys->waveheader.Length = 0; /* we just don't know */
p_sys->waveheader.ChunkTypeID = VLC_FOURCC('W', 'A', 'V', 'E');
p_sys->waveheader.SubChunkID = VLC_FOURCC('f', 'm', 't', ' ');
p_sys->waveheader.SubChunkLength = 16;
p_sys->waveheader.Modus = 2;
p_sys->waveheader.SampleFreq = 44100;
p_sys->waveheader.BytesPerSample =
p_sys->waveheader.Modus * p_sys->waveheader.BitsPerSample / 8;
p_sys->waveheader.BytesPerSec =
p_sys->waveheader.BytesPerSample * p_sys->waveheader.SampleFreq;
p_sys->waveheader.DataChunkID = VLC_FOURCC('d', 'a', 't', 'a');
p_sys->waveheader.DataLength = 0; /* we just don't know */
p_sys->i_header_pos = 0;
return VLC_SUCCESS;
}
......@@ -250,14 +274,20 @@ static void AccessClose( vlc_object_t *p_this )
* Returns -1 in case of error, 0 in case of EOF, otherwise the number of
* bytes.
*****************************************************************************/
static int Read( input_thread_t * p_input, byte_t * p_buffer,
size_t i_len )
static int Read( input_thread_t * p_input, byte_t * p_buffer, size_t i_len )
{
access_sys_t *p_sys = p_input->p_access_data;
int i_blocks = i_len / CDDA_DATA_SIZE;
int i_read = 0;
int i_index;
if( !p_sys->i_header_pos )
{
p_sys->i_header_pos = sizeof(WAVEHEADER);
i_blocks = (i_len - sizeof(WAVEHEADER)) / CDDA_DATA_SIZE;
memcpy( p_buffer, &p_sys->waveheader, sizeof(WAVEHEADER) );
p_buffer += sizeof(WAVEHEADER);
}
if( ioctl_ReadSectors( VLC_OBJECT(p_input), p_sys->vcddev, p_sys->i_sector,
p_buffer, i_blocks, CDDA_TYPE ) < 0 )
......@@ -299,7 +329,6 @@ static int Read( input_thread_t * p_input, byte_t * p_buffer,
return i_read;
}
/*****************************************************************************
* SetProgram: Does nothing since a CDDA is mono_program
*****************************************************************************/
......@@ -309,7 +338,6 @@ static int SetProgram( input_thread_t * p_input,
return VLC_EGENERIC;
}
/*****************************************************************************
* SetArea: initialize input data for title x.
* It should be called for each user navigation request.
......@@ -349,7 +377,6 @@ static int SetArea( input_thread_t * p_input, input_area_t * p_area )
return 0;
}
/****************************************************************************
* Seek
****************************************************************************/
......@@ -366,104 +393,3 @@ static void Seek( input_thread_t * p_input, off_t i_off )
- p_input->stream.p_selected_area->i_start;
vlc_mutex_unlock( &p_input->stream.stream_lock );
}
/*****************************************************************************
* Demux: local prototypes
*****************************************************************************/
struct demux_sys_t
{
es_out_id_t *p_es;
mtime_t i_pts;
};
static int Demux ( input_thread_t * p_input );
/****************************************************************************
* DemuxOpen:
****************************************************************************/
static int DemuxOpen ( vlc_object_t * p_this)
{
input_thread_t *p_input = (input_thread_t *)p_this;
demux_sys_t *p_sys;
es_format_t fmt;
if( p_input->stream.i_method != INPUT_METHOD_CDDA )
{
return VLC_EGENERIC;
}
p_input->pf_demux = Demux;
p_input->pf_rewind = NULL;
p_input->pf_demux_control = demux_vaControlDefault;
p_input->p_demux_data = p_sys = malloc( sizeof( es_descriptor_t ) );
p_sys->i_pts = 0;
vlc_mutex_lock( &p_input->stream.stream_lock );
if( input_InitStream( p_input, 0 ) == -1)
{
vlc_mutex_unlock( &p_input->stream.stream_lock );
msg_Err( p_input, "cannot init stream" );
free( p_sys );
return VLC_EGENERIC;
}
p_input->stream.i_mux_rate = 4 * 44100 / 50;
vlc_mutex_unlock( &p_input->stream.stream_lock );
es_format_Init( &fmt, AUDIO_ES, VLC_FOURCC( 'a', 'r', 'a', 'w' ) );
fmt.audio.i_channels = 2;
fmt.audio.i_rate = 44100;
fmt.audio.i_bitspersample = 16;
fmt.audio.i_blockalign = 4;
fmt.i_bitrate = 4 * 44100 * 8;
p_sys->p_es = es_out_Add( p_input->p_es_out, &fmt );
return VLC_SUCCESS;
}
/****************************************************************************
* DemuxClose:
****************************************************************************/
static void DemuxClose( vlc_object_t * p_this)
{
input_thread_t *p_input = (input_thread_t*)p_this;
demux_sys_t *p_sys = (demux_sys_t*)p_input->p_demux_data;
free( p_sys );
return;
}
/****************************************************************************
* Demux:
****************************************************************************/
static int Demux( input_thread_t * p_input )
{
demux_sys_t *p_sys = (demux_sys_t*)p_input->p_demux_data;
block_t *p_block;
input_ClockManageRef( p_input,
p_input->stream.p_selected_program,
p_sys->i_pts );
if( ( p_block = stream_Block( p_input->s, CDDA_DATA_SIZE ) ) == NULL )
{
/* eof */
return 0;
}
p_block->i_dts =
p_block->i_pts = input_ClockGetTS( p_input,
p_input->stream.p_selected_program,
p_sys->i_pts );
p_block->i_length = (mtime_t)90000 * (mtime_t)p_block->i_buffer/44100/4;
p_sys->i_pts += p_block->i_length;
es_out_Send( p_input->p_es_out, p_sys->p_es, p_block );
return 1;
}
This diff is collapsed.
......@@ -2,7 +2,7 @@
* dts.c : raw DTS stream input module for vlc
*****************************************************************************
* Copyright (C) 2001 VideoLAN
* $Id: dts.c,v 1.4 2004/02/04 08:11:49 gbazin Exp $
* $Id: dts.c,v 1.5 2004/02/05 22:56:11 gbazin Exp $
*
* Authors: Gildas Bazin <gbazin@netcourrier.com>
*
......@@ -38,6 +38,8 @@ static int Open ( vlc_object_t * );
static void Close ( vlc_object_t * );
static int Demux ( input_thread_t * );
static int Control( input_thread_t *, int, va_list );
struct demux_sys_t
{
vlc_bool_t b_start;
......@@ -45,6 +47,8 @@ struct demux_sys_t
/* Packetizer */
decoder_t *p_packetizer;
int i_mux_rate;
};
/*****************************************************************************
......@@ -103,7 +107,7 @@ static int Open( vlc_object_t * p_this )
int i_peek = 0;
p_input->pf_demux = Demux;
p_input->pf_demux_control = demux_vaControlDefault;
p_input->pf_demux_control = Control;
p_input->pf_rewind = NULL;
/* Check if we are dealing with a WAV file */
......@@ -163,6 +167,7 @@ static int Open( vlc_object_t * p_this )
p_input->p_demux_data = p_sys = malloc( sizeof( demux_sys_t ) );
p_sys->b_start = VLC_TRUE;
p_sys->i_mux_rate = 0;
/*
* Load the DTS packetizer
......@@ -251,6 +256,12 @@ static int Demux( input_thread_t * p_input )
{
block_t *p_next = p_block_out->p_next;
/* We assume a constant bitrate */
if( p_block_out->i_length )
p_sys->i_mux_rate =
p_block_out->i_buffer * I64C(1000000) / p_block_out->i_length;
p_input->stream.i_mux_rate = p_sys->i_mux_rate / 50;
input_ClockManageRef( p_input,
p_input->stream.p_selected_program,
p_block_out->i_pts * 9 / 100 );
......@@ -268,3 +279,40 @@ static int Demux( input_thread_t * p_input )
return 1;
}
/*****************************************************************************
* Control:
*****************************************************************************/
static int Control( input_thread_t *p_input, int i_query, va_list args )
{
demux_sys_t *p_sys = (demux_sys_t *)p_input->p_demux_data;
int64_t *pi64;
switch( i_query )
{
case DEMUX_GET_TIME:
pi64 = (int64_t*)va_arg( args, int64_t * );
if( p_sys->i_mux_rate > 0 )
{
*pi64 = I64C(1000000) * stream_Tell( p_input->s ) /
p_sys->i_mux_rate;
return VLC_SUCCESS;
}
*pi64 = 0;
return VLC_EGENERIC;
case DEMUX_GET_LENGTH:
pi64 = (int64_t*)va_arg( args, int64_t * );
if( p_sys->i_mux_rate > 0 )
{
*pi64 = I64C(1000000) * stream_Size( p_input->s ) /
p_sys->i_mux_rate;
return VLC_SUCCESS;
}
*pi64 = 0;
return VLC_EGENERIC;
default:
return demux_vaControlDefault( p_input, i_query, args );
}
}
This diff is collapsed.
......@@ -2,7 +2,7 @@
* vout.c: Windows DirectX video output display method
*****************************************************************************
* Copyright (C) 2001-2004 VideoLAN
* $Id: directx.c,v 1.34 2004/01/26 16:45:02 zorglub Exp $
* $Id: directx.c,v 1.35 2004/02/05 22:56:11 gbazin Exp $
*
* Authors: Gildas Bazin <gbazin@netcourrier.com>
*
......@@ -138,6 +138,7 @@ vlc_module_begin();
add_string( "directx-device", "", NULL, DEVICE_TEXT, DEVICE_LONGTEXT,
VLC_TRUE );
change_string_list( ppsz_dev, ppsz_dev_text, FindDevicesCallback );
change_action_add( FindDevicesCallback, N_("Refresh list") );
set_description( _("DirectX video output") );
set_capability( "video output", 100 );
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment