Commit 3ca0203c authored by Laurent Aimar's avatar Laurent Aimar

* v4l: used the same trick than vls to avoid too much resampling.

parent 469ac3a3
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* v4l.c : Video4Linux input module for vlc * v4l.c : Video4Linux input module for vlc
***************************************************************************** *****************************************************************************
* Copyright (C) 2002 VideoLAN * Copyright (C) 2002 VideoLAN
* $Id: v4l.c,v 1.11 2003/05/03 01:52:43 fenrir Exp $ * $Id: v4l.c,v 1.12 2003/05/03 12:36:17 fenrir Exp $
* *
* Author: Samuel Hocevar <sam@zoy.org> * Author: Samuel Hocevar <sam@zoy.org>
* *
...@@ -175,11 +175,21 @@ static void SetDWBE( uint8_t *p, uint32_t dw ) ...@@ -175,11 +175,21 @@ static void SetDWBE( uint8_t *p, uint32_t dw )
p[3] = (dw )&0xff; p[3] = (dw )&0xff;
} }
static void SetQWBE( uint8_t *p, uint64_t qw )
{
SetDWBE( p, (qw >> 32)&0xffffffff );
SetDWBE( &p[4], qw&0xffffffff);
}
static uint32_t GetDWBE( uint8_t *p_buff ) static uint32_t GetDWBE( uint8_t *p_buff )
{ {
return( ( p_buff[0] << 24 ) + ( p_buff[1] << 16 ) + return( ( p_buff[0] << 24 ) + ( p_buff[1] << 16 ) +
( p_buff[2] << 8 ) + p_buff[3] ); ( p_buff[2] << 8 ) + p_buff[3] );
} }
static uint64_t GetQWBE( uint8_t *p )
{
return( ( (uint64_t)GetDWBE( p ) << 32) | (uint64_t)GetDWBE( &p[4] ) );
}
/***************************************************************************** /*****************************************************************************
* Open: open device: * Open: open device:
...@@ -920,10 +930,13 @@ static void AccessClose( vlc_object_t *p_this ) ...@@ -920,10 +930,13 @@ static void AccessClose( vlc_object_t *p_this )
#ifdef _V4L_AUDIO_ #ifdef _V4L_AUDIO_
static int GrabAudio( input_thread_t * p_input, static int GrabAudio( input_thread_t * p_input,
uint8_t **pp_data, uint8_t **pp_data,
int *pi_data ) int *pi_data,
mtime_t *pi_pts )
{ {
access_sys_t *p_sys = p_input->p_access_data; access_sys_t *p_sys = p_input->p_access_data;
struct audio_buf_info buf_info;
int i_read; int i_read;
int i_correct;
i_read = read( p_sys->fd_audio, p_sys->p_audio_frame, i_read = read( p_sys->fd_audio, p_sys->p_audio_frame,
p_sys->i_audio_frame_size_allocated ); p_sys->i_audio_frame_size_allocated );
...@@ -935,15 +948,26 @@ static int GrabAudio( input_thread_t * p_input, ...@@ -935,15 +948,26 @@ static int GrabAudio( input_thread_t * p_input,
p_sys->i_audio_frame_size = i_read; p_sys->i_audio_frame_size = i_read;
/* from vls : correct the date because of kernel buffering */
i_correct = i_read;
if( ioctl( p_sys->fd_audio, SNDCTL_DSP_GETISPACE, &buf_info ) == 0 )
{
i_correct += buf_info.bytes;
}
*pp_data = p_sys->p_audio_frame; *pp_data = p_sys->p_audio_frame;
*pi_data = p_sys->i_audio_frame_size; *pi_data = p_sys->i_audio_frame_size;
*pi_pts = mdate() - (mtime_t)1000000 * (mtime_t)i_correct /
2 / ( p_sys->b_stereo ? 2 : 1) / p_sys->i_sample_rate;
return VLC_SUCCESS; return VLC_SUCCESS;
} }
#endif #endif
static int GrabVideo( input_thread_t * p_input, uint8_t **pp_data, static int GrabVideo( input_thread_t * p_input,
int *pi_data ) uint8_t **pp_data,
int *pi_data,
mtime_t *pi_pts )
{ {
access_sys_t *p_sys = p_input->p_access_data; access_sys_t *p_sys = p_input->p_access_data;
...@@ -998,6 +1022,7 @@ static int GrabVideo( input_thread_t * p_input, uint8_t **pp_data, ...@@ -998,6 +1022,7 @@ static int GrabVideo( input_thread_t * p_input, uint8_t **pp_data,
*pp_data = p_sys->p_video_frame; *pp_data = p_sys->p_video_frame;
*pi_data = p_sys->i_video_frame_size; *pi_data = p_sys->i_video_frame_size;
*pi_pts = mdate();
return VLC_SUCCESS; return VLC_SUCCESS;
} }
...@@ -1010,8 +1035,9 @@ static int GrabVideo( input_thread_t * p_input, uint8_t **pp_data, ...@@ -1010,8 +1035,9 @@ static int GrabVideo( input_thread_t * p_input, uint8_t **pp_data,
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; access_sys_t *p_sys = p_input->p_access_data;
int i_data = 0; int i_data = 0;
int i_stream; int i_stream;
mtime_t i_pts;
//msg_Info( p_input, "access read data_size %i, data_pos %i", //msg_Info( p_input, "access read data_size %i, data_pos %i",
//p_sys->i_data_size, p_sys->i_data_pos ); //p_sys->i_data_size, p_sys->i_data_pos );
...@@ -1069,11 +1095,11 @@ static int Read( input_thread_t * p_input, byte_t * p_buffer, size_t i_len ) ...@@ -1069,11 +1095,11 @@ static int Read( input_thread_t * p_input, byte_t * p_buffer, size_t i_len )
#ifdef _V4L_AUDIO_ #ifdef _V4L_AUDIO_
i_stream = 1; i_stream = 1;
if( p_sys->fd_audio < 0 || if( p_sys->fd_audio < 0 ||
GrabAudio( p_input, &p_sys->p_data, &p_sys->i_data_size ) ) GrabAudio( p_input, &p_sys->p_data, &p_sys->i_data_size, &i_pts ) )
{ {
/* and then get video frame if no audio */ /* and then get video frame if no audio */
i_stream = 0; i_stream = 0;
if( GrabVideo( p_input, &p_sys->p_data, &p_sys->i_data_size ) ) if( GrabVideo( p_input, &p_sys->p_data, &p_sys->i_data_size, &i_pts ) )
{ {
return -1; return -1;
} }
...@@ -1081,17 +1107,18 @@ static int Read( input_thread_t * p_input, byte_t * p_buffer, size_t i_len ) ...@@ -1081,17 +1107,18 @@ static int Read( input_thread_t * p_input, byte_t * p_buffer, size_t i_len )
#else #else
/* and then get video frame if no audio */ /* and then get video frame if no audio */
i_stream = 0; i_stream = 0;
if( GrabVideo( p_input, &p_sys->p_data, &p_sys->i_data_size ) ) if( GrabVideo( p_input, &p_sys->p_data, &p_sys->i_data_size, &i_pts ) )
{ {
return -1; return -1;
} }
#endif #endif
/* create pseudo header */ /* create pseudo header */
p_sys->i_header_size = 8; p_sys->i_header_size = 16;
p_sys->i_header_pos = 0; p_sys->i_header_pos = 0;
SetDWBE( &p_sys->p_header[0], i_stream ); SetDWBE( &p_sys->p_header[0], i_stream );
SetDWBE( &p_sys->p_header[4], p_sys->i_data_size ); SetDWBE( &p_sys->p_header[4], p_sys->i_data_size );
SetQWBE( &p_sys->p_header[8], i_pts );
} }
return i_data; return i_data;
...@@ -1246,8 +1273,9 @@ static int Demux( input_thread_t *p_input ) ...@@ -1246,8 +1273,9 @@ static int Demux( input_thread_t *p_input )
int i_stream; int i_stream;
int i_size; int i_size;
uint8_t *p_peek; uint8_t *p_peek;
mtime_t i_pts;
if( input_Peek( p_input, &p_peek, 8 ) < 8 ) if( input_Peek( p_input, &p_peek, 16 ) < 16 )
{ {
msg_Warn( p_input, "cannot peek (EOF ?)" ); msg_Warn( p_input, "cannot peek (EOF ?)" );
return( 0 ); return( 0 );
...@@ -1255,6 +1283,7 @@ static int Demux( input_thread_t *p_input ) ...@@ -1255,6 +1283,7 @@ static int Demux( input_thread_t *p_input )
i_stream = GetDWBE( &p_peek[0] ); i_stream = GetDWBE( &p_peek[0] );
i_size = GetDWBE( &p_peek[4] ); i_size = GetDWBE( &p_peek[4] );
i_pts = GetQWBE( &p_peek[8] );
//msg_Dbg( p_input, "stream=%d size=%d", i_stream, i_size ); //msg_Dbg( p_input, "stream=%d size=%d", i_stream, i_size );
// p_es = input_FindES( p_input, i_stream ); // p_es = input_FindES( p_input, i_stream );
...@@ -1277,7 +1306,7 @@ static int Demux( input_thread_t *p_input ) ...@@ -1277,7 +1306,7 @@ static int Demux( input_thread_t *p_input )
msleep( 1000 ); msleep( 1000 );
return( 1 ); return( 1 );
} }
i_size += 8; i_size += 16;
while( i_size > 0 ) while( i_size > 0 )
{ {
data_packet_t *p_data; data_packet_t *p_data;
...@@ -1305,8 +1334,8 @@ static int Demux( input_thread_t *p_input ) ...@@ -1305,8 +1334,8 @@ static int Demux( input_thread_t *p_input )
i_size -= i_read; i_size -= i_read;
} }
// input_SplitBuffer( p_input, &p_pk, i_size + 8 ); // input_SplitBuffer( p_input, &p_pk, i_size + 8 );
p_pes->p_first->p_payload_start += 8; p_pes->p_first->p_payload_start += 16;
p_pes->i_pes_size -= 8; p_pes->i_pes_size -= 16;
if( p_es && p_es->p_decoder_fifo ) if( p_es && p_es->p_decoder_fifo )
{ {
vlc_mutex_lock( &p_es->p_decoder_fifo->data_lock ); vlc_mutex_lock( &p_es->p_decoder_fifo->data_lock );
...@@ -1317,8 +1346,8 @@ static int Demux( input_thread_t *p_input ) ...@@ -1317,8 +1346,8 @@ static int Demux( input_thread_t *p_input )
&p_es->p_decoder_fifo->data_lock ); &p_es->p_decoder_fifo->data_lock );
} }
vlc_mutex_unlock( &p_es->p_decoder_fifo->data_lock ); vlc_mutex_unlock( &p_es->p_decoder_fifo->data_lock );
p_pes->i_pts = mdate() + p_input->i_pts_delay; //p_pes->i_pts = mdate() + p_input->i_pts_delay;
p_pes->i_pts = p_pes->i_dts = i_pts + p_input->i_pts_delay;
input_DecodePES( p_es->p_decoder_fifo, p_pes ); input_DecodePES( p_es->p_decoder_fifo, p_pes );
} }
else else
......
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