/*****************************************************************************
* rawdv.c : raw DV input module for vlc
*****************************************************************************
- * Copyright (C) 2001-2004 the VideoLAN team
+ * Copyright (C) 2001-2007 the VideoLAN team
* $Id$
*
* Authors: Gildas Bazin <gbazin@netcourrier.com>
+ * Paul Corke <paul dot corke at datatote dot co dot uk>
*
* 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
/*****************************************************************************
* Preamble
*****************************************************************************/
-#include <stdlib.h> /* malloc(), free() */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
#include <vlc/vlc.h>
#include <vlc_demux.h>
/*****************************************************************************
* Module descriptor
*****************************************************************************/
+#define HURRYUP_TEXT N_( "Hurry up" )
+#define HURRYUP_LONGTEXT N_( "The demuxer will advance timestamps if the " \
+ "input can't keep up with the rate." )
+
static int Open ( vlc_object_t * );
static void Close( vlc_object_t * );
vlc_module_begin();
set_shortname( "DV" );
set_description( _("DV (Digital Video) demuxer") );
- set_capability( "demux2", 2 );
+ set_capability( "demux2", 3 );
set_category( CAT_INPUT );
set_subcategory( SUBCAT_INPUT_DEMUX );
+ add_bool( "rawdv-hurry-up", 0, NULL, HURRYUP_TEXT, HURRYUP_LONGTEXT, VLC_FALSE );
set_callbacks( Open, Close );
add_shortcut( "rawdv" );
vlc_module_end();
/* program clock reference (in units of 90kHz) */
mtime_t i_pcr;
+ vlc_bool_t b_hurry_up;
};
/*****************************************************************************
demux_t *p_demux = (demux_t*)p_this;
demux_sys_t *p_sys;
- byte_t *p_peek, *p_peek_backup;
+ const byte_t *p_peek, *p_peek_backup;
uint32_t i_dword;
dv_header_t dv_header;
dv_id_t dv_id;
- char *psz_ext;
/* It isn't easy to recognize a raw DV stream. The chances that we'll
* mistake a stream from another type for a raw DV stream are too high, so
* it is possible to force this demux. */
/* Check for DV file extension */
- psz_ext = strrchr( p_demux->psz_path, '.' );
- if( ( !psz_ext || strcasecmp( psz_ext, ".dv") ) &&
- strcmp(p_demux->psz_demux, "rawdv") )
- {
+ if( !demux2_IsPathExtension( p_demux, ".dv" ) && !p_demux->b_force )
return VLC_EGENERIC;
- }
if( stream_Peek( p_demux->s, &p_peek, DV_PAL_FRAME_SIZE ) <
DV_NTSC_FRAME_SIZE )
p_peek += 72; /* skip rest of DIF block */
-
/* Set p_input field */
p_demux->pf_demux = Demux;
p_demux->pf_control = Control;
p_demux->p_sys = p_sys = malloc( sizeof( demux_sys_t ) );
+ if( !p_sys )
+ return VLC_ENOMEM;
+
+ p_sys->b_hurry_up = var_CreateGetBool( p_demux, "rawdv-hurry-up" );
+ msg_Dbg( p_demux, "Realtime DV Source: %s", (p_sys->b_hurry_up)?"Yes":"No" );
p_sys->i_dsf = dv_header.dsf;
p_sys->frame_size = dv_header.dsf ? 12 * 150 * 80 : 10 * 150 * 80;
demux_t *p_demux = (demux_t*)p_this;
demux_sys_t *p_sys = p_demux->p_sys;
+ var_Destroy( p_demux, "rawdv-hurry-up");
free( p_sys );
}
block_t *p_block;
vlc_bool_t b_audio = VLC_FALSE;
+ if( p_sys->b_hurry_up )
+ {
+ /* 3 frames */
+ p_sys->i_pcr = mdate() + (p_sys->i_dsf ? 120000 : 90000);
+ }
+
/* Call the pace control */
es_out_Control( p_demux->out, ES_OUT_SET_PCR, p_sys->i_pcr );
-
- if( ( p_block = stream_Block( p_demux->s, p_sys->frame_size ) ) == NULL )
+ p_block = stream_Block( p_demux->s, p_sys->frame_size );
+ if( p_block == NULL )
{
/* EOF */
return 0;
es_out_Send( p_demux->out, p_sys->p_es_video, p_block );
- p_sys->i_pcr += ( I64C(1000000) / p_sys->f_rate );
+ if( !p_sys->b_hurry_up )
+ {
+ p_sys->i_pcr += ( I64C(1000000) / p_sys->f_rate );
+ }
return 1;
}
return p_block;
}
-
-